|
@@ -206,44 +206,6 @@ static void cdrom_analyze_sense_data(ide_drive_t *drive,
|
|
ide_cd_log_error(drive->name, failed_command, sense);
|
|
ide_cd_log_error(drive->name, failed_command, sense);
|
|
}
|
|
}
|
|
|
|
|
|
-static void cdrom_queue_request_sense(ide_drive_t *drive, void *sense,
|
|
|
|
- struct request *failed_command)
|
|
|
|
-{
|
|
|
|
- struct cdrom_info *info = drive->driver_data;
|
|
|
|
- struct request *rq = &drive->request_sense_rq;
|
|
|
|
-
|
|
|
|
- ide_debug_log(IDE_DBG_SENSE, "enter");
|
|
|
|
-
|
|
|
|
- if (sense == NULL)
|
|
|
|
- sense = &info->sense_data;
|
|
|
|
-
|
|
|
|
- memset(sense, 0, 18);
|
|
|
|
-
|
|
|
|
- /* stuff the sense request in front of our current request */
|
|
|
|
- blk_rq_init(NULL, rq);
|
|
|
|
- rq->cmd_type = REQ_TYPE_ATA_PC;
|
|
|
|
- rq->rq_disk = info->disk;
|
|
|
|
-
|
|
|
|
- rq->data = sense;
|
|
|
|
- rq->cmd[0] = GPCMD_REQUEST_SENSE;
|
|
|
|
- rq->cmd[4] = 18;
|
|
|
|
- rq->data_len = 18;
|
|
|
|
-
|
|
|
|
- rq->cmd_type = REQ_TYPE_SENSE;
|
|
|
|
- rq->cmd_flags |= REQ_PREEMPT;
|
|
|
|
-
|
|
|
|
- /* NOTE! Save the failed command in "rq->special" */
|
|
|
|
- rq->special = (void *)failed_command;
|
|
|
|
-
|
|
|
|
- if (failed_command)
|
|
|
|
- ide_debug_log(IDE_DBG_SENSE, "failed_cmd: 0x%x",
|
|
|
|
- failed_command->cmd[0]);
|
|
|
|
-
|
|
|
|
- drive->hwif->rq = NULL;
|
|
|
|
-
|
|
|
|
- elv_add_request(drive->queue, rq, ELEVATOR_INSERT_FRONT, 0);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static void ide_cd_complete_failed_rq(ide_drive_t *drive, struct request *rq)
|
|
static void ide_cd_complete_failed_rq(ide_drive_t *drive, struct request *rq)
|
|
{
|
|
{
|
|
/*
|
|
/*
|
|
@@ -251,11 +213,16 @@ static void ide_cd_complete_failed_rq(ide_drive_t *drive, struct request *rq)
|
|
* failed request
|
|
* failed request
|
|
*/
|
|
*/
|
|
struct request *failed = (struct request *)rq->special;
|
|
struct request *failed = (struct request *)rq->special;
|
|
- struct cdrom_info *info = drive->driver_data;
|
|
|
|
- void *sense = &info->sense_data;
|
|
|
|
|
|
+ struct request_sense *sense = &drive->sense_data;
|
|
|
|
|
|
if (failed) {
|
|
if (failed) {
|
|
if (failed->sense) {
|
|
if (failed->sense) {
|
|
|
|
+ /*
|
|
|
|
+ * Sense is always read into drive->sense_data.
|
|
|
|
+ * Copy back if the failed request has its
|
|
|
|
+ * sense pointer set.
|
|
|
|
+ */
|
|
|
|
+ memcpy(failed->sense, sense, 18);
|
|
sense = failed->sense;
|
|
sense = failed->sense;
|
|
failed->sense_len = rq->sense_len;
|
|
failed->sense_len = rq->sense_len;
|
|
}
|
|
}
|
|
@@ -431,7 +398,7 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat)
|
|
|
|
|
|
/* if we got a CHECK_CONDITION status, queue a request sense command */
|
|
/* if we got a CHECK_CONDITION status, queue a request sense command */
|
|
if (stat & ATA_ERR)
|
|
if (stat & ATA_ERR)
|
|
- cdrom_queue_request_sense(drive, NULL, NULL);
|
|
|
|
|
|
+ ide_queue_sense_rq(drive, NULL);
|
|
return 1;
|
|
return 1;
|
|
|
|
|
|
end_request:
|
|
end_request:
|
|
@@ -445,7 +412,7 @@ end_request:
|
|
|
|
|
|
hwif->rq = NULL;
|
|
hwif->rq = NULL;
|
|
|
|
|
|
- cdrom_queue_request_sense(drive, rq->sense, rq);
|
|
|
|
|
|
+ ide_queue_sense_rq(drive, rq);
|
|
return 1;
|
|
return 1;
|
|
} else
|
|
} else
|
|
return 2;
|
|
return 2;
|
|
@@ -893,6 +860,9 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq,
|
|
goto out_end;
|
|
goto out_end;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /* prepare sense request for this command */
|
|
|
|
+ ide_prep_sense(drive, rq);
|
|
|
|
+
|
|
memset(&cmd, 0, sizeof(cmd));
|
|
memset(&cmd, 0, sizeof(cmd));
|
|
|
|
|
|
if (rq_data_dir(rq))
|
|
if (rq_data_dir(rq))
|