Index: chromeos/compat-wireless/drivers/net/wireless/ath/ath9k/recv.c |
diff --git a/chromeos/compat-wireless/drivers/net/wireless/ath/ath9k/recv.c b/chromeos/compat-wireless/drivers/net/wireless/ath/ath9k/recv.c |
index c7b14b2b279efdcd2dae3e86faeccad0da4845a5..a7fdba03860fd714c98e6fc052961ede6a654aaf 100644 |
--- a/chromeos/compat-wireless/drivers/net/wireless/ath/ath9k/recv.c |
+++ b/chromeos/compat-wireless/drivers/net/wireless/ath/ath9k/recv.c |
@@ -1082,6 +1082,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp) |
struct ieee80211_rx_status *rxs; |
struct ath_hw *ah = sc->sc_ah; |
struct ath_common *common = ath9k_hw_common(ah); |
+ u32 *rx_desc = NULL; |
/* |
* The hw can techncically differ from common->hw when using ath9k |
* virtual wiphy so to account for that we iterate over the active |
@@ -1174,12 +1175,24 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp) |
dma_type); |
skb_put(skb, rs.rs_datalen + ah->caps.rx_status_len); |
- if (ah->caps.rx_status_len) |
+ if (ah->caps.rx_status_len) { |
+ rx_desc = kzalloc(ah->caps.rx_status_len, GFP_ATOMIC); |
+ if (rx_desc == NULL) |
+ BUG_ON(1); |
+ memcpy(rx_desc, skb->data, ah->caps.rx_status_len); |
skb_pull(skb, ah->caps.rx_status_len); |
+ } |
ath9k_rx_skb_postprocess(common, skb, &rs, |
rxs, decrypt_error); |
+ if (rx_desc) { |
+ ath_pktlog_rx(sc, (void *) rx_desc, skb); |
+ kfree(rx_desc); |
+ } else { |
+ ath_pktlog_rx(sc, bf->bf_desc, skb); |
+ } |
+ |
/* We will now give hardware our shiny new allocated skb */ |
bf->bf_mpdu = requeue_skb; |
bf->bf_buf_addr = dma_map_single(sc->dev, requeue_skb->data, |