ide-cd: first conversion batch
cover ide-cd: first conversion batch
Hi Bart,
here's the first batch of conversion patches. Now ide_issue_pc/ide_transfer_pc are almost completely aligned to their ide-cd counterparts cdrom_start_packet_command/cdrom_transfer_packet_command. The only thing missing is the setting of the irq handler through ide_set_handler but this is not that trivial since if i'd moved ide-cd's irq handler to ide-atapi that would suck in a bunch of other ide-cd functions which is not what we want, (yes/no)? and I'm going to have to ponder a little bit more on that.
Those have been lightly tested with ide-cd and ide-floppy.
drivers/ide/ide-atapi.c | 115 ++++++++++++++++---------------------------- drivers/ide/ide-cd.c | 121 ++++++++++++++++++++++++++++------------------ drivers/ide/ide-floppy.c | 2 +- drivers/ide/ide-tape.c | 2 +- include/linux/ide.h | 2 +- 5 files changed, 117 insertions(+), 125 deletions(-)
PATCH 1/8 ide-atapi: compute cmd_len based on device type in ide_transfer_pc
There should be no functionality change resulting from this patch.
--- drivers/ide/ide-atapi.c | 14 +++++++++++++- 1 files changed, 13 insertions(+), 1 deletions(-)
drivers/ide/ide-atapi.c +13 -1
@@ -15,6 +15,8 @@ #define debug_log(fmt, args...) do {} while (0)#endif +#define ATAPI_MIN_CDB_BYTES 12 +static inline int dev_is_idecd (ide_drive_t *drive) {return drive->media == ide_cdrom || drive->media == ide_optical;
@@ -492,6 +494,7 @@ static ide_startstop_t ide_transfer_pc(ide_drive_t *drive)struct request *rq = hwif->hwgroup->rq;ide_expiry_t *expiry;unsigned int timeout; +int cmd_len;ide_startstop_t startstop;u8 ireason;
@@ -506,6 +509,14 @@ static ide_startstop_t ide_transfer_pc(ide_drive_t *drive) drive->waiting_for_dma =1 ; } +if (dev_is_idecd (drive)) { +/* ATAPI commands get padded out to 12 bytes minimum */ + cmd_len =COMMAND_SIZE (rq->cmd[0 ]); +if (cmd_len <ATAPI_MIN_CDB_BYTES ) + cmd_len =ATAPI_MIN_CDB_BYTES ; + }else + cmd_len =ATAPI_MIN_CDB_BYTES ; + ireason =ide_read_ireason (drive);if (drive->media == ide_tape) ireason =ide_wait_ireason (drive, ireason);
@@ -513,6 +524,7 @@ static ide_startstop_t ide_transfer_pc(ide_drive_t *drive)if ((ireason &ATAPI_COD ) ==0 || (ireason &ATAPI_IO )) {printk (KERN_ERR "%s: (IO,CoD) != (0,1) while issuing " "a packet command\n" , drive->name); +return ide_do_reset (drive); }
@@ -541,7 +553,7 @@ static ide_startstop_t ide_transfer_pc(ide_drive_t *drive)/* Send the actual packet */ if ((drive->atapi_flags &IDE_AFLAG_ZIP_DRIVE ) ==0 ) - hwif->tp_ops->output_data (drive,NULL , rq->cmd,12 ); + hwif->tp_ops->output_data (drive,NULL , rq->cmd, cmd_len);return ide_started; }
Signature · 1 line
1.6.0.4
PATCH 2/8 ide-atapi: assign expiry and timeout based on device type
In reply to Borislav PetkovThere should be no functionality change resulting from this patch.
--- drivers/ide/ide-atapi.c | 35 ++++++++++++++++++++--------------- 1 files changed, 20 insertions(+), 15 deletions(-)
drivers/ide/ide-atapi.c +20 -15
@@ -514,9 +514,28 @@ static ide_startstop_t ide_transfer_pc(ide_drive_t *drive) cmd_len =COMMAND_SIZE (rq->cmd[0 ]);if (cmd_len <ATAPI_MIN_CDB_BYTES ) cmd_len =ATAPI_MIN_CDB_BYTES ; - }else + + timeout = rq->timeout; + expiry = ide_cd_expiry; + + }else { cmd_len =ATAPI_MIN_CDB_BYTES ; +/* +* If necessary schedule the packet transfer to occur 'timeout' +* miliseconds later in ide_delayed_transfer_pc() after the +* device says it's ready for a packet. +*/ +if (drive->atapi_flags &IDE_AFLAG_ZIP_DRIVE ) { + timeout = drive->pc_delay; + expiry = &ide_delayed_transfer_pc; + }else { + timeout = (drive->media == ide_floppy) ?WAIT_FLOPPY_CMD + :WAIT_TAPE_CMD ; + expiry =NULL ; + } + } + ireason =ide_read_ireason (drive);if (drive->media == ide_tape) ireason =ide_wait_ireason (drive, ireason);
@@ -528,20 +547,6 @@ static ide_startstop_t ide_transfer_pc(ide_drive_t *drive)return ide_do_reset (drive); } -/* -* If necessary schedule the packet transfer to occur 'timeout' -* miliseconds later in ide_delayed_transfer_pc() after the device -* says it's ready for a packet. -*/ -if (drive->atapi_flags &IDE_AFLAG_ZIP_DRIVE ) { - timeout = drive->pc_delay; - expiry = &ide_delayed_transfer_pc; - }else { - timeout = (drive->media == ide_floppy) ?WAIT_FLOPPY_CMD - :WAIT_TAPE_CMD ; - expiry =NULL ; - } -/* Set the interrupt routine */ ide_set_handler (drive, ide_pc_intr, timeout, expiry);
Signature · 1 line
1.6.0.4
Re: [PATCH 2/8] ide-atapi: assign expiry and timeout based on device type
Quoted 42 lines · Borislav Petkov
There should be no functionality change resulting from this patch.
Signed-off-by Borislav Petkov <[email protected]>--- drivers/ide/ide-atapi.c | 35 ++++++++++++++++++++--------------- 1 files changed, 20 insertions(+), 15 deletions(-)drivers/ide/ide-atapi.c +20
-1@@ -514,9 +514,28 @@ static ide_startstop_t ide_transfer_pc(ide_drive_t *drive) cmd_len =COMMAND_SIZE (rq->cmd[0 ]);if (cmd_len <ATAPI_MIN_CDB_BYTES ) cmd_len =ATAPI_MIN_CDB_BYTES ; - }else + + timeout = rq->timeout; + expiry = ide_cd_expiry; + + }else { cmd_len =ATAPI_MIN_CDB_BYTES ; +/* +* If necessary schedule the packet transfer to occur 'timeout' +* miliseconds later in ide_delayed_transfer_pc() after the +* device says it's ready for a packet. +*/ +if (drive->atapi_flags &IDE_AFLAG_ZIP_DRIVE ) { + timeout = drive->pc_delay; + expiry = &ide_delayed_transfer_pc; + }else { + timeout = (drive->media == ide_floppy) ?WAIT_FLOPPY_CMD + :WAIT_TAPE_CMD ; + expiry =NULL ; + } + } + ireason =ide_read_ireason (drive);if (drive->media == ide_tape) ireason =ide_wait_ireason (drive, ireason);
drivers/ide/ide-atapi.c static ide_startstop_t ide_transfer_pc(ide_drive_t *drive) · line 548
Quoted 2 lines
drivers/ide/ide-atapi.c +0
-0@@ -528,20 +547,6 @@ static ide_startstop_t ide_transfer_pc(ide_drive_t *drive)return ide_do_reset (drive); }
If we add dev_is_idecd() check here in patch #1 it won't be necessary to needlessly move the code around in this patch and it would also result in smaller resulting code (42 bytes saved on x86-32)...
[ I updated patches 1-2 accordingly while merging them. ]
Quoted 16 lines
drivers/ide/ide-atapi.c +0
-14-/* -* If necessary schedule the packet transfer to occur 'timeout' -* miliseconds later in ide_delayed_transfer_pc() after the device -* says it's ready for a packet. -*/ -if (drive->atapi_flags &IDE_AFLAG_ZIP_DRIVE ) { - timeout = drive->pc_delay; - expiry = &ide_delayed_transfer_pc; - }else { - timeout = (drive->media == ide_floppy) ?WAIT_FLOPPY_CMD - :WAIT_TAPE_CMD ; - expiry =NULL ; - } -/* Set the interrupt routine */ ide_set_handler (drive, ide_pc_intr, timeout, expiry);
PATCH 3/8 ide-atapi: split drive-specific functionality in ide_issue_pc
In reply to Borislav PetkovThere should be no functionality change resulting from this patch.
--- drivers/ide/ide-atapi.c | 36 ++++++++++++++++++++---------------- 1 files changed, 20 insertions(+), 16 deletions(-)
drivers/ide/ide-atapi.c +20 -16
@@ -565,39 +565,43 @@ static ide_startstop_t ide_transfer_pc(ide_drive_t *drive)ide_startstop_t ide_issue_pc (ide_drive_t *drive,unsigned int timeout) { -struct ide_atapi_pc *pc = drive->pc; +struct ide_atapi_pc *pc;ide_hwif_t *hwif = drive->hwif;ide_expiry_t *expiry =NULL ;u32 tf_flags;u16 bcount; -/* We haven't transferred any data yet */ - pc->xferred =0 ; - pc->cur_pos = pc->buf; -if (dev_is_idecd (drive)) { tf_flags =IDE_TFLAG_OUT_NSECT |IDE_TFLAG_OUT_LBAL ; bcount =ide_cd_get_xferlen (hwif->hwgroup->rq); expiry = ide_cd_expiry; + +if (drive->dma) + drive->dma = !hwif->dma_ops->dma_setup (drive); }else { + pc = drive->pc; + +/* We haven't transferred any data yet */ + pc->xferred =0 ; + pc->cur_pos = pc->buf; + tf_flags =IDE_TFLAG_OUT_DEVICE ; bcount = ((drive->media == ide_tape) ? pc->req_xfer :min (pc->req_xfer,63 *1024 )); - } -if (pc->flags &PC_FLAG_DMA_ERROR ) { - pc->flags &= ~PC_FLAG_DMA_ERROR ; -ide_dma_off (drive); - } +if (pc->flags &PC_FLAG_DMA_ERROR ) { + pc->flags &= ~PC_FLAG_DMA_ERROR ; +ide_dma_off (drive); + } -if (((pc->flags &PC_FLAG_DMA_OK ) && - (drive->dev_flags &IDE_DFLAG_USING_DMA )) || - drive->dma) - drive->dma = !hwif->dma_ops->dma_setup (drive); +if ((pc->flags &PC_FLAG_DMA_OK ) && + (drive->dev_flags &IDE_DFLAG_USING_DMA )) + drive->dma = !hwif->dma_ops->dma_setup (drive); -if (!drive->dma) - pc->flags &= ~PC_FLAG_DMA_OK ; +if (!drive->dma) + pc->flags &= ~PC_FLAG_DMA_OK ; + }ide_pktcmd_tf_load (drive, tf_flags, bcount, drive->dma);
Signature · 1 line
1.6.0.4
PATCH 4/8 ide-cd: remove xferlen arg to cdrom_start_packet_command
In reply to Borislav PetkovThere should be no functionality change resulting from this patch.
--- drivers/ide/ide-cd.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-)
drivers/ide/ide-cd.c +5 -5
@@ -520,10 +520,13 @@ end_request:* will be called immediately after the drive is prepared for the transfer. */ static ide_startstop_t cdrom_start_packet_command (ide_drive_t *drive, -int xferlen,ide_handler_t *handler) {ide_hwif_t *hwif = drive->hwif; +struct request *rq = hwif->hwgroup->rq; +int xferlen; + + xferlen =ide_cd_get_xferlen (rq);ide_debug_log (IDE_DBG_PC ,"Call %s, xferlen: %d\n" , __func__, xferlen);
@@ -1175,15 +1178,12 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq, sector_t block) {ide_handler_t *fn; -int xferlen;ide_debug_log (IDE_DBG_RQ ,"Call %s, rq->cmd[0]: 0x%x, " "rq->cmd_type: 0x%x, block: %llu\n" , __func__, rq->cmd[0 ], rq->cmd_type, (unsigned long long )block); - xferlen =ide_cd_get_xferlen (rq); -if (blk_fs_request (rq)) { fn = cdrom_start_rw_cont;
@@ -1210,7 +1210,7 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq,return ide_stopped; } -return cdrom_start_packet_command (drive, xferlen, fn); +return cdrom_start_packet_command (drive, fn); }/*
Signature · 1 line
1.6.0.4
PATCH 5/8 ide-cd: remove handler wrappers
In reply to Borislav PetkovRemove cdrom_do_newpc_cont and cdrom_start_rw_cont wrappers and pass cdrom_transfer_packet_command to ide_execute_command directly.
There should be no functionality change resulting from this patch.
--- drivers/ide/ide-cd.c | 121 ++++++++++++++++++++------------------------------ 1 files changed, 48 insertions(+), 73 deletions(-)
drivers/ide/ide-cd.c +48 -73
@@ -511,48 +511,7 @@ end_request:return 1 ; } -/* -* Set up the device registers for transferring a packet command on DEV, -* expecting to later transfer XFERLEN bytes. HANDLER is the routine -* which actually transfers the command to the drive. If this is a -* drq_interrupt device, this routine will arrange for HANDLER to be -* called when the interrupt from the drive arrives. Otherwise, HANDLER -* will be called immediately after the drive is prepared for the transfer. -*/ -static ide_startstop_t cdrom_start_packet_command (ide_drive_t *drive, -ide_handler_t *handler) -{ -ide_hwif_t *hwif = drive->hwif; -struct request *rq = hwif->hwgroup->rq; -int xferlen; - - xferlen =ide_cd_get_xferlen (rq); - -ide_debug_log (IDE_DBG_PC ,"Call %s, xferlen: %d\n" , __func__, xferlen); - -/* FIXME: for Virtual DMA we must check harder */ -if (drive->dma) - drive->dma = !hwif->dma_ops->dma_setup (drive); - -/* set up the controller registers */ -ide_pktcmd_tf_load (drive,IDE_TFLAG_OUT_NSECT |IDE_TFLAG_OUT_LBAL , - xferlen, drive->dma); - -if (drive->atapi_flags &IDE_AFLAG_DRQ_INTERRUPT ) { -/* waiting for CDB interrupt, not DMA yet. */ -if (drive->dma) - drive->waiting_for_dma =0 ; - -/* packet command */ -ide_execute_command (drive,ATA_CMD_PACKET , handler, -ATAPI_WAIT_PC , ide_cd_expiry); -return ide_started; - }else { -ide_execute_pkt_cmd (drive); - -return (*handler) (drive); - } -} +static ide_startstop_t cdrom_newpc_intr (ide_drive_t *);/* * Send a packet command to DRIVE described by CMD_BUF and CMD_LEN. The device
@@ -561,11 +520,10 @@ static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive,* there's data ready. */ #define ATAPI_MIN_CDB_BYTES 12 -static ide_startstop_t cdrom_transfer_packet_command (ide_drive_t *drive, -struct request *rq, -ide_handler_t *handler) +static ide_startstop_t cdrom_transfer_packet_command (ide_drive_t *drive) {ide_hwif_t *hwif = drive->hwif; +struct request *rq = hwif->hwgroup->rq;int cmd_len;ide_startstop_t startstop;
@@ -592,7 +550,7 @@ static ide_startstop_t cdrom_transfer_packet_command(ide_drive_t *drive, }/* arm the interrupt handler */ -ide_set_handler (drive, handler, rq->timeout, ide_cd_expiry); +ide_set_handler (drive, cdrom_newpc_intr, rq->timeout, ide_cd_expiry);/* ATAPI commands get padded out to 12 bytes minimum */ cmd_len =COMMAND_SIZE (rq->cmd[0 ]);
@@ -610,6 +568,49 @@ static ide_startstop_t cdrom_transfer_packet_command(ide_drive_t *drive, }/* +* Set up the device registers for transferring a packet command on DEV, +* expecting to later transfer XFERLEN bytes. HANDLER is the routine +* which actually transfers the command to the drive. If this is a +* drq_interrupt device, this routine will arrange for HANDLER to be +* called when the interrupt from the drive arrives. Otherwise, HANDLER +* will be called immediately after the drive is prepared for the transfer. +*/ +static ide_startstop_t cdrom_start_packet_command (ide_drive_t *drive) +{ +ide_hwif_t *hwif = drive->hwif; +struct request *rq = hwif->hwgroup->rq; +int xferlen; + + xferlen =ide_cd_get_xferlen (rq); + +ide_debug_log (IDE_DBG_PC ,"Call %s, xferlen: %d\n" , __func__, xferlen); + +/* FIXME: for Virtual DMA we must check harder */ +if (drive->dma) + drive->dma = !hwif->dma_ops->dma_setup (drive); + +/* set up the controller registers */ +ide_pktcmd_tf_load (drive,IDE_TFLAG_OUT_NSECT |IDE_TFLAG_OUT_LBAL , + xferlen, drive->dma); + +if (drive->atapi_flags &IDE_AFLAG_DRQ_INTERRUPT ) { +/* waiting for CDB interrupt, not DMA yet. */ +if (drive->dma) + drive->waiting_for_dma =0 ; + +/* packet command */ +ide_execute_command (drive,ATA_CMD_PACKET , + cdrom_transfer_packet_command, +ATAPI_WAIT_PC , ide_cd_expiry); +return ide_started; + }else { +ide_execute_pkt_cmd (drive); + +return cdrom_transfer_packet_command (drive); + } +} + +/* * Check the contents of the interrupt reason register from the cdrom * and attempt to recover if there are problems. Returns 0 if everything's * ok; nonzero if the request has been terminated.
@@ -680,8 +681,6 @@ static int ide_cd_check_transfer_size(ide_drive_t *drive, int len)return 1 ; } -static ide_startstop_t cdrom_newpc_intr (ide_drive_t *); -static ide_startstop_t ide_cd_prepare_rw_request (ide_drive_t *drive,struct request *rq) {
@@ -724,20 +723,6 @@ static ide_startstop_t ide_cd_prepare_rw_request(ide_drive_t *drive, }/* -* Routine to send a read/write packet command to the drive. This is usually -* called directly from cdrom_start_{read,write}(). However, for drq_interrupt -* devices, it is called from an interrupt when the drive is ready to accept -* the command. -*/ -static ide_startstop_t cdrom_start_rw_cont (ide_drive_t *drive) -{ -struct request *rq = drive->hwif->hwgroup->rq; - -/* send the command to the drive and return */ -return cdrom_transfer_packet_command (drive, rq, cdrom_newpc_intr); -} - -/* * Fix up a possibly partially-processed request so that we can start it over * entirely, or even put it back on the request queue. */
@@ -1126,13 +1111,6 @@ static ide_startstop_t cdrom_start_rw(ide_drive_t *drive, struct request *rq)return ide_started; } -static ide_startstop_t cdrom_do_newpc_cont (ide_drive_t *drive) -{ -struct request *rq =HWGROUP (drive)->rq; - -return cdrom_transfer_packet_command (drive, rq, cdrom_newpc_intr); -} -static void cdrom_do_block_pc (ide_drive_t *drive,struct request *rq) {
@@ -1177,7 +1155,6 @@ static void cdrom_do_block_pc(ide_drive_t *drive, struct request *rq)static ide_startstop_t ide_cd_do_request (ide_drive_t *drive,struct request *rq,sector_t block) { -ide_handler_t *fn; ide_debug_log(IDE_DBG_RQ, "Call %s, rq->cmd[0]: 0x%x, " "rq->cmd_type: 0x%x, block: %llu\n",
@@ -1185,7 +1162,6 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq, (unsigned long long)block);if (blk_fs_request (rq)) { - fn = cdrom_start_rw_cont;if (cdrom_start_rw (drive, rq) == ide_stopped)return ide_stopped;
@@ -1194,7 +1170,6 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq,return ide_stopped; }else if (blk_sense_request (rq) ||blk_pc_request (rq) || rq->cmd_type ==REQ_TYPE_ATA_PC ) { - fn = cdrom_do_newpc_cont;if (!rq->timeout) rq->timeout =ATAPI_WAIT_PC ;
@@ -1210,7 +1185,7 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq,return ide_stopped; } -return cdrom_start_packet_command (drive, fn); +return cdrom_start_packet_command (drive); }/*
Signature · 1 line
1.6.0.4
Re: [PATCH 5/8] ide-cd: remove handler wrappers
Quoted 206 lines · Borislav Petkov
Remove
cdrom_do_newpc_contandcdrom_start_rw_contwrappers and passcdrom_transfer_packet_commandtoide_execute_commanddirectly.There should be no functionality change resulting from this patch.
Signed-off-by Borislav Petkov <[email protected]>--- drivers/ide/ide-cd.c | 121 ++++++++++++++++++++------------------------------ 1 files changed, 48 insertions(+), 73 deletions(-)drivers/ide/ide-cd.c +47
-72@@ -511,48 +511,7 @@ end_request:return 1 ; } -/* -* Set up the device registers for transferring a packet command on DEV, -* expecting to later transfer XFERLEN bytes. HANDLER is the routine -* which actually transfers the command to the drive. If this is a -* drq_interrupt device, this routine will arrange for HANDLER to be -* called when the interrupt from the drive arrives. Otherwise, HANDLER -* will be called immediately after the drive is prepared for the transfer. -*/ -static ide_startstop_t cdrom_start_packet_command (ide_drive_t *drive, -ide_handler_t *handler) -{ -ide_hwif_t *hwif = drive->hwif; -struct request *rq = hwif->hwgroup->rq; -int xferlen; - - xferlen =ide_cd_get_xferlen (rq); - -ide_debug_log (IDE_DBG_PC ,"Call %s, xferlen: %d\n" , __func__, xferlen); - -/* FIXME: for Virtual DMA we must check harder */ -if (drive->dma) - drive->dma = !hwif->dma_ops->dma_setup (drive); - -/* set up the controller registers */ -ide_pktcmd_tf_load (drive,IDE_TFLAG_OUT_NSECT |IDE_TFLAG_OUT_LBAL , - xferlen, drive->dma); - -if (drive->atapi_flags &IDE_AFLAG_DRQ_INTERRUPT ) { -/* waiting for CDB interrupt, not DMA yet. */ -if (drive->dma) - drive->waiting_for_dma =0 ; - -/* packet command */ -ide_execute_command (drive,ATA_CMD_PACKET , handler, -ATAPI_WAIT_PC , ide_cd_expiry); -return ide_started; - }else { -ide_execute_pkt_cmd (drive); - -return (*handler) (drive); - } -} +static ide_startstop_t cdrom_newpc_intr (ide_drive_t *);/* * Send a packet command to DRIVE described by CMD_BUF and CMD_LEN. The device @@ -561,11 +520,10 @@ static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive,* there's data ready. */ #define ATAPI_MIN_CDB_BYTES 12 -static ide_startstop_t cdrom_transfer_packet_command (ide_drive_t *drive, -struct request *rq, -ide_handler_t *handler) +static ide_startstop_t cdrom_transfer_packet_command (ide_drive_t *drive) {ide_hwif_t *hwif = drive->hwif; +struct request *rq = hwif->hwgroup->rq;int cmd_len;ide_startstop_t startstop;@@ -592,7 +550,7 @@ static ide_startstop_t cdrom_transfer_packet_command(ide_drive_t *drive, }/* arm the interrupt handler */ -ide_set_handler (drive, handler, rq->timeout, ide_cd_expiry); +ide_set_handler (drive, cdrom_newpc_intr, rq->timeout, ide_cd_expiry);/* ATAPI commands get padded out to 12 bytes minimum */ cmd_len =COMMAND_SIZE (rq->cmd[0 ]);@@ -610,6 +568,49 @@ static ide_startstop_t cdrom_transfer_packet_command(ide_drive_t *drive, }/* +* Set up the device registers for transferring a packet command on DEV, +* expecting to later transfer XFERLEN bytes. HANDLER is the routine +* which actually transfers the command to the drive. If this is a +* drq_interrupt device, this routine will arrange for HANDLER to be +* called when the interrupt from the drive arrives. Otherwise, HANDLER +* will be called immediately after the drive is prepared for the transfer. +*/ +static ide_startstop_t cdrom_start_packet_command (ide_drive_t *drive) +{ +ide_hwif_t *hwif = drive->hwif; +struct request *rq = hwif->hwgroup->rq; +int xferlen; + + xferlen =ide_cd_get_xferlen (rq); + +ide_debug_log (IDE_DBG_PC ,"Call %s, xferlen: %d\n" , __func__, xferlen); + +/* FIXME: for Virtual DMA we must check harder */ +if (drive->dma) + drive->dma = !hwif->dma_ops->dma_setup (drive); + +/* set up the controller registers */ +ide_pktcmd_tf_load (drive,IDE_TFLAG_OUT_NSECT |IDE_TFLAG_OUT_LBAL , + xferlen, drive->dma); + +if (drive->atapi_flags &IDE_AFLAG_DRQ_INTERRUPT ) { +/* waiting for CDB interrupt, not DMA yet. */ +if (drive->dma) + drive->waiting_for_dma =0 ; + +/* packet command */ +ide_execute_command (drive,ATA_CMD_PACKET , + cdrom_transfer_packet_command, +ATAPI_WAIT_PC , ide_cd_expiry); +return ide_started; + }else { +ide_execute_pkt_cmd (drive); + +return cdrom_transfer_packet_command (drive); + } +} + +/* * Check the contents of the interrupt reason register from the cdrom * and attempt to recover if there are problems. Returns 0 if everything's * ok; nonzero if the request has been terminated. @@ -680,8 +681,6 @@ static int ide_cd_check_transfer_size(ide_drive_t *drive, int len)return 1 ; } -static ide_startstop_t cdrom_newpc_intr (ide_drive_t *); -static ide_startstop_t ide_cd_prepare_rw_request (ide_drive_t *drive,struct request *rq) {@@ -724,20 +723,6 @@ static ide_startstop_t ide_cd_prepare_rw_request(ide_drive_t *drive, }/* -* Routine to send a read/write packet command to the drive. This is usually -* called directly from cdrom_start_{read,write}(). However, for drq_interrupt -* devices, it is called from an interrupt when the drive is ready to accept -* the command. -*/ -static ide_startstop_t cdrom_start_rw_cont (ide_drive_t *drive) -{ -struct request *rq = drive->hwif->hwgroup->rq; - -/* send the command to the drive and return */ -return cdrom_transfer_packet_command (drive, rq, cdrom_newpc_intr); -} - -/* * Fix up a possibly partially-processed request so that we can start it over * entirely, or even put it back on the request queue. */ @@ -1126,13 +1111,6 @@ static ide_startstop_t cdrom_start_rw(ide_drive_t *drive, struct request *rq)return ide_started; } -static ide_startstop_t cdrom_do_newpc_cont (ide_drive_t *drive) -{ -struct request *rq =HWGROUP (drive)->rq; - -return cdrom_transfer_packet_command (drive, rq, cdrom_newpc_intr); -} -static void cdrom_do_block_pc (ide_drive_t *drive,struct request *rq) {@@ -1177,7 +1155,6 @@ static void cdrom_do_block_pc(ide_drive_t *drive, struct request *rq)static ide_startstop_t ide_cd_do_request (ide_drive_t *drive,struct request *rq,sector_t block) { -ide_handler_t *fn; ide_debug_log(IDE_DBG_RQ, "Call %s, rq->cmd[0]: 0x%x, " "rq->cmd_type: 0x%x, block: %llu\n",@@ -1185,7 +1162,6 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq, (unsigned long long)block);if (blk_fs_request (rq)) { - fn = cdrom_start_rw_cont;if (cdrom_start_rw (drive, rq) == ide_stopped)return ide_stopped;@@ -1194,7 +1170,6 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq,return ide_stopped; }else if (blk_sense_request (rq) ||blk_pc_request (rq) || rq->cmd_type ==REQ_TYPE_ATA_PC ) { - fn = cdrom_do_newpc_cont;if (!rq->timeout) rq->timeout =ATAPI_WAIT_PC ;
drivers/ide/ide-cd.c static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq, · line 1189
Quoted 6 lines
drivers/ide/ide-cd.c +1
-1@@ -1210,7 +1185,7 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq,return ide_stopped; } -return cdrom_start_packet_command (drive, fn); +return cdrom_start_packet_command (drive); }
There is no need to move cdrom_start_packet_command() around (especially since it goes away in patch #9/8) and not doing so allows to see changes to the function immediately. Fixed in the merged patch version:
From: Borislav Petkov <[email protected]>
Subject: [PATCH 5/8] ide-cd: remove handler wrappers
Remove cdrom_do_newpc_cont and cdrom_start_rw_cont wrappers and pass cdrom_transfer_packet_command to ide_execute_command directly.
There should be no functionality change resulting from this patch.
--- drivers/ide/ide-cd.c | 49 +++++++++++-------------------------------------- 1 file changed, 11 insertions(+), 38 deletions(-)
drivers/ide/ide-cd.c +11 -38
@@ -511,6 +511,9 @@ end_request:return 1 ; } +static ide_startstop_t cdrom_transfer_packet_command (ide_drive_t *); +static ide_startstop_t cdrom_newpc_intr (ide_drive_t *); +/* * Set up the device registers for transferring a packet command on DEV, * expecting to later transfer XFERLEN bytes. HANDLER is the routine
@@ -519,8 +522,7 @@ end_request:* called when the interrupt from the drive arrives. Otherwise, HANDLER * will be called immediately after the drive is prepared for the transfer. */ -static ide_startstop_t cdrom_start_packet_command (ide_drive_t *drive, -ide_handler_t *handler) +static ide_startstop_t cdrom_start_packet_command (ide_drive_t *drive) {ide_hwif_t *hwif = drive->hwif;struct request *rq = hwif->hwgroup->rq;
@@ -544,13 +546,14 @@ static ide_startstop_t cdrom_start_packe drive->waiting_for_dma =0 ;/* packet command */ -ide_execute_command (drive,ATA_CMD_PACKET , handler, +ide_execute_command (drive,ATA_CMD_PACKET , + cdrom_transfer_packet_command,ATAPI_WAIT_PC , ide_cd_expiry);return ide_started; }else {ide_execute_pkt_cmd (drive); -return (*handler) (drive); +return cdrom_transfer_packet_command (drive); } }
@@ -561,11 +564,10 @@ static ide_startstop_t cdrom_start_packe* there's data ready. */ #define ATAPI_MIN_CDB_BYTES 12 -static ide_startstop_t cdrom_transfer_packet_command (ide_drive_t *drive, -struct request *rq, -ide_handler_t *handler) +static ide_startstop_t cdrom_transfer_packet_command (ide_drive_t *drive) {ide_hwif_t *hwif = drive->hwif; +struct request *rq = hwif->hwgroup->rq;int cmd_len;ide_startstop_t startstop;
@@ -592,7 +594,7 @@ static ide_startstop_t cdrom_transfer_pa }/* arm the interrupt handler */ -ide_set_handler (drive, handler, rq->timeout, ide_cd_expiry); +ide_set_handler (drive, cdrom_newpc_intr, rq->timeout, ide_cd_expiry);/* ATAPI commands get padded out to 12 bytes minimum */ cmd_len =COMMAND_SIZE (rq->cmd[0 ]);
@@ -680,8 +682,6 @@ static int ide_cd_check_transfer_size(idreturn 1 ; } -static ide_startstop_t cdrom_newpc_intr (ide_drive_t *); -static ide_startstop_t ide_cd_prepare_rw_request (ide_drive_t *drive,struct request *rq) {
@@ -724,20 +724,6 @@ static ide_startstop_t ide_cd_prepare_rw }/* -* Routine to send a read/write packet command to the drive. This is usually -* called directly from cdrom_start_{read,write}(). However, for drq_interrupt -* devices, it is called from an interrupt when the drive is ready to accept -* the command. -*/ -static ide_startstop_t cdrom_start_rw_cont (ide_drive_t *drive) -{ -struct request *rq = drive->hwif->hwgroup->rq; - -/* send the command to the drive and return */ -return cdrom_transfer_packet_command (drive, rq, cdrom_newpc_intr); -} - -/* * Fix up a possibly partially-processed request so that we can start it over * entirely, or even put it back on the request queue. */
@@ -1126,13 +1112,6 @@ static ide_startstop_t cdrom_start_rw(idreturn ide_started; } -static ide_startstop_t cdrom_do_newpc_cont (ide_drive_t *drive) -{ -struct request *rq =HWGROUP (drive)->rq; - -return cdrom_transfer_packet_command (drive, rq, cdrom_newpc_intr); -} -static void cdrom_do_block_pc (ide_drive_t *drive,struct request *rq) {
@@ -1177,16 +1156,12 @@ static void cdrom_do_block_pc(ide_drive_static ide_startstop_t ide_cd_do_request (ide_drive_t *drive,struct request *rq,sector_t block) { -ide_handler_t *fn; -ide_debug_log (IDE_DBG_RQ ,"Call %s, rq->cmd[0]: 0x%x, " "rq->cmd_type: 0x%x, block: %llu\n" , __func__, rq->cmd[0 ], rq->cmd_type, (unsigned long long )block);if (blk_fs_request (rq)) { - fn = cdrom_start_rw_cont; -if (cdrom_start_rw (drive, rq) == ide_stopped)return ide_stopped;
@@ -1194,8 +1169,6 @@ static ide_startstop_t ide_cd_do_requestreturn ide_stopped; }else if (blk_sense_request (rq) ||blk_pc_request (rq) || rq->cmd_type ==REQ_TYPE_ATA_PC ) { - fn = cdrom_do_newpc_cont; -if (!rq->timeout) rq->timeout =ATAPI_WAIT_PC ;
@@ -1210,7 +1183,7 @@ static ide_startstop_t ide_cd_do_requestreturn ide_stopped; } -return cdrom_start_packet_command (drive, fn); +return cdrom_start_packet_command (drive); }/*