static void sata_dwc_clear_dmacr(struct sata_dwc_device_port *hsdevp, u8 tag) { struct sata_dwc_device *hsdev = HSDEV_FROM_HSDEVP(hsdevp); if (hsdevp->dma_pending[tag] == SATA_DWC_DMA_PENDING_RX) { out_le32(&(hsdev->sata_dwc_regs->dmacr), SATA_DWC_DMACR_RX_CLEAR( in_le32(&(hsdev->sata_dwc_regs->dmacr)))); } else if (hsdevp->dma_pending[tag] == SATA_DWC_DMA_PENDING_TX) { out_le32(&(hsdev->sata_dwc_regs->dmacr), SATA_DWC_DMACR_TX_CLEAR( in_le32(&(hsdev->sata_dwc_regs->dmacr)))); } else { /* * This should not happen, it indicates the driver is out of * sync. If it does happen, clear dmacr anyway. */ dev_err(host_pvt.dwc_dev, "%s DMA protocol RX and" "TX DMA not pending tag=0x%02x pending=%d" " dmacr: 0x%08x\n", __func__, tag, hsdevp->dma_pending[tag], in_le32(&(hsdev->sata_dwc_regs->dmacr))); out_le32(&(hsdev->sata_dwc_regs->dmacr), SATA_DWC_DMACR_TXRXCH_CLEAR); } }
static void sata_dwc_clear_dmacr(struct sata_dwc_device_port *hsdevp, u8 tag) { struct sata_dwc_device *hsdev = HSDEV_FROM_HSDEVP(hsdevp); if (hsdevp->dma_pending[tag] == SATA_DWC_DMA_PENDING_RX) { out_le32(&(hsdev->sata_dwc_regs->dmacr), SATA_DWC_DMACR_RX_CLEAR( in_le32(&(hsdev->sata_dwc_regs->dmacr)))); } else if (hsdevp->dma_pending[tag] == SATA_DWC_DMA_PENDING_TX) { out_le32(&(hsdev->sata_dwc_regs->dmacr), SATA_DWC_DMACR_TX_CLEAR( in_le32(&(hsdev->sata_dwc_regs->dmacr)))); } else { dev_err(host_pvt.dwc_dev, "%s DMA protocol RX and" "TX DMA not pending tag=0x%02x pending=%d" " dmacr: 0x%08x\n", __func__, tag, hsdevp->dma_pending[tag], in_le32(&(hsdev->sata_dwc_regs->dmacr))); out_le32(&(hsdev->sata_dwc_regs->dmacr), SATA_DWC_DMACR_TXRXCH_CLEAR); } }