ide: remove ide_execute_pkt_cmd() (v2)
PATCH 1/1 ide: remove ide_execute_pkt_cmd() (v2)
From: Bartlomiej Zolnierkiewicz <[email protected]>
Subject: [PATCH] ide: remove ide_execute_pkt_cmd() (v2)
* Pass command structure to ide_execute_command() and skip __ide_set_handler() for ATAPI protocols on non-DRQ devices.
* Convert ide_issue_pc() to always use ide_execute_command() and remove no longer needed ide_execute_pkt_cmd().
v2:
* Fix for non-DRQ devices (based on report from Borislav).
There should be no functional changes caused by this patch.
Acked-by Borislav Petkov <[email protected]>
Signed-off-by Bartlomiej Zolnierkiewicz <[email protected]>
---
replacement patch for the one in pata-2.6 tree
drivers/ide/ide-atapi.c | 15 +++++++-------- drivers/ide/ide-iops.c | 25 ++++++++----------------- drivers/ide/ide-taskfile.c | 6 ++---- include/linux/ide.h | 5 ++--- 4 files changed, 19 insertions(+), 32 deletions(-)
drivers/ide/ide-atapi.c +7 -8
@@ -481,6 +481,7 @@ static void ide_init_packet_cmd(struct i cmd->protocol = dma ?ATAPI_PROT_DMA :ATAPI_PROT_PIO ; cmd->tf_flags |=IDE_TFLAG_OUT_LBAH |IDE_TFLAG_OUT_LBAM |IDE_TFLAG_OUT_FEATURE | tf_flags; + cmd->tf.command =ATA_CMD_PACKET ; cmd->tf.feature = dma;/* Use PIO/DMA */ cmd->tf.lbam = bcount &0xff ; cmd->tf.lbah = (bcount >>8 ) &0xff ;
@@ -626,6 +627,7 @@ ide_startstop_t ide_issue_pc(ide_drive_tunsigned int timeout;u32 tf_flags;u16 bcount; +u8 drq_int = !!(drive->atapi_flags &IDE_AFLAG_DRQ_INTERRUPT );if (dev_is_idecd (drive)) { tf_flags =IDE_TFLAG_OUT_NSECT |IDE_TFLAG_OUT_LBAL ;
@@ -675,17 +677,14 @@ ide_startstop_t ide_issue_pc(ide_drive_t (void )do_rw_taskfile (drive, cmd); -/* Issue the packet command */ -if (drive->atapi_flags &IDE_AFLAG_DRQ_INTERRUPT ) { +if (drq_int) {if (drive->dma) drive->waiting_for_dma =0 ; hwif->expiry = expiry; -ide_execute_command (drive,ATA_CMD_PACKET , ide_transfer_pc, - timeout); -return ide_started; - }else { -ide_execute_pkt_cmd (drive); -return ide_transfer_pc (drive); } + +ide_execute_command (drive, cmd, ide_transfer_pc, timeout); + +return drq_int ? ide_started :ide_transfer_pc (drive); }EXPORT_SYMBOL_GPL (ide_issue_pc);
drivers/ide/ide-iops.c +8 -17
@@ -451,7 +451,7 @@ EXPORT_SYMBOL(ide_set_handler);/** * ide_execute_command - execute an IDE command * @drive: IDE drive to issue the command against -* @command: command byte to write +* @cmd: command * @handler: handler for next phase * @timeout: timeout for command *
@@ -461,15 +461,18 @@ EXPORT_SYMBOL(ide_set_handler);* should go via this function or do equivalent locking. */ -void ide_execute_command (ide_drive_t *drive,u8 cmd,ide_handler_t *handler, -unsigned timeout) +void ide_execute_command (ide_drive_t *drive,struct ide_cmd *cmd, +ide_handler_t *handler,unsigned timeout) {ide_hwif_t *hwif = drive->hwif;unsigned long flags;spin_lock_irqsave (&hwif->lock, flags); -__ide_set_handler (drive, handler, timeout); - hwif->tp_ops->exec_command (hwif, cmd); +if ((cmd->protocol !=ATAPI_PROT_DMA && + cmd->protocol !=ATAPI_PROT_PIO ) || + (drive->atapi_flags &IDE_AFLAG_DRQ_INTERRUPT )) +__ide_set_handler (drive, handler, timeout); + hwif->tp_ops->exec_command (hwif, cmd->tf.command);/* * Drive takes 400nS to respond, we must avoid the IRQ being * serviced before that.
@@ -480,18 +483,6 @@ void ide_execute_command(ide_drive_t *drspin_unlock_irqrestore (&hwif->lock, flags); } -void ide_execute_pkt_cmd (ide_drive_t *drive) -{ -ide_hwif_t *hwif = drive->hwif; -unsigned long flags; - -spin_lock_irqsave (&hwif->lock, flags); - hwif->tp_ops->exec_command (hwif,ATA_CMD_PACKET ); -ndelay (400 ); -spin_unlock_irqrestore (&hwif->lock, flags); -} -EXPORT_SYMBOL_GPL (ide_execute_pkt_cmd); -/* * ide_wait_not_busy() waits for the currently selected device on the hwif * to report a non-busy status, see comments in ide_probe_port().
drivers/ide/ide-taskfile.c +2 -4
@@ -97,8 +97,7 @@ ide_startstop_t do_rw_taskfile(ide_drivecase ATA_PROT_NODATA :if (handler ==NULL ) handler = task_no_data_intr; -ide_execute_command (drive, tf->command, handler, -WAIT_WORSTCASE ); +ide_execute_command (drive, cmd, handler,WAIT_WORSTCASE );return ide_started;case ATA_PROT_DMA : if ((drive->dev_flags & IDE_DFLAG_USING_DMA) == 0 ||
@@ -106,8 +105,7 @@ ide_startstop_t do_rw_taskfile(ide_drive dma_ops->dma_setup(drive, cmd))return ide_stopped; hwif->expiry = dma_ops->dma_timer_expiry; -ide_execute_command (drive, tf->command, ide_dma_intr, -2 *WAIT_CMD ); +ide_execute_command (drive, cmd, ide_dma_intr,2 *WAIT_CMD ); dma_ops->dma_start (drive);default :return ide_started;
include/linux/ide.h +2 -3
@@ -1135,9 +1135,8 @@ void ide_kill_rq(ide_drive_t *, struct rvoid __ide_set_handler (ide_drive_t *,ide_handler_t *,unsigned int );void ide_set_handler (ide_drive_t *,ide_handler_t *,unsigned int ); -void ide_execute_command (ide_drive_t *,u8 ,ide_handler_t *,unsigned int ); - -void ide_execute_pkt_cmd (ide_drive_t *); +void ide_execute_command (ide_drive_t *,struct ide_cmd *,ide_handler_t *, +unsigned int );void ide_pad_transfer (ide_drive_t *,int ,int );