Esempio n. 1
0
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);
	}
}
Esempio n. 2
0
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;
}
Esempio n. 3
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;
}