Date: Sat, 7 Jun 2014 05:12:56 +0000 (UTC) From: Justin Hibbits <jhibbits@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r267208 - projects/pmac_pmu/sys/powerpc/powermac Message-ID: <201406070512.s575CugG094685@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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_ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201406070512.s575CugG094685>