示例#1
0
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);
    }
}