madwifi: fix locking issues in state machine changes
SVN-Revision: 12670
This commit is contained in:
		| @@ -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++; | ||||
|   | ||||
| @@ -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 && | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Felix Fietkau
					Felix Fietkau