cvs commit: src/sys/dev/fxp if_fxp.c
Nate Lawson
nate at root.org
Thu Apr 10 17:03:52 PDT 2003
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 at .
> - 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
More information about the cvs-src
mailing list