aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2008-09-23 17:28:19 +0000
committerFelix Fietkau <nbd@openwrt.org>2008-09-23 17:28:19 +0000
commit7551ce803df9b5d68c70b1ad1f0813004f3a06a3 (patch)
tree14265ba8370ca8822eb1936db2e81bd57e30daa5
parent0524ab859029bcc02e642d6d9ba13cdf464bc499 (diff)
downloadupstream-7551ce803df9b5d68c70b1ad1f0813004f3a06a3.tar.gz
upstream-7551ce803df9b5d68c70b1ad1f0813004f3a06a3.tar.bz2
upstream-7551ce803df9b5d68c70b1ad1f0813004f3a06a3.zip
madwifi: fix locking issues in state machine changes
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@12670 3c298f89-4303-0410-b956-a3cf2f4a3e73
-rw-r--r--package/madwifi/patches/355-eap_auth_disassoc.patch14
-rw-r--r--package/madwifi/patches/370-wdsvap.patch2
-rw-r--r--package/madwifi/patches/371-wds_sta_separation.patch31
-rw-r--r--package/madwifi/patches/403-changeset_r3605.patch4
4 files changed, 8 insertions, 43 deletions
diff --git a/package/madwifi/patches/355-eap_auth_disassoc.patch b/package/madwifi/patches/355-eap_auth_disassoc.patch
index 9b589649ff..7774d6bdd5 100644
--- a/package/madwifi/patches/355-eap_auth_disassoc.patch
+++ b/package/madwifi/patches/355-eap_auth_disassoc.patch
@@ -5,21 +5,17 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--- a/ath/if_ath.c
+++ b/ath/if_ath.c
-@@ -8328,6 +8328,18 @@
+@@ -8328,6 +8328,14 @@
#endif
if (ts->ts_status & HAL_TXERR_XRETRY) {
sc->sc_stats.ast_tx_xretries++;
-+ if (SKB_CB(bf->bf_skb)->auth_pkt && (ni->ni_vap->iv_opmode == IEEE80211_M_STA)) {
-+ struct ieee80211com *ic = &sc->sc_ic;
++ if (SKB_CB(bf->bf_skb)->auth_pkt &&
++ (ni->ni_vap->iv_opmode == IEEE80211_M_STA)) {
++ struct ieee80211vap *vap = ni->ni_vap;
+
+ /* if roaming is enabled, try reassociating, otherwise
+ * disassociate and go back to the scan state */
-+ IEEE80211_VAPS_LOCK_BH(ic);
-+ if (ic->ic_roaming == IEEE80211_ROAMING_AUTO)
-+ ni->ni_vap->iv_newstate(ni->ni_vap, IEEE80211_S_ASSOC, 1);
-+ else
-+ ni->ni_vap->iv_newstate(ni->ni_vap, IEEE80211_S_SCAN, 0);
-+ IEEE80211_VAPS_UNLOCK_BH(ic);
++ vap->iv_mgtsend.function(vap->iv_mgtsend.data);
+ }
if (ni->ni_flags & IEEE80211_NODE_UAPSD_TRIG) {
ni->ni_stats.ns_tx_eosplost++;
diff --git a/package/madwifi/patches/370-wdsvap.patch b/package/madwifi/patches/370-wdsvap.patch
index 05e1ca7043..1cf334e7b6 100644
--- a/package/madwifi/patches/370-wdsvap.patch
+++ b/package/madwifi/patches/370-wdsvap.patch
@@ -77,7 +77,7 @@
rfilt |= HAL_RX_FILTER_BEACON;
if (sc->sc_nmonvaps > 0)
rfilt |= (HAL_RX_FILTER_CONTROL | HAL_RX_FILTER_BEACON |
-@@ -9030,8 +9031,6 @@
+@@ -9026,8 +9027,6 @@
* set sc->beacons if we might need to restart
* them after ath_reset. */
if (!sc->sc_beacons &&
diff --git a/package/madwifi/patches/371-wds_sta_separation.patch b/package/madwifi/patches/371-wds_sta_separation.patch
index 9178594908..a37ebd4938 100644
--- a/package/madwifi/patches/371-wds_sta_separation.patch
+++ b/package/madwifi/patches/371-wds_sta_separation.patch
@@ -486,25 +486,6 @@
/* Locking */
/* NB: beware, spin_is_locked() is not usefully defined for !(DEBUG || SMP)
* because spinlocks do not exist in this configuration. Instead IRQs
-@@ -167,6 +196,18 @@
- IEEE80211_VAPS_LOCK_ASSERT(_ic); \
- spin_unlock_bh(&(_ic)->ic_vapslock); \
- } while (0)
-+#define IEEE80211_VAPS_LOCK_IRQ(_ic) do { \
-+ unsigned long __vlockflags; \
-+ IEEE80211_VAPS_LOCK_CHECK(_ic); \
-+ spin_lock_irqsave(&(_ic)->ic_vapslock, __vlockflags);
-+#define IEEE80211_VAPS_UNLOCK_IRQ(_ic) \
-+ IEEE80211_VAPS_LOCK_ASSERT(_ic); \
-+ spin_unlock_irqrestore(&(_ic)->ic_vapslock, __vlockflags); \
-+} while (0)
-+#define IEEE80211_VAPS_UNLOCK_IRQ_EARLY(_ic) \
-+ IEEE80211_VAPS_LOCK_ASSERT(_ic); \
-+ spin_unlock_irqrestore(&(_ic)->ic_vapslock, __vlockflags);
-+
-
- #if (defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)) && defined(spin_is_locked)
- #define IEEE80211_VAPS_LOCK_ASSERT(_ic) \
--- a/net80211/ieee80211_proto.c
+++ b/net80211/ieee80211_proto.c
@@ -1081,6 +1081,8 @@
@@ -550,18 +531,6 @@
ieee80211_new_state(vap, IEEE80211_S_INIT, -1);
if (dev->flags & IFF_RUNNING) {
dev->flags &= ~IFF_RUNNING; /* mark us stopped */
-@@ -1342,9 +1366,9 @@
- struct ieee80211com *ic = vap->iv_ic;
- int rc;
-
-- IEEE80211_VAPS_LOCK_BH(ic);
-+ IEEE80211_VAPS_LOCK_IRQ(ic);
- rc = vap->iv_newstate(vap, nstate, arg);
-- IEEE80211_VAPS_UNLOCK_BH(ic);
-+ IEEE80211_VAPS_UNLOCK_IRQ(ic);
- return rc;
- }
-
@@ -1630,6 +1654,7 @@
*/
if (ni->ni_authmode != IEEE80211_AUTH_8021X)
diff --git a/package/madwifi/patches/403-changeset_r3605.patch b/package/madwifi/patches/403-changeset_r3605.patch
index 18e377d642..48981ec13b 100644
--- a/package/madwifi/patches/403-changeset_r3605.patch
+++ b/package/madwifi/patches/403-changeset_r3605.patch
@@ -16,7 +16,7 @@
#endif /* _ATH_COMPAT_H_ */
--- a/net80211/ieee80211_linux.h
+++ b/net80211/ieee80211_linux.h
-@@ -350,13 +350,6 @@
+@@ -338,13 +338,6 @@
#define ACL_LOCK_CHECK(_as)
#endif
@@ -30,7 +30,7 @@
/*
* Per-node power-save queue definitions. Beware of control
* flow with IEEE80211_NODE_SAVEQ_LOCK/IEEE80211_NODE_SAVEQ_UNLOCK.
-@@ -400,16 +393,16 @@
+@@ -388,16 +381,16 @@
_skb = __skb_dequeue(&(_ni)->ni_savedq); \
(_qlen) = skb_queue_len(&(_ni)->ni_savedq); \
} while (0)