diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/ide/pci/siimage.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/drivers/ide/pci/siimage.c b/drivers/ide/pci/siimage.c index 5c1bd7928c27..ef5b39fa042b 100644 --- a/drivers/ide/pci/siimage.c +++ b/drivers/ide/pci/siimage.c @@ -331,15 +331,18 @@ static int siimage_mmio_ide_dma_test_irq (ide_drive_t *drive) { ide_hwif_t *hwif = HWIF(drive); unsigned long addr = siimage_selreg(hwif, 0x1); + void __iomem *sata_error_addr + = (void __iomem *)hwif->sata_scr[SATA_ERROR_OFFSET]; - if (SATA_ERROR_REG) { + if (sata_error_addr) { unsigned long base = (unsigned long)hwif->hwif_data; - u32 ext_stat = readl((void __iomem *)(base + 0x10)); u8 watchdog = 0; + if (ext_stat & ((hwif->channel) ? 0x40 : 0x10)) { - u32 sata_error = readl((void __iomem *)SATA_ERROR_REG); - writel(sata_error, (void __iomem *)SATA_ERROR_REG); + u32 sata_error = readl(sata_error_addr); + + writel(sata_error, sata_error_addr); watchdog = (sata_error & 0x00680000) ? 1 : 0; printk(KERN_WARNING "%s: sata_error = 0x%08x, " "watchdog = %d, %s\n", @@ -418,13 +421,17 @@ static int sil_sata_busproc(ide_drive_t * drive, int state) static int sil_sata_reset_poll(ide_drive_t *drive) { - if (SATA_STATUS_REG) { - ide_hwif_t *hwif = HWIF(drive); + ide_hwif_t *hwif = drive->hwif; + void __iomem *sata_status_addr + = (void __iomem *)hwif->sata_scr[SATA_STATUS_OFFSET]; + + if (sata_status_addr) { + /* SATA Status is available only when in MMIO mode */ + u32 sata_stat = readl(sata_status_addr); - /* SATA_STATUS_REG is valid only when in MMIO mode */ - if ((readl((void __iomem *)SATA_STATUS_REG) & 0x03) != 0x03) { + if ((sata_stat & 0x03) != 0x03) { printk(KERN_WARNING "%s: reset phy dead, status=0x%08x\n", - hwif->name, readl((void __iomem *)SATA_STATUS_REG)); + hwif->name, sata_stat); HWGROUP(drive)->polling = 0; return ide_started; } |