mac80211.c 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685
  1. // SPDX-License-Identifier: ISC
  2. /*
  3. * Copyright (C) 2016 Felix Fietkau <[email protected]>
  4. */
  5. #include <linux/sched.h>
  6. #include <linux/of.h>
  7. #include "mt76.h"
  8. #define CHAN2G(_idx, _freq) { \
  9. .band = NL80211_BAND_2GHZ, \
  10. .center_freq = (_freq), \
  11. .hw_value = (_idx), \
  12. .max_power = 30, \
  13. }
  14. #define CHAN5G(_idx, _freq) { \
  15. .band = NL80211_BAND_5GHZ, \
  16. .center_freq = (_freq), \
  17. .hw_value = (_idx), \
  18. .max_power = 30, \
  19. }
  20. #define CHAN6G(_idx, _freq) { \
  21. .band = NL80211_BAND_6GHZ, \
  22. .center_freq = (_freq), \
  23. .hw_value = (_idx), \
  24. .max_power = 30, \
  25. }
  26. static const struct ieee80211_channel mt76_channels_2ghz[] = {
  27. CHAN2G(1, 2412),
  28. CHAN2G(2, 2417),
  29. CHAN2G(3, 2422),
  30. CHAN2G(4, 2427),
  31. CHAN2G(5, 2432),
  32. CHAN2G(6, 2437),
  33. CHAN2G(7, 2442),
  34. CHAN2G(8, 2447),
  35. CHAN2G(9, 2452),
  36. CHAN2G(10, 2457),
  37. CHAN2G(11, 2462),
  38. CHAN2G(12, 2467),
  39. CHAN2G(13, 2472),
  40. CHAN2G(14, 2484),
  41. };
  42. static const struct ieee80211_channel mt76_channels_5ghz[] = {
  43. CHAN5G(36, 5180),
  44. CHAN5G(40, 5200),
  45. CHAN5G(44, 5220),
  46. CHAN5G(48, 5240),
  47. CHAN5G(52, 5260),
  48. CHAN5G(56, 5280),
  49. CHAN5G(60, 5300),
  50. CHAN5G(64, 5320),
  51. CHAN5G(100, 5500),
  52. CHAN5G(104, 5520),
  53. CHAN5G(108, 5540),
  54. CHAN5G(112, 5560),
  55. CHAN5G(116, 5580),
  56. CHAN5G(120, 5600),
  57. CHAN5G(124, 5620),
  58. CHAN5G(128, 5640),
  59. CHAN5G(132, 5660),
  60. CHAN5G(136, 5680),
  61. CHAN5G(140, 5700),
  62. CHAN5G(144, 5720),
  63. CHAN5G(149, 5745),
  64. CHAN5G(153, 5765),
  65. CHAN5G(157, 5785),
  66. CHAN5G(161, 5805),
  67. CHAN5G(165, 5825),
  68. CHAN5G(169, 5845),
  69. CHAN5G(173, 5865),
  70. };
  71. static const struct ieee80211_channel mt76_channels_6ghz[] = {
  72. /* UNII-5 */
  73. CHAN6G(1, 5955),
  74. CHAN6G(5, 5975),
  75. CHAN6G(9, 5995),
  76. CHAN6G(13, 6015),
  77. CHAN6G(17, 6035),
  78. CHAN6G(21, 6055),
  79. CHAN6G(25, 6075),
  80. CHAN6G(29, 6095),
  81. CHAN6G(33, 6115),
  82. CHAN6G(37, 6135),
  83. CHAN6G(41, 6155),
  84. CHAN6G(45, 6175),
  85. CHAN6G(49, 6195),
  86. CHAN6G(53, 6215),
  87. CHAN6G(57, 6235),
  88. CHAN6G(61, 6255),
  89. CHAN6G(65, 6275),
  90. CHAN6G(69, 6295),
  91. CHAN6G(73, 6315),
  92. CHAN6G(77, 6335),
  93. CHAN6G(81, 6355),
  94. CHAN6G(85, 6375),
  95. CHAN6G(89, 6395),
  96. CHAN6G(93, 6415),
  97. /* UNII-6 */
  98. CHAN6G(97, 6435),
  99. CHAN6G(101, 6455),
  100. CHAN6G(105, 6475),
  101. CHAN6G(109, 6495),
  102. CHAN6G(113, 6515),
  103. CHAN6G(117, 6535),
  104. /* UNII-7 */
  105. CHAN6G(121, 6555),
  106. CHAN6G(125, 6575),
  107. CHAN6G(129, 6595),
  108. CHAN6G(133, 6615),
  109. CHAN6G(137, 6635),
  110. CHAN6G(141, 6655),
  111. CHAN6G(145, 6675),
  112. CHAN6G(149, 6695),
  113. CHAN6G(153, 6715),
  114. CHAN6G(157, 6735),
  115. CHAN6G(161, 6755),
  116. CHAN6G(165, 6775),
  117. CHAN6G(169, 6795),
  118. CHAN6G(173, 6815),
  119. CHAN6G(177, 6835),
  120. CHAN6G(181, 6855),
  121. CHAN6G(185, 6875),
  122. /* UNII-8 */
  123. CHAN6G(189, 6895),
  124. CHAN6G(193, 6915),
  125. CHAN6G(197, 6935),
  126. CHAN6G(201, 6955),
  127. CHAN6G(205, 6975),
  128. CHAN6G(209, 6995),
  129. CHAN6G(213, 7015),
  130. CHAN6G(217, 7035),
  131. CHAN6G(221, 7055),
  132. CHAN6G(225, 7075),
  133. CHAN6G(229, 7095),
  134. CHAN6G(233, 7115),
  135. };
  136. static const struct ieee80211_tpt_blink mt76_tpt_blink[] = {
  137. { .throughput = 0 * 1024, .blink_time = 334 },
  138. { .throughput = 1 * 1024, .blink_time = 260 },
  139. { .throughput = 5 * 1024, .blink_time = 220 },
  140. { .throughput = 10 * 1024, .blink_time = 190 },
  141. { .throughput = 20 * 1024, .blink_time = 170 },
  142. { .throughput = 50 * 1024, .blink_time = 150 },
  143. { .throughput = 70 * 1024, .blink_time = 130 },
  144. { .throughput = 100 * 1024, .blink_time = 110 },
  145. { .throughput = 200 * 1024, .blink_time = 80 },
  146. { .throughput = 300 * 1024, .blink_time = 50 },
  147. };
  148. struct ieee80211_rate mt76_rates[] = {
  149. CCK_RATE(0, 10),
  150. CCK_RATE(1, 20),
  151. CCK_RATE(2, 55),
  152. CCK_RATE(3, 110),
  153. OFDM_RATE(11, 60),
  154. OFDM_RATE(15, 90),
  155. OFDM_RATE(10, 120),
  156. OFDM_RATE(14, 180),
  157. OFDM_RATE(9, 240),
  158. OFDM_RATE(13, 360),
  159. OFDM_RATE(8, 480),
  160. OFDM_RATE(12, 540),
  161. };
  162. EXPORT_SYMBOL_GPL(mt76_rates);
  163. static const struct cfg80211_sar_freq_ranges mt76_sar_freq_ranges[] = {
  164. { .start_freq = 2402, .end_freq = 2494, },
  165. { .start_freq = 5150, .end_freq = 5350, },
  166. { .start_freq = 5350, .end_freq = 5470, },
  167. { .start_freq = 5470, .end_freq = 5725, },
  168. { .start_freq = 5725, .end_freq = 5950, },
  169. { .start_freq = 5945, .end_freq = 6165, },
  170. { .start_freq = 6165, .end_freq = 6405, },
  171. { .start_freq = 6405, .end_freq = 6525, },
  172. { .start_freq = 6525, .end_freq = 6705, },
  173. { .start_freq = 6705, .end_freq = 6865, },
  174. { .start_freq = 6865, .end_freq = 7125, },
  175. };
  176. static const struct cfg80211_sar_capa mt76_sar_capa = {
  177. .type = NL80211_SAR_TYPE_POWER,
  178. .num_freq_ranges = ARRAY_SIZE(mt76_sar_freq_ranges),
  179. .freq_ranges = &mt76_sar_freq_ranges[0],
  180. };
  181. static int mt76_led_init(struct mt76_dev *dev)
  182. {
  183. struct device_node *np = dev->dev->of_node;
  184. struct ieee80211_hw *hw = dev->hw;
  185. int led_pin;
  186. if (!dev->led_cdev.brightness_set && !dev->led_cdev.blink_set)
  187. return 0;
  188. snprintf(dev->led_name, sizeof(dev->led_name),
  189. "mt76-%s", wiphy_name(hw->wiphy));
  190. dev->led_cdev.name = dev->led_name;
  191. dev->led_cdev.default_trigger =
  192. ieee80211_create_tpt_led_trigger(hw,
  193. IEEE80211_TPT_LEDTRIG_FL_RADIO,
  194. mt76_tpt_blink,
  195. ARRAY_SIZE(mt76_tpt_blink));
  196. np = of_get_child_by_name(np, "led");
  197. if (np) {
  198. if (!of_property_read_u32(np, "led-sources", &led_pin))
  199. dev->led_pin = led_pin;
  200. dev->led_al = of_property_read_bool(np, "led-active-low");
  201. of_node_put(np);
  202. }
  203. return led_classdev_register(dev->dev, &dev->led_cdev);
  204. }
  205. static void mt76_led_cleanup(struct mt76_dev *dev)
  206. {
  207. if (!dev->led_cdev.brightness_set && !dev->led_cdev.blink_set)
  208. return;
  209. led_classdev_unregister(&dev->led_cdev);
  210. }
  211. static void mt76_init_stream_cap(struct mt76_phy *phy,
  212. struct ieee80211_supported_band *sband,
  213. bool vht)
  214. {
  215. struct ieee80211_sta_ht_cap *ht_cap = &sband->ht_cap;
  216. int i, nstream = hweight8(phy->antenna_mask);
  217. struct ieee80211_sta_vht_cap *vht_cap;
  218. u16 mcs_map = 0;
  219. if (nstream > 1)
  220. ht_cap->cap |= IEEE80211_HT_CAP_TX_STBC;
  221. else
  222. ht_cap->cap &= ~IEEE80211_HT_CAP_TX_STBC;
  223. for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
  224. ht_cap->mcs.rx_mask[i] = i < nstream ? 0xff : 0;
  225. if (!vht)
  226. return;
  227. vht_cap = &sband->vht_cap;
  228. if (nstream > 1)
  229. vht_cap->cap |= IEEE80211_VHT_CAP_TXSTBC;
  230. else
  231. vht_cap->cap &= ~IEEE80211_VHT_CAP_TXSTBC;
  232. vht_cap->cap |= IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN |
  233. IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN;
  234. for (i = 0; i < 8; i++) {
  235. if (i < nstream)
  236. mcs_map |= (IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2));
  237. else
  238. mcs_map |=
  239. (IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2));
  240. }
  241. vht_cap->vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
  242. vht_cap->vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
  243. if (ieee80211_hw_check(phy->hw, SUPPORTS_VHT_EXT_NSS_BW))
  244. vht_cap->vht_mcs.tx_highest |=
  245. cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE);
  246. }
  247. void mt76_set_stream_caps(struct mt76_phy *phy, bool vht)
  248. {
  249. if (phy->cap.has_2ghz)
  250. mt76_init_stream_cap(phy, &phy->sband_2g.sband, false);
  251. if (phy->cap.has_5ghz)
  252. mt76_init_stream_cap(phy, &phy->sband_5g.sband, vht);
  253. if (phy->cap.has_6ghz)
  254. mt76_init_stream_cap(phy, &phy->sband_6g.sband, vht);
  255. }
  256. EXPORT_SYMBOL_GPL(mt76_set_stream_caps);
  257. static int
  258. mt76_init_sband(struct mt76_phy *phy, struct mt76_sband *msband,
  259. const struct ieee80211_channel *chan, int n_chan,
  260. struct ieee80211_rate *rates, int n_rates,
  261. bool ht, bool vht)
  262. {
  263. struct ieee80211_supported_band *sband = &msband->sband;
  264. struct ieee80211_sta_vht_cap *vht_cap;
  265. struct ieee80211_sta_ht_cap *ht_cap;
  266. struct mt76_dev *dev = phy->dev;
  267. void *chanlist;
  268. int size;
  269. size = n_chan * sizeof(*chan);
  270. chanlist = devm_kmemdup(dev->dev, chan, size, GFP_KERNEL);
  271. if (!chanlist)
  272. return -ENOMEM;
  273. msband->chan = devm_kcalloc(dev->dev, n_chan, sizeof(*msband->chan),
  274. GFP_KERNEL);
  275. if (!msband->chan)
  276. return -ENOMEM;
  277. sband->channels = chanlist;
  278. sband->n_channels = n_chan;
  279. sband->bitrates = rates;
  280. sband->n_bitrates = n_rates;
  281. if (!ht)
  282. return 0;
  283. ht_cap = &sband->ht_cap;
  284. ht_cap->ht_supported = true;
  285. ht_cap->cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
  286. IEEE80211_HT_CAP_GRN_FLD |
  287. IEEE80211_HT_CAP_SGI_20 |
  288. IEEE80211_HT_CAP_SGI_40 |
  289. (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT);
  290. ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
  291. ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
  292. mt76_init_stream_cap(phy, sband, vht);
  293. if (!vht)
  294. return 0;
  295. vht_cap = &sband->vht_cap;
  296. vht_cap->vht_supported = true;
  297. vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC |
  298. IEEE80211_VHT_CAP_RXSTBC_1 |
  299. IEEE80211_VHT_CAP_SHORT_GI_80 |
  300. (3 << IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT);
  301. return 0;
  302. }
  303. static int
  304. mt76_init_sband_2g(struct mt76_phy *phy, struct ieee80211_rate *rates,
  305. int n_rates)
  306. {
  307. phy->hw->wiphy->bands[NL80211_BAND_2GHZ] = &phy->sband_2g.sband;
  308. return mt76_init_sband(phy, &phy->sband_2g, mt76_channels_2ghz,
  309. ARRAY_SIZE(mt76_channels_2ghz), rates,
  310. n_rates, true, false);
  311. }
  312. static int
  313. mt76_init_sband_5g(struct mt76_phy *phy, struct ieee80211_rate *rates,
  314. int n_rates, bool vht)
  315. {
  316. phy->hw->wiphy->bands[NL80211_BAND_5GHZ] = &phy->sband_5g.sband;
  317. return mt76_init_sband(phy, &phy->sband_5g, mt76_channels_5ghz,
  318. ARRAY_SIZE(mt76_channels_5ghz), rates,
  319. n_rates, true, vht);
  320. }
  321. static int
  322. mt76_init_sband_6g(struct mt76_phy *phy, struct ieee80211_rate *rates,
  323. int n_rates)
  324. {
  325. phy->hw->wiphy->bands[NL80211_BAND_6GHZ] = &phy->sband_6g.sband;
  326. return mt76_init_sband(phy, &phy->sband_6g, mt76_channels_6ghz,
  327. ARRAY_SIZE(mt76_channels_6ghz), rates,
  328. n_rates, false, false);
  329. }
  330. static void
  331. mt76_check_sband(struct mt76_phy *phy, struct mt76_sband *msband,
  332. enum nl80211_band band)
  333. {
  334. struct ieee80211_supported_band *sband = &msband->sband;
  335. bool found = false;
  336. int i;
  337. if (!sband)
  338. return;
  339. for (i = 0; i < sband->n_channels; i++) {
  340. if (sband->channels[i].flags & IEEE80211_CHAN_DISABLED)
  341. continue;
  342. found = true;
  343. break;
  344. }
  345. if (found) {
  346. phy->chandef.chan = &sband->channels[0];
  347. phy->chan_state = &msband->chan[0];
  348. return;
  349. }
  350. sband->n_channels = 0;
  351. phy->hw->wiphy->bands[band] = NULL;
  352. }
  353. static int
  354. mt76_phy_init(struct mt76_phy *phy, struct ieee80211_hw *hw)
  355. {
  356. struct mt76_dev *dev = phy->dev;
  357. struct wiphy *wiphy = hw->wiphy;
  358. SET_IEEE80211_DEV(hw, dev->dev);
  359. SET_IEEE80211_PERM_ADDR(hw, phy->macaddr);
  360. wiphy->features |= NL80211_FEATURE_ACTIVE_MONITOR;
  361. wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH |
  362. WIPHY_FLAG_SUPPORTS_TDLS |
  363. WIPHY_FLAG_AP_UAPSD;
  364. wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
  365. wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_AIRTIME_FAIRNESS);
  366. wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_AQL);
  367. wiphy->available_antennas_tx = phy->antenna_mask;
  368. wiphy->available_antennas_rx = phy->antenna_mask;
  369. wiphy->sar_capa = &mt76_sar_capa;
  370. phy->frp = devm_kcalloc(dev->dev, wiphy->sar_capa->num_freq_ranges,
  371. sizeof(struct mt76_freq_range_power),
  372. GFP_KERNEL);
  373. if (!phy->frp)
  374. return -ENOMEM;
  375. hw->txq_data_size = sizeof(struct mt76_txq);
  376. hw->uapsd_max_sp_len = IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL;
  377. if (!hw->max_tx_fragments)
  378. hw->max_tx_fragments = 16;
  379. ieee80211_hw_set(hw, SIGNAL_DBM);
  380. ieee80211_hw_set(hw, AMPDU_AGGREGATION);
  381. ieee80211_hw_set(hw, SUPPORTS_RC_TABLE);
  382. ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
  383. ieee80211_hw_set(hw, SUPPORTS_CLONED_SKBS);
  384. ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
  385. ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER);
  386. ieee80211_hw_set(hw, TX_AMSDU);
  387. ieee80211_hw_set(hw, TX_FRAG_LIST);
  388. ieee80211_hw_set(hw, MFP_CAPABLE);
  389. ieee80211_hw_set(hw, AP_LINK_PS);
  390. ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
  391. return 0;
  392. }
  393. struct mt76_phy *
  394. mt76_alloc_phy(struct mt76_dev *dev, unsigned int size,
  395. const struct ieee80211_ops *ops, u8 band_idx)
  396. {
  397. struct ieee80211_hw *hw;
  398. unsigned int phy_size;
  399. struct mt76_phy *phy;
  400. phy_size = ALIGN(sizeof(*phy), 8);
  401. hw = ieee80211_alloc_hw(size + phy_size, ops);
  402. if (!hw)
  403. return NULL;
  404. phy = hw->priv;
  405. phy->dev = dev;
  406. phy->hw = hw;
  407. phy->priv = hw->priv + phy_size;
  408. phy->band_idx = band_idx;
  409. hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
  410. hw->wiphy->interface_modes =
  411. BIT(NL80211_IFTYPE_STATION) |
  412. BIT(NL80211_IFTYPE_AP) |
  413. #ifdef CONFIG_MAC80211_MESH
  414. BIT(NL80211_IFTYPE_MESH_POINT) |
  415. #endif
  416. BIT(NL80211_IFTYPE_P2P_CLIENT) |
  417. BIT(NL80211_IFTYPE_P2P_GO) |
  418. BIT(NL80211_IFTYPE_ADHOC);
  419. return phy;
  420. }
  421. EXPORT_SYMBOL_GPL(mt76_alloc_phy);
  422. int mt76_register_phy(struct mt76_phy *phy, bool vht,
  423. struct ieee80211_rate *rates, int n_rates)
  424. {
  425. int ret;
  426. ret = mt76_phy_init(phy, phy->hw);
  427. if (ret)
  428. return ret;
  429. if (phy->cap.has_2ghz) {
  430. ret = mt76_init_sband_2g(phy, rates, n_rates);
  431. if (ret)
  432. return ret;
  433. }
  434. if (phy->cap.has_5ghz) {
  435. ret = mt76_init_sband_5g(phy, rates + 4, n_rates - 4, vht);
  436. if (ret)
  437. return ret;
  438. }
  439. if (phy->cap.has_6ghz) {
  440. ret = mt76_init_sband_6g(phy, rates + 4, n_rates - 4);
  441. if (ret)
  442. return ret;
  443. }
  444. wiphy_read_of_freq_limits(phy->hw->wiphy);
  445. mt76_check_sband(phy, &phy->sband_2g, NL80211_BAND_2GHZ);
  446. mt76_check_sband(phy, &phy->sband_5g, NL80211_BAND_5GHZ);
  447. mt76_check_sband(phy, &phy->sband_6g, NL80211_BAND_6GHZ);
  448. ret = ieee80211_register_hw(phy->hw);
  449. if (ret)
  450. return ret;
  451. phy->dev->phys[phy->band_idx] = phy;
  452. return 0;
  453. }
  454. EXPORT_SYMBOL_GPL(mt76_register_phy);
  455. void mt76_unregister_phy(struct mt76_phy *phy)
  456. {
  457. struct mt76_dev *dev = phy->dev;
  458. mt76_tx_status_check(dev, true);
  459. ieee80211_unregister_hw(phy->hw);
  460. dev->phys[phy->band_idx] = NULL;
  461. }
  462. EXPORT_SYMBOL_GPL(mt76_unregister_phy);
  463. struct mt76_dev *
  464. mt76_alloc_device(struct device *pdev, unsigned int size,
  465. const struct ieee80211_ops *ops,
  466. const struct mt76_driver_ops *drv_ops)
  467. {
  468. struct ieee80211_hw *hw;
  469. struct mt76_phy *phy;
  470. struct mt76_dev *dev;
  471. int i;
  472. hw = ieee80211_alloc_hw(size, ops);
  473. if (!hw)
  474. return NULL;
  475. dev = hw->priv;
  476. dev->hw = hw;
  477. dev->dev = pdev;
  478. dev->drv = drv_ops;
  479. dev->dma_dev = pdev;
  480. phy = &dev->phy;
  481. phy->dev = dev;
  482. phy->hw = hw;
  483. phy->band_idx = MT_BAND0;
  484. dev->phys[phy->band_idx] = phy;
  485. spin_lock_init(&dev->rx_lock);
  486. spin_lock_init(&dev->lock);
  487. spin_lock_init(&dev->cc_lock);
  488. spin_lock_init(&dev->status_lock);
  489. mutex_init(&dev->mutex);
  490. init_waitqueue_head(&dev->tx_wait);
  491. skb_queue_head_init(&dev->mcu.res_q);
  492. init_waitqueue_head(&dev->mcu.wait);
  493. mutex_init(&dev->mcu.mutex);
  494. dev->tx_worker.fn = mt76_tx_worker;
  495. hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
  496. hw->wiphy->interface_modes =
  497. BIT(NL80211_IFTYPE_STATION) |
  498. BIT(NL80211_IFTYPE_AP) |
  499. #ifdef CONFIG_MAC80211_MESH
  500. BIT(NL80211_IFTYPE_MESH_POINT) |
  501. #endif
  502. BIT(NL80211_IFTYPE_P2P_CLIENT) |
  503. BIT(NL80211_IFTYPE_P2P_GO) |
  504. BIT(NL80211_IFTYPE_ADHOC);
  505. spin_lock_init(&dev->token_lock);
  506. idr_init(&dev->token);
  507. INIT_LIST_HEAD(&dev->wcid_list);
  508. INIT_LIST_HEAD(&dev->txwi_cache);
  509. dev->token_size = dev->drv->token_size;
  510. for (i = 0; i < ARRAY_SIZE(dev->q_rx); i++)
  511. skb_queue_head_init(&dev->rx_skb[i]);
  512. dev->wq = alloc_ordered_workqueue("mt76", 0);
  513. if (!dev->wq) {
  514. ieee80211_free_hw(hw);
  515. return NULL;
  516. }
  517. return dev;
  518. }
  519. EXPORT_SYMBOL_GPL(mt76_alloc_device);
  520. int mt76_register_device(struct mt76_dev *dev, bool vht,
  521. struct ieee80211_rate *rates, int n_rates)
  522. {
  523. struct ieee80211_hw *hw = dev->hw;
  524. struct mt76_phy *phy = &dev->phy;
  525. int ret;
  526. dev_set_drvdata(dev->dev, dev);
  527. ret = mt76_phy_init(phy, hw);
  528. if (ret)
  529. return ret;
  530. if (phy->cap.has_2ghz) {
  531. ret = mt76_init_sband_2g(phy, rates, n_rates);
  532. if (ret)
  533. return ret;
  534. }
  535. if (phy->cap.has_5ghz) {
  536. ret = mt76_init_sband_5g(phy, rates + 4, n_rates - 4, vht);
  537. if (ret)
  538. return ret;
  539. }
  540. if (phy->cap.has_6ghz) {
  541. ret = mt76_init_sband_6g(phy, rates + 4, n_rates - 4);
  542. if (ret)
  543. return ret;
  544. }
  545. wiphy_read_of_freq_limits(hw->wiphy);
  546. mt76_check_sband(&dev->phy, &phy->sband_2g, NL80211_BAND_2GHZ);
  547. mt76_check_sband(&dev->phy, &phy->sband_5g, NL80211_BAND_5GHZ);
  548. mt76_check_sband(&dev->phy, &phy->sband_6g, NL80211_BAND_6GHZ);
  549. if (IS_ENABLED(CONFIG_MT76_LEDS)) {
  550. ret = mt76_led_init(dev);
  551. if (ret)
  552. return ret;
  553. }
  554. ret = ieee80211_register_hw(hw);
  555. if (ret)
  556. return ret;
  557. WARN_ON(mt76_worker_setup(hw, &dev->tx_worker, NULL, "tx"));
  558. sched_set_fifo_low(dev->tx_worker.task);
  559. return 0;
  560. }
  561. EXPORT_SYMBOL_GPL(mt76_register_device);
  562. void mt76_unregister_device(struct mt76_dev *dev)
  563. {
  564. struct ieee80211_hw *hw = dev->hw;
  565. if (IS_ENABLED(CONFIG_MT76_LEDS))
  566. mt76_led_cleanup(dev);
  567. mt76_tx_status_check(dev, true);
  568. ieee80211_unregister_hw(hw);
  569. }
  570. EXPORT_SYMBOL_GPL(mt76_unregister_device);
  571. void mt76_free_device(struct mt76_dev *dev)
  572. {
  573. mt76_worker_teardown(&dev->tx_worker);
  574. if (dev->wq) {
  575. destroy_workqueue(dev->wq);
  576. dev->wq = NULL;
  577. }
  578. ieee80211_free_hw(dev->hw);
  579. }
  580. EXPORT_SYMBOL_GPL(mt76_free_device);
  581. static void mt76_rx_release_amsdu(struct mt76_phy *phy, enum mt76_rxq_id q)
  582. {
  583. struct sk_buff *skb = phy->rx_amsdu[q].head;
  584. struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
  585. struct mt76_dev *dev = phy->dev;
  586. phy->rx_amsdu[q].head = NULL;
  587. phy->rx_amsdu[q].tail = NULL;
  588. /*
  589. * Validate if the amsdu has a proper first subframe.
  590. * A single MSDU can be parsed as A-MSDU when the unauthenticated A-MSDU
  591. * flag of the QoS header gets flipped. In such cases, the first
  592. * subframe has a LLC/SNAP header in the location of the destination
  593. * address.
  594. */
  595. if (skb_shinfo(skb)->frag_list) {
  596. int offset = 0;
  597. if (!(status->flag & RX_FLAG_8023)) {
  598. offset = ieee80211_get_hdrlen_from_skb(skb);
  599. if ((status->flag &
  600. (RX_FLAG_DECRYPTED | RX_FLAG_IV_STRIPPED)) ==
  601. RX_FLAG_DECRYPTED)
  602. offset += 8;
  603. }
  604. if (ether_addr_equal(skb->data + offset, rfc1042_header)) {
  605. dev_kfree_skb(skb);
  606. return;
  607. }
  608. }
  609. __skb_queue_tail(&dev->rx_skb[q], skb);
  610. }
  611. static void mt76_rx_release_burst(struct mt76_phy *phy, enum mt76_rxq_id q,
  612. struct sk_buff *skb)
  613. {
  614. struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
  615. if (phy->rx_amsdu[q].head &&
  616. (!status->amsdu || status->first_amsdu ||
  617. status->seqno != phy->rx_amsdu[q].seqno))
  618. mt76_rx_release_amsdu(phy, q);
  619. if (!phy->rx_amsdu[q].head) {
  620. phy->rx_amsdu[q].tail = &skb_shinfo(skb)->frag_list;
  621. phy->rx_amsdu[q].seqno = status->seqno;
  622. phy->rx_amsdu[q].head = skb;
  623. } else {
  624. *phy->rx_amsdu[q].tail = skb;
  625. phy->rx_amsdu[q].tail = &skb->next;
  626. }
  627. if (!status->amsdu || status->last_amsdu)
  628. mt76_rx_release_amsdu(phy, q);
  629. }
  630. void mt76_rx(struct mt76_dev *dev, enum mt76_rxq_id q, struct sk_buff *skb)
  631. {
  632. struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
  633. struct mt76_phy *phy = mt76_dev_phy(dev, status->phy_idx);
  634. if (!test_bit(MT76_STATE_RUNNING, &phy->state)) {
  635. dev_kfree_skb(skb);
  636. return;
  637. }
  638. #ifdef CONFIG_NL80211_TESTMODE
  639. if (phy->test.state == MT76_TM_STATE_RX_FRAMES) {
  640. phy->test.rx_stats.packets[q]++;
  641. if (status->flag & RX_FLAG_FAILED_FCS_CRC)
  642. phy->test.rx_stats.fcs_error[q]++;
  643. }
  644. #endif
  645. mt76_rx_release_burst(phy, q, skb);
  646. }
  647. EXPORT_SYMBOL_GPL(mt76_rx);
  648. bool mt76_has_tx_pending(struct mt76_phy *phy)
  649. {
  650. struct mt76_queue *q;
  651. int i;
  652. for (i = 0; i < __MT_TXQ_MAX; i++) {
  653. q = phy->q_tx[i];
  654. if (q && q->queued)
  655. return true;
  656. }
  657. return false;
  658. }
  659. EXPORT_SYMBOL_GPL(mt76_has_tx_pending);
  660. static struct mt76_channel_state *
  661. mt76_channel_state(struct mt76_phy *phy, struct ieee80211_channel *c)
  662. {
  663. struct mt76_sband *msband;
  664. int idx;
  665. if (c->band == NL80211_BAND_2GHZ)
  666. msband = &phy->sband_2g;
  667. else if (c->band == NL80211_BAND_6GHZ)
  668. msband = &phy->sband_6g;
  669. else
  670. msband = &phy->sband_5g;
  671. idx = c - &msband->sband.channels[0];
  672. return &msband->chan[idx];
  673. }
  674. void mt76_update_survey_active_time(struct mt76_phy *phy, ktime_t time)
  675. {
  676. struct mt76_channel_state *state = phy->chan_state;
  677. state->cc_active += ktime_to_us(ktime_sub(time,
  678. phy->survey_time));
  679. phy->survey_time = time;
  680. }
  681. EXPORT_SYMBOL_GPL(mt76_update_survey_active_time);
  682. void mt76_update_survey(struct mt76_phy *phy)
  683. {
  684. struct mt76_dev *dev = phy->dev;
  685. ktime_t cur_time;
  686. if (dev->drv->update_survey)
  687. dev->drv->update_survey(phy);
  688. cur_time = ktime_get_boottime();
  689. mt76_update_survey_active_time(phy, cur_time);
  690. if (dev->drv->drv_flags & MT_DRV_SW_RX_AIRTIME) {
  691. struct mt76_channel_state *state = phy->chan_state;
  692. spin_lock_bh(&dev->cc_lock);
  693. state->cc_bss_rx += dev->cur_cc_bss_rx;
  694. dev->cur_cc_bss_rx = 0;
  695. spin_unlock_bh(&dev->cc_lock);
  696. }
  697. }
  698. EXPORT_SYMBOL_GPL(mt76_update_survey);
  699. void mt76_set_channel(struct mt76_phy *phy)
  700. {
  701. struct mt76_dev *dev = phy->dev;
  702. struct ieee80211_hw *hw = phy->hw;
  703. struct cfg80211_chan_def *chandef = &hw->conf.chandef;
  704. bool offchannel = hw->conf.flags & IEEE80211_CONF_OFFCHANNEL;
  705. int timeout = HZ / 5;
  706. wait_event_timeout(dev->tx_wait, !mt76_has_tx_pending(phy), timeout);
  707. mt76_update_survey(phy);
  708. if (phy->chandef.chan->center_freq != chandef->chan->center_freq ||
  709. phy->chandef.width != chandef->width)
  710. phy->dfs_state = MT_DFS_STATE_UNKNOWN;
  711. phy->chandef = *chandef;
  712. phy->chan_state = mt76_channel_state(phy, chandef->chan);
  713. if (!offchannel)
  714. phy->main_chan = chandef->chan;
  715. if (chandef->chan != phy->main_chan)
  716. memset(phy->chan_state, 0, sizeof(*phy->chan_state));
  717. }
  718. EXPORT_SYMBOL_GPL(mt76_set_channel);
  719. int mt76_get_survey(struct ieee80211_hw *hw, int idx,
  720. struct survey_info *survey)
  721. {
  722. struct mt76_phy *phy = hw->priv;
  723. struct mt76_dev *dev = phy->dev;
  724. struct mt76_sband *sband;
  725. struct ieee80211_channel *chan;
  726. struct mt76_channel_state *state;
  727. int ret = 0;
  728. mutex_lock(&dev->mutex);
  729. if (idx == 0 && dev->drv->update_survey)
  730. mt76_update_survey(phy);
  731. if (idx >= phy->sband_2g.sband.n_channels +
  732. phy->sband_5g.sband.n_channels) {
  733. idx -= (phy->sband_2g.sband.n_channels +
  734. phy->sband_5g.sband.n_channels);
  735. sband = &phy->sband_6g;
  736. } else if (idx >= phy->sband_2g.sband.n_channels) {
  737. idx -= phy->sband_2g.sband.n_channels;
  738. sband = &phy->sband_5g;
  739. } else {
  740. sband = &phy->sband_2g;
  741. }
  742. if (idx >= sband->sband.n_channels) {
  743. ret = -ENOENT;
  744. goto out;
  745. }
  746. chan = &sband->sband.channels[idx];
  747. state = mt76_channel_state(phy, chan);
  748. memset(survey, 0, sizeof(*survey));
  749. survey->channel = chan;
  750. survey->filled = SURVEY_INFO_TIME | SURVEY_INFO_TIME_BUSY;
  751. survey->filled |= dev->drv->survey_flags;
  752. if (state->noise)
  753. survey->filled |= SURVEY_INFO_NOISE_DBM;
  754. if (chan == phy->main_chan) {
  755. survey->filled |= SURVEY_INFO_IN_USE;
  756. if (dev->drv->drv_flags & MT_DRV_SW_RX_AIRTIME)
  757. survey->filled |= SURVEY_INFO_TIME_BSS_RX;
  758. }
  759. survey->time_busy = div_u64(state->cc_busy, 1000);
  760. survey->time_rx = div_u64(state->cc_rx, 1000);
  761. survey->time = div_u64(state->cc_active, 1000);
  762. survey->noise = state->noise;
  763. spin_lock_bh(&dev->cc_lock);
  764. survey->time_bss_rx = div_u64(state->cc_bss_rx, 1000);
  765. survey->time_tx = div_u64(state->cc_tx, 1000);
  766. spin_unlock_bh(&dev->cc_lock);
  767. out:
  768. mutex_unlock(&dev->mutex);
  769. return ret;
  770. }
  771. EXPORT_SYMBOL_GPL(mt76_get_survey);
  772. void mt76_wcid_key_setup(struct mt76_dev *dev, struct mt76_wcid *wcid,
  773. struct ieee80211_key_conf *key)
  774. {
  775. struct ieee80211_key_seq seq;
  776. int i;
  777. wcid->rx_check_pn = false;
  778. if (!key)
  779. return;
  780. if (key->cipher != WLAN_CIPHER_SUITE_CCMP)
  781. return;
  782. wcid->rx_check_pn = true;
  783. /* data frame */
  784. for (i = 0; i < IEEE80211_NUM_TIDS; i++) {
  785. ieee80211_get_key_rx_seq(key, i, &seq);
  786. memcpy(wcid->rx_key_pn[i], seq.ccmp.pn, sizeof(seq.ccmp.pn));
  787. }
  788. /* robust management frame */
  789. ieee80211_get_key_rx_seq(key, -1, &seq);
  790. memcpy(wcid->rx_key_pn[i], seq.ccmp.pn, sizeof(seq.ccmp.pn));
  791. }
  792. EXPORT_SYMBOL(mt76_wcid_key_setup);
  793. static int
  794. mt76_rx_signal(struct mt76_rx_status *status)
  795. {
  796. s8 *chain_signal = status->chain_signal;
  797. int signal = -128;
  798. u8 chains;
  799. for (chains = status->chains; chains; chains >>= 1, chain_signal++) {
  800. int cur, diff;
  801. cur = *chain_signal;
  802. if (!(chains & BIT(0)) ||
  803. cur > 0)
  804. continue;
  805. if (cur > signal)
  806. swap(cur, signal);
  807. diff = signal - cur;
  808. if (diff == 0)
  809. signal += 3;
  810. else if (diff <= 2)
  811. signal += 2;
  812. else if (diff <= 6)
  813. signal += 1;
  814. }
  815. return signal;
  816. }
  817. static void
  818. mt76_rx_convert(struct mt76_dev *dev, struct sk_buff *skb,
  819. struct ieee80211_hw **hw,
  820. struct ieee80211_sta **sta)
  821. {
  822. struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
  823. struct ieee80211_hdr *hdr = mt76_skb_get_hdr(skb);
  824. struct mt76_rx_status mstat;
  825. mstat = *((struct mt76_rx_status *)skb->cb);
  826. memset(status, 0, sizeof(*status));
  827. status->flag = mstat.flag;
  828. status->freq = mstat.freq;
  829. status->enc_flags = mstat.enc_flags;
  830. status->encoding = mstat.encoding;
  831. status->bw = mstat.bw;
  832. status->he_ru = mstat.he_ru;
  833. status->he_gi = mstat.he_gi;
  834. status->he_dcm = mstat.he_dcm;
  835. status->rate_idx = mstat.rate_idx;
  836. status->nss = mstat.nss;
  837. status->band = mstat.band;
  838. status->signal = mstat.signal;
  839. status->chains = mstat.chains;
  840. status->ampdu_reference = mstat.ampdu_ref;
  841. status->device_timestamp = mstat.timestamp;
  842. status->mactime = mstat.timestamp;
  843. status->signal = mt76_rx_signal(&mstat);
  844. if (status->signal <= -128)
  845. status->flag |= RX_FLAG_NO_SIGNAL_VAL;
  846. if (ieee80211_is_beacon(hdr->frame_control) ||
  847. ieee80211_is_probe_resp(hdr->frame_control))
  848. status->boottime_ns = ktime_get_boottime_ns();
  849. BUILD_BUG_ON(sizeof(mstat) > sizeof(skb->cb));
  850. BUILD_BUG_ON(sizeof(status->chain_signal) !=
  851. sizeof(mstat.chain_signal));
  852. memcpy(status->chain_signal, mstat.chain_signal,
  853. sizeof(mstat.chain_signal));
  854. *sta = wcid_to_sta(mstat.wcid);
  855. *hw = mt76_phy_hw(dev, mstat.phy_idx);
  856. }
  857. static void
  858. mt76_check_ccmp_pn(struct sk_buff *skb)
  859. {
  860. struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
  861. struct mt76_wcid *wcid = status->wcid;
  862. struct ieee80211_hdr *hdr;
  863. int security_idx;
  864. int ret;
  865. if (!(status->flag & RX_FLAG_DECRYPTED))
  866. return;
  867. if (status->flag & RX_FLAG_ONLY_MONITOR)
  868. return;
  869. if (!wcid || !wcid->rx_check_pn)
  870. return;
  871. security_idx = status->qos_ctl & IEEE80211_QOS_CTL_TID_MASK;
  872. if (status->flag & RX_FLAG_8023)
  873. goto skip_hdr_check;
  874. hdr = mt76_skb_get_hdr(skb);
  875. if (!(status->flag & RX_FLAG_IV_STRIPPED)) {
  876. /*
  877. * Validate the first fragment both here and in mac80211
  878. * All further fragments will be validated by mac80211 only.
  879. */
  880. if (ieee80211_is_frag(hdr) &&
  881. !ieee80211_is_first_frag(hdr->frame_control))
  882. return;
  883. }
  884. /* IEEE 802.11-2020, 12.5.3.4.4 "PN and replay detection" c):
  885. *
  886. * the recipient shall maintain a single replay counter for received
  887. * individually addressed robust Management frames that are received
  888. * with the To DS subfield equal to 0, [...]
  889. */
  890. if (ieee80211_is_mgmt(hdr->frame_control) &&
  891. !ieee80211_has_tods(hdr->frame_control))
  892. security_idx = IEEE80211_NUM_TIDS;
  893. skip_hdr_check:
  894. BUILD_BUG_ON(sizeof(status->iv) != sizeof(wcid->rx_key_pn[0]));
  895. ret = memcmp(status->iv, wcid->rx_key_pn[security_idx],
  896. sizeof(status->iv));
  897. if (ret <= 0) {
  898. status->flag |= RX_FLAG_ONLY_MONITOR;
  899. return;
  900. }
  901. memcpy(wcid->rx_key_pn[security_idx], status->iv, sizeof(status->iv));
  902. if (status->flag & RX_FLAG_IV_STRIPPED)
  903. status->flag |= RX_FLAG_PN_VALIDATED;
  904. }
  905. static void
  906. mt76_airtime_report(struct mt76_dev *dev, struct mt76_rx_status *status,
  907. int len)
  908. {
  909. struct mt76_wcid *wcid = status->wcid;
  910. struct ieee80211_rx_status info = {
  911. .enc_flags = status->enc_flags,
  912. .rate_idx = status->rate_idx,
  913. .encoding = status->encoding,
  914. .band = status->band,
  915. .nss = status->nss,
  916. .bw = status->bw,
  917. };
  918. struct ieee80211_sta *sta;
  919. u32 airtime;
  920. u8 tidno = status->qos_ctl & IEEE80211_QOS_CTL_TID_MASK;
  921. airtime = ieee80211_calc_rx_airtime(dev->hw, &info, len);
  922. spin_lock(&dev->cc_lock);
  923. dev->cur_cc_bss_rx += airtime;
  924. spin_unlock(&dev->cc_lock);
  925. if (!wcid || !wcid->sta)
  926. return;
  927. sta = container_of((void *)wcid, struct ieee80211_sta, drv_priv);
  928. ieee80211_sta_register_airtime(sta, tidno, 0, airtime);
  929. }
  930. static void
  931. mt76_airtime_flush_ampdu(struct mt76_dev *dev)
  932. {
  933. struct mt76_wcid *wcid;
  934. int wcid_idx;
  935. if (!dev->rx_ampdu_len)
  936. return;
  937. wcid_idx = dev->rx_ampdu_status.wcid_idx;
  938. if (wcid_idx < ARRAY_SIZE(dev->wcid))
  939. wcid = rcu_dereference(dev->wcid[wcid_idx]);
  940. else
  941. wcid = NULL;
  942. dev->rx_ampdu_status.wcid = wcid;
  943. mt76_airtime_report(dev, &dev->rx_ampdu_status, dev->rx_ampdu_len);
  944. dev->rx_ampdu_len = 0;
  945. dev->rx_ampdu_ref = 0;
  946. }
  947. static void
  948. mt76_airtime_check(struct mt76_dev *dev, struct sk_buff *skb)
  949. {
  950. struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
  951. struct mt76_wcid *wcid = status->wcid;
  952. if (!(dev->drv->drv_flags & MT_DRV_SW_RX_AIRTIME))
  953. return;
  954. if (!wcid || !wcid->sta) {
  955. struct ieee80211_hdr *hdr = mt76_skb_get_hdr(skb);
  956. if (status->flag & RX_FLAG_8023)
  957. return;
  958. if (!ether_addr_equal(hdr->addr1, dev->phy.macaddr))
  959. return;
  960. wcid = NULL;
  961. }
  962. if (!(status->flag & RX_FLAG_AMPDU_DETAILS) ||
  963. status->ampdu_ref != dev->rx_ampdu_ref)
  964. mt76_airtime_flush_ampdu(dev);
  965. if (status->flag & RX_FLAG_AMPDU_DETAILS) {
  966. if (!dev->rx_ampdu_len ||
  967. status->ampdu_ref != dev->rx_ampdu_ref) {
  968. dev->rx_ampdu_status = *status;
  969. dev->rx_ampdu_status.wcid_idx = wcid ? wcid->idx : 0xff;
  970. dev->rx_ampdu_ref = status->ampdu_ref;
  971. }
  972. dev->rx_ampdu_len += skb->len;
  973. return;
  974. }
  975. mt76_airtime_report(dev, status, skb->len);
  976. }
  977. static void
  978. mt76_check_sta(struct mt76_dev *dev, struct sk_buff *skb)
  979. {
  980. struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
  981. struct ieee80211_hdr *hdr = mt76_skb_get_hdr(skb);
  982. struct ieee80211_sta *sta;
  983. struct ieee80211_hw *hw;
  984. struct mt76_wcid *wcid = status->wcid;
  985. u8 tidno = status->qos_ctl & IEEE80211_QOS_CTL_TID_MASK;
  986. bool ps;
  987. hw = mt76_phy_hw(dev, status->phy_idx);
  988. if (ieee80211_is_pspoll(hdr->frame_control) && !wcid &&
  989. !(status->flag & RX_FLAG_8023)) {
  990. sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr2, NULL);
  991. if (sta)
  992. wcid = status->wcid = (struct mt76_wcid *)sta->drv_priv;
  993. }
  994. mt76_airtime_check(dev, skb);
  995. if (!wcid || !wcid->sta)
  996. return;
  997. sta = container_of((void *)wcid, struct ieee80211_sta, drv_priv);
  998. if (status->signal <= 0)
  999. ewma_signal_add(&wcid->rssi, -status->signal);
  1000. wcid->inactive_count = 0;
  1001. if (status->flag & RX_FLAG_8023)
  1002. return;
  1003. if (!test_bit(MT_WCID_FLAG_CHECK_PS, &wcid->flags))
  1004. return;
  1005. if (ieee80211_is_pspoll(hdr->frame_control)) {
  1006. ieee80211_sta_pspoll(sta);
  1007. return;
  1008. }
  1009. if (ieee80211_has_morefrags(hdr->frame_control) ||
  1010. !(ieee80211_is_mgmt(hdr->frame_control) ||
  1011. ieee80211_is_data(hdr->frame_control)))
  1012. return;
  1013. ps = ieee80211_has_pm(hdr->frame_control);
  1014. if (ps && (ieee80211_is_data_qos(hdr->frame_control) ||
  1015. ieee80211_is_qos_nullfunc(hdr->frame_control)))
  1016. ieee80211_sta_uapsd_trigger(sta, tidno);
  1017. if (!!test_bit(MT_WCID_FLAG_PS, &wcid->flags) == ps)
  1018. return;
  1019. if (ps)
  1020. set_bit(MT_WCID_FLAG_PS, &wcid->flags);
  1021. dev->drv->sta_ps(dev, sta, ps);
  1022. if (!ps)
  1023. clear_bit(MT_WCID_FLAG_PS, &wcid->flags);
  1024. ieee80211_sta_ps_transition(sta, ps);
  1025. }
  1026. void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames,
  1027. struct napi_struct *napi)
  1028. {
  1029. struct ieee80211_sta *sta;
  1030. struct ieee80211_hw *hw;
  1031. struct sk_buff *skb, *tmp;
  1032. LIST_HEAD(list);
  1033. spin_lock(&dev->rx_lock);
  1034. while ((skb = __skb_dequeue(frames)) != NULL) {
  1035. struct sk_buff *nskb = skb_shinfo(skb)->frag_list;
  1036. mt76_check_ccmp_pn(skb);
  1037. skb_shinfo(skb)->frag_list = NULL;
  1038. mt76_rx_convert(dev, skb, &hw, &sta);
  1039. ieee80211_rx_list(hw, sta, skb, &list);
  1040. /* subsequent amsdu frames */
  1041. while (nskb) {
  1042. skb = nskb;
  1043. nskb = nskb->next;
  1044. skb->next = NULL;
  1045. mt76_rx_convert(dev, skb, &hw, &sta);
  1046. ieee80211_rx_list(hw, sta, skb, &list);
  1047. }
  1048. }
  1049. spin_unlock(&dev->rx_lock);
  1050. if (!napi) {
  1051. netif_receive_skb_list(&list);
  1052. return;
  1053. }
  1054. list_for_each_entry_safe(skb, tmp, &list, list) {
  1055. skb_list_del_init(skb);
  1056. napi_gro_receive(napi, skb);
  1057. }
  1058. }
  1059. void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q,
  1060. struct napi_struct *napi)
  1061. {
  1062. struct sk_buff_head frames;
  1063. struct sk_buff *skb;
  1064. __skb_queue_head_init(&frames);
  1065. while ((skb = __skb_dequeue(&dev->rx_skb[q])) != NULL) {
  1066. mt76_check_sta(dev, skb);
  1067. mt76_rx_aggr_reorder(skb, &frames);
  1068. }
  1069. mt76_rx_complete(dev, &frames, napi);
  1070. }
  1071. EXPORT_SYMBOL_GPL(mt76_rx_poll_complete);
  1072. static int
  1073. mt76_sta_add(struct mt76_phy *phy, struct ieee80211_vif *vif,
  1074. struct ieee80211_sta *sta)
  1075. {
  1076. struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
  1077. struct mt76_dev *dev = phy->dev;
  1078. int ret;
  1079. int i;
  1080. mutex_lock(&dev->mutex);
  1081. ret = dev->drv->sta_add(dev, vif, sta);
  1082. if (ret)
  1083. goto out;
  1084. for (i = 0; i < ARRAY_SIZE(sta->txq); i++) {
  1085. struct mt76_txq *mtxq;
  1086. if (!sta->txq[i])
  1087. continue;
  1088. mtxq = (struct mt76_txq *)sta->txq[i]->drv_priv;
  1089. mtxq->wcid = wcid->idx;
  1090. }
  1091. ewma_signal_init(&wcid->rssi);
  1092. if (phy->band_idx == MT_BAND1)
  1093. mt76_wcid_mask_set(dev->wcid_phy_mask, wcid->idx);
  1094. wcid->phy_idx = phy->band_idx;
  1095. rcu_assign_pointer(dev->wcid[wcid->idx], wcid);
  1096. mt76_packet_id_init(wcid);
  1097. out:
  1098. mutex_unlock(&dev->mutex);
  1099. return ret;
  1100. }
  1101. void __mt76_sta_remove(struct mt76_dev *dev, struct ieee80211_vif *vif,
  1102. struct ieee80211_sta *sta)
  1103. {
  1104. struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
  1105. int i, idx = wcid->idx;
  1106. for (i = 0; i < ARRAY_SIZE(wcid->aggr); i++)
  1107. mt76_rx_aggr_stop(dev, wcid, i);
  1108. if (dev->drv->sta_remove)
  1109. dev->drv->sta_remove(dev, vif, sta);
  1110. mt76_packet_id_flush(dev, wcid);
  1111. mt76_wcid_mask_clear(dev->wcid_mask, idx);
  1112. mt76_wcid_mask_clear(dev->wcid_phy_mask, idx);
  1113. }
  1114. EXPORT_SYMBOL_GPL(__mt76_sta_remove);
  1115. static void
  1116. mt76_sta_remove(struct mt76_dev *dev, struct ieee80211_vif *vif,
  1117. struct ieee80211_sta *sta)
  1118. {
  1119. mutex_lock(&dev->mutex);
  1120. __mt76_sta_remove(dev, vif, sta);
  1121. mutex_unlock(&dev->mutex);
  1122. }
  1123. int mt76_sta_state(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
  1124. struct ieee80211_sta *sta,
  1125. enum ieee80211_sta_state old_state,
  1126. enum ieee80211_sta_state new_state)
  1127. {
  1128. struct mt76_phy *phy = hw->priv;
  1129. struct mt76_dev *dev = phy->dev;
  1130. if (old_state == IEEE80211_STA_NOTEXIST &&
  1131. new_state == IEEE80211_STA_NONE)
  1132. return mt76_sta_add(phy, vif, sta);
  1133. if (old_state == IEEE80211_STA_AUTH &&
  1134. new_state == IEEE80211_STA_ASSOC &&
  1135. dev->drv->sta_assoc)
  1136. dev->drv->sta_assoc(dev, vif, sta);
  1137. if (old_state == IEEE80211_STA_NONE &&
  1138. new_state == IEEE80211_STA_NOTEXIST)
  1139. mt76_sta_remove(dev, vif, sta);
  1140. return 0;
  1141. }
  1142. EXPORT_SYMBOL_GPL(mt76_sta_state);
  1143. void mt76_sta_pre_rcu_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
  1144. struct ieee80211_sta *sta)
  1145. {
  1146. struct mt76_phy *phy = hw->priv;
  1147. struct mt76_dev *dev = phy->dev;
  1148. struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
  1149. mutex_lock(&dev->mutex);
  1150. spin_lock_bh(&dev->status_lock);
  1151. rcu_assign_pointer(dev->wcid[wcid->idx], NULL);
  1152. spin_unlock_bh(&dev->status_lock);
  1153. mutex_unlock(&dev->mutex);
  1154. }
  1155. EXPORT_SYMBOL_GPL(mt76_sta_pre_rcu_remove);
  1156. int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
  1157. int *dbm)
  1158. {
  1159. struct mt76_phy *phy = hw->priv;
  1160. int n_chains = hweight8(phy->antenna_mask);
  1161. int delta = mt76_tx_power_nss_delta(n_chains);
  1162. *dbm = DIV_ROUND_UP(phy->txpower_cur + delta, 2);
  1163. return 0;
  1164. }
  1165. EXPORT_SYMBOL_GPL(mt76_get_txpower);
  1166. int mt76_init_sar_power(struct ieee80211_hw *hw,
  1167. const struct cfg80211_sar_specs *sar)
  1168. {
  1169. struct mt76_phy *phy = hw->priv;
  1170. const struct cfg80211_sar_capa *capa = hw->wiphy->sar_capa;
  1171. int i;
  1172. if (sar->type != NL80211_SAR_TYPE_POWER || !sar->num_sub_specs)
  1173. return -EINVAL;
  1174. for (i = 0; i < sar->num_sub_specs; i++) {
  1175. u32 index = sar->sub_specs[i].freq_range_index;
  1176. /* SAR specifies power limitaton in 0.25dbm */
  1177. s32 power = sar->sub_specs[i].power >> 1;
  1178. if (power > 127 || power < -127)
  1179. power = 127;
  1180. phy->frp[index].range = &capa->freq_ranges[index];
  1181. phy->frp[index].power = power;
  1182. }
  1183. return 0;
  1184. }
  1185. EXPORT_SYMBOL_GPL(mt76_init_sar_power);
  1186. int mt76_get_sar_power(struct mt76_phy *phy,
  1187. struct ieee80211_channel *chan,
  1188. int power)
  1189. {
  1190. const struct cfg80211_sar_capa *capa = phy->hw->wiphy->sar_capa;
  1191. int freq, i;
  1192. if (!capa || !phy->frp)
  1193. return power;
  1194. if (power > 127 || power < -127)
  1195. power = 127;
  1196. freq = ieee80211_channel_to_frequency(chan->hw_value, chan->band);
  1197. for (i = 0 ; i < capa->num_freq_ranges; i++) {
  1198. if (phy->frp[i].range &&
  1199. freq >= phy->frp[i].range->start_freq &&
  1200. freq < phy->frp[i].range->end_freq) {
  1201. power = min_t(int, phy->frp[i].power, power);
  1202. break;
  1203. }
  1204. }
  1205. return power;
  1206. }
  1207. EXPORT_SYMBOL_GPL(mt76_get_sar_power);
  1208. static void
  1209. __mt76_csa_finish(void *priv, u8 *mac, struct ieee80211_vif *vif)
  1210. {
  1211. if (vif->bss_conf.csa_active && ieee80211_beacon_cntdwn_is_complete(vif))
  1212. ieee80211_csa_finish(vif);
  1213. }
  1214. void mt76_csa_finish(struct mt76_dev *dev)
  1215. {
  1216. if (!dev->csa_complete)
  1217. return;
  1218. ieee80211_iterate_active_interfaces_atomic(dev->hw,
  1219. IEEE80211_IFACE_ITER_RESUME_ALL,
  1220. __mt76_csa_finish, dev);
  1221. dev->csa_complete = 0;
  1222. }
  1223. EXPORT_SYMBOL_GPL(mt76_csa_finish);
  1224. static void
  1225. __mt76_csa_check(void *priv, u8 *mac, struct ieee80211_vif *vif)
  1226. {
  1227. struct mt76_dev *dev = priv;
  1228. if (!vif->bss_conf.csa_active)
  1229. return;
  1230. dev->csa_complete |= ieee80211_beacon_cntdwn_is_complete(vif);
  1231. }
  1232. void mt76_csa_check(struct mt76_dev *dev)
  1233. {
  1234. ieee80211_iterate_active_interfaces_atomic(dev->hw,
  1235. IEEE80211_IFACE_ITER_RESUME_ALL,
  1236. __mt76_csa_check, dev);
  1237. }
  1238. EXPORT_SYMBOL_GPL(mt76_csa_check);
  1239. int
  1240. mt76_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta, bool set)
  1241. {
  1242. return 0;
  1243. }
  1244. EXPORT_SYMBOL_GPL(mt76_set_tim);
  1245. void mt76_insert_ccmp_hdr(struct sk_buff *skb, u8 key_id)
  1246. {
  1247. struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
  1248. int hdr_len = ieee80211_get_hdrlen_from_skb(skb);
  1249. u8 *hdr, *pn = status->iv;
  1250. __skb_push(skb, 8);
  1251. memmove(skb->data, skb->data + 8, hdr_len);
  1252. hdr = skb->data + hdr_len;
  1253. hdr[0] = pn[5];
  1254. hdr[1] = pn[4];
  1255. hdr[2] = 0;
  1256. hdr[3] = 0x20 | (key_id << 6);
  1257. hdr[4] = pn[3];
  1258. hdr[5] = pn[2];
  1259. hdr[6] = pn[1];
  1260. hdr[7] = pn[0];
  1261. status->flag &= ~RX_FLAG_IV_STRIPPED;
  1262. }
  1263. EXPORT_SYMBOL_GPL(mt76_insert_ccmp_hdr);
  1264. int mt76_get_rate(struct mt76_dev *dev,
  1265. struct ieee80211_supported_band *sband,
  1266. int idx, bool cck)
  1267. {
  1268. int i, offset = 0, len = sband->n_bitrates;
  1269. if (cck) {
  1270. if (sband != &dev->phy.sband_2g.sband)
  1271. return 0;
  1272. idx &= ~BIT(2); /* short preamble */
  1273. } else if (sband == &dev->phy.sband_2g.sband) {
  1274. offset = 4;
  1275. }
  1276. for (i = offset; i < len; i++) {
  1277. if ((sband->bitrates[i].hw_value & GENMASK(7, 0)) == idx)
  1278. return i;
  1279. }
  1280. return 0;
  1281. }
  1282. EXPORT_SYMBOL_GPL(mt76_get_rate);
  1283. void mt76_sw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
  1284. const u8 *mac)
  1285. {
  1286. struct mt76_phy *phy = hw->priv;
  1287. set_bit(MT76_SCANNING, &phy->state);
  1288. }
  1289. EXPORT_SYMBOL_GPL(mt76_sw_scan);
  1290. void mt76_sw_scan_complete(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
  1291. {
  1292. struct mt76_phy *phy = hw->priv;
  1293. clear_bit(MT76_SCANNING, &phy->state);
  1294. }
  1295. EXPORT_SYMBOL_GPL(mt76_sw_scan_complete);
  1296. int mt76_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
  1297. {
  1298. struct mt76_phy *phy = hw->priv;
  1299. struct mt76_dev *dev = phy->dev;
  1300. mutex_lock(&dev->mutex);
  1301. *tx_ant = phy->antenna_mask;
  1302. *rx_ant = phy->antenna_mask;
  1303. mutex_unlock(&dev->mutex);
  1304. return 0;
  1305. }
  1306. EXPORT_SYMBOL_GPL(mt76_get_antenna);
  1307. struct mt76_queue *
  1308. mt76_init_queue(struct mt76_dev *dev, int qid, int idx, int n_desc,
  1309. int ring_base, u32 flags)
  1310. {
  1311. struct mt76_queue *hwq;
  1312. int err;
  1313. hwq = devm_kzalloc(dev->dev, sizeof(*hwq), GFP_KERNEL);
  1314. if (!hwq)
  1315. return ERR_PTR(-ENOMEM);
  1316. hwq->flags = flags;
  1317. err = dev->queue_ops->alloc(dev, hwq, idx, n_desc, 0, ring_base);
  1318. if (err < 0)
  1319. return ERR_PTR(err);
  1320. return hwq;
  1321. }
  1322. EXPORT_SYMBOL_GPL(mt76_init_queue);
  1323. u16 mt76_calculate_default_rate(struct mt76_phy *phy, int rateidx)
  1324. {
  1325. int offset = 0;
  1326. if (phy->chandef.chan->band != NL80211_BAND_2GHZ)
  1327. offset = 4;
  1328. /* pick the lowest rate for hidden nodes */
  1329. if (rateidx < 0)
  1330. rateidx = 0;
  1331. rateidx += offset;
  1332. if (rateidx >= ARRAY_SIZE(mt76_rates))
  1333. rateidx = offset;
  1334. return mt76_rates[rateidx].hw_value;
  1335. }
  1336. EXPORT_SYMBOL_GPL(mt76_calculate_default_rate);
  1337. void mt76_ethtool_worker(struct mt76_ethtool_worker_info *wi,
  1338. struct mt76_sta_stats *stats)
  1339. {
  1340. int i, ei = wi->initial_stat_idx;
  1341. u64 *data = wi->data;
  1342. wi->sta_count++;
  1343. data[ei++] += stats->tx_mode[MT_PHY_TYPE_CCK];
  1344. data[ei++] += stats->tx_mode[MT_PHY_TYPE_OFDM];
  1345. data[ei++] += stats->tx_mode[MT_PHY_TYPE_HT];
  1346. data[ei++] += stats->tx_mode[MT_PHY_TYPE_HT_GF];
  1347. data[ei++] += stats->tx_mode[MT_PHY_TYPE_VHT];
  1348. data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_SU];
  1349. data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_EXT_SU];
  1350. data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_TB];
  1351. data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_MU];
  1352. for (i = 0; i < ARRAY_SIZE(stats->tx_bw); i++)
  1353. data[ei++] += stats->tx_bw[i];
  1354. for (i = 0; i < 12; i++)
  1355. data[ei++] += stats->tx_mcs[i];
  1356. wi->worker_stat_count = ei - wi->initial_stat_idx;
  1357. }
  1358. EXPORT_SYMBOL_GPL(mt76_ethtool_worker);
  1359. enum mt76_dfs_state mt76_phy_dfs_state(struct mt76_phy *phy)
  1360. {
  1361. struct ieee80211_hw *hw = phy->hw;
  1362. struct mt76_dev *dev = phy->dev;
  1363. if (dev->region == NL80211_DFS_UNSET ||
  1364. test_bit(MT76_SCANNING, &phy->state))
  1365. return MT_DFS_STATE_DISABLED;
  1366. if (!hw->conf.radar_enabled) {
  1367. if ((hw->conf.flags & IEEE80211_CONF_MONITOR) &&
  1368. (phy->chandef.chan->flags & IEEE80211_CHAN_RADAR))
  1369. return MT_DFS_STATE_ACTIVE;
  1370. return MT_DFS_STATE_DISABLED;
  1371. }
  1372. if (!cfg80211_reg_can_beacon(hw->wiphy, &phy->chandef, NL80211_IFTYPE_AP))
  1373. return MT_DFS_STATE_CAC;
  1374. return MT_DFS_STATE_ACTIVE;
  1375. }
  1376. EXPORT_SYMBOL_GPL(mt76_phy_dfs_state);