kernel panic when running dhclient on tulip

Matthew Dillon dillon at apollo.backplane.com
Mon Feb 6 11:56:45 PST 2006


    I think this one is a bit different.  It's in netif/de/if_de.c.

    The problem is simply that the IFP's serializer is not being installed
    by bus_setup_intr().  Instead it looks like its installing a private
    serializer.

    I probably did this before the IFP serialization work.  

    Try the attached patch.  I'm not 100% sure the initialization is
    ordered properly, but its worth a shot.

					-Matt
					Matthew Dillon 
					<dillon at xxxxxxxxxxxxx>


Index: if_de.c
===================================================================
RCS file: /cvs/src/sys/dev/netif/de/if_de.c,v
retrieving revision 1.41
diff -u -r1.41 if_de.c
--- if_de.c	28 Nov 2005 17:13:42 -0000	1.41
+++ if_de.c	6 Feb 2006 19:49:47 -0000
@@ -129,11 +129,11 @@
 {
     tulip_softc_t *sc = arg;
 
-    lwkt_serialize_enter(&sc->tulip_serializer);
+    lwkt_serialize_enter(sc->tulip_if.if_serializer);
     sc->tulip_flags &= ~TULIP_TIMEOUTPENDING;
     sc->tulip_probe_timeout -= 1000 / TULIP_HZ;
     (sc->tulip_boardsw->bd_media_poll)(sc, TULIP_MEDIAPOLL_TIMER);
-    lwkt_serialize_exit(&sc->tulip_serializer);
+    lwkt_serialize_exit(sc->tulip_if.if_serializer);
 }
 
 static void
@@ -3945,6 +3945,13 @@
 }
 
 static void
+tulip_detach(tulip_softc_t *sc)
+{
+    ifmedia_removeall(&sc->tulip_ifmedia);
+    ether_ifdetach(&sc->tulip_if);
+}
+
+static void
 tulip_initcsrs(tulip_softc_t *sc, tulip_csrptr_t csr_base, size_t csr_size)
 {
     sc->tulip_csrs.csr_busmode		= csr_base +  0 * csr_size;
@@ -4031,12 +4038,12 @@
 {
     tulip_softc_t *sc = device_get_softc(dev);
 
-    lwkt_serialize_enter(&sc->tulip_serializer);
+    lwkt_serialize_enter(sc->tulip_if.if_serializer);
     TULIP_CSR_WRITE(sc, csr_busmode, TULIP_BUSMODE_SWRESET);
     DELAY(10);	/* Wait 10 microseconds (actually 50 PCI cycles but at 
 		   33MHz that comes to two microseconds but wait a
 		   bit longer anyways) */
-    lwkt_serialize_exit(&sc->tulip_serializer);
+    lwkt_serialize_exit(sc->tulip_if.if_serializer);
     return 0;
 }
 
@@ -4090,7 +4097,6 @@
     }
 
     sc = device_get_softc(dev);
-    lwkt_serialize_init(&sc->tulip_serializer);
     sc->tulip_dev = dev;
     sc->tulip_pci_busno = pci_get_bus(dev);
     sc->tulip_pci_devno = pci_get_slot(dev);
@@ -4156,7 +4162,6 @@
 		   33MHz that comes to two microseconds but wait a
 		   bit longer anyways) */
 
-    lwkt_serialize_enter(&sc->tulip_serializer);
     if ((retval = tulip_read_macaddr(sc)) < 0) {
 	device_printf(dev, "can't read ENET ROM (why=%d) (", retval);
 	for (idx = 0; idx < 32; idx++)
@@ -4172,6 +4177,7 @@
 	if (sc->tulip_features & TULIP_HAVE_SHAREDINTR)
 	    intr_rtn = tulip_intr_shared;
 
+	tulip_attach(sc);
 	if ((sc->tulip_features & TULIP_HAVE_SLAVEDINTR) == 0) {
 	    void *ih;
 
@@ -4180,16 +4186,14 @@
 				         RF_SHAREABLE | RF_ACTIVE);
 	    if (res == 0 || bus_setup_intr(dev, res, INTR_NETSAFE,
 					   intr_rtn, sc, &ih,
-					   &sc->tulip_serializer)) {
-		lwkt_serialize_exit(&sc->tulip_serializer);
+					   sc->tulip_if.if_serializer)) {
 		device_printf(dev, "couldn't map interrupt\n");
+		tulip_detach(sc);
 		free((caddr_t) sc->tulip_rxdescs, M_DEVBUF);
 		free((caddr_t) sc->tulip_txdescs, M_DEVBUF);
 		return ENXIO;
 	    }
 	}
-	tulip_attach(sc);
-	lwkt_serialize_exit(&sc->tulip_serializer);
     }
     return 0;
 }





More information about the Bugs mailing list