mac.c 69 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688
  1. // SPDX-License-Identifier: ISC
  2. /*
  3. * Copyright (C) 2022 MediaTek Inc.
  4. */
  5. #include <linux/etherdevice.h>
  6. #include <linux/timekeeping.h>
  7. #include "coredump.h"
  8. #include "mt7996.h"
  9. #include "../dma.h"
  10. #include "mac.h"
  11. #include "mcu.h"
  12. #define to_rssi(field, rcpi) ((FIELD_GET(field, rcpi) - 220) / 2)
  13. static const struct mt7996_dfs_radar_spec etsi_radar_specs = {
  14. .pulse_th = { 110, -10, -80, 40, 5200, 128, 5200 },
  15. .radar_pattern = {
  16. [5] = { 1, 0, 6, 32, 28, 0, 990, 5010, 17, 1, 1 },
  17. [6] = { 1, 0, 9, 32, 28, 0, 615, 5010, 27, 1, 1 },
  18. [7] = { 1, 0, 15, 32, 28, 0, 240, 445, 27, 1, 1 },
  19. [8] = { 1, 0, 12, 32, 28, 0, 240, 510, 42, 1, 1 },
  20. [9] = { 1, 1, 0, 0, 0, 0, 2490, 3343, 14, 0, 0, 12, 32, 28, { }, 126 },
  21. [10] = { 1, 1, 0, 0, 0, 0, 2490, 3343, 14, 0, 0, 15, 32, 24, { }, 126 },
  22. [11] = { 1, 1, 0, 0, 0, 0, 823, 2510, 14, 0, 0, 18, 32, 28, { }, 54 },
  23. [12] = { 1, 1, 0, 0, 0, 0, 823, 2510, 14, 0, 0, 27, 32, 24, { }, 54 },
  24. },
  25. };
  26. static const struct mt7996_dfs_radar_spec fcc_radar_specs = {
  27. .pulse_th = { 110, -10, -80, 40, 5200, 128, 5200 },
  28. .radar_pattern = {
  29. [0] = { 1, 0, 8, 32, 28, 0, 508, 3076, 13, 1, 1 },
  30. [1] = { 1, 0, 12, 32, 28, 0, 140, 240, 17, 1, 1 },
  31. [2] = { 1, 0, 8, 32, 28, 0, 190, 510, 22, 1, 1 },
  32. [3] = { 1, 0, 6, 32, 28, 0, 190, 510, 32, 1, 1 },
  33. [4] = { 1, 0, 9, 255, 28, 0, 323, 343, 13, 1, 32 },
  34. },
  35. };
  36. static const struct mt7996_dfs_radar_spec jp_radar_specs = {
  37. .pulse_th = { 110, -10, -80, 40, 5200, 128, 5200 },
  38. .radar_pattern = {
  39. [0] = { 1, 0, 8, 32, 28, 0, 508, 3076, 13, 1, 1 },
  40. [1] = { 1, 0, 12, 32, 28, 0, 140, 240, 17, 1, 1 },
  41. [2] = { 1, 0, 8, 32, 28, 0, 190, 510, 22, 1, 1 },
  42. [3] = { 1, 0, 6, 32, 28, 0, 190, 510, 32, 1, 1 },
  43. [4] = { 1, 0, 9, 255, 28, 0, 323, 343, 13, 1, 32 },
  44. [13] = { 1, 0, 7, 32, 28, 0, 3836, 3856, 14, 1, 1 },
  45. [14] = { 1, 0, 6, 32, 28, 0, 615, 5010, 110, 1, 1 },
  46. [15] = { 1, 1, 0, 0, 0, 0, 15, 5010, 110, 0, 0, 12, 32, 28 },
  47. },
  48. };
  49. static struct mt76_wcid *mt7996_rx_get_wcid(struct mt7996_dev *dev,
  50. u16 idx, bool unicast)
  51. {
  52. struct mt7996_sta *sta;
  53. struct mt76_wcid *wcid;
  54. if (idx >= ARRAY_SIZE(dev->mt76.wcid))
  55. return NULL;
  56. wcid = rcu_dereference(dev->mt76.wcid[idx]);
  57. if (unicast || !wcid)
  58. return wcid;
  59. if (!wcid->sta)
  60. return NULL;
  61. sta = container_of(wcid, struct mt7996_sta, wcid);
  62. if (!sta->vif)
  63. return NULL;
  64. return &sta->vif->sta.wcid;
  65. }
  66. bool mt7996_mac_wtbl_update(struct mt7996_dev *dev, int idx, u32 mask)
  67. {
  68. mt76_rmw(dev, MT_WTBL_UPDATE, MT_WTBL_UPDATE_WLAN_IDX,
  69. FIELD_PREP(MT_WTBL_UPDATE_WLAN_IDX, idx) | mask);
  70. return mt76_poll(dev, MT_WTBL_UPDATE, MT_WTBL_UPDATE_BUSY,
  71. 0, 5000);
  72. }
  73. u32 mt7996_mac_wtbl_lmac_addr(struct mt7996_dev *dev, u16 wcid, u8 dw)
  74. {
  75. mt76_wr(dev, MT_WTBLON_TOP_WDUCR,
  76. FIELD_PREP(MT_WTBLON_TOP_WDUCR_GROUP, (wcid >> 7)));
  77. return MT_WTBL_LMAC_OFFS(wcid, dw);
  78. }
  79. static void mt7996_mac_sta_poll(struct mt7996_dev *dev)
  80. {
  81. static const u8 ac_to_tid[] = {
  82. [IEEE80211_AC_BE] = 0,
  83. [IEEE80211_AC_BK] = 1,
  84. [IEEE80211_AC_VI] = 4,
  85. [IEEE80211_AC_VO] = 6
  86. };
  87. struct ieee80211_sta *sta;
  88. struct mt7996_sta *msta;
  89. u32 tx_time[IEEE80211_NUM_ACS], rx_time[IEEE80211_NUM_ACS];
  90. LIST_HEAD(sta_poll_list);
  91. int i;
  92. spin_lock_bh(&dev->mt76.sta_poll_lock);
  93. list_splice_init(&dev->mt76.sta_poll_list, &sta_poll_list);
  94. spin_unlock_bh(&dev->mt76.sta_poll_lock);
  95. rcu_read_lock();
  96. while (true) {
  97. bool clear = false;
  98. u32 addr, val;
  99. u16 idx;
  100. s8 rssi[4];
  101. spin_lock_bh(&dev->mt76.sta_poll_lock);
  102. if (list_empty(&sta_poll_list)) {
  103. spin_unlock_bh(&dev->mt76.sta_poll_lock);
  104. break;
  105. }
  106. msta = list_first_entry(&sta_poll_list,
  107. struct mt7996_sta, wcid.poll_list);
  108. list_del_init(&msta->wcid.poll_list);
  109. spin_unlock_bh(&dev->mt76.sta_poll_lock);
  110. idx = msta->wcid.idx;
  111. /* refresh peer's airtime reporting */
  112. addr = mt7996_mac_wtbl_lmac_addr(dev, idx, 20);
  113. for (i = 0; i < IEEE80211_NUM_ACS; i++) {
  114. u32 tx_last = msta->airtime_ac[i];
  115. u32 rx_last = msta->airtime_ac[i + 4];
  116. msta->airtime_ac[i] = mt76_rr(dev, addr);
  117. msta->airtime_ac[i + 4] = mt76_rr(dev, addr + 4);
  118. tx_time[i] = msta->airtime_ac[i] - tx_last;
  119. rx_time[i] = msta->airtime_ac[i + 4] - rx_last;
  120. if ((tx_last | rx_last) & BIT(30))
  121. clear = true;
  122. addr += 8;
  123. }
  124. if (clear) {
  125. mt7996_mac_wtbl_update(dev, idx,
  126. MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
  127. memset(msta->airtime_ac, 0, sizeof(msta->airtime_ac));
  128. }
  129. if (!msta->wcid.sta)
  130. continue;
  131. sta = container_of((void *)msta, struct ieee80211_sta,
  132. drv_priv);
  133. for (i = 0; i < IEEE80211_NUM_ACS; i++) {
  134. u8 q = mt76_connac_lmac_mapping(i);
  135. u32 tx_cur = tx_time[q];
  136. u32 rx_cur = rx_time[q];
  137. u8 tid = ac_to_tid[i];
  138. if (!tx_cur && !rx_cur)
  139. continue;
  140. ieee80211_sta_register_airtime(sta, tid, tx_cur, rx_cur);
  141. }
  142. /* get signal strength of resp frames (CTS/BA/ACK) */
  143. addr = mt7996_mac_wtbl_lmac_addr(dev, idx, 34);
  144. val = mt76_rr(dev, addr);
  145. rssi[0] = to_rssi(GENMASK(7, 0), val);
  146. rssi[1] = to_rssi(GENMASK(15, 8), val);
  147. rssi[2] = to_rssi(GENMASK(23, 16), val);
  148. rssi[3] = to_rssi(GENMASK(31, 14), val);
  149. msta->ack_signal =
  150. mt76_rx_signal(msta->vif->phy->mt76->antenna_mask, rssi);
  151. ewma_avg_signal_add(&msta->avg_ack_signal, -msta->ack_signal);
  152. }
  153. rcu_read_unlock();
  154. }
  155. void mt7996_mac_enable_rtscts(struct mt7996_dev *dev,
  156. struct ieee80211_vif *vif, bool enable)
  157. {
  158. struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv;
  159. u32 addr;
  160. addr = mt7996_mac_wtbl_lmac_addr(dev, mvif->sta.wcid.idx, 5);
  161. if (enable)
  162. mt76_set(dev, addr, BIT(5));
  163. else
  164. mt76_clear(dev, addr, BIT(5));
  165. }
  166. /* The HW does not translate the mac header to 802.3 for mesh point */
  167. static int mt7996_reverse_frag0_hdr_trans(struct sk_buff *skb, u16 hdr_gap)
  168. {
  169. struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
  170. struct ethhdr *eth_hdr = (struct ethhdr *)(skb->data + hdr_gap);
  171. struct mt7996_sta *msta = (struct mt7996_sta *)status->wcid;
  172. __le32 *rxd = (__le32 *)skb->data;
  173. struct ieee80211_sta *sta;
  174. struct ieee80211_vif *vif;
  175. struct ieee80211_hdr hdr;
  176. u16 frame_control;
  177. if (le32_get_bits(rxd[3], MT_RXD3_NORMAL_ADDR_TYPE) !=
  178. MT_RXD3_NORMAL_U2M)
  179. return -EINVAL;
  180. if (!(le32_to_cpu(rxd[1]) & MT_RXD1_NORMAL_GROUP_4))
  181. return -EINVAL;
  182. if (!msta || !msta->vif)
  183. return -EINVAL;
  184. sta = container_of((void *)msta, struct ieee80211_sta, drv_priv);
  185. vif = container_of((void *)msta->vif, struct ieee80211_vif, drv_priv);
  186. /* store the info from RXD and ethhdr to avoid being overridden */
  187. frame_control = le32_get_bits(rxd[8], MT_RXD8_FRAME_CONTROL);
  188. hdr.frame_control = cpu_to_le16(frame_control);
  189. hdr.seq_ctrl = cpu_to_le16(le32_get_bits(rxd[10], MT_RXD10_SEQ_CTRL));
  190. hdr.duration_id = 0;
  191. ether_addr_copy(hdr.addr1, vif->addr);
  192. ether_addr_copy(hdr.addr2, sta->addr);
  193. switch (frame_control & (IEEE80211_FCTL_TODS |
  194. IEEE80211_FCTL_FROMDS)) {
  195. case 0:
  196. ether_addr_copy(hdr.addr3, vif->bss_conf.bssid);
  197. break;
  198. case IEEE80211_FCTL_FROMDS:
  199. ether_addr_copy(hdr.addr3, eth_hdr->h_source);
  200. break;
  201. case IEEE80211_FCTL_TODS:
  202. ether_addr_copy(hdr.addr3, eth_hdr->h_dest);
  203. break;
  204. case IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS:
  205. ether_addr_copy(hdr.addr3, eth_hdr->h_dest);
  206. ether_addr_copy(hdr.addr4, eth_hdr->h_source);
  207. break;
  208. default:
  209. return -EINVAL;
  210. }
  211. skb_pull(skb, hdr_gap + sizeof(struct ethhdr) - 2);
  212. if (eth_hdr->h_proto == cpu_to_be16(ETH_P_AARP) ||
  213. eth_hdr->h_proto == cpu_to_be16(ETH_P_IPX))
  214. ether_addr_copy(skb_push(skb, ETH_ALEN), bridge_tunnel_header);
  215. else if (be16_to_cpu(eth_hdr->h_proto) >= ETH_P_802_3_MIN)
  216. ether_addr_copy(skb_push(skb, ETH_ALEN), rfc1042_header);
  217. else
  218. skb_pull(skb, 2);
  219. if (ieee80211_has_order(hdr.frame_control))
  220. memcpy(skb_push(skb, IEEE80211_HT_CTL_LEN), &rxd[11],
  221. IEEE80211_HT_CTL_LEN);
  222. if (ieee80211_is_data_qos(hdr.frame_control)) {
  223. __le16 qos_ctrl;
  224. qos_ctrl = cpu_to_le16(le32_get_bits(rxd[10], MT_RXD10_QOS_CTL));
  225. memcpy(skb_push(skb, IEEE80211_QOS_CTL_LEN), &qos_ctrl,
  226. IEEE80211_QOS_CTL_LEN);
  227. }
  228. if (ieee80211_has_a4(hdr.frame_control))
  229. memcpy(skb_push(skb, sizeof(hdr)), &hdr, sizeof(hdr));
  230. else
  231. memcpy(skb_push(skb, sizeof(hdr) - 6), &hdr, sizeof(hdr) - 6);
  232. return 0;
  233. }
  234. static int
  235. mt7996_mac_fill_rx_rate(struct mt7996_dev *dev,
  236. struct mt76_rx_status *status,
  237. struct ieee80211_supported_band *sband,
  238. __le32 *rxv, u8 *mode)
  239. {
  240. u32 v0, v2;
  241. u8 stbc, gi, bw, dcm, nss;
  242. int i, idx;
  243. bool cck = false;
  244. v0 = le32_to_cpu(rxv[0]);
  245. v2 = le32_to_cpu(rxv[2]);
  246. idx = FIELD_GET(MT_PRXV_TX_RATE, v0);
  247. i = idx;
  248. nss = FIELD_GET(MT_PRXV_NSTS, v0) + 1;
  249. stbc = FIELD_GET(MT_PRXV_HT_STBC, v2);
  250. gi = FIELD_GET(MT_PRXV_HT_SHORT_GI, v2);
  251. *mode = FIELD_GET(MT_PRXV_TX_MODE, v2);
  252. dcm = FIELD_GET(MT_PRXV_DCM, v2);
  253. bw = FIELD_GET(MT_PRXV_FRAME_MODE, v2);
  254. switch (*mode) {
  255. case MT_PHY_TYPE_CCK:
  256. cck = true;
  257. fallthrough;
  258. case MT_PHY_TYPE_OFDM:
  259. i = mt76_get_rate(&dev->mt76, sband, i, cck);
  260. break;
  261. case MT_PHY_TYPE_HT_GF:
  262. case MT_PHY_TYPE_HT:
  263. status->encoding = RX_ENC_HT;
  264. if (gi)
  265. status->enc_flags |= RX_ENC_FLAG_SHORT_GI;
  266. if (i > 31)
  267. return -EINVAL;
  268. break;
  269. case MT_PHY_TYPE_VHT:
  270. status->nss = nss;
  271. status->encoding = RX_ENC_VHT;
  272. if (gi)
  273. status->enc_flags |= RX_ENC_FLAG_SHORT_GI;
  274. if (i > 11)
  275. return -EINVAL;
  276. break;
  277. case MT_PHY_TYPE_HE_MU:
  278. case MT_PHY_TYPE_HE_SU:
  279. case MT_PHY_TYPE_HE_EXT_SU:
  280. case MT_PHY_TYPE_HE_TB:
  281. status->nss = nss;
  282. status->encoding = RX_ENC_HE;
  283. i &= GENMASK(3, 0);
  284. if (gi <= NL80211_RATE_INFO_HE_GI_3_2)
  285. status->he_gi = gi;
  286. status->he_dcm = dcm;
  287. break;
  288. case MT_PHY_TYPE_EHT_SU:
  289. case MT_PHY_TYPE_EHT_TRIG:
  290. case MT_PHY_TYPE_EHT_MU:
  291. status->nss = nss;
  292. status->encoding = RX_ENC_EHT;
  293. i &= GENMASK(3, 0);
  294. if (gi <= NL80211_RATE_INFO_EHT_GI_3_2)
  295. status->eht.gi = gi;
  296. break;
  297. default:
  298. return -EINVAL;
  299. }
  300. status->rate_idx = i;
  301. switch (bw) {
  302. case IEEE80211_STA_RX_BW_20:
  303. break;
  304. case IEEE80211_STA_RX_BW_40:
  305. if (*mode & MT_PHY_TYPE_HE_EXT_SU &&
  306. (idx & MT_PRXV_TX_ER_SU_106T)) {
  307. status->bw = RATE_INFO_BW_HE_RU;
  308. status->he_ru =
  309. NL80211_RATE_INFO_HE_RU_ALLOC_106;
  310. } else {
  311. status->bw = RATE_INFO_BW_40;
  312. }
  313. break;
  314. case IEEE80211_STA_RX_BW_80:
  315. status->bw = RATE_INFO_BW_80;
  316. break;
  317. case IEEE80211_STA_RX_BW_160:
  318. status->bw = RATE_INFO_BW_160;
  319. break;
  320. /* rxv reports bw 320-1 and 320-2 separately */
  321. case IEEE80211_STA_RX_BW_320:
  322. case IEEE80211_STA_RX_BW_320 + 1:
  323. status->bw = RATE_INFO_BW_320;
  324. break;
  325. default:
  326. return -EINVAL;
  327. }
  328. status->enc_flags |= RX_ENC_FLAG_STBC_MASK * stbc;
  329. if (*mode < MT_PHY_TYPE_HE_SU && gi)
  330. status->enc_flags |= RX_ENC_FLAG_SHORT_GI;
  331. return 0;
  332. }
  333. static void
  334. mt7996_wed_check_ppe(struct mt7996_dev *dev, struct mt76_queue *q,
  335. struct mt7996_sta *msta, struct sk_buff *skb,
  336. u32 info)
  337. {
  338. struct ieee80211_vif *vif;
  339. struct wireless_dev *wdev;
  340. if (!msta || !msta->vif)
  341. return;
  342. if (!mt76_queue_is_wed_rx(q))
  343. return;
  344. if (!(info & MT_DMA_INFO_PPE_VLD))
  345. return;
  346. vif = container_of((void *)msta->vif, struct ieee80211_vif,
  347. drv_priv);
  348. wdev = ieee80211_vif_to_wdev(vif);
  349. skb->dev = wdev->netdev;
  350. mtk_wed_device_ppe_check(&dev->mt76.mmio.wed, skb,
  351. FIELD_GET(MT_DMA_PPE_CPU_REASON, info),
  352. FIELD_GET(MT_DMA_PPE_ENTRY, info));
  353. }
  354. static int
  355. mt7996_mac_fill_rx(struct mt7996_dev *dev, enum mt76_rxq_id q,
  356. struct sk_buff *skb, u32 *info)
  357. {
  358. struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
  359. struct mt76_phy *mphy = &dev->mt76.phy;
  360. struct mt7996_phy *phy = &dev->phy;
  361. struct ieee80211_supported_band *sband;
  362. __le32 *rxd = (__le32 *)skb->data;
  363. __le32 *rxv = NULL;
  364. u32 rxd0 = le32_to_cpu(rxd[0]);
  365. u32 rxd1 = le32_to_cpu(rxd[1]);
  366. u32 rxd2 = le32_to_cpu(rxd[2]);
  367. u32 rxd3 = le32_to_cpu(rxd[3]);
  368. u32 rxd4 = le32_to_cpu(rxd[4]);
  369. u32 csum_mask = MT_RXD3_NORMAL_IP_SUM | MT_RXD3_NORMAL_UDP_TCP_SUM;
  370. u32 csum_status = *(u32 *)skb->cb;
  371. u32 mesh_mask = MT_RXD0_MESH | MT_RXD0_MHCP;
  372. bool is_mesh = (rxd0 & mesh_mask) == mesh_mask;
  373. bool unicast, insert_ccmp_hdr = false;
  374. u8 remove_pad, amsdu_info, band_idx;
  375. u8 mode = 0, qos_ctl = 0;
  376. bool hdr_trans;
  377. u16 hdr_gap;
  378. u16 seq_ctrl = 0;
  379. __le16 fc = 0;
  380. int idx;
  381. u8 hw_aggr = false;
  382. struct mt7996_sta *msta = NULL;
  383. hw_aggr = status->aggr;
  384. memset(status, 0, sizeof(*status));
  385. band_idx = FIELD_GET(MT_RXD1_NORMAL_BAND_IDX, rxd1);
  386. mphy = dev->mt76.phys[band_idx];
  387. phy = mphy->priv;
  388. status->phy_idx = mphy->band_idx;
  389. if (!test_bit(MT76_STATE_RUNNING, &mphy->state))
  390. return -EINVAL;
  391. if (rxd2 & MT_RXD2_NORMAL_AMSDU_ERR)
  392. return -EINVAL;
  393. hdr_trans = rxd2 & MT_RXD2_NORMAL_HDR_TRANS;
  394. if (hdr_trans && (rxd1 & MT_RXD1_NORMAL_CM))
  395. return -EINVAL;
  396. /* ICV error or CCMP/BIP/WPI MIC error */
  397. if (rxd1 & MT_RXD1_NORMAL_ICV_ERR)
  398. status->flag |= RX_FLAG_ONLY_MONITOR;
  399. unicast = FIELD_GET(MT_RXD3_NORMAL_ADDR_TYPE, rxd3) == MT_RXD3_NORMAL_U2M;
  400. idx = FIELD_GET(MT_RXD1_NORMAL_WLAN_IDX, rxd1);
  401. status->wcid = mt7996_rx_get_wcid(dev, idx, unicast);
  402. if (status->wcid) {
  403. msta = container_of(status->wcid, struct mt7996_sta, wcid);
  404. spin_lock_bh(&dev->mt76.sta_poll_lock);
  405. if (list_empty(&msta->wcid.poll_list))
  406. list_add_tail(&msta->wcid.poll_list,
  407. &dev->mt76.sta_poll_list);
  408. spin_unlock_bh(&dev->mt76.sta_poll_lock);
  409. }
  410. status->freq = mphy->chandef.chan->center_freq;
  411. status->band = mphy->chandef.chan->band;
  412. if (status->band == NL80211_BAND_5GHZ)
  413. sband = &mphy->sband_5g.sband;
  414. else if (status->band == NL80211_BAND_6GHZ)
  415. sband = &mphy->sband_6g.sband;
  416. else
  417. sband = &mphy->sband_2g.sband;
  418. if (!sband->channels)
  419. return -EINVAL;
  420. if ((rxd3 & csum_mask) == csum_mask &&
  421. !(csum_status & (BIT(0) | BIT(2) | BIT(3))))
  422. skb->ip_summed = CHECKSUM_UNNECESSARY;
  423. if (rxd1 & MT_RXD3_NORMAL_FCS_ERR)
  424. status->flag |= RX_FLAG_FAILED_FCS_CRC;
  425. if (rxd1 & MT_RXD1_NORMAL_TKIP_MIC_ERR)
  426. status->flag |= RX_FLAG_MMIC_ERROR;
  427. if (FIELD_GET(MT_RXD2_NORMAL_SEC_MODE, rxd2) != 0 &&
  428. !(rxd1 & (MT_RXD1_NORMAL_CLM | MT_RXD1_NORMAL_CM))) {
  429. status->flag |= RX_FLAG_DECRYPTED;
  430. status->flag |= RX_FLAG_IV_STRIPPED;
  431. status->flag |= RX_FLAG_MMIC_STRIPPED | RX_FLAG_MIC_STRIPPED;
  432. }
  433. remove_pad = FIELD_GET(MT_RXD2_NORMAL_HDR_OFFSET, rxd2);
  434. if (rxd2 & MT_RXD2_NORMAL_MAX_LEN_ERROR)
  435. return -EINVAL;
  436. rxd += 8;
  437. if (rxd1 & MT_RXD1_NORMAL_GROUP_4) {
  438. u32 v0 = le32_to_cpu(rxd[0]);
  439. u32 v2 = le32_to_cpu(rxd[2]);
  440. fc = cpu_to_le16(FIELD_GET(MT_RXD8_FRAME_CONTROL, v0));
  441. qos_ctl = FIELD_GET(MT_RXD10_QOS_CTL, v2);
  442. seq_ctrl = FIELD_GET(MT_RXD10_SEQ_CTRL, v2);
  443. rxd += 4;
  444. if ((u8 *)rxd - skb->data >= skb->len)
  445. return -EINVAL;
  446. }
  447. if (rxd1 & MT_RXD1_NORMAL_GROUP_1) {
  448. u8 *data = (u8 *)rxd;
  449. if (status->flag & RX_FLAG_DECRYPTED) {
  450. switch (FIELD_GET(MT_RXD2_NORMAL_SEC_MODE, rxd2)) {
  451. case MT_CIPHER_AES_CCMP:
  452. case MT_CIPHER_CCMP_CCX:
  453. case MT_CIPHER_CCMP_256:
  454. insert_ccmp_hdr =
  455. FIELD_GET(MT_RXD2_NORMAL_FRAG, rxd2);
  456. fallthrough;
  457. case MT_CIPHER_TKIP:
  458. case MT_CIPHER_TKIP_NO_MIC:
  459. case MT_CIPHER_GCMP:
  460. case MT_CIPHER_GCMP_256:
  461. status->iv[0] = data[5];
  462. status->iv[1] = data[4];
  463. status->iv[2] = data[3];
  464. status->iv[3] = data[2];
  465. status->iv[4] = data[1];
  466. status->iv[5] = data[0];
  467. break;
  468. default:
  469. break;
  470. }
  471. }
  472. rxd += 4;
  473. if ((u8 *)rxd - skb->data >= skb->len)
  474. return -EINVAL;
  475. }
  476. if (rxd1 & MT_RXD1_NORMAL_GROUP_2) {
  477. status->timestamp = le32_to_cpu(rxd[0]);
  478. status->flag |= RX_FLAG_MACTIME_START;
  479. if (!(rxd2 & MT_RXD2_NORMAL_NON_AMPDU)) {
  480. status->flag |= RX_FLAG_AMPDU_DETAILS;
  481. /* all subframes of an A-MPDU have the same timestamp */
  482. if (phy->rx_ampdu_ts != status->timestamp) {
  483. if (!++phy->ampdu_ref)
  484. phy->ampdu_ref++;
  485. }
  486. phy->rx_ampdu_ts = status->timestamp;
  487. status->ampdu_ref = phy->ampdu_ref;
  488. }
  489. rxd += 4;
  490. if ((u8 *)rxd - skb->data >= skb->len)
  491. return -EINVAL;
  492. }
  493. /* RXD Group 3 - P-RXV */
  494. if (rxd1 & MT_RXD1_NORMAL_GROUP_3) {
  495. u32 v3;
  496. int ret;
  497. rxv = rxd;
  498. rxd += 4;
  499. if ((u8 *)rxd - skb->data >= skb->len)
  500. return -EINVAL;
  501. v3 = le32_to_cpu(rxv[3]);
  502. status->chains = mphy->antenna_mask;
  503. status->chain_signal[0] = to_rssi(MT_PRXV_RCPI0, v3);
  504. status->chain_signal[1] = to_rssi(MT_PRXV_RCPI1, v3);
  505. status->chain_signal[2] = to_rssi(MT_PRXV_RCPI2, v3);
  506. status->chain_signal[3] = to_rssi(MT_PRXV_RCPI3, v3);
  507. /* RXD Group 5 - C-RXV */
  508. if (rxd1 & MT_RXD1_NORMAL_GROUP_5) {
  509. rxd += 24;
  510. if ((u8 *)rxd - skb->data >= skb->len)
  511. return -EINVAL;
  512. }
  513. ret = mt7996_mac_fill_rx_rate(dev, status, sband, rxv, &mode);
  514. if (ret < 0)
  515. return ret;
  516. }
  517. amsdu_info = FIELD_GET(MT_RXD4_NORMAL_PAYLOAD_FORMAT, rxd4);
  518. status->amsdu = !!amsdu_info;
  519. if (status->amsdu) {
  520. status->first_amsdu = amsdu_info == MT_RXD4_FIRST_AMSDU_FRAME;
  521. status->last_amsdu = amsdu_info == MT_RXD4_LAST_AMSDU_FRAME;
  522. }
  523. /* IEEE 802.11 fragmentation can only be applied to unicast frames.
  524. * Hence, drop fragments with multicast/broadcast RA.
  525. * This check fixes vulnerabilities, like CVE-2020-26145.
  526. */
  527. if ((ieee80211_has_morefrags(fc) || seq_ctrl & IEEE80211_SCTL_FRAG) &&
  528. FIELD_GET(MT_RXD3_NORMAL_ADDR_TYPE, rxd3) != MT_RXD3_NORMAL_U2M)
  529. return -EINVAL;
  530. hdr_gap = (u8 *)rxd - skb->data + 2 * remove_pad;
  531. if (hdr_trans && ieee80211_has_morefrags(fc)) {
  532. if (mt7996_reverse_frag0_hdr_trans(skb, hdr_gap))
  533. return -EINVAL;
  534. hdr_trans = false;
  535. } else {
  536. int pad_start = 0;
  537. skb_pull(skb, hdr_gap);
  538. if (!hdr_trans && status->amsdu && !(ieee80211_has_a4(fc) && is_mesh)) {
  539. pad_start = ieee80211_get_hdrlen_from_skb(skb);
  540. } else if (hdr_trans && (rxd2 & MT_RXD2_NORMAL_HDR_TRANS_ERROR)) {
  541. /* When header translation failure is indicated,
  542. * the hardware will insert an extra 2-byte field
  543. * containing the data length after the protocol
  544. * type field. This happens either when the LLC-SNAP
  545. * pattern did not match, or if a VLAN header was
  546. * detected.
  547. */
  548. pad_start = 12;
  549. if (get_unaligned_be16(skb->data + pad_start) == ETH_P_8021Q)
  550. pad_start += 4;
  551. else
  552. pad_start = 0;
  553. }
  554. if (pad_start) {
  555. memmove(skb->data + 2, skb->data, pad_start);
  556. skb_pull(skb, 2);
  557. }
  558. }
  559. if (!hdr_trans) {
  560. struct ieee80211_hdr *hdr;
  561. if (insert_ccmp_hdr) {
  562. u8 key_id = FIELD_GET(MT_RXD1_NORMAL_KEY_ID, rxd1);
  563. mt76_insert_ccmp_hdr(skb, key_id);
  564. }
  565. hdr = mt76_skb_get_hdr(skb);
  566. fc = hdr->frame_control;
  567. if (ieee80211_is_data_qos(fc)) {
  568. u8 *qos = ieee80211_get_qos_ctl(hdr);
  569. seq_ctrl = le16_to_cpu(hdr->seq_ctrl);
  570. qos_ctl = *qos;
  571. /* Mesh DA/SA/Length will be stripped after hardware
  572. * de-amsdu, so here needs to clear amsdu present bit
  573. * to mark it as a normal mesh frame.
  574. */
  575. if (ieee80211_has_a4(fc) && is_mesh && status->amsdu)
  576. *qos &= ~IEEE80211_QOS_CTL_A_MSDU_PRESENT;
  577. }
  578. } else {
  579. status->flag |= RX_FLAG_8023;
  580. mt7996_wed_check_ppe(dev, &dev->mt76.q_rx[q], msta, skb,
  581. *info);
  582. }
  583. if (rxv && mode >= MT_PHY_TYPE_HE_SU && !(status->flag & RX_FLAG_8023))
  584. mt76_connac3_mac_decode_he_radiotap(skb, rxv, mode);
  585. if (!status->wcid || !ieee80211_is_data_qos(fc) || hw_aggr)
  586. return 0;
  587. status->aggr = unicast &&
  588. !ieee80211_is_qos_nullfunc(fc);
  589. status->qos_ctl = qos_ctl;
  590. status->seqno = IEEE80211_SEQ_TO_SN(seq_ctrl);
  591. return 0;
  592. }
  593. static void
  594. mt7996_mac_write_txwi_8023(struct mt7996_dev *dev, __le32 *txwi,
  595. struct sk_buff *skb, struct mt76_wcid *wcid)
  596. {
  597. u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
  598. u8 fc_type, fc_stype;
  599. u16 ethertype;
  600. bool wmm = false;
  601. u32 val;
  602. if (wcid->sta) {
  603. struct ieee80211_sta *sta;
  604. sta = container_of((void *)wcid, struct ieee80211_sta, drv_priv);
  605. wmm = sta->wme;
  606. }
  607. val = FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_802_3) |
  608. FIELD_PREP(MT_TXD1_TID, tid);
  609. ethertype = get_unaligned_be16(&skb->data[12]);
  610. if (ethertype >= ETH_P_802_3_MIN)
  611. val |= MT_TXD1_ETH_802_3;
  612. txwi[1] |= cpu_to_le32(val);
  613. fc_type = IEEE80211_FTYPE_DATA >> 2;
  614. fc_stype = wmm ? IEEE80211_STYPE_QOS_DATA >> 4 : 0;
  615. val = FIELD_PREP(MT_TXD2_FRAME_TYPE, fc_type) |
  616. FIELD_PREP(MT_TXD2_SUB_TYPE, fc_stype);
  617. txwi[2] |= cpu_to_le32(val);
  618. if (wcid->amsdu)
  619. txwi[3] |= cpu_to_le32(MT_TXD3_HW_AMSDU);
  620. }
  621. static void
  622. mt7996_mac_write_txwi_80211(struct mt7996_dev *dev, __le32 *txwi,
  623. struct sk_buff *skb, struct ieee80211_key_conf *key)
  624. {
  625. struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
  626. struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data;
  627. struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
  628. bool multicast = is_multicast_ether_addr(hdr->addr1);
  629. u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
  630. __le16 fc = hdr->frame_control, sc = hdr->seq_ctrl;
  631. u8 fc_type, fc_stype;
  632. u32 val;
  633. if (ieee80211_is_action(fc) &&
  634. mgmt->u.action.category == WLAN_CATEGORY_BACK &&
  635. mgmt->u.action.u.addba_req.action_code == WLAN_ACTION_ADDBA_REQ)
  636. tid = MT_TX_ADDBA;
  637. else if (ieee80211_is_mgmt(hdr->frame_control))
  638. tid = MT_TX_NORMAL;
  639. val = FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_802_11) |
  640. FIELD_PREP(MT_TXD1_HDR_INFO,
  641. ieee80211_get_hdrlen_from_skb(skb) / 2) |
  642. FIELD_PREP(MT_TXD1_TID, tid);
  643. if (!ieee80211_is_data(fc) || multicast ||
  644. info->flags & IEEE80211_TX_CTL_USE_MINRATE)
  645. val |= MT_TXD1_FIXED_RATE;
  646. if (key && multicast && ieee80211_is_robust_mgmt_frame(skb) &&
  647. key->cipher == WLAN_CIPHER_SUITE_AES_CMAC) {
  648. val |= MT_TXD1_BIP;
  649. txwi[3] &= ~cpu_to_le32(MT_TXD3_PROTECT_FRAME);
  650. }
  651. txwi[1] |= cpu_to_le32(val);
  652. fc_type = (le16_to_cpu(fc) & IEEE80211_FCTL_FTYPE) >> 2;
  653. fc_stype = (le16_to_cpu(fc) & IEEE80211_FCTL_STYPE) >> 4;
  654. val = FIELD_PREP(MT_TXD2_FRAME_TYPE, fc_type) |
  655. FIELD_PREP(MT_TXD2_SUB_TYPE, fc_stype);
  656. if (ieee80211_has_morefrags(fc) && ieee80211_is_first_frag(sc))
  657. val |= FIELD_PREP(MT_TXD2_FRAG, MT_TX_FRAG_FIRST);
  658. else if (ieee80211_has_morefrags(fc) && !ieee80211_is_first_frag(sc))
  659. val |= FIELD_PREP(MT_TXD2_FRAG, MT_TX_FRAG_MID);
  660. else if (!ieee80211_has_morefrags(fc) && !ieee80211_is_first_frag(sc))
  661. val |= FIELD_PREP(MT_TXD2_FRAG, MT_TX_FRAG_LAST);
  662. else
  663. val |= FIELD_PREP(MT_TXD2_FRAG, MT_TX_FRAG_NONE);
  664. txwi[2] |= cpu_to_le32(val);
  665. txwi[3] |= cpu_to_le32(FIELD_PREP(MT_TXD3_BCM, multicast));
  666. if (ieee80211_is_beacon(fc)) {
  667. txwi[3] &= ~cpu_to_le32(MT_TXD3_SW_POWER_MGMT);
  668. txwi[3] |= cpu_to_le32(MT_TXD3_REM_TX_COUNT);
  669. }
  670. if (info->flags & IEEE80211_TX_CTL_INJECTED) {
  671. u16 seqno = le16_to_cpu(sc);
  672. if (ieee80211_is_back_req(hdr->frame_control)) {
  673. struct ieee80211_bar *bar;
  674. bar = (struct ieee80211_bar *)skb->data;
  675. seqno = le16_to_cpu(bar->start_seq_num);
  676. }
  677. val = MT_TXD3_SN_VALID |
  678. FIELD_PREP(MT_TXD3_SEQ, IEEE80211_SEQ_TO_SN(seqno));
  679. txwi[3] |= cpu_to_le32(val);
  680. txwi[3] &= ~cpu_to_le32(MT_TXD3_HW_AMSDU);
  681. }
  682. }
  683. void mt7996_mac_write_txwi(struct mt7996_dev *dev, __le32 *txwi,
  684. struct sk_buff *skb, struct mt76_wcid *wcid,
  685. struct ieee80211_key_conf *key, int pid,
  686. enum mt76_txq_id qid, u32 changed)
  687. {
  688. struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
  689. struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
  690. struct ieee80211_vif *vif = info->control.vif;
  691. u8 band_idx = (info->hw_queue & MT_TX_HW_QUEUE_PHY) >> 2;
  692. u8 p_fmt, q_idx, omac_idx = 0, wmm_idx = 0;
  693. bool is_8023 = info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP;
  694. struct mt76_vif *mvif;
  695. u16 tx_count = 15;
  696. u32 val;
  697. bool inband_disc = !!(changed & (BSS_CHANGED_UNSOL_BCAST_PROBE_RESP |
  698. BSS_CHANGED_FILS_DISCOVERY));
  699. bool beacon = !!(changed & (BSS_CHANGED_BEACON |
  700. BSS_CHANGED_BEACON_ENABLED)) && (!inband_disc);
  701. mvif = vif ? (struct mt76_vif *)vif->drv_priv : NULL;
  702. if (mvif) {
  703. omac_idx = mvif->omac_idx;
  704. wmm_idx = mvif->wmm_idx;
  705. band_idx = mvif->band_idx;
  706. }
  707. if (inband_disc) {
  708. p_fmt = MT_TX_TYPE_FW;
  709. q_idx = MT_LMAC_ALTX0;
  710. } else if (beacon) {
  711. p_fmt = MT_TX_TYPE_FW;
  712. q_idx = MT_LMAC_BCN0;
  713. } else if (qid >= MT_TXQ_PSD) {
  714. p_fmt = MT_TX_TYPE_CT;
  715. q_idx = MT_LMAC_ALTX0;
  716. } else {
  717. p_fmt = MT_TX_TYPE_CT;
  718. q_idx = wmm_idx * MT7996_MAX_WMM_SETS +
  719. mt76_connac_lmac_mapping(skb_get_queue_mapping(skb));
  720. }
  721. val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len + MT_TXD_SIZE) |
  722. FIELD_PREP(MT_TXD0_PKT_FMT, p_fmt) |
  723. FIELD_PREP(MT_TXD0_Q_IDX, q_idx);
  724. txwi[0] = cpu_to_le32(val);
  725. val = FIELD_PREP(MT_TXD1_WLAN_IDX, wcid->idx) |
  726. FIELD_PREP(MT_TXD1_OWN_MAC, omac_idx);
  727. if (band_idx)
  728. val |= FIELD_PREP(MT_TXD1_TGID, band_idx);
  729. txwi[1] = cpu_to_le32(val);
  730. txwi[2] = 0;
  731. val = MT_TXD3_SW_POWER_MGMT |
  732. FIELD_PREP(MT_TXD3_REM_TX_COUNT, tx_count);
  733. if (key)
  734. val |= MT_TXD3_PROTECT_FRAME;
  735. if (info->flags & IEEE80211_TX_CTL_NO_ACK)
  736. val |= MT_TXD3_NO_ACK;
  737. txwi[3] = cpu_to_le32(val);
  738. txwi[4] = 0;
  739. val = FIELD_PREP(MT_TXD5_PID, pid);
  740. if (pid >= MT_PACKET_ID_FIRST)
  741. val |= MT_TXD5_TX_STATUS_HOST;
  742. txwi[5] = cpu_to_le32(val);
  743. val = MT_TXD6_DIS_MAT | MT_TXD6_DAS;
  744. if (is_mt7996(&dev->mt76))
  745. val |= FIELD_PREP(MT_TXD6_MSDU_CNT, 1);
  746. else if (is_8023 || !ieee80211_is_mgmt(hdr->frame_control))
  747. val |= FIELD_PREP(MT_TXD6_MSDU_CNT_V2, 1);
  748. txwi[6] = cpu_to_le32(val);
  749. txwi[7] = 0;
  750. if (is_8023)
  751. mt7996_mac_write_txwi_8023(dev, txwi, skb, wcid);
  752. else
  753. mt7996_mac_write_txwi_80211(dev, txwi, skb, key);
  754. if (txwi[1] & cpu_to_le32(MT_TXD1_FIXED_RATE)) {
  755. bool mcast = ieee80211_is_data(hdr->frame_control) &&
  756. is_multicast_ether_addr(hdr->addr1);
  757. u8 idx = MT7996_BASIC_RATES_TBL;
  758. if (mvif) {
  759. if (mcast && mvif->mcast_rates_idx)
  760. idx = mvif->mcast_rates_idx;
  761. else if (beacon && mvif->beacon_rates_idx)
  762. idx = mvif->beacon_rates_idx;
  763. else
  764. idx = mvif->basic_rates_idx;
  765. }
  766. val = FIELD_PREP(MT_TXD6_TX_RATE, idx) | MT_TXD6_FIXED_BW;
  767. txwi[6] |= cpu_to_le32(val);
  768. txwi[3] |= cpu_to_le32(MT_TXD3_BA_DISABLE);
  769. }
  770. }
  771. int mt7996_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
  772. enum mt76_txq_id qid, struct mt76_wcid *wcid,
  773. struct ieee80211_sta *sta,
  774. struct mt76_tx_info *tx_info)
  775. {
  776. struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx_info->skb->data;
  777. struct mt7996_dev *dev = container_of(mdev, struct mt7996_dev, mt76);
  778. struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx_info->skb);
  779. struct ieee80211_key_conf *key = info->control.hw_key;
  780. struct ieee80211_vif *vif = info->control.vif;
  781. struct mt76_connac_txp_common *txp;
  782. struct mt76_txwi_cache *t;
  783. int id, i, pid, nbuf = tx_info->nbuf - 1;
  784. bool is_8023 = info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP;
  785. u8 *txwi = (u8 *)txwi_ptr;
  786. if (unlikely(tx_info->skb->len <= ETH_HLEN))
  787. return -EINVAL;
  788. if (!wcid)
  789. wcid = &dev->mt76.global_wcid;
  790. t = (struct mt76_txwi_cache *)(txwi + mdev->drv->txwi_size);
  791. t->skb = tx_info->skb;
  792. id = mt76_token_consume(mdev, &t);
  793. if (id < 0)
  794. return id;
  795. pid = mt76_tx_status_skb_add(mdev, wcid, tx_info->skb);
  796. mt7996_mac_write_txwi(dev, txwi_ptr, tx_info->skb, wcid, key,
  797. pid, qid, 0);
  798. txp = (struct mt76_connac_txp_common *)(txwi + MT_TXD_SIZE);
  799. for (i = 0; i < nbuf; i++) {
  800. u16 len;
  801. len = FIELD_PREP(MT_TXP_BUF_LEN, tx_info->buf[i + 1].len);
  802. #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
  803. len |= FIELD_PREP(MT_TXP_DMA_ADDR_H,
  804. tx_info->buf[i + 1].addr >> 32);
  805. #endif
  806. txp->fw.buf[i] = cpu_to_le32(tx_info->buf[i + 1].addr);
  807. txp->fw.len[i] = cpu_to_le16(len);
  808. }
  809. txp->fw.nbuf = nbuf;
  810. txp->fw.flags =
  811. cpu_to_le16(MT_CT_INFO_FROM_HOST | MT_CT_INFO_APPLY_TXD);
  812. if (!key)
  813. txp->fw.flags |= cpu_to_le16(MT_CT_INFO_NONE_CIPHER_FRAME);
  814. if (!is_8023 && ieee80211_is_mgmt(hdr->frame_control))
  815. txp->fw.flags |= cpu_to_le16(MT_CT_INFO_MGMT_FRAME);
  816. if (vif) {
  817. struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv;
  818. txp->fw.bss_idx = mvif->mt76.idx;
  819. }
  820. txp->fw.token = cpu_to_le16(id);
  821. txp->fw.rept_wds_wcid = cpu_to_le16(sta ? wcid->idx : 0xfff);
  822. tx_info->skb = NULL;
  823. /* pass partial skb header to fw */
  824. tx_info->buf[1].len = MT_CT_PARSE_LEN;
  825. tx_info->buf[1].skip_unmap = true;
  826. tx_info->nbuf = MT_CT_DMA_BUF_NUM;
  827. return 0;
  828. }
  829. u32 mt7996_wed_init_buf(void *ptr, dma_addr_t phys, int token_id)
  830. {
  831. struct mt76_connac_fw_txp *txp = ptr + MT_TXD_SIZE;
  832. __le32 *txwi = ptr;
  833. u32 val;
  834. memset(ptr, 0, MT_TXD_SIZE + sizeof(*txp));
  835. val = FIELD_PREP(MT_TXD0_TX_BYTES, MT_TXD_SIZE) |
  836. FIELD_PREP(MT_TXD0_PKT_FMT, MT_TX_TYPE_CT);
  837. txwi[0] = cpu_to_le32(val);
  838. val = BIT(31) |
  839. FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_802_3);
  840. txwi[1] = cpu_to_le32(val);
  841. txp->token = cpu_to_le16(token_id);
  842. txp->nbuf = 1;
  843. txp->buf[0] = cpu_to_le32(phys + MT_TXD_SIZE + sizeof(*txp));
  844. return MT_TXD_SIZE + sizeof(*txp);
  845. }
  846. static void
  847. mt7996_tx_check_aggr(struct ieee80211_sta *sta, struct sk_buff *skb)
  848. {
  849. struct mt7996_sta *msta;
  850. struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
  851. bool is_8023 = info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP;
  852. u16 fc, tid;
  853. if (!sta || !(sta->deflink.ht_cap.ht_supported || sta->deflink.he_cap.has_he))
  854. return;
  855. tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
  856. if (tid >= 6) /* skip VO queue */
  857. return;
  858. if (is_8023) {
  859. fc = IEEE80211_FTYPE_DATA |
  860. (sta->wme ? IEEE80211_STYPE_QOS_DATA : IEEE80211_STYPE_DATA);
  861. } else {
  862. /* No need to get precise TID for Action/Management Frame,
  863. * since it will not meet the following Frame Control
  864. * condition anyway.
  865. */
  866. struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
  867. fc = le16_to_cpu(hdr->frame_control) &
  868. (IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE);
  869. }
  870. if (unlikely(fc != (IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_DATA)))
  871. return;
  872. msta = (struct mt7996_sta *)sta->drv_priv;
  873. if (!test_and_set_bit(tid, &msta->wcid.ampdu_state))
  874. ieee80211_start_tx_ba_session(sta, tid, 0);
  875. }
  876. static void
  877. mt7996_txwi_free(struct mt7996_dev *dev, struct mt76_txwi_cache *t,
  878. struct ieee80211_sta *sta, struct list_head *free_list)
  879. {
  880. struct mt76_dev *mdev = &dev->mt76;
  881. struct mt76_wcid *wcid;
  882. __le32 *txwi;
  883. u16 wcid_idx;
  884. mt76_connac_txp_skb_unmap(mdev, t);
  885. if (!t->skb)
  886. goto out;
  887. txwi = (__le32 *)mt76_get_txwi_ptr(mdev, t);
  888. if (sta) {
  889. wcid = (struct mt76_wcid *)sta->drv_priv;
  890. wcid_idx = wcid->idx;
  891. if (likely(t->skb->protocol != cpu_to_be16(ETH_P_PAE)))
  892. mt7996_tx_check_aggr(sta, t->skb);
  893. } else {
  894. wcid_idx = le32_get_bits(txwi[9], MT_TXD9_WLAN_IDX);
  895. }
  896. __mt76_tx_complete_skb(mdev, wcid_idx, t->skb, free_list);
  897. out:
  898. t->skb = NULL;
  899. mt76_put_txwi(mdev, t);
  900. }
  901. static void
  902. mt7996_mac_tx_free(struct mt7996_dev *dev, void *data, int len)
  903. {
  904. __le32 *tx_free = (__le32 *)data, *cur_info;
  905. struct mt76_dev *mdev = &dev->mt76;
  906. struct mt76_phy *phy2 = mdev->phys[MT_BAND1];
  907. struct mt76_phy *phy3 = mdev->phys[MT_BAND2];
  908. struct mt76_txwi_cache *txwi;
  909. struct ieee80211_sta *sta = NULL;
  910. struct mt76_wcid *wcid = NULL;
  911. LIST_HEAD(free_list);
  912. struct sk_buff *skb, *tmp;
  913. void *end = data + len;
  914. bool wake = false;
  915. u16 total, count = 0;
  916. /* clean DMA queues and unmap buffers first */
  917. mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[MT_TXQ_PSD], false);
  918. mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[MT_TXQ_BE], false);
  919. if (phy2) {
  920. mt76_queue_tx_cleanup(dev, phy2->q_tx[MT_TXQ_PSD], false);
  921. mt76_queue_tx_cleanup(dev, phy2->q_tx[MT_TXQ_BE], false);
  922. }
  923. if (phy3) {
  924. mt76_queue_tx_cleanup(dev, phy3->q_tx[MT_TXQ_PSD], false);
  925. mt76_queue_tx_cleanup(dev, phy3->q_tx[MT_TXQ_BE], false);
  926. }
  927. if (WARN_ON_ONCE(le32_get_bits(tx_free[1], MT_TXFREE1_VER) < 5))
  928. return;
  929. total = le32_get_bits(tx_free[0], MT_TXFREE0_MSDU_CNT);
  930. for (cur_info = &tx_free[2]; count < total; cur_info++) {
  931. u32 msdu, info;
  932. u8 i;
  933. if (WARN_ON_ONCE((void *)cur_info >= end))
  934. return;
  935. /* 1'b1: new wcid pair.
  936. * 1'b0: msdu_id with the same 'wcid pair' as above.
  937. */
  938. info = le32_to_cpu(*cur_info);
  939. if (info & MT_TXFREE_INFO_PAIR) {
  940. struct mt7996_sta *msta;
  941. u16 idx;
  942. idx = FIELD_GET(MT_TXFREE_INFO_WLAN_ID, info);
  943. wcid = rcu_dereference(dev->mt76.wcid[idx]);
  944. sta = wcid_to_sta(wcid);
  945. if (!sta)
  946. continue;
  947. msta = container_of(wcid, struct mt7996_sta, wcid);
  948. spin_lock_bh(&mdev->sta_poll_lock);
  949. if (list_empty(&msta->wcid.poll_list))
  950. list_add_tail(&msta->wcid.poll_list,
  951. &mdev->sta_poll_list);
  952. spin_unlock_bh(&mdev->sta_poll_lock);
  953. continue;
  954. } else if (info & MT_TXFREE_INFO_HEADER) {
  955. u32 tx_retries = 0, tx_failed = 0;
  956. if (!wcid)
  957. continue;
  958. tx_retries =
  959. FIELD_GET(MT_TXFREE_INFO_COUNT, info) - 1;
  960. tx_failed = tx_retries +
  961. !!FIELD_GET(MT_TXFREE_INFO_STAT, info);
  962. wcid->stats.tx_retries += tx_retries;
  963. wcid->stats.tx_failed += tx_failed;
  964. continue;
  965. }
  966. for (i = 0; i < 2; i++) {
  967. msdu = (info >> (15 * i)) & MT_TXFREE_INFO_MSDU_ID;
  968. if (msdu == MT_TXFREE_INFO_MSDU_ID)
  969. continue;
  970. count++;
  971. txwi = mt76_token_release(mdev, msdu, &wake);
  972. if (!txwi)
  973. continue;
  974. mt7996_txwi_free(dev, txwi, sta, &free_list);
  975. }
  976. }
  977. mt7996_mac_sta_poll(dev);
  978. if (wake)
  979. mt76_set_tx_blocked(&dev->mt76, false);
  980. mt76_worker_schedule(&dev->mt76.tx_worker);
  981. list_for_each_entry_safe(skb, tmp, &free_list, list) {
  982. skb_list_del_init(skb);
  983. napi_consume_skb(skb, 1);
  984. }
  985. }
  986. static bool
  987. mt7996_mac_add_txs_skb(struct mt7996_dev *dev, struct mt76_wcid *wcid,
  988. int pid, __le32 *txs_data)
  989. {
  990. struct mt76_sta_stats *stats = &wcid->stats;
  991. struct ieee80211_supported_band *sband;
  992. struct mt76_dev *mdev = &dev->mt76;
  993. struct mt76_phy *mphy;
  994. struct ieee80211_tx_info *info;
  995. struct sk_buff_head list;
  996. struct rate_info rate = {};
  997. struct sk_buff *skb = NULL;
  998. bool cck = false;
  999. u32 txrate, txs, mode, stbc;
  1000. txs = le32_to_cpu(txs_data[0]);
  1001. mt76_tx_status_lock(mdev, &list);
  1002. /* only report MPDU TXS */
  1003. if (le32_get_bits(txs_data[0], MT_TXS0_TXS_FORMAT) == 0) {
  1004. skb = mt76_tx_status_skb_get(mdev, wcid, pid, &list);
  1005. if (skb) {
  1006. info = IEEE80211_SKB_CB(skb);
  1007. if (!(txs & MT_TXS0_ACK_ERROR_MASK))
  1008. info->flags |= IEEE80211_TX_STAT_ACK;
  1009. info->status.ampdu_len = 1;
  1010. info->status.ampdu_ack_len =
  1011. !!(info->flags & IEEE80211_TX_STAT_ACK);
  1012. info->status.rates[0].idx = -1;
  1013. }
  1014. }
  1015. if (mtk_wed_device_active(&dev->mt76.mmio.wed) && wcid->sta) {
  1016. struct ieee80211_sta *sta;
  1017. u8 tid;
  1018. sta = container_of((void *)wcid, struct ieee80211_sta, drv_priv);
  1019. tid = FIELD_GET(MT_TXS0_TID, txs);
  1020. ieee80211_refresh_tx_agg_session_timer(sta, tid);
  1021. }
  1022. txrate = FIELD_GET(MT_TXS0_TX_RATE, txs);
  1023. rate.mcs = FIELD_GET(MT_TX_RATE_IDX, txrate);
  1024. rate.nss = FIELD_GET(MT_TX_RATE_NSS, txrate) + 1;
  1025. stbc = le32_get_bits(txs_data[3], MT_TXS3_RATE_STBC);
  1026. if (stbc && rate.nss > 1)
  1027. rate.nss >>= 1;
  1028. if (rate.nss - 1 < ARRAY_SIZE(stats->tx_nss))
  1029. stats->tx_nss[rate.nss - 1]++;
  1030. if (rate.mcs < ARRAY_SIZE(stats->tx_mcs))
  1031. stats->tx_mcs[rate.mcs]++;
  1032. mode = FIELD_GET(MT_TX_RATE_MODE, txrate);
  1033. switch (mode) {
  1034. case MT_PHY_TYPE_CCK:
  1035. cck = true;
  1036. fallthrough;
  1037. case MT_PHY_TYPE_OFDM:
  1038. mphy = mt76_dev_phy(mdev, wcid->phy_idx);
  1039. if (mphy->chandef.chan->band == NL80211_BAND_5GHZ)
  1040. sband = &mphy->sband_5g.sband;
  1041. else if (mphy->chandef.chan->band == NL80211_BAND_6GHZ)
  1042. sband = &mphy->sband_6g.sband;
  1043. else
  1044. sband = &mphy->sband_2g.sband;
  1045. rate.mcs = mt76_get_rate(mphy->dev, sband, rate.mcs, cck);
  1046. rate.legacy = sband->bitrates[rate.mcs].bitrate;
  1047. break;
  1048. case MT_PHY_TYPE_HT:
  1049. case MT_PHY_TYPE_HT_GF:
  1050. if (rate.mcs > 31)
  1051. goto out;
  1052. rate.flags = RATE_INFO_FLAGS_MCS;
  1053. if (wcid->rate.flags & RATE_INFO_FLAGS_SHORT_GI)
  1054. rate.flags |= RATE_INFO_FLAGS_SHORT_GI;
  1055. break;
  1056. case MT_PHY_TYPE_VHT:
  1057. if (rate.mcs > 9)
  1058. goto out;
  1059. rate.flags = RATE_INFO_FLAGS_VHT_MCS;
  1060. if (wcid->rate.flags & RATE_INFO_FLAGS_SHORT_GI)
  1061. rate.flags |= RATE_INFO_FLAGS_SHORT_GI;
  1062. break;
  1063. case MT_PHY_TYPE_HE_SU:
  1064. case MT_PHY_TYPE_HE_EXT_SU:
  1065. case MT_PHY_TYPE_HE_TB:
  1066. case MT_PHY_TYPE_HE_MU:
  1067. if (rate.mcs > 11)
  1068. goto out;
  1069. rate.he_gi = wcid->rate.he_gi;
  1070. rate.he_dcm = FIELD_GET(MT_TX_RATE_DCM, txrate);
  1071. rate.flags = RATE_INFO_FLAGS_HE_MCS;
  1072. break;
  1073. case MT_PHY_TYPE_EHT_SU:
  1074. case MT_PHY_TYPE_EHT_TRIG:
  1075. case MT_PHY_TYPE_EHT_MU:
  1076. if (rate.mcs > 13)
  1077. goto out;
  1078. rate.eht_gi = wcid->rate.eht_gi;
  1079. rate.flags = RATE_INFO_FLAGS_EHT_MCS;
  1080. break;
  1081. default:
  1082. goto out;
  1083. }
  1084. stats->tx_mode[mode]++;
  1085. switch (FIELD_GET(MT_TXS0_BW, txs)) {
  1086. case IEEE80211_STA_RX_BW_320:
  1087. rate.bw = RATE_INFO_BW_320;
  1088. stats->tx_bw[4]++;
  1089. break;
  1090. case IEEE80211_STA_RX_BW_160:
  1091. rate.bw = RATE_INFO_BW_160;
  1092. stats->tx_bw[3]++;
  1093. break;
  1094. case IEEE80211_STA_RX_BW_80:
  1095. rate.bw = RATE_INFO_BW_80;
  1096. stats->tx_bw[2]++;
  1097. break;
  1098. case IEEE80211_STA_RX_BW_40:
  1099. rate.bw = RATE_INFO_BW_40;
  1100. stats->tx_bw[1]++;
  1101. break;
  1102. default:
  1103. rate.bw = RATE_INFO_BW_20;
  1104. stats->tx_bw[0]++;
  1105. break;
  1106. }
  1107. wcid->rate = rate;
  1108. out:
  1109. if (skb)
  1110. mt76_tx_status_skb_done(mdev, skb, &list);
  1111. mt76_tx_status_unlock(mdev, &list);
  1112. return !!skb;
  1113. }
  1114. static void mt7996_mac_add_txs(struct mt7996_dev *dev, void *data)
  1115. {
  1116. struct mt7996_sta *msta = NULL;
  1117. struct mt76_wcid *wcid;
  1118. __le32 *txs_data = data;
  1119. u16 wcidx;
  1120. u8 pid;
  1121. wcidx = le32_get_bits(txs_data[2], MT_TXS2_WCID);
  1122. pid = le32_get_bits(txs_data[3], MT_TXS3_PID);
  1123. if (pid < MT_PACKET_ID_NO_SKB)
  1124. return;
  1125. if (wcidx >= mt7996_wtbl_size(dev))
  1126. return;
  1127. rcu_read_lock();
  1128. wcid = rcu_dereference(dev->mt76.wcid[wcidx]);
  1129. if (!wcid)
  1130. goto out;
  1131. msta = container_of(wcid, struct mt7996_sta, wcid);
  1132. mt7996_mac_add_txs_skb(dev, wcid, pid, txs_data);
  1133. if (!wcid->sta)
  1134. goto out;
  1135. spin_lock_bh(&dev->mt76.sta_poll_lock);
  1136. if (list_empty(&msta->wcid.poll_list))
  1137. list_add_tail(&msta->wcid.poll_list, &dev->mt76.sta_poll_list);
  1138. spin_unlock_bh(&dev->mt76.sta_poll_lock);
  1139. out:
  1140. rcu_read_unlock();
  1141. }
  1142. bool mt7996_rx_check(struct mt76_dev *mdev, void *data, int len)
  1143. {
  1144. struct mt7996_dev *dev = container_of(mdev, struct mt7996_dev, mt76);
  1145. __le32 *rxd = (__le32 *)data;
  1146. __le32 *end = (__le32 *)&rxd[len / 4];
  1147. enum rx_pkt_type type;
  1148. type = le32_get_bits(rxd[0], MT_RXD0_PKT_TYPE);
  1149. if (type != PKT_TYPE_NORMAL) {
  1150. u32 sw_type = le32_get_bits(rxd[0], MT_RXD0_SW_PKT_TYPE_MASK);
  1151. if (unlikely((sw_type & MT_RXD0_SW_PKT_TYPE_MAP) ==
  1152. MT_RXD0_SW_PKT_TYPE_FRAME))
  1153. return true;
  1154. }
  1155. switch (type) {
  1156. case PKT_TYPE_TXRX_NOTIFY:
  1157. mt7996_mac_tx_free(dev, data, len);
  1158. return false;
  1159. case PKT_TYPE_TXS:
  1160. for (rxd += MT_TXS_HDR_SIZE; rxd + MT_TXS_SIZE <= end; rxd += MT_TXS_SIZE)
  1161. mt7996_mac_add_txs(dev, rxd);
  1162. return false;
  1163. case PKT_TYPE_RX_FW_MONITOR:
  1164. mt7996_debugfs_rx_fw_monitor(dev, data, len);
  1165. return false;
  1166. default:
  1167. return true;
  1168. }
  1169. }
  1170. void mt7996_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
  1171. struct sk_buff *skb, u32 *info)
  1172. {
  1173. struct mt7996_dev *dev = container_of(mdev, struct mt7996_dev, mt76);
  1174. __le32 *rxd = (__le32 *)skb->data;
  1175. __le32 *end = (__le32 *)&skb->data[skb->len];
  1176. enum rx_pkt_type type;
  1177. type = le32_get_bits(rxd[0], MT_RXD0_PKT_TYPE);
  1178. if (type != PKT_TYPE_NORMAL) {
  1179. u32 sw_type = le32_get_bits(rxd[0], MT_RXD0_SW_PKT_TYPE_MASK);
  1180. if (unlikely((sw_type & MT_RXD0_SW_PKT_TYPE_MAP) ==
  1181. MT_RXD0_SW_PKT_TYPE_FRAME))
  1182. type = PKT_TYPE_NORMAL;
  1183. }
  1184. switch (type) {
  1185. case PKT_TYPE_TXRX_NOTIFY:
  1186. if (mtk_wed_device_active(&dev->mt76.mmio.wed_hif2) &&
  1187. q == MT_RXQ_TXFREE_BAND2) {
  1188. dev_kfree_skb(skb);
  1189. break;
  1190. }
  1191. mt7996_mac_tx_free(dev, skb->data, skb->len);
  1192. napi_consume_skb(skb, 1);
  1193. break;
  1194. case PKT_TYPE_RX_EVENT:
  1195. mt7996_mcu_rx_event(dev, skb);
  1196. break;
  1197. case PKT_TYPE_TXS:
  1198. for (rxd += MT_TXS_HDR_SIZE; rxd + MT_TXS_SIZE <= end; rxd += MT_TXS_SIZE)
  1199. mt7996_mac_add_txs(dev, rxd);
  1200. dev_kfree_skb(skb);
  1201. break;
  1202. case PKT_TYPE_RX_FW_MONITOR:
  1203. mt7996_debugfs_rx_fw_monitor(dev, skb->data, skb->len);
  1204. dev_kfree_skb(skb);
  1205. break;
  1206. case PKT_TYPE_NORMAL:
  1207. if (!mt7996_mac_fill_rx(dev, q, skb, info)) {
  1208. mt76_rx(&dev->mt76, q, skb);
  1209. return;
  1210. }
  1211. fallthrough;
  1212. default:
  1213. dev_kfree_skb(skb);
  1214. break;
  1215. }
  1216. }
  1217. void mt7996_mac_cca_stats_reset(struct mt7996_phy *phy)
  1218. {
  1219. struct mt7996_dev *dev = phy->dev;
  1220. u32 reg = MT_WF_PHYRX_BAND_RX_CTRL1(phy->mt76->band_idx);
  1221. mt76_clear(dev, reg, MT_WF_PHYRX_BAND_RX_CTRL1_STSCNT_EN);
  1222. mt76_set(dev, reg, BIT(11) | BIT(9));
  1223. }
  1224. void mt7996_mac_reset_counters(struct mt7996_phy *phy)
  1225. {
  1226. struct mt7996_dev *dev = phy->dev;
  1227. u8 band_idx = phy->mt76->band_idx;
  1228. int i;
  1229. for (i = 0; i < 16; i++)
  1230. mt76_rr(dev, MT_TX_AGG_CNT(band_idx, i));
  1231. phy->mt76->survey_time = ktime_get_boottime();
  1232. memset(phy->mt76->aggr_stats, 0, sizeof(phy->mt76->aggr_stats));
  1233. /* reset airtime counters */
  1234. mt76_set(dev, MT_WF_RMAC_MIB_AIRTIME0(band_idx),
  1235. MT_WF_RMAC_MIB_RXTIME_CLR);
  1236. mt7996_mcu_get_chan_mib_info(phy, true);
  1237. }
  1238. void mt7996_mac_set_coverage_class(struct mt7996_phy *phy)
  1239. {
  1240. s16 coverage_class = phy->coverage_class;
  1241. struct mt7996_dev *dev = phy->dev;
  1242. struct mt7996_phy *phy2 = mt7996_phy2(dev);
  1243. struct mt7996_phy *phy3 = mt7996_phy3(dev);
  1244. u32 reg_offset;
  1245. u32 cck = FIELD_PREP(MT_TIMEOUT_VAL_PLCP, 231) |
  1246. FIELD_PREP(MT_TIMEOUT_VAL_CCA, 48);
  1247. u32 ofdm = FIELD_PREP(MT_TIMEOUT_VAL_PLCP, 60) |
  1248. FIELD_PREP(MT_TIMEOUT_VAL_CCA, 28);
  1249. u8 band_idx = phy->mt76->band_idx;
  1250. int offset;
  1251. if (!test_bit(MT76_STATE_RUNNING, &phy->mt76->state))
  1252. return;
  1253. if (phy2)
  1254. coverage_class = max_t(s16, dev->phy.coverage_class,
  1255. phy2->coverage_class);
  1256. if (phy3)
  1257. coverage_class = max_t(s16, coverage_class,
  1258. phy3->coverage_class);
  1259. offset = 3 * coverage_class;
  1260. reg_offset = FIELD_PREP(MT_TIMEOUT_VAL_PLCP, offset) |
  1261. FIELD_PREP(MT_TIMEOUT_VAL_CCA, offset);
  1262. mt76_wr(dev, MT_TMAC_CDTR(band_idx), cck + reg_offset);
  1263. mt76_wr(dev, MT_TMAC_ODTR(band_idx), ofdm + reg_offset);
  1264. }
  1265. void mt7996_mac_enable_nf(struct mt7996_dev *dev, u8 band)
  1266. {
  1267. mt76_set(dev, MT_WF_PHYRX_CSD_BAND_RXTD12(band),
  1268. MT_WF_PHYRX_CSD_BAND_RXTD12_IRPI_SW_CLR_ONLY |
  1269. MT_WF_PHYRX_CSD_BAND_RXTD12_IRPI_SW_CLR);
  1270. mt76_set(dev, MT_WF_PHYRX_BAND_RX_CTRL1(band),
  1271. FIELD_PREP(MT_WF_PHYRX_BAND_RX_CTRL1_IPI_EN, 0x5));
  1272. }
  1273. static u8
  1274. mt7996_phy_get_nf(struct mt7996_phy *phy, u8 band_idx)
  1275. {
  1276. static const u8 nf_power[] = { 92, 89, 86, 83, 80, 75, 70, 65, 60, 55, 52 };
  1277. struct mt7996_dev *dev = phy->dev;
  1278. u32 val, sum = 0, n = 0;
  1279. int ant, i;
  1280. for (ant = 0; ant < hweight8(phy->mt76->antenna_mask); ant++) {
  1281. u32 reg = MT_WF_PHYRX_CSD_IRPI(band_idx, ant);
  1282. for (i = 0; i < ARRAY_SIZE(nf_power); i++, reg += 4) {
  1283. val = mt76_rr(dev, reg);
  1284. sum += val * nf_power[i];
  1285. n += val;
  1286. }
  1287. }
  1288. return n ? sum / n : 0;
  1289. }
  1290. void mt7996_update_channel(struct mt76_phy *mphy)
  1291. {
  1292. struct mt7996_phy *phy = mphy->priv;
  1293. struct mt76_channel_state *state = mphy->chan_state;
  1294. int nf;
  1295. mt7996_mcu_get_chan_mib_info(phy, false);
  1296. nf = mt7996_phy_get_nf(phy, mphy->band_idx);
  1297. if (!phy->noise)
  1298. phy->noise = nf << 4;
  1299. else if (nf)
  1300. phy->noise += nf - (phy->noise >> 4);
  1301. state->noise = -(phy->noise >> 4);
  1302. }
  1303. static bool
  1304. mt7996_wait_reset_state(struct mt7996_dev *dev, u32 state)
  1305. {
  1306. bool ret;
  1307. ret = wait_event_timeout(dev->reset_wait,
  1308. (READ_ONCE(dev->recovery.state) & state),
  1309. MT7996_RESET_TIMEOUT);
  1310. WARN(!ret, "Timeout waiting for MCU reset state %x\n", state);
  1311. return ret;
  1312. }
  1313. static void
  1314. mt7996_update_vif_beacon(void *priv, u8 *mac, struct ieee80211_vif *vif)
  1315. {
  1316. struct ieee80211_hw *hw = priv;
  1317. switch (vif->type) {
  1318. case NL80211_IFTYPE_MESH_POINT:
  1319. case NL80211_IFTYPE_ADHOC:
  1320. case NL80211_IFTYPE_AP:
  1321. mt7996_mcu_add_beacon(hw, vif, vif->bss_conf.enable_beacon);
  1322. break;
  1323. default:
  1324. break;
  1325. }
  1326. }
  1327. static void
  1328. mt7996_update_beacons(struct mt7996_dev *dev)
  1329. {
  1330. struct mt76_phy *phy2, *phy3;
  1331. ieee80211_iterate_active_interfaces(dev->mt76.hw,
  1332. IEEE80211_IFACE_ITER_RESUME_ALL,
  1333. mt7996_update_vif_beacon, dev->mt76.hw);
  1334. phy2 = dev->mt76.phys[MT_BAND1];
  1335. if (!phy2)
  1336. return;
  1337. ieee80211_iterate_active_interfaces(phy2->hw,
  1338. IEEE80211_IFACE_ITER_RESUME_ALL,
  1339. mt7996_update_vif_beacon, phy2->hw);
  1340. phy3 = dev->mt76.phys[MT_BAND2];
  1341. if (!phy3)
  1342. return;
  1343. ieee80211_iterate_active_interfaces(phy3->hw,
  1344. IEEE80211_IFACE_ITER_RESUME_ALL,
  1345. mt7996_update_vif_beacon, phy3->hw);
  1346. }
  1347. void mt7996_tx_token_put(struct mt7996_dev *dev)
  1348. {
  1349. struct mt76_txwi_cache *txwi;
  1350. int id;
  1351. spin_lock_bh(&dev->mt76.token_lock);
  1352. idr_for_each_entry(&dev->mt76.token, txwi, id) {
  1353. mt7996_txwi_free(dev, txwi, NULL, NULL);
  1354. dev->mt76.token_count--;
  1355. }
  1356. spin_unlock_bh(&dev->mt76.token_lock);
  1357. idr_destroy(&dev->mt76.token);
  1358. }
  1359. static int
  1360. mt7996_mac_restart(struct mt7996_dev *dev)
  1361. {
  1362. struct mt7996_phy *phy2, *phy3;
  1363. struct mt76_dev *mdev = &dev->mt76;
  1364. int i, ret;
  1365. phy2 = mt7996_phy2(dev);
  1366. phy3 = mt7996_phy3(dev);
  1367. if (dev->hif2) {
  1368. mt76_wr(dev, MT_INT1_MASK_CSR, 0x0);
  1369. mt76_wr(dev, MT_INT1_SOURCE_CSR, ~0);
  1370. }
  1371. if (dev_is_pci(mdev->dev)) {
  1372. mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0x0);
  1373. if (dev->hif2)
  1374. mt76_wr(dev, MT_PCIE1_MAC_INT_ENABLE, 0x0);
  1375. }
  1376. set_bit(MT76_RESET, &dev->mphy.state);
  1377. set_bit(MT76_MCU_RESET, &dev->mphy.state);
  1378. wake_up(&dev->mt76.mcu.wait);
  1379. if (phy2)
  1380. set_bit(MT76_RESET, &phy2->mt76->state);
  1381. if (phy3)
  1382. set_bit(MT76_RESET, &phy3->mt76->state);
  1383. /* lock/unlock all queues to ensure that no tx is pending */
  1384. mt76_txq_schedule_all(&dev->mphy);
  1385. if (phy2)
  1386. mt76_txq_schedule_all(phy2->mt76);
  1387. if (phy3)
  1388. mt76_txq_schedule_all(phy3->mt76);
  1389. /* disable all tx/rx napi */
  1390. mt76_worker_disable(&dev->mt76.tx_worker);
  1391. mt76_for_each_q_rx(mdev, i) {
  1392. if (mtk_wed_device_active(&dev->mt76.mmio.wed) &&
  1393. mt76_queue_is_wed_rro(&mdev->q_rx[i]))
  1394. continue;
  1395. if (mdev->q_rx[i].ndesc)
  1396. napi_disable(&dev->mt76.napi[i]);
  1397. }
  1398. napi_disable(&dev->mt76.tx_napi);
  1399. /* token reinit */
  1400. mt7996_tx_token_put(dev);
  1401. idr_init(&dev->mt76.token);
  1402. mt7996_dma_reset(dev, true);
  1403. local_bh_disable();
  1404. mt76_for_each_q_rx(mdev, i) {
  1405. if (mtk_wed_device_active(&dev->mt76.mmio.wed) &&
  1406. mt76_queue_is_wed_rro(&mdev->q_rx[i]))
  1407. continue;
  1408. if (mdev->q_rx[i].ndesc) {
  1409. napi_enable(&dev->mt76.napi[i]);
  1410. napi_schedule(&dev->mt76.napi[i]);
  1411. }
  1412. }
  1413. local_bh_enable();
  1414. clear_bit(MT76_MCU_RESET, &dev->mphy.state);
  1415. clear_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
  1416. mt76_wr(dev, MT_INT_MASK_CSR, dev->mt76.mmio.irqmask);
  1417. mt76_wr(dev, MT_INT_SOURCE_CSR, ~0);
  1418. if (dev->hif2) {
  1419. mt76_wr(dev, MT_INT1_MASK_CSR, dev->mt76.mmio.irqmask);
  1420. mt76_wr(dev, MT_INT1_SOURCE_CSR, ~0);
  1421. }
  1422. if (dev_is_pci(mdev->dev)) {
  1423. mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0xff);
  1424. if (dev->hif2)
  1425. mt76_wr(dev, MT_PCIE1_MAC_INT_ENABLE, 0xff);
  1426. }
  1427. /* load firmware */
  1428. ret = mt7996_mcu_init_firmware(dev);
  1429. if (ret)
  1430. goto out;
  1431. /* set the necessary init items */
  1432. ret = mt7996_mcu_set_eeprom(dev);
  1433. if (ret)
  1434. goto out;
  1435. mt7996_mac_init(dev);
  1436. mt7996_init_txpower(&dev->phy);
  1437. mt7996_init_txpower(phy2);
  1438. mt7996_init_txpower(phy3);
  1439. ret = mt7996_txbf_init(dev);
  1440. if (test_bit(MT76_STATE_RUNNING, &dev->mphy.state)) {
  1441. ret = mt7996_run(dev->mphy.hw);
  1442. if (ret)
  1443. goto out;
  1444. }
  1445. if (phy2 && test_bit(MT76_STATE_RUNNING, &phy2->mt76->state)) {
  1446. ret = mt7996_run(phy2->mt76->hw);
  1447. if (ret)
  1448. goto out;
  1449. }
  1450. if (phy3 && test_bit(MT76_STATE_RUNNING, &phy3->mt76->state)) {
  1451. ret = mt7996_run(phy3->mt76->hw);
  1452. if (ret)
  1453. goto out;
  1454. }
  1455. out:
  1456. /* reset done */
  1457. clear_bit(MT76_RESET, &dev->mphy.state);
  1458. if (phy2)
  1459. clear_bit(MT76_RESET, &phy2->mt76->state);
  1460. if (phy3)
  1461. clear_bit(MT76_RESET, &phy3->mt76->state);
  1462. local_bh_disable();
  1463. napi_enable(&dev->mt76.tx_napi);
  1464. napi_schedule(&dev->mt76.tx_napi);
  1465. local_bh_enable();
  1466. mt76_worker_enable(&dev->mt76.tx_worker);
  1467. return ret;
  1468. }
  1469. static void
  1470. mt7996_mac_full_reset(struct mt7996_dev *dev)
  1471. {
  1472. struct mt7996_phy *phy2, *phy3;
  1473. int i;
  1474. phy2 = mt7996_phy2(dev);
  1475. phy3 = mt7996_phy3(dev);
  1476. dev->recovery.hw_full_reset = true;
  1477. wake_up(&dev->mt76.mcu.wait);
  1478. ieee80211_stop_queues(mt76_hw(dev));
  1479. if (phy2)
  1480. ieee80211_stop_queues(phy2->mt76->hw);
  1481. if (phy3)
  1482. ieee80211_stop_queues(phy3->mt76->hw);
  1483. cancel_work_sync(&dev->wed_rro.work);
  1484. cancel_delayed_work_sync(&dev->mphy.mac_work);
  1485. if (phy2)
  1486. cancel_delayed_work_sync(&phy2->mt76->mac_work);
  1487. if (phy3)
  1488. cancel_delayed_work_sync(&phy3->mt76->mac_work);
  1489. mutex_lock(&dev->mt76.mutex);
  1490. for (i = 0; i < 10; i++) {
  1491. if (!mt7996_mac_restart(dev))
  1492. break;
  1493. }
  1494. mutex_unlock(&dev->mt76.mutex);
  1495. if (i == 10)
  1496. dev_err(dev->mt76.dev, "chip full reset failed\n");
  1497. ieee80211_restart_hw(mt76_hw(dev));
  1498. if (phy2)
  1499. ieee80211_restart_hw(phy2->mt76->hw);
  1500. if (phy3)
  1501. ieee80211_restart_hw(phy3->mt76->hw);
  1502. ieee80211_wake_queues(mt76_hw(dev));
  1503. if (phy2)
  1504. ieee80211_wake_queues(phy2->mt76->hw);
  1505. if (phy3)
  1506. ieee80211_wake_queues(phy3->mt76->hw);
  1507. dev->recovery.hw_full_reset = false;
  1508. ieee80211_queue_delayed_work(mt76_hw(dev),
  1509. &dev->mphy.mac_work,
  1510. MT7996_WATCHDOG_TIME);
  1511. if (phy2)
  1512. ieee80211_queue_delayed_work(phy2->mt76->hw,
  1513. &phy2->mt76->mac_work,
  1514. MT7996_WATCHDOG_TIME);
  1515. if (phy3)
  1516. ieee80211_queue_delayed_work(phy3->mt76->hw,
  1517. &phy3->mt76->mac_work,
  1518. MT7996_WATCHDOG_TIME);
  1519. }
  1520. void mt7996_mac_reset_work(struct work_struct *work)
  1521. {
  1522. struct mt7996_phy *phy2, *phy3;
  1523. struct mt7996_dev *dev;
  1524. int i;
  1525. dev = container_of(work, struct mt7996_dev, reset_work);
  1526. phy2 = mt7996_phy2(dev);
  1527. phy3 = mt7996_phy3(dev);
  1528. /* chip full reset */
  1529. if (dev->recovery.restart) {
  1530. /* disable WA/WM WDT */
  1531. mt76_clear(dev, MT_WFDMA0_MCU_HOST_INT_ENA,
  1532. MT_MCU_CMD_WDT_MASK);
  1533. if (READ_ONCE(dev->recovery.state) & MT_MCU_CMD_WA_WDT)
  1534. dev->recovery.wa_reset_count++;
  1535. else
  1536. dev->recovery.wm_reset_count++;
  1537. mt7996_mac_full_reset(dev);
  1538. /* enable mcu irq */
  1539. mt7996_irq_enable(dev, MT_INT_MCU_CMD);
  1540. mt7996_irq_disable(dev, 0);
  1541. /* enable WA/WM WDT */
  1542. mt76_set(dev, MT_WFDMA0_MCU_HOST_INT_ENA, MT_MCU_CMD_WDT_MASK);
  1543. dev->recovery.state = MT_MCU_CMD_NORMAL_STATE;
  1544. dev->recovery.restart = false;
  1545. return;
  1546. }
  1547. if (!(READ_ONCE(dev->recovery.state) & MT_MCU_CMD_STOP_DMA))
  1548. return;
  1549. dev_info(dev->mt76.dev,"\n%s L1 SER recovery start.",
  1550. wiphy_name(dev->mt76.hw->wiphy));
  1551. if (mtk_wed_device_active(&dev->mt76.mmio.wed_hif2))
  1552. mtk_wed_device_stop(&dev->mt76.mmio.wed_hif2);
  1553. if (mtk_wed_device_active(&dev->mt76.mmio.wed))
  1554. mtk_wed_device_stop(&dev->mt76.mmio.wed);
  1555. ieee80211_stop_queues(mt76_hw(dev));
  1556. if (phy2)
  1557. ieee80211_stop_queues(phy2->mt76->hw);
  1558. if (phy3)
  1559. ieee80211_stop_queues(phy3->mt76->hw);
  1560. set_bit(MT76_RESET, &dev->mphy.state);
  1561. set_bit(MT76_MCU_RESET, &dev->mphy.state);
  1562. wake_up(&dev->mt76.mcu.wait);
  1563. cancel_work_sync(&dev->wed_rro.work);
  1564. cancel_delayed_work_sync(&dev->mphy.mac_work);
  1565. if (phy2) {
  1566. set_bit(MT76_RESET, &phy2->mt76->state);
  1567. cancel_delayed_work_sync(&phy2->mt76->mac_work);
  1568. }
  1569. if (phy3) {
  1570. set_bit(MT76_RESET, &phy3->mt76->state);
  1571. cancel_delayed_work_sync(&phy3->mt76->mac_work);
  1572. }
  1573. mt76_worker_disable(&dev->mt76.tx_worker);
  1574. mt76_for_each_q_rx(&dev->mt76, i) {
  1575. if (mtk_wed_device_active(&dev->mt76.mmio.wed) &&
  1576. mt76_queue_is_wed_rro(&dev->mt76.q_rx[i]))
  1577. continue;
  1578. napi_disable(&dev->mt76.napi[i]);
  1579. }
  1580. napi_disable(&dev->mt76.tx_napi);
  1581. mutex_lock(&dev->mt76.mutex);
  1582. mt76_wr(dev, MT_MCU_INT_EVENT, MT_MCU_INT_EVENT_DMA_STOPPED);
  1583. if (mt7996_wait_reset_state(dev, MT_MCU_CMD_RESET_DONE)) {
  1584. mt7996_dma_reset(dev, false);
  1585. mt7996_tx_token_put(dev);
  1586. idr_init(&dev->mt76.token);
  1587. mt76_wr(dev, MT_MCU_INT_EVENT, MT_MCU_INT_EVENT_DMA_INIT);
  1588. mt7996_wait_reset_state(dev, MT_MCU_CMD_RECOVERY_DONE);
  1589. }
  1590. mt76_wr(dev, MT_MCU_INT_EVENT, MT_MCU_INT_EVENT_RESET_DONE);
  1591. mt7996_wait_reset_state(dev, MT_MCU_CMD_NORMAL_STATE);
  1592. /* enable DMA Tx/Tx and interrupt */
  1593. mt7996_dma_start(dev, false, false);
  1594. if (mtk_wed_device_active(&dev->mt76.mmio.wed)) {
  1595. u32 wed_irq_mask = MT_INT_RRO_RX_DONE | MT_INT_TX_DONE_BAND2 |
  1596. dev->mt76.mmio.irqmask;
  1597. if (mtk_wed_get_rx_capa(&dev->mt76.mmio.wed))
  1598. wed_irq_mask &= ~MT_INT_RX_DONE_RRO_IND;
  1599. mt76_wr(dev, MT_INT_MASK_CSR, wed_irq_mask);
  1600. mtk_wed_device_start_hw_rro(&dev->mt76.mmio.wed, wed_irq_mask,
  1601. true);
  1602. mt7996_irq_enable(dev, wed_irq_mask);
  1603. mt7996_irq_disable(dev, 0);
  1604. }
  1605. if (mtk_wed_device_active(&dev->mt76.mmio.wed_hif2)) {
  1606. mt76_wr(dev, MT_INT_PCIE1_MASK_CSR, MT_INT_TX_RX_DONE_EXT);
  1607. mtk_wed_device_start(&dev->mt76.mmio.wed_hif2,
  1608. MT_INT_TX_RX_DONE_EXT);
  1609. }
  1610. clear_bit(MT76_MCU_RESET, &dev->mphy.state);
  1611. clear_bit(MT76_RESET, &dev->mphy.state);
  1612. if (phy2)
  1613. clear_bit(MT76_RESET, &phy2->mt76->state);
  1614. if (phy3)
  1615. clear_bit(MT76_RESET, &phy3->mt76->state);
  1616. local_bh_disable();
  1617. mt76_for_each_q_rx(&dev->mt76, i) {
  1618. if (mtk_wed_device_active(&dev->mt76.mmio.wed) &&
  1619. mt76_queue_is_wed_rro(&dev->mt76.q_rx[i]))
  1620. continue;
  1621. napi_enable(&dev->mt76.napi[i]);
  1622. napi_schedule(&dev->mt76.napi[i]);
  1623. }
  1624. local_bh_enable();
  1625. tasklet_schedule(&dev->mt76.irq_tasklet);
  1626. mt76_worker_enable(&dev->mt76.tx_worker);
  1627. local_bh_disable();
  1628. napi_enable(&dev->mt76.tx_napi);
  1629. napi_schedule(&dev->mt76.tx_napi);
  1630. local_bh_enable();
  1631. ieee80211_wake_queues(mt76_hw(dev));
  1632. if (phy2)
  1633. ieee80211_wake_queues(phy2->mt76->hw);
  1634. if (phy3)
  1635. ieee80211_wake_queues(phy3->mt76->hw);
  1636. mutex_unlock(&dev->mt76.mutex);
  1637. mt7996_update_beacons(dev);
  1638. ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mphy.mac_work,
  1639. MT7996_WATCHDOG_TIME);
  1640. if (phy2)
  1641. ieee80211_queue_delayed_work(phy2->mt76->hw,
  1642. &phy2->mt76->mac_work,
  1643. MT7996_WATCHDOG_TIME);
  1644. if (phy3)
  1645. ieee80211_queue_delayed_work(phy3->mt76->hw,
  1646. &phy3->mt76->mac_work,
  1647. MT7996_WATCHDOG_TIME);
  1648. dev_info(dev->mt76.dev,"\n%s L1 SER recovery completed.",
  1649. wiphy_name(dev->mt76.hw->wiphy));
  1650. }
  1651. /* firmware coredump */
  1652. void mt7996_mac_dump_work(struct work_struct *work)
  1653. {
  1654. const struct mt7996_mem_region *mem_region;
  1655. struct mt7996_crash_data *crash_data;
  1656. struct mt7996_dev *dev;
  1657. struct mt7996_mem_hdr *hdr;
  1658. size_t buf_len;
  1659. int i;
  1660. u32 num;
  1661. u8 *buf;
  1662. dev = container_of(work, struct mt7996_dev, dump_work);
  1663. mutex_lock(&dev->dump_mutex);
  1664. crash_data = mt7996_coredump_new(dev);
  1665. if (!crash_data) {
  1666. mutex_unlock(&dev->dump_mutex);
  1667. goto skip_coredump;
  1668. }
  1669. mem_region = mt7996_coredump_get_mem_layout(dev, &num);
  1670. if (!mem_region || !crash_data->memdump_buf_len) {
  1671. mutex_unlock(&dev->dump_mutex);
  1672. goto skip_memdump;
  1673. }
  1674. buf = crash_data->memdump_buf;
  1675. buf_len = crash_data->memdump_buf_len;
  1676. /* dumping memory content... */
  1677. memset(buf, 0, buf_len);
  1678. for (i = 0; i < num; i++) {
  1679. if (mem_region->len > buf_len) {
  1680. dev_warn(dev->mt76.dev, "%s len %zu is too large\n",
  1681. mem_region->name, mem_region->len);
  1682. break;
  1683. }
  1684. /* reserve space for the header */
  1685. hdr = (void *)buf;
  1686. buf += sizeof(*hdr);
  1687. buf_len -= sizeof(*hdr);
  1688. mt7996_memcpy_fromio(dev, buf, mem_region->start,
  1689. mem_region->len);
  1690. hdr->start = mem_region->start;
  1691. hdr->len = mem_region->len;
  1692. if (!mem_region->len)
  1693. /* note: the header remains, just with zero length */
  1694. break;
  1695. buf += mem_region->len;
  1696. buf_len -= mem_region->len;
  1697. mem_region++;
  1698. }
  1699. mutex_unlock(&dev->dump_mutex);
  1700. skip_memdump:
  1701. mt7996_coredump_submit(dev);
  1702. skip_coredump:
  1703. queue_work(dev->mt76.wq, &dev->reset_work);
  1704. }
  1705. void mt7996_reset(struct mt7996_dev *dev)
  1706. {
  1707. if (!dev->recovery.hw_init_done)
  1708. return;
  1709. if (dev->recovery.hw_full_reset)
  1710. return;
  1711. /* wm/wa exception: do full recovery */
  1712. if (READ_ONCE(dev->recovery.state) & MT_MCU_CMD_WDT_MASK) {
  1713. dev->recovery.restart = true;
  1714. dev_info(dev->mt76.dev,
  1715. "%s indicated firmware crash, attempting recovery\n",
  1716. wiphy_name(dev->mt76.hw->wiphy));
  1717. mt7996_irq_disable(dev, MT_INT_MCU_CMD);
  1718. queue_work(dev->mt76.wq, &dev->dump_work);
  1719. return;
  1720. }
  1721. queue_work(dev->mt76.wq, &dev->reset_work);
  1722. wake_up(&dev->reset_wait);
  1723. }
  1724. void mt7996_mac_update_stats(struct mt7996_phy *phy)
  1725. {
  1726. struct mt76_mib_stats *mib = &phy->mib;
  1727. struct mt7996_dev *dev = phy->dev;
  1728. u8 band_idx = phy->mt76->band_idx;
  1729. u32 cnt;
  1730. int i;
  1731. cnt = mt76_rr(dev, MT_MIB_RSCR1(band_idx));
  1732. mib->fcs_err_cnt += cnt;
  1733. cnt = mt76_rr(dev, MT_MIB_RSCR33(band_idx));
  1734. mib->rx_fifo_full_cnt += cnt;
  1735. cnt = mt76_rr(dev, MT_MIB_RSCR31(band_idx));
  1736. mib->rx_mpdu_cnt += cnt;
  1737. cnt = mt76_rr(dev, MT_MIB_SDR6(band_idx));
  1738. mib->channel_idle_cnt += FIELD_GET(MT_MIB_SDR6_CHANNEL_IDL_CNT_MASK, cnt);
  1739. cnt = mt76_rr(dev, MT_MIB_RVSR0(band_idx));
  1740. mib->rx_vector_mismatch_cnt += cnt;
  1741. cnt = mt76_rr(dev, MT_MIB_RSCR35(band_idx));
  1742. mib->rx_delimiter_fail_cnt += cnt;
  1743. cnt = mt76_rr(dev, MT_MIB_RSCR36(band_idx));
  1744. mib->rx_len_mismatch_cnt += cnt;
  1745. cnt = mt76_rr(dev, MT_MIB_TSCR0(band_idx));
  1746. mib->tx_ampdu_cnt += cnt;
  1747. cnt = mt76_rr(dev, MT_MIB_TSCR2(band_idx));
  1748. mib->tx_stop_q_empty_cnt += cnt;
  1749. cnt = mt76_rr(dev, MT_MIB_TSCR3(band_idx));
  1750. mib->tx_mpdu_attempts_cnt += cnt;
  1751. cnt = mt76_rr(dev, MT_MIB_TSCR4(band_idx));
  1752. mib->tx_mpdu_success_cnt += cnt;
  1753. cnt = mt76_rr(dev, MT_MIB_RSCR27(band_idx));
  1754. mib->rx_ampdu_cnt += cnt;
  1755. cnt = mt76_rr(dev, MT_MIB_RSCR28(band_idx));
  1756. mib->rx_ampdu_bytes_cnt += cnt;
  1757. cnt = mt76_rr(dev, MT_MIB_RSCR29(band_idx));
  1758. mib->rx_ampdu_valid_subframe_cnt += cnt;
  1759. cnt = mt76_rr(dev, MT_MIB_RSCR30(band_idx));
  1760. mib->rx_ampdu_valid_subframe_bytes_cnt += cnt;
  1761. cnt = mt76_rr(dev, MT_MIB_SDR27(band_idx));
  1762. mib->tx_rwp_fail_cnt += FIELD_GET(MT_MIB_SDR27_TX_RWP_FAIL_CNT, cnt);
  1763. cnt = mt76_rr(dev, MT_MIB_SDR28(band_idx));
  1764. mib->tx_rwp_need_cnt += FIELD_GET(MT_MIB_SDR28_TX_RWP_NEED_CNT, cnt);
  1765. cnt = mt76_rr(dev, MT_UMIB_RPDCR(band_idx));
  1766. mib->rx_pfdrop_cnt += cnt;
  1767. cnt = mt76_rr(dev, MT_MIB_RVSR1(band_idx));
  1768. mib->rx_vec_queue_overflow_drop_cnt += cnt;
  1769. cnt = mt76_rr(dev, MT_MIB_TSCR1(band_idx));
  1770. mib->rx_ba_cnt += cnt;
  1771. cnt = mt76_rr(dev, MT_MIB_BSCR0(band_idx));
  1772. mib->tx_bf_ebf_ppdu_cnt += cnt;
  1773. cnt = mt76_rr(dev, MT_MIB_BSCR1(band_idx));
  1774. mib->tx_bf_ibf_ppdu_cnt += cnt;
  1775. cnt = mt76_rr(dev, MT_MIB_BSCR2(band_idx));
  1776. mib->tx_mu_bf_cnt += cnt;
  1777. cnt = mt76_rr(dev, MT_MIB_TSCR5(band_idx));
  1778. mib->tx_mu_mpdu_cnt += cnt;
  1779. cnt = mt76_rr(dev, MT_MIB_TSCR6(band_idx));
  1780. mib->tx_mu_acked_mpdu_cnt += cnt;
  1781. cnt = mt76_rr(dev, MT_MIB_TSCR7(band_idx));
  1782. mib->tx_su_acked_mpdu_cnt += cnt;
  1783. cnt = mt76_rr(dev, MT_MIB_BSCR3(band_idx));
  1784. mib->tx_bf_rx_fb_ht_cnt += cnt;
  1785. mib->tx_bf_rx_fb_all_cnt += cnt;
  1786. cnt = mt76_rr(dev, MT_MIB_BSCR4(band_idx));
  1787. mib->tx_bf_rx_fb_vht_cnt += cnt;
  1788. mib->tx_bf_rx_fb_all_cnt += cnt;
  1789. cnt = mt76_rr(dev, MT_MIB_BSCR5(band_idx));
  1790. mib->tx_bf_rx_fb_he_cnt += cnt;
  1791. mib->tx_bf_rx_fb_all_cnt += cnt;
  1792. cnt = mt76_rr(dev, MT_MIB_BSCR6(band_idx));
  1793. mib->tx_bf_rx_fb_eht_cnt += cnt;
  1794. mib->tx_bf_rx_fb_all_cnt += cnt;
  1795. cnt = mt76_rr(dev, MT_ETBF_RX_FB_CONT(band_idx));
  1796. mib->tx_bf_rx_fb_bw = FIELD_GET(MT_ETBF_RX_FB_BW, cnt);
  1797. mib->tx_bf_rx_fb_nc_cnt += FIELD_GET(MT_ETBF_RX_FB_NC, cnt);
  1798. mib->tx_bf_rx_fb_nr_cnt += FIELD_GET(MT_ETBF_RX_FB_NR, cnt);
  1799. cnt = mt76_rr(dev, MT_MIB_BSCR7(band_idx));
  1800. mib->tx_bf_fb_trig_cnt += cnt;
  1801. cnt = mt76_rr(dev, MT_MIB_BSCR17(band_idx));
  1802. mib->tx_bf_fb_cpl_cnt += cnt;
  1803. for (i = 0; i < ARRAY_SIZE(mib->tx_amsdu); i++) {
  1804. cnt = mt76_rr(dev, MT_PLE_AMSDU_PACK_MSDU_CNT(i));
  1805. mib->tx_amsdu[i] += cnt;
  1806. mib->tx_amsdu_cnt += cnt;
  1807. }
  1808. /* rts count */
  1809. cnt = mt76_rr(dev, MT_MIB_BTSCR5(band_idx));
  1810. mib->rts_cnt += cnt;
  1811. /* rts retry count */
  1812. cnt = mt76_rr(dev, MT_MIB_BTSCR6(band_idx));
  1813. mib->rts_retries_cnt += cnt;
  1814. /* ba miss count */
  1815. cnt = mt76_rr(dev, MT_MIB_BTSCR0(band_idx));
  1816. mib->ba_miss_cnt += cnt;
  1817. /* ack fail count */
  1818. cnt = mt76_rr(dev, MT_MIB_BFTFCR(band_idx));
  1819. mib->ack_fail_cnt += cnt;
  1820. for (i = 0; i < 16; i++) {
  1821. cnt = mt76_rr(dev, MT_TX_AGG_CNT(band_idx, i));
  1822. phy->mt76->aggr_stats[i] += cnt;
  1823. }
  1824. }
  1825. void mt7996_mac_sta_rc_work(struct work_struct *work)
  1826. {
  1827. struct mt7996_dev *dev = container_of(work, struct mt7996_dev, rc_work);
  1828. struct ieee80211_sta *sta;
  1829. struct ieee80211_vif *vif;
  1830. struct mt7996_sta *msta;
  1831. u32 changed;
  1832. LIST_HEAD(list);
  1833. spin_lock_bh(&dev->mt76.sta_poll_lock);
  1834. list_splice_init(&dev->sta_rc_list, &list);
  1835. while (!list_empty(&list)) {
  1836. msta = list_first_entry(&list, struct mt7996_sta, rc_list);
  1837. list_del_init(&msta->rc_list);
  1838. changed = msta->changed;
  1839. msta->changed = 0;
  1840. spin_unlock_bh(&dev->mt76.sta_poll_lock);
  1841. sta = container_of((void *)msta, struct ieee80211_sta, drv_priv);
  1842. vif = container_of((void *)msta->vif, struct ieee80211_vif, drv_priv);
  1843. if (changed & (IEEE80211_RC_SUPP_RATES_CHANGED |
  1844. IEEE80211_RC_NSS_CHANGED |
  1845. IEEE80211_RC_BW_CHANGED))
  1846. mt7996_mcu_add_rate_ctrl(dev, vif, sta, true);
  1847. if (changed & IEEE80211_RC_SMPS_CHANGED)
  1848. mt7996_mcu_set_fixed_field(dev, vif, sta, NULL,
  1849. RATE_PARAM_MMPS_UPDATE);
  1850. spin_lock_bh(&dev->mt76.sta_poll_lock);
  1851. }
  1852. spin_unlock_bh(&dev->mt76.sta_poll_lock);
  1853. }
  1854. void mt7996_mac_work(struct work_struct *work)
  1855. {
  1856. struct mt7996_phy *phy;
  1857. struct mt76_phy *mphy;
  1858. mphy = (struct mt76_phy *)container_of(work, struct mt76_phy,
  1859. mac_work.work);
  1860. phy = mphy->priv;
  1861. mutex_lock(&mphy->dev->mutex);
  1862. mt76_update_survey(mphy);
  1863. if (++mphy->mac_work_count == 5) {
  1864. mphy->mac_work_count = 0;
  1865. mt7996_mac_update_stats(phy);
  1866. mt7996_mcu_get_all_sta_info(phy, UNI_ALL_STA_TXRX_RATE);
  1867. if (mtk_wed_device_active(&phy->dev->mt76.mmio.wed)) {
  1868. mt7996_mcu_get_all_sta_info(phy, UNI_ALL_STA_TXRX_ADM_STAT);
  1869. mt7996_mcu_get_all_sta_info(phy, UNI_ALL_STA_TXRX_MSDU_COUNT);
  1870. }
  1871. }
  1872. mutex_unlock(&mphy->dev->mutex);
  1873. mt76_tx_status_check(mphy->dev, false);
  1874. ieee80211_queue_delayed_work(mphy->hw, &mphy->mac_work,
  1875. MT7996_WATCHDOG_TIME);
  1876. }
  1877. static void mt7996_dfs_stop_radar_detector(struct mt7996_phy *phy)
  1878. {
  1879. struct mt7996_dev *dev = phy->dev;
  1880. if (phy->rdd_state & BIT(0))
  1881. mt7996_mcu_rdd_cmd(dev, RDD_STOP, 0,
  1882. MT_RX_SEL0, 0);
  1883. if (phy->rdd_state & BIT(1))
  1884. mt7996_mcu_rdd_cmd(dev, RDD_STOP, 1,
  1885. MT_RX_SEL0, 0);
  1886. }
  1887. static int mt7996_dfs_start_rdd(struct mt7996_dev *dev, int chain)
  1888. {
  1889. int err, region;
  1890. switch (dev->mt76.region) {
  1891. case NL80211_DFS_ETSI:
  1892. region = 0;
  1893. break;
  1894. case NL80211_DFS_JP:
  1895. region = 2;
  1896. break;
  1897. case NL80211_DFS_FCC:
  1898. default:
  1899. region = 1;
  1900. break;
  1901. }
  1902. err = mt7996_mcu_rdd_cmd(dev, RDD_START, chain,
  1903. MT_RX_SEL0, region);
  1904. if (err < 0)
  1905. return err;
  1906. return mt7996_mcu_rdd_cmd(dev, RDD_DET_MODE, chain,
  1907. MT_RX_SEL0, 1);
  1908. }
  1909. static int mt7996_dfs_start_radar_detector(struct mt7996_phy *phy)
  1910. {
  1911. struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
  1912. struct mt7996_dev *dev = phy->dev;
  1913. u8 band_idx = phy->mt76->band_idx;
  1914. int err;
  1915. /* start CAC */
  1916. err = mt7996_mcu_rdd_cmd(dev, RDD_CAC_START, band_idx,
  1917. MT_RX_SEL0, 0);
  1918. if (err < 0)
  1919. return err;
  1920. err = mt7996_dfs_start_rdd(dev, band_idx);
  1921. if (err < 0)
  1922. return err;
  1923. phy->rdd_state |= BIT(band_idx);
  1924. if (chandef->width == NL80211_CHAN_WIDTH_160 ||
  1925. chandef->width == NL80211_CHAN_WIDTH_80P80) {
  1926. err = mt7996_dfs_start_rdd(dev, 1);
  1927. if (err < 0)
  1928. return err;
  1929. phy->rdd_state |= BIT(1);
  1930. }
  1931. return 0;
  1932. }
  1933. static int
  1934. mt7996_dfs_init_radar_specs(struct mt7996_phy *phy)
  1935. {
  1936. const struct mt7996_dfs_radar_spec *radar_specs;
  1937. struct mt7996_dev *dev = phy->dev;
  1938. int err, i;
  1939. switch (dev->mt76.region) {
  1940. case NL80211_DFS_FCC:
  1941. radar_specs = &fcc_radar_specs;
  1942. err = mt7996_mcu_set_fcc5_lpn(dev, 8);
  1943. if (err < 0)
  1944. return err;
  1945. break;
  1946. case NL80211_DFS_ETSI:
  1947. radar_specs = &etsi_radar_specs;
  1948. break;
  1949. case NL80211_DFS_JP:
  1950. radar_specs = &jp_radar_specs;
  1951. break;
  1952. default:
  1953. return -EINVAL;
  1954. }
  1955. for (i = 0; i < ARRAY_SIZE(radar_specs->radar_pattern); i++) {
  1956. err = mt7996_mcu_set_radar_th(dev, i,
  1957. &radar_specs->radar_pattern[i]);
  1958. if (err < 0)
  1959. return err;
  1960. }
  1961. return mt7996_mcu_set_pulse_th(dev, &radar_specs->pulse_th);
  1962. }
  1963. int mt7996_dfs_init_radar_detector(struct mt7996_phy *phy)
  1964. {
  1965. struct mt7996_dev *dev = phy->dev;
  1966. enum mt76_dfs_state dfs_state, prev_state;
  1967. int err;
  1968. prev_state = phy->mt76->dfs_state;
  1969. dfs_state = mt76_phy_dfs_state(phy->mt76);
  1970. if (prev_state == dfs_state)
  1971. return 0;
  1972. if (prev_state == MT_DFS_STATE_UNKNOWN)
  1973. mt7996_dfs_stop_radar_detector(phy);
  1974. if (dfs_state == MT_DFS_STATE_DISABLED)
  1975. goto stop;
  1976. if (prev_state <= MT_DFS_STATE_DISABLED) {
  1977. err = mt7996_dfs_init_radar_specs(phy);
  1978. if (err < 0)
  1979. return err;
  1980. err = mt7996_dfs_start_radar_detector(phy);
  1981. if (err < 0)
  1982. return err;
  1983. phy->mt76->dfs_state = MT_DFS_STATE_CAC;
  1984. }
  1985. if (dfs_state == MT_DFS_STATE_CAC)
  1986. return 0;
  1987. err = mt7996_mcu_rdd_cmd(dev, RDD_CAC_END,
  1988. phy->mt76->band_idx, MT_RX_SEL0, 0);
  1989. if (err < 0) {
  1990. phy->mt76->dfs_state = MT_DFS_STATE_UNKNOWN;
  1991. return err;
  1992. }
  1993. phy->mt76->dfs_state = MT_DFS_STATE_ACTIVE;
  1994. return 0;
  1995. stop:
  1996. err = mt7996_mcu_rdd_cmd(dev, RDD_NORMAL_START,
  1997. phy->mt76->band_idx, MT_RX_SEL0, 0);
  1998. if (err < 0)
  1999. return err;
  2000. mt7996_dfs_stop_radar_detector(phy);
  2001. phy->mt76->dfs_state = MT_DFS_STATE_DISABLED;
  2002. return 0;
  2003. }
  2004. static int
  2005. mt7996_mac_twt_duration_align(int duration)
  2006. {
  2007. return duration << 8;
  2008. }
  2009. static u64
  2010. mt7996_mac_twt_sched_list_add(struct mt7996_dev *dev,
  2011. struct mt7996_twt_flow *flow)
  2012. {
  2013. struct mt7996_twt_flow *iter, *iter_next;
  2014. u32 duration = flow->duration << 8;
  2015. u64 start_tsf;
  2016. iter = list_first_entry_or_null(&dev->twt_list,
  2017. struct mt7996_twt_flow, list);
  2018. if (!iter || !iter->sched || iter->start_tsf > duration) {
  2019. /* add flow as first entry in the list */
  2020. list_add(&flow->list, &dev->twt_list);
  2021. return 0;
  2022. }
  2023. list_for_each_entry_safe(iter, iter_next, &dev->twt_list, list) {
  2024. start_tsf = iter->start_tsf +
  2025. mt7996_mac_twt_duration_align(iter->duration);
  2026. if (list_is_last(&iter->list, &dev->twt_list))
  2027. break;
  2028. if (!iter_next->sched ||
  2029. iter_next->start_tsf > start_tsf + duration) {
  2030. list_add(&flow->list, &iter->list);
  2031. goto out;
  2032. }
  2033. }
  2034. /* add flow as last entry in the list */
  2035. list_add_tail(&flow->list, &dev->twt_list);
  2036. out:
  2037. return start_tsf;
  2038. }
  2039. static int mt7996_mac_check_twt_req(struct ieee80211_twt_setup *twt)
  2040. {
  2041. struct ieee80211_twt_params *twt_agrt;
  2042. u64 interval, duration;
  2043. u16 mantissa;
  2044. u8 exp;
  2045. /* only individual agreement supported */
  2046. if (twt->control & IEEE80211_TWT_CONTROL_NEG_TYPE_BROADCAST)
  2047. return -EOPNOTSUPP;
  2048. /* only 256us unit supported */
  2049. if (twt->control & IEEE80211_TWT_CONTROL_WAKE_DUR_UNIT)
  2050. return -EOPNOTSUPP;
  2051. twt_agrt = (struct ieee80211_twt_params *)twt->params;
  2052. /* explicit agreement not supported */
  2053. if (!(twt_agrt->req_type & cpu_to_le16(IEEE80211_TWT_REQTYPE_IMPLICIT)))
  2054. return -EOPNOTSUPP;
  2055. exp = FIELD_GET(IEEE80211_TWT_REQTYPE_WAKE_INT_EXP,
  2056. le16_to_cpu(twt_agrt->req_type));
  2057. mantissa = le16_to_cpu(twt_agrt->mantissa);
  2058. duration = twt_agrt->min_twt_dur << 8;
  2059. interval = (u64)mantissa << exp;
  2060. if (interval < duration)
  2061. return -EOPNOTSUPP;
  2062. return 0;
  2063. }
  2064. static bool
  2065. mt7996_mac_twt_param_equal(struct mt7996_sta *msta,
  2066. struct ieee80211_twt_params *twt_agrt)
  2067. {
  2068. u16 type = le16_to_cpu(twt_agrt->req_type);
  2069. u8 exp;
  2070. int i;
  2071. exp = FIELD_GET(IEEE80211_TWT_REQTYPE_WAKE_INT_EXP, type);
  2072. for (i = 0; i < MT7996_MAX_STA_TWT_AGRT; i++) {
  2073. struct mt7996_twt_flow *f;
  2074. if (!(msta->twt.flowid_mask & BIT(i)))
  2075. continue;
  2076. f = &msta->twt.flow[i];
  2077. if (f->duration == twt_agrt->min_twt_dur &&
  2078. f->mantissa == twt_agrt->mantissa &&
  2079. f->exp == exp &&
  2080. f->protection == !!(type & IEEE80211_TWT_REQTYPE_PROTECTION) &&
  2081. f->flowtype == !!(type & IEEE80211_TWT_REQTYPE_FLOWTYPE) &&
  2082. f->trigger == !!(type & IEEE80211_TWT_REQTYPE_TRIGGER))
  2083. return true;
  2084. }
  2085. return false;
  2086. }
  2087. void mt7996_mac_add_twt_setup(struct ieee80211_hw *hw,
  2088. struct ieee80211_sta *sta,
  2089. struct ieee80211_twt_setup *twt)
  2090. {
  2091. enum ieee80211_twt_setup_cmd setup_cmd = TWT_SETUP_CMD_REJECT;
  2092. struct mt7996_sta *msta = (struct mt7996_sta *)sta->drv_priv;
  2093. struct ieee80211_twt_params *twt_agrt = (void *)twt->params;
  2094. u16 req_type = le16_to_cpu(twt_agrt->req_type);
  2095. enum ieee80211_twt_setup_cmd sta_setup_cmd;
  2096. struct mt7996_dev *dev = mt7996_hw_dev(hw);
  2097. struct mt7996_twt_flow *flow;
  2098. u8 flowid, table_id, exp;
  2099. if (mt7996_mac_check_twt_req(twt))
  2100. goto out;
  2101. mutex_lock(&dev->mt76.mutex);
  2102. if (dev->twt.n_agrt == MT7996_MAX_TWT_AGRT)
  2103. goto unlock;
  2104. if (hweight8(msta->twt.flowid_mask) == ARRAY_SIZE(msta->twt.flow))
  2105. goto unlock;
  2106. if (twt_agrt->min_twt_dur < MT7996_MIN_TWT_DUR) {
  2107. setup_cmd = TWT_SETUP_CMD_DICTATE;
  2108. twt_agrt->min_twt_dur = MT7996_MIN_TWT_DUR;
  2109. goto unlock;
  2110. }
  2111. if (mt7996_mac_twt_param_equal(msta, twt_agrt))
  2112. goto unlock;
  2113. flowid = ffs(~msta->twt.flowid_mask) - 1;
  2114. twt_agrt->req_type &= ~cpu_to_le16(IEEE80211_TWT_REQTYPE_FLOWID);
  2115. twt_agrt->req_type |= le16_encode_bits(flowid,
  2116. IEEE80211_TWT_REQTYPE_FLOWID);
  2117. table_id = ffs(~dev->twt.table_mask) - 1;
  2118. exp = FIELD_GET(IEEE80211_TWT_REQTYPE_WAKE_INT_EXP, req_type);
  2119. sta_setup_cmd = FIELD_GET(IEEE80211_TWT_REQTYPE_SETUP_CMD, req_type);
  2120. flow = &msta->twt.flow[flowid];
  2121. memset(flow, 0, sizeof(*flow));
  2122. INIT_LIST_HEAD(&flow->list);
  2123. flow->wcid = msta->wcid.idx;
  2124. flow->table_id = table_id;
  2125. flow->id = flowid;
  2126. flow->duration = twt_agrt->min_twt_dur;
  2127. flow->mantissa = twt_agrt->mantissa;
  2128. flow->exp = exp;
  2129. flow->protection = !!(req_type & IEEE80211_TWT_REQTYPE_PROTECTION);
  2130. flow->flowtype = !!(req_type & IEEE80211_TWT_REQTYPE_FLOWTYPE);
  2131. flow->trigger = !!(req_type & IEEE80211_TWT_REQTYPE_TRIGGER);
  2132. if (sta_setup_cmd == TWT_SETUP_CMD_REQUEST ||
  2133. sta_setup_cmd == TWT_SETUP_CMD_SUGGEST) {
  2134. u64 interval = (u64)le16_to_cpu(twt_agrt->mantissa) << exp;
  2135. u64 flow_tsf, curr_tsf;
  2136. u32 rem;
  2137. flow->sched = true;
  2138. flow->start_tsf = mt7996_mac_twt_sched_list_add(dev, flow);
  2139. curr_tsf = __mt7996_get_tsf(hw, msta->vif);
  2140. div_u64_rem(curr_tsf - flow->start_tsf, interval, &rem);
  2141. flow_tsf = curr_tsf + interval - rem;
  2142. twt_agrt->twt = cpu_to_le64(flow_tsf);
  2143. } else {
  2144. list_add_tail(&flow->list, &dev->twt_list);
  2145. }
  2146. flow->tsf = le64_to_cpu(twt_agrt->twt);
  2147. if (mt7996_mcu_twt_agrt_update(dev, msta->vif, flow, MCU_TWT_AGRT_ADD))
  2148. goto unlock;
  2149. setup_cmd = TWT_SETUP_CMD_ACCEPT;
  2150. dev->twt.table_mask |= BIT(table_id);
  2151. msta->twt.flowid_mask |= BIT(flowid);
  2152. dev->twt.n_agrt++;
  2153. unlock:
  2154. mutex_unlock(&dev->mt76.mutex);
  2155. out:
  2156. twt_agrt->req_type &= ~cpu_to_le16(IEEE80211_TWT_REQTYPE_SETUP_CMD);
  2157. twt_agrt->req_type |=
  2158. le16_encode_bits(setup_cmd, IEEE80211_TWT_REQTYPE_SETUP_CMD);
  2159. twt->control = twt->control & IEEE80211_TWT_CONTROL_RX_DISABLED;
  2160. }
  2161. void mt7996_mac_twt_teardown_flow(struct mt7996_dev *dev,
  2162. struct mt7996_sta *msta,
  2163. u8 flowid)
  2164. {
  2165. struct mt7996_twt_flow *flow;
  2166. lockdep_assert_held(&dev->mt76.mutex);
  2167. if (flowid >= ARRAY_SIZE(msta->twt.flow))
  2168. return;
  2169. if (!(msta->twt.flowid_mask & BIT(flowid)))
  2170. return;
  2171. flow = &msta->twt.flow[flowid];
  2172. if (mt7996_mcu_twt_agrt_update(dev, msta->vif, flow,
  2173. MCU_TWT_AGRT_DELETE))
  2174. return;
  2175. list_del_init(&flow->list);
  2176. msta->twt.flowid_mask &= ~BIT(flowid);
  2177. dev->twt.table_mask &= ~BIT(flow->table_id);
  2178. dev->twt.n_agrt--;
  2179. }