From: Felix Fietkau Date: Thu, 5 Jun 2014 14:55:03 +0000 (+0000) Subject: ath9k: merge a p2p powersave handling fix X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=b7ce76b4b9ee2f6ec567e66a98c85f4037b5c127;p=openwrt%2Fstaging%2Fnbd.git ath9k: merge a p2p powersave handling fix Signed-off-by: Felix Fietkau SVN-Revision: 41017 --- diff --git a/package/kernel/mac80211/patches/300-pending_work.patch b/package/kernel/mac80211/patches/300-pending_work.patch index a1750e6e30..df492bb812 100644 --- a/package/kernel/mac80211/patches/300-pending_work.patch +++ b/package/kernel/mac80211/patches/300-pending_work.patch @@ -1,3 +1,16 @@ +commit 60ccc107c9b9fb732fdee1f76bb2dad44f0e1798 +Author: Rajkumar Manoharan +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 + Signed-off-by: Rajkumar Manoharan + Signed-off-by: John W. Linville + commit f3831a4e3903dbc1a57d5df56deb6a143fd001bc Author: Stanislaw Gruszka 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); + } +