|
|
@@ -1,3 +1,16 @@
|
|
|
+commit 60ccc107c9b9fb732fdee1f76bb2dad44f0e1798
|
|
|
+Author: Rajkumar Manoharan <[email protected]>
|
|
|
+Date: Tue May 27 16:58:02 2014 +0530
|
|
|
+
|
|
|
+ ath9k: Fix deadlock while updating p2p beacon timer
|
|
|
+
|
|
|
+ pm_lock is taken twice while syncing HW TSF of p2p vif.
|
|
|
+ Fix this by taking the lock at caller side.
|
|
|
+
|
|
|
+ Cc: Felix Fietkau <[email protected]>
|
|
|
+ Signed-off-by: Rajkumar Manoharan <[email protected]>
|
|
|
+ Signed-off-by: John W. Linville <[email protected]>
|
|
|
+
|
|
|
commit f3831a4e3903dbc1a57d5df56deb6a143fd001bc
|
|
|
Author: Stanislaw Gruszka <[email protected]>
|
|
|
Date: Thu Jun 5 13:52:27 2014 +0200
|
|
|
@@ -684,3 +697,51 @@ Date: Mon May 19 21:20:49 2014 +0200
|
|
|
ENTRY_OWNER_DEVICE_DATA,
|
|
|
ENTRY_DATA_PENDING,
|
|
|
ENTRY_DATA_IO_FAILED,
|
|
|
+--- a/drivers/net/wireless/ath/ath9k/main.c
|
|
|
++++ b/drivers/net/wireless/ath/ath9k/main.c
|
|
|
+@@ -1757,7 +1757,6 @@ out:
|
|
|
+ void ath9k_update_p2p_ps(struct ath_softc *sc, struct ieee80211_vif *vif)
|
|
|
+ {
|
|
|
+ struct ath_vif *avp = (void *)vif->drv_priv;
|
|
|
+- unsigned long flags;
|
|
|
+ u32 tsf;
|
|
|
+
|
|
|
+ if (!sc->p2p_ps_timer)
|
|
|
+@@ -1767,14 +1766,9 @@ void ath9k_update_p2p_ps(struct ath_soft
|
|
|
+ return;
|
|
|
+
|
|
|
+ sc->p2p_ps_vif = avp;
|
|
|
+-
|
|
|
+- spin_lock_irqsave(&sc->sc_pm_lock, flags);
|
|
|
+- if (!(sc->ps_flags & PS_BEACON_SYNC)) {
|
|
|
+- tsf = ath9k_hw_gettsf32(sc->sc_ah);
|
|
|
+- ieee80211_parse_p2p_noa(&vif->bss_conf.p2p_noa_attr, &avp->noa, tsf);
|
|
|
+- ath9k_update_p2p_ps_timer(sc, avp);
|
|
|
+- }
|
|
|
+- spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
|
|
|
++ tsf = ath9k_hw_gettsf32(sc->sc_ah);
|
|
|
++ ieee80211_parse_p2p_noa(&vif->bss_conf.p2p_noa_attr, &avp->noa, tsf);
|
|
|
++ ath9k_update_p2p_ps_timer(sc, avp);
|
|
|
+ }
|
|
|
+
|
|
|
+ static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
|
|
|
+@@ -1791,6 +1785,7 @@ static void ath9k_bss_info_changed(struc
|
|
|
+ struct ath_hw *ah = sc->sc_ah;
|
|
|
+ struct ath_common *common = ath9k_hw_common(ah);
|
|
|
+ struct ath_vif *avp = (void *)vif->drv_priv;
|
|
|
++ unsigned long flags;
|
|
|
+ int slottime;
|
|
|
+
|
|
|
+ ath9k_ps_wakeup(sc);
|
|
|
+@@ -1853,7 +1848,10 @@ static void ath9k_bss_info_changed(struc
|
|
|
+
|
|
|
+ if (changed & BSS_CHANGED_P2P_PS) {
|
|
|
+ spin_lock_bh(&sc->sc_pcu_lock);
|
|
|
+- ath9k_update_p2p_ps(sc, vif);
|
|
|
++ spin_lock_irqsave(&sc->sc_pm_lock, flags);
|
|
|
++ if (!(sc->ps_flags & PS_BEACON_SYNC))
|
|
|
++ ath9k_update_p2p_ps(sc, vif);
|
|
|
++ spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
|
|
|
+ spin_unlock_bh(&sc->sc_pcu_lock);
|
|
|
+ }
|
|
|
+
|