[SCSI] Fix DVD burning issues.
Some pioneer DVDs are apparently returning odd "not ready" status codes that the mid-layer doesn't recognise and so passes back to the user as errors. This patch overhauls our not-ready handling and adds transparent retries for: format in progress rebuild in progress recalculation in progress operation in progress Long write in progress self test in progress The Pioneer was actually returning "long write in progress" Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
4a6fae1d9c
commit
f3e93f7353
@ -1067,16 +1067,29 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes,
|
|||||||
break;
|
break;
|
||||||
case NOT_READY:
|
case NOT_READY:
|
||||||
/*
|
/*
|
||||||
* If the device is in the process of becoming ready,
|
* If the device is in the process of becoming
|
||||||
* retry.
|
* ready, or has a temporary blockage, retry.
|
||||||
*/
|
*/
|
||||||
if (sshdr.asc == 0x04 && sshdr.ascq == 0x01) {
|
if (sshdr.asc == 0x04) {
|
||||||
scsi_requeue_command(q, cmd);
|
switch (sshdr.ascq) {
|
||||||
return;
|
case 0x01: /* becoming ready */
|
||||||
|
case 0x04: /* format in progress */
|
||||||
|
case 0x05: /* rebuild in progress */
|
||||||
|
case 0x06: /* recalculation in progress */
|
||||||
|
case 0x07: /* operation in progress */
|
||||||
|
case 0x08: /* Long write in progress */
|
||||||
|
case 0x09: /* self test in progress */
|
||||||
|
scsi_requeue_command(q, cmd);
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!(req->flags & REQ_QUIET))
|
if (!(req->flags & REQ_QUIET)) {
|
||||||
scmd_printk(KERN_INFO, cmd,
|
scmd_printk(KERN_INFO, cmd,
|
||||||
"Device not ready.\n");
|
"Device not ready: ");
|
||||||
|
scsi_print_sense_hdr("", &sshdr);
|
||||||
|
}
|
||||||
scsi_end_request(cmd, 0, this_count, 1);
|
scsi_end_request(cmd, 0, this_count, 1);
|
||||||
return;
|
return;
|
||||||
case VOLUME_OVERFLOW:
|
case VOLUME_OVERFLOW:
|
||||||
|
Loading…
Reference in New Issue
Block a user