svn commit: r267208 - projects/pmac_pmu/sys/powerpc/powermac
Justin Hibbits
jhibbits at FreeBSD.org
Sat Jun 7 05:12:56 UTC 2014
Author: jhibbits
Date: Sat Jun 7 05:12:55 2014
New Revision: 267208
URL: http://svnweb.freebsd.org/changeset/base/267208
Log:
Add a macio function to reset an ATA channel. This will be used by
ata_macio.c for ATA resets.
Modified:
projects/pmac_pmu/sys/powerpc/powermac/macio.c
projects/pmac_pmu/sys/powerpc/powermac/maciovar.h
Modified: projects/pmac_pmu/sys/powerpc/powermac/macio.c
==============================================================================
--- projects/pmac_pmu/sys/powerpc/powermac/macio.c Sat Jun 7 05:09:41 2014 (r267207)
+++ projects/pmac_pmu/sys/powerpc/powermac/macio.c Sat Jun 7 05:12:55 2014 (r267208)
@@ -403,6 +403,9 @@ macio_attach(device_t dev)
free(dinfo, M_MACIO);
continue;
}
+ if (OF_getprop(child, "AAPL,bus-id",
+ &dinfo->mdi_aapl_busid, sizeof(dinfo->mdi_aapl_busid)) == -1)
+ dinfo->mdi_aapl_busid = -1;
device_set_ivars(cdev, dinfo);
/* Set FCRs to enable some devices */
@@ -714,6 +717,50 @@ macio_enable_wireless(device_t dev, bool
return (0);
}
+int macio_reset_ata(device_t atadev)
+{
+ device_t dev;
+ struct macio_softc *sc;
+ struct macio_devinfo *dinfo;
+ uint32_t resetm,enablem,temp;
+
+ dev = device_get_parent(atadev);
+ sc = device_get_softc(dev);
+
+ dinfo = device_get_ivars(atadev);
+
+ KASSERT(dinfo->mdi_aapl_busid != -1,
+ ("macio_reset_ata called on non-mac-io ATA device"));
+
+ switch (dinfo->mdi_aapl_busid) {
+ case 0:
+ resetm = FCR1_EIDE0_RESET;
+ enablem = FCR1_EIDE0_ENABLE;
+ break;
+ case 1:
+ resetm = FCR1_EIDE1_RESET;
+ enablem = FCR1_EIDE1_ENABLE;
+ break;
+ case 2:
+ resetm = FCR1_UIDE_RESET;
+ enablem = FCR1_UIDE_ENABLE;
+ break;
+ default:
+ return (1);
+ }
+ temp = bus_read_4(sc->sc_memr, KEYLARGO_FCR1);
+ bus_write_4(sc->sc_memr, KEYLARGO_FCR1,
+ temp & ~resetm);
+ temp = bus_read_4(sc->sc_memr, KEYLARGO_FCR1);
+ bus_write_4(sc->sc_memr, KEYLARGO_FCR1,
+ temp | enablem);
+ temp = bus_read_4(sc->sc_memr, KEYLARGO_FCR1);
+ bus_write_4(sc->sc_memr, KEYLARGO_FCR1,
+ temp | resetm);
+
+ return (0);
+}
+
static int macio_suspend(device_t dev)
{
struct macio_softc *sc = device_get_softc(dev);
Modified: projects/pmac_pmu/sys/powerpc/powermac/maciovar.h
==============================================================================
--- projects/pmac_pmu/sys/powerpc/powermac/maciovar.h Sat Jun 7 05:09:41 2014 (r267207)
+++ projects/pmac_pmu/sys/powerpc/powermac/maciovar.h Sat Jun 7 05:12:55 2014 (r267208)
@@ -381,10 +381,12 @@ struct macio_devinfo {
int mdi_interrupts[6];
int mdi_ninterrupts;
int mdi_base;
+ int mdi_aapl_busid;
struct ofw_bus_devinfo mdi_obdinfo;
struct resource_list mdi_resources;
};
extern int macio_enable_wireless(device_t dev, bool enable);
+extern int macio_reset_ata(device_t atadev);
#endif /* _MACIO_MACIOVAR_H_ */
More information about the svn-src-projects
mailing list