cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mac80211.c (40658B)


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