dp_mon.c 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127
  1. // SPDX-License-Identifier: BSD-3-Clause-Clear
  2. /*
  3. * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
  4. * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
  5. */
  6. #include "dp_mon.h"
  7. #include "debug.h"
  8. #include "dp_tx.h"
  9. #include "peer.h"
  10. static void
  11. ath12k_dp_mon_fill_rx_stats_info(struct hal_rx_mon_ppdu_info *ppdu_info,
  12. struct ieee80211_rx_status *rx_status)
  13. {
  14. u32 center_freq = ppdu_info->freq;
  15. rx_status->freq = center_freq;
  16. rx_status->bw = ath12k_mac_bw_to_mac80211_bw(ppdu_info->bw);
  17. rx_status->nss = ppdu_info->nss;
  18. rx_status->rate_idx = 0;
  19. rx_status->encoding = RX_ENC_LEGACY;
  20. rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL;
  21. if (center_freq >= ATH12K_MIN_6GHZ_FREQ &&
  22. center_freq <= ATH12K_MAX_6GHZ_FREQ) {
  23. rx_status->band = NL80211_BAND_6GHZ;
  24. } else if (center_freq >= ATH12K_MIN_2GHZ_FREQ &&
  25. center_freq <= ATH12K_MAX_2GHZ_FREQ) {
  26. rx_status->band = NL80211_BAND_2GHZ;
  27. } else if (center_freq >= ATH12K_MIN_5GHZ_FREQ &&
  28. center_freq <= ATH12K_MAX_5GHZ_FREQ) {
  29. rx_status->band = NL80211_BAND_5GHZ;
  30. } else {
  31. rx_status->band = NUM_NL80211_BANDS;
  32. }
  33. }
  34. struct sk_buff
  35. *ath12k_dp_rx_alloc_mon_status_buf(struct ath12k_base *ab,
  36. struct dp_rxdma_mon_ring *rx_ring,
  37. int *buf_id)
  38. {
  39. struct sk_buff *skb;
  40. dma_addr_t paddr;
  41. skb = dev_alloc_skb(RX_MON_STATUS_BUF_SIZE);
  42. if (!skb)
  43. goto fail_alloc_skb;
  44. if (!IS_ALIGNED((unsigned long)skb->data,
  45. RX_MON_STATUS_BUF_ALIGN)) {
  46. skb_pull(skb, PTR_ALIGN(skb->data, RX_MON_STATUS_BUF_ALIGN) -
  47. skb->data);
  48. }
  49. paddr = dma_map_single(ab->dev, skb->data,
  50. skb->len + skb_tailroom(skb),
  51. DMA_FROM_DEVICE);
  52. if (unlikely(dma_mapping_error(ab->dev, paddr)))
  53. goto fail_free_skb;
  54. spin_lock_bh(&rx_ring->idr_lock);
  55. *buf_id = idr_alloc(&rx_ring->bufs_idr, skb, 0,
  56. rx_ring->bufs_max, GFP_ATOMIC);
  57. spin_unlock_bh(&rx_ring->idr_lock);
  58. if (*buf_id < 0)
  59. goto fail_dma_unmap;
  60. ATH12K_SKB_RXCB(skb)->paddr = paddr;
  61. return skb;
  62. fail_dma_unmap:
  63. dma_unmap_single(ab->dev, paddr, skb->len + skb_tailroom(skb),
  64. DMA_FROM_DEVICE);
  65. fail_free_skb:
  66. dev_kfree_skb_any(skb);
  67. fail_alloc_skb:
  68. return NULL;
  69. }
  70. EXPORT_SYMBOL(ath12k_dp_rx_alloc_mon_status_buf);
  71. u32 ath12k_dp_mon_comp_ppduid(u32 msdu_ppdu_id, u32 *ppdu_id)
  72. {
  73. u32 ret = 0;
  74. if ((*ppdu_id < msdu_ppdu_id) &&
  75. ((msdu_ppdu_id - *ppdu_id) < DP_NOT_PPDU_ID_WRAP_AROUND)) {
  76. /* Hold on mon dest ring, and reap mon status ring. */
  77. *ppdu_id = msdu_ppdu_id;
  78. ret = msdu_ppdu_id;
  79. } else if ((*ppdu_id > msdu_ppdu_id) &&
  80. ((*ppdu_id - msdu_ppdu_id) > DP_NOT_PPDU_ID_WRAP_AROUND)) {
  81. /* PPDU ID has exceeded the maximum value and will
  82. * restart from 0.
  83. */
  84. *ppdu_id = msdu_ppdu_id;
  85. ret = msdu_ppdu_id;
  86. }
  87. return ret;
  88. }
  89. EXPORT_SYMBOL(ath12k_dp_mon_comp_ppduid);
  90. static void
  91. ath12k_dp_mon_fill_rx_rate(struct ath12k_pdev_dp *dp_pdev,
  92. struct hal_rx_mon_ppdu_info *ppdu_info,
  93. struct ieee80211_rx_status *rx_status)
  94. {
  95. struct ath12k_dp *dp = dp_pdev->dp;
  96. struct ath12k_base *ab = dp->ab;
  97. struct ieee80211_supported_band *sband;
  98. enum rx_msdu_start_pkt_type pkt_type;
  99. u8 rate_mcs, nss, sgi;
  100. bool is_cck;
  101. pkt_type = ppdu_info->preamble_type;
  102. rate_mcs = ppdu_info->rate;
  103. nss = ppdu_info->nss;
  104. sgi = ppdu_info->gi;
  105. switch (pkt_type) {
  106. case RX_MSDU_START_PKT_TYPE_11A:
  107. case RX_MSDU_START_PKT_TYPE_11B:
  108. is_cck = (pkt_type == RX_MSDU_START_PKT_TYPE_11B);
  109. if (rx_status->band < NUM_NL80211_BANDS) {
  110. struct ath12k *ar = ath12k_pdev_dp_to_ar(dp_pdev);
  111. sband = &ar->mac.sbands[rx_status->band];
  112. rx_status->rate_idx = ath12k_mac_hw_rate_to_idx(sband, rate_mcs,
  113. is_cck);
  114. }
  115. break;
  116. case RX_MSDU_START_PKT_TYPE_11N:
  117. rx_status->encoding = RX_ENC_HT;
  118. if (rate_mcs > ATH12K_HT_MCS_MAX) {
  119. ath12k_warn(ab,
  120. "Received with invalid mcs in HT mode %d\n",
  121. rate_mcs);
  122. break;
  123. }
  124. rx_status->rate_idx = rate_mcs + (8 * (nss - 1));
  125. if (sgi)
  126. rx_status->enc_flags |= RX_ENC_FLAG_SHORT_GI;
  127. break;
  128. case RX_MSDU_START_PKT_TYPE_11AC:
  129. rx_status->encoding = RX_ENC_VHT;
  130. rx_status->rate_idx = rate_mcs;
  131. if (rate_mcs > ATH12K_VHT_MCS_MAX) {
  132. ath12k_warn(ab,
  133. "Received with invalid mcs in VHT mode %d\n",
  134. rate_mcs);
  135. break;
  136. }
  137. if (sgi)
  138. rx_status->enc_flags |= RX_ENC_FLAG_SHORT_GI;
  139. break;
  140. case RX_MSDU_START_PKT_TYPE_11AX:
  141. rx_status->rate_idx = rate_mcs;
  142. if (rate_mcs > ATH12K_HE_MCS_MAX) {
  143. ath12k_warn(ab,
  144. "Received with invalid mcs in HE mode %d\n",
  145. rate_mcs);
  146. break;
  147. }
  148. rx_status->encoding = RX_ENC_HE;
  149. rx_status->he_gi = ath12k_he_gi_to_nl80211_he_gi(sgi);
  150. break;
  151. case RX_MSDU_START_PKT_TYPE_11BE:
  152. rx_status->rate_idx = rate_mcs;
  153. if (rate_mcs > ATH12K_EHT_MCS_MAX) {
  154. ath12k_warn(ab,
  155. "Received with invalid mcs in EHT mode %d\n",
  156. rate_mcs);
  157. break;
  158. }
  159. rx_status->encoding = RX_ENC_EHT;
  160. rx_status->he_gi = ath12k_he_gi_to_nl80211_he_gi(sgi);
  161. break;
  162. default:
  163. ath12k_dbg(ab, ATH12K_DBG_DATA,
  164. "monitor receives invalid preamble type %d",
  165. pkt_type);
  166. break;
  167. }
  168. }
  169. static void ath12k_dp_mon_rx_msdus_set_payload(struct ath12k_base *ab,
  170. struct sk_buff *head_msdu,
  171. struct sk_buff *tail_msdu)
  172. {
  173. u32 rx_pkt_offset, l2_hdr_offset, total_offset;
  174. rx_pkt_offset = ab->hal.hal_desc_sz;
  175. l2_hdr_offset =
  176. ath12k_dp_rx_h_l3pad(ab, (struct hal_rx_desc *)tail_msdu->data);
  177. if (ab->hw_params->rxdma1_enable)
  178. total_offset = ATH12K_MON_RX_PKT_OFFSET;
  179. else
  180. total_offset = rx_pkt_offset + l2_hdr_offset;
  181. skb_pull(head_msdu, total_offset);
  182. }
  183. struct sk_buff *
  184. ath12k_dp_mon_rx_merg_msdus(struct ath12k_pdev_dp *dp_pdev,
  185. struct dp_mon_mpdu *mon_mpdu,
  186. struct hal_rx_mon_ppdu_info *ppdu_info,
  187. struct ieee80211_rx_status *rxs)
  188. {
  189. struct ath12k_dp *dp = dp_pdev->dp;
  190. struct ath12k_base *ab = dp->ab;
  191. struct sk_buff *msdu, *mpdu_buf, *prev_buf, *head_frag_list;
  192. struct sk_buff *head_msdu, *tail_msdu;
  193. struct hal_rx_desc *rx_desc;
  194. u8 *hdr_desc, *dest, decap_format = mon_mpdu->decap_format;
  195. struct ieee80211_hdr_3addr *wh;
  196. struct ieee80211_channel *channel;
  197. u32 frag_list_sum_len = 0;
  198. u8 channel_num = ppdu_info->chan_num;
  199. mpdu_buf = NULL;
  200. head_msdu = mon_mpdu->head;
  201. tail_msdu = mon_mpdu->tail;
  202. if (!head_msdu || !tail_msdu)
  203. goto err_merge_fail;
  204. ath12k_dp_mon_fill_rx_stats_info(ppdu_info, rxs);
  205. if (unlikely(rxs->band == NUM_NL80211_BANDS ||
  206. !ath12k_pdev_dp_to_hw(dp_pdev)->wiphy->bands[rxs->band])) {
  207. struct ath12k *ar = ath12k_pdev_dp_to_ar(dp_pdev);
  208. ath12k_dbg(ab, ATH12K_DBG_DATA,
  209. "sband is NULL for status band %d channel_num %d center_freq %d pdev_id %d\n",
  210. rxs->band, channel_num, ppdu_info->freq, ar->pdev_idx);
  211. spin_lock_bh(&ar->data_lock);
  212. channel = ar->rx_channel;
  213. if (channel) {
  214. rxs->band = channel->band;
  215. channel_num =
  216. ieee80211_frequency_to_channel(channel->center_freq);
  217. }
  218. spin_unlock_bh(&ar->data_lock);
  219. }
  220. if (rxs->band < NUM_NL80211_BANDS)
  221. rxs->freq = ieee80211_channel_to_frequency(channel_num,
  222. rxs->band);
  223. ath12k_dp_mon_fill_rx_rate(dp_pdev, ppdu_info, rxs);
  224. if (decap_format == DP_RX_DECAP_TYPE_RAW) {
  225. ath12k_dp_mon_rx_msdus_set_payload(ab, head_msdu, tail_msdu);
  226. prev_buf = head_msdu;
  227. msdu = head_msdu->next;
  228. head_frag_list = NULL;
  229. while (msdu) {
  230. ath12k_dp_mon_rx_msdus_set_payload(ab, head_msdu, tail_msdu);
  231. if (!head_frag_list)
  232. head_frag_list = msdu;
  233. frag_list_sum_len += msdu->len;
  234. prev_buf = msdu;
  235. msdu = msdu->next;
  236. }
  237. prev_buf->next = NULL;
  238. skb_trim(prev_buf, prev_buf->len);
  239. if (head_frag_list) {
  240. skb_shinfo(head_msdu)->frag_list = head_frag_list;
  241. head_msdu->data_len = frag_list_sum_len;
  242. head_msdu->len += head_msdu->data_len;
  243. head_msdu->next = NULL;
  244. }
  245. } else if (decap_format == DP_RX_DECAP_TYPE_NATIVE_WIFI) {
  246. u8 qos_pkt = 0;
  247. rx_desc = (struct hal_rx_desc *)head_msdu->data;
  248. hdr_desc =
  249. ab->hal.ops->rx_desc_get_msdu_payload(rx_desc);
  250. /* Base size */
  251. wh = (struct ieee80211_hdr_3addr *)hdr_desc;
  252. if (ieee80211_is_data_qos(wh->frame_control))
  253. qos_pkt = 1;
  254. msdu = head_msdu;
  255. while (msdu) {
  256. ath12k_dp_mon_rx_msdus_set_payload(ab, head_msdu, tail_msdu);
  257. if (qos_pkt) {
  258. dest = skb_push(msdu, sizeof(__le16));
  259. if (!dest)
  260. goto err_merge_fail;
  261. memcpy(dest, hdr_desc, sizeof(struct ieee80211_qos_hdr));
  262. }
  263. prev_buf = msdu;
  264. msdu = msdu->next;
  265. }
  266. dest = skb_put(prev_buf, HAL_RX_FCS_LEN);
  267. if (!dest)
  268. goto err_merge_fail;
  269. ath12k_dbg(ab, ATH12K_DBG_DATA,
  270. "mpdu_buf %p mpdu_buf->len %u",
  271. prev_buf, prev_buf->len);
  272. } else {
  273. ath12k_dbg(ab, ATH12K_DBG_DATA,
  274. "decap format %d is not supported!\n",
  275. decap_format);
  276. goto err_merge_fail;
  277. }
  278. return head_msdu;
  279. err_merge_fail:
  280. if (mpdu_buf && decap_format != DP_RX_DECAP_TYPE_RAW) {
  281. ath12k_dbg(ab, ATH12K_DBG_DATA,
  282. "err_merge_fail mpdu_buf %p", mpdu_buf);
  283. /* Free the head buffer */
  284. dev_kfree_skb_any(mpdu_buf);
  285. }
  286. return NULL;
  287. }
  288. EXPORT_SYMBOL(ath12k_dp_mon_rx_merg_msdus);
  289. static void
  290. ath12k_dp_mon_rx_update_radiotap_he(struct hal_rx_mon_ppdu_info *rx_status,
  291. u8 *rtap_buf)
  292. {
  293. u32 rtap_len = 0;
  294. put_unaligned_le16(rx_status->he_data1, &rtap_buf[rtap_len]);
  295. rtap_len += 2;
  296. put_unaligned_le16(rx_status->he_data2, &rtap_buf[rtap_len]);
  297. rtap_len += 2;
  298. put_unaligned_le16(rx_status->he_data3, &rtap_buf[rtap_len]);
  299. rtap_len += 2;
  300. put_unaligned_le16(rx_status->he_data4, &rtap_buf[rtap_len]);
  301. rtap_len += 2;
  302. put_unaligned_le16(rx_status->he_data5, &rtap_buf[rtap_len]);
  303. rtap_len += 2;
  304. put_unaligned_le16(rx_status->he_data6, &rtap_buf[rtap_len]);
  305. }
  306. static void
  307. ath12k_dp_mon_rx_update_radiotap_he_mu(struct hal_rx_mon_ppdu_info *rx_status,
  308. u8 *rtap_buf)
  309. {
  310. u32 rtap_len = 0;
  311. put_unaligned_le16(rx_status->he_flags1, &rtap_buf[rtap_len]);
  312. rtap_len += 2;
  313. put_unaligned_le16(rx_status->he_flags2, &rtap_buf[rtap_len]);
  314. rtap_len += 2;
  315. rtap_buf[rtap_len] = rx_status->he_RU[0];
  316. rtap_len += 1;
  317. rtap_buf[rtap_len] = rx_status->he_RU[1];
  318. rtap_len += 1;
  319. rtap_buf[rtap_len] = rx_status->he_RU[2];
  320. rtap_len += 1;
  321. rtap_buf[rtap_len] = rx_status->he_RU[3];
  322. }
  323. void ath12k_dp_mon_update_radiotap(struct ath12k_pdev_dp *dp_pdev,
  324. struct hal_rx_mon_ppdu_info *ppduinfo,
  325. struct sk_buff *mon_skb,
  326. struct ieee80211_rx_status *rxs)
  327. {
  328. struct ath12k *ar = ath12k_pdev_dp_to_ar(dp_pdev);
  329. struct ieee80211_supported_band *sband;
  330. s32 noise_floor;
  331. u8 *ptr = NULL;
  332. spin_lock_bh(&ar->data_lock);
  333. noise_floor = ath12k_pdev_get_noise_floor(ar);
  334. spin_unlock_bh(&ar->data_lock);
  335. rxs->flag |= RX_FLAG_MACTIME_START;
  336. rxs->nss = ppduinfo->nss;
  337. if (test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
  338. ar->ab->wmi_ab.svc_map))
  339. rxs->signal = ppduinfo->rssi_comb;
  340. else
  341. rxs->signal = ppduinfo->rssi_comb + noise_floor;
  342. if (ppduinfo->userstats[ppduinfo->userid].ampdu_present) {
  343. rxs->flag |= RX_FLAG_AMPDU_DETAILS;
  344. rxs->ampdu_reference = ppduinfo->userstats[ppduinfo->userid].ampdu_id;
  345. }
  346. if (ppduinfo->is_eht || ppduinfo->eht_usig) {
  347. struct ieee80211_radiotap_tlv *tlv;
  348. struct ieee80211_radiotap_eht *eht;
  349. struct ieee80211_radiotap_eht_usig *usig;
  350. u16 len = 0, i, eht_len, usig_len;
  351. u8 user;
  352. if (ppduinfo->is_eht) {
  353. eht_len = struct_size(eht,
  354. user_info,
  355. ppduinfo->eht_info.num_user_info);
  356. len += sizeof(*tlv) + eht_len;
  357. }
  358. if (ppduinfo->eht_usig) {
  359. usig_len = sizeof(*usig);
  360. len += sizeof(*tlv) + usig_len;
  361. }
  362. rxs->flag |= RX_FLAG_RADIOTAP_TLV_AT_END;
  363. rxs->encoding = RX_ENC_EHT;
  364. skb_reset_mac_header(mon_skb);
  365. tlv = skb_push(mon_skb, len);
  366. if (ppduinfo->is_eht) {
  367. tlv->type = cpu_to_le16(IEEE80211_RADIOTAP_EHT);
  368. tlv->len = cpu_to_le16(eht_len);
  369. eht = (struct ieee80211_radiotap_eht *)tlv->data;
  370. eht->known = ppduinfo->eht_info.eht.known;
  371. for (i = 0;
  372. i < ARRAY_SIZE(eht->data) &&
  373. i < ARRAY_SIZE(ppduinfo->eht_info.eht.data);
  374. i++)
  375. eht->data[i] = ppduinfo->eht_info.eht.data[i];
  376. for (user = 0; user < ppduinfo->eht_info.num_user_info; user++)
  377. put_unaligned_le32(ppduinfo->eht_info.user_info[user],
  378. &eht->user_info[user]);
  379. tlv = (struct ieee80211_radiotap_tlv *)&tlv->data[eht_len];
  380. }
  381. if (ppduinfo->eht_usig) {
  382. tlv->type = cpu_to_le16(IEEE80211_RADIOTAP_EHT_USIG);
  383. tlv->len = cpu_to_le16(usig_len);
  384. usig = (struct ieee80211_radiotap_eht_usig *)tlv->data;
  385. *usig = ppduinfo->u_sig_info.usig;
  386. }
  387. } else if (ppduinfo->he_mu_flags) {
  388. rxs->flag |= RX_FLAG_RADIOTAP_HE_MU;
  389. rxs->encoding = RX_ENC_HE;
  390. ptr = skb_push(mon_skb, sizeof(struct ieee80211_radiotap_he_mu));
  391. ath12k_dp_mon_rx_update_radiotap_he_mu(ppduinfo, ptr);
  392. } else if (ppduinfo->he_flags) {
  393. rxs->flag |= RX_FLAG_RADIOTAP_HE;
  394. rxs->encoding = RX_ENC_HE;
  395. ptr = skb_push(mon_skb, sizeof(struct ieee80211_radiotap_he));
  396. ath12k_dp_mon_rx_update_radiotap_he(ppduinfo, ptr);
  397. rxs->rate_idx = ppduinfo->rate;
  398. } else if (ppduinfo->vht_flags) {
  399. rxs->encoding = RX_ENC_VHT;
  400. rxs->rate_idx = ppduinfo->rate;
  401. } else if (ppduinfo->ht_flags) {
  402. rxs->encoding = RX_ENC_HT;
  403. rxs->rate_idx = ppduinfo->rate;
  404. } else {
  405. struct ath12k *ar;
  406. ar = ath12k_pdev_dp_to_ar(dp_pdev);
  407. rxs->encoding = RX_ENC_LEGACY;
  408. sband = &ar->mac.sbands[rxs->band];
  409. rxs->rate_idx = ath12k_mac_hw_rate_to_idx(sband, ppduinfo->rate,
  410. ppduinfo->cck_flag);
  411. }
  412. rxs->mactime = ppduinfo->tsft;
  413. }
  414. EXPORT_SYMBOL(ath12k_dp_mon_update_radiotap);
  415. void ath12k_dp_mon_rx_deliver_msdu(struct ath12k_pdev_dp *dp_pdev,
  416. struct napi_struct *napi,
  417. struct sk_buff *msdu,
  418. const struct hal_rx_mon_ppdu_info *ppduinfo,
  419. struct ieee80211_rx_status *status,
  420. u8 decap)
  421. {
  422. struct ath12k_dp *dp = dp_pdev->dp;
  423. struct ath12k_base *ab = dp->ab;
  424. static const struct ieee80211_radiotap_he known = {
  425. .data1 = cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_DATA_MCS_KNOWN |
  426. IEEE80211_RADIOTAP_HE_DATA1_BW_RU_ALLOC_KNOWN),
  427. .data2 = cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA2_GI_KNOWN),
  428. };
  429. struct ieee80211_rx_status *rx_status;
  430. struct ieee80211_radiotap_he *he = NULL;
  431. struct ieee80211_sta *pubsta = NULL;
  432. struct ath12k_dp_link_peer *peer;
  433. struct ath12k_skb_rxcb *rxcb = ATH12K_SKB_RXCB(msdu);
  434. struct hal_rx_desc_data rx_info;
  435. bool is_mcbc = rxcb->is_mcbc;
  436. bool is_eapol_tkip = rxcb->is_eapol;
  437. struct hal_rx_desc *rx_desc = (struct hal_rx_desc *)msdu->data;
  438. u8 addr[ETH_ALEN] = {};
  439. status->link_valid = 0;
  440. if ((status->encoding == RX_ENC_HE) && !(status->flag & RX_FLAG_RADIOTAP_HE) &&
  441. !(status->flag & RX_FLAG_SKIP_MONITOR)) {
  442. he = skb_push(msdu, sizeof(known));
  443. memcpy(he, &known, sizeof(known));
  444. status->flag |= RX_FLAG_RADIOTAP_HE;
  445. }
  446. ath12k_dp_extract_rx_desc_data(dp->hal, &rx_info, rx_desc, rx_desc);
  447. rcu_read_lock();
  448. spin_lock_bh(&dp->dp_lock);
  449. peer = ath12k_dp_rx_h_find_link_peer(dp_pdev, msdu, &rx_info);
  450. if (peer && peer->sta) {
  451. pubsta = peer->sta;
  452. memcpy(addr, peer->addr, ETH_ALEN);
  453. if (pubsta->valid_links) {
  454. status->link_valid = 1;
  455. status->link_id = peer->link_id;
  456. }
  457. }
  458. spin_unlock_bh(&dp->dp_lock);
  459. rcu_read_unlock();
  460. ath12k_dbg(ab, ATH12K_DBG_DATA,
  461. "rx skb %p len %u peer %pM %u %s %s%s%s%s%s%s%s%s %srate_idx %u vht_nss %u freq %u band %u flag 0x%x fcs-err %i mic-err %i amsdu-more %i\n",
  462. msdu,
  463. msdu->len,
  464. addr,
  465. rxcb->tid,
  466. (is_mcbc) ? "mcast" : "ucast",
  467. (status->encoding == RX_ENC_LEGACY) ? "legacy" : "",
  468. (status->encoding == RX_ENC_HT) ? "ht" : "",
  469. (status->encoding == RX_ENC_VHT) ? "vht" : "",
  470. (status->encoding == RX_ENC_HE) ? "he" : "",
  471. (status->bw == RATE_INFO_BW_40) ? "40" : "",
  472. (status->bw == RATE_INFO_BW_80) ? "80" : "",
  473. (status->bw == RATE_INFO_BW_160) ? "160" : "",
  474. (status->bw == RATE_INFO_BW_320) ? "320" : "",
  475. status->enc_flags & RX_ENC_FLAG_SHORT_GI ? "sgi " : "",
  476. status->rate_idx,
  477. status->nss,
  478. status->freq,
  479. status->band, status->flag,
  480. !!(status->flag & RX_FLAG_FAILED_FCS_CRC),
  481. !!(status->flag & RX_FLAG_MMIC_ERROR),
  482. !!(status->flag & RX_FLAG_AMSDU_MORE));
  483. ath12k_dbg_dump(ab, ATH12K_DBG_DP_RX, NULL, "dp rx msdu: ",
  484. msdu->data, msdu->len);
  485. rx_status = IEEE80211_SKB_RXCB(msdu);
  486. *rx_status = *status;
  487. /* TODO: trace rx packet */
  488. /* PN for multicast packets are not validate in HW,
  489. * so skip 802.3 rx path
  490. * Also, fast_rx expects the STA to be authorized, hence
  491. * eapol packets are sent in slow path.
  492. */
  493. if (decap == DP_RX_DECAP_TYPE_ETHERNET2_DIX && !is_eapol_tkip &&
  494. !(is_mcbc && rx_status->flag & RX_FLAG_DECRYPTED))
  495. rx_status->flag |= RX_FLAG_8023;
  496. ieee80211_rx_napi(ath12k_pdev_dp_to_hw(dp_pdev), pubsta, msdu, napi);
  497. }
  498. EXPORT_SYMBOL(ath12k_dp_mon_rx_deliver_msdu);
  499. int ath12k_dp_pkt_set_pktlen(struct sk_buff *skb, u32 len)
  500. {
  501. if (skb->len > len) {
  502. skb_trim(skb, len);
  503. } else {
  504. if (skb_tailroom(skb) < len - skb->len) {
  505. if ((pskb_expand_head(skb, 0,
  506. len - skb->len - skb_tailroom(skb),
  507. GFP_ATOMIC))) {
  508. return -ENOMEM;
  509. }
  510. }
  511. skb_put(skb, (len - skb->len));
  512. }
  513. return 0;
  514. }
  515. EXPORT_SYMBOL(ath12k_dp_pkt_set_pktlen);
  516. int
  517. ath12k_dp_mon_parse_status_buf(struct ath12k_pdev_dp *dp_pdev,
  518. struct ath12k_mon_data *pmon,
  519. const struct dp_mon_packet_info *packet_info)
  520. {
  521. struct ath12k_dp *dp = dp_pdev->dp;
  522. struct ath12k_base *ab = dp->ab;
  523. struct dp_rxdma_mon_ring *buf_ring = &dp->rxdma_mon_buf_ring;
  524. struct sk_buff *msdu;
  525. int buf_id;
  526. u32 offset;
  527. buf_id = u32_get_bits(packet_info->cookie, DP_RXDMA_BUF_COOKIE_BUF_ID);
  528. spin_lock_bh(&buf_ring->idr_lock);
  529. msdu = idr_remove(&buf_ring->bufs_idr, buf_id);
  530. spin_unlock_bh(&buf_ring->idr_lock);
  531. if (unlikely(!msdu)) {
  532. ath12k_warn(ab, "mon dest desc with inval buf_id %d\n", buf_id);
  533. return 0;
  534. }
  535. dma_unmap_single(ab->dev, ATH12K_SKB_RXCB(msdu)->paddr,
  536. msdu->len + skb_tailroom(msdu),
  537. DMA_FROM_DEVICE);
  538. offset = packet_info->dma_length + ATH12K_MON_RX_DOT11_OFFSET;
  539. if (ath12k_dp_pkt_set_pktlen(msdu, offset)) {
  540. dev_kfree_skb_any(msdu);
  541. goto dest_replenish;
  542. }
  543. if (!pmon->mon_mpdu->head)
  544. pmon->mon_mpdu->head = msdu;
  545. else
  546. pmon->mon_mpdu->tail->next = msdu;
  547. pmon->mon_mpdu->tail = msdu;
  548. dest_replenish:
  549. ath12k_dp_mon_buf_replenish(ab, buf_ring, 1);
  550. return 0;
  551. }
  552. EXPORT_SYMBOL(ath12k_dp_mon_parse_status_buf);
  553. int ath12k_dp_mon_buf_replenish(struct ath12k_base *ab,
  554. struct dp_rxdma_mon_ring *buf_ring,
  555. int req_entries)
  556. {
  557. struct hal_mon_buf_ring *mon_buf;
  558. struct sk_buff *skb;
  559. struct hal_srng *srng;
  560. dma_addr_t paddr;
  561. u32 cookie;
  562. int buf_id;
  563. srng = &ab->hal.srng_list[buf_ring->refill_buf_ring.ring_id];
  564. spin_lock_bh(&srng->lock);
  565. ath12k_hal_srng_access_begin(ab, srng);
  566. while (req_entries > 0) {
  567. skb = dev_alloc_skb(DP_RX_BUFFER_SIZE + DP_RX_BUFFER_ALIGN_SIZE);
  568. if (unlikely(!skb))
  569. goto fail_alloc_skb;
  570. if (!IS_ALIGNED((unsigned long)skb->data, DP_RX_BUFFER_ALIGN_SIZE)) {
  571. skb_pull(skb,
  572. PTR_ALIGN(skb->data, DP_RX_BUFFER_ALIGN_SIZE) -
  573. skb->data);
  574. }
  575. paddr = dma_map_single(ab->dev, skb->data,
  576. skb->len + skb_tailroom(skb),
  577. DMA_FROM_DEVICE);
  578. if (unlikely(dma_mapping_error(ab->dev, paddr)))
  579. goto fail_free_skb;
  580. spin_lock_bh(&buf_ring->idr_lock);
  581. buf_id = idr_alloc(&buf_ring->bufs_idr, skb, 0,
  582. buf_ring->bufs_max * 3, GFP_ATOMIC);
  583. spin_unlock_bh(&buf_ring->idr_lock);
  584. if (unlikely(buf_id < 0))
  585. goto fail_dma_unmap;
  586. mon_buf = ath12k_hal_srng_src_get_next_entry(ab, srng);
  587. if (unlikely(!mon_buf))
  588. goto fail_idr_remove;
  589. ATH12K_SKB_RXCB(skb)->paddr = paddr;
  590. cookie = u32_encode_bits(buf_id, DP_RXDMA_BUF_COOKIE_BUF_ID);
  591. mon_buf->paddr_lo = cpu_to_le32(lower_32_bits(paddr));
  592. mon_buf->paddr_hi = cpu_to_le32(upper_32_bits(paddr));
  593. mon_buf->cookie = cpu_to_le64(cookie);
  594. req_entries--;
  595. }
  596. ath12k_hal_srng_access_end(ab, srng);
  597. spin_unlock_bh(&srng->lock);
  598. return 0;
  599. fail_idr_remove:
  600. spin_lock_bh(&buf_ring->idr_lock);
  601. idr_remove(&buf_ring->bufs_idr, buf_id);
  602. spin_unlock_bh(&buf_ring->idr_lock);
  603. fail_dma_unmap:
  604. dma_unmap_single(ab->dev, paddr, skb->len + skb_tailroom(skb),
  605. DMA_FROM_DEVICE);
  606. fail_free_skb:
  607. dev_kfree_skb_any(skb);
  608. fail_alloc_skb:
  609. ath12k_hal_srng_access_end(ab, srng);
  610. spin_unlock_bh(&srng->lock);
  611. return -ENOMEM;
  612. }
  613. EXPORT_SYMBOL(ath12k_dp_mon_buf_replenish);
  614. int ath12k_dp_mon_status_bufs_replenish(struct ath12k_base *ab,
  615. struct dp_rxdma_mon_ring *rx_ring,
  616. int req_entries)
  617. {
  618. enum hal_rx_buf_return_buf_manager mgr =
  619. ab->hal.hal_params->rx_buf_rbm;
  620. int num_free, num_remain, buf_id;
  621. struct ath12k_buffer_addr *desc;
  622. struct hal_srng *srng;
  623. struct sk_buff *skb;
  624. dma_addr_t paddr;
  625. u32 cookie;
  626. req_entries = min(req_entries, rx_ring->bufs_max);
  627. srng = &ab->hal.srng_list[rx_ring->refill_buf_ring.ring_id];
  628. spin_lock_bh(&srng->lock);
  629. ath12k_hal_srng_access_begin(ab, srng);
  630. num_free = ath12k_hal_srng_src_num_free(ab, srng, true);
  631. if (!req_entries && (num_free > (rx_ring->bufs_max * 3) / 4))
  632. req_entries = num_free;
  633. req_entries = min(num_free, req_entries);
  634. num_remain = req_entries;
  635. while (num_remain > 0) {
  636. skb = dev_alloc_skb(RX_MON_STATUS_BUF_SIZE);
  637. if (!skb)
  638. break;
  639. if (!IS_ALIGNED((unsigned long)skb->data,
  640. RX_MON_STATUS_BUF_ALIGN)) {
  641. skb_pull(skb,
  642. PTR_ALIGN(skb->data, RX_MON_STATUS_BUF_ALIGN) -
  643. skb->data);
  644. }
  645. paddr = dma_map_single(ab->dev, skb->data,
  646. skb->len + skb_tailroom(skb),
  647. DMA_FROM_DEVICE);
  648. if (dma_mapping_error(ab->dev, paddr))
  649. goto fail_free_skb;
  650. spin_lock_bh(&rx_ring->idr_lock);
  651. buf_id = idr_alloc(&rx_ring->bufs_idr, skb, 0,
  652. rx_ring->bufs_max * 3, GFP_ATOMIC);
  653. spin_unlock_bh(&rx_ring->idr_lock);
  654. if (buf_id < 0)
  655. goto fail_dma_unmap;
  656. cookie = u32_encode_bits(buf_id, DP_RXDMA_BUF_COOKIE_BUF_ID);
  657. desc = ath12k_hal_srng_src_get_next_entry(ab, srng);
  658. if (!desc)
  659. goto fail_buf_unassign;
  660. ATH12K_SKB_RXCB(skb)->paddr = paddr;
  661. num_remain--;
  662. ath12k_hal_rx_buf_addr_info_set(&ab->hal, desc, paddr, cookie, mgr);
  663. }
  664. ath12k_hal_srng_access_end(ab, srng);
  665. spin_unlock_bh(&srng->lock);
  666. return req_entries - num_remain;
  667. fail_buf_unassign:
  668. spin_lock_bh(&rx_ring->idr_lock);
  669. idr_remove(&rx_ring->bufs_idr, buf_id);
  670. spin_unlock_bh(&rx_ring->idr_lock);
  671. fail_dma_unmap:
  672. dma_unmap_single(ab->dev, paddr, skb->len + skb_tailroom(skb),
  673. DMA_FROM_DEVICE);
  674. fail_free_skb:
  675. dev_kfree_skb_any(skb);
  676. ath12k_hal_srng_access_end(ab, srng);
  677. spin_unlock_bh(&srng->lock);
  678. return req_entries - num_remain;
  679. }
  680. static void
  681. ath12k_dp_mon_rx_update_peer_rate_table_stats(struct ath12k_rx_peer_stats *rx_stats,
  682. struct hal_rx_mon_ppdu_info *ppdu_info,
  683. struct hal_rx_user_status *user_stats,
  684. u32 num_msdu)
  685. {
  686. struct ath12k_rx_peer_rate_stats *stats;
  687. u32 mcs_idx = (user_stats) ? user_stats->mcs : ppdu_info->mcs;
  688. u32 nss_idx = (user_stats) ? user_stats->nss - 1 : ppdu_info->nss - 1;
  689. u32 bw_idx = ppdu_info->bw;
  690. u32 gi_idx = ppdu_info->gi;
  691. u32 len;
  692. if (!rx_stats)
  693. return;
  694. if (mcs_idx > HAL_RX_MAX_MCS_HT || nss_idx >= HAL_RX_MAX_NSS ||
  695. bw_idx >= HAL_RX_BW_MAX || gi_idx >= HAL_RX_GI_MAX) {
  696. return;
  697. }
  698. if (ppdu_info->preamble_type == HAL_RX_PREAMBLE_11AX ||
  699. ppdu_info->preamble_type == HAL_RX_PREAMBLE_11BE)
  700. gi_idx = ath12k_he_gi_to_nl80211_he_gi(ppdu_info->gi);
  701. rx_stats->pkt_stats.rx_rate[bw_idx][gi_idx][nss_idx][mcs_idx] += num_msdu;
  702. stats = &rx_stats->byte_stats;
  703. if (user_stats)
  704. len = user_stats->mpdu_ok_byte_count;
  705. else
  706. len = ppdu_info->mpdu_len;
  707. stats->rx_rate[bw_idx][gi_idx][nss_idx][mcs_idx] += len;
  708. }
  709. void ath12k_dp_mon_rx_update_peer_su_stats(struct ath12k_dp_link_peer *peer,
  710. struct hal_rx_mon_ppdu_info *ppdu_info)
  711. {
  712. struct ath12k_rx_peer_stats *rx_stats = peer->peer_stats.rx_stats;
  713. u32 num_msdu;
  714. peer->rssi_comb = ppdu_info->rssi_comb;
  715. ewma_avg_rssi_add(&peer->avg_rssi, ppdu_info->rssi_comb);
  716. if (!rx_stats)
  717. return;
  718. num_msdu = ppdu_info->tcp_msdu_count + ppdu_info->tcp_ack_msdu_count +
  719. ppdu_info->udp_msdu_count + ppdu_info->other_msdu_count;
  720. rx_stats->num_msdu += num_msdu;
  721. rx_stats->tcp_msdu_count += ppdu_info->tcp_msdu_count +
  722. ppdu_info->tcp_ack_msdu_count;
  723. rx_stats->udp_msdu_count += ppdu_info->udp_msdu_count;
  724. rx_stats->other_msdu_count += ppdu_info->other_msdu_count;
  725. if (ppdu_info->preamble_type == HAL_RX_PREAMBLE_11A ||
  726. ppdu_info->preamble_type == HAL_RX_PREAMBLE_11B) {
  727. ppdu_info->nss = 1;
  728. ppdu_info->mcs = HAL_RX_MAX_MCS;
  729. ppdu_info->tid = IEEE80211_NUM_TIDS;
  730. }
  731. if (ppdu_info->ldpc < HAL_RX_SU_MU_CODING_MAX)
  732. rx_stats->coding_count[ppdu_info->ldpc] += num_msdu;
  733. if (ppdu_info->tid <= IEEE80211_NUM_TIDS)
  734. rx_stats->tid_count[ppdu_info->tid] += num_msdu;
  735. if (ppdu_info->preamble_type < HAL_RX_PREAMBLE_MAX)
  736. rx_stats->pream_cnt[ppdu_info->preamble_type] += num_msdu;
  737. if (ppdu_info->reception_type < HAL_RX_RECEPTION_TYPE_MAX)
  738. rx_stats->reception_type[ppdu_info->reception_type] += num_msdu;
  739. if (ppdu_info->is_stbc)
  740. rx_stats->stbc_count += num_msdu;
  741. if (ppdu_info->beamformed)
  742. rx_stats->beamformed_count += num_msdu;
  743. if (ppdu_info->num_mpdu_fcs_ok > 1)
  744. rx_stats->ampdu_msdu_count += num_msdu;
  745. else
  746. rx_stats->non_ampdu_msdu_count += num_msdu;
  747. rx_stats->num_mpdu_fcs_ok += ppdu_info->num_mpdu_fcs_ok;
  748. rx_stats->num_mpdu_fcs_err += ppdu_info->num_mpdu_fcs_err;
  749. rx_stats->dcm_count += ppdu_info->dcm;
  750. rx_stats->rx_duration += ppdu_info->rx_duration;
  751. peer->rx_duration = rx_stats->rx_duration;
  752. if (ppdu_info->nss > 0 && ppdu_info->nss <= HAL_RX_MAX_NSS) {
  753. rx_stats->pkt_stats.nss_count[ppdu_info->nss - 1] += num_msdu;
  754. rx_stats->byte_stats.nss_count[ppdu_info->nss - 1] += ppdu_info->mpdu_len;
  755. }
  756. if (ppdu_info->preamble_type == HAL_RX_PREAMBLE_11N &&
  757. ppdu_info->mcs <= HAL_RX_MAX_MCS_HT) {
  758. rx_stats->pkt_stats.ht_mcs_count[ppdu_info->mcs] += num_msdu;
  759. rx_stats->byte_stats.ht_mcs_count[ppdu_info->mcs] += ppdu_info->mpdu_len;
  760. /* To fit into rate table for HT packets */
  761. ppdu_info->mcs = ppdu_info->mcs % 8;
  762. }
  763. if (ppdu_info->preamble_type == HAL_RX_PREAMBLE_11AC &&
  764. ppdu_info->mcs <= HAL_RX_MAX_MCS_VHT) {
  765. rx_stats->pkt_stats.vht_mcs_count[ppdu_info->mcs] += num_msdu;
  766. rx_stats->byte_stats.vht_mcs_count[ppdu_info->mcs] += ppdu_info->mpdu_len;
  767. }
  768. if (ppdu_info->preamble_type == HAL_RX_PREAMBLE_11AX &&
  769. ppdu_info->mcs <= HAL_RX_MAX_MCS_HE) {
  770. rx_stats->pkt_stats.he_mcs_count[ppdu_info->mcs] += num_msdu;
  771. rx_stats->byte_stats.he_mcs_count[ppdu_info->mcs] += ppdu_info->mpdu_len;
  772. }
  773. if (ppdu_info->preamble_type == HAL_RX_PREAMBLE_11BE &&
  774. ppdu_info->mcs <= HAL_RX_MAX_MCS_BE) {
  775. rx_stats->pkt_stats.be_mcs_count[ppdu_info->mcs] += num_msdu;
  776. rx_stats->byte_stats.be_mcs_count[ppdu_info->mcs] += ppdu_info->mpdu_len;
  777. }
  778. if ((ppdu_info->preamble_type == HAL_RX_PREAMBLE_11A ||
  779. ppdu_info->preamble_type == HAL_RX_PREAMBLE_11B) &&
  780. ppdu_info->rate < HAL_RX_LEGACY_RATE_INVALID) {
  781. rx_stats->pkt_stats.legacy_count[ppdu_info->rate] += num_msdu;
  782. rx_stats->byte_stats.legacy_count[ppdu_info->rate] += ppdu_info->mpdu_len;
  783. }
  784. if (ppdu_info->gi < HAL_RX_GI_MAX) {
  785. rx_stats->pkt_stats.gi_count[ppdu_info->gi] += num_msdu;
  786. rx_stats->byte_stats.gi_count[ppdu_info->gi] += ppdu_info->mpdu_len;
  787. }
  788. if (ppdu_info->bw < HAL_RX_BW_MAX) {
  789. rx_stats->pkt_stats.bw_count[ppdu_info->bw] += num_msdu;
  790. rx_stats->byte_stats.bw_count[ppdu_info->bw] += ppdu_info->mpdu_len;
  791. }
  792. ath12k_dp_mon_rx_update_peer_rate_table_stats(rx_stats, ppdu_info,
  793. NULL, num_msdu);
  794. }
  795. EXPORT_SYMBOL(ath12k_dp_mon_rx_update_peer_su_stats);
  796. void ath12k_dp_mon_rx_process_ulofdma(struct hal_rx_mon_ppdu_info *ppdu_info)
  797. {
  798. struct hal_rx_user_status *rx_user_status;
  799. u32 num_users, i, mu_ul_user_v0_word0, mu_ul_user_v0_word1, ru_size;
  800. if (!(ppdu_info->reception_type == HAL_RX_RECEPTION_TYPE_MU_MIMO ||
  801. ppdu_info->reception_type == HAL_RX_RECEPTION_TYPE_MU_OFDMA ||
  802. ppdu_info->reception_type == HAL_RX_RECEPTION_TYPE_MU_OFDMA_MIMO))
  803. return;
  804. num_users = ppdu_info->num_users;
  805. if (num_users > HAL_MAX_UL_MU_USERS)
  806. num_users = HAL_MAX_UL_MU_USERS;
  807. for (i = 0; i < num_users; i++) {
  808. rx_user_status = &ppdu_info->userstats[i];
  809. mu_ul_user_v0_word0 =
  810. rx_user_status->ul_ofdma_user_v0_word0;
  811. mu_ul_user_v0_word1 =
  812. rx_user_status->ul_ofdma_user_v0_word1;
  813. if (u32_get_bits(mu_ul_user_v0_word0,
  814. HAL_RX_UL_OFDMA_USER_INFO_V0_W0_VALID) &&
  815. !u32_get_bits(mu_ul_user_v0_word0,
  816. HAL_RX_UL_OFDMA_USER_INFO_V0_W0_VER)) {
  817. rx_user_status->mcs =
  818. u32_get_bits(mu_ul_user_v0_word1,
  819. HAL_RX_UL_OFDMA_USER_INFO_V0_W1_MCS);
  820. rx_user_status->nss =
  821. u32_get_bits(mu_ul_user_v0_word1,
  822. HAL_RX_UL_OFDMA_USER_INFO_V0_W1_NSS) + 1;
  823. rx_user_status->ofdma_info_valid = 1;
  824. rx_user_status->ul_ofdma_ru_start_index =
  825. u32_get_bits(mu_ul_user_v0_word1,
  826. HAL_RX_UL_OFDMA_USER_INFO_V0_W1_RU_START);
  827. ru_size = u32_get_bits(mu_ul_user_v0_word1,
  828. HAL_RX_UL_OFDMA_USER_INFO_V0_W1_RU_SIZE);
  829. rx_user_status->ul_ofdma_ru_width = ru_size;
  830. rx_user_status->ul_ofdma_ru_size = ru_size;
  831. }
  832. rx_user_status->ldpc = u32_get_bits(mu_ul_user_v0_word1,
  833. HAL_RX_UL_OFDMA_USER_INFO_V0_W1_LDPC);
  834. }
  835. ppdu_info->ldpc = 1;
  836. }
  837. EXPORT_SYMBOL(ath12k_dp_mon_rx_process_ulofdma);
  838. static void
  839. ath12k_dp_mon_rx_update_user_stats(struct ath12k_base *ab,
  840. struct hal_rx_mon_ppdu_info *ppdu_info,
  841. u32 uid)
  842. {
  843. struct ath12k_rx_peer_stats *rx_stats = NULL;
  844. struct hal_rx_user_status *user_stats = &ppdu_info->userstats[uid];
  845. struct ath12k_dp_link_peer *peer;
  846. u32 num_msdu;
  847. struct ath12k_dp *dp = ath12k_ab_to_dp(ab);
  848. if (user_stats->ast_index == 0 || user_stats->ast_index == 0xFFFF)
  849. return;
  850. peer = ath12k_dp_link_peer_find_by_ast(dp, user_stats->ast_index);
  851. if (!peer) {
  852. ath12k_warn(ab, "peer ast idx %d can't be found\n",
  853. user_stats->ast_index);
  854. return;
  855. }
  856. peer->rssi_comb = ppdu_info->rssi_comb;
  857. ewma_avg_rssi_add(&peer->avg_rssi, ppdu_info->rssi_comb);
  858. rx_stats = peer->peer_stats.rx_stats;
  859. if (!rx_stats)
  860. return;
  861. num_msdu = user_stats->tcp_msdu_count + user_stats->tcp_ack_msdu_count +
  862. user_stats->udp_msdu_count + user_stats->other_msdu_count;
  863. rx_stats->num_msdu += num_msdu;
  864. rx_stats->tcp_msdu_count += user_stats->tcp_msdu_count +
  865. user_stats->tcp_ack_msdu_count;
  866. rx_stats->udp_msdu_count += user_stats->udp_msdu_count;
  867. rx_stats->other_msdu_count += user_stats->other_msdu_count;
  868. if (ppdu_info->ldpc < HAL_RX_SU_MU_CODING_MAX)
  869. rx_stats->coding_count[ppdu_info->ldpc] += num_msdu;
  870. if (user_stats->tid <= IEEE80211_NUM_TIDS)
  871. rx_stats->tid_count[user_stats->tid] += num_msdu;
  872. if (user_stats->preamble_type < HAL_RX_PREAMBLE_MAX)
  873. rx_stats->pream_cnt[user_stats->preamble_type] += num_msdu;
  874. if (ppdu_info->reception_type < HAL_RX_RECEPTION_TYPE_MAX)
  875. rx_stats->reception_type[ppdu_info->reception_type] += num_msdu;
  876. if (ppdu_info->is_stbc)
  877. rx_stats->stbc_count += num_msdu;
  878. if (ppdu_info->beamformed)
  879. rx_stats->beamformed_count += num_msdu;
  880. if (user_stats->mpdu_cnt_fcs_ok > 1)
  881. rx_stats->ampdu_msdu_count += num_msdu;
  882. else
  883. rx_stats->non_ampdu_msdu_count += num_msdu;
  884. rx_stats->num_mpdu_fcs_ok += user_stats->mpdu_cnt_fcs_ok;
  885. rx_stats->num_mpdu_fcs_err += user_stats->mpdu_cnt_fcs_err;
  886. rx_stats->dcm_count += ppdu_info->dcm;
  887. if (ppdu_info->reception_type == HAL_RX_RECEPTION_TYPE_MU_OFDMA ||
  888. ppdu_info->reception_type == HAL_RX_RECEPTION_TYPE_MU_OFDMA_MIMO)
  889. rx_stats->ru_alloc_cnt[user_stats->ul_ofdma_ru_size] += num_msdu;
  890. rx_stats->rx_duration += ppdu_info->rx_duration;
  891. peer->rx_duration = rx_stats->rx_duration;
  892. if (user_stats->nss > 0 && user_stats->nss <= HAL_RX_MAX_NSS) {
  893. rx_stats->pkt_stats.nss_count[user_stats->nss - 1] += num_msdu;
  894. rx_stats->byte_stats.nss_count[user_stats->nss - 1] +=
  895. user_stats->mpdu_ok_byte_count;
  896. }
  897. if (user_stats->preamble_type == HAL_RX_PREAMBLE_11AX &&
  898. user_stats->mcs <= HAL_RX_MAX_MCS_HE) {
  899. rx_stats->pkt_stats.he_mcs_count[user_stats->mcs] += num_msdu;
  900. rx_stats->byte_stats.he_mcs_count[user_stats->mcs] +=
  901. user_stats->mpdu_ok_byte_count;
  902. }
  903. if (ppdu_info->gi < HAL_RX_GI_MAX) {
  904. rx_stats->pkt_stats.gi_count[ppdu_info->gi] += num_msdu;
  905. rx_stats->byte_stats.gi_count[ppdu_info->gi] +=
  906. user_stats->mpdu_ok_byte_count;
  907. }
  908. if (ppdu_info->bw < HAL_RX_BW_MAX) {
  909. rx_stats->pkt_stats.bw_count[ppdu_info->bw] += num_msdu;
  910. rx_stats->byte_stats.bw_count[ppdu_info->bw] +=
  911. user_stats->mpdu_ok_byte_count;
  912. }
  913. ath12k_dp_mon_rx_update_peer_rate_table_stats(rx_stats, ppdu_info,
  914. user_stats, num_msdu);
  915. }
  916. void
  917. ath12k_dp_mon_rx_update_peer_mu_stats(struct ath12k_base *ab,
  918. struct hal_rx_mon_ppdu_info *ppdu_info)
  919. {
  920. u32 num_users, i;
  921. num_users = ppdu_info->num_users;
  922. if (num_users > HAL_MAX_UL_MU_USERS)
  923. num_users = HAL_MAX_UL_MU_USERS;
  924. for (i = 0; i < num_users; i++)
  925. ath12k_dp_mon_rx_update_user_stats(ab, ppdu_info, i);
  926. }
  927. EXPORT_SYMBOL(ath12k_dp_mon_rx_update_peer_mu_stats);