[PATCH] Work around breakage introduced in pata_sil680 by switchingit to MMIO

From: Guennadi Liakhovetski
Date: Tue Mar 25 2008 - 19:31:28 EST


pata_sil680 is broken on Linkstation amd Kurobox HG machines since 2.6.24.
Work around the breakage until a real fix is found.

Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@xxxxxx>

---

On Tue, 26 Feb 2008, Benjamin Herrenschmidt wrote:

> > Yes.
> >
> > Alan loves to complain about lack of MMIO flush, but in practice this is
> > rarely the source of problems such as the one you describe.
> >
> > But if its broken its broken, and we need to revert. Any luck getting
> > benh access to the device?
> >
>
> Especially since reverting it will break a whole bunch of cell blades,
> which wouldn't be nice (those cannot do PIO and have that controller).
>
> In the meantime, we might "workaround" with a hack to only enable MMIO
> on those cell
> blades, something like:
>
> #ifdef CONFIG_PPC64
> if (machine_is(cell))
> mmio = 1;
> #endif
>
> That might get us out of the regression until we find the proper
> solution ?

How about the one below? I'd really like to get it in for 2.6.25 to avoid
a second broken stable kernel on these machines.

Ben, please verify that your cell machines still work.

Thanks
Guennadi

diff --git a/drivers/ata/pata_sil680.c b/drivers/ata/pata_sil680.c
index 503245a..75179ff 100644
--- a/drivers/ata/pata_sil680.c
+++ b/drivers/ata/pata_sil680.c
@@ -335,9 +335,12 @@ static int __devinit sil680_init_one(struct pci_dev *pdev,
};
const struct ata_port_info *ppi[] = { &info, NULL };
static int printed_version;
+#ifdef CONFIG_PPC64
struct ata_host *host;
void __iomem *mmio_base;
- int rc, try_mmio;
+ int rc;
+#endif
+ int try_mmio;

if (!printed_version++)
dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
@@ -350,7 +353,8 @@ static int __devinit sil680_init_one(struct pci_dev *pdev,
return -ENODEV;
}

- if (!try_mmio)
+#ifdef CONFIG_PPC64
+ if (!try_mmio || !machine_is(cell))
goto use_ioports;

/* Try to acquire MMIO resources and fallback to PIO if
@@ -396,6 +400,7 @@ static int __devinit sil680_init_one(struct pci_dev *pdev,
&sil680_sht);

use_ioports:
+#endif
return ata_pci_init_one(pdev, ppi);
}

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/