ide-cd: unify handling of fs and pc requests in cdrom_decode_status()
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Wed, 8 Apr 2009 12:12:54 +0000 (14:12 +0200)
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Wed, 8 Apr 2009 12:12:54 +0000 (14:12 +0200)
Based on earlier work by Borislav Petkov.

Unify handling of fs and pc requests in cdrom_decode_status().

While at it:
- remove unreachable code

The only change in functionality is that for pc requests more
detailed error message will be printed for following sense keys:
* ILLEGAL_REQUEST
* DATA_PROTECT
* MEDIUM_ERROR
* BLANK_CHECK

Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
drivers/ide/ide-cd.c

index 43db330..ffbaa6d 100644 (file)
@@ -330,8 +330,8 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat)
                 */
                rq->cmd_flags |= REQ_FAILED;
                return 2;
-       } else if (blk_pc_request(rq) || rq->cmd_type == REQ_TYPE_ATA_PC) {
-               /* All other functions, except for READ. */
+       } else {
+               int do_end_request = 0;
 
                /*
                 * if we have an error, pass back CHECK_CONDITION as the
@@ -340,53 +340,16 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat)
                if (blk_pc_request(rq) && !rq->errors)
                        rq->errors = SAM_STAT_CHECK_CONDITION;
 
-               switch (sense_key) {
-               case NOT_READY:
-                       cdrom_saw_media_change(drive);
-                       break;
-               case UNIT_ATTENTION:
-                       cdrom_saw_media_change(drive);
-                       return 0;
-               case ILLEGAL_REQUEST:
-                       /*
-                        * Don't print error message for this condition--
-                        * SFF8090i indicates that 5/24/00 is the correct
-                        * response to a request to close the tray if the
-                        * drive doesn't have that capability.
-                        * cdrom_log_sense() knows this!
-                        */
-                       if (rq->cmd[0] == GPCMD_START_STOP_UNIT)
-                               break;
-                       /* fall-through */
-               default:
-                       if (!quiet)
-                               ide_dump_status(drive, "packet command error",
-                                               stat);
-               }
-
-               rq->cmd_flags |= REQ_FAILED;
-
-               /*
-                * instead of playing games with moving completions around,
-                * remove failed request completely and end it when the
-                * request sense has completed
-                */
-               goto end_request;
-
-       } else if (blk_fs_request(rq)) {
-               int do_end_request = 0;
-
-               /* handle errors from READ and WRITE requests */
-
                if (blk_noretry_request(rq))
                        do_end_request = 1;
 
                switch (sense_key) {
                case NOT_READY:
-                       if (rq_data_dir(rq) == READ) {
+                       if (blk_fs_request(rq) == 0 ||
+                           rq_data_dir(rq) == READ) {
                                cdrom_saw_media_change(drive);
 
-                               if (!quiet)
+                               if (blk_fs_request(rq) && !quiet)
                                        printk(KERN_ERR PFX "%s: tray open\n",
                                                drive->name);
                        } else {
@@ -398,6 +361,8 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat)
                case UNIT_ATTENTION:
                        cdrom_saw_media_change(drive);
 
+                       if (blk_fs_request(rq) == 0)
+                               return 0;
                        /*
                         * Arrange to retry the request but be sure to give up
                         * if we've retried too many times.
@@ -406,6 +371,16 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat)
                                do_end_request = 1;
                        break;
                case ILLEGAL_REQUEST:
+                       /*
+                        * Don't print error message for this condition--
+                        * SFF8090i indicates that 5/24/00 is the correct
+                        * response to a request to close the tray if the
+                        * drive doesn't have that capability.
+                        * cdrom_log_sense() knows this!
+                        */
+                       if (rq->cmd[0] == GPCMD_START_STOP_UNIT)
+                               break;
+                       /* fall-through */
                case DATA_PROTECT:
                        /*
                         * No point in retrying after an illegal request or data
@@ -433,6 +408,8 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat)
                        do_end_request = 1;
                        break;
                default:
+                       if (blk_fs_request(rq) == 0)
+                               break;
                        if (err & ~ATA_ABORTED) {
                                /* go to the default handler for other errors */
                                ide_error(drive, "cdrom_decode_status", stat);
@@ -442,6 +419,11 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat)
                                do_end_request = 1;
                }
 
+               if (blk_fs_request(rq) == 0) {
+                       rq->cmd_flags |= REQ_FAILED;
+                       do_end_request = 1;
+               }
+
                /*
                 * End a request through request sense analysis when we have
                 * sense data. We need this in order to perform end of media
@@ -457,9 +439,6 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat)
                if (stat & ATA_ERR)
                        cdrom_queue_request_sense(drive, NULL, NULL);
                return 1;
-       } else {
-               blk_dump_rq_flags(rq, PFX "bad rq");
-               return 2;
        }
 
 end_request: