diff options
| -rw-r--r-- | package/mac80211/patches/575-ath9k_fix_paprd_crash.patch | 58 | 
1 files changed, 58 insertions, 0 deletions
| diff --git a/package/mac80211/patches/575-ath9k_fix_paprd_crash.patch b/package/mac80211/patches/575-ath9k_fix_paprd_crash.patch new file mode 100644 index 000000000..1e74a6bd2 --- /dev/null +++ b/package/mac80211/patches/575-ath9k_fix_paprd_crash.patch @@ -0,0 +1,58 @@ +--- a/drivers/net/wireless/ath/ath9k/hw.h ++++ b/drivers/net/wireless/ath/ath9k/hw.h +@@ -404,6 +404,7 @@ struct ath9k_hw_cal_data { + 	int8_t iCoff; + 	int8_t qCoff; + 	bool rtt_done; ++	bool paprd_packet_sent; + 	bool paprd_done; + 	bool nfcal_pending; + 	bool nfcal_interference; +--- a/drivers/net/wireless/ath/ath9k/hw.c ++++ b/drivers/net/wireless/ath/ath9k/hw.c +@@ -1780,6 +1780,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st + 		/* Operating channel changed, reset channel calibration data */ + 		memset(caldata, 0, sizeof(*caldata)); + 		ath9k_init_nfcal_hist_buffer(ah, chan); ++	} else if (caldata) { ++		caldata->paprd_packet_sent = false; + 	} + 	ah->noise = ath9k_hw_getchan_noise(ah, chan); +  +--- a/drivers/net/wireless/ath/ath9k/xmit.c ++++ b/drivers/net/wireless/ath/ath9k/xmit.c +@@ -2028,6 +2028,9 @@ static void ath_tx_complete(struct ath_s +  + 	ath_dbg(common, XMIT, "TX complete: skb: %p\n", skb); +  ++	if (sc->sc_ah->caldata) ++		sc->sc_ah->caldata->paprd_packet_sent = true; ++ + 	if (!(tx_flags & ATH_TX_ERROR)) + 		/* Frame was ACKed */ + 		tx_info->flags |= IEEE80211_TX_STAT_ACK; +--- a/drivers/net/wireless/ath/ath9k/link.c ++++ b/drivers/net/wireless/ath/ath9k/link.c +@@ -256,7 +256,7 @@ void ath_paprd_calibrate(struct work_str + 	int len = 1800; + 	int ret; +  +-	if (!caldata) ++	if (!caldata || !caldata->paprd_packet_sent || caldata->paprd_done) + 		return; +  + 	ath9k_ps_wakeup(sc); +@@ -283,13 +283,6 @@ void ath_paprd_calibrate(struct work_str + 			continue; +  + 		chain_ok = 0; +- +-		ath_dbg(common, CALIBRATE, +-			"Sending PAPRD frame for thermal measurement on chain %d\n", +-			chain); +-		if (!ath_paprd_send_frame(sc, skb, chain)) +-			goto fail_paprd; +- + 		ar9003_paprd_setup_gain_table(ah, chain); +  + 		ath_dbg(common, CALIBRATE, | 
