aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/ath/ath10k/htt_rx.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c
index 77cdc21e28d7..80cdac15588a 100644
--- a/drivers/net/wireless/ath/ath10k/htt_rx.c
+++ b/drivers/net/wireless/ath/ath10k/htt_rx.c
@@ -308,7 +308,8 @@ static void ath10k_htt_rx_free_msdu_chain(struct sk_buff *skb)
308static int ath10k_htt_rx_amsdu_pop(struct ath10k_htt *htt, 308static int ath10k_htt_rx_amsdu_pop(struct ath10k_htt *htt,
309 u8 **fw_desc, int *fw_desc_len, 309 u8 **fw_desc, int *fw_desc_len,
310 struct sk_buff **head_msdu, 310 struct sk_buff **head_msdu,
311 struct sk_buff **tail_msdu) 311 struct sk_buff **tail_msdu,
312 u32 *attention)
312{ 313{
313 int msdu_len, msdu_chaining = 0; 314 int msdu_len, msdu_chaining = 0;
314 struct sk_buff *msdu; 315 struct sk_buff *msdu;
@@ -358,6 +359,11 @@ static int ath10k_htt_rx_amsdu_pop(struct ath10k_htt *htt,
358 break; 359 break;
359 } 360 }
360 361
362 *attention |= __le32_to_cpu(rx_desc->attention.flags) &
363 (RX_ATTENTION_FLAGS_TKIP_MIC_ERR |
364 RX_ATTENTION_FLAGS_DECRYPT_ERR |
365 RX_ATTENTION_FLAGS_FCS_ERR |
366 RX_ATTENTION_FLAGS_MGMT_TYPE);
361 /* 367 /*
362 * Copy the FW rx descriptor for this MSDU from the rx 368 * Copy the FW rx descriptor for this MSDU from the rx
363 * indication message into the MSDU's netbuf. HL uses the 369 * indication message into the MSDU's netbuf. HL uses the
@@ -1216,13 +1222,15 @@ static void ath10k_htt_rx_handler(struct ath10k_htt *htt,
1216 for (j = 0; j < mpdu_ranges[i].mpdu_count; j++) { 1222 for (j = 0; j < mpdu_ranges[i].mpdu_count; j++) {
1217 struct sk_buff *msdu_head, *msdu_tail; 1223 struct sk_buff *msdu_head, *msdu_tail;
1218 1224
1225 attention = 0;
1219 msdu_head = NULL; 1226 msdu_head = NULL;
1220 msdu_tail = NULL; 1227 msdu_tail = NULL;
1221 ret = ath10k_htt_rx_amsdu_pop(htt, 1228 ret = ath10k_htt_rx_amsdu_pop(htt,
1222 &fw_desc, 1229 &fw_desc,
1223 &fw_desc_len, 1230 &fw_desc_len,
1224 &msdu_head, 1231 &msdu_head,
1225 &msdu_tail); 1232 &msdu_tail,
1233 &attention);
1226 1234
1227 if (ret < 0) { 1235 if (ret < 0) {
1228 ath10k_warn("failed to pop amsdu from htt rx ring %d\n", 1236 ath10k_warn("failed to pop amsdu from htt rx ring %d\n",
@@ -1234,7 +1242,6 @@ static void ath10k_htt_rx_handler(struct ath10k_htt *htt,
1234 rxd = container_of((void *)msdu_head->data, 1242 rxd = container_of((void *)msdu_head->data,
1235 struct htt_rx_desc, 1243 struct htt_rx_desc,
1236 msdu_payload); 1244 msdu_payload);
1237 attention = __le32_to_cpu(rxd->attention.flags);
1238 1245
1239 if (!ath10k_htt_rx_amsdu_allowed(htt, msdu_head, 1246 if (!ath10k_htt_rx_amsdu_allowed(htt, msdu_head,
1240 status, 1247 status,
@@ -1287,6 +1294,7 @@ static void ath10k_htt_rx_frag_handler(struct ath10k_htt *htt,
1287 u8 *fw_desc; 1294 u8 *fw_desc;
1288 int fw_desc_len, hdrlen, paramlen; 1295 int fw_desc_len, hdrlen, paramlen;
1289 int trim; 1296 int trim;
1297 u32 attention = 0;
1290 1298
1291 fw_desc_len = __le16_to_cpu(frag->fw_rx_desc_bytes); 1299 fw_desc_len = __le16_to_cpu(frag->fw_rx_desc_bytes);
1292 fw_desc = (u8 *)frag->fw_msdu_rx_desc; 1300 fw_desc = (u8 *)frag->fw_msdu_rx_desc;
@@ -1296,7 +1304,8 @@ static void ath10k_htt_rx_frag_handler(struct ath10k_htt *htt,
1296 1304
1297 spin_lock_bh(&htt->rx_ring.lock); 1305 spin_lock_bh(&htt->rx_ring.lock);
1298 ret = ath10k_htt_rx_amsdu_pop(htt, &fw_desc, &fw_desc_len, 1306 ret = ath10k_htt_rx_amsdu_pop(htt, &fw_desc, &fw_desc_len,
1299 &msdu_head, &msdu_tail); 1307 &msdu_head, &msdu_tail,
1308 &attention);
1300 spin_unlock_bh(&htt->rx_ring.lock); 1309 spin_unlock_bh(&htt->rx_ring.lock);
1301 1310
1302 ath10k_dbg(ATH10K_DBG_HTT_DUMP, "htt rx frag ahead\n"); 1311 ath10k_dbg(ATH10K_DBG_HTT_DUMP, "htt rx frag ahead\n");
@@ -1313,10 +1322,8 @@ static void ath10k_htt_rx_frag_handler(struct ath10k_htt *htt,
1313 1322
1314 hdr = (struct ieee80211_hdr *)msdu_head->data; 1323 hdr = (struct ieee80211_hdr *)msdu_head->data;
1315 rxd = (void *)msdu_head->data - sizeof(*rxd); 1324 rxd = (void *)msdu_head->data - sizeof(*rxd);
1316 tkip_mic_err = !!(__le32_to_cpu(rxd->attention.flags) & 1325 tkip_mic_err = !!(attention & RX_ATTENTION_FLAGS_TKIP_MIC_ERR);
1317 RX_ATTENTION_FLAGS_TKIP_MIC_ERR); 1326 decrypt_err = !!(attention & RX_ATTENTION_FLAGS_DECRYPT_ERR);
1318 decrypt_err = !!(__le32_to_cpu(rxd->attention.flags) &
1319 RX_ATTENTION_FLAGS_DECRYPT_ERR);
1320 fmt = MS(__le32_to_cpu(rxd->msdu_start.info1), 1327 fmt = MS(__le32_to_cpu(rxd->msdu_start.info1),
1321 RX_MSDU_START_INFO1_DECAP_FORMAT); 1328 RX_MSDU_START_INFO1_DECAP_FORMAT);
1322 1329