svn commit: r191912 - in head/sys/dev: ipw iwi

John Baldwin jhb at
Fri May 8 18:50:08 UTC 2009

Andrew Thompson wrote:
> On Fri, May 08, 2009 at 01:41:04PM -0400, John Baldwin wrote:
>> Andrew Thompson wrote:
>>> Author: thompsa
>>> Date: Fri May  8 13:44:33 2009
>>> New Revision: 191912
>>> URL:
>>> 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();
> ieee80211_ifdetach() will actually free the taskqueue, it doesnt use one
> of the persistent system ones. It wasnt incorrect before as the
> interface would still be brought down before net80211 detached, it was
> just to reduce the flip flopping. With that noted does it still need
> reordering?

Assuming that free'ing a taskqueue drains any tasks, then you don't 
actually need to drain the task queue in that case.  However, you should 
still move the foo_stop() after if_detach() as userland ioctl requests 
are still able to call your driver's ioctl() routine until if_detach() 
returns.  So perhaps something like this:





In general, it isn't really safe to shutdown the hardware (foo_stop()) 
until you have detached the driver from external code paths (ifnet, bpf, 

John Baldwin

More information about the svn-src-all mailing list