svn commit: r256857 - stable/10/sys/powerpc/powermac

Andreas Tobler andreast at FreeBSD.org
Mon Oct 21 19:11:16 UTC 2013


Author: andreast
Date: Mon Oct 21 19:11:15 2013
New Revision: 256857
URL: http://svnweb.freebsd.org/changeset/base/256857

Log:
  MFC: 256555
  
  Move the resource allocation from the ata_*_probe section to the ata_*_attach
  section. This prevents a boot crash on nearly all iMacs and PowerMacs/Books.
  
  The allocation in the probe section was working before because ata_probe was
  returning 0 which did not invoke a second DEVICE_PROBE. Now it returns
  a BUS_PROBE_DEFAULT which can invoke a second DEVICE_PROBE which results in
  a "failed to reserve resource" exit.
  
  PR:	powerpc/182978
  Approved by:	re(gjb)

Modified:
  stable/10/sys/powerpc/powermac/ata_kauai.c
  stable/10/sys/powerpc/powermac/ata_macio.c
Directory Properties:
  stable/10/sys/   (props changed)

Modified: stable/10/sys/powerpc/powermac/ata_kauai.c
==============================================================================
--- stable/10/sys/powerpc/powermac/ata_kauai.c	Mon Oct 21 18:47:29 2013	(r256856)
+++ stable/10/sys/powerpc/powermac/ata_kauai.c	Mon Oct 21 19:11:15 2013	(r256857)
@@ -194,12 +194,11 @@ static const u_int udma_timing_shasta[] 
 static int
 ata_kauai_probe(device_t dev)
 {
-	struct ata_channel *ch;
 	struct ata_kauai_softc *sc;
 	u_int32_t devid;
 	phandle_t node;
 	const char *compatstring = NULL;
-	int i, found, rid;
+	int i, found;
 
 	found = 0;
 	devid = pci_get_devid(dev);
@@ -216,7 +215,6 @@ ata_kauai_probe(device_t dev)
 	node = ofw_bus_get_node(dev);
 	sc = device_get_softc(dev);
 	bzero(sc, sizeof(struct ata_kauai_softc));
-	ch = &sc->sc_ch.sc_ch;
 
 	compatstring = ofw_bus_get_compat(dev);
 	if (compatstring != NULL && strcmp(compatstring,"shasta-ata") == 0)
@@ -227,32 +225,6 @@ ata_kauai_probe(device_t dev)
 	    (compatstring == NULL || strcmp(compatstring, "K2-UATA") != 0))
 		bus_set_resource(dev, SYS_RES_IRQ, 0, 39, 1);
 
-        rid = PCIR_BARS;
-	sc->sc_memr = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, 
-	    RF_ACTIVE);
-        if (sc->sc_memr == NULL) {
-                device_printf(dev, "could not allocate memory\n");
-                return (ENXIO);
-        }
-
-	/*
-	 * Set up the resource vectors
-	 */
-        for (i = ATA_DATA; i <= ATA_COMMAND; i++) {
-                ch->r_io[i].res = sc->sc_memr;
-                ch->r_io[i].offset = i*ATA_KAUAI_REGGAP + ATA_KAUAI_REGOFFSET;
-        }
-        ch->r_io[ATA_CONTROL].res = sc->sc_memr;
-        ch->r_io[ATA_CONTROL].offset = ATA_KAUAI_ALTOFFSET;
-	ata_default_registers(dev);
-
-	ch->unit = 0;
-	ch->flags |= ATA_USE_16BIT;
-	
-	/* XXX: ATAPI DMA is unreliable. We should find out why. */
-	ch->flags |= ATA_NO_ATAPI_DMA;
-	ata_generic_hw(dev);
-
         return (ata_probe(dev));
 }
 
