|
@@ -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;
|
|
|
}
|