On Tue, 2010-03-09 at 13:52 +0200, Juuso Oikarinen wrote: > Some hardware (i.e. the wl1271) are able to monitor beacons, and send > probe-requests to AP in case of beacon loss independently to try to recover > the connection. In these cases, it is useless for the mac80211 to send > further probe-requests. > > Add a new function for the hardware to indicate that the AP has been lost. > This function immediately tears down the connection. > > Signed-off-by: Juuso Oikarinen <juuso.oikarinen@xxxxxxxxx> > --- > include/net/mac80211.h | 12 ++++++++++++ > net/mac80211/mlme.c | 32 ++++++++++++++++++++++++++++++++ > 2 files changed, 44 insertions(+), 0 deletions(-) > > diff --git a/include/net/mac80211.h b/include/net/mac80211.h > index 45d7d44..d9792e4 100644 > --- a/include/net/mac80211.h > +++ b/include/net/mac80211.h > @@ -2370,6 +2370,18 @@ void ieee80211_sta_block_awake(struct ieee80211_hw *hw, > */ > void ieee80211_beacon_loss(struct ieee80211_vif *vif); > > +/** > + * ieee80211_probereq_failed - inform hardware has lost connection with the AP > + * > + * @vif: &struct ieee80211_vif pointer from the add_interface callback. > + * > + * When beacon filtering is enabled with IEEE80211_HW_BEACON_FILTERING and > + * IEEE80211_CONF_PS is set, the driver needs to inform with this function > + * whenever the hardware is not receiving beacons and the AP is not responding > + * to probe requests with this function. > + */ > +void ieee80211_probereq_failed(struct ieee80211_vif *vif); > + > /* Rate control API */ > > /** > diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c > index 0ab284c..8f591a4 100644 > --- a/net/mac80211/mlme.c > +++ b/net/mac80211/mlme.c > @@ -945,6 +945,38 @@ void ieee80211_beacon_loss(struct ieee80211_vif *vif) > } > EXPORT_SYMBOL(ieee80211_beacon_loss); > > +void ieee80211_probereq_failed(struct ieee80211_vif *vif) > +{ > + struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); > + struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; > + struct ieee80211_local *local = sdata->local; > + u8 bssid[ETH_ALEN]; > + > + mutex_lock(&ifmgd->mtx); > + if (!ifmgd->associated) { > + mutex_unlock(&ifmgd->mtx); > + return; > + } > + > + memcpy(bssid, ifmgd->associated->bssid, ETH_ALEN); I think the actual work should be deferred to a workqueue struct item so that you don't get into locking trouble with drivers here. johannes -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html