svn commit: r190098 - in head/sys/sparc64: fhc sparc64

Marius Strobl marius at FreeBSD.org
Thu Mar 19 13:29:24 PDT 2009


Author: marius
Date: Thu Mar 19 20:29:23 2009
New Revision: 190098
URL: http://svn.freebsd.org/changeset/base/190098

Log:
  - Failing to register as interrupt controller during attach shouldn't
    be fatal so just inform about this instead of panicing.
  - Sort device methods.
  - Take advantage of KOBJMETHOD_END.
  - Remove some redundant variables.

Modified:
  head/sys/sparc64/fhc/fhc.c
  head/sys/sparc64/sparc64/upa.c

Modified: head/sys/sparc64/fhc/fhc.c
==============================================================================
--- head/sys/sparc64/fhc/fhc.c	Thu Mar 19 20:24:30 2009	(r190097)
+++ head/sys/sparc64/fhc/fhc.c	Thu Mar 19 20:29:23 2009	(r190098)
@@ -90,14 +90,14 @@ static device_method_t fhc_methods[] = {
 	/* Bus interface */
 	DEVMETHOD(bus_print_child,	fhc_print_child),
 	DEVMETHOD(bus_probe_nomatch,	fhc_probe_nomatch),
-	DEVMETHOD(bus_setup_intr,	fhc_setup_intr),
-	DEVMETHOD(bus_teardown_intr,	bus_generic_teardown_intr),
 	DEVMETHOD(bus_alloc_resource,	fhc_alloc_resource),
-	DEVMETHOD(bus_release_resource,	bus_generic_rl_release_resource),
 	DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
 	DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
-	DEVMETHOD(bus_get_resource_list, fhc_get_resource_list),
+	DEVMETHOD(bus_release_resource,	bus_generic_rl_release_resource),
+	DEVMETHOD(bus_setup_intr,	fhc_setup_intr),
+	DEVMETHOD(bus_teardown_intr,	bus_generic_teardown_intr),
 	DEVMETHOD(bus_get_resource,	bus_generic_rl_get_resource),
+	DEVMETHOD(bus_get_resource_list, fhc_get_resource_list),
 
 	/* ofw_bus interface */
 	DEVMETHOD(ofw_bus_get_devinfo,	fhc_get_devinfo),
@@ -107,7 +107,7 @@ static device_method_t fhc_methods[] = {
 	DEVMETHOD(ofw_bus_get_node,	ofw_bus_gen_get_node),
 	DEVMETHOD(ofw_bus_get_type,	ofw_bus_gen_get_type),
 
-	{ NULL, NULL }
+	KOBJMETHOD_END
 };
 
 static driver_t fhc_driver = {
@@ -165,9 +165,7 @@ fhc_attach(device_t dev)
 	int central;
 	int error;
 	int i;
-	int nintr;
-	int nreg;
-	int rid;
+	int j;
 
 	sc = device_get_softc(dev);
 	node = ofw_bus_get_node(dev);
@@ -177,9 +175,9 @@ fhc_attach(device_t dev)
 		central = 1;
 
 	for (i = 0; i < FHC_NREG; i++) {
-		rid = i;
+		j = i;
 		sc->sc_memres[i] = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
-		    &rid, RF_ACTIVE);
+		    &j, RF_ACTIVE);
 		if (sc->sc_memres[i] == NULL) {
 			device_printf(dev, "cannot allocate resource %d\n", i);
 			error = ENXIO;
@@ -239,7 +237,8 @@ fhc_attach(device_t dev)
 		/*
 		 * Hunt through all the interrupt mapping regs and register
 		 * our interrupt controller for the corresponding interrupt
-		 * vectors.
+		 * vectors.  We do this early in order to be able to catch
+		 * stray interrupts.
 		 */
 		for (i = FHC_FANFAIL; i <= FHC_TOD; i++) {
 			fica = malloc(sizeof(*fica), M_DEVBUF, M_NOWAIT);
@@ -259,11 +258,13 @@ fhc_attach(device_t dev)
 			 * the IGN and the IGN is constant for all devices
 			 * on that FireHose controller.
 			 */
-			if (intr_controller_register(INTMAP_VEC(sc->sc_ign,
+			j = intr_controller_register(INTMAP_VEC(sc->sc_ign,
 			    INTINO(bus_read_4(fica->fica_memres, FHC_IMAP))),
-			    &fhc_ic, fica) != 0)
-				panic("%s: could not register interrupt "
-				    "controller for map %d", __func__, i);
+			    &fhc_ic, fica);
+			if (j != 0)
+				device_printf(dev, "could not register "
+				    "interrupt controller for map %d (%d)\n",
+				    i, j);
 		}
 	} else {
 		snprintf(ledname, sizeof(ledname), "board%d", board);
@@ -276,9 +277,9 @@ fhc_attach(device_t dev)
 			free(fdi, M_DEVBUF);
 			continue;
 		}
-		nreg = OF_getprop_alloc(child, "reg", sizeof(*reg),
+		i = OF_getprop_alloc(child, "reg", sizeof(*reg),
 		    (void **)&reg);
-		if (nreg == -1) {
+		if (i == -1) {
 			device_printf(dev, "<%s>: incomplete\n",
 			    fdi->fdi_obdinfo.obd_name);
 			ofw_bus_gen_destroy_devinfo(&fdi->fdi_obdinfo);
@@ -286,19 +287,19 @@ fhc_attach(device_t dev)
 			continue;
 		}
 		resource_list_init(&fdi->fdi_rl);
-		for (i = 0; i < nreg; i++)
-			resource_list_add(&fdi->fdi_rl, SYS_RES_MEMORY, i,
-			    reg[i].sbr_offset, reg[i].sbr_offset +
-			    reg[i].sbr_size, reg[i].sbr_size);
+		for (j = 0; j < i; j++)
+			resource_list_add(&fdi->fdi_rl, SYS_RES_MEMORY, j,
+			    reg[j].sbr_offset, reg[j].sbr_offset +
+			    reg[j].sbr_size, reg[j].sbr_size);
 		free(reg, M_OFWPROP);
 		if (central == 1) {
-			nintr = OF_getprop_alloc(child, "interrupts",
+			i = OF_getprop_alloc(child, "interrupts",
 			    sizeof(*intr), (void **)&intr);
-			if (nintr != -1) {
-				for (i = 0; i < nintr; i++) {
-					iv = INTMAP_VEC(sc->sc_ign, intr[i]);
+			if (i != -1) {
+				for (j = 0; j < i; j++) {
+					iv = INTMAP_VEC(sc->sc_ign, intr[j]);
 					resource_list_add(&fdi->fdi_rl,
-					    SYS_RES_IRQ, i, iv, iv, 1);
+					    SYS_RES_IRQ, j, iv, iv, 1);
 				}
 				free(intr, M_OFWPROP);
 			}

Modified: head/sys/sparc64/sparc64/upa.c
==============================================================================
--- head/sys/sparc64/sparc64/upa.c	Thu Mar 19 20:24:30 2009	(r190097)
+++ head/sys/sparc64/sparc64/upa.c	Thu Mar 19 20:29:23 2009	(r190098)
@@ -144,7 +144,7 @@ static device_method_t upa_methods[] = {
 	DEVMETHOD(ofw_bus_get_node,	ofw_bus_gen_get_node),
 	DEVMETHOD(ofw_bus_get_type,	ofw_bus_gen_get_type),
 
-	{ NULL, NULL }
+	KOBJMETHOD_END
 };
 
 static devclass_t upa_devclass;
@@ -241,7 +241,7 @@ upa_attach(device_t dev)
 				    "pci108e,8001") == 0 &&
 				    ((bus_get_resource_start(children[j],
 				    SYS_RES_MEMORY, 0) >> 20) & 1) == 1) {
-				    	schizo = children[j];
+					schizo = children[j];
 					break;
 				}
 			}
@@ -287,9 +287,10 @@ upa_attach(device_t dev)
 		goto fail;
 	}
 
- 	/*
+	/*
 	 * Hunt through all the interrupt mapping regs and register our
 	 * interrupt controller for the corresponding interrupt vectors.
+	 * We do this early in order to be able to catch stray interrupts.
 	 */
 	for (i = UPA_INO_BASE; i <= UPA_INO_MAX; i++) {
 		imr = 0;
@@ -312,10 +313,11 @@ upa_attach(device_t dev)
 		device_printf(dev, "intr map (INO %d) IMR%d: %#lx\n",
 		    i, imr, (u_long)UPA_READ(sc, imr, 0x0));
 #endif
-		if (intr_controller_register(INTMAP_VEC(sc->sc_ign, i),
-		    &upa_ic, uica) != 0)
-			panic("%s: could not register interrupt controller "
-			    "for INO %d", __func__, i);
+		j = intr_controller_register(INTMAP_VEC(sc->sc_ign, i),
+		    &upa_ic, uica);
+		if (j != 0)
+			device_printf(dev, "could not register interrupt "
+			    "controller for INO %d (%d)\n", i, j);
 	}
 
 	/* Make sure the power level is appropriate for normal operation. */
@@ -345,13 +347,13 @@ upa_attach(device_t dev)
 			device_printf(dev,
 			    "could not determine upa-portid of child 0x%lx\n",
 			    (unsigned long)child);
-		    	continue;
+			continue;
 		}
 		if (portid > 1) {
 			device_printf(dev,
 			    "upa-portid %d of child 0x%lx invalid\n", portid,
 			    (unsigned long)child);
-		    	continue;
+			continue;
 		}
 		if ((udi = upa_setup_dinfo(dev, sc, child, portid)) == NULL)
 			continue;
@@ -493,12 +495,12 @@ upa_setup_intr(device_t dev, device_t ch
 	/*
 	 * Make sure the vector is fully specified and we registered
 	 * our interrupt controller for it.
- 	 */
+	 */
 	vec = rman_get_start(ires);
 	if (INTIGN(vec) != sc->sc_ign || intr_vectors[vec].iv_ic != &upa_ic) {
 		device_printf(dev, "invalid interrupt vector 0x%lx\n", vec);
- 		return (EINVAL);
- 	}
+		return (EINVAL);
+	}
 	return (bus_generic_setup_intr(dev, child, ires, flags, filt, func,
 	    arg, cookiep));
 }


More information about the svn-src-all mailing list