Skip site navigation (1)Skip section navigation (2)
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>