Commit 81f49382 authored by Borislav Petkov's avatar Borislav Petkov Committed by Bartlomiej Zolnierkiewicz

ide-floppy: merge callbacks

The appropriate functionality of the callback is established through querying
the ATAPI packet command in pc->c[0].

While at it, simplify if (floppy->failed_pc)-branch to be found in the original
idefloppy_request_sense_callback().

Bart:
- keep handling for blk_pc_request() requests unchanged + add FIXME
- add uptodate variable + leave just one idefloppy_end_request() call
- add newline to the debug message
Signed-off-by: default avatarBorislav Petkov <petkovbb@gmail.com>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 92f5daff
...@@ -312,14 +312,21 @@ static struct request *idefloppy_next_rq_storage(ide_drive_t *drive) ...@@ -312,14 +312,21 @@ static struct request *idefloppy_next_rq_storage(ide_drive_t *drive)
return (&floppy->rq_stack[floppy->rq_stack_index++]); return (&floppy->rq_stack[floppy->rq_stack_index++]);
} }
static void idefloppy_request_sense_callback(ide_drive_t *drive) static void ide_floppy_callback(ide_drive_t *drive)
{ {
idefloppy_floppy_t *floppy = drive->driver_data; idefloppy_floppy_t *floppy = drive->driver_data;
u8 *buf = floppy->pc->buf; struct ide_atapi_pc *pc = floppy->pc;
int uptodate = pc->error ? 0 : 1;
debug_log("Reached %s\n", __func__); debug_log("Reached %s\n", __func__);
if (!floppy->pc->error) { if (pc->c[0] == GPCMD_READ_10 || pc->c[0] == GPCMD_WRITE_10 ||
(pc->rq && blk_pc_request(pc->rq)))
uptodate = 1; /* FIXME */
else if (pc->c[0] == GPCMD_REQUEST_SENSE) {
u8 *buf = floppy->pc->buf;
if (!pc->error) {
floppy->sense_key = buf[2] & 0x0F; floppy->sense_key = buf[2] & 0x0F;
floppy->asc = buf[12]; floppy->asc = buf[12];
floppy->ascq = buf[13]; floppy->ascq = buf[13];
...@@ -327,35 +334,16 @@ static void idefloppy_request_sense_callback(ide_drive_t *drive) ...@@ -327,35 +334,16 @@ static void idefloppy_request_sense_callback(ide_drive_t *drive)
(u16)get_unaligned((u16 *)&buf[16]) : 0x10000; (u16)get_unaligned((u16 *)&buf[16]) : 0x10000;
if (floppy->failed_pc) if (floppy->failed_pc)
debug_log("pc = %x, sense key = %x, asc = %x," debug_log("pc = %x, ", floppy->failed_pc->c[0]);
" ascq = %x\n",
floppy->failed_pc->c[0],
floppy->sense_key,
floppy->asc,
floppy->ascq);
else
debug_log("sense key = %x, asc = %x, ascq = %x\n",
floppy->sense_key,
floppy->asc,
floppy->ascq);
debug_log("sense key = %x, asc = %x, ascq = %x\n",
idefloppy_end_request(drive, 1, 0); floppy->sense_key, floppy->asc, floppy->ascq);
} else { } else
printk(KERN_ERR "Error in REQUEST SENSE itself - Aborting" printk(KERN_ERR "Error in REQUEST SENSE itself - "
" request!\n"); "Aborting request!\n");
idefloppy_end_request(drive, 0, 0);
} }
}
/* General packet command callback function. */ idefloppy_end_request(drive, uptodate, 0);
static void idefloppy_pc_callback(ide_drive_t *drive)
{
idefloppy_floppy_t *floppy = drive->driver_data;
debug_log("Reached %s\n", __func__);
idefloppy_end_request(drive, floppy->pc->error ? 0 : 1, 0);
} }
static void idefloppy_init_pc(struct ide_atapi_pc *pc) static void idefloppy_init_pc(struct ide_atapi_pc *pc)
...@@ -366,7 +354,7 @@ static void idefloppy_init_pc(struct ide_atapi_pc *pc) ...@@ -366,7 +354,7 @@ static void idefloppy_init_pc(struct ide_atapi_pc *pc)
pc->req_xfer = 0; pc->req_xfer = 0;
pc->buf = pc->pc_buf; pc->buf = pc->pc_buf;
pc->buf_size = IDEFLOPPY_PC_BUFFER_SIZE; pc->buf_size = IDEFLOPPY_PC_BUFFER_SIZE;
pc->idefloppy_callback = &idefloppy_pc_callback; pc->idefloppy_callback = &ide_floppy_callback;
} }
static void idefloppy_create_request_sense_cmd(struct ide_atapi_pc *pc) static void idefloppy_create_request_sense_cmd(struct ide_atapi_pc *pc)
...@@ -375,7 +363,6 @@ static void idefloppy_create_request_sense_cmd(struct ide_atapi_pc *pc) ...@@ -375,7 +363,6 @@ static void idefloppy_create_request_sense_cmd(struct ide_atapi_pc *pc)
pc->c[0] = GPCMD_REQUEST_SENSE; pc->c[0] = GPCMD_REQUEST_SENSE;
pc->c[4] = 255; pc->c[4] = 255;
pc->req_xfer = 18; pc->req_xfer = 18;
pc->idefloppy_callback = &idefloppy_request_sense_callback;
} }
/* /*
...@@ -668,14 +655,6 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive, ...@@ -668,14 +655,6 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive,
} }
} }
static void idefloppy_rw_callback(ide_drive_t *drive)
{
debug_log("Reached %s\n", __func__);
idefloppy_end_request(drive, 1, 0);
return;
}
static void idefloppy_create_prevent_cmd(struct ide_atapi_pc *pc, int prevent) static void idefloppy_create_prevent_cmd(struct ide_atapi_pc *pc, int prevent)
{ {
debug_log("creating prevent removal command, prevent = %d\n", prevent); debug_log("creating prevent removal command, prevent = %d\n", prevent);
...@@ -770,7 +749,6 @@ static void idefloppy_create_rw_cmd(idefloppy_floppy_t *floppy, ...@@ -770,7 +749,6 @@ static void idefloppy_create_rw_cmd(idefloppy_floppy_t *floppy,
put_unaligned(cpu_to_be16(blocks), (unsigned short *)&pc->c[7]); put_unaligned(cpu_to_be16(blocks), (unsigned short *)&pc->c[7]);
put_unaligned(cpu_to_be32(block), (unsigned int *) &pc->c[2]); put_unaligned(cpu_to_be32(block), (unsigned int *) &pc->c[2]);
pc->idefloppy_callback = &idefloppy_rw_callback;
pc->rq = rq; pc->rq = rq;
pc->b_count = cmd == READ ? 0 : rq->bio->bi_size; pc->b_count = cmd == READ ? 0 : rq->bio->bi_size;
if (rq->cmd_flags & REQ_RW) if (rq->cmd_flags & REQ_RW)
...@@ -784,7 +762,6 @@ static void idefloppy_blockpc_cmd(idefloppy_floppy_t *floppy, ...@@ -784,7 +762,6 @@ static void idefloppy_blockpc_cmd(idefloppy_floppy_t *floppy,
struct ide_atapi_pc *pc, struct request *rq) struct ide_atapi_pc *pc, struct request *rq)
{ {
idefloppy_init_pc(pc); idefloppy_init_pc(pc);
pc->idefloppy_callback = &idefloppy_rw_callback;
memcpy(pc->c, rq->cmd, sizeof(pc->c)); memcpy(pc->c, rq->cmd, sizeof(pc->c));
pc->rq = rq; pc->rq = rq;
pc->b_count = rq->data_len; pc->b_count = rq->data_len;
......
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