Commit 51dea9be authored by Felix Fietkau's avatar Felix Fietkau Committed by John W. Linville

ath9k: fix PA linearization calibration related crash

Before PAPRD training can run, the card needs to have sent a packet for
thermal calibration. Sending a dummy packet with the PAPRD training flag
set causes a crash under some circumstance.
Fix the code by replacing the dummy tx with a delay that waits for a
real packet tx to have occurred.
Signed-off-by: default avatarFelix Fietkau <nbd@openwrt.org>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 1630d25f
...@@ -1775,6 +1775,8 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, ...@@ -1775,6 +1775,8 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
/* Operating channel changed, reset channel calibration data */ /* Operating channel changed, reset channel calibration data */
memset(caldata, 0, sizeof(*caldata)); memset(caldata, 0, sizeof(*caldata));
ath9k_init_nfcal_hist_buffer(ah, chan); ath9k_init_nfcal_hist_buffer(ah, chan);
} else if (caldata) {
caldata->paprd_packet_sent = false;
} }
ah->noise = ath9k_hw_getchan_noise(ah, chan); ah->noise = ath9k_hw_getchan_noise(ah, chan);
......
...@@ -405,6 +405,7 @@ struct ath9k_hw_cal_data { ...@@ -405,6 +405,7 @@ struct ath9k_hw_cal_data {
int8_t iCoff; int8_t iCoff;
int8_t qCoff; int8_t qCoff;
bool rtt_done; bool rtt_done;
bool paprd_packet_sent;
bool paprd_done; bool paprd_done;
bool nfcal_pending; bool nfcal_pending;
bool nfcal_interference; bool nfcal_interference;
......
...@@ -256,7 +256,7 @@ void ath_paprd_calibrate(struct work_struct *work) ...@@ -256,7 +256,7 @@ void ath_paprd_calibrate(struct work_struct *work)
int len = 1800; int len = 1800;
int ret; int ret;
if (!caldata) if (!caldata || !caldata->paprd_packet_sent || caldata->paprd_done)
return; return;
ath9k_ps_wakeup(sc); ath9k_ps_wakeup(sc);
...@@ -283,13 +283,6 @@ void ath_paprd_calibrate(struct work_struct *work) ...@@ -283,13 +283,6 @@ void ath_paprd_calibrate(struct work_struct *work)
continue; continue;
chain_ok = 0; 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); ar9003_paprd_setup_gain_table(ah, chain);
ath_dbg(common, CALIBRATE, ath_dbg(common, CALIBRATE,
......
...@@ -2018,6 +2018,9 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb, ...@@ -2018,6 +2018,9 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
ath_dbg(common, XMIT, "TX complete: skb: %p\n", skb); 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)) if (!(tx_flags & ATH_TX_ERROR))
/* Frame was ACKed */ /* Frame was ACKed */
tx_info->flags |= IEEE80211_TX_STAT_ACK; tx_info->flags |= IEEE80211_TX_STAT_ACK;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment