Skip to contentSkip to conversation

ide-scsi driver starts DMA too soon

PATCH In review Khalid Aziz 3 participants 3 messages Nov 1, 2002 – Nov 6, 2002 SCSI

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ide-scsi driver starts DMA too soon

ide-scsi driver starts DMA as soon as it writes the ATAPI PACKET command in command register and before sending the ATAPI command. This will cause problems on many drives. Right way to do it is to start DMA after sending the ATAPI command. I am attaching a patch that fixes this. This patch will allow many more CD-RW drives to work reliably in DMA mode than do today.

Marcelo, please apply.

--
Khalid

====================================================================
Khalid Aziz Linux and Open Source Lab
(970)898-9214 Hewlett-Packard
[email protected] Fort Collins, CO

-----------CUT HERE-------------CUT HERE-------------CUT HERE-----------

drivers/scsi/ide-scsi.c +8 -4
@@ -397,6 +397,8 @@
 	idescsi_pc_t *pc = scsi->pc;
 	byte ireason;
 	ide_startstop_t startstop;
+	struct request *rq = pc->rq;
+	int dma_ok = 0;
 
 	if (ide_wait_stat (&startstop,drive,DRQ_STAT,BUSY_STAT,WAIT_READY)) {
 		printk (KERN_ERR "ide-scsi: Strange, packet command initiated yet DRQ isn't asserted\n");
@@ -407,8 +409,14 @@
 		printk (KERN_ERR "ide-scsi: (IO,CoD) != (0,1) while issuing a packet command\n");
 		return ide_do_reset (drive);
 	}
+	if (drive->using_dma && rq->bh)
+		dma_ok=!HWIF(drive)->dmaproc(test_bit (PC_WRITING, &pc->flags) ? ide_dma_write : ide_dma_read, drive);
 	ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), NULL);	/* Set the interrupt routine */
 	atapi_output_bytes (drive, scsi->pc->c, 12);			/* Send the actual packet */
+	if (dma_ok) {
+		set_bit (PC_DMA_IN_PROGRESS, &pc->flags);
+		(void) (HWIF(drive)->dmaproc(ide_dma_begin, drive));
+	}
 	return ide_started;
 }
 
@@ -437,10 +445,6 @@
 	OUT_BYTE (bcount >> 8,IDE_BCOUNTH_REG);
 	OUT_BYTE (bcount & 0xff,IDE_BCOUNTL_REG);
 
-	if (dma_ok) {
-		set_bit (PC_DMA_IN_PROGRESS, &pc->flags);
-		(void) (HWIF(drive)->dmaproc(ide_dma_begin, drive));
-	}
 	if (test_bit (IDESCSI_DRQ_INTERRUPT, &scsi->flags)) {
 		ide_set_handler (drive, &idescsi_transfer_pc, get_timeout(pc), NULL);
 		OUT_BYTE (WIN_PACKETCMD, IDE_COMMAND_REG);		/* Issue the packet command */
#1 lore raw
Quoted 8 lines · Khalid Aziz

ide-scsi driver starts DMA as soon as it writes the ATAPI PACKET command in command register and before sending the ATAPI command. This will cause problems on many drives. Right way to do it is to start DMA after sending the ATAPI command. I am attaching a patch that fixes this. This patch will allow many more CD-RW drives to work reliably in DMA mode than do today.

Marcelo, please apply.

Marcelo this is in 2.5, and 2.4-ac. Khalid is certainly correct although making such a change in -rc rather than a pre does mean it wants extra thought

#2 lore raw
Quoted 8 lines · Alan Cox
Quoted 7 lines · Khalid Aziz

ide-scsi driver starts DMA as soon as it writes the ATAPI PACKET command in command register and before sending the ATAPI command. This will cause problems on many drives. Right way to do it is to start DMA after sending the ATAPI command. I am attaching a patch that fixes this. This patch will allow many more CD-RW drives to work reliably in DMA mode than do today.

Quoted 5 lines
Quoted 1 line

Marcelo, please apply.

Marcelo this is in 2.5, and 2.4-ac. Khalid is certainly correct although making such a change in -rc rather than a pre does mean it wants extra thought

I prefer being safe and saving this one for 2.4.21-pre.

Thanks Khalid!