ide: use ->end_request only for private device driver requests

* Move IDE{FLOPPY,TAPE}_ERROR_* defines to <linux/ide.h> and rename them
  to IDE_DRV_ERROR_*.

* Handle ->end_request special cases for floppy/tape media in ide_kill_rq().

* Call ->end_request only for private device driver requests.

There should be no functional changes caused by this patch.
Acked-by: default avatarBorislav Petkov <petkovbb@gmail.com>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 5e2040fd
...@@ -61,9 +61,6 @@ ...@@ -61,9 +61,6 @@
*/ */
#define IDEFLOPPY_PC_DELAY (HZ/20) /* default delay for ZIP 100 (50ms) */ #define IDEFLOPPY_PC_DELAY (HZ/20) /* default delay for ZIP 100 (50ms) */
/* Error code returned in rq->errors to the higher part of the driver. */
#define IDEFLOPPY_ERROR_GENERAL 101
/* /*
* Used to finish servicing a request. For read/write requests, we will call * Used to finish servicing a request. For read/write requests, we will call
* ide_end_request to pass to the next buffer. * ide_end_request to pass to the next buffer.
...@@ -77,7 +74,7 @@ static int ide_floppy_end_request(ide_drive_t *drive, int uptodate, int nsecs) ...@@ -77,7 +74,7 @@ static int ide_floppy_end_request(ide_drive_t *drive, int uptodate, int nsecs)
switch (uptodate) { switch (uptodate) {
case 0: case 0:
error = IDEFLOPPY_ERROR_GENERAL; error = IDE_DRV_ERROR_GENERAL;
break; break;
case 1: case 1:
...@@ -183,7 +180,7 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive, ...@@ -183,7 +180,7 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive,
if (!(pc->flags & PC_FLAG_SUPPRESS_ERROR)) if (!(pc->flags & PC_FLAG_SUPPRESS_ERROR))
ide_floppy_report_error(floppy, pc); ide_floppy_report_error(floppy, pc);
/* Giving up */ /* Giving up */
pc->error = IDEFLOPPY_ERROR_GENERAL; pc->error = IDE_DRV_ERROR_GENERAL;
drive->failed_pc = NULL; drive->failed_pc = NULL;
drive->pc_callback(drive, 0); drive->pc_callback(drive, 0);
......
...@@ -178,7 +178,12 @@ EXPORT_SYMBOL(ide_complete_rq); ...@@ -178,7 +178,12 @@ EXPORT_SYMBOL(ide_complete_rq);
void ide_kill_rq(ide_drive_t *drive, struct request *rq) void ide_kill_rq(ide_drive_t *drive, struct request *rq)
{ {
if (rq->rq_disk) { drive->failed_pc = NULL;
if (drive->media == ide_tape)
rq->errors = IDE_DRV_ERROR_GENERAL;
if (blk_special_request(rq) && rq->rq_disk) {
struct ide_driver *drv; struct ide_driver *drv;
drv = *(struct ide_driver **)rq->rq_disk->private_data; drv = *(struct ide_driver **)rq->rq_disk->private_data;
......
...@@ -152,11 +152,6 @@ struct idetape_bh { ...@@ -152,11 +152,6 @@ struct idetape_bh {
#define IDETAPE_LU_RETENSION_MASK 2 #define IDETAPE_LU_RETENSION_MASK 2
#define IDETAPE_LU_EOT_MASK 4 #define IDETAPE_LU_EOT_MASK 4
/* Error codes returned in rq->errors to the higher part of the driver. */
#define IDETAPE_ERROR_GENERAL 101
#define IDETAPE_ERROR_FILEMARK 102
#define IDETAPE_ERROR_EOD 103
/* Structures related to the SELECT SENSE / MODE SENSE packet commands. */ /* Structures related to the SELECT SENSE / MODE SENSE packet commands. */
#define IDETAPE_BLOCK_DESCRIPTOR 0 #define IDETAPE_BLOCK_DESCRIPTOR 0
#define IDETAPE_CAPABILITIES_PAGE 0x2a #define IDETAPE_CAPABILITIES_PAGE 0x2a
...@@ -422,19 +417,19 @@ static void idetape_analyze_error(ide_drive_t *drive, u8 *sense) ...@@ -422,19 +417,19 @@ static void idetape_analyze_error(ide_drive_t *drive, u8 *sense)
} }
} }
if (pc->c[0] == READ_6 && (sense[2] & 0x80)) { if (pc->c[0] == READ_6 && (sense[2] & 0x80)) {
pc->error = IDETAPE_ERROR_FILEMARK; pc->error = IDE_DRV_ERROR_FILEMARK;
pc->flags |= PC_FLAG_ABORT; pc->flags |= PC_FLAG_ABORT;
} }
if (pc->c[0] == WRITE_6) { if (pc->c[0] == WRITE_6) {
if ((sense[2] & 0x40) || (tape->sense_key == 0xd if ((sense[2] & 0x40) || (tape->sense_key == 0xd
&& tape->asc == 0x0 && tape->ascq == 0x2)) { && tape->asc == 0x0 && tape->ascq == 0x2)) {
pc->error = IDETAPE_ERROR_EOD; pc->error = IDE_DRV_ERROR_EOD;
pc->flags |= PC_FLAG_ABORT; pc->flags |= PC_FLAG_ABORT;
} }
} }
if (pc->c[0] == READ_6 || pc->c[0] == WRITE_6) { if (pc->c[0] == READ_6 || pc->c[0] == WRITE_6) {
if (tape->sense_key == 8) { if (tape->sense_key == 8) {
pc->error = IDETAPE_ERROR_EOD; pc->error = IDE_DRV_ERROR_EOD;
pc->flags |= PC_FLAG_ABORT; pc->flags |= PC_FLAG_ABORT;
} }
if (!(pc->flags & PC_FLAG_ABORT) && if (!(pc->flags & PC_FLAG_ABORT) &&
...@@ -474,7 +469,7 @@ static int idetape_end_request(ide_drive_t *drive, int uptodate, int nr_sects) ...@@ -474,7 +469,7 @@ static int idetape_end_request(ide_drive_t *drive, int uptodate, int nr_sects)
debug_log(DBG_PROCS, "Enter %s\n", __func__); debug_log(DBG_PROCS, "Enter %s\n", __func__);
switch (uptodate) { switch (uptodate) {
case 0: error = IDETAPE_ERROR_GENERAL; break; case 0: error = IDE_DRV_ERROR_GENERAL; break;
case 1: error = 0; break; case 1: error = 0; break;
default: error = uptodate; default: error = uptodate;
} }
...@@ -669,7 +664,7 @@ static ide_startstop_t idetape_issue_pc(ide_drive_t *drive, ...@@ -669,7 +664,7 @@ static ide_startstop_t idetape_issue_pc(ide_drive_t *drive,
tape->ascq); tape->ascq);
} }
/* Giving up */ /* Giving up */
pc->error = IDETAPE_ERROR_GENERAL; pc->error = IDE_DRV_ERROR_GENERAL;
} }
drive->failed_pc = NULL; drive->failed_pc = NULL;
drive->pc_callback(drive, 0); drive->pc_callback(drive, 0);
...@@ -730,7 +725,7 @@ static ide_startstop_t idetape_media_access_finished(ide_drive_t *drive) ...@@ -730,7 +725,7 @@ static ide_startstop_t idetape_media_access_finished(ide_drive_t *drive)
} }
pc->error = 0; pc->error = 0;
} else { } else {
pc->error = IDETAPE_ERROR_GENERAL; pc->error = IDE_DRV_ERROR_GENERAL;
drive->failed_pc = NULL; drive->failed_pc = NULL;
} }
drive->pc_callback(drive, 0); drive->pc_callback(drive, 0);
...@@ -1210,7 +1205,7 @@ static int idetape_queue_rw_tail(ide_drive_t *drive, int cmd, int blocks, ...@@ -1210,7 +1205,7 @@ static int idetape_queue_rw_tail(ide_drive_t *drive, int cmd, int blocks,
if (tape->merge_bh) if (tape->merge_bh)
idetape_init_merge_buffer(tape); idetape_init_merge_buffer(tape);
if (errors == IDETAPE_ERROR_GENERAL) if (errors == IDE_DRV_ERROR_GENERAL)
return -EIO; return -EIO;
return ret; return ret;
} }
......
...@@ -315,12 +315,8 @@ static ide_startstop_t task_error(ide_drive_t *drive, struct request *rq, ...@@ -315,12 +315,8 @@ static ide_startstop_t task_error(ide_drive_t *drive, struct request *rq,
break; break;
} }
if (sectors > 0) { if (sectors > 0)
struct ide_driver *drv; ide_end_request(drive, 1, sectors);
drv = *(struct ide_driver **)rq->rq_disk->private_data;
drv->end_request(drive, 1, sectors);
}
} }
return ide_error(drive, s, stat); return ide_error(drive, s, stat);
} }
...@@ -337,13 +333,7 @@ void task_end_request(ide_drive_t *drive, struct request *rq, u8 stat) ...@@ -337,13 +333,7 @@ void task_end_request(ide_drive_t *drive, struct request *rq, u8 stat)
return; return;
} }
if (rq->rq_disk) { ide_end_request(drive, 1, rq->nr_sectors);
struct ide_driver *drv;
drv = *(struct ide_driver **)rq->rq_disk->private_data;;
drv->end_request(drive, 1, rq->nr_sectors);
} else
ide_end_request(drive, 1, rq->nr_sectors);
} }
/* /*
......
...@@ -40,6 +40,13 @@ ...@@ -40,6 +40,13 @@
#define ERROR_RESET 3 /* Reset controller every 4th retry */ #define ERROR_RESET 3 /* Reset controller every 4th retry */
#define ERROR_RECAL 1 /* Recalibrate every 2nd retry */ #define ERROR_RECAL 1 /* Recalibrate every 2nd retry */
/* Error codes returned in rq->errors to the higher part of the driver. */
enum {
IDE_DRV_ERROR_GENERAL = 101,
IDE_DRV_ERROR_FILEMARK = 102,
IDE_DRV_ERROR_EOD = 103,
};
/* /*
* Definitions for accessing IDE controller registers * Definitions for accessing IDE controller registers
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment