cvs commit: src/sys/dev/netif/wb if_wb.c

Sepherosa Ziehau sepherosa at gmail.com
Wed Jun 8 23:44:02 PDT 2005


@@ -862,11 +841,18 @@ wb_attach(device_t dev)
 	 */
 	ether_ifattach(ifp, eaddr);
 
-fail:
-	if (error)
-		device_delete_child(dev, sc->wb_miibus);
-	crit_exit();
+	error = bus_setup_intr(dev, sc->wb_irq, INTR_TYPE_NET,
+			       wb_intr, sc, &sc->wb_intrhand, NULL);
 
+	if (error) {
+		device_printf(dev, "couldn't set up irq\n");

We should add ether_ifdetach() here, since we have called
ether_ifattach() here.  wb_detach() will not call ether_ifdetach(), if
we enter wb_detach() from here.

+		goto fail;
+	}
+
+	return(0);
+
+fail:
+	wb_detach(dev);
 	return(error);
 }


@@ -878,21 +864,25 @@ wb_detach(device_t dev)
 
 	crit_enter();
 
-	wb_stop(sc);
-	ether_ifdetach(ifp);
-
-	/* Delete any miibus and phy devices attached to this interface */
-	bus_generic_detach(dev);
-	device_delete_child(dev, sc->wb_miibus);
-
-	bus_teardown_intr(dev, sc->wb_irq, sc->wb_intrhand);
-	bus_release_resource(dev, SYS_RES_IRQ, 0, sc->wb_irq);
-	bus_release_resource(dev, WB_RES, WB_RID, sc->wb_res);
-
-	contigfree(sc->wb_ldata_ptr, sizeof(struct wb_list_data) + 8,
-	    M_DEVBUF);
+	if (device_is_attached(dev)) {
+		if (bus_child_present(dev))
+			wb_stop(sc);
+		ether_ifdetach(ifp);
+		device_delete_child(dev, sc->wb_miibus);

IMHO, we should call device_delete_child() based on (sc->wb_miibus !=
NULL), not on device_is_attached(), given that in wb_attach()
mii_phy_probe() may fail.

+		bus_generic_detach(dev);
+	}

Best Regards
sephe

On 6/9/05, Joerg Sonnenberger <joerg at xxxxxxxxxxxxxxxxxxxxxxx> wrote:
> joerg       2005/06/08 12:20:09 PDT
> 
> DragonFly src repository
> 
>   Modified files:
>     sys/dev/netif/wb     if_wb.c
>   Log:
>   Reorder initialisation to make protection unnecessary.
> 
>   Use device_printf in wb_attach. Leave critical section ASAP in wb_detach.
>   Use M_WAITOK for contigmalloc.
> 
>   Partly-obtained-from: FreeBSD (first part).
> 
>   Revision  Changes    Path
>   1.26      +36 -46    src/sys/dev/netif/wb/if_wb.c
> 
> 
> http://www.dragonflybsd.org/cvsweb/src/sys/dev/netif/wb/if_wb.c.diff?r1=1.25&r2=1.26&f=u
> 


-- 
Live Free or Die






More information about the Commits mailing list