on an system with very fast disks, where the SATA controller is sitting behind a 
on an system with very fast disks, where the SATA controller is sitting behind a 
static void k2_bmdma_start_mmio (struct ata_queued_cmd *qc){	struct ata_port *ap = qc->ap;	void *mmio = (void *) ap->ioaddr.bmdma_addr;	u8 dmactl;	/* start host DMA transaction */	dmactl = readb(mmio + ATA_DMA_CMD);	writeb(dmactl | ATA_DMA_START, mmio + ATA_DMA_CMD);	/* There is a race condition in certain SATA controllers that can 	   be seen when the r/w command is given to the controller before the 	   host DMA is started. On a Read command, the controller would initiate	   the command to the drive even before it sees the DMA start. When there	   are very fast drives connected to the controller, or when the data request 	   hits in the drive cache, there is the possibility that the drive returns a part	   or all of the requested data to the controller before the DMA start is issued.	   In this case, the controller would become confused as to what to do with the data.	   In the worst case when all the data is returned back to the controller, the	   controller could hang. In other cases it could return partial data returning	   in data corruption. This problem has been seen in PPC systems and can also appear	   on an system with very fast disks, where the SATA controller is sitting behind a 	   number of bridges, and hence there is significant latency between the r/w command	   and the start command. */	/* issue r/w command if the access is to ATA*/	if (qc->tf.protocol == ATA_PROT_DMA)		ap->ops->exec_command(ap, &qc->tf);}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/8a60a07129fad60bba779a2a4038c7518b167fc7/sata_svw.c/buggy/drivers/scsi/sata_svw.c