diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/ide/ide-cd.c | 49 |
1 files changed, 11 insertions, 38 deletions
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 34981f578e26..1a7410f88249 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -511,6 +511,9 @@ end_request: | |||
511 | return 1; | 511 | return 1; |
512 | } | 512 | } |
513 | 513 | ||
514 | static ide_startstop_t cdrom_transfer_packet_command(ide_drive_t *); | ||
515 | static ide_startstop_t cdrom_newpc_intr(ide_drive_t *); | ||
516 | |||
514 | /* | 517 | /* |
515 | * Set up the device registers for transferring a packet command on DEV, | 518 | * Set up the device registers for transferring a packet command on DEV, |
516 | * expecting to later transfer XFERLEN bytes. HANDLER is the routine | 519 | * expecting to later transfer XFERLEN bytes. HANDLER is the routine |
@@ -519,8 +522,7 @@ end_request: | |||
519 | * called when the interrupt from the drive arrives. Otherwise, HANDLER | 522 | * called when the interrupt from the drive arrives. Otherwise, HANDLER |
520 | * will be called immediately after the drive is prepared for the transfer. | 523 | * will be called immediately after the drive is prepared for the transfer. |
521 | */ | 524 | */ |
522 | static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive, | 525 | static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive) |
523 | ide_handler_t *handler) | ||
524 | { | 526 | { |
525 | ide_hwif_t *hwif = drive->hwif; | 527 | ide_hwif_t *hwif = drive->hwif; |
526 | struct request *rq = hwif->hwgroup->rq; | 528 | struct request *rq = hwif->hwgroup->rq; |
@@ -544,13 +546,14 @@ static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive, | |||
544 | drive->waiting_for_dma = 0; | 546 | drive->waiting_for_dma = 0; |
545 | 547 | ||
546 | /* packet command */ | 548 | /* packet command */ |
547 | ide_execute_command(drive, ATA_CMD_PACKET, handler, | 549 | ide_execute_command(drive, ATA_CMD_PACKET, |
550 | cdrom_transfer_packet_command, | ||
548 | ATAPI_WAIT_PC, ide_cd_expiry); | 551 | ATAPI_WAIT_PC, ide_cd_expiry); |
549 | return ide_started; | 552 | return ide_started; |
550 | } else { | 553 | } else { |
551 | ide_execute_pkt_cmd(drive); | 554 | ide_execute_pkt_cmd(drive); |
552 | 555 | ||
553 | return (*handler) (drive); | 556 | return cdrom_transfer_packet_command(drive); |
554 | } | 557 | } |
555 | } | 558 | } |
556 | 559 | ||
@@ -561,11 +564,10 @@ static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive, | |||
561 | * there's data ready. | 564 | * there's data ready. |
562 | */ | 565 | */ |
563 | #define ATAPI_MIN_CDB_BYTES 12 | 566 | #define ATAPI_MIN_CDB_BYTES 12 |
564 | static ide_startstop_t cdrom_transfer_packet_command(ide_drive_t *drive, | 567 | static ide_startstop_t cdrom_transfer_packet_command(ide_drive_t *drive) |
565 | struct request *rq, | ||
566 | ide_handler_t *handler) | ||
567 | { | 568 | { |
568 | ide_hwif_t *hwif = drive->hwif; | 569 | ide_hwif_t *hwif = drive->hwif; |
570 | struct request *rq = hwif->hwgroup->rq; | ||
569 | int cmd_len; | 571 | int cmd_len; |
570 | ide_startstop_t startstop; | 572 | ide_startstop_t startstop; |
571 | 573 | ||
@@ -592,7 +594,7 @@ static ide_startstop_t cdrom_transfer_packet_command(ide_drive_t *drive, | |||
592 | } | 594 | } |
593 | 595 | ||
594 | /* arm the interrupt handler */ | 596 | /* arm the interrupt handler */ |
595 | ide_set_handler(drive, handler, rq->timeout, ide_cd_expiry); | 597 | ide_set_handler(drive, cdrom_newpc_intr, rq->timeout, ide_cd_expiry); |
596 | 598 | ||
597 | /* ATAPI commands get padded out to 12 bytes minimum */ | 599 | /* ATAPI commands get padded out to 12 bytes minimum */ |
598 | cmd_len = COMMAND_SIZE(rq->cmd[0]); | 600 | cmd_len = COMMAND_SIZE(rq->cmd[0]); |
@@ -680,8 +682,6 @@ static int ide_cd_check_transfer_size(ide_drive_t *drive, int len) | |||
680 | return 1; | 682 | return 1; |
681 | } | 683 | } |
682 | 684 | ||
683 | static ide_startstop_t cdrom_newpc_intr(ide_drive_t *); | ||
684 | |||
685 | static ide_startstop_t ide_cd_prepare_rw_request(ide_drive_t *drive, | 685 | static ide_startstop_t ide_cd_prepare_rw_request(ide_drive_t *drive, |
686 | struct request *rq) | 686 | struct request *rq) |
687 | { | 687 | { |
@@ -724,20 +724,6 @@ static ide_startstop_t ide_cd_prepare_rw_request(ide_drive_t *drive, | |||
724 | } | 724 | } |
725 | 725 | ||
726 | /* | 726 | /* |
727 | * Routine to send a read/write packet command to the drive. This is usually | ||
728 | * called directly from cdrom_start_{read,write}(). However, for drq_interrupt | ||
729 | * devices, it is called from an interrupt when the drive is ready to accept | ||
730 | * the command. | ||
731 | */ | ||
732 | static ide_startstop_t cdrom_start_rw_cont(ide_drive_t *drive) | ||
733 | { | ||
734 | struct request *rq = drive->hwif->hwgroup->rq; | ||
735 | |||
736 | /* send the command to the drive and return */ | ||
737 | return cdrom_transfer_packet_command(drive, rq, cdrom_newpc_intr); | ||
738 | } | ||
739 | |||
740 | /* | ||
741 | * Fix up a possibly partially-processed request so that we can start it over | 727 | * Fix up a possibly partially-processed request so that we can start it over |
742 | * entirely, or even put it back on the request queue. | 728 | * entirely, or even put it back on the request queue. |
743 | */ | 729 | */ |
@@ -1126,13 +1112,6 @@ static ide_startstop_t cdrom_start_rw(ide_drive_t *drive, struct request *rq) | |||
1126 | return ide_started; | 1112 | return ide_started; |
1127 | } | 1113 | } |
1128 | 1114 | ||
1129 | static ide_startstop_t cdrom_do_newpc_cont(ide_drive_t *drive) | ||
1130 | { | ||
1131 | struct request *rq = HWGROUP(drive)->rq; | ||
1132 | |||
1133 | return cdrom_transfer_packet_command(drive, rq, cdrom_newpc_intr); | ||
1134 | } | ||
1135 | |||
1136 | static void cdrom_do_block_pc(ide_drive_t *drive, struct request *rq) | 1115 | static void cdrom_do_block_pc(ide_drive_t *drive, struct request *rq) |
1137 | { | 1116 | { |
1138 | 1117 | ||
@@ -1177,16 +1156,12 @@ static void cdrom_do_block_pc(ide_drive_t *drive, struct request *rq) | |||
1177 | static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq, | 1156 | static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq, |
1178 | sector_t block) | 1157 | sector_t block) |
1179 | { | 1158 | { |
1180 | ide_handler_t *fn; | ||
1181 | |||
1182 | ide_debug_log(IDE_DBG_RQ, "Call %s, rq->cmd[0]: 0x%x, " | 1159 | ide_debug_log(IDE_DBG_RQ, "Call %s, rq->cmd[0]: 0x%x, " |
1183 | "rq->cmd_type: 0x%x, block: %llu\n", | 1160 | "rq->cmd_type: 0x%x, block: %llu\n", |
1184 | __func__, rq->cmd[0], rq->cmd_type, | 1161 | __func__, rq->cmd[0], rq->cmd_type, |
1185 | (unsigned long long)block); | 1162 | (unsigned long long)block); |
1186 | 1163 | ||
1187 | if (blk_fs_request(rq)) { | 1164 | if (blk_fs_request(rq)) { |
1188 | fn = cdrom_start_rw_cont; | ||
1189 | |||
1190 | if (cdrom_start_rw(drive, rq) == ide_stopped) | 1165 | if (cdrom_start_rw(drive, rq) == ide_stopped) |
1191 | return ide_stopped; | 1166 | return ide_stopped; |
1192 | 1167 | ||
@@ -1194,8 +1169,6 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq, | |||
1194 | return ide_stopped; | 1169 | return ide_stopped; |
1195 | } else if (blk_sense_request(rq) || blk_pc_request(rq) || | 1170 | } else if (blk_sense_request(rq) || blk_pc_request(rq) || |
1196 | rq->cmd_type == REQ_TYPE_ATA_PC) { | 1171 | rq->cmd_type == REQ_TYPE_ATA_PC) { |
1197 | fn = cdrom_do_newpc_cont; | ||
1198 | |||
1199 | if (!rq->timeout) | 1172 | if (!rq->timeout) |
1200 | rq->timeout = ATAPI_WAIT_PC; | 1173 | rq->timeout = ATAPI_WAIT_PC; |
1201 | 1174 | ||
@@ -1210,7 +1183,7 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq, | |||
1210 | return ide_stopped; | 1183 | return ide_stopped; |
1211 | } | 1184 | } |
1212 | 1185 | ||
1213 | return cdrom_start_packet_command(drive, fn); | 1186 | return cdrom_start_packet_command(drive); |
1214 | } | 1187 | } |
1215 | 1188 | ||
1216 | /* | 1189 | /* |