File Index
Files and directories
Sign in
FILE

main.c

File preview with syntax highlighting.

linux-6.19.14/drivers/net/wireless/mediatek/mt76/mt7915/main.c C
   1// SPDX-License-Identifier: BSD-3-Clause-Clear
   2/* Copyright (C) 2020 MediaTek Inc. */
   3
   4#include <linux/etherdevice.h>
   5#include <linux/platform_device.h>
   6#include <linux/pci.h>
   7#include <linux/module.h>
   8#include "mt7915.h"
   9#include "mcu.h"
  10
  11static bool mt7915_dev_running(struct mt7915_dev *dev)
  12{
  13	struct mt7915_phy *phy;
  14
  15	if (test_bit(MT76_STATE_RUNNING, &dev->mphy.state))
  16		return true;
  17
  18	phy = mt7915_ext_phy(dev);
  19
  20	return phy && test_bit(MT76_STATE_RUNNING, &phy->mt76->state);
  21}
  22
  23int mt7915_run(struct ieee80211_hw *hw)
  24{
  25	struct mt7915_dev *dev = mt7915_hw_dev(hw);
  26	struct mt7915_phy *phy = mt7915_hw_phy(hw);
  27	bool running;
  28	int ret;
  29
  30	running = mt7915_dev_running(dev);
  31
  32	if (!running) {
  33		ret = mt76_connac_mcu_set_pm(&dev->mt76,
  34					     dev->phy.mt76->band_idx, 0);
  35		if (ret)
  36			goto out;
  37
  38		ret = mt7915_mcu_set_mac(dev, dev->phy.mt76->band_idx,
  39					 true, true);
  40		if (ret)
  41			goto out;
  42
  43		mt7915_mac_enable_nf(dev, dev->phy.mt76->band_idx);
  44	}
  45
  46	if (phy != &dev->phy) {
  47		ret = mt76_connac_mcu_set_pm(&dev->mt76,
  48					     phy->mt76->band_idx, 0);
  49		if (ret)
  50			goto out;
  51
  52		ret = mt7915_mcu_set_mac(dev, phy->mt76->band_idx,
  53					 true, true);
  54		if (ret)
  55			goto out;
  56
  57		mt7915_mac_enable_nf(dev, phy->mt76->band_idx);
  58	}
  59
  60	ret = mt7915_mcu_set_thermal_throttling(phy,
  61						MT7915_THERMAL_THROTTLE_MAX);
  62
  63	if (ret)
  64		goto out;
  65
  66	ret = mt7915_mcu_set_thermal_protect(phy);
  67
  68	if (ret)
  69		goto out;
  70
  71	ret = mt76_connac_mcu_set_rts_thresh(&dev->mt76, 0x92b,
  72					     phy->mt76->band_idx);
  73	if (ret)
  74		goto out;
  75
  76	ret = mt7915_mcu_set_sku_en(phy);
  77	if (ret)
  78		goto out;
  79
  80	ret = mt7915_mcu_set_chan_info(phy, MCU_EXT_CMD(SET_RX_PATH));
  81	if (ret)
  82		goto out;
  83
  84	set_bit(MT76_STATE_RUNNING, &phy->mt76->state);
  85
  86	if (!mt76_testmode_enabled(phy->mt76))
  87		ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work,
  88					     MT7915_WATCHDOG_TIME);
  89
  90	if (!running)
  91		mt7915_mac_reset_counters(phy);
  92
  93out:
  94	return ret;
  95}
  96
  97static int mt7915_start(struct ieee80211_hw *hw)
  98{
  99	struct mt7915_dev *dev = mt7915_hw_dev(hw);
 100	int ret;
 101
 102	flush_work(&dev->init_work);
 103
 104	mutex_lock(&dev->mt76.mutex);
 105	ret = mt7915_run(hw);
 106	mutex_unlock(&dev->mt76.mutex);
 107
 108	return ret;
 109}
 110
 111static void mt7915_stop(struct ieee80211_hw *hw, bool suspend)
 112{
 113	struct mt7915_dev *dev = mt7915_hw_dev(hw);
 114	struct mt7915_phy *phy = mt7915_hw_phy(hw);
 115
 116	cancel_delayed_work_sync(&phy->mt76->mac_work);
 117
 118	mutex_lock(&dev->mt76.mutex);
 119
 120	mt76_testmode_reset(phy->mt76, true);
 121
 122	clear_bit(MT76_STATE_RUNNING, &phy->mt76->state);
 123
 124	if (phy != &dev->phy) {
 125		mt76_connac_mcu_set_pm(&dev->mt76, phy->mt76->band_idx, 1);
 126		mt7915_mcu_set_mac(dev, phy->mt76->band_idx, false, false);
 127	}
 128
 129	if (!mt7915_dev_running(dev)) {
 130		mt76_connac_mcu_set_pm(&dev->mt76, dev->phy.mt76->band_idx, 1);
 131		mt7915_mcu_set_mac(dev, dev->phy.mt76->band_idx, false, false);
 132	}
 133
 134	mutex_unlock(&dev->mt76.mutex);
 135}
 136
 137static inline int get_free_idx(u32 mask, u8 start, u8 end)
 138{
 139	return ffs(~mask & GENMASK(end, start));
 140}
 141
 142static int get_omac_idx(enum nl80211_iftype type, u64 mask)
 143{
 144	int i;
 145
 146	switch (type) {
 147	case NL80211_IFTYPE_MESH_POINT:
 148	case NL80211_IFTYPE_ADHOC:
 149	case NL80211_IFTYPE_STATION:
 150		/* prefer hw bssid slot 1-3 */
 151		i = get_free_idx(mask, HW_BSSID_1, HW_BSSID_3);
 152		if (i)
 153			return i - 1;
 154
 155		if (type != NL80211_IFTYPE_STATION)
 156			break;
 157
 158		i = get_free_idx(mask, EXT_BSSID_1, EXT_BSSID_MAX);
 159		if (i)
 160			return i - 1;
 161
 162		if (~mask & BIT(HW_BSSID_0))
 163			return HW_BSSID_0;
 164
 165		break;
 166	case NL80211_IFTYPE_MONITOR:
 167	case NL80211_IFTYPE_AP:
 168		/* ap uses hw bssid 0 and ext bssid */
 169		if (~mask & BIT(HW_BSSID_0))
 170			return HW_BSSID_0;
 171
 172		i = get_free_idx(mask, EXT_BSSID_1, EXT_BSSID_MAX);
 173		if (i)
 174			return i - 1;
 175
 176		break;
 177	default:
 178		WARN_ON(1);
 179		break;
 180	}
 181
 182	return -1;
 183}
 184
 185static void mt7915_init_bitrate_mask(struct ieee80211_vif *vif)
 186{
 187	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
 188	int i;
 189
 190	for (i = 0; i < ARRAY_SIZE(mvif->bitrate_mask.control); i++) {
 191		mvif->bitrate_mask.control[i].gi = NL80211_TXRATE_DEFAULT_GI;
 192		mvif->bitrate_mask.control[i].he_gi = 0xff;
 193		mvif->bitrate_mask.control[i].he_ltf = 0xff;
 194		mvif->bitrate_mask.control[i].legacy = GENMASK(31, 0);
 195		memset(mvif->bitrate_mask.control[i].ht_mcs, 0xff,
 196		       sizeof(mvif->bitrate_mask.control[i].ht_mcs));
 197		memset(mvif->bitrate_mask.control[i].vht_mcs, 0xff,
 198		       sizeof(mvif->bitrate_mask.control[i].vht_mcs));
 199		memset(mvif->bitrate_mask.control[i].he_mcs, 0xff,
 200		       sizeof(mvif->bitrate_mask.control[i].he_mcs));
 201	}
 202}
 203
 204static int mt7915_add_interface(struct ieee80211_hw *hw,
 205				struct ieee80211_vif *vif)
 206{
 207	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
 208	struct mt7915_dev *dev = mt7915_hw_dev(hw);
 209	struct mt7915_phy *phy = mt7915_hw_phy(hw);
 210	struct mt76_txq *mtxq;
 211	bool ext_phy = phy != &dev->phy;
 212	int idx, ret = 0;
 213
 214	mutex_lock(&dev->mt76.mutex);
 215
 216	mt76_testmode_reset(phy->mt76, true);
 217
 218	if (vif->type == NL80211_IFTYPE_MONITOR &&
 219	    is_zero_ether_addr(vif->addr))
 220		phy->monitor_vif = vif;
 221
 222	mvif->mt76.idx = __ffs64(~dev->mt76.vif_mask);
 223	if (mvif->mt76.idx >= (MT7915_MAX_INTERFACES << dev->dbdc_support)) {
 224		ret = -ENOSPC;
 225		goto out;
 226	}
 227
 228	idx = get_omac_idx(vif->type, phy->omac_mask);
 229	if (idx < 0) {
 230		ret = -ENOSPC;
 231		goto out;
 232	}
 233	mvif->mt76.omac_idx = idx;
 234	mvif->phy = phy;
 235	mvif->mt76.band_idx = phy->mt76->band_idx;
 236	mvif->mt76.wcid = &mvif->sta.wcid;
 237
 238	mvif->mt76.wmm_idx = vif->type != NL80211_IFTYPE_AP;
 239	if (ext_phy)
 240		mvif->mt76.wmm_idx += 2;
 241
 242	ret = mt7915_mcu_add_dev_info(phy, vif, true);
 243	if (ret)
 244		goto out;
 245
 246	dev->mt76.vif_mask |= BIT_ULL(mvif->mt76.idx);
 247	phy->omac_mask |= BIT_ULL(mvif->mt76.omac_idx);
 248
 249	idx = mt76_wcid_alloc(dev->mt76.wcid_mask, mt7915_wtbl_size(dev));
 250	if (idx < 0) {
 251		ret = -ENOSPC;
 252		goto out;
 253	}
 254
 255	INIT_LIST_HEAD(&mvif->sta.rc_list);
 256	mvif->sta.wcid.idx = idx;
 257	mvif->sta.wcid.tx_info |= MT_WCID_TX_INFO_SET;
 258	mt76_wcid_init(&mvif->sta.wcid, phy->mt76->band_idx);
 259
 260	mt7915_mac_wtbl_update(dev, idx,
 261			       MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
 262
 263	if (vif->txq) {
 264		mtxq = (struct mt76_txq *)vif->txq->drv_priv;
 265		mtxq->wcid = idx;
 266	}
 267
 268	if (vif->type != NL80211_IFTYPE_AP &&
 269	    (!mvif->mt76.omac_idx || mvif->mt76.omac_idx > 3))
 270		vif->offload_flags = 0;
 271	vif->offload_flags |= IEEE80211_OFFLOAD_ENCAP_4ADDR;
 272
 273	mt7915_init_bitrate_mask(vif);
 274	memset(&mvif->cap, -1, sizeof(mvif->cap));
 275
 276	mt7915_mcu_add_bss_info(phy, vif, true);
 277	mt7915_mcu_add_sta(dev, vif, NULL, CONN_STATE_PORT_SECURE, true);
 278	rcu_assign_pointer(dev->mt76.wcid[idx], &mvif->sta.wcid);
 279
 280out:
 281	mutex_unlock(&dev->mt76.mutex);
 282
 283	return ret;
 284}
 285
 286static void mt7915_remove_interface(struct ieee80211_hw *hw,
 287				    struct ieee80211_vif *vif)
 288{
 289	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
 290	struct mt7915_sta *msta = &mvif->sta;
 291	struct mt7915_dev *dev = mt7915_hw_dev(hw);
 292	struct mt7915_phy *phy = mt7915_hw_phy(hw);
 293	int idx = msta->wcid.idx;
 294
 295	mt7915_mcu_add_bss_info(phy, vif, false);
 296	mt7915_mcu_add_sta(dev, vif, NULL, CONN_STATE_DISCONNECT, false);
 297	mt76_wcid_mask_clear(dev->mt76.wcid_mask, mvif->sta.wcid.idx);
 298
 299	mutex_lock(&dev->mt76.mutex);
 300	mt76_testmode_reset(phy->mt76, true);
 301	mutex_unlock(&dev->mt76.mutex);
 302
 303	if (vif == phy->monitor_vif)
 304		phy->monitor_vif = NULL;
 305
 306	mt7915_mcu_add_dev_info(phy, vif, false);
 307
 308	rcu_assign_pointer(dev->mt76.wcid[idx], NULL);
 309
 310	mutex_lock(&dev->mt76.mutex);
 311	dev->mt76.vif_mask &= ~BIT_ULL(mvif->mt76.idx);
 312	phy->omac_mask &= ~BIT_ULL(mvif->mt76.omac_idx);
 313	mutex_unlock(&dev->mt76.mutex);
 314
 315	spin_lock_bh(&dev->mt76.sta_poll_lock);
 316	if (!list_empty(&msta->wcid.poll_list))
 317		list_del_init(&msta->wcid.poll_list);
 318	spin_unlock_bh(&dev->mt76.sta_poll_lock);
 319
 320	mt76_wcid_cleanup(&dev->mt76, &msta->wcid);
 321}
 322
 323int mt7915_set_channel(struct mt76_phy *mphy)
 324{
 325	struct mt7915_phy *phy = mphy->priv;
 326	struct mt7915_dev *dev = phy->dev;
 327	int ret;
 328
 329	if (dev->cal) {
 330		ret = mt7915_mcu_apply_tx_dpd(phy);
 331		if (ret)
 332			goto out;
 333	}
 334
 335	ret = mt7915_mcu_set_chan_info(phy, MCU_EXT_CMD(CHANNEL_SWITCH));
 336	if (ret)
 337		goto out;
 338
 339	mt7915_mac_set_timing(phy);
 340	ret = mt7915_dfs_init_radar_detector(phy);
 341	mt7915_mac_cca_stats_reset(phy);
 342
 343	mt7915_mac_reset_counters(phy);
 344	phy->noise = 0;
 345
 346out:
 347	if (!mt76_testmode_enabled(phy->mt76))
 348		ieee80211_queue_delayed_work(phy->mt76->hw,
 349					     &phy->mt76->mac_work,
 350					     MT7915_WATCHDOG_TIME);
 351
 352	return ret;
 353}
 354
 355static int mt7915_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
 356			  struct ieee80211_vif *vif, struct ieee80211_sta *sta,
 357			  struct ieee80211_key_conf *key)
 358{
 359	struct mt7915_dev *dev = mt7915_hw_dev(hw);
 360	struct mt7915_phy *phy = mt7915_hw_phy(hw);
 361	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
 362	struct mt7915_sta *msta = sta ? (struct mt7915_sta *)sta->drv_priv :
 363				  &mvif->sta;
 364	struct mt76_wcid *wcid = &msta->wcid;
 365	u8 *wcid_keyidx = &wcid->hw_key_idx;
 366	int idx = key->keyidx;
 367	int err = 0;
 368
 369	if (sta && !wcid->sta) {
 370		if (cmd != SET_KEY)
 371			return 0;
 372
 373		return -EOPNOTSUPP;
 374	}
 375
 376	/* The hardware does not support per-STA RX GTK, fallback
 377	 * to software mode for these.
 378	 */
 379	if ((vif->type == NL80211_IFTYPE_ADHOC ||
 380	     vif->type == NL80211_IFTYPE_MESH_POINT) &&
 381	    (key->cipher == WLAN_CIPHER_SUITE_TKIP ||
 382	     key->cipher == WLAN_CIPHER_SUITE_CCMP) &&
 383	    !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE))
 384		return -EOPNOTSUPP;
 385
 386	/* fall back to sw encryption for unsupported ciphers */
 387	switch (key->cipher) {
 388	case WLAN_CIPHER_SUITE_AES_CMAC:
 389		wcid_keyidx = &wcid->hw_key_idx2;
 390		key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIE;
 391		break;
 392	case WLAN_CIPHER_SUITE_TKIP:
 393	case WLAN_CIPHER_SUITE_CCMP:
 394	case WLAN_CIPHER_SUITE_CCMP_256:
 395	case WLAN_CIPHER_SUITE_GCMP:
 396	case WLAN_CIPHER_SUITE_GCMP_256:
 397	case WLAN_CIPHER_SUITE_SMS4:
 398		break;
 399	case WLAN_CIPHER_SUITE_WEP40:
 400	case WLAN_CIPHER_SUITE_WEP104:
 401	default:
 402		return -EOPNOTSUPP;
 403	}
 404
 405	mutex_lock(&dev->mt76.mutex);
 406
 407	if (cmd == SET_KEY && !sta && !mvif->mt76.cipher) {
 408		mvif->mt76.cipher = mt76_connac_mcu_get_cipher(key->cipher);
 409		mt7915_mcu_add_bss_info(phy, vif, true);
 410	}
 411
 412	if (cmd == SET_KEY) {
 413		*wcid_keyidx = idx;
 414	} else {
 415		if (idx == *wcid_keyidx)
 416			*wcid_keyidx = -1;
 417		goto out;
 418	}
 419
 420	mt76_wcid_key_setup(&dev->mt76, wcid, key);
 421	err = mt76_connac_mcu_add_key(&dev->mt76, vif, &msta->bip,
 422				      key, MCU_EXT_CMD(STA_REC_UPDATE),
 423				      &msta->wcid, cmd);
 424out:
 425	mutex_unlock(&dev->mt76.mutex);
 426
 427	return err;
 428}
 429
 430static int mt7915_set_sar_specs(struct ieee80211_hw *hw,
 431				const struct cfg80211_sar_specs *sar)
 432{
 433	struct mt7915_phy *phy = mt7915_hw_phy(hw);
 434	struct mt7915_dev *dev = mt7915_hw_dev(hw);
 435	int err = -EINVAL;
 436
 437	mutex_lock(&dev->mt76.mutex);
 438	if (!cfg80211_chandef_valid(&phy->mt76->chandef))
 439		goto out;
 440
 441	err = mt76_init_sar_power(hw, sar);
 442	if (err)
 443		goto out;
 444
 445	err = mt7915_mcu_set_txpower_sku(phy);
 446out:
 447	mutex_unlock(&dev->mt76.mutex);
 448
 449	return err;
 450}
 451
 452static int mt7915_config(struct ieee80211_hw *hw, int radio_idx,
 453			 u32 changed)
 454{
 455	struct mt7915_dev *dev = mt7915_hw_dev(hw);
 456	struct mt7915_phy *phy = mt7915_hw_phy(hw);
 457	int ret;
 458
 459	if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
 460#ifdef CONFIG_NL80211_TESTMODE
 461		if (phy->mt76->test.state != MT76_TM_STATE_OFF) {
 462			mutex_lock(&dev->mt76.mutex);
 463			mt76_testmode_reset(phy->mt76, false);
 464			mutex_unlock(&dev->mt76.mutex);
 465		}
 466#endif
 467		ret = mt76_update_channel(phy->mt76);
 468		if (ret)
 469			return ret;
 470	}
 471
 472	if (changed & (IEEE80211_CONF_CHANGE_POWER |
 473		       IEEE80211_CONF_CHANGE_CHANNEL)) {
 474		ret = mt7915_mcu_set_txpower_sku(phy);
 475		if (ret)
 476			return ret;
 477	}
 478
 479	mutex_lock(&dev->mt76.mutex);
 480
 481	if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
 482		bool enabled = !!(hw->conf.flags & IEEE80211_CONF_MONITOR);
 483		bool band = phy->mt76->band_idx;
 484		u32 rxfilter = phy->rxfilter;
 485
 486		if (!enabled) {
 487			rxfilter |= MT_WF_RFCR_DROP_OTHER_UC;
 488			dev->monitor_mask &= ~BIT(band);
 489		} else {
 490			rxfilter &= ~MT_WF_RFCR_DROP_OTHER_UC;
 491			dev->monitor_mask |= BIT(band);
 492		}
 493
 494		mt76_rmw_field(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_RXD_G5_EN,
 495			       enabled);
 496		mt76_rmw_field(dev, MT_DMA_DCR0(band), MT_MDP_DCR0_RX_HDR_TRANS_EN,
 497			       !dev->monitor_mask);
 498		mt76_testmode_reset(phy->mt76, true);
 499		mt76_wr(dev, MT_WF_RFCR(band), rxfilter);
 500	}
 501
 502	mutex_unlock(&dev->mt76.mutex);
 503
 504	return 0;
 505}
 506
 507static int
 508mt7915_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 509	       unsigned int link_id, u16 queue,
 510	       const struct ieee80211_tx_queue_params *params)
 511{
 512	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
 513
 514	/* no need to update right away, we'll get BSS_CHANGED_QOS */
 515	queue = mt76_connac_lmac_mapping(queue);
 516	mvif->queue_params[queue] = *params;
 517
 518	return 0;
 519}
 520
 521static void mt7915_configure_filter(struct ieee80211_hw *hw,
 522				    unsigned int changed_flags,
 523				    unsigned int *total_flags,
 524				    u64 multicast)
 525{
 526	struct mt7915_dev *dev = mt7915_hw_dev(hw);
 527	struct mt7915_phy *phy = mt7915_hw_phy(hw);
 528	bool band = phy->mt76->band_idx;
 529	u32 ctl_flags = MT_WF_RFCR1_DROP_ACK |
 530			MT_WF_RFCR1_DROP_BF_POLL |
 531			MT_WF_RFCR1_DROP_BA |
 532			MT_WF_RFCR1_DROP_CFEND |
 533			MT_WF_RFCR1_DROP_CFACK;
 534	u32 rxfilter;
 535	u32 flags = 0;
 536
 537#define MT76_FILTER(_flag, _hw) do {					\
 538		flags |= *total_flags & FIF_##_flag;			\
 539		phy->rxfilter &= ~(_hw);				\
 540		phy->rxfilter |= !(flags & FIF_##_flag) * (_hw);	\
 541	} while (0)
 542
 543	mutex_lock(&dev->mt76.mutex);
 544
 545	phy->rxfilter &= ~(MT_WF_RFCR_DROP_OTHER_BSS |
 546			   MT_WF_RFCR_DROP_OTHER_BEACON |
 547			   MT_WF_RFCR_DROP_FRAME_REPORT |
 548			   MT_WF_RFCR_DROP_PROBEREQ |
 549			   MT_WF_RFCR_DROP_MCAST_FILTERED |
 550			   MT_WF_RFCR_DROP_MCAST |
 551			   MT_WF_RFCR_DROP_BCAST |
 552			   MT_WF_RFCR_DROP_DUPLICATE |
 553			   MT_WF_RFCR_DROP_A2_BSSID |
 554			   MT_WF_RFCR_DROP_UNWANTED_CTL |
 555			   MT_WF_RFCR_DROP_STBC_MULTI);
 556
 557	MT76_FILTER(OTHER_BSS, MT_WF_RFCR_DROP_OTHER_TIM |
 558			       MT_WF_RFCR_DROP_A3_MAC |
 559			       MT_WF_RFCR_DROP_A3_BSSID);
 560
 561	MT76_FILTER(FCSFAIL, MT_WF_RFCR_DROP_FCSFAIL);
 562
 563	MT76_FILTER(CONTROL, MT_WF_RFCR_DROP_CTS |
 564			     MT_WF_RFCR_DROP_RTS |
 565			     MT_WF_RFCR_DROP_CTL_RSV);
 566
 567	*total_flags = flags;
 568	rxfilter = phy->rxfilter;
 569	if (hw->conf.flags & IEEE80211_CONF_MONITOR)
 570		rxfilter &= ~MT_WF_RFCR_DROP_OTHER_UC;
 571	else
 572		rxfilter |= MT_WF_RFCR_DROP_OTHER_UC;
 573	mt76_wr(dev, MT_WF_RFCR(band), rxfilter);
 574
 575	if (*total_flags & FIF_CONTROL)
 576		mt76_clear(dev, MT_WF_RFCR1(band), ctl_flags);
 577	else
 578		mt76_set(dev, MT_WF_RFCR1(band), ctl_flags);
 579
 580	mutex_unlock(&dev->mt76.mutex);
 581}
 582
 583static void
 584mt7915_update_bss_color(struct ieee80211_hw *hw,
 585			struct ieee80211_vif *vif,
 586			struct cfg80211_he_bss_color *bss_color)
 587{
 588	struct mt7915_dev *dev = mt7915_hw_dev(hw);
 589
 590	switch (vif->type) {
 591	case NL80211_IFTYPE_AP: {
 592		struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
 593
 594		if (mvif->mt76.omac_idx > HW_BSSID_MAX)
 595			return;
 596		fallthrough;
 597	}
 598	case NL80211_IFTYPE_STATION:
 599		mt7915_mcu_update_bss_color(dev, vif, bss_color);
 600		break;
 601	default:
 602		break;
 603	}
 604}
 605
 606static void mt7915_bss_info_changed(struct ieee80211_hw *hw,
 607				    struct ieee80211_vif *vif,
 608				    struct ieee80211_bss_conf *info,
 609				    u64 changed)
 610{
 611	struct mt7915_phy *phy = mt7915_hw_phy(hw);
 612	struct mt7915_dev *dev = mt7915_hw_dev(hw);
 613	int set_bss_info = -1, set_sta = -1;
 614
 615	mutex_lock(&dev->mt76.mutex);
 616
 617	/*
 618	 * station mode uses BSSID to map the wlan entry to a peer,
 619	 * and then peer references bss_info_rfch to set bandwidth cap.
 620	 */
 621	if (changed & BSS_CHANGED_BSSID &&
 622	    vif->type == NL80211_IFTYPE_STATION)
 623		set_bss_info = set_sta = !is_zero_ether_addr(info->bssid);
 624	if (changed & BSS_CHANGED_ASSOC)
 625		set_bss_info = vif->cfg.assoc;
 626	if (changed & BSS_CHANGED_BEACON_ENABLED &&
 627	    info->enable_beacon &&
 628	    vif->type != NL80211_IFTYPE_AP)
 629		set_bss_info = set_sta = 1;
 630
 631	if (set_bss_info == 1)
 632		mt7915_mcu_add_bss_info(phy, vif, true);
 633	if (set_sta == 1)
 634		mt7915_mcu_add_sta(dev, vif, NULL, CONN_STATE_PORT_SECURE, false);
 635
 636	if (changed & BSS_CHANGED_ERP_CTS_PROT)
 637		mt7915_mac_enable_rtscts(dev, vif, info->use_cts_prot);
 638
 639	if (changed & BSS_CHANGED_ERP_SLOT) {
 640		int slottime = 9;
 641
 642		if (phy->mt76->chandef.chan->band == NL80211_BAND_2GHZ &&
 643		    !info->use_short_slot)
 644			slottime = 20;
 645
 646		if (slottime != phy->slottime) {
 647			phy->slottime = slottime;
 648			mt7915_mac_set_timing(phy);
 649		}
 650	}
 651
 652	/* ensure that enable txcmd_mode after bss_info */
 653	if (changed & (BSS_CHANGED_QOS | BSS_CHANGED_BEACON_ENABLED))
 654		mt7915_mcu_set_tx(dev, vif);
 655
 656	if (changed & BSS_CHANGED_HE_OBSS_PD)
 657		mt7915_mcu_add_obss_spr(phy, vif, &info->he_obss_pd);
 658
 659	if (changed & BSS_CHANGED_HE_BSS_COLOR)
 660		mt7915_update_bss_color(hw, vif, &info->he_bss_color);
 661
 662	if (changed & (BSS_CHANGED_BEACON |
 663		       BSS_CHANGED_BEACON_ENABLED))
 664		mt7915_mcu_add_beacon(hw, vif, info->enable_beacon, changed);
 665
 666	if (changed & (BSS_CHANGED_UNSOL_BCAST_PROBE_RESP |
 667		       BSS_CHANGED_FILS_DISCOVERY))
 668		mt7915_mcu_add_inband_discov(dev, vif, changed);
 669
 670	if (set_bss_info == 0)
 671		mt7915_mcu_add_bss_info(phy, vif, false);
 672	if (set_sta == 0)
 673		mt7915_mcu_add_sta(dev, vif, NULL, CONN_STATE_DISCONNECT, false);
 674
 675	mutex_unlock(&dev->mt76.mutex);
 676}
 677
 678static void
 679mt7915_vif_check_caps(struct mt7915_phy *phy, struct ieee80211_vif *vif)
 680{
 681	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
 682	struct mt7915_vif_cap *vc = &mvif->cap;
 683
 684	vc->ht_ldpc = vif->bss_conf.ht_ldpc;
 685	vc->vht_ldpc = vif->bss_conf.vht_ldpc;
 686	vc->vht_su_ebfer = vif->bss_conf.vht_su_beamformer;
 687	vc->vht_su_ebfee = vif->bss_conf.vht_su_beamformee;
 688	vc->vht_mu_ebfer = vif->bss_conf.vht_mu_beamformer;
 689	vc->vht_mu_ebfee = vif->bss_conf.vht_mu_beamformee;
 690	vc->he_ldpc = vif->bss_conf.he_ldpc;
 691	vc->he_su_ebfer = vif->bss_conf.he_su_beamformer;
 692	vc->he_su_ebfee = vif->bss_conf.he_su_beamformee;
 693	vc->he_mu_ebfer = vif->bss_conf.he_mu_beamformer;
 694}
 695
 696static int
 697mt7915_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 698		struct ieee80211_bss_conf *link_conf)
 699{
 700	struct mt7915_phy *phy = mt7915_hw_phy(hw);
 701	struct mt7915_dev *dev = mt7915_hw_dev(hw);
 702	int err;
 703
 704	mutex_lock(&dev->mt76.mutex);
 705
 706	mt7915_vif_check_caps(phy, vif);
 707
 708	err = mt7915_mcu_add_bss_info(phy, vif, true);
 709	if (err)
 710		goto out;
 711	err = mt7915_mcu_add_sta(dev, vif, NULL, CONN_STATE_PORT_SECURE, false);
 712out:
 713	mutex_unlock(&dev->mt76.mutex);
 714
 715	return err;
 716}
 717
 718static void
 719mt7915_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 720	       struct ieee80211_bss_conf *link_conf)
 721{
 722	struct mt7915_dev *dev = mt7915_hw_dev(hw);
 723
 724	mutex_lock(&dev->mt76.mutex);
 725	mt7915_mcu_add_sta(dev, vif, NULL, CONN_STATE_DISCONNECT, false);
 726	mutex_unlock(&dev->mt76.mutex);
 727}
 728
 729static void
 730mt7915_channel_switch_beacon(struct ieee80211_hw *hw,
 731			     struct ieee80211_vif *vif,
 732			     struct cfg80211_chan_def *chandef)
 733{
 734	struct mt7915_dev *dev = mt7915_hw_dev(hw);
 735
 736	mutex_lock(&dev->mt76.mutex);
 737	mt7915_mcu_add_beacon(hw, vif, true, BSS_CHANGED_BEACON);
 738	mutex_unlock(&dev->mt76.mutex);
 739}
 740
 741int mt7915_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
 742		       struct ieee80211_sta *sta)
 743{
 744	struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
 745	struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
 746	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
 747	bool ext_phy = mvif->phy != &dev->phy;
 748	int idx;
 749
 750	idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7915_WTBL_STA);
 751	if (idx < 0)
 752		return -ENOSPC;
 753
 754	INIT_LIST_HEAD(&msta->rc_list);
 755	INIT_LIST_HEAD(&msta->wcid.poll_list);
 756	msta->vif = mvif;
 757	msta->wcid.sta_disabled = 1;
 758	msta->wcid.idx = idx;
 759	msta->wcid.phy_idx = ext_phy;
 760	msta->jiffies = jiffies;
 761
 762	ewma_avg_signal_init(&msta->avg_ack_signal);
 763
 764	mt7915_mac_wtbl_update(dev, idx,
 765			       MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
 766	mt7915_mcu_add_sta(dev, vif, sta, CONN_STATE_DISCONNECT, true);
 767
 768	return 0;
 769}
 770
 771struct drop_sta_iter {
 772	struct mt7915_dev *dev;
 773	struct ieee80211_hw *hw;
 774	struct ieee80211_vif *vif;
 775	u8 sta_addr[ETH_ALEN];
 776};
 777
 778static void
 779__mt7915_drop_sta(void *ptr, u8 *mac, struct ieee80211_vif *vif)
 780{
 781	struct drop_sta_iter *data = ptr;
 782	struct ieee80211_sta *sta;
 783	struct mt7915_sta *msta;
 784
 785	if (vif == data->vif || vif->type != NL80211_IFTYPE_AP)
 786		return;
 787
 788	sta = ieee80211_find_sta_by_ifaddr(data->hw, data->sta_addr, mac);
 789	if (!sta)
 790		return;
 791
 792	msta = (struct mt7915_sta *)sta->drv_priv;
 793	mt7915_mcu_add_sta(data->dev, vif, sta, CONN_STATE_DISCONNECT, false);
 794	msta->wcid.sta_disabled = 1;
 795	msta->wcid.sta = 0;
 796}
 797
 798static void
 799mt7915_drop_other_sta(struct mt7915_dev *dev, struct ieee80211_vif *vif,
 800		      struct ieee80211_sta *sta)
 801{
 802	struct mt76_phy *ext_phy = dev->mt76.phys[MT_BAND1];
 803	struct drop_sta_iter data = {
 804		.dev = dev,
 805		.hw = dev->mphy.hw,
 806		.vif = vif,
 807	};
 808
 809	if (vif->type != NL80211_IFTYPE_AP)
 810		return;
 811
 812	memcpy(data.sta_addr, sta->addr, ETH_ALEN);
 813	ieee80211_iterate_active_interfaces(data.hw, 0, __mt7915_drop_sta, &data);
 814
 815	if (!ext_phy)
 816		return;
 817
 818	data.hw = ext_phy->hw;
 819	ieee80211_iterate_active_interfaces(data.hw, 0, __mt7915_drop_sta, &data);
 820}
 821
 822int mt7915_mac_sta_event(struct mt76_dev *mdev, struct ieee80211_vif *vif,
 823			 struct ieee80211_sta *sta, enum mt76_sta_event ev)
 824{
 825	struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
 826	struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
 827	int i, ret;
 828	u32 addr;
 829
 830	switch (ev) {
 831	case MT76_STA_EVENT_ASSOC:
 832		ret = mt7915_mcu_add_sta(dev, vif, sta, CONN_STATE_CONNECT, true);
 833		if (ret)
 834			return ret;
 835
 836		addr = mt7915_mac_wtbl_lmac_addr(dev, msta->wcid.idx, 30);
 837		mt76_rmw_field(dev, addr, GENMASK(7, 0), 0xa0);
 838
 839		ret = mt7915_mcu_add_rate_ctrl(dev, vif, sta, false);
 840		if (ret)
 841			return ret;
 842
 843		msta->wcid.tx_info |= MT_WCID_TX_INFO_SET;
 844		msta->wcid.sta = 1;
 845		msta->wcid.sta_disabled = 0;
 846
 847		return 0;
 848
 849	case MT76_STA_EVENT_AUTHORIZE:
 850		mt7915_drop_other_sta(dev, vif, sta);
 851		return mt7915_mcu_add_sta(dev, vif, sta, CONN_STATE_PORT_SECURE, false);
 852
 853	case MT76_STA_EVENT_DISASSOC:
 854		for (i = 0; i < ARRAY_SIZE(msta->twt.flow); i++)
 855			mt7915_mac_twt_teardown_flow(dev, msta, i);
 856
 857		mt7915_mcu_add_sta(dev, vif, sta, CONN_STATE_DISCONNECT, false);
 858		msta->wcid.sta_disabled = 1;
 859		msta->wcid.sta = 0;
 860		return 0;
 861	}
 862
 863	return 0;
 864}
 865
 866void mt7915_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
 867			   struct ieee80211_sta *sta)
 868{
 869	struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
 870	struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
 871
 872	mt7915_mac_wtbl_update(dev, msta->wcid.idx,
 873			       MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
 874
 875	spin_lock_bh(&mdev->sta_poll_lock);
 876	if (!list_empty(&msta->wcid.poll_list))
 877		list_del_init(&msta->wcid.poll_list);
 878	if (!list_empty(&msta->rc_list))
 879		list_del_init(&msta->rc_list);
 880	spin_unlock_bh(&mdev->sta_poll_lock);
 881}
 882
 883static void mt7915_tx(struct ieee80211_hw *hw,
 884		      struct ieee80211_tx_control *control,
 885		      struct sk_buff *skb)
 886{
 887	struct mt7915_dev *dev = mt7915_hw_dev(hw);
 888	struct mt76_phy *mphy = hw->priv;
 889	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 890	struct ieee80211_vif *vif = info->control.vif;
 891	struct mt76_wcid *wcid = &dev->mt76.global_wcid;
 892
 893	if (control->sta) {
 894		struct mt7915_sta *sta;
 895
 896		sta = (struct mt7915_sta *)control->sta->drv_priv;
 897		wcid = &sta->wcid;
 898	}
 899
 900	if (vif && !control->sta) {
 901		struct mt7915_vif *mvif;
 902
 903		mvif = (struct mt7915_vif *)vif->drv_priv;
 904		wcid = &mvif->sta.wcid;
 905	}
 906
 907	mt76_tx(mphy, control->sta, wcid, skb);
 908}
 909
 910static int mt7915_set_rts_threshold(struct ieee80211_hw *hw, int radio_idx,
 911				    u32 val)
 912{
 913	struct mt7915_dev *dev = mt7915_hw_dev(hw);
 914	struct mt7915_phy *phy = mt7915_hw_phy(hw);
 915	int ret;
 916
 917	mutex_lock(&dev->mt76.mutex);
 918	ret = mt76_connac_mcu_set_rts_thresh(&dev->mt76, val,
 919					     phy->mt76->band_idx);
 920	mutex_unlock(&dev->mt76.mutex);
 921
 922	return ret;
 923}
 924
 925static int
 926mt7915_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 927		    struct ieee80211_ampdu_params *params)
 928{
 929	enum ieee80211_ampdu_mlme_action action = params->action;
 930	struct mt7915_dev *dev = mt7915_hw_dev(hw);
 931	struct ieee80211_sta *sta = params->sta;
 932	struct ieee80211_txq *txq = sta->txq[params->tid];
 933	struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
 934	u16 tid = params->tid;
 935	u16 ssn = params->ssn;
 936	struct mt76_txq *mtxq;
 937	int ret = 0;
 938
 939	if (!txq)
 940		return -EINVAL;
 941
 942	mtxq = (struct mt76_txq *)txq->drv_priv;
 943
 944	mutex_lock(&dev->mt76.mutex);
 945	switch (action) {
 946	case IEEE80211_AMPDU_RX_START:
 947		mt76_rx_aggr_start(&dev->mt76, &msta->wcid, tid, ssn,
 948				   params->buf_size);
 949		ret = mt7915_mcu_add_rx_ba(dev, params, true);
 950		break;
 951	case IEEE80211_AMPDU_RX_STOP:
 952		mt76_rx_aggr_stop(&dev->mt76, &msta->wcid, tid);
 953		ret = mt7915_mcu_add_rx_ba(dev, params, false);
 954		break;
 955	case IEEE80211_AMPDU_TX_OPERATIONAL:
 956		mtxq->aggr = true;
 957		mtxq->send_bar = false;
 958		ret = mt7915_mcu_add_tx_ba(dev, params, true);
 959		break;
 960	case IEEE80211_AMPDU_TX_STOP_FLUSH:
 961	case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
 962		mtxq->aggr = false;
 963		clear_bit(tid, &msta->wcid.ampdu_state);
 964		ret = mt7915_mcu_add_tx_ba(dev, params, false);
 965		break;
 966	case IEEE80211_AMPDU_TX_START:
 967		set_bit(tid, &msta->wcid.ampdu_state);
 968		ret = IEEE80211_AMPDU_TX_START_IMMEDIATE;
 969		break;
 970	case IEEE80211_AMPDU_TX_STOP_CONT:
 971		mtxq->aggr = false;
 972		clear_bit(tid, &msta->wcid.ampdu_state);
 973		ret = mt7915_mcu_add_tx_ba(dev, params, false);
 974		ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
 975		break;
 976	}
 977	mutex_unlock(&dev->mt76.mutex);
 978
 979	return ret;
 980}
 981
 982static int
 983mt7915_get_stats(struct ieee80211_hw *hw,
 984		 struct ieee80211_low_level_stats *stats)
 985{
 986	struct mt7915_phy *phy = mt7915_hw_phy(hw);
 987	struct mt7915_dev *dev = mt7915_hw_dev(hw);
 988	struct mt76_mib_stats *mib = &phy->mib;
 989
 990	mutex_lock(&dev->mt76.mutex);
 991
 992	stats->dot11RTSSuccessCount = mib->rts_cnt;
 993	stats->dot11RTSFailureCount = mib->rts_retries_cnt;
 994	stats->dot11FCSErrorCount = mib->fcs_err_cnt;
 995	stats->dot11ACKFailureCount = mib->ack_fail_cnt;
 996
 997	mutex_unlock(&dev->mt76.mutex);
 998
 999	return 0;
1000}
1001
1002u64 __mt7915_get_tsf(struct ieee80211_hw *hw, struct mt7915_vif *mvif)
1003{
1004	struct mt7915_dev *dev = mt7915_hw_dev(hw);
1005	struct mt7915_phy *phy = mt7915_hw_phy(hw);
1006	bool band = phy->mt76->band_idx;
1007	union {
1008		u64 t64;
1009		u32 t32[2];
1010	} tsf;
1011	u16 n;
1012
1013	lockdep_assert_held(&dev->mt76.mutex);
1014
1015	n = mvif->mt76.omac_idx > HW_BSSID_MAX ? HW_BSSID_0
1016					       : mvif->mt76.omac_idx;
1017	/* TSF software read */
1018	if (is_mt7915(&dev->mt76))
1019		mt76_rmw(dev, MT_LPON_TCR(band, n), MT_LPON_TCR_SW_MODE,
1020			 MT_LPON_TCR_SW_READ);
1021	else
1022		mt76_rmw(dev, MT_LPON_TCR_MT7916(band, n), MT_LPON_TCR_SW_MODE,
1023			 MT_LPON_TCR_SW_READ);
1024	tsf.t32[0] = mt76_rr(dev, MT_LPON_UTTR0(band));
1025	tsf.t32[1] = mt76_rr(dev, MT_LPON_UTTR1(band));
1026
1027	return tsf.t64;
1028}
1029
1030static u64
1031mt7915_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
1032{
1033	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1034	struct mt7915_dev *dev = mt7915_hw_dev(hw);
1035	u64 ret;
1036
1037	mutex_lock(&dev->mt76.mutex);
1038	ret = __mt7915_get_tsf(hw, mvif);
1039	mutex_unlock(&dev->mt76.mutex);
1040
1041	return ret;
1042}
1043
1044static void
1045mt7915_set_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1046	       u64 timestamp)
1047{
1048	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1049	struct mt7915_dev *dev = mt7915_hw_dev(hw);
1050	struct mt7915_phy *phy = mt7915_hw_phy(hw);
1051	bool band = phy->mt76->band_idx;
1052	union {
1053		u64 t64;
1054		u32 t32[2];
1055	} tsf = { .t64 = timestamp, };
1056	u16 n;
1057
1058	mutex_lock(&dev->mt76.mutex);
1059
1060	n = mvif->mt76.omac_idx > HW_BSSID_MAX ? HW_BSSID_0
1061					       : mvif->mt76.omac_idx;
1062	mt76_wr(dev, MT_LPON_UTTR0(band), tsf.t32[0]);
1063	mt76_wr(dev, MT_LPON_UTTR1(band), tsf.t32[1]);
1064	/* TSF software overwrite */
1065	if (is_mt7915(&dev->mt76))
1066		mt76_rmw(dev, MT_LPON_TCR(band, n), MT_LPON_TCR_SW_MODE,
1067			 MT_LPON_TCR_SW_WRITE);
1068	else
1069		mt76_rmw(dev, MT_LPON_TCR_MT7916(band, n), MT_LPON_TCR_SW_MODE,
1070			 MT_LPON_TCR_SW_WRITE);
1071
1072	mutex_unlock(&dev->mt76.mutex);
1073}
1074
1075static void
1076mt7915_offset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1077		  s64 timestamp)
1078{
1079	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1080	struct mt7915_dev *dev = mt7915_hw_dev(hw);
1081	struct mt7915_phy *phy = mt7915_hw_phy(hw);
1082	bool band = phy->mt76->band_idx;
1083	union {
1084		u64 t64;
1085		u32 t32[2];
1086	} tsf = { .t64 = timestamp, };
1087	u16 n;
1088
1089	mutex_lock(&dev->mt76.mutex);
1090
1091	n = mvif->mt76.omac_idx > HW_BSSID_MAX ? HW_BSSID_0
1092					       : mvif->mt76.omac_idx;
1093	mt76_wr(dev, MT_LPON_UTTR0(band), tsf.t32[0]);
1094	mt76_wr(dev, MT_LPON_UTTR1(band), tsf.t32[1]);
1095	/* TSF software adjust*/
1096	if (is_mt7915(&dev->mt76))
1097		mt76_rmw(dev, MT_LPON_TCR(band, n), MT_LPON_TCR_SW_MODE,
1098			 MT_LPON_TCR_SW_ADJUST);
1099	else
1100		mt76_rmw(dev, MT_LPON_TCR_MT7916(band, n), MT_LPON_TCR_SW_MODE,
1101			 MT_LPON_TCR_SW_ADJUST);
1102
1103	mutex_unlock(&dev->mt76.mutex);
1104}
1105
1106static void
1107mt7915_set_coverage_class(struct ieee80211_hw *hw, int radio_idx,
1108			  s16 coverage_class)
1109{
1110	struct mt7915_phy *phy = mt7915_hw_phy(hw);
1111	struct mt7915_dev *dev = phy->dev;
1112
1113	mutex_lock(&dev->mt76.mutex);
1114	phy->coverage_class = max_t(s16, coverage_class, 0);
1115	mt7915_mac_set_timing(phy);
1116	mutex_unlock(&dev->mt76.mutex);
1117}
1118
1119static int
1120mt7915_set_antenna(struct ieee80211_hw *hw, int radio_idx, u32 tx_ant, u32 rx_ant)
1121{
1122	struct mt7915_dev *dev = mt7915_hw_dev(hw);
1123	struct mt7915_phy *phy = mt7915_hw_phy(hw);
1124	int max_nss = hweight8(hw->wiphy->available_antennas_tx);
1125	u8 chainshift = dev->chainshift;
1126	u8 band = phy->mt76->band_idx;
1127
1128	if (!tx_ant || tx_ant != rx_ant || ffs(tx_ant) > max_nss)
1129		return -EINVAL;
1130
1131	mutex_lock(&dev->mt76.mutex);
1132
1133	phy->mt76->antenna_mask = tx_ant;
1134
1135	/* handle a variant of mt7916/mt7981 which has 3T3R but nss2 on 5 GHz band */
1136	if ((is_mt7916(&dev->mt76) || is_mt7981(&dev->mt76)) &&
1137	    band && hweight8(tx_ant) == max_nss)
1138		phy->mt76->chainmask = (dev->chainmask >> chainshift) << chainshift;
1139	else
1140		phy->mt76->chainmask = tx_ant << (chainshift * band);
1141
1142	mt76_set_stream_caps(phy->mt76, true);
1143	mt7915_set_stream_vht_txbf_caps(phy);
1144	mt7915_set_stream_he_caps(phy);
1145
1146	mutex_unlock(&dev->mt76.mutex);
1147
1148	return 0;
1149}
1150
1151static void mt7915_sta_statistics(struct ieee80211_hw *hw,
1152				  struct ieee80211_vif *vif,
1153				  struct ieee80211_sta *sta,
1154				  struct station_info *sinfo)
1155{
1156	struct mt7915_phy *phy = mt7915_hw_phy(hw);
1157	struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1158	struct rate_info *txrate = &msta->wcid.rate;
1159	struct rate_info rxrate = {};
1160
1161	if (!mt7915_mcu_get_rx_rate(phy, vif, sta, &rxrate)) {
1162		sinfo->rxrate = rxrate;
1163		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE);
1164	}
1165
1166	if (txrate->legacy || txrate->flags) {
1167		if (txrate->legacy) {
1168			sinfo->txrate.legacy = txrate->legacy;
1169		} else {
1170			sinfo->txrate.mcs = txrate->mcs;
1171			sinfo->txrate.nss = txrate->nss;
1172			sinfo->txrate.bw = txrate->bw;
1173			sinfo->txrate.he_gi = txrate->he_gi;
1174			sinfo->txrate.he_dcm = txrate->he_dcm;
1175			sinfo->txrate.he_ru_alloc = txrate->he_ru_alloc;
1176		}
1177		sinfo->txrate.flags = txrate->flags;
1178		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
1179	}
1180
1181	/* offloading flows bypass networking stack, so driver counts and
1182	 * reports sta statistics via NL80211_STA_INFO when WED is active.
1183	 */
1184	if (mtk_wed_device_active(&phy->dev->mt76.mmio.wed)) {
1185		sinfo->tx_bytes = msta->wcid.stats.tx_bytes;
1186		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES64);
1187
1188		if (!mt7915_mcu_wed_wa_tx_stats(phy->dev, msta->wcid.idx)) {
1189			sinfo->tx_packets = msta->wcid.stats.tx_packets;
1190			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS);
1191		}
1192
1193		if (mtk_wed_get_rx_capa(&phy->dev->mt76.mmio.wed)) {
1194			sinfo->rx_bytes = msta->wcid.stats.rx_bytes;
1195			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES64);
1196
1197			sinfo->rx_packets = msta->wcid.stats.rx_packets;
1198			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS);
1199		}
1200	}
1201
1202	sinfo->tx_failed = msta->wcid.stats.tx_failed;
1203	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
1204
1205	sinfo->tx_retries = msta->wcid.stats.tx_retries;
1206	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
1207
1208	sinfo->ack_signal = (s8)msta->ack_signal;
1209	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL);
1210
1211	sinfo->avg_ack_signal = -(s8)ewma_avg_signal_read(&msta->avg_ack_signal);
1212	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL_AVG);
1213}
1214
1215static void mt7915_sta_rc_work(void *data, struct ieee80211_sta *sta)
1216{
1217	struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1218	struct mt7915_dev *dev = msta->vif->phy->dev;
1219	u32 *changed = data;
1220
1221	spin_lock_bh(&dev->mt76.sta_poll_lock);
1222	msta->changed |= *changed;
1223	if (list_empty(&msta->rc_list))
1224		list_add_tail(&msta->rc_list, &dev->sta_rc_list);
1225	spin_unlock_bh(&dev->mt76.sta_poll_lock);
1226}
1227
1228static void mt7915_sta_rc_update(struct ieee80211_hw *hw,
1229				 struct ieee80211_vif *vif,
1230				 struct ieee80211_link_sta *link_sta,
1231				 u32 changed)
1232{
1233	struct ieee80211_sta *sta = link_sta->sta;
1234	struct mt7915_phy *phy = mt7915_hw_phy(hw);
1235	struct mt7915_dev *dev = phy->dev;
1236	struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1237
1238	if (!msta->wcid.sta)
1239		return;
1240
1241	mt7915_sta_rc_work(&changed, sta);
1242	ieee80211_queue_work(hw, &dev->rc_work);
1243}
1244
1245static int
1246mt7915_set_bitrate_mask(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1247			const struct cfg80211_bitrate_mask *mask)
1248{
1249	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1250	struct mt7915_phy *phy = mt7915_hw_phy(hw);
1251	struct mt7915_dev *dev = phy->dev;
1252	u32 changed = IEEE80211_RC_SUPP_RATES_CHANGED;
1253
1254	mvif->bitrate_mask = *mask;
1255
1256	/* if multiple rates across different preambles are given we can
1257	 * reconfigure this info with all peers using sta_rec command with
1258	 * the below exception cases.
1259	 * - single rate : if a rate is passed along with different preambles,
1260	 * we select the highest one as fixed rate. i.e VHT MCS for VHT peers.
1261	 * - multiple rates: if it's not in range format i.e 0-{7,8,9} for VHT
1262	 * then multiple MCS setting (MCS 4,5,6) is not supported.
1263	 */
1264	ieee80211_iterate_stations_atomic(hw, mt7915_sta_rc_work, &changed);
1265	ieee80211_queue_work(hw, &dev->rc_work);
1266
1267	return 0;
1268}
1269
1270static void mt7915_sta_set_4addr(struct ieee80211_hw *hw,
1271				 struct ieee80211_vif *vif,
1272				 struct ieee80211_sta *sta,
1273				 bool enabled)
1274{
1275	struct mt7915_dev *dev = mt7915_hw_dev(hw);
1276	struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1277
1278	if (enabled)
1279		set_bit(MT_WCID_FLAG_4ADDR, &msta->wcid.flags);
1280	else
1281		clear_bit(MT_WCID_FLAG_4ADDR, &msta->wcid.flags);
1282
1283	if (!msta->wcid.sta)
1284		return;
1285
1286	mt76_connac_mcu_wtbl_update_hdr_trans(&dev->mt76, vif, sta);
1287}
1288
1289static void mt7915_sta_set_decap_offload(struct ieee80211_hw *hw,
1290				 struct ieee80211_vif *vif,
1291				 struct ieee80211_sta *sta,
1292				 bool enabled)
1293{
1294	struct mt7915_dev *dev = mt7915_hw_dev(hw);
1295	struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1296
1297	if (enabled)
1298		set_bit(MT_WCID_FLAG_HDR_TRANS, &msta->wcid.flags);
1299	else
1300		clear_bit(MT_WCID_FLAG_HDR_TRANS, &msta->wcid.flags);
1301
1302	if (!msta->wcid.sta)
1303		return;
1304
1305	mt76_connac_mcu_wtbl_update_hdr_trans(&dev->mt76, vif, sta);
1306}
1307
1308static int mt7915_sta_set_txpwr(struct ieee80211_hw *hw,
1309				struct ieee80211_vif *vif,
1310				struct ieee80211_sta *sta)
1311{
1312	struct mt7915_phy *phy = mt7915_hw_phy(hw);
1313	struct mt7915_dev *dev = mt7915_hw_dev(hw);
1314	s16 txpower = sta->deflink.txpwr.power;
1315	int ret;
1316
1317	if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC)
1318		txpower = 0;
1319
1320	mutex_lock(&dev->mt76.mutex);
1321
1322	/* NOTE: temporarily use 0 as minimum limit, which is a
1323	 * global setting and will be applied to all stations.
1324	 */
1325	ret = mt7915_mcu_set_txpower_frame_min(phy, 0);
1326	if (ret)
1327		goto out;
1328
1329	/* This only applies to data frames while pushing traffic,
1330	 * whereas the management frames or other packets that are
1331	 * using fixed rate can be configured via TxD.
1332	 */
1333	ret = mt7915_mcu_set_txpower_frame(phy, vif, sta, txpower);
1334
1335out:
1336	mutex_unlock(&dev->mt76.mutex);
1337
1338	return ret;
1339}
1340
1341static const char mt7915_gstrings_stats[][ETH_GSTRING_LEN] = {
1342	"tx_ampdu_cnt",
1343	"tx_stop_q_empty_cnt",
1344	"tx_mpdu_attempts",
1345	"tx_mpdu_success",
1346	"tx_rwp_fail_cnt",
1347	"tx_rwp_need_cnt",
1348	"tx_pkt_ebf_cnt",
1349	"tx_pkt_ibf_cnt",
1350	"tx_ampdu_len:0-1",
1351	"tx_ampdu_len:2-10",
1352	"tx_ampdu_len:11-19",
1353	"tx_ampdu_len:20-28",
1354	"tx_ampdu_len:29-37",
1355	"tx_ampdu_len:38-46",
1356	"tx_ampdu_len:47-55",
1357	"tx_ampdu_len:56-79",
1358	"tx_ampdu_len:80-103",
1359	"tx_ampdu_len:104-127",
1360	"tx_ampdu_len:128-151",
1361	"tx_ampdu_len:152-175",
1362	"tx_ampdu_len:176-199",
1363	"tx_ampdu_len:200-223",
1364	"tx_ampdu_len:224-247",
1365	"ba_miss_count",
1366	"tx_beamformer_ppdu_iBF",
1367	"tx_beamformer_ppdu_eBF",
1368	"tx_beamformer_rx_feedback_all",
1369	"tx_beamformer_rx_feedback_he",
1370	"tx_beamformer_rx_feedback_vht",
1371	"tx_beamformer_rx_feedback_ht",
1372	"tx_beamformer_rx_feedback_bw", /* zero based idx: 20, 40, 80, 160 */
1373	"tx_beamformer_rx_feedback_nc",
1374	"tx_beamformer_rx_feedback_nr",
1375	"tx_beamformee_ok_feedback_pkts",
1376	"tx_beamformee_feedback_trig",
1377	"tx_mu_beamforming",
1378	"tx_mu_mpdu",
1379	"tx_mu_successful_mpdu",
1380	"tx_su_successful_mpdu",
1381	"tx_msdu_pack_1",
1382	"tx_msdu_pack_2",
1383	"tx_msdu_pack_3",
1384	"tx_msdu_pack_4",
1385	"tx_msdu_pack_5",
1386	"tx_msdu_pack_6",
1387	"tx_msdu_pack_7",
1388	"tx_msdu_pack_8",
1389
1390	/* rx counters */
1391	"rx_fifo_full_cnt",
1392	"rx_mpdu_cnt",
1393	"channel_idle_cnt",
1394	"primary_cca_busy_time",
1395	"secondary_cca_busy_time",
1396	"primary_energy_detect_time",
1397	"cck_mdrdy_time",
1398	"ofdm_mdrdy_time",
1399	"green_mdrdy_time",
1400	"rx_vector_mismatch_cnt",
1401	"rx_delimiter_fail_cnt",
1402	"rx_mrdy_cnt",
1403	"rx_len_mismatch_cnt",
1404	"rx_ampdu_cnt",
1405	"rx_ampdu_bytes_cnt",
1406	"rx_ampdu_valid_subframe_cnt",
1407	"rx_ampdu_valid_subframe_b_cnt",
1408	"rx_pfdrop_cnt",
1409	"rx_vec_queue_overflow_drop_cnt",
1410	"rx_ba_cnt",
1411
1412	/* muru mu-mimo and ofdma related stats */
1413	"dl_cck_cnt",
1414	"dl_ofdm_cnt",
1415	"dl_htmix_cnt",
1416	"dl_htgf_cnt",
1417	"dl_vht_su_cnt",
1418	"dl_vht_2mu_cnt",
1419	"dl_vht_3mu_cnt",
1420	"dl_vht_4mu_cnt",
1421	"dl_he_su_cnt",
1422	"dl_he_ext_su_cnt",
1423	"dl_he_2ru_cnt",
1424	"dl_he_2mu_cnt",
1425	"dl_he_3ru_cnt",
1426	"dl_he_3mu_cnt",
1427	"dl_he_4ru_cnt",
1428	"dl_he_4mu_cnt",
1429	"dl_he_5to8ru_cnt",
1430	"dl_he_9to16ru_cnt",
1431	"dl_he_gtr16ru_cnt",
1432
1433	"ul_hetrig_su_cnt",
1434	"ul_hetrig_2ru_cnt",
1435	"ul_hetrig_3ru_cnt",
1436	"ul_hetrig_4ru_cnt",
1437	"ul_hetrig_5to8ru_cnt",
1438	"ul_hetrig_9to16ru_cnt",
1439	"ul_hetrig_gtr16ru_cnt",
1440	"ul_hetrig_2mu_cnt",
1441	"ul_hetrig_3mu_cnt",
1442	"ul_hetrig_4mu_cnt",
1443
1444	/* per vif counters */
1445	"v_tx_mode_cck",
1446	"v_tx_mode_ofdm",
1447	"v_tx_mode_ht",
1448	"v_tx_mode_ht_gf",
1449	"v_tx_mode_vht",
1450	"v_tx_mode_he_su",
1451	"v_tx_mode_he_ext_su",
1452	"v_tx_mode_he_tb",
1453	"v_tx_mode_he_mu",
1454	"v_tx_bw_20",
1455	"v_tx_bw_40",
1456	"v_tx_bw_80",
1457	"v_tx_bw_160",
1458	"v_tx_mcs_0",
1459	"v_tx_mcs_1",
1460	"v_tx_mcs_2",
1461	"v_tx_mcs_3",
1462	"v_tx_mcs_4",
1463	"v_tx_mcs_5",
1464	"v_tx_mcs_6",
1465	"v_tx_mcs_7",
1466	"v_tx_mcs_8",
1467	"v_tx_mcs_9",
1468	"v_tx_mcs_10",
1469	"v_tx_mcs_11",
1470	"v_tx_nss_1",
1471	"v_tx_nss_2",
1472	"v_tx_nss_3",
1473	"v_tx_nss_4",
1474};
1475
1476#define MT7915_SSTATS_LEN ARRAY_SIZE(mt7915_gstrings_stats)
1477
1478/* Ethtool related API */
1479static
1480void mt7915_get_et_strings(struct ieee80211_hw *hw,
1481			   struct ieee80211_vif *vif,
1482			   u32 sset, u8 *data)
1483{
1484	if (sset != ETH_SS_STATS)
1485		return;
1486
1487	memcpy(data, mt7915_gstrings_stats, sizeof(mt7915_gstrings_stats));
1488	data += sizeof(mt7915_gstrings_stats);
1489	page_pool_ethtool_stats_get_strings(data);
1490}
1491
1492static
1493int mt7915_get_et_sset_count(struct ieee80211_hw *hw,
1494			     struct ieee80211_vif *vif, int sset)
1495{
1496	if (sset != ETH_SS_STATS)
1497		return 0;
1498
1499	return MT7915_SSTATS_LEN + page_pool_ethtool_stats_get_count();
1500}
1501
1502static void mt7915_ethtool_worker(void *wi_data, struct ieee80211_sta *sta)
1503{
1504	struct mt76_ethtool_worker_info *wi = wi_data;
1505	struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1506
1507	if (msta->vif->mt76.idx != wi->idx)
1508		return;
1509
1510	mt76_ethtool_worker(wi, &msta->wcid.stats, false);
1511}
1512
1513static
1514void mt7915_get_et_stats(struct ieee80211_hw *hw,
1515			 struct ieee80211_vif *vif,
1516			 struct ethtool_stats *stats, u64 *data)
1517{
1518	struct mt7915_dev *dev = mt7915_hw_dev(hw);
1519	struct mt7915_phy *phy = mt7915_hw_phy(hw);
1520	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1521	struct mt76_mib_stats *mib = &phy->mib;
1522	struct mt76_ethtool_worker_info wi = {
1523		.data = data,
1524		.idx = mvif->mt76.idx,
1525	};
1526	/* See mt7915_ampdu_stat_read_phy, etc */
1527	int i, ei = 0, stats_size;
1528
1529	mutex_lock(&dev->mt76.mutex);
1530
1531	mt7915_mac_update_stats(phy);
1532
1533	data[ei++] = mib->tx_ampdu_cnt;
1534	data[ei++] = mib->tx_stop_q_empty_cnt;
1535	data[ei++] = mib->tx_mpdu_attempts_cnt;
1536	data[ei++] = mib->tx_mpdu_success_cnt;
1537	data[ei++] = mib->tx_rwp_fail_cnt;
1538	data[ei++] = mib->tx_rwp_need_cnt;
1539	data[ei++] = mib->tx_pkt_ebf_cnt;
1540	data[ei++] = mib->tx_pkt_ibf_cnt;
1541
1542	/* Tx ampdu stat */
1543	for (i = 0; i < 15 /*ARRAY_SIZE(bound)*/; i++)
1544		data[ei++] = phy->mt76->aggr_stats[i];
1545
1546	data[ei++] = phy->mib.ba_miss_cnt;
1547
1548	/* Tx Beamformer monitor */
1549	data[ei++] = mib->tx_bf_ibf_ppdu_cnt;
1550	data[ei++] = mib->tx_bf_ebf_ppdu_cnt;
1551
1552	/* Tx Beamformer Rx feedback monitor */
1553	data[ei++] = mib->tx_bf_rx_fb_all_cnt;
1554	data[ei++] = mib->tx_bf_rx_fb_he_cnt;
1555	data[ei++] = mib->tx_bf_rx_fb_vht_cnt;
1556	data[ei++] = mib->tx_bf_rx_fb_ht_cnt;
1557
1558	data[ei++] = mib->tx_bf_rx_fb_bw;
1559	data[ei++] = mib->tx_bf_rx_fb_nc_cnt;
1560	data[ei++] = mib->tx_bf_rx_fb_nr_cnt;
1561
1562	/* Tx Beamformee Rx NDPA & Tx feedback report */
1563	data[ei++] = mib->tx_bf_fb_cpl_cnt;
1564	data[ei++] = mib->tx_bf_fb_trig_cnt;
1565
1566	/* Tx SU & MU counters */
1567	data[ei++] = mib->tx_bf_cnt;
1568	data[ei++] = mib->tx_mu_mpdu_cnt;
1569	data[ei++] = mib->tx_mu_acked_mpdu_cnt;
1570	data[ei++] = mib->tx_su_acked_mpdu_cnt;
1571
1572	/* Tx amsdu info (pack-count histogram) */
1573	for (i = 0; i < ARRAY_SIZE(mib->tx_amsdu); i++)
1574		data[ei++] = mib->tx_amsdu[i];
1575
1576	/* rx counters */
1577	data[ei++] = mib->rx_fifo_full_cnt;
1578	data[ei++] = mib->rx_mpdu_cnt;
1579	data[ei++] = mib->channel_idle_cnt;
1580	data[ei++] = mib->primary_cca_busy_time;
1581	data[ei++] = mib->secondary_cca_busy_time;
1582	data[ei++] = mib->primary_energy_detect_time;
1583	data[ei++] = mib->cck_mdrdy_time;
1584	data[ei++] = mib->ofdm_mdrdy_time;
1585	data[ei++] = mib->green_mdrdy_time;
1586	data[ei++] = mib->rx_vector_mismatch_cnt;
1587	data[ei++] = mib->rx_delimiter_fail_cnt;
1588	data[ei++] = mib->rx_mrdy_cnt;
1589	data[ei++] = mib->rx_len_mismatch_cnt;
1590	data[ei++] = mib->rx_ampdu_cnt;
1591	data[ei++] = mib->rx_ampdu_bytes_cnt;
1592	data[ei++] = mib->rx_ampdu_valid_subframe_cnt;
1593	data[ei++] = mib->rx_ampdu_valid_subframe_bytes_cnt;
1594	data[ei++] = mib->rx_pfdrop_cnt;
1595	data[ei++] = mib->rx_vec_queue_overflow_drop_cnt;
1596	data[ei++] = mib->rx_ba_cnt;
1597
1598	data[ei++] = mib->dl_cck_cnt;
1599	data[ei++] = mib->dl_ofdm_cnt;
1600	data[ei++] = mib->dl_htmix_cnt;
1601	data[ei++] = mib->dl_htgf_cnt;
1602	data[ei++] = mib->dl_vht_su_cnt;
1603	data[ei++] = mib->dl_vht_2mu_cnt;
1604	data[ei++] = mib->dl_vht_3mu_cnt;
1605	data[ei++] = mib->dl_vht_4mu_cnt;
1606	data[ei++] = mib->dl_he_su_cnt;
1607	data[ei++] = mib->dl_he_ext_su_cnt;
1608	data[ei++] = mib->dl_he_2ru_cnt;
1609	data[ei++] = mib->dl_he_2mu_cnt;
1610	data[ei++] = mib->dl_he_3ru_cnt;
1611	data[ei++] = mib->dl_he_3mu_cnt;
1612	data[ei++] = mib->dl_he_4ru_cnt;
1613	data[ei++] = mib->dl_he_4mu_cnt;
1614	data[ei++] = mib->dl_he_5to8ru_cnt;
1615	data[ei++] = mib->dl_he_9to16ru_cnt;
1616	data[ei++] = mib->dl_he_gtr16ru_cnt;
1617
1618	data[ei++] = mib->ul_hetrig_su_cnt;
1619	data[ei++] = mib->ul_hetrig_2ru_cnt;
1620	data[ei++] = mib->ul_hetrig_3ru_cnt;
1621	data[ei++] = mib->ul_hetrig_4ru_cnt;
1622	data[ei++] = mib->ul_hetrig_5to8ru_cnt;
1623	data[ei++] = mib->ul_hetrig_9to16ru_cnt;
1624	data[ei++] = mib->ul_hetrig_gtr16ru_cnt;
1625	data[ei++] = mib->ul_hetrig_2mu_cnt;
1626	data[ei++] = mib->ul_hetrig_3mu_cnt;
1627	data[ei++] = mib->ul_hetrig_4mu_cnt;
1628
1629	/* Add values for all stations owned by this vif */
1630	wi.initial_stat_idx = ei;
1631	ieee80211_iterate_stations_atomic(hw, mt7915_ethtool_worker, &wi);
1632
1633	mutex_unlock(&dev->mt76.mutex);
1634
1635	if (wi.sta_count == 0)
1636		return;
1637
1638	ei += wi.worker_stat_count;
1639
1640	mt76_ethtool_page_pool_stats(&dev->mt76, &data[ei], &ei);
1641
1642	stats_size = MT7915_SSTATS_LEN + page_pool_ethtool_stats_get_count();
1643	if (ei != stats_size)
1644		dev_err(dev->mt76.dev, "ei: %d size: %d", ei, stats_size);
1645}
1646
1647static void
1648mt7915_twt_teardown_request(struct ieee80211_hw *hw,
1649			    struct ieee80211_sta *sta,
1650			    u8 flowid)
1651{
1652	struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1653	struct mt7915_dev *dev = mt7915_hw_dev(hw);
1654
1655	mutex_lock(&dev->mt76.mutex);
1656	mt7915_mac_twt_teardown_flow(dev, msta, flowid);
1657	mutex_unlock(&dev->mt76.mutex);
1658}
1659
1660static int
1661mt7915_set_frag_threshold(struct ieee80211_hw *hw, int radio_idx, u32 val)
1662{
1663	return 0;
1664}
1665
1666static int
1667mt7915_set_radar_background(struct ieee80211_hw *hw,
1668			    struct cfg80211_chan_def *chandef)
1669{
1670	struct mt7915_phy *phy = mt7915_hw_phy(hw);
1671	struct mt7915_dev *dev = phy->dev;
1672	int ret = -EINVAL;
1673	bool running;
1674
1675	mutex_lock(&dev->mt76.mutex);
1676
1677	if (dev->mt76.region == NL80211_DFS_UNSET)
1678		goto out;
1679
1680	if (dev->rdd2_phy && dev->rdd2_phy != phy) {
1681		/* rdd2 is already locked */
1682		ret = -EBUSY;
1683		goto out;
1684	}
1685
1686	/* rdd2 already configured on a radar channel */
1687	running = dev->rdd2_phy &&
1688		  cfg80211_chandef_valid(&dev->rdd2_chandef) &&
1689		  !!(dev->rdd2_chandef.chan->flags & IEEE80211_CHAN_RADAR);
1690
1691	if (!chandef || running ||
1692	    !(chandef->chan->flags & IEEE80211_CHAN_RADAR)) {
1693		ret = mt7915_mcu_rdd_background_enable(phy, NULL);
1694		if (ret)
1695			goto out;
1696
1697		if (!running)
1698			goto update_phy;
1699	}
1700
1701	ret = mt7915_mcu_rdd_background_enable(phy, chandef);
1702	if (ret)
1703		goto out;
1704
1705update_phy:
1706	dev->rdd2_phy = chandef ? phy : NULL;
1707	if (chandef)
1708		dev->rdd2_chandef = *chandef;
1709out:
1710	mutex_unlock(&dev->mt76.mutex);
1711
1712	return ret;
1713}
1714
1715#ifdef CONFIG_NET_MEDIATEK_SOC_WED
1716static int
1717mt7915_net_fill_forward_path(struct ieee80211_hw *hw,
1718			     struct ieee80211_vif *vif,
1719			     struct ieee80211_sta *sta,
1720			     struct net_device_path_ctx *ctx,
1721			     struct net_device_path *path)
1722{
1723	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1724	struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1725	struct mt7915_dev *dev = mt7915_hw_dev(hw);
1726	struct mt7915_phy *phy = mt7915_hw_phy(hw);
1727	struct mtk_wed_device *wed = &dev->mt76.mmio.wed;
1728
1729	if (!mtk_wed_device_active(wed))
1730		return -ENODEV;
1731
1732	if (msta->wcid.idx > 0xff)
1733		return -EIO;
1734
1735	path->type = DEV_PATH_MTK_WDMA;
1736	path->dev = ctx->dev;
1737	path->mtk_wdma.wdma_idx = wed->wdma_idx;
1738	path->mtk_wdma.bss = mvif->mt76.idx;
1739	path->mtk_wdma.wcid = is_mt7915(&dev->mt76) ? msta->wcid.idx : 0x3ff;
1740	path->mtk_wdma.queue = phy != &dev->phy;
1741
1742	ctx->dev = NULL;
1743
1744	return 0;
1745}
1746#endif
1747
1748static void
1749mt7915_reconfig_complete(struct ieee80211_hw *hw,
1750			 enum ieee80211_reconfig_type reconfig_type)
1751{
1752	struct mt7915_phy *phy = mt7915_hw_phy(hw);
1753
1754	ieee80211_wake_queues(hw);
1755	ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work,
1756				     MT7915_WATCHDOG_TIME);
1757}
1758
1759const struct ieee80211_ops mt7915_ops = {
1760	.add_chanctx = ieee80211_emulate_add_chanctx,
1761	.remove_chanctx = ieee80211_emulate_remove_chanctx,
1762	.change_chanctx = ieee80211_emulate_change_chanctx,
1763	.switch_vif_chanctx = ieee80211_emulate_switch_vif_chanctx,
1764	.tx = mt7915_tx,
1765	.start = mt7915_start,
1766	.stop = mt7915_stop,
1767	.add_interface = mt7915_add_interface,
1768	.remove_interface = mt7915_remove_interface,
1769	.config = mt7915_config,
1770	.conf_tx = mt7915_conf_tx,
1771	.configure_filter = mt7915_configure_filter,
1772	.bss_info_changed = mt7915_bss_info_changed,
1773	.start_ap = mt7915_start_ap,
1774	.stop_ap = mt7915_stop_ap,
1775	.sta_state = mt76_sta_state,
1776	.sta_pre_rcu_remove = mt76_sta_pre_rcu_remove,
1777	.link_sta_rc_update = mt7915_sta_rc_update,
1778	.set_key = mt7915_set_key,
1779	.ampdu_action = mt7915_ampdu_action,
1780	.set_rts_threshold = mt7915_set_rts_threshold,
1781	.wake_tx_queue = mt76_wake_tx_queue,
1782	.sw_scan_start = mt76_sw_scan,
1783	.sw_scan_complete = mt76_sw_scan_complete,
1784	.release_buffered_frames = mt76_release_buffered_frames,
1785	.get_txpower = mt76_get_txpower,
1786	.set_sar_specs = mt7915_set_sar_specs,
1787	.channel_switch_beacon = mt7915_channel_switch_beacon,
1788	.get_stats = mt7915_get_stats,
1789	.get_et_sset_count = mt7915_get_et_sset_count,
1790	.get_et_stats = mt7915_get_et_stats,
1791	.get_et_strings = mt7915_get_et_strings,
1792	.get_tsf = mt7915_get_tsf,
1793	.set_tsf = mt7915_set_tsf,
1794	.offset_tsf = mt7915_offset_tsf,
1795	.get_survey = mt76_get_survey,
1796	.get_antenna = mt76_get_antenna,
1797	.set_antenna = mt7915_set_antenna,
1798	.set_bitrate_mask = mt7915_set_bitrate_mask,
1799	.set_coverage_class = mt7915_set_coverage_class,
1800	.sta_statistics = mt7915_sta_statistics,
1801	.sta_set_txpwr = mt7915_sta_set_txpwr,
1802	.sta_set_4addr = mt7915_sta_set_4addr,
1803	.sta_set_decap_offload = mt7915_sta_set_decap_offload,
1804	.add_twt_setup = mt7915_mac_add_twt_setup,
1805	.twt_teardown_request = mt7915_twt_teardown_request,
1806	.set_frag_threshold = mt7915_set_frag_threshold,
1807	CFG80211_TESTMODE_CMD(mt76_testmode_cmd)
1808	CFG80211_TESTMODE_DUMP(mt76_testmode_dump)
1809#ifdef CONFIG_MAC80211_DEBUGFS
1810	.sta_add_debugfs = mt7915_sta_add_debugfs,
1811#endif
1812	.set_radar_background = mt7915_set_radar_background,
1813#ifdef CONFIG_NET_MEDIATEK_SOC_WED
1814	.net_fill_forward_path = mt7915_net_fill_forward_path,
1815	.net_setup_tc = mt76_wed_net_setup_tc,
1816#endif
1817	.reconfig_complete = mt7915_reconfig_complete,
1818};
~/ Read-only file preview.