diff options
-rw-r--r-- | drivers/ide/ide-cd.c | 57 |
1 files changed, 32 insertions, 25 deletions
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index e946f0ecbb9c..43db330d7b5d 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -340,15 +340,14 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) | |||
340 | if (blk_pc_request(rq) && !rq->errors) | 340 | if (blk_pc_request(rq) && !rq->errors) |
341 | rq->errors = SAM_STAT_CHECK_CONDITION; | 341 | rq->errors = SAM_STAT_CHECK_CONDITION; |
342 | 342 | ||
343 | /* check for tray open */ | 343 | switch (sense_key) { |
344 | if (sense_key == NOT_READY) { | 344 | case NOT_READY: |
345 | cdrom_saw_media_change(drive); | 345 | cdrom_saw_media_change(drive); |
346 | } else if (sense_key == UNIT_ATTENTION) { | 346 | break; |
347 | /* check for media change */ | 347 | case UNIT_ATTENTION: |
348 | cdrom_saw_media_change(drive); | 348 | cdrom_saw_media_change(drive); |
349 | return 0; | 349 | return 0; |
350 | } else if (sense_key == ILLEGAL_REQUEST && | 350 | case ILLEGAL_REQUEST: |
351 | rq->cmd[0] == GPCMD_START_STOP_UNIT) { | ||
352 | /* | 351 | /* |
353 | * Don't print error message for this condition-- | 352 | * Don't print error message for this condition-- |
354 | * SFF8090i indicates that 5/24/00 is the correct | 353 | * SFF8090i indicates that 5/24/00 is the correct |
@@ -356,9 +355,13 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) | |||
356 | * drive doesn't have that capability. | 355 | * drive doesn't have that capability. |
357 | * cdrom_log_sense() knows this! | 356 | * cdrom_log_sense() knows this! |
358 | */ | 357 | */ |
359 | } else if (!quiet) { | 358 | if (rq->cmd[0] == GPCMD_START_STOP_UNIT) |
360 | /* otherwise, print an error */ | 359 | break; |
361 | ide_dump_status(drive, "packet command error", stat); | 360 | /* fall-through */ |
361 | default: | ||
362 | if (!quiet) | ||
363 | ide_dump_status(drive, "packet command error", | ||
364 | stat); | ||
362 | } | 365 | } |
363 | 366 | ||
364 | rq->cmd_flags |= REQ_FAILED; | 367 | rq->cmd_flags |= REQ_FAILED; |
@@ -378,12 +381,11 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) | |||
378 | if (blk_noretry_request(rq)) | 381 | if (blk_noretry_request(rq)) |
379 | do_end_request = 1; | 382 | do_end_request = 1; |
380 | 383 | ||
381 | if (sense_key == NOT_READY) { | 384 | switch (sense_key) { |
382 | /* tray open */ | 385 | case NOT_READY: |
383 | if (rq_data_dir(rq) == READ) { | 386 | if (rq_data_dir(rq) == READ) { |
384 | cdrom_saw_media_change(drive); | 387 | cdrom_saw_media_change(drive); |
385 | 388 | ||
386 | /* fail the request */ | ||
387 | if (!quiet) | 389 | if (!quiet) |
388 | printk(KERN_ERR PFX "%s: tray open\n", | 390 | printk(KERN_ERR PFX "%s: tray open\n", |
389 | drive->name); | 391 | drive->name); |
@@ -392,8 +394,8 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) | |||
392 | return 1; | 394 | return 1; |
393 | } | 395 | } |
394 | do_end_request = 1; | 396 | do_end_request = 1; |
395 | } else if (sense_key == UNIT_ATTENTION) { | 397 | break; |
396 | /* media change */ | 398 | case UNIT_ATTENTION: |
397 | cdrom_saw_media_change(drive); | 399 | cdrom_saw_media_change(drive); |
398 | 400 | ||
399 | /* | 401 | /* |
@@ -402,8 +404,9 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) | |||
402 | */ | 404 | */ |
403 | if (++rq->errors > ERROR_MAX) | 405 | if (++rq->errors > ERROR_MAX) |
404 | do_end_request = 1; | 406 | do_end_request = 1; |
405 | } else if (sense_key == ILLEGAL_REQUEST || | 407 | break; |
406 | sense_key == DATA_PROTECT) { | 408 | case ILLEGAL_REQUEST: |
409 | case DATA_PROTECT: | ||
407 | /* | 410 | /* |
408 | * No point in retrying after an illegal request or data | 411 | * No point in retrying after an illegal request or data |
409 | * protect error. | 412 | * protect error. |
@@ -411,7 +414,8 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) | |||
411 | if (!quiet) | 414 | if (!quiet) |
412 | ide_dump_status(drive, "command error", stat); | 415 | ide_dump_status(drive, "command error", stat); |
413 | do_end_request = 1; | 416 | do_end_request = 1; |
414 | } else if (sense_key == MEDIUM_ERROR) { | 417 | break; |
418 | case MEDIUM_ERROR: | ||
415 | /* | 419 | /* |
416 | * No point in re-trying a zillion times on a bad | 420 | * No point in re-trying a zillion times on a bad |
417 | * sector. If we got here the error is not correctable. | 421 | * sector. If we got here the error is not correctable. |
@@ -420,19 +424,22 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) | |||
420 | ide_dump_status(drive, "media error " | 424 | ide_dump_status(drive, "media error " |
421 | "(bad sector)", stat); | 425 | "(bad sector)", stat); |
422 | do_end_request = 1; | 426 | do_end_request = 1; |
423 | } else if (sense_key == BLANK_CHECK) { | 427 | break; |
428 | case BLANK_CHECK: | ||
424 | /* disk appears blank ?? */ | 429 | /* disk appears blank ?? */ |
425 | if (!quiet) | 430 | if (!quiet) |
426 | ide_dump_status(drive, "media error (blank)", | 431 | ide_dump_status(drive, "media error (blank)", |
427 | stat); | 432 | stat); |
428 | do_end_request = 1; | 433 | do_end_request = 1; |
429 | } else if ((err & ~ATA_ABORTED) != 0) { | 434 | break; |
430 | /* go to the default handler for other errors */ | 435 | default: |
431 | ide_error(drive, "cdrom_decode_status", stat); | 436 | if (err & ~ATA_ABORTED) { |
432 | return 1; | 437 | /* go to the default handler for other errors */ |
433 | } else if ((++rq->errors > ERROR_MAX)) { | 438 | ide_error(drive, "cdrom_decode_status", stat); |
434 | /* we've racked up too many retries, abort */ | 439 | return 1; |
435 | do_end_request = 1; | 440 | } else if (++rq->errors > ERROR_MAX) |
441 | /* we've racked up too many retries, abort */ | ||
442 | do_end_request = 1; | ||
436 | } | 443 | } |
437 | 444 | ||
438 | /* | 445 | /* |