Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 Oct 2002 20:40:58 -0600 (MDT)
From:      "M. Warner Losh" <imp@bsdimp.com>
To:        davidxu@freebsd.org
Cc:        freebsd-current@freebsd.org
Subject:   Re: rl driver lock order reversal
Message-ID:  <20021021.204058.31316741.imp@bsdimp.com>
In-Reply-To: <00bd01c27972$5eea20f0$ef01a8c0@davidwnt>
References:  <200210220208.g9M28wLS003077@freefall.freebsd.org> <20021021.202051.106891660.imp@bsdimp.com> <00bd01c27972$5eea20f0$ef01a8c0@davidwnt>

next in thread | previous in thread | raw e-mail | index | archive | help
In message: <00bd01c27972$5eea20f0$ef01a8c0@davidwnt>
            "David Xu" <davidxu@freebsd.org> writes:
: today's source code

Looks like I've not committed it. :-(.  Also looks like p4 told me
there were no diffs for reasons unknown...

This removes the lock around the attach routine.  It isn't needed,
since we can't possibly be reentered until after we register an ISR.

Warner

--- /dell/imp/FreeBSD/src/sys/pci/if_rl.c	Mon Oct  7 00:15:08 2002
+++ /dell/imp/p4/newcard/src/sys/pci/if_rl.c	Fri Oct 18 00:33:53 2002
@@ -869,7 +869,6 @@
 
 	mtx_init(&sc->rl_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
 	    MTX_DEF | MTX_RECURSE);
-	RL_LOCK(sc);
 
 	/*
 	 * Handle power management nonsense.
@@ -952,18 +951,6 @@
 		goto fail;
 	}
 
-	error = bus_setup_intr(dev, sc->rl_irq, INTR_TYPE_NET,
-	    rl_intr, sc, &sc->rl_intrhand);
-
-	if (error) {
-		bus_release_resource(dev, SYS_RES_IRQ, 0, sc->rl_irq);
-		bus_release_resource(dev, RL_RES, RL_RID, sc->rl_res);
-		printf("rl%d: couldn't set up irq\n", unit);
-		goto fail;
-	}
-
-	callout_handle_init(&sc->rl_stat_ch);
-
 	/* Reset the adapter. */
 	rl_reset(sc);
 	sc->rl_eecmd_read = RL_EECMD_READ_6BIT;
@@ -999,7 +986,6 @@
 		sc->rl_type = RL_8129;
 	else {
 		printf("rl%d: unknown device ID: %x\n", unit, rl_did);
-		bus_teardown_intr(dev, sc->rl_irq, sc->rl_intrhand);
 		bus_release_resource(dev, SYS_RES_IRQ, 0, sc->rl_irq);
 		bus_release_resource(dev, RL_RES, RL_RID, sc->rl_res);
 		error = ENXIO;
@@ -1045,7 +1031,6 @@
 
 	if (sc->rl_cdata.rl_rx_buf == NULL) {
 		printf("rl%d: no memory for list buffers!\n", unit);
-		bus_teardown_intr(dev, sc->rl_irq, sc->rl_intrhand);
 		bus_release_resource(dev, SYS_RES_IRQ, 0, sc->rl_irq);
 		bus_release_resource(dev, RL_RES, RL_RID, sc->rl_res);
 		bus_dma_tag_destroy(sc->rl_tag);
@@ -1061,7 +1046,6 @@
 	if (mii_phy_probe(dev, &sc->rl_miibus,
 	    rl_ifmedia_upd, rl_ifmedia_sts)) {
 		printf("rl%d: MII without any phy!\n", sc->rl_unit);
-		bus_teardown_intr(dev, sc->rl_irq, sc->rl_intrhand);
 		bus_release_resource(dev, SYS_RES_IRQ, 0, sc->rl_irq);
 		bus_release_resource(dev, RL_RES, RL_RID, sc->rl_res);
 		bus_dmamem_free(sc->rl_tag,
@@ -1089,11 +1073,23 @@
 	 * Call MI attach routine.
 	 */
 	ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
-	RL_UNLOCK(sc);
-	return(0);
 
+	error = bus_setup_intr(dev, sc->rl_irq, INTR_TYPE_NET,
+	    rl_intr, sc, &sc->rl_intrhand);
+
+	if (error) {
+		printf("rl%d: couldn't set up irq\n", unit);
+		bus_release_resource(dev, SYS_RES_IRQ, 0, sc->rl_irq);
+		bus_release_resource(dev, RL_RES, RL_RID, sc->rl_res);
+		bus_dmamem_free(sc->rl_tag,
+		    sc->rl_cdata.rl_rx_buf, sc->rl_cdata.rl_rx_dmamap);
+		bus_dma_tag_destroy(sc->rl_tag);
+		goto fail;
+	}
+
+	callout_handle_init(&sc->rl_stat_ch);
+	return(0);
 fail:
-	RL_UNLOCK(sc);
 	mtx_destroy(&sc->rl_mtx);
 	return(error);
 }

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20021021.204058.31316741.imp>