Commit 2323c8a9 authored by Dave Jones's avatar Dave Jones Committed by Linus Torvalds

[PATCH] Avoid ide-scsi from starting DMA too soon

This went into 2.4 with the following comments..

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

Alan's comment to this diff previously..
"Thats the least of the 2.5 ide-scsi problems, but yes its probably one to add"
parent 30238121
...@@ -78,6 +78,7 @@ typedef struct idescsi_pc_s { ...@@ -78,6 +78,7 @@ typedef struct idescsi_pc_s {
#define PC_DMA_IN_PROGRESS 0 /* 1 while DMA in progress */ #define PC_DMA_IN_PROGRESS 0 /* 1 while DMA in progress */
#define PC_WRITING 1 /* Data direction */ #define PC_WRITING 1 /* Data direction */
#define PC_TRANSFORM 2 /* transform SCSI commands */ #define PC_TRANSFORM 2 /* transform SCSI commands */
#define PC_DMA_OK 4 /* Use DMA */
/* /*
* SCSI command transformation layer * SCSI command transformation layer
...@@ -494,6 +495,10 @@ static ide_startstop_t idescsi_transfer_pc(ide_drive_t *drive) ...@@ -494,6 +495,10 @@ static ide_startstop_t idescsi_transfer_pc(ide_drive_t *drive)
ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), NULL); ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), NULL);
/* Send the actual packet */ /* Send the actual packet */
atapi_output_bytes(drive, scsi->pc->c, 12); atapi_output_bytes(drive, scsi->pc->c, 12);
if (test_bit (PC_DMA_OK, &pc->flags)) {
set_bit (PC_DMA_IN_PROGRESS, &pc->flags);
(void) (HWIF(drive)->ide_dma_begin(drive));
}
return ide_started; return ide_started;
} }
...@@ -527,10 +532,9 @@ static ide_startstop_t idescsi_issue_pc (ide_drive_t *drive, idescsi_pc_t *pc) ...@@ -527,10 +532,9 @@ static ide_startstop_t idescsi_issue_pc (ide_drive_t *drive, idescsi_pc_t *pc)
HWIF(drive)->OUTB(bcount.b.high, IDE_BCOUNTH_REG); HWIF(drive)->OUTB(bcount.b.high, IDE_BCOUNTH_REG);
HWIF(drive)->OUTB(bcount.b.low, IDE_BCOUNTL_REG); HWIF(drive)->OUTB(bcount.b.low, IDE_BCOUNTL_REG);
if (feature.b.dma) { if (feature.b.dma)
set_bit(PC_DMA_IN_PROGRESS, &pc->flags); set_bit(PC_DMA_OK, &pc->flags);
(void) (HWIF(drive)->ide_dma_begin(drive));
}
if (test_bit(IDESCSI_DRQ_INTERRUPT, &scsi->flags)) { if (test_bit(IDESCSI_DRQ_INTERRUPT, &scsi->flags)) {
if (HWGROUP(drive)->handler != NULL) if (HWGROUP(drive)->handler != NULL)
BUG(); BUG();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment