diff options
-rw-r--r-- | drivers/ide/ide-floppy.c | 69 |
1 files changed, 23 insertions, 46 deletions
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index dae1c90d421f..2058a6f3f331 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c | |||
@@ -312,50 +312,38 @@ static struct request *idefloppy_next_rq_storage(ide_drive_t *drive) | |||
312 | return (&floppy->rq_stack[floppy->rq_stack_index++]); | 312 | return (&floppy->rq_stack[floppy->rq_stack_index++]); |
313 | } | 313 | } |
314 | 314 | ||
315 | static void idefloppy_request_sense_callback(ide_drive_t *drive) | 315 | static void ide_floppy_callback(ide_drive_t *drive) |
316 | { | 316 | { |
317 | idefloppy_floppy_t *floppy = drive->driver_data; | 317 | idefloppy_floppy_t *floppy = drive->driver_data; |
318 | u8 *buf = floppy->pc->buf; | 318 | struct ide_atapi_pc *pc = floppy->pc; |
319 | int uptodate = pc->error ? 0 : 1; | ||
319 | 320 | ||
320 | debug_log("Reached %s\n", __func__); | 321 | debug_log("Reached %s\n", __func__); |
321 | 322 | ||
322 | if (!floppy->pc->error) { | 323 | if (pc->c[0] == GPCMD_READ_10 || pc->c[0] == GPCMD_WRITE_10 || |
323 | floppy->sense_key = buf[2] & 0x0F; | 324 | (pc->rq && blk_pc_request(pc->rq))) |
324 | floppy->asc = buf[12]; | 325 | uptodate = 1; /* FIXME */ |
325 | floppy->ascq = buf[13]; | 326 | else if (pc->c[0] == GPCMD_REQUEST_SENSE) { |
326 | floppy->progress_indication = buf[15] & 0x80 ? | 327 | u8 *buf = floppy->pc->buf; |
327 | (u16)get_unaligned((u16 *)&buf[16]) : 0x10000; | ||
328 | 328 | ||
329 | if (floppy->failed_pc) | 329 | if (!pc->error) { |
330 | debug_log("pc = %x, sense key = %x, asc = %x," | 330 | floppy->sense_key = buf[2] & 0x0F; |
331 | " ascq = %x\n", | 331 | floppy->asc = buf[12]; |
332 | floppy->failed_pc->c[0], | 332 | floppy->ascq = buf[13]; |
333 | floppy->sense_key, | 333 | floppy->progress_indication = buf[15] & 0x80 ? |
334 | floppy->asc, | 334 | (u16)get_unaligned((u16 *)&buf[16]) : 0x10000; |
335 | floppy->ascq); | ||
336 | else | ||
337 | debug_log("sense key = %x, asc = %x, ascq = %x\n", | ||
338 | floppy->sense_key, | ||
339 | floppy->asc, | ||
340 | floppy->ascq); | ||
341 | 335 | ||
336 | if (floppy->failed_pc) | ||
337 | debug_log("pc = %x, ", floppy->failed_pc->c[0]); | ||
342 | 338 | ||
343 | idefloppy_end_request(drive, 1, 0); | 339 | debug_log("sense key = %x, asc = %x, ascq = %x\n", |
344 | } else { | 340 | floppy->sense_key, floppy->asc, floppy->ascq); |
345 | printk(KERN_ERR "Error in REQUEST SENSE itself - Aborting" | 341 | } else |
346 | " request!\n"); | 342 | printk(KERN_ERR "Error in REQUEST SENSE itself - " |
347 | idefloppy_end_request(drive, 0, 0); | 343 | "Aborting request!\n"); |
348 | } | 344 | } |
349 | } | ||
350 | 345 | ||
351 | /* General packet command callback function. */ | 346 | idefloppy_end_request(drive, uptodate, 0); |
352 | static void idefloppy_pc_callback(ide_drive_t *drive) | ||
353 | { | ||
354 | idefloppy_floppy_t *floppy = drive->driver_data; | ||
355 | |||
356 | debug_log("Reached %s\n", __func__); | ||
357 | |||
358 | idefloppy_end_request(drive, floppy->pc->error ? 0 : 1, 0); | ||
359 | } | 347 | } |
360 | 348 | ||
361 | static void idefloppy_init_pc(struct ide_atapi_pc *pc) | 349 | 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 | pc->req_xfer = 0; | 354 | pc->req_xfer = 0; |
367 | pc->buf = pc->pc_buf; | 355 | pc->buf = pc->pc_buf; |
368 | pc->buf_size = IDEFLOPPY_PC_BUFFER_SIZE; | 356 | pc->buf_size = IDEFLOPPY_PC_BUFFER_SIZE; |
369 | pc->idefloppy_callback = &idefloppy_pc_callback; | 357 | pc->idefloppy_callback = &ide_floppy_callback; |
370 | } | 358 | } |
371 | 359 | ||
372 | static void idefloppy_create_request_sense_cmd(struct ide_atapi_pc *pc) | 360 | 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 | pc->c[0] = GPCMD_REQUEST_SENSE; | 363 | pc->c[0] = GPCMD_REQUEST_SENSE; |
376 | pc->c[4] = 255; | 364 | pc->c[4] = 255; |
377 | pc->req_xfer = 18; | 365 | pc->req_xfer = 18; |
378 | pc->idefloppy_callback = &idefloppy_request_sense_callback; | ||
379 | } | 366 | } |
380 | 367 | ||
381 | /* | 368 | /* |
@@ -668,14 +655,6 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive, | |||
668 | } | 655 | } |
669 | } | 656 | } |
670 | 657 | ||
671 | static void idefloppy_rw_callback(ide_drive_t *drive) | ||
672 | { | ||
673 | debug_log("Reached %s\n", __func__); | ||
674 | |||
675 | idefloppy_end_request(drive, 1, 0); | ||
676 | return; | ||
677 | } | ||
678 | |||
679 | static void idefloppy_create_prevent_cmd(struct ide_atapi_pc *pc, int prevent) | 658 | static void idefloppy_create_prevent_cmd(struct ide_atapi_pc *pc, int prevent) |
680 | { | 659 | { |
681 | debug_log("creating prevent removal command, prevent = %d\n", prevent); | 660 | 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 | put_unaligned(cpu_to_be16(blocks), (unsigned short *)&pc->c[7]); | 749 | put_unaligned(cpu_to_be16(blocks), (unsigned short *)&pc->c[7]); |
771 | put_unaligned(cpu_to_be32(block), (unsigned int *) &pc->c[2]); | 750 | put_unaligned(cpu_to_be32(block), (unsigned int *) &pc->c[2]); |
772 | 751 | ||
773 | pc->idefloppy_callback = &idefloppy_rw_callback; | ||
774 | pc->rq = rq; | 752 | pc->rq = rq; |
775 | pc->b_count = cmd == READ ? 0 : rq->bio->bi_size; | 753 | pc->b_count = cmd == READ ? 0 : rq->bio->bi_size; |
776 | if (rq->cmd_flags & REQ_RW) | 754 | if (rq->cmd_flags & REQ_RW) |
@@ -784,7 +762,6 @@ static void idefloppy_blockpc_cmd(idefloppy_floppy_t *floppy, | |||
784 | struct ide_atapi_pc *pc, struct request *rq) | 762 | struct ide_atapi_pc *pc, struct request *rq) |
785 | { | 763 | { |
786 | idefloppy_init_pc(pc); | 764 | idefloppy_init_pc(pc); |
787 | pc->idefloppy_callback = &idefloppy_rw_callback; | ||
788 | memcpy(pc->c, rq->cmd, sizeof(pc->c)); | 765 | memcpy(pc->c, rq->cmd, sizeof(pc->c)); |
789 | pc->rq = rq; | 766 | pc->rq = rq; |
790 | pc->b_count = rq->data_len; | 767 | pc->b_count = rq->data_len; |