mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-12-25 14:29:53 +02:00
madwifi: fix locking issues in state machine changes
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@12670 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
parent
1e232a2ad2
commit
a0d42d3cda
@ -5,21 +5,17 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
|||||||
|
|
||||||
--- a/ath/if_ath.c
|
--- a/ath/if_ath.c
|
||||||
+++ b/ath/if_ath.c
|
+++ b/ath/if_ath.c
|
||||||
@@ -8328,6 +8328,18 @@
|
@@ -8328,6 +8328,14 @@
|
||||||
#endif
|
#endif
|
||||||
if (ts->ts_status & HAL_TXERR_XRETRY) {
|
if (ts->ts_status & HAL_TXERR_XRETRY) {
|
||||||
sc->sc_stats.ast_tx_xretries++;
|
sc->sc_stats.ast_tx_xretries++;
|
||||||
+ if (SKB_CB(bf->bf_skb)->auth_pkt && (ni->ni_vap->iv_opmode == IEEE80211_M_STA)) {
|
+ if (SKB_CB(bf->bf_skb)->auth_pkt &&
|
||||||
+ struct ieee80211com *ic = &sc->sc_ic;
|
+ (ni->ni_vap->iv_opmode == IEEE80211_M_STA)) {
|
||||||
|
+ struct ieee80211vap *vap = ni->ni_vap;
|
||||||
+
|
+
|
||||||
+ /* if roaming is enabled, try reassociating, otherwise
|
+ /* if roaming is enabled, try reassociating, otherwise
|
||||||
+ * disassociate and go back to the scan state */
|
+ * disassociate and go back to the scan state */
|
||||||
+ IEEE80211_VAPS_LOCK_BH(ic);
|
+ vap->iv_mgtsend.function(vap->iv_mgtsend.data);
|
||||||
+ 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);
|
|
||||||
+ }
|
+ }
|
||||||
if (ni->ni_flags & IEEE80211_NODE_UAPSD_TRIG) {
|
if (ni->ni_flags & IEEE80211_NODE_UAPSD_TRIG) {
|
||||||
ni->ni_stats.ns_tx_eosplost++;
|
ni->ni_stats.ns_tx_eosplost++;
|
||||||
|
@ -77,7 +77,7 @@
|
|||||||
rfilt |= HAL_RX_FILTER_BEACON;
|
rfilt |= HAL_RX_FILTER_BEACON;
|
||||||
if (sc->sc_nmonvaps > 0)
|
if (sc->sc_nmonvaps > 0)
|
||||||
rfilt |= (HAL_RX_FILTER_CONTROL | HAL_RX_FILTER_BEACON |
|
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
|
* set sc->beacons if we might need to restart
|
||||||
* them after ath_reset. */
|
* them after ath_reset. */
|
||||||
if (!sc->sc_beacons &&
|
if (!sc->sc_beacons &&
|
||||||
|
@ -486,25 +486,6 @@
|
|||||||
/* Locking */
|
/* Locking */
|
||||||
/* NB: beware, spin_is_locked() is not usefully defined for !(DEBUG || SMP)
|
/* NB: beware, spin_is_locked() is not usefully defined for !(DEBUG || SMP)
|
||||||
* because spinlocks do not exist in this configuration. Instead IRQs
|
* 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
|
--- a/net80211/ieee80211_proto.c
|
||||||
+++ b/net80211/ieee80211_proto.c
|
+++ b/net80211/ieee80211_proto.c
|
||||||
@@ -1081,6 +1081,8 @@
|
@@ -1081,6 +1081,8 @@
|
||||||
@ -550,18 +531,6 @@
|
|||||||
ieee80211_new_state(vap, IEEE80211_S_INIT, -1);
|
ieee80211_new_state(vap, IEEE80211_S_INIT, -1);
|
||||||
if (dev->flags & IFF_RUNNING) {
|
if (dev->flags & IFF_RUNNING) {
|
||||||
dev->flags &= ~IFF_RUNNING; /* mark us stopped */
|
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 @@
|
@@ -1630,6 +1654,7 @@
|
||||||
*/
|
*/
|
||||||
if (ni->ni_authmode != IEEE80211_AUTH_8021X)
|
if (ni->ni_authmode != IEEE80211_AUTH_8021X)
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
#endif /* _ATH_COMPAT_H_ */
|
#endif /* _ATH_COMPAT_H_ */
|
||||||
--- a/net80211/ieee80211_linux.h
|
--- a/net80211/ieee80211_linux.h
|
||||||
+++ b/net80211/ieee80211_linux.h
|
+++ b/net80211/ieee80211_linux.h
|
||||||
@@ -350,13 +350,6 @@
|
@@ -338,13 +338,6 @@
|
||||||
#define ACL_LOCK_CHECK(_as)
|
#define ACL_LOCK_CHECK(_as)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -30,7 +30,7 @@
|
|||||||
/*
|
/*
|
||||||
* Per-node power-save queue definitions. Beware of control
|
* Per-node power-save queue definitions. Beware of control
|
||||||
* flow with IEEE80211_NODE_SAVEQ_LOCK/IEEE80211_NODE_SAVEQ_UNLOCK.
|
* flow with IEEE80211_NODE_SAVEQ_LOCK/IEEE80211_NODE_SAVEQ_UNLOCK.
|
||||||
@@ -400,16 +393,16 @@
|
@@ -388,16 +381,16 @@
|
||||||
_skb = __skb_dequeue(&(_ni)->ni_savedq); \
|
_skb = __skb_dequeue(&(_ni)->ni_savedq); \
|
||||||
(_qlen) = skb_queue_len(&(_ni)->ni_savedq); \
|
(_qlen) = skb_queue_len(&(_ni)->ni_savedq); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
Loading…
Reference in New Issue
Block a user