From owner-cvs-src@FreeBSD.ORG Thu Apr 10 17:03:51 2003 Return-Path: Delivered-To: cvs-src@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 8912337B407 for ; Thu, 10 Apr 2003 17:03:51 -0700 (PDT) Received: from rootlabs.com (root.org [67.118.192.226]) by mx1.FreeBSD.org (Postfix) with SMTP id 37F4C43FBF for ; Thu, 10 Apr 2003 17:03:50 -0700 (PDT) (envelope-from nate@rootlabs.com) Received: (qmail 32646 invoked by uid 1000); 11 Apr 2003 00:03:51 -0000 Date: Thu, 10 Apr 2003 17:03:51 -0700 (PDT) From: Nate Lawson To: Maxime Henrion In-Reply-To: <20030410231519.3348737B4A5@hub.freebsd.org> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII cc: cvs-src@FreeBSD.org cc: src-committers@FreeBSD.org cc: cvs-all@FreeBSD.org Subject: Re: cvs commit: src/sys/dev/fxp if_fxp.c X-BeenThere: cvs-src@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: CVS commit messages for the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 11 Apr 2003 00:03:52 -0000 On Thu, 10 Apr 2003, Maxime Henrion wrote: > Modified files: > sys/dev/fxp if_fxp.c > Log: > - Clean up the fxp_release() and fxp_detach() functions. There's a version of this in the diff I just posted to current@. > - Be sure to teardown the interrupt first so that "kldunload if_fxp" > doesn't panic the box. It's now deadlocking rather than crashing, > which isn't really better, but I'm unsure this is fxp(4)'s fault. There's also a version of this in my diff. I have been testing my diff by loading and unloading fxp while doing a large transfer and I cannot replicate this. Are you sure it's not a local problem? I have never had a deadlock or a crash and loading fxp again always works. > @@ -878,20 +874,23 @@ > > s = splimp(); > > - /* > - * Stop DMA and drop transmit queue. > - */ > - fxp_stop(sc); > - > - /* > - * Close down routes etc. > - */ > - ether_ifdetach(&sc->arpcom.ac_if); > - > - /* > - * Free all media structures. > - */ > - ifmedia_removeall(&sc->sc_media); > + if (device_is_alive(dev)) { > + /* > + * Stop DMA and drop transmit queue. > + */ > + if (bus_child_present(dev)) > + fxp_stop(sc); > + /* > + * Close down routes etc. > + */ > + ether_ifdetach(&sc->arpcom.ac_if); > + device_delete_child(dev, sc->miibus); > + bus_generic_detach(dev); > + /* > + * Free all media structures. > + */ > + ifmedia_removeall(&sc->sc_media); > + } > > splx(s); Um, fxp_detach() should not be called for any case where the device isn't alive. fxp_detach should ONLY be called once attach has succeeded which by definition means the device is alive. bus_child_present() is the bus-specific method to see that the hardware is actually there; device_is_alive only tells you that the device_t node is present in the tree. fxp_release may be called in error cases. Rather than working around your problem this way, please find what is calling fxp_detach when the device is not alive. -Nate