1
0
mirror of git://projects.qi-hardware.com/openwrt-xburst.git synced 2024-12-05 04:08:25 +02:00
openwrt-xburst/package/madwifi/patches/388-apsta_fix.patch
nbd 537de4718f madwifi: improve reliability of the wds modes
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@13416 3c298f89-4303-0410-b956-a3cf2f4a3e73
2008-11-28 20:46:52 +00:00

61 lines
2.1 KiB
Diff

--- a/net80211/ieee80211_proto.c
+++ b/net80211/ieee80211_proto.c
@@ -1409,7 +1409,8 @@ __ieee80211_newstate(struct ieee80211vap
vap->iv_state = nstate; /* state transition */
del_timer(&vap->iv_mgtsend);
if ((vap->iv_opmode != IEEE80211_M_HOSTAP) &&
- (ostate != IEEE80211_S_SCAN))
+ (ostate != IEEE80211_S_SCAN) &&
+ !(vap->iv_flags_ext & IEEE80211_FEXT_SCAN_PENDING))
ieee80211_cancel_scan(vap); /* background scan */
ni = vap->iv_bss; /* NB: no reference held */
switch (nstate) {
@@ -1451,7 +1452,8 @@ __ieee80211_newstate(struct ieee80211vap
}
goto reset;
case IEEE80211_S_SCAN:
- ieee80211_cancel_scan(vap);
+ if (!(vap->iv_flags_ext & IEEE80211_FEXT_SCAN_PENDING))
+ ieee80211_cancel_scan(vap);
goto reset;
reset:
ieee80211_reset_bss(vap);
@@ -1989,7 +1991,9 @@ ieee80211_newstate(struct ieee80211vap *
}
}
}
- } else if (dstate == IEEE80211_S_SCAN) {
+ } else if ((dstate == IEEE80211_S_SCAN) ||
+ (dstate == IEEE80211_S_AUTH) ||
+ (dstate == IEEE80211_S_ASSOC)) {
/* Force to scan pending... someone is scanning */
vap->iv_flags_ext |= IEEE80211_FEXT_SCAN_PENDING;
__ieee80211_newstate(vap, IEEE80211_S_INIT, arg);
--- a/net80211/ieee80211_output.c
+++ b/net80211/ieee80211_output.c
@@ -238,7 +238,9 @@ ieee80211_hardstart(struct sk_buff *skb,
}
/* Cancel any running BG scan */
- if (!(ic->ic_flags_ext & IEEE80211_FEXT_BGSCAN_THR) && (vap->iv_state == IEEE80211_S_RUN))
+ if (!(ic->ic_flags_ext & IEEE80211_FEXT_BGSCAN_THR) &&
+ (vap->iv_state == IEEE80211_S_RUN) &&
+ (ic->ic_flags_ext & IEEE80211_FEXT_BGSCAN))
ieee80211_cancel_scan(vap);
/*
--- a/net80211/ieee80211_wireless.c
+++ b/net80211/ieee80211_wireless.c
@@ -2728,9 +2728,9 @@ ieee80211_ioctl_setparam(struct net_devi
return -EINVAL;
vap->iv_flags |= IEEE80211_F_BGSCAN;
} else {
- /* XXX racey? */
+ if (ic->ic_flags_ext & IEEE80211_FEXT_BGSCAN)
+ ieee80211_cancel_scan(vap); /* anything current */
vap->iv_flags &= ~IEEE80211_F_BGSCAN;
- ieee80211_cancel_scan(vap); /* anything current */
}
break;
case IEEE80211_PARAM_BGSCAN_IDLE: