brintos

brintos / linux-shallow public Read only

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