|
@@ -312,50 +312,38 @@ static struct request *idefloppy_next_rq_storage(ide_drive_t *drive)
|
|
|
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;
|
|
|
- u8 *buf = floppy->pc->buf;
|
|
|
+ struct ide_atapi_pc *pc = floppy->pc;
|
|
|
+ int uptodate = pc->error ? 0 : 1;
|
|
|
|
|
|
debug_log("Reached %s\n", __func__);
|
|
|
|
|
|
- if (!floppy->pc->error) {
|
|
|
- floppy->sense_key = buf[2] & 0x0F;
|
|
|
- floppy->asc = buf[12];
|
|
|
- floppy->ascq = buf[13];
|
|
|
- floppy->progress_indication = buf[15] & 0x80 ?
|
|
|
- (u16)get_unaligned((u16 *)&buf[16]) : 0x10000;
|
|
|
+ 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 (floppy->failed_pc)
|
|
|
- debug_log("pc = %x, sense key = %x, asc = %x,"
|
|
|
- " 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);
|
|
|
+ if (!pc->error) {
|
|
|
+ floppy->sense_key = buf[2] & 0x0F;
|
|
|
+ floppy->asc = buf[12];
|
|
|
+ floppy->ascq = buf[13];
|
|
|
+ floppy->progress_indication = buf[15] & 0x80 ?
|
|
|
+ (u16)get_unaligned((u16 *)&buf[16]) : 0x10000;
|
|
|
|
|
|
+ if (floppy->failed_pc)
|
|
|
+ debug_log("pc = %x, ", floppy->failed_pc->c[0]);
|
|
|
|
|
|
- idefloppy_end_request(drive, 1, 0);
|
|
|
- } else {
|
|
|
- printk(KERN_ERR "Error in REQUEST SENSE itself - Aborting"
|
|
|
- " request!\n");
|
|
|
- idefloppy_end_request(drive, 0, 0);
|
|
|
+ debug_log("sense key = %x, asc = %x, ascq = %x\n",
|
|
|
+ floppy->sense_key, floppy->asc, floppy->ascq);
|
|
|
+ } else
|
|
|
+ printk(KERN_ERR "Error in REQUEST SENSE itself - "
|
|
|
+ "Aborting request!\n");
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
-/* General packet command callback function. */
|
|
|
-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);
|
|
|
+ idefloppy_end_request(drive, uptodate, 0);
|
|
|
}
|
|
|
|
|
|
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->buf = pc->pc_buf;
|
|
|
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)
|
|
@@ -375,7 +363,6 @@ static void idefloppy_create_request_sense_cmd(struct ide_atapi_pc *pc)
|
|
|
pc->c[0] = GPCMD_REQUEST_SENSE;
|
|
|
pc->c[4] = 255;
|
|
|
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,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-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)
|
|
|
{
|
|
|
debug_log("creating prevent removal command, prevent = %d\n", prevent);
|
|
@@ -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_be32(block), (unsigned int *) &pc->c[2]);
|
|
|
|
|
|
- pc->idefloppy_callback = &idefloppy_rw_callback;
|
|
|
pc->rq = rq;
|
|
|
pc->b_count = cmd == READ ? 0 : rq->bio->bi_size;
|
|
|
if (rq->cmd_flags & REQ_RW)
|
|
@@ -784,7 +762,6 @@ static void idefloppy_blockpc_cmd(idefloppy_floppy_t *floppy,
|
|
|
struct ide_atapi_pc *pc, struct request *rq)
|
|
|
{
|
|
|
idefloppy_init_pc(pc);
|
|
|
- pc->idefloppy_callback = &idefloppy_rw_callback;
|
|
|
memcpy(pc->c, rq->cmd, sizeof(pc->c));
|
|
|
pc->rq = rq;
|
|
|
pc->b_count = rq->data_len;
|