Jeff Garzik wrote:
Albert Lee wrote:
Only one minor addition for your review:
* ata_pio_block() changed to go to PIO_ST_LAST state, instead of
going to PIO_ST_IDLE state directly and calling
ata_poll_qc_complete().
i.e.
@@ -2845,9 +2852,7 @@
if (is_atapi_taskfile(&qc->tf)) {
/* no more data to transfer or unsupported ATAPI command */
if ((status & ATA_DRQ) == 0) {
- ap->pio_task_state = PIO_ST_IDLE;
-
- ata_poll_qc_complete(qc, status);
+ ap->pio_task_state = PIO_ST_LAST;
return;
}
hmmmm. I think that should be PIO_ST_ERR not PIO_ST_LAST. Comments?
Just tested it. Changing to PIO_ST_ERR will break REQUEST_SENSE and
MODE_SENSE. :(
For REQUEST_SENSE and MODE_SENSE, the data returned from the device might be
less than the buffer provided and those two commands relies on DRQ == 0
to mark the end of
the data transfer.
e.g. a sample REQUST SENSE transaction:
1. ata_pio_task() entered with PIO_ST.
2. ata_pio_block() called, 24 bytes received from the device.
3. The buffer size is 96 bytes, so the state is kept as PIO_ST.
4. ata_pio_task() entered with PIO_ST.
5. ata_pio_block() called, DRQ == 0 to mark the end of data transfer.
6. state changed to PIO_ST_LAST and command completed as successful.
DRQ == 0 in step 5 seems to be normal and should be treated as OK.
Albert
-
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html