@@ -272,12 +244,42 @@ static int
 ata_kauai_attach(device_t dev)
 {
 	struct ata_kauai_softc *sc = device_get_softc(dev);
+	struct ata_channel *ch;
+	int i, rid;
 #if USE_DBDMA_IRQ
 	int dbdma_irq_rid = 1;
 	struct resource *dbdma_irq;
 	void *cookie;
 #endif
 
+	ch = &sc->sc_ch.sc_ch;
+
+        rid = PCIR_BARS;
+	sc->sc_memr = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, 
+	    RF_ACTIVE);
+        if (sc->sc_memr == NULL) {
+                device_printf(dev, "could not allocate memory\n");
+                return (ENXIO);
+        }
+
+	/*
+	 * Set up the resource vectors
+	 */
+        for (i = ATA_DATA; i <= ATA_COMMAND; i++) {
+                ch->r_io[i].res = sc->sc_memr;
+                ch->r_io[i].offset = i*ATA_KAUAI_REGGAP + ATA_KAUAI_REGOFFSET;
+        }
+        ch->r_io[ATA_CONTROL].res = sc->sc_memr;
+        ch->r_io[ATA_CONTROL].offset = ATA_KAUAI_ALTOFFSET;
+	ata_default_registers(dev);
+
+	ch->unit = 0;
+	ch->flags |= ATA_USE_16BIT;
+
+	/* XXX: ATAPI DMA is unreliable. We should find out why. */
+	ch->flags |= ATA_NO_ATAPI_DMA;
+	ata_generic_hw(dev);
+
 	pci_enable_busmaster(dev);
 
 	/* Init DMA engine */

Modified: stable/10/sys/powerpc/powermac/ata_macio.c
==============================================================================
--- stable/10/sys/powerpc/powermac/ata_macio.c	Mon Oct 21 18:47:29 2013	(r256856)
+++ stable/10/sys/powerpc/powermac/ata_macio.c	Mon Oct 21 19:11:15 2013	(r256857)
@@ -152,8 +152,6 @@ ata_macio_probe(device_t dev)
 	const char *type = ofw_bus_get_type(dev);
 	const char *name = ofw_bus_get_name(dev);
 	struct ata_macio_softc *sc;
-	struct ata_channel *ch;
-	int rid, i;
 
 	if (strcmp(type, "ata") != 0 &&
 	    strcmp(type, "ide") != 0)
@@ -161,7 +159,6 @@ ata_macio_probe(device_t dev)
 
 	sc = device_get_softc(dev);
 	bzero(sc, sizeof(struct ata_macio_softc));
-	ch = &sc->sc_ch.sc_ch;
 
 	if (strcmp(name,"ata-4") == 0) {
 		device_set_desc(dev,"Apple MacIO Ultra ATA Controller");
@@ -173,7 +170,23 @@ ata_macio_probe(device_t dev)
 		sc->max_mode = ATA_WDMA2;
 	}
 
+	return (ata_probe(dev));
+}
+
+static int
+ata_macio_attach(device_t dev)
+{
+	struct ata_macio_softc *sc = device_get_softc(dev);
+	uint32_t timingreg;
+	struct ata_channel *ch;
+	int rid, i;
+
+	/*
+	 * Allocate resources
+	 */
+
 	rid = 0;
+	ch = &sc->sc_ch.sc_ch;
 	sc->sc_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, 
 	    RF_ACTIVE);
 	if (sc->sc_mem == NULL) {
@@ -196,15 +209,6 @@ ata_macio_probe(device_t dev)
 	ch->flags |= ATA_USE_16BIT | ATA_NO_ATAPI_DMA;
 	ata_generic_hw(dev);
 
-	return (ata_probe(dev));
-}
-
-static int
-ata_macio_attach(device_t dev)
-{
-	struct ata_macio_softc *sc = device_get_softc(dev);
-	uint32_t timingreg;
-
 #if USE_DBDMA_IRQ
 	int dbdma_irq_rid = 1;
 	struct resource *dbdma_irq;


More information about the svn-src-all mailing list