On Thursday 06 November 2008, Dave wrote: > Dave wrote: > > Andrey Borzenkov wrote: > >> To remind - sometimes after resume it takes *very* long time to associate, > >> so everything else times out and I get no connection. Running orinoco from > >> 2.6.28 in WPA mode and wpa_supplicant 0.6.4; in logs can be seen that > >> wpa_supplicant endlessly tries to associate. > > > > The orinoco driver maintains its settings across an 'if down' - 'if up'. > > This means the card will attempt to associate as soon as you 'if up'. > > > > I'm looking at a patch which will clear all driver settings in > > orinoco_open, which should fix things for distributions which bring the > > interface down when suspending. > > Can you try the patch below? Apologies if it gets whitespace damage. > It is hard to be sure when the problem is sporadic and no known way to trigger it, but I have been running with this patch for a week without issues; this so far exceeds usual score. Now comments :) - we should not be doing it in ->open. It is technically legal to set wireless parameters before "icfonfig up" and we lose all of them. I will try next week with similar patch in orinoco_stop(). - I am still not even sure we should do it at all. What is sematic of ifconfig up/down w.r.t. wireless parameters? I.e. is "ifconfig down" expected to clean all device state and start from scratch? - finally I still think we are facing more wpa_supplicant bug, and this is just a workaround for it. I have seen at least one case of losing access point and wpa_supplicant was not able to cope with it after AP was found again. > Dave. > > --- > diff --git a/drivers/net/wireless/orinoco.c b/drivers/net/wireless/orinoco.c > index 12059f4..8ca9d51 100644 > --- a/drivers/net/wireless/orinoco.c > +++ b/drivers/net/wireless/orinoco.c > @@ -721,6 +721,18 @@ static int orinoco_open(struct net_device *dev) > if (orinoco_lock(priv, &flags) != 0) > return -EBUSY; > > + /* Clear driver settings. Copied from orinoco_init */ > + priv->iw_mode = IW_MODE_INFRA; > + priv->prefer_port3 = priv->has_port3 && (! priv->has_ibss); > + set_port_type(priv); > + priv->channel = 0; > + priv->promiscuous = 0; > + priv->encode_alg = IW_ENCODE_ALG_NONE; > + priv->tx_key = 0; > + priv->wpa_enabled = 0; > + priv->tkip_cm_active = 0; > + priv->key_mgmt = 0; > + > err = __orinoco_up(dev); > > if (! err) > > >
Attachment:
signature.asc
Description: This is a digitally signed message part.