static inline void ata_drvsel(struct ata_chan *chan, uint8_t drv) { if ( chan->drvsel != !!drv ) { ata_set_drive_head(chan, 0, !!drv, 0); ata_busy_wait(chan); } }
static int ata_chan_reset(const struct ata_chan *chan) { /* reset and disable interrupts */ ata_devctl(chan, ATA_DEVCTL_SRST|ATA_DEVCTL_nIEN); udelay(10); /* de-assert reset, leave interrupts disabled */ ata_devctl(chan, ATA_DEVCTL_nIEN); ata_busy_wait(chan); return 0; }
static u8 scc_irq_ack (struct ata_port *ap, unsigned int chk_drq) { unsigned int bits = chk_drq ? ATA_BUSY | ATA_DRQ : ATA_BUSY; u8 host_stat, post_stat, status; status = ata_busy_wait(ap, bits, 1000); if (status & bits) if (ata_msg_err(ap)) printk(KERN_ERR "abnormal status 0x%X\n", status); /* get controller status; clear intr, err bits */ host_stat = in_be32(ap->ioaddr.bmdma_addr + SCC_DMA_STATUS); out_be32(ap->ioaddr.bmdma_addr + SCC_DMA_STATUS, host_stat | ATA_DMA_INTR | ATA_DMA_ERR); post_stat = in_be32(ap->ioaddr.bmdma_addr + SCC_DMA_STATUS); if (ata_msg_intr(ap)) printk(KERN_INFO "%s: irq ack: host_stat 0x%X, new host_stat 0x%X, drv_stat 0x%X\n", __FUNCTION__, host_stat, post_stat, status); return status; }