ath9k: merge a p2p powersave handling fix
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 41017
This commit is contained in:
		@@ -1,3 +1,16 @@
 | 
				
			|||||||
 | 
					commit 60ccc107c9b9fb732fdee1f76bb2dad44f0e1798
 | 
				
			||||||
 | 
					Author: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
 | 
				
			||||||
 | 
					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 <nbd@openwrt.org>
 | 
				
			||||||
 | 
					    Signed-off-by: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
 | 
				
			||||||
 | 
					    Signed-off-by: John W. Linville <linville@tuxdriver.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
commit f3831a4e3903dbc1a57d5df56deb6a143fd001bc
 | 
					commit f3831a4e3903dbc1a57d5df56deb6a143fd001bc
 | 
				
			||||||
Author: Stanislaw Gruszka <sgruszka@redhat.com>
 | 
					Author: Stanislaw Gruszka <sgruszka@redhat.com>
 | 
				
			||||||
Date:   Thu Jun 5 13:52:27 2014 +0200
 | 
					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_OWNER_DEVICE_DATA,
 | 
				
			||||||
 	ENTRY_DATA_PENDING,
 | 
					 	ENTRY_DATA_PENDING,
 | 
				
			||||||
 	ENTRY_DATA_IO_FAILED,
 | 
					 	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);
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user