diff -r c33a40b4c22b xen/drivers/passthrough/vtd/qinval.c --- a/xen/drivers/passthrough/vtd/qinval.c Mon Jun 30 14:19:09 2008 +0100 +++ b/xen/drivers/passthrough/vtd/qinval.c Tue Jul 01 10:42:34 2008 +0800 @@ -222,7 +222,7 @@ int invalidate_sync(struct iommu *iommu) int ret = -1; struct qi_ctrl *qi_ctrl = iommu_qi_ctrl(iommu); - if ( qi_ctrl->qinval_maddr == 0 ) + if ( qi_ctrl->qinval_maddr != 0 ) { ret = queue_invalidate_wait(iommu, 0, 1, 1, 1, &qi_ctrl->qinval_poll_status); @@ -416,7 +416,6 @@ int qinval_setup(struct iommu *iommu) int qinval_setup(struct iommu *iommu) { s_time_t start_time; - u32 status = 0; struct qi_ctrl *qi_ctrl; struct iommu_flush *flush; @@ -450,15 +449,12 @@ int qinval_setup(struct iommu *iommu) /* Make sure hardware complete it */ start_time = NOW(); - for ( ; ; ) - { - status = dmar_readl(iommu->reg, DMAR_GSTS_REG); - if ( status & DMA_GSTS_QIES ) - break; + while ( !(dmar_readl(iommu->reg, DMAR_GSTS_REG) & DMA_GSTS_QIES) ) + { if ( NOW() > (start_time + DMAR_OPERATION_TIMEOUT) ) panic("Cannot set QIE field for queue invalidation\n"); cpu_relax(); } - status = 0; - return status; -} + + return 0; +}