Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 08 May 2009 13:41:04 -0400
From:      John Baldwin <jhb@FreeBSD.org>
To:        Andrew Thompson <thompsa@FreeBSD.org>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r191912 - in head/sys/dev: ipw iwi
Message-ID:  <4A046EB0.9060009@FreeBSD.org>
In-Reply-To: <200905081344.n48DiYJI092605@svn.freebsd.org>
References:  <200905081344.n48DiYJI092605@svn.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Andrew Thompson wrote:
> Author: thompsa
> Date: Fri May  8 13:44:33 2009
> New Revision: 191912
> URL: http://svn.freebsd.org/changeset/base/191912
> 
> Log:
>   Drain the tasks before the interface stop call in case a restart was queued.

Actually, you have to drain it after if_detach() so you can safely 
destroy the lock.  The proper order should be something like this:

	bpfdetach(ifp);
	ieee80211_ifdetach(ic);

	ipw_stop(sc);

	callout_drain();
	ieee80211_draintask();

	ipw_release(sc);

This is the order other NIC drivers use where they do something like:

	ether_ifdetach(ifp);
	FOO_LOCK(sc);
	foo_stop(sc);		// calls callout_stop()
	FOO_UNLOCK(sc);

	callout_drain();
	taskqueue_drain();	// only if it uses tasks

	if_free();
	mtx_destroy();

> 
> Modified:
>   head/sys/dev/ipw/if_ipw.c
>   head/sys/dev/iwi/if_iwi.c
> 
> Modified: head/sys/dev/ipw/if_ipw.c
> ==============================================================================
> --- head/sys/dev/ipw/if_ipw.c	Fri May  8 03:19:57 2009	(r191911)
> +++ head/sys/dev/ipw/if_ipw.c	Fri May  8 13:44:33 2009	(r191912)
> @@ -404,13 +404,13 @@ ipw_detach(device_t dev)
>  	struct ifnet *ifp = sc->sc_ifp;
>  	struct ieee80211com *ic = ifp->if_l2com;
>  
> +	ieee80211_draintask(ic, &sc->sc_init_task);
>  	ipw_stop(sc);
>  
>  	bpfdetach(ifp);
>  	ieee80211_ifdetach(ic);
>  
>  	callout_drain(&sc->sc_wdtimer);
> -	ieee80211_draintask(ic, &sc->sc_init_task);
>  
>  	ipw_release(sc);
>  
> 
> Modified: head/sys/dev/iwi/if_iwi.c
> ==============================================================================
> --- head/sys/dev/iwi/if_iwi.c	Fri May  8 03:19:57 2009	(r191911)
> +++ head/sys/dev/iwi/if_iwi.c	Fri May  8 13:44:33 2009	(r191912)
> @@ -459,17 +459,17 @@ iwi_detach(device_t dev)
>  	struct ifnet *ifp = sc->sc_ifp;
>  	struct ieee80211com *ic = ifp->if_l2com;
>  
> -	iwi_stop(sc);
> -
> -	bpfdetach(ifp);
> -	ieee80211_ifdetach(ic);
> -
>  	/* NB: do early to drain any pending tasks */
>  	ieee80211_draintask(ic, &sc->sc_radiontask);
>  	ieee80211_draintask(ic, &sc->sc_radiofftask);
>  	ieee80211_draintask(ic, &sc->sc_restarttask);
>  	ieee80211_draintask(ic, &sc->sc_disassoctask);
>  
> +	iwi_stop(sc);
> +
> +	bpfdetach(ifp);
> +	ieee80211_ifdetach(ic);
> +
>  	iwi_put_firmware(sc);
>  	iwi_release_fw_dma(sc);
>  


-- 
John Baldwin



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