Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 1 Feb 2009 11:08:20 -0800
From:      Andrew Thompson <thompsa@FreeBSD.org>
To:        Hans Petter Selasky <hselasky@c2i.net>
Cc:        freebsd-usb@freebsd.org
Subject:   Re: USB2 patches
Message-ID:  <20090201190820.GB32503@citylink.fud.org.nz>
In-Reply-To: <200902011922.16810.hselasky@c2i.net>
References:  <20090131231957.GB31825@citylink.fud.org.nz> <200902011220.18745.hselasky@c2i.net> <20090201175021.GA32503@citylink.fud.org.nz> <200902011922.16810.hselasky@c2i.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Feb 01, 2009 at 07:22:15PM +0100, Hans Petter Selasky wrote:
> Hi Andrew,
> 
> > > 3)
> > >
> > > In general avoid more than a few synchronous USB transfer inside
> > > attach/detach. Always defer! Else there are corner cases where the device
> > > can hang waiting for the transfer timeout 1-5 seconds for every USB
> > > transfer, and that is unacceptable.
> >
> > I disagree. It hugely simplifies drivers to know all the resources are
> > allocated after attach, you dont need to check for null pointers
> > throughout the code. 
> 
> I think you misunderstand. The attach code that loads firmware, reads eeprom 
> and performs other configuration must be handed off to another thread, or in 
> your case a taskqueue, so that the USB attach thread can go on and do other 
> things.

The attach routine allocates resources and attaches the hardware. Things
like loading firmware and other configuration are done in the ifnet init
routine.

> > > It is also very important that you somehow freeze the configuration at
> > > the moment a command is issued. For example in the WLAN drivers. If the
> > > command is queued when the channel is 5 then we should program channel 5
> > > and not fetch the latest channel value from the softc! IMPORTANT!
> >
> > This isnt correct. Take your example of WLAN drivers, the net80211 layer
> > will use ic_curchan for its logic so the driver needs to program the
> > chip to this value at all times. You can _not_ queue channel changes as
> > these will be out of sync. 
> 
> Being a little off-sync is not the big problem. The big problem is if the 
> channel value is changing during execution of the code. For example, in the 
> beginning of the code the channel value is 5, then suddenly it becomes 6, and 
> the programming just ends up crazy!
> 
> xxx_set_channel()
> {
> 	hw_reg = array1[wlan->curchan];
> 
> 	write USB register;
> 
> 	hw_reg = array2[wlan->curchan];
> 
> 	write USB register;
> }

The code should be,

xxx_set_channel()
{
	ieee80211_channel c = wlan->curchan;

	hw_reg = array1[c];
	write USB register;
	hw_reg = array2[c];
	write USB register;
}


cheers,
Andrew



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