ide: add ->read_altstatus method

* Remove ide_read_altstatus() inline helper.

* Add ->read_altstatus method for reading ATA Alternate Status
  register and use it instead of ->INB.

There should be no functional changes caused by this patch.

Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
This commit is contained in:
Bartlomiej Zolnierkiewicz 2008-07-23 19:55:52 +02:00
parent b73c7ee25d
commit 1f6d8a0fd8
4 changed files with 20 additions and 11 deletions

View file

@ -119,6 +119,14 @@ static u8 ide_read_status(ide_hwif_t *hwif)
return inb(hwif->io_ports.status_addr); return inb(hwif->io_ports.status_addr);
} }
static u8 ide_read_altstatus(ide_hwif_t *hwif)
{
if (hwif->host_flags & IDE_HFLAG_MMIO)
return readb((void __iomem *)hwif->io_ports.ctl_addr);
else
return inb(hwif->io_ports.ctl_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)
@ -349,6 +357,7 @@ void default_hwif_transport(ide_hwif_t *hwif)
{ {
hwif->exec_command = ide_exec_command; hwif->exec_command = ide_exec_command;
hwif->read_status = ide_read_status; hwif->read_status = ide_read_status;
hwif->read_altstatus = ide_read_altstatus;
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;
@ -511,7 +520,7 @@ int drive_is_ready (ide_drive_t *drive)
* about possible isa-pnp and pci-pnp issues yet. * about possible isa-pnp and pci-pnp issues yet.
*/ */
if (hwif->io_ports.ctl_addr) if (hwif->io_ports.ctl_addr)
stat = ide_read_altstatus(drive); stat = hwif->read_altstatus(hwif);
else else
/* Note: this may clear a pending IRQ!! */ /* Note: this may clear a pending IRQ!! */
stat = hwif->read_status(hwif); stat = hwif->read_status(hwif);
@ -724,7 +733,7 @@ int ide_driveid_update(ide_drive_t *drive)
} }
msleep(50); /* give drive a breather */ msleep(50); /* give drive a breather */
stat = ide_read_altstatus(drive); stat = hwif->read_altstatus(hwif);
} while (stat & BUSY_STAT); } while (stat & BUSY_STAT);
msleep(50); /* wait for IRQ and DRQ_STAT */ msleep(50); /* wait for IRQ and DRQ_STAT */

View file

@ -275,7 +275,7 @@ static int actual_try_to_identify (ide_drive_t *drive, u8 cmd)
msleep(50); msleep(50);
if (io_ports->ctl_addr) { if (io_ports->ctl_addr) {
a = ide_read_altstatus(drive); a = hwif->read_altstatus(hwif);
s = hwif->read_status(hwif); s = hwif->read_status(hwif);
if ((a ^ s) & ~INDEX_STAT) if ((a ^ s) & ~INDEX_STAT)
/* ancient Seagate drives, broken interfaces */ /* ancient Seagate drives, broken interfaces */
@ -306,7 +306,7 @@ static int actual_try_to_identify (ide_drive_t *drive, u8 cmd)
} }
/* give drive a breather */ /* give drive a breather */
msleep(50); msleep(50);
s = use_altstatus ? ide_read_altstatus(drive) s = use_altstatus ? hwif->read_altstatus(hwif)
: hwif->read_status(hwif); : hwif->read_status(hwif);
} while (s & BUSY_STAT); } while (s & BUSY_STAT);

View file

@ -139,6 +139,11 @@ static u8 scc_read_status(ide_hwif_t *hwif)
return (u8)in_be32((void *)hwif->io_ports.status_addr); return (u8)in_be32((void *)hwif->io_ports.status_addr);
} }
static u8 scc_read_altstatus(ide_hwif_t *hwif)
{
return (u8)in_be32((void *)hwif->io_ports.ctl_addr);
}
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));
@ -794,6 +799,7 @@ static void __devinit init_mmio_iops_scc(ide_hwif_t *hwif)
hwif->exec_command = scc_exec_command; hwif->exec_command = scc_exec_command;
hwif->read_status = scc_read_status; hwif->read_status = scc_read_status;
hwif->read_altstatus = scc_read_altstatus;
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;

View file

@ -491,6 +491,7 @@ typedef struct hwif_s {
void (*exec_command)(struct hwif_s *, u8); void (*exec_command)(struct hwif_s *, u8);
u8 (*read_status)(struct hwif_s *); u8 (*read_status)(struct hwif_s *);
u8 (*read_altstatus)(struct hwif_s *);
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 *);
@ -1363,13 +1364,6 @@ static inline void ide_set_irq(ide_drive_t *drive, int on)
hwif->io_ports.ctl_addr); hwif->io_ports.ctl_addr);
} }
static inline u8 ide_read_altstatus(ide_drive_t *drive)
{
ide_hwif_t *hwif = drive->hwif;
return hwif->INB(hwif->io_ports.ctl_addr);
}
static inline u8 ide_read_error(ide_drive_t *drive) static inline u8 ide_read_error(ide_drive_t *drive)
{ {
ide_hwif_t *hwif = drive->hwif; ide_hwif_t *hwif = drive->hwif;