Skip to content

Commit

Permalink
ath9k: fix PA linearization calibration related crash
Browse files Browse the repository at this point in the history
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: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Felix Fietkau authored and John W. Linville committed Sep 5, 2012
1 parent 1630d25 commit 51dea9b
Show file tree
Hide file tree
Showing 4 changed files with 7 additions and 8 deletions.
2 changes: 2 additions & 0 deletions drivers/net/wireless/ath/ath9k/hw.c
Original file line number Diff line number Diff line change
Expand Up @@ -1775,6 +1775,8 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
/* 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);

Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/ath/ath9k/hw.h
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,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;
Expand Down
9 changes: 1 addition & 8 deletions drivers/net/wireless/ath/ath9k/link.c
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,7 @@ void ath_paprd_calibrate(struct work_struct *work)
int len = 1800;
int ret;

if (!caldata)
if (!caldata || !caldata->paprd_packet_sent || caldata->paprd_done)
return;

ath9k_ps_wakeup(sc);
Expand All @@ -283,13 +283,6 @@ void ath_paprd_calibrate(struct work_struct *work)
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,
Expand Down
3 changes: 3 additions & 0 deletions drivers/net/wireless/ath/ath9k/xmit.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

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;
Expand Down

0 comments on commit 51dea9b

Please sign in to comment.