ide: add ->exec_command method

Add ->exec_command method for writing ATA Command register
and use it instead of ->OUTBSYNC.

There should be no functional changes caused by this patch.
Signed-off-by: NBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
上级 ebb00fb5
...@@ -437,8 +437,7 @@ static ide_startstop_t ide_atapi_error(ide_drive_t *drive, struct request *rq, u ...@@ -437,8 +437,7 @@ static ide_startstop_t ide_atapi_error(ide_drive_t *drive, struct request *rq, u
if (ide_read_status(drive) & (BUSY_STAT | DRQ_STAT)) if (ide_read_status(drive) & (BUSY_STAT | DRQ_STAT))
/* force an abort */ /* force an abort */
hwif->OUTBSYNC(hwif, WIN_IDLEIMMEDIATE, hwif->exec_command(hwif, WIN_IDLEIMMEDIATE);
hwif->io_ports.command_addr);
if (rq->errors >= ERROR_MAX) { if (rq->errors >= ERROR_MAX) {
ide_kill_rq(drive, rq); ide_kill_rq(drive, rq);
......
...@@ -103,6 +103,14 @@ void SELECT_MASK(ide_drive_t *drive, int mask) ...@@ -103,6 +103,14 @@ void SELECT_MASK(ide_drive_t *drive, int mask)
port_ops->maskproc(drive, mask); port_ops->maskproc(drive, mask);
} }
static void ide_exec_command(ide_hwif_t *hwif, u8 cmd)
{
if (hwif->host_flags & IDE_HFLAG_MMIO)
writeb(cmd, (void __iomem *)hwif->io_ports.command_addr);
else
outb(cmd, hwif->io_ports.command_addr);
}
static u8 ide_read_sff_dma_status(ide_hwif_t *hwif) static u8 ide_read_sff_dma_status(ide_hwif_t *hwif)
{ {
if (hwif->host_flags & IDE_HFLAG_MMIO) if (hwif->host_flags & IDE_HFLAG_MMIO)
...@@ -331,6 +339,7 @@ static void ata_output_data(ide_drive_t *drive, struct request *rq, ...@@ -331,6 +339,7 @@ static void ata_output_data(ide_drive_t *drive, struct request *rq,
void default_hwif_transport(ide_hwif_t *hwif) void default_hwif_transport(ide_hwif_t *hwif)
{ {
hwif->exec_command = ide_exec_command;
hwif->read_sff_dma_status = ide_read_sff_dma_status; hwif->read_sff_dma_status = ide_read_sff_dma_status;
hwif->tf_load = ide_tf_load; hwif->tf_load = ide_tf_load;
...@@ -696,7 +705,7 @@ int ide_driveid_update(ide_drive_t *drive) ...@@ -696,7 +705,7 @@ int ide_driveid_update(ide_drive_t *drive)
SELECT_MASK(drive, 1); SELECT_MASK(drive, 1);
ide_set_irq(drive, 0); ide_set_irq(drive, 0);
msleep(50); msleep(50);
hwif->OUTBSYNC(hwif, WIN_IDENTIFY, hwif->io_ports.command_addr); hwif->exec_command(hwif, WIN_IDENTIFY);
timeout = jiffies + WAIT_WORSTCASE; timeout = jiffies + WAIT_WORSTCASE;
do { do {
if (time_after(jiffies, timeout)) { if (time_after(jiffies, timeout)) {
...@@ -783,7 +792,7 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed) ...@@ -783,7 +792,7 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed)
ide_set_irq(drive, 0); ide_set_irq(drive, 0);
hwif->OUTB(speed, io_ports->nsect_addr); hwif->OUTB(speed, io_ports->nsect_addr);
hwif->OUTB(SETFEATURES_XFER, io_ports->feature_addr); hwif->OUTB(SETFEATURES_XFER, io_ports->feature_addr);
hwif->OUTBSYNC(hwif, WIN_SETFEATURES, io_ports->command_addr); hwif->exec_command(hwif, WIN_SETFEATURES);
if (drive->quirk_list == 2) if (drive->quirk_list == 2)
ide_set_irq(drive, 1); ide_set_irq(drive, 1);
...@@ -891,7 +900,7 @@ void ide_execute_command(ide_drive_t *drive, u8 cmd, ide_handler_t *handler, ...@@ -891,7 +900,7 @@ void ide_execute_command(ide_drive_t *drive, u8 cmd, ide_handler_t *handler,
spin_lock_irqsave(&ide_lock, flags); spin_lock_irqsave(&ide_lock, flags);
__ide_set_handler(drive, handler, timeout, expiry); __ide_set_handler(drive, handler, timeout, expiry);
hwif->OUTBSYNC(hwif, cmd, hwif->io_ports.command_addr); hwif->exec_command(hwif, cmd);
/* /*
* Drive takes 400nS to respond, we must avoid the IRQ being * Drive takes 400nS to respond, we must avoid the IRQ being
* serviced before that. * serviced before that.
...@@ -909,7 +918,7 @@ void ide_execute_pkt_cmd(ide_drive_t *drive) ...@@ -909,7 +918,7 @@ void ide_execute_pkt_cmd(ide_drive_t *drive)
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&ide_lock, flags); spin_lock_irqsave(&ide_lock, flags);
hwif->OUTBSYNC(hwif, WIN_PACKETCMD, hwif->io_ports.command_addr); hwif->exec_command(hwif, WIN_PACKETCMD);
ndelay(400); ndelay(400);
spin_unlock_irqrestore(&ide_lock, flags); spin_unlock_irqrestore(&ide_lock, flags);
} }
...@@ -1116,7 +1125,7 @@ static ide_startstop_t do_reset1 (ide_drive_t *drive, int do_not_try_atapi) ...@@ -1116,7 +1125,7 @@ static ide_startstop_t do_reset1 (ide_drive_t *drive, int do_not_try_atapi)
pre_reset(drive); pre_reset(drive);
SELECT_DRIVE(drive); SELECT_DRIVE(drive);
udelay (20); udelay (20);
hwif->OUTBSYNC(hwif, WIN_SRST, io_ports->command_addr); hwif->exec_command(hwif, WIN_SRST);
ndelay(400); ndelay(400);
hwgroup->poll_timeout = jiffies + WAIT_WORSTCASE; hwgroup->poll_timeout = jiffies + WAIT_WORSTCASE;
hwgroup->polling = 1; hwgroup->polling = 1;
......
...@@ -295,7 +295,7 @@ static int actual_try_to_identify (ide_drive_t *drive, u8 cmd) ...@@ -295,7 +295,7 @@ static int actual_try_to_identify (ide_drive_t *drive, u8 cmd)
hwif->OUTB(0, io_ports->feature_addr); hwif->OUTB(0, io_ports->feature_addr);
/* ask drive for ID */ /* ask drive for ID */
hwif->OUTBSYNC(hwif, cmd, hwif->io_ports.command_addr); hwif->exec_command(hwif, cmd);
timeout = ((cmd == WIN_IDENTIFY) ? WAIT_WORSTCASE : WAIT_PIDENTIFY) / 2; timeout = ((cmd == WIN_IDENTIFY) ? WAIT_WORSTCASE : WAIT_PIDENTIFY) / 2;
timeout += jiffies; timeout += jiffies;
...@@ -482,7 +482,7 @@ static int do_probe (ide_drive_t *drive, u8 cmd) ...@@ -482,7 +482,7 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
msleep(50); msleep(50);
SELECT_DRIVE(drive); SELECT_DRIVE(drive);
msleep(50); msleep(50);
hwif->OUTBSYNC(hwif, WIN_SRST, io_ports->command_addr); hwif->exec_command(hwif, WIN_SRST);
(void)ide_busy_sleep(hwif); (void)ide_busy_sleep(hwif);
rc = try_to_identify(drive, cmd); rc = try_to_identify(drive, cmd);
} }
...@@ -518,7 +518,7 @@ static void enable_nest (ide_drive_t *drive) ...@@ -518,7 +518,7 @@ static void enable_nest (ide_drive_t *drive)
printk("%s: enabling %s -- ", hwif->name, drive->id->model); printk("%s: enabling %s -- ", hwif->name, drive->id->model);
SELECT_DRIVE(drive); SELECT_DRIVE(drive);
msleep(50); msleep(50);
hwif->OUTBSYNC(hwif, EXABYTE_ENABLE_NEST, hwif->io_ports.command_addr); hwif->exec_command(hwif, EXABYTE_ENABLE_NEST);
if (ide_busy_sleep(hwif)) { if (ide_busy_sleep(hwif)) {
printk(KERN_CONT "failed (timeout)\n"); printk(KERN_CONT "failed (timeout)\n");
......
...@@ -88,7 +88,7 @@ ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task) ...@@ -88,7 +88,7 @@ ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task)
switch (task->data_phase) { switch (task->data_phase) {
case TASKFILE_MULTI_OUT: case TASKFILE_MULTI_OUT:
case TASKFILE_OUT: case TASKFILE_OUT:
hwif->OUTBSYNC(hwif, tf->command, hwif->io_ports.command_addr); hwif->exec_command(hwif, tf->command);
ndelay(400); /* FIXME */ ndelay(400); /* FIXME */
return pre_task_out_intr(drive, task->rq); return pre_task_out_intr(drive, task->rq);
case TASKFILE_MULTI_IN: case TASKFILE_MULTI_IN:
......
...@@ -126,6 +126,14 @@ static u8 scc_ide_inb(unsigned long port) ...@@ -126,6 +126,14 @@ static u8 scc_ide_inb(unsigned long port)
return (u8)data; return (u8)data;
} }
static void scc_exec_command(ide_hwif_t *hwif, u8 cmd)
{
out_be32((void *)hwif->io_ports.command_addr, cmd);
eieio();
in_be32((void *)(hwif->dma_base + 0x01c));
eieio();
}
static u8 scc_read_sff_dma_status(ide_hwif_t *hwif) static u8 scc_read_sff_dma_status(ide_hwif_t *hwif)
{ {
return (u8)in_be32((void *)(hwif->dma_base + 4)); return (u8)in_be32((void *)(hwif->dma_base + 4));
...@@ -779,6 +787,7 @@ static void __devinit init_mmio_iops_scc(ide_hwif_t *hwif) ...@@ -779,6 +787,7 @@ static void __devinit init_mmio_iops_scc(ide_hwif_t *hwif)
ide_set_hwifdata(hwif, ports); ide_set_hwifdata(hwif, ports);
hwif->exec_command = scc_exec_command;
hwif->read_sff_dma_status = scc_read_sff_dma_status; hwif->read_sff_dma_status = scc_read_sff_dma_status;
hwif->tf_load = scc_tf_load; hwif->tf_load = scc_tf_load;
......
...@@ -495,6 +495,13 @@ static void pmac_outbsync(ide_hwif_t *hwif, u8 value, unsigned long port) ...@@ -495,6 +495,13 @@ static void pmac_outbsync(ide_hwif_t *hwif, u8 value, unsigned long port)
+ IDE_TIMING_CONFIG)); + IDE_TIMING_CONFIG));
} }
static void pmac_exec_command(ide_hwif_t *hwif, u8 cmd)
{
writeb(cmd, (void __iomem *)hwif->io_ports.command_addr);
(void)readl((void __iomem *)(hwif->io_ports.data_addr
+ IDE_TIMING_CONFIG));
}
/* /*
* Old tuning functions (called on hdparm -p), sets up drive PIO timings * Old tuning functions (called on hdparm -p), sets up drive PIO timings
*/ */
...@@ -1092,6 +1099,8 @@ static int __devinit pmac_ide_setup_device(pmac_ide_hwif_t *pmif, hw_regs_t *hw) ...@@ -1092,6 +1099,8 @@ static int __devinit pmac_ide_setup_device(pmac_ide_hwif_t *pmif, hw_regs_t *hw)
if (hwif == NULL) if (hwif == NULL)
return -ENOENT; return -ENOENT;
hwif->exec_command = pmac_exec_command;
/* Setup MMIO ops */ /* Setup MMIO ops */
default_hwif_mmiops(hwif); default_hwif_mmiops(hwif);
hwif->OUTBSYNC = pmac_outbsync; hwif->OUTBSYNC = pmac_outbsync;
......
...@@ -248,8 +248,7 @@ idescsi_atapi_error(ide_drive_t *drive, struct request *rq, u8 stat, u8 err) ...@@ -248,8 +248,7 @@ idescsi_atapi_error(ide_drive_t *drive, struct request *rq, u8 stat, u8 err)
if (ide_read_status(drive) & (BUSY_STAT | DRQ_STAT)) if (ide_read_status(drive) & (BUSY_STAT | DRQ_STAT))
/* force an abort */ /* force an abort */
hwif->OUTBSYNC(hwif, WIN_IDLEIMMEDIATE, hwif->exec_command(hwif, WIN_IDLEIMMEDIATE);
hwif->io_ports.command_addr);
rq->errors++; rq->errors++;
......
...@@ -489,6 +489,7 @@ typedef struct hwif_s { ...@@ -489,6 +489,7 @@ typedef struct hwif_s {
const struct ide_port_ops *port_ops; const struct ide_port_ops *port_ops;
const struct ide_dma_ops *dma_ops; const struct ide_dma_ops *dma_ops;
void (*exec_command)(struct hwif_s *, u8);
u8 (*read_sff_dma_status)(struct hwif_s *); u8 (*read_sff_dma_status)(struct hwif_s *);
void (*tf_load)(ide_drive_t *, struct ide_task_s *); void (*tf_load)(ide_drive_t *, struct ide_task_s *);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册