summarylogtreecommitdiffstats
path: root/sys-kernel_arch-sources-g14_files-8011-mt76-mt7921-fix-stupid-mediatek-wth-a-hammer.patch
diff options
context:
space:
mode:
Diffstat (limited to 'sys-kernel_arch-sources-g14_files-8011-mt76-mt7921-fix-stupid-mediatek-wth-a-hammer.patch')
-rw-r--r--sys-kernel_arch-sources-g14_files-8011-mt76-mt7921-fix-stupid-mediatek-wth-a-hammer.patch6575
1 files changed, 0 insertions, 6575 deletions
diff --git a/sys-kernel_arch-sources-g14_files-8011-mt76-mt7921-fix-stupid-mediatek-wth-a-hammer.patch b/sys-kernel_arch-sources-g14_files-8011-mt76-mt7921-fix-stupid-mediatek-wth-a-hammer.patch
deleted file mode 100644
index b573e0fe6ac6..000000000000
--- a/sys-kernel_arch-sources-g14_files-8011-mt76-mt7921-fix-stupid-mediatek-wth-a-hammer.patch
+++ /dev/null
@@ -1,6575 +0,0 @@
-diff --git a/drivers/net/wireless/mediatek/mt76/dma.c b/drivers/net/wireless/mediatek/mt76/dma.c
-index 5e1c1506a4c6..e5c324dd24f9 100644
---- a/drivers/net/wireless/mediatek/mt76/dma.c
-+++ b/drivers/net/wireless/mediatek/mt76/dma.c
-@@ -191,7 +191,6 @@ mt76_dma_add_buf(struct mt76_dev *dev, struct mt76_queue *q,
-
- q->entry[idx].txwi = txwi;
- q->entry[idx].skb = skb;
-- q->entry[idx].wcid = 0xffff;
-
- return idx;
- }
-diff --git a/drivers/net/wireless/mediatek/mt76/mac80211.c b/drivers/net/wireless/mediatek/mt76/mac80211.c
-index d03aedc3286b..03fe62837557 100644
---- a/drivers/net/wireless/mediatek/mt76/mac80211.c
-+++ b/drivers/net/wireless/mediatek/mt76/mac80211.c
-@@ -83,22 +83,6 @@ static const struct ieee80211_tpt_blink mt76_tpt_blink[] = {
- { .throughput = 300 * 1024, .blink_time = 50 },
- };
-
--struct ieee80211_rate mt76_rates[] = {
-- CCK_RATE(0, 10),
-- CCK_RATE(1, 20),
-- CCK_RATE(2, 55),
-- CCK_RATE(3, 110),
-- OFDM_RATE(11, 60),
-- OFDM_RATE(15, 90),
-- OFDM_RATE(10, 120),
-- OFDM_RATE(14, 180),
-- OFDM_RATE(9, 240),
-- OFDM_RATE(13, 360),
-- OFDM_RATE(8, 480),
-- OFDM_RATE(12, 540),
--};
--EXPORT_SYMBOL_GPL(mt76_rates);
--
- static int mt76_led_init(struct mt76_dev *dev)
- {
- struct device_node *np = dev->dev->of_node;
-@@ -331,6 +315,17 @@ mt76_phy_init(struct mt76_phy *phy, struct ieee80211_hw *hw)
- ieee80211_hw_set(hw, MFP_CAPABLE);
- ieee80211_hw_set(hw, AP_LINK_PS);
- ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
-+
-+ wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
-+ wiphy->interface_modes =
-+ BIT(NL80211_IFTYPE_STATION) |
-+ BIT(NL80211_IFTYPE_AP) |
-+#ifdef CONFIG_MAC80211_MESH
-+ BIT(NL80211_IFTYPE_MESH_POINT) |
-+#endif
-+ BIT(NL80211_IFTYPE_P2P_CLIENT) |
-+ BIT(NL80211_IFTYPE_P2P_GO) |
-+ BIT(NL80211_IFTYPE_ADHOC);
- }
-
- struct mt76_phy *
-@@ -351,17 +346,6 @@ mt76_alloc_phy(struct mt76_dev *dev, unsigned int size,
- phy->hw = hw;
- phy->priv = hw->priv + phy_size;
-
-- hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
-- hw->wiphy->interface_modes =
-- BIT(NL80211_IFTYPE_STATION) |
-- BIT(NL80211_IFTYPE_AP) |
--#ifdef CONFIG_MAC80211_MESH
-- BIT(NL80211_IFTYPE_MESH_POINT) |
--#endif
-- BIT(NL80211_IFTYPE_P2P_CLIENT) |
-- BIT(NL80211_IFTYPE_P2P_GO) |
-- BIT(NL80211_IFTYPE_ADHOC);
--
- return phy;
- }
- EXPORT_SYMBOL_GPL(mt76_alloc_phy);
-@@ -444,17 +428,6 @@ mt76_alloc_device(struct device *pdev, unsigned int size,
- mutex_init(&dev->mcu.mutex);
- dev->tx_worker.fn = mt76_tx_worker;
-
-- hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
-- hw->wiphy->interface_modes =
-- BIT(NL80211_IFTYPE_STATION) |
-- BIT(NL80211_IFTYPE_AP) |
--#ifdef CONFIG_MAC80211_MESH
-- BIT(NL80211_IFTYPE_MESH_POINT) |
--#endif
-- BIT(NL80211_IFTYPE_P2P_CLIENT) |
-- BIT(NL80211_IFTYPE_P2P_GO) |
-- BIT(NL80211_IFTYPE_ADHOC);
--
- spin_lock_init(&dev->token_lock);
- idr_init(&dev->token);
-
-@@ -659,19 +632,20 @@ void mt76_update_survey_active_time(struct mt76_phy *phy, ktime_t time)
- }
- EXPORT_SYMBOL_GPL(mt76_update_survey_active_time);
-
--void mt76_update_survey(struct mt76_phy *phy)
-+void mt76_update_survey(struct mt76_dev *dev)
- {
-- struct mt76_dev *dev = phy->dev;
- ktime_t cur_time;
-
- if (dev->drv->update_survey)
-- dev->drv->update_survey(phy);
-+ dev->drv->update_survey(dev);
-
- cur_time = ktime_get_boottime();
-- mt76_update_survey_active_time(phy, cur_time);
-+ mt76_update_survey_active_time(&dev->phy, cur_time);
-+ if (dev->phy2)
-+ mt76_update_survey_active_time(dev->phy2, cur_time);
-
- if (dev->drv->drv_flags & MT_DRV_SW_RX_AIRTIME) {
-- struct mt76_channel_state *state = phy->chan_state;
-+ struct mt76_channel_state *state = dev->phy.chan_state;
-
- spin_lock_bh(&dev->cc_lock);
- state->cc_bss_rx += dev->cur_cc_bss_rx;
-@@ -690,7 +664,7 @@ void mt76_set_channel(struct mt76_phy *phy)
- int timeout = HZ / 5;
-
- wait_event_timeout(dev->tx_wait, !mt76_has_tx_pending(phy), timeout);
-- mt76_update_survey(phy);
-+ mt76_update_survey(dev);
-
- phy->chandef = *chandef;
- phy->chan_state = mt76_channel_state(phy, chandef->chan);
-@@ -715,7 +689,7 @@ int mt76_get_survey(struct ieee80211_hw *hw, int idx,
-
- mutex_lock(&dev->mutex);
- if (idx == 0 && dev->drv->update_survey)
-- mt76_update_survey(phy);
-+ mt76_update_survey(dev);
-
- sband = &phy->sband_2g;
- if (idx >= sband->sband.n_channels) {
-diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
-index 25c5ceef5257..0c23edbfbdbb 100644
---- a/drivers/net/wireless/mediatek/mt76/mt76.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
-@@ -336,7 +336,6 @@ enum {
- struct mt76_hw_cap {
- bool has_2ghz;
- bool has_5ghz;
-- bool has_6ghz;
- };
-
- #define MT_DRV_TXWI_NO_FREE BIT(0)
-@@ -353,7 +352,7 @@ struct mt76_driver_ops {
- u16 token_size;
- u8 mcs_rates;
-
-- void (*update_survey)(struct mt76_phy *phy);
-+ void (*update_survey)(struct mt76_dev *dev);
-
- int (*tx_prepare_skb)(struct mt76_dev *dev, void *txwi_ptr,
- enum mt76_txq_id qid, struct mt76_wcid *wcid,
-@@ -755,21 +754,6 @@ enum mt76_phy_type {
- MT_PHY_TYPE_HE_MU,
- };
-
--#define CCK_RATE(_idx, _rate) { \
-- .bitrate = _rate, \
-- .flags = IEEE80211_RATE_SHORT_PREAMBLE, \
-- .hw_value = (MT_PHY_TYPE_CCK << 8) | (_idx), \
-- .hw_value_short = (MT_PHY_TYPE_CCK << 8) | (4 + _idx), \
--}
--
--#define OFDM_RATE(_idx, _rate) { \
-- .bitrate = _rate, \
-- .hw_value = (MT_PHY_TYPE_OFDM << 8) | (_idx), \
-- .hw_value_short = (MT_PHY_TYPE_OFDM << 8) | (_idx), \
--}
--
--extern struct ieee80211_rate mt76_rates[12];
--
- #define __mt76_rr(dev, ...) (dev)->bus->rr((dev), __VA_ARGS__)
- #define __mt76_wr(dev, ...) (dev)->bus->wr((dev), __VA_ARGS__)
- #define __mt76_rmw(dev, ...) (dev)->bus->rmw((dev), __VA_ARGS__)
-@@ -1063,7 +1047,7 @@ void mt76_release_buffered_frames(struct ieee80211_hw *hw,
- bool more_data);
- bool mt76_has_tx_pending(struct mt76_phy *phy);
- void mt76_set_channel(struct mt76_phy *phy);
--void mt76_update_survey(struct mt76_phy *phy);
-+void mt76_update_survey(struct mt76_dev *dev);
- void mt76_update_survey_active_time(struct mt76_phy *phy, ktime_t time);
- int mt76_get_survey(struct ieee80211_hw *hw, int idx,
- struct survey_info *survey);
-@@ -1088,14 +1072,7 @@ struct sk_buff *mt76_tx_status_skb_get(struct mt76_dev *dev,
- struct sk_buff_head *list);
- void mt76_tx_status_skb_done(struct mt76_dev *dev, struct sk_buff *skb,
- struct sk_buff_head *list);
--void __mt76_tx_complete_skb(struct mt76_dev *dev, u16 wcid, struct sk_buff *skb,
-- struct list_head *free_list);
--static inline void
--mt76_tx_complete_skb(struct mt76_dev *dev, u16 wcid, struct sk_buff *skb)
--{
-- __mt76_tx_complete_skb(dev, wcid, skb, NULL);
--}
--
-+void mt76_tx_complete_skb(struct mt76_dev *dev, u16 wcid, struct sk_buff *skb);
- void mt76_tx_status_check(struct mt76_dev *dev, struct mt76_wcid *wcid,
- bool flush);
- int mt76_sta_state(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
-@@ -1292,15 +1269,4 @@ mt76_token_put(struct mt76_dev *dev, int token)
-
- return txwi;
- }
--
--static inline int
--mt76_get_next_pkt_id(struct mt76_wcid *wcid)
--{
-- wcid->packet_id = (wcid->packet_id + 1) & MT_PACKET_ID_MASK;
-- if (wcid->packet_id == MT_PACKET_ID_NO_ACK ||
-- wcid->packet_id == MT_PACKET_ID_NO_SKB)
-- wcid->packet_id = MT_PACKET_ID_FIRST;
--
-- return wcid->packet_id;
--}
- #endif
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7603/init.c b/drivers/net/wireless/mediatek/mt76/mt7603/init.c
-index 031d39a48a55..e1b2cfa56074 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7603/init.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7603/init.c
-@@ -304,6 +304,34 @@ mt7603_init_hardware(struct mt7603_dev *dev)
- return 0;
- }
-
-+#define CCK_RATE(_idx, _rate) { \
-+ .bitrate = _rate, \
-+ .flags = IEEE80211_RATE_SHORT_PREAMBLE, \
-+ .hw_value = (MT_PHY_TYPE_CCK << 8) | (_idx), \
-+ .hw_value_short = (MT_PHY_TYPE_CCK << 8) | (4 + _idx), \
-+}
-+
-+#define OFDM_RATE(_idx, _rate) { \
-+ .bitrate = _rate, \
-+ .hw_value = (MT_PHY_TYPE_OFDM << 8) | (_idx), \
-+ .hw_value_short = (MT_PHY_TYPE_OFDM << 8) | (_idx), \
-+}
-+
-+static struct ieee80211_rate mt7603_rates[] = {
-+ CCK_RATE(0, 10),
-+ CCK_RATE(1, 20),
-+ CCK_RATE(2, 55),
-+ CCK_RATE(3, 110),
-+ OFDM_RATE(11, 60),
-+ OFDM_RATE(15, 90),
-+ OFDM_RATE(10, 120),
-+ OFDM_RATE(14, 180),
-+ OFDM_RATE(9, 240),
-+ OFDM_RATE(13, 360),
-+ OFDM_RATE(8, 480),
-+ OFDM_RATE(12, 540),
-+};
-+
- static const struct ieee80211_iface_limit if_limits[] = {
- {
- .max = 1,
-@@ -541,8 +569,8 @@ int mt7603_register_device(struct mt7603_dev *dev)
-
- wiphy->reg_notifier = mt7603_regd_notifier;
-
-- ret = mt76_register_device(&dev->mt76, true, mt76_rates,
-- ARRAY_SIZE(mt76_rates));
-+ ret = mt76_register_device(&dev->mt76, true, mt7603_rates,
-+ ARRAY_SIZE(mt7603_rates));
- if (ret)
- return ret;
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7603/mac.c b/drivers/net/wireless/mediatek/mt76/mt7603/mac.c
-index 3972c56136a2..3aa7483e929f 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7603/mac.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7603/mac.c
-@@ -1226,7 +1226,7 @@ mt7603_mac_add_txs_skb(struct mt7603_dev *dev, struct mt7603_sta *sta, int pid,
- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-
- if (!mt7603_fill_txs(dev, sta, info, txs_data)) {
-- info->status.rates[0].count = 0;
-+ ieee80211_tx_info_clear_status(info);
- info->status.rates[0].idx = -1;
- }
-
-@@ -1597,12 +1597,12 @@ mt7603_watchdog_check(struct mt7603_dev *dev, u8 *counter,
- return true;
- }
-
--void mt7603_update_channel(struct mt76_phy *mphy)
-+void mt7603_update_channel(struct mt76_dev *mdev)
- {
-- struct mt7603_dev *dev = container_of(mphy->dev, struct mt7603_dev, mt76);
-+ struct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76);
- struct mt76_channel_state *state;
-
-- state = mphy->chan_state;
-+ state = mdev->phy.chan_state;
- state->cc_busy += mt76_rr(dev, MT_MIB_STAT_CCA);
- }
-
-@@ -1819,7 +1819,7 @@ void mt7603_mac_work(struct work_struct *work)
- mutex_lock(&dev->mt76.mutex);
-
- dev->mphy.mac_work_count++;
-- mt76_update_survey(&dev->mphy);
-+ mt76_update_survey(&dev->mt76);
- mt7603_edcca_check(dev);
-
- for (i = 0, idx = 0; i < 2; i++) {
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7603/mt7603.h b/drivers/net/wireless/mediatek/mt76/mt7603/mt7603.h
-index 0fd46d907638..1df5b9fed2bb 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7603/mt7603.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7603/mt7603.h
-@@ -256,7 +256,7 @@ void mt7603_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
-
- void mt7603_pre_tbtt_tasklet(struct tasklet_struct *t);
-
--void mt7603_update_channel(struct mt76_phy *mphy);
-+void mt7603_update_channel(struct mt76_dev *mdev);
-
- void mt7603_edcca_set_strict(struct mt7603_dev *dev, bool val);
- void mt7603_cca_stats_reset(struct mt7603_dev *dev);
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/Makefile b/drivers/net/wireless/mediatek/mt76/mt7615/Makefile
-index 83f9861ff522..e8fc4a7ae9bc 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7615/Makefile
-+++ b/drivers/net/wireless/mediatek/mt76/mt7615/Makefile
-@@ -1,4 +1,4 @@
--# SPDX-License-Identifier: ISC
-+#SPDX-License-Identifier: ISC
-
- obj-$(CONFIG_MT7615_COMMON) += mt7615-common.o
- obj-$(CONFIG_MT7615E) += mt7615e.o
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/debugfs.c b/drivers/net/wireless/mediatek/mt76/mt7615/debugfs.c
-index cb4659771fd9..676bb22726d6 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7615/debugfs.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7615/debugfs.c
-@@ -75,7 +75,7 @@ mt7615_pm_set(void *data, u64 val)
- if (!mt7615_wait_for_mcu_init(dev))
- return 0;
-
-- if (!mt7615_firmware_offload(dev) || mt76_is_usb(&dev->mt76))
-+ if (!mt7615_firmware_offload(dev) || !mt76_is_mmio(&dev->mt76))
- return -EOPNOTSUPP;
-
- if (val == pm->enable)
-@@ -319,6 +319,24 @@ mt7615_radio_read(struct seq_file *s, void *data)
- return 0;
- }
-
-+static int mt7615_read_temperature(struct seq_file *s, void *data)
-+{
-+ struct mt7615_dev *dev = dev_get_drvdata(s->private);
-+ int temp;
-+
-+ if (!mt7615_wait_for_mcu_init(dev))
-+ return 0;
-+
-+ /* cpu */
-+ mt7615_mutex_acquire(dev);
-+ temp = mt7615_mcu_get_temperature(dev, 0);
-+ mt7615_mutex_release(dev);
-+
-+ seq_printf(s, "Temperature: %d\n", temp);
-+
-+ return 0;
-+}
-+
- static int
- mt7615_queues_acq(struct seq_file *s, void *data)
- {
-@@ -548,6 +566,8 @@ int mt7615_init_debugfs(struct mt7615_dev *dev)
-
- debugfs_create_file("reset_test", 0200, dir, dev,
- &fops_reset_test);
-+ debugfs_create_devm_seqfile(dev->mt76.dev, "temperature", dir,
-+ mt7615_read_temperature);
- debugfs_create_file("ext_mac_addr", 0600, dir, dev, &fops_ext_mac_addr);
-
- debugfs_create_u32("rf_wfidx", 0600, dir, &dev->debugfs_rf_wf);
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/dma.c b/drivers/net/wireless/mediatek/mt76/mt7615/dma.c
-index 00aefea1bf61..8004ae5c16a9 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7615/dma.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7615/dma.c
-@@ -81,7 +81,7 @@ static int mt7615_poll_tx(struct napi_struct *napi, int budget)
- if (napi_complete(napi))
- mt7615_irq_enable(dev, mt7615_tx_mcu_int_mask(dev));
-
-- mt76_connac_pm_unref(&dev->mphy, &dev->pm);
-+ mt76_connac_pm_unref(&dev->pm);
-
- return 0;
- }
-@@ -99,7 +99,7 @@ static int mt7615_poll_rx(struct napi_struct *napi, int budget)
- return 0;
- }
- done = mt76_dma_rx_poll(napi, budget);
-- mt76_connac_pm_unref(&dev->mphy, &dev->pm);
-+ mt76_connac_pm_unref(&dev->pm);
-
- return done;
- }
-@@ -222,9 +222,14 @@ void mt7615_dma_start(struct mt7615_dev *dev)
- int mt7615_dma_init(struct mt7615_dev *dev)
- {
- int rx_ring_size = MT7615_RX_RING_SIZE;
-+ int rx_buf_size = MT_RX_BUF_SIZE;
- u32 mask;
- int ret;
-
-+ /* Increase buffer size to receive large VHT MPDUs */
-+ if (dev->mphy.cap.has_5ghz)
-+ rx_buf_size *= 2;
-+
- mt76_dma_attach(&dev->mt76);
-
- mt76_wr(dev, MT_WPDMA_GLO_CFG,
-@@ -265,7 +270,7 @@ int mt7615_dma_init(struct mt7615_dev *dev)
-
- /* init rx queues */
- ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU], 1,
-- MT7615_RX_MCU_RING_SIZE, MT_RX_BUF_SIZE,
-+ MT7615_RX_MCU_RING_SIZE, rx_buf_size,
- MT_RX_RING_BASE);
- if (ret)
- return ret;
-@@ -274,7 +279,7 @@ int mt7615_dma_init(struct mt7615_dev *dev)
- rx_ring_size /= 2;
-
- ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MAIN], 0,
-- rx_ring_size, MT_RX_BUF_SIZE, MT_RX_RING_BASE);
-+ rx_ring_size, rx_buf_size, MT_RX_RING_BASE);
- if (ret)
- return ret;
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/init.c b/drivers/net/wireless/mediatek/mt76/mt7615/init.c
-index 2f1ac644e018..0d01fd3c77b5 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7615/init.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7615/init.c
-@@ -8,61 +8,11 @@
- */
-
- #include <linux/etherdevice.h>
--#include <linux/hwmon.h>
--#include <linux/hwmon-sysfs.h>
- #include "mt7615.h"
- #include "mac.h"
- #include "mcu.h"
- #include "eeprom.h"
-
--static ssize_t mt7615_thermal_show_temp(struct device *dev,
-- struct device_attribute *attr,
-- char *buf)
--{
-- struct mt7615_dev *mdev = dev_get_drvdata(dev);
-- int temperature;
--
-- if (!mt7615_wait_for_mcu_init(mdev))
-- return 0;
--
-- mt7615_mutex_acquire(mdev);
-- temperature = mt7615_mcu_get_temperature(mdev);
-- mt7615_mutex_release(mdev);
--
-- if (temperature < 0)
-- return temperature;
--
-- /* display in millidegree celcius */
-- return sprintf(buf, "%u\n", temperature * 1000);
--}
--
--static SENSOR_DEVICE_ATTR(temp1_input, 0444, mt7615_thermal_show_temp,
-- NULL, 0);
--
--static struct attribute *mt7615_hwmon_attrs[] = {
-- &sensor_dev_attr_temp1_input.dev_attr.attr,
-- NULL,
--};
--ATTRIBUTE_GROUPS(mt7615_hwmon);
--
--int mt7615_thermal_init(struct mt7615_dev *dev)
--{
-- struct wiphy *wiphy = mt76_hw(dev)->wiphy;
-- struct device *hwmon;
--
-- if (!IS_REACHABLE(CONFIG_HWMON))
-- return 0;
--
-- hwmon = devm_hwmon_device_register_with_groups(&wiphy->dev,
-- wiphy_name(wiphy), dev,
-- mt7615_hwmon_groups);
-- if (IS_ERR(hwmon))
-- return PTR_ERR(hwmon);
--
-- return 0;
--}
--EXPORT_SYMBOL_GPL(mt7615_thermal_init);
--
- static void
- mt7615_phy_init(struct mt7615_dev *dev)
- {
-@@ -224,6 +174,35 @@ bool mt7615_wait_for_mcu_init(struct mt7615_dev *dev)
- }
- EXPORT_SYMBOL_GPL(mt7615_wait_for_mcu_init);
-
-+#define CCK_RATE(_idx, _rate) { \
-+ .bitrate = _rate, \
-+ .flags = IEEE80211_RATE_SHORT_PREAMBLE, \
-+ .hw_value = (MT_PHY_TYPE_CCK << 8) | (_idx), \
-+ .hw_value_short = (MT_PHY_TYPE_CCK << 8) | (4 + (_idx)), \
-+}
-+
-+#define OFDM_RATE(_idx, _rate) { \
-+ .bitrate = _rate, \
-+ .hw_value = (MT_PHY_TYPE_OFDM << 8) | (_idx), \
-+ .hw_value_short = (MT_PHY_TYPE_OFDM << 8) | (_idx), \
-+}
-+
-+struct ieee80211_rate mt7615_rates[] = {
-+ CCK_RATE(0, 10),
-+ CCK_RATE(1, 20),
-+ CCK_RATE(2, 55),
-+ CCK_RATE(3, 110),
-+ OFDM_RATE(11, 60),
-+ OFDM_RATE(15, 90),
-+ OFDM_RATE(10, 120),
-+ OFDM_RATE(14, 180),
-+ OFDM_RATE(9, 240),
-+ OFDM_RATE(13, 360),
-+ OFDM_RATE(8, 480),
-+ OFDM_RATE(12, 540),
-+};
-+EXPORT_SYMBOL_GPL(mt7615_rates);
-+
- static const struct ieee80211_iface_limit if_limits[] = {
- {
- .max = 1,
-@@ -493,8 +472,8 @@ int mt7615_register_ext_phy(struct mt7615_dev *dev)
- for (i = 0; i <= MT_TXQ_PSD ; i++)
- mphy->q_tx[i] = dev->mphy.q_tx[i];
-
-- ret = mt76_register_phy(mphy, true, mt76_rates,
-- ARRAY_SIZE(mt76_rates));
-+ ret = mt76_register_phy(mphy, true, mt7615_rates,
-+ ARRAY_SIZE(mt7615_rates));
- if (ret)
- ieee80211_free_hw(mphy->hw);
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mac.c b/drivers/net/wireless/mediatek/mt76/mt7615/mac.c
-index ff3f85e4087c..4873154d082e 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7615/mac.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7615/mac.c
-@@ -20,7 +20,7 @@
- #define to_rssi(field, rxv) ((FIELD_GET(field, rxv) - 220) / 2)
-
- static const struct mt7615_dfs_radar_spec etsi_radar_specs = {
-- .pulse_th = { 110, -10, -80, 40, 5200, 128, 5200 },
-+ .pulse_th = { 40, -10, -80, 800, 3360, 128, 5200 },
- .radar_pattern = {
- [5] = { 1, 0, 6, 32, 28, 0, 17, 990, 5010, 1, 1 },
- [6] = { 1, 0, 9, 32, 28, 0, 27, 615, 5010, 1, 1 },
-@@ -34,7 +34,7 @@ static const struct mt7615_dfs_radar_spec etsi_radar_specs = {
- };
-
- static const struct mt7615_dfs_radar_spec fcc_radar_specs = {
-- .pulse_th = { 110, -10, -80, 40, 5200, 128, 5200 },
-+ .pulse_th = { 40, -10, -80, 800, 3360, 128, 5200 },
- .radar_pattern = {
- [0] = { 1, 0, 9, 32, 28, 0, 13, 508, 3076, 1, 1 },
- [1] = { 1, 0, 12, 32, 28, 0, 17, 140, 240, 1, 1 },
-@@ -45,7 +45,7 @@ static const struct mt7615_dfs_radar_spec fcc_radar_specs = {
- };
-
- static const struct mt7615_dfs_radar_spec jp_radar_specs = {
-- .pulse_th = { 110, -10, -80, 40, 5200, 128, 5200 },
-+ .pulse_th = { 40, -10, -80, 800, 3360, 128, 5200 },
- .radar_pattern = {
- [0] = { 1, 0, 8, 32, 28, 0, 13, 508, 3076, 1, 1 },
- [1] = { 1, 0, 12, 32, 28, 0, 17, 140, 240, 1, 1 },
-@@ -1102,7 +1102,7 @@ void mt7615_mac_set_rates(struct mt7615_phy *phy, struct mt7615_sta *sta,
- idx = idx > HW_BSSID_MAX ? HW_BSSID_0 : idx;
- addr = idx > 1 ? MT_LPON_TCR2(idx): MT_LPON_TCR0(idx);
-
-- mt76_rmw(dev, addr, MT_LPON_TCR_MODE, MT_LPON_TCR_READ); /* TSF read */
-+ mt76_set(dev, addr, MT_LPON_TCR_MODE); /* TSF read */
- sta->rate_set_tsf = mt76_rr(dev, MT_LPON_UTTR0) & ~BIT(0);
- sta->rate_set_tsf |= rd.rateset;
-
-@@ -1429,7 +1429,7 @@ static bool mt7615_mac_add_txs_skb(struct mt7615_dev *dev,
- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-
- if (!mt7615_fill_txs(dev, sta, info, txs_data)) {
-- info->status.rates[0].count = 0;
-+ ieee80211_tx_info_clear_status(info);
- info->status.rates[0].idx = -1;
- }
-
-@@ -1859,41 +1859,43 @@ mt7615_phy_update_channel(struct mt76_phy *mphy, int idx)
- state->noise = -(phy->noise >> 4);
- }
-
--static void mt7615_update_survey(struct mt7615_dev *dev)
-+static void __mt7615_update_channel(struct mt7615_dev *dev)
- {
- struct mt76_dev *mdev = &dev->mt76;
-- ktime_t cur_time;
--
-- /* MT7615 can only update both phys simultaneously
-- * since some reisters are shared across bands.
-- */
-
- mt7615_phy_update_channel(&mdev->phy, 0);
- if (mdev->phy2)
- mt7615_phy_update_channel(mdev->phy2, 1);
-
-- cur_time = ktime_get_boottime();
--
-- mt76_update_survey_active_time(&mdev->phy, cur_time);
-- if (mdev->phy2)
-- mt76_update_survey_active_time(mdev->phy2, cur_time);
--
- /* reset obss airtime */
- mt76_set(dev, MT_WF_RMAC_MIB_TIME0, MT_WF_RMAC_MIB_RXTIME_CLR);
- }
-
--void mt7615_update_channel(struct mt76_phy *mphy)
-+void mt7615_update_channel(struct mt76_dev *mdev)
- {
-- struct mt7615_dev *dev = container_of(mphy->dev, struct mt7615_dev, mt76);
-+ struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);
-
- if (mt76_connac_pm_wake(&dev->mphy, &dev->pm))
- return;
-
-- mt7615_update_survey(dev);
-+ __mt7615_update_channel(dev);
- mt76_connac_power_save_sched(&dev->mphy, &dev->pm);
- }
- EXPORT_SYMBOL_GPL(mt7615_update_channel);
-
-+static void mt7615_update_survey(struct mt7615_dev *dev)
-+{
-+ struct mt76_dev *mdev = &dev->mt76;
-+ ktime_t cur_time;
-+
-+ __mt7615_update_channel(dev);
-+ cur_time = ktime_get_boottime();
-+
-+ mt76_update_survey_active_time(&mdev->phy, cur_time);
-+ if (mdev->phy2)
-+ mt76_update_survey_active_time(mdev->phy2, cur_time);
-+}
-+
- static void
- mt7615_mac_update_mib_stats(struct mt7615_phy *phy)
- {
-@@ -1942,26 +1944,15 @@ void mt7615_pm_wake_work(struct work_struct *work)
- mphy = dev->phy.mt76;
-
- if (!mt7615_mcu_set_drv_ctrl(dev)) {
-- struct mt76_dev *mdev = &dev->mt76;
- int i;
-
-- if (mt76_is_sdio(mdev)) {
-- mt76_worker_schedule(&mdev->sdio.txrx_worker);
-- } else {
-- mt76_for_each_q_rx(mdev, i)
-- napi_schedule(&mdev->napi[i]);
-- mt76_connac_pm_dequeue_skbs(mphy, &dev->pm);
-- mt76_queue_tx_cleanup(dev, mdev->q_mcu[MT_MCUQ_WM],
-- false);
-- }
--
-- if (test_bit(MT76_STATE_RUNNING, &mphy->state)) {
-- unsigned long timeout;
--
-- timeout = mt7615_get_macwork_timeout(dev);
-+ mt76_for_each_q_rx(&dev->mt76, i)
-+ napi_schedule(&dev->mt76.napi[i]);
-+ mt76_connac_pm_dequeue_skbs(mphy, &dev->pm);
-+ mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_WM], false);
-+ if (test_bit(MT76_STATE_RUNNING, &mphy->state))
- ieee80211_queue_delayed_work(mphy->hw, &mphy->mac_work,
-- timeout);
-- }
-+ MT7615_WATCHDOG_TIME);
- }
-
- ieee80211_wake_queues(mphy->hw);
-@@ -1996,7 +1987,6 @@ void mt7615_mac_work(struct work_struct *work)
- {
- struct mt7615_phy *phy;
- struct mt76_phy *mphy;
-- unsigned long timeout;
-
- mphy = (struct mt76_phy *)container_of(work, struct mt76_phy,
- mac_work.work);
-@@ -2015,9 +2005,8 @@ void mt7615_mac_work(struct work_struct *work)
- mt7615_mutex_release(phy->dev);
-
- mt76_tx_status_check(mphy->dev, NULL, false);
--
-- timeout = mt7615_get_macwork_timeout(phy->dev);
-- ieee80211_queue_delayed_work(mphy->hw, &mphy->mac_work, timeout);
-+ ieee80211_queue_delayed_work(mphy->hw, &mphy->mac_work,
-+ MT7615_WATCHDOG_TIME);
- }
-
- void mt7615_tx_token_put(struct mt7615_dev *dev)
-@@ -2098,12 +2087,14 @@ mt7615_dfs_init_radar_specs(struct mt7615_phy *phy)
- {
- const struct mt7615_dfs_radar_spec *radar_specs;
- struct mt7615_dev *dev = phy->dev;
-- int err, i, lpn = 500;
-+ int err, i;
-
- switch (dev->mt76.region) {
- case NL80211_DFS_FCC:
- radar_specs = &fcc_radar_specs;
-- lpn = 8;
-+ err = mt7615_mcu_set_fcc5_lpn(dev, 8);
-+ if (err < 0)
-+ return err;
- break;
- case NL80211_DFS_ETSI:
- radar_specs = &etsi_radar_specs;
-@@ -2115,11 +2106,6 @@ mt7615_dfs_init_radar_specs(struct mt7615_phy *phy)
- return -EINVAL;
- }
-
-- /* avoid FCC radar detection in non-FCC region */
-- err = mt7615_mcu_set_fcc5_lpn(dev, lpn);
-- if (err < 0)
-- return err;
--
- for (i = 0; i < ARRAY_SIZE(radar_specs->radar_pattern); i++) {
- err = mt7615_mcu_set_radar_th(dev, i,
- &radar_specs->radar_pattern[i]);
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/main.c b/drivers/net/wireless/mediatek/mt76/mt7615/main.c
-index dada43d6d879..39733b351ac4 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7615/main.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7615/main.c
-@@ -28,7 +28,6 @@ static int mt7615_start(struct ieee80211_hw *hw)
- {
- struct mt7615_dev *dev = mt7615_hw_dev(hw);
- struct mt7615_phy *phy = mt7615_hw_phy(hw);
-- unsigned long timeout;
- bool running;
- int ret;
-
-@@ -79,8 +78,8 @@ static int mt7615_start(struct ieee80211_hw *hw)
-
- set_bit(MT76_STATE_RUNNING, &phy->mt76->state);
-
-- timeout = mt7615_get_macwork_timeout(dev);
-- ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work, timeout);
-+ ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work,
-+ MT7615_WATCHDOG_TIME);
-
- if (!running)
- mt7615_mac_reset_counters(dev);
-@@ -241,6 +240,8 @@ static int mt7615_add_interface(struct ieee80211_hw *hw,
- }
-
- ret = mt7615_mcu_add_dev_info(phy, vif, true);
-+ if (ret)
-+ goto out;
- out:
- mt7615_mutex_release(dev);
-
-@@ -351,12 +352,10 @@ int mt7615_set_channel(struct mt7615_phy *phy)
- mt7615_mutex_release(dev);
-
- mt76_worker_schedule(&dev->mt76.tx_worker);
-- if (!mt76_testmode_enabled(phy->mt76)) {
-- unsigned long timeout = mt7615_get_macwork_timeout(dev);
--
-+ if (!mt76_testmode_enabled(phy->mt76))
- ieee80211_queue_delayed_work(phy->mt76->hw,
-- &phy->mt76->mac_work, timeout);
-- }
-+ &phy->mt76->mac_work,
-+ MT7615_WATCHDOG_TIME);
-
- return ret;
- }
-@@ -696,7 +695,7 @@ static void mt7615_sta_rate_tbl_update(struct ieee80211_hw *hw,
- msta->n_rates = i;
- if (mt76_connac_pm_ref(phy->mt76, &dev->pm)) {
- mt7615_mac_set_rates(phy, msta, NULL, msta->rates);
-- mt76_connac_pm_unref(phy->mt76, &dev->pm);
-+ mt76_connac_pm_unref(&dev->pm);
- }
- spin_unlock_bh(&dev->mt76.lock);
- }
-@@ -712,7 +711,7 @@ void mt7615_tx_worker(struct mt76_worker *w)
- }
-
- mt76_tx_worker_run(&dev->mt76);
-- mt76_connac_pm_unref(&dev->mphy, &dev->pm);
-+ mt76_connac_pm_unref(&dev->pm);
- }
-
- static void mt7615_tx(struct ieee80211_hw *hw,
-@@ -742,7 +741,7 @@ static void mt7615_tx(struct ieee80211_hw *hw,
-
- if (mt76_connac_pm_ref(mphy, &dev->pm)) {
- mt76_tx(mphy, control->sta, wcid, skb);
-- mt76_connac_pm_unref(mphy, &dev->pm);
-+ mt76_connac_pm_unref(&dev->pm);
- return;
- }
-
-@@ -882,8 +881,7 @@ mt7615_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
-
- mt7615_mutex_acquire(dev);
-
-- /* TSF read */
-- mt76_rmw(dev, reg, MT_LPON_TCR_MODE, MT_LPON_TCR_READ);
-+ mt76_set(dev, reg, MT_LPON_TCR_MODE); /* TSF read */
- tsf.t32[0] = mt76_rr(dev, MT_LPON_UTTR0);
- tsf.t32[1] = mt76_rr(dev, MT_LPON_UTTR1);
-
-@@ -913,33 +911,7 @@ mt7615_set_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- mt76_wr(dev, MT_LPON_UTTR0, tsf.t32[0]);
- mt76_wr(dev, MT_LPON_UTTR1, tsf.t32[1]);
- /* TSF software overwrite */
-- mt76_rmw(dev, reg, MT_LPON_TCR_MODE, MT_LPON_TCR_WRITE);
--
-- mt7615_mutex_release(dev);
--}
--
--static void
--mt7615_offset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
-- s64 timestamp)
--{
-- struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
-- struct mt7615_dev *dev = mt7615_hw_dev(hw);
-- union {
-- u64 t64;
-- u32 t32[2];
-- } tsf = { .t64 = timestamp, };
-- u16 idx = mvif->mt76.omac_idx;
-- u32 reg;
--
-- idx = idx > HW_BSSID_MAX ? HW_BSSID_0 : idx;
-- reg = idx > 1 ? MT_LPON_TCR2(idx): MT_LPON_TCR0(idx);
--
-- mt7615_mutex_acquire(dev);
--
-- mt76_wr(dev, MT_LPON_UTTR0, tsf.t32[0]);
-- mt76_wr(dev, MT_LPON_UTTR1, tsf.t32[1]);
-- /* TSF software adjust*/
-- mt76_rmw(dev, reg, MT_LPON_TCR_MODE, MT_LPON_TCR_ADJUST);
-+ mt76_set(dev, reg, MT_LPON_TCR_WRITE);
-
- mt7615_mutex_release(dev);
- }
-@@ -1190,7 +1162,7 @@ static void mt7615_sta_set_decap_offload(struct ieee80211_hw *hw,
- else
- clear_bit(MT_WCID_FLAG_HDR_TRANS, &msta->wcid.flags);
-
-- mt7615_mcu_set_sta_decap_offload(dev, vif, sta);
-+ mt7615_mcu_sta_update_hdr_trans(dev, vif, sta);
- }
-
- #ifdef CONFIG_PM
-@@ -1228,7 +1200,6 @@ static int mt7615_resume(struct ieee80211_hw *hw)
- {
- struct mt7615_phy *phy = mt7615_hw_phy(hw);
- struct mt7615_dev *dev = mt7615_hw_dev(hw);
-- unsigned long timeout;
- bool running;
-
- mt7615_mutex_acquire(dev);
-@@ -1252,8 +1223,8 @@ static int mt7615_resume(struct ieee80211_hw *hw)
- mt76_connac_mcu_set_suspend_iter,
- phy->mt76);
-
-- timeout = mt7615_get_macwork_timeout(dev);
-- ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work, timeout);
-+ ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work,
-+ MT7615_WATCHDOG_TIME);
-
- mt7615_mutex_release(dev);
-
-@@ -1307,7 +1278,6 @@ const struct ieee80211_ops mt7615_ops = {
- .get_stats = mt7615_get_stats,
- .get_tsf = mt7615_get_tsf,
- .set_tsf = mt7615_set_tsf,
-- .offset_tsf = mt7615_offset_tsf,
- .get_survey = mt76_get_survey,
- .get_antenna = mt76_get_antenna,
- .set_antenna = mt7615_set_antenna,
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
-index f8a09692d3e4..257a2c4ddf36 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
-@@ -430,10 +430,6 @@ mt7615_mcu_rx_radar_detected(struct mt7615_dev *dev, struct sk_buff *skb)
-
- r = (struct mt7615_mcu_rdd_report *)skb->data;
-
-- if (!dev->radar_pattern.n_pulses && !r->long_detected &&
-- !r->constant_prf_detected && !r->staggered_prf_detected)
-- return;
--
- if (r->band_idx && dev->mt76.phy2)
- mphy = dev->mt76.phy2;
-
-@@ -1028,10 +1024,9 @@ mt7615_mcu_wtbl_sta_add(struct mt7615_phy *phy, struct ieee80211_vif *vif,
- if (IS_ERR(sskb))
- return PTR_ERR(sskb);
-
-- mt76_connac_mcu_sta_basic_tlv(sskb, vif, sta, enable, true);
-+ mt76_connac_mcu_sta_basic_tlv(sskb, vif, sta, enable);
- if (enable && sta)
-- mt76_connac_mcu_sta_tlv(phy->mt76, sskb, sta, vif, 0,
-- MT76_STA_INFO_STATE_ASSOC);
-+ mt76_connac_mcu_sta_tlv(phy->mt76, sskb, sta, vif, 0);
-
- wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
- WTBL_RESET_AND_SET, NULL,
-@@ -1045,8 +1040,8 @@ mt7615_mcu_wtbl_sta_add(struct mt7615_phy *phy, struct ieee80211_vif *vif,
- if (sta)
- mt76_connac_mcu_wtbl_ht_tlv(&dev->mt76, wskb, sta,
- NULL, wtbl_hdr);
-- mt76_connac_mcu_wtbl_hdr_trans_tlv(wskb, vif, &msta->wcid,
-- NULL, wtbl_hdr);
-+ mt76_connac_mcu_wtbl_hdr_trans_tlv(wskb, &msta->wcid, NULL,
-+ wtbl_hdr);
- }
-
- cmd = enable ? MCU_EXT_CMD_WTBL_UPDATE : MCU_EXT_CMD_STA_REC_UPDATE;
-@@ -1066,26 +1061,6 @@ mt7615_mcu_wtbl_sta_add(struct mt7615_phy *phy, struct ieee80211_vif *vif,
- return mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, true);
- }
-
--static int
--mt7615_mcu_wtbl_update_hdr_trans(struct mt7615_dev *dev,
-- struct ieee80211_vif *vif,
-- struct ieee80211_sta *sta)
--{
-- struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv;
-- struct wtbl_req_hdr *wtbl_hdr;
-- struct sk_buff *skb = NULL;
--
-- wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
-- WTBL_SET, NULL, &skb);
-- if (IS_ERR(wtbl_hdr))
-- return PTR_ERR(wtbl_hdr);
--
-- mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, vif, &msta->wcid, NULL,
-- wtbl_hdr);
-- return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_EXT_CMD_WTBL_UPDATE,
-- true);
--}
--
- static const struct mt7615_mcu_ops wtbl_update_ops = {
- .add_beacon_offload = mt7615_mcu_add_beacon_offload,
- .set_pm_state = mt7615_mcu_ctrl_pm_state,
-@@ -1096,7 +1071,6 @@ static const struct mt7615_mcu_ops wtbl_update_ops = {
- .sta_add = mt7615_mcu_wtbl_sta_add,
- .set_drv_ctrl = mt7615_mcu_drv_pmctrl,
- .set_fw_ctrl = mt7615_mcu_fw_pmctrl,
-- .set_sta_decap_offload = mt7615_mcu_wtbl_update_hdr_trans,
- };
-
- static int
-@@ -1158,12 +1132,11 @@ __mt7615_mcu_add_sta(struct mt76_phy *phy, struct ieee80211_vif *vif,
- .vif = vif,
- .offload_fw = offload_fw,
- .enable = enable,
-- .newly = true,
- .cmd = cmd,
- };
-
- info.wcid = sta ? (struct mt76_wcid *)sta->drv_priv : &mvif->sta.wcid;
-- return mt76_connac_mcu_sta_cmd(phy, &info);
-+ return mt76_connac_mcu_add_sta_cmd(phy, &info);
- }
-
- static int
-@@ -1174,18 +1147,6 @@ mt7615_mcu_add_sta(struct mt7615_phy *phy, struct ieee80211_vif *vif,
- MCU_EXT_CMD_STA_REC_UPDATE, false);
- }
-
--static int
--mt7615_mcu_sta_update_hdr_trans(struct mt7615_dev *dev,
-- struct ieee80211_vif *vif,
-- struct ieee80211_sta *sta)
--{
-- struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv;
--
-- return mt76_connac_mcu_sta_update_hdr_trans(&dev->mt76,
-- vif, &msta->wcid,
-- MCU_EXT_CMD_STA_REC_UPDATE);
--}
--
- static const struct mt7615_mcu_ops sta_update_ops = {
- .add_beacon_offload = mt7615_mcu_add_beacon_offload,
- .set_pm_state = mt7615_mcu_ctrl_pm_state,
-@@ -1196,9 +1157,27 @@ static const struct mt7615_mcu_ops sta_update_ops = {
- .sta_add = mt7615_mcu_add_sta,
- .set_drv_ctrl = mt7615_mcu_drv_pmctrl,
- .set_fw_ctrl = mt7615_mcu_fw_pmctrl,
-- .set_sta_decap_offload = mt7615_mcu_sta_update_hdr_trans,
- };
-
-+int mt7615_mcu_sta_update_hdr_trans(struct mt7615_dev *dev,
-+ struct ieee80211_vif *vif,
-+ struct ieee80211_sta *sta)
-+{
-+ struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv;
-+ struct wtbl_req_hdr *wtbl_hdr;
-+ struct sk_buff *skb = NULL;
-+
-+ wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
-+ WTBL_SET, NULL, &skb);
-+ if (IS_ERR(wtbl_hdr))
-+ return PTR_ERR(wtbl_hdr);
-+
-+ mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, &msta->wcid, NULL, wtbl_hdr);
-+
-+ return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_EXT_CMD_WTBL_UPDATE,
-+ true);
-+}
-+
- static int
- mt7615_mcu_uni_ctrl_pm_state(struct mt7615_dev *dev, int band, int state)
- {
-@@ -1364,18 +1343,6 @@ mt7615_mcu_uni_rx_ba(struct mt7615_dev *dev,
- MCU_UNI_CMD_STA_REC_UPDATE, true);
- }
-
--static int
--mt7615_mcu_sta_uni_update_hdr_trans(struct mt7615_dev *dev,
-- struct ieee80211_vif *vif,
-- struct ieee80211_sta *sta)
--{
-- struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv;
--
-- return mt76_connac_mcu_sta_update_hdr_trans(&dev->mt76,
-- vif, &msta->wcid,
-- MCU_UNI_CMD_STA_REC_UPDATE);
--}
--
- static const struct mt7615_mcu_ops uni_update_ops = {
- .add_beacon_offload = mt7615_mcu_uni_add_beacon_offload,
- .set_pm_state = mt7615_mcu_uni_ctrl_pm_state,
-@@ -1386,7 +1353,6 @@ static const struct mt7615_mcu_ops uni_update_ops = {
- .sta_add = mt7615_mcu_uni_add_sta,
- .set_drv_ctrl = mt7615_mcu_lp_drv_pmctrl,
- .set_fw_ctrl = mt7615_mcu_fw_pmctrl,
-- .set_sta_decap_offload = mt7615_mcu_sta_uni_update_hdr_trans,
- };
-
- int mt7615_mcu_restart(struct mt76_dev *dev)
-@@ -2361,12 +2327,14 @@ int mt7615_mcu_set_chan_info(struct mt7615_phy *phy, int cmd)
- return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);
- }
-
--int mt7615_mcu_get_temperature(struct mt7615_dev *dev)
-+int mt7615_mcu_get_temperature(struct mt7615_dev *dev, int index)
- {
- struct {
- u8 action;
- u8 rsv[3];
-- } req = {};
-+ } req = {
-+ .action = index,
-+ };
-
- return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_GET_TEMP, &req,
- sizeof(req), true);
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mmio.c b/drivers/net/wireless/mediatek/mt76/mt7615/mmio.c
-index 71719c787511..202ea235415e 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7615/mmio.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7615/mmio.c
-@@ -229,7 +229,7 @@ int mt7615_mmio_probe(struct device *pdev, void __iomem *mem_base,
- GFP_KERNEL);
- if (!bus_ops) {
- ret = -ENOMEM;
-- goto err_free_dev;
-+ goto error;
- }
-
- bus_ops->rr = mt7615_rr;
-@@ -242,20 +242,17 @@ int mt7615_mmio_probe(struct device *pdev, void __iomem *mem_base,
- ret = devm_request_irq(mdev->dev, irq, mt7615_irq_handler,
- IRQF_SHARED, KBUILD_MODNAME, dev);
- if (ret)
-- goto err_free_dev;
-+ goto error;
-
- if (is_mt7663(mdev))
- mt76_wr(dev, MT_PCIE_IRQ_ENABLE, 1);
-
- ret = mt7615_register_device(dev);
- if (ret)
-- goto err_free_irq;
-+ goto error;
-
- return 0;
--
--err_free_irq:
-- devm_free_irq(pdev, irq, dev);
--err_free_dev:
-+error:
- mt76_free_device(&dev->mt76);
-
- return ret;
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h b/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h
-index d0c64a9b09cf..989f05ed4377 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h
-@@ -20,6 +20,7 @@
- MT7615_MAX_INTERFACES)
-
- #define MT7615_PM_TIMEOUT (HZ / 12)
-+#define MT7615_WATCHDOG_TIME (HZ / 10)
- #define MT7615_HW_SCAN_TIMEOUT (HZ / 10)
- #define MT7615_RESET_TIMEOUT (30 * HZ)
- #define MT7615_RATE_RETRY 2
-@@ -201,7 +202,6 @@ struct mt7615_phy {
- #define mt7615_mcu_set_pm(dev, ...) (dev)->mcu_ops->set_pm_state((dev), __VA_ARGS__)
- #define mt7615_mcu_set_drv_ctrl(dev) (dev)->mcu_ops->set_drv_ctrl((dev))
- #define mt7615_mcu_set_fw_ctrl(dev) (dev)->mcu_ops->set_fw_ctrl((dev))
--#define mt7615_mcu_set_sta_decap_offload(dev, ...) (dev)->mcu_ops->set_sta_decap_offload((dev), __VA_ARGS__)
- struct mt7615_mcu_ops {
- int (*add_tx_ba)(struct mt7615_dev *dev,
- struct ieee80211_ampdu_params *params,
-@@ -221,9 +221,6 @@ struct mt7615_mcu_ops {
- int (*set_pm_state)(struct mt7615_dev *dev, int band, int state);
- int (*set_drv_ctrl)(struct mt7615_dev *dev);
- int (*set_fw_ctrl)(struct mt7615_dev *dev);
-- int (*set_sta_decap_offload)(struct mt7615_dev *dev,
-- struct ieee80211_vif *vif,
-- struct ieee80211_sta *sta);
- };
-
- struct mt7615_dev {
-@@ -359,7 +356,6 @@ static inline int mt7622_wmac_init(struct mt7615_dev *dev)
- }
- #endif
-
--int mt7615_thermal_init(struct mt7615_dev *dev);
- int mt7615_mmio_probe(struct device *pdev, void __iomem *mem_base,
- int irq, const u32 *map);
- u32 mt7615_reg_map(struct mt7615_dev *dev, u32 addr);
-@@ -460,12 +456,6 @@ static inline u32 mt7615_tx_mcu_int_mask(struct mt7615_dev *dev)
- return MT_INT_TX_DONE(dev->mt76.q_mcu[MT_MCUQ_WM]->hw_idx);
- }
-
--static inline unsigned long
--mt7615_get_macwork_timeout(struct mt7615_dev *dev)
--{
-- return dev->pm.enable ? HZ / 3 : HZ / 10;
--}
--
- void mt7615_dma_reset(struct mt7615_dev *dev);
- void mt7615_scan_work(struct work_struct *work);
- void mt7615_roc_work(struct work_struct *work);
-@@ -476,7 +466,7 @@ int mt7615_set_channel(struct mt7615_phy *phy);
- void mt7615_init_work(struct mt7615_dev *dev);
-
- int mt7615_mcu_restart(struct mt76_dev *dev);
--void mt7615_update_channel(struct mt76_phy *mphy);
-+void mt7615_update_channel(struct mt76_dev *mdev);
- bool mt7615_mac_wtbl_update(struct mt7615_dev *dev, int idx, u32 mask);
- void mt7615_mac_reset_counters(struct mt7615_dev *dev);
- void mt7615_mac_cca_stats_reset(struct mt7615_phy *phy);
-@@ -504,7 +494,7 @@ u32 mt7615_rf_rr(struct mt7615_dev *dev, u32 wf, u32 reg);
- int mt7615_rf_wr(struct mt7615_dev *dev, u32 wf, u32 reg, u32 val);
- int mt7615_mcu_set_dbdc(struct mt7615_dev *dev);
- int mt7615_mcu_set_eeprom(struct mt7615_dev *dev);
--int mt7615_mcu_get_temperature(struct mt7615_dev *dev);
-+int mt7615_mcu_get_temperature(struct mt7615_dev *dev, int index);
- int mt7615_mcu_set_tx_power(struct mt7615_phy *phy);
- void mt7615_mcu_exit(struct mt7615_dev *dev);
- void mt7615_mcu_fill_msg(struct mt7615_dev *dev, struct sk_buff *skb,
-@@ -528,6 +518,9 @@ void mt7615_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
- void mt7615_mac_work(struct work_struct *work);
- void mt7615_txp_skb_unmap(struct mt76_dev *dev,
- struct mt76_txwi_cache *txwi);
-+int mt7615_mcu_sta_update_hdr_trans(struct mt7615_dev *dev,
-+ struct ieee80211_vif *vif,
-+ struct ieee80211_sta *sta);
- int mt7615_mcu_set_rx_hdr_trans_blacklist(struct mt7615_dev *dev);
- int mt7615_mcu_set_fcc5_lpn(struct mt7615_dev *dev, int val);
- int mt7615_mcu_set_pulse_th(struct mt7615_dev *dev,
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/pci_init.c b/drivers/net/wireless/mediatek/mt76/mt7615/pci_init.c
-index a2465b49ecd0..ec8ec1a2033f 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7615/pci_init.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7615/pci_init.c
-@@ -98,7 +98,7 @@ mt7615_led_set_config(struct led_classdev *led_cdev,
- addr = mt7615_reg_map(dev, MT_LED_CTRL);
- mt76_wr(dev, addr, val);
-
-- mt76_connac_pm_unref(&dev->mphy, &dev->pm);
-+ mt76_connac_pm_unref(&dev->pm);
- }
-
- static int
-@@ -147,12 +147,8 @@ int mt7615_register_device(struct mt7615_dev *dev)
- if (ret)
- return ret;
-
-- ret = mt76_register_device(&dev->mt76, true, mt76_rates,
-- ARRAY_SIZE(mt76_rates));
-- if (ret)
-- return ret;
--
-- ret = mt7615_thermal_init(dev);
-+ ret = mt76_register_device(&dev->mt76, true, mt7615_rates,
-+ ARRAY_SIZE(mt7615_rates));
- if (ret)
- return ret;
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/pci_mac.c b/drivers/net/wireless/mediatek/mt76/mt7615/pci_mac.c
-index da87c02a73eb..cc278d8cb888 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7615/pci_mac.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7615/pci_mac.c
-@@ -268,7 +268,6 @@ void mt7615_mac_reset_work(struct work_struct *work)
- struct mt7615_phy *phy2;
- struct mt76_phy *ext_phy;
- struct mt7615_dev *dev;
-- unsigned long timeout;
-
- dev = container_of(work, struct mt7615_dev, reset_work);
- ext_phy = dev->mt76.phy2;
-@@ -346,11 +345,11 @@ void mt7615_mac_reset_work(struct work_struct *work)
-
- mt7615_mutex_release(dev);
-
-- timeout = mt7615_get_macwork_timeout(dev);
- ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mphy.mac_work,
-- timeout);
-+ MT7615_WATCHDOG_TIME);
- if (phy2)
- ieee80211_queue_delayed_work(ext_phy->hw,
-- &phy2->mt76->mac_work, timeout);
-+ &phy2->mt76->mac_work,
-+ MT7615_WATCHDOG_TIME);
-
- }
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/regs.h b/drivers/net/wireless/mediatek/mt76/mt7615/regs.h
-index 6712ad9faeaa..63c081bb04d0 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7615/regs.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7615/regs.h
-@@ -463,9 +463,7 @@ enum mt7615_reg_base {
- #define MT_LPON_TCR0(_n) MT_LPON(0x010 + ((_n) * 4))
- #define MT_LPON_TCR2(_n) MT_LPON(0x0f8 + ((_n) - 2) * 4)
- #define MT_LPON_TCR_MODE GENMASK(1, 0)
--#define MT_LPON_TCR_READ GENMASK(1, 0)
- #define MT_LPON_TCR_WRITE BIT(0)
--#define MT_LPON_TCR_ADJUST BIT(1)
-
- #define MT_LPON_UTTR0 MT_LPON(0x018)
- #define MT_LPON_UTTR1 MT_LPON(0x01c)
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/sdio.h b/drivers/net/wireless/mediatek/mt76/mt7615/sdio.h
-index 03877d89e152..05180971de84 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7615/sdio.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7615/sdio.h
-@@ -1,4 +1,4 @@
--/* SPDX-License-Identifier: ISC */
-+// SPDX-License-Identifier: ISC
- /* Copyright (C) 2020 MediaTek Inc.
- *
- * Author: Sean Wang <sean.wang@mediatek.com>
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/sdio_mcu.c b/drivers/net/wireless/mediatek/mt76/mt7615/sdio_mcu.c
-index 45c1cd3b9f49..d1be78b0711c 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7615/sdio_mcu.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7615/sdio_mcu.c
-@@ -55,7 +55,6 @@ static int __mt7663s_mcu_drv_pmctrl(struct mt7615_dev *dev)
- {
- struct sdio_func *func = dev->mt76.sdio.func;
- struct mt76_phy *mphy = &dev->mt76.phy;
-- struct mt76_connac_pm *pm = &dev->pm;
- u32 status;
- int ret;
-
-@@ -67,45 +66,37 @@ static int __mt7663s_mcu_drv_pmctrl(struct mt7615_dev *dev)
- status & WHLPCR_IS_DRIVER_OWN, 2000, 1000000);
- if (ret < 0) {
- dev_err(dev->mt76.dev, "Cannot get ownership from device");
-- } else {
-- clear_bit(MT76_STATE_PM, &mphy->state);
-+ set_bit(MT76_STATE_PM, &mphy->state);
-+ sdio_release_host(func);
-
-- pm->stats.last_wake_event = jiffies;
-- pm->stats.doze_time += pm->stats.last_wake_event -
-- pm->stats.last_doze_event;
-+ return ret;
- }
-+
- sdio_release_host(func);
-+ dev->pm.last_activity = jiffies;
-
-- return ret;
-+ return 0;
- }
-
- static int mt7663s_mcu_drv_pmctrl(struct mt7615_dev *dev)
- {
- struct mt76_phy *mphy = &dev->mt76.phy;
-- int ret = 0;
--
-- mutex_lock(&dev->pm.mutex);
-
-- if (test_bit(MT76_STATE_PM, &mphy->state))
-- ret = __mt7663s_mcu_drv_pmctrl(dev);
-+ if (test_and_clear_bit(MT76_STATE_PM, &mphy->state))
-+ return __mt7663s_mcu_drv_pmctrl(dev);
-
-- mutex_unlock(&dev->pm.mutex);
--
-- return ret;
-+ return 0;
- }
-
- static int mt7663s_mcu_fw_pmctrl(struct mt7615_dev *dev)
- {
- struct sdio_func *func = dev->mt76.sdio.func;
- struct mt76_phy *mphy = &dev->mt76.phy;
-- struct mt76_connac_pm *pm = &dev->pm;
-- int ret = 0;
- u32 status;
-+ int ret;
-
-- mutex_lock(&pm->mutex);
--
-- if (mt76_connac_skip_fw_pmctrl(mphy, pm))
-- goto out;
-+ if (test_and_set_bit(MT76_STATE_PM, &mphy->state))
-+ return 0;
-
- sdio_claim_host(func);
-
-@@ -116,15 +107,9 @@ static int mt7663s_mcu_fw_pmctrl(struct mt7615_dev *dev)
- if (ret < 0) {
- dev_err(dev->mt76.dev, "Cannot set ownership to device");
- clear_bit(MT76_STATE_PM, &mphy->state);
-- } else {
-- pm->stats.last_doze_event = jiffies;
-- pm->stats.awake_time += pm->stats.last_doze_event -
-- pm->stats.last_wake_event;
- }
-
- sdio_release_host(func);
--out:
-- mutex_unlock(&pm->mutex);
-
- return ret;
- }
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/sdio_txrx.c b/drivers/net/wireless/mediatek/mt76/mt7615/sdio_txrx.c
-index 04f4c89b7499..4393dd21ebbb 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7615/sdio_txrx.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7615/sdio_txrx.c
-@@ -283,15 +283,9 @@ void mt7663s_txrx_worker(struct mt76_worker *w)
- {
- struct mt76_sdio *sdio = container_of(w, struct mt76_sdio,
- txrx_worker);
-- struct mt76_dev *mdev = container_of(sdio, struct mt76_dev, sdio);
-- struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);
-+ struct mt76_dev *dev = container_of(sdio, struct mt76_dev, sdio);
- int i, nframes, ret;
-
-- if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) {
-- queue_work(mdev->wq, &dev->pm.wake_work);
-- return;
-- }
--
- /* disable interrupt */
- sdio_claim_host(sdio->func);
- sdio_writel(sdio->func, WHLPCR_INT_EN_CLR, MCR_WHLPCR, NULL);
-@@ -301,16 +295,16 @@ void mt7663s_txrx_worker(struct mt76_worker *w)
-
- /* tx */
- for (i = 0; i <= MT_TXQ_PSD; i++) {
-- ret = mt7663s_tx_run_queue(mdev, mdev->phy.q_tx[i]);
-+ ret = mt7663s_tx_run_queue(dev, dev->phy.q_tx[i]);
- if (ret > 0)
- nframes += ret;
- }
-- ret = mt7663s_tx_run_queue(mdev, mdev->q_mcu[MT_MCUQ_WM]);
-+ ret = mt7663s_tx_run_queue(dev, dev->q_mcu[MT_MCUQ_WM]);
- if (ret > 0)
- nframes += ret;
-
- /* rx */
-- ret = mt7663s_rx_handler(mdev);
-+ ret = mt7663s_rx_handler(dev);
- if (ret > 0)
- nframes += ret;
- } while (nframes > 0);
-@@ -318,8 +312,6 @@ void mt7663s_txrx_worker(struct mt76_worker *w)
- /* enable interrupt */
- sdio_writel(sdio->func, WHLPCR_INT_EN_SET, MCR_WHLPCR, NULL);
- sdio_release_host(sdio->func);
--
-- mt76_connac_pm_unref(&dev->mphy, &dev->pm);
- }
-
- void mt7663s_sdio_irq(struct sdio_func *func)
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/soc.c b/drivers/net/wireless/mediatek/mt76/mt7615/soc.c
-index f13d1b418742..be9a69fe1b38 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7615/soc.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7615/soc.c
-@@ -31,6 +31,7 @@ int mt7622_wmac_init(struct mt7615_dev *dev)
-
- static int mt7622_wmac_probe(struct platform_device *pdev)
- {
-+ struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- void __iomem *mem_base;
- int irq;
-
-@@ -38,7 +39,7 @@ static int mt7622_wmac_probe(struct platform_device *pdev)
- if (irq < 0)
- return irq;
-
-- mem_base = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);
-+ mem_base = devm_ioremap_resource(&pdev->dev, res);
- if (IS_ERR(mem_base))
- return PTR_ERR(mem_base);
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/usb_sdio.c b/drivers/net/wireless/mediatek/mt76/mt7615/usb_sdio.c
-index 996d48cca18a..7010101f6b14 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7615/usb_sdio.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7615/usb_sdio.c
-@@ -123,7 +123,7 @@ static int mt7663_usb_sdio_set_rates(struct mt7615_dev *dev,
- idx = idx > HW_BSSID_MAX ? HW_BSSID_0 : idx;
- addr = idx > 1 ? MT_LPON_TCR2(idx): MT_LPON_TCR0(idx);
-
-- mt76_rmw(dev, addr, MT_LPON_TCR_MODE, MT_LPON_TCR_READ); /* TSF read */
-+ mt76_set(dev, addr, MT_LPON_TCR_MODE); /* TSF read */
- val = mt76_rr(dev, MT_LPON_UTTR0);
- sta->rate_set_tsf = (val & ~BIT(0)) | rate->rateset;
-
-@@ -324,8 +324,8 @@ int mt7663_usb_sdio_register_device(struct mt7615_dev *dev)
- hw->max_tx_fragments = 1;
- }
-
-- err = mt76_register_device(&dev->mt76, true, mt76_rates,
-- ARRAY_SIZE(mt76_rates));
-+ err = mt76_register_device(&dev->mt76, true, mt7615_rates,
-+ ARRAY_SIZE(mt7615_rates));
- if (err < 0)
- return err;
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac.h b/drivers/net/wireless/mediatek/mt76/mt76_connac.h
-index f49d97d0a1c5..75223b6e1c87 100644
---- a/drivers/net/wireless/mediatek/mt76/mt76_connac.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac.h
-@@ -46,7 +46,6 @@ enum {
-
- struct mt76_connac_pm {
- bool enable;
-- bool ds_enable;
- bool suspended;
-
- spinlock_t txq_lock;
-@@ -119,15 +118,11 @@ mt76_connac_pm_ref(struct mt76_phy *phy, struct mt76_connac_pm *pm)
- }
-
- static inline void
--mt76_connac_pm_unref(struct mt76_phy *phy, struct mt76_connac_pm *pm)
-+mt76_connac_pm_unref(struct mt76_connac_pm *pm)
- {
- spin_lock_bh(&pm->wake.lock);
--
-+ pm->wake.count--;
- pm->last_activity = jiffies;
-- if (--pm->wake.count == 0 &&
-- test_bit(MT76_STATE_MCU_RUNNING, &phy->state))
-- mt76_connac_power_save_sched(phy, pm);
--
- spin_unlock_bh(&pm->wake.lock);
- }
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
-index af43bcb54578..5f2705fbd680 100644
---- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
-@@ -10,7 +10,7 @@ int mt76_connac_pm_wake(struct mt76_phy *phy, struct mt76_connac_pm *pm)
- if (!pm->enable)
- return 0;
-
-- if (mt76_is_usb(dev))
-+ if (!mt76_is_mmio(dev))
- return 0;
-
- cancel_delayed_work_sync(&pm->ps_work);
-@@ -37,7 +37,7 @@ void mt76_connac_power_save_sched(struct mt76_phy *phy,
- {
- struct mt76_dev *dev = phy->dev;
-
-- if (mt76_is_usb(dev))
-+ if (!mt76_is_mmio(dev))
- return;
-
- if (!pm->enable)
-diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
-index 5c3a81e5f559..e5721603586f 100644
---- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
-@@ -304,7 +304,7 @@ EXPORT_SYMBOL_GPL(mt76_connac_mcu_alloc_wtbl_req);
- void mt76_connac_mcu_sta_basic_tlv(struct sk_buff *skb,
- struct ieee80211_vif *vif,
- struct ieee80211_sta *sta,
-- bool enable, bool newly)
-+ bool enable)
- {
- struct sta_rec_basic *basic;
- struct tlv *tlv;
-@@ -316,8 +316,7 @@ void mt76_connac_mcu_sta_basic_tlv(struct sk_buff *skb,
- basic->extra_info = cpu_to_le16(EXTRA_INFO_VER);
-
- if (enable) {
-- if (newly)
-- basic->extra_info |= cpu_to_le16(EXTRA_INFO_NEW);
-+ basic->extra_info |= cpu_to_le16(EXTRA_INFO_NEW);
- basic->conn_state = CONN_STATE_PORT_SECURE;
- } else {
- basic->conn_state = CONN_STATE_DISCONNECT;
-@@ -394,7 +393,6 @@ mt76_connac_mcu_sta_uapsd(struct sk_buff *skb, struct ieee80211_vif *vif,
- }
-
- void mt76_connac_mcu_wtbl_hdr_trans_tlv(struct sk_buff *skb,
-- struct ieee80211_vif *vif,
- struct mt76_wcid *wcid,
- void *sta_wtbl, void *wtbl_tlv)
- {
-@@ -406,46 +404,9 @@ void mt76_connac_mcu_wtbl_hdr_trans_tlv(struct sk_buff *skb,
- wtbl_tlv, sta_wtbl);
- htr = (struct wtbl_hdr_trans *)tlv;
- htr->no_rx_trans = !test_bit(MT_WCID_FLAG_HDR_TRANS, &wcid->flags);
--
-- if (vif->type == NL80211_IFTYPE_STATION)
-- htr->to_ds = true;
-- else
-- htr->from_ds = true;
--
-- if (test_bit(MT_WCID_FLAG_4ADDR, &wcid->flags)) {
-- htr->to_ds = true;
-- htr->from_ds = true;
-- }
- }
- EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_hdr_trans_tlv);
-
--int mt76_connac_mcu_sta_update_hdr_trans(struct mt76_dev *dev,
-- struct ieee80211_vif *vif,
-- struct mt76_wcid *wcid, int cmd)
--{
-- struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
-- struct wtbl_req_hdr *wtbl_hdr;
-- struct tlv *sta_wtbl;
-- struct sk_buff *skb;
--
-- skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid);
-- if (IS_ERR(skb))
-- return PTR_ERR(skb);
--
-- sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
-- sizeof(struct tlv));
--
-- wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, wcid, WTBL_SET,
-- sta_wtbl, &skb);
-- if (IS_ERR(wtbl_hdr))
-- return PTR_ERR(wtbl_hdr);
--
-- mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, vif, wcid, sta_wtbl, wtbl_hdr);
--
-- return mt76_mcu_skb_send_msg(dev, skb, cmd, true);
--}
--EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_update_hdr_trans);
--
- void mt76_connac_mcu_wtbl_generic_tlv(struct mt76_dev *dev,
- struct sk_buff *skb,
- struct ieee80211_vif *vif,
-@@ -710,7 +671,7 @@ mt76_connac_get_phy_mode_v2(struct mt76_phy *mphy, struct ieee80211_vif *vif,
- void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
- struct ieee80211_sta *sta,
- struct ieee80211_vif *vif,
-- u8 rcpi, u8 sta_state)
-+ u8 rcpi)
- {
- struct cfg80211_chan_def *chandef = &mphy->chandef;
- enum nl80211_band band = chandef->chan->band;
-@@ -775,7 +736,7 @@ void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
-
- tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_STATE, sizeof(*state));
- state = (struct sta_rec_state *)tlv;
-- state->state = sta_state;
-+ state->state = 2;
-
- if (sta->vht_cap.vht_supported) {
- state->vht_opmode = sta->bandwidth;
-@@ -867,8 +828,8 @@ void mt76_connac_mcu_wtbl_ht_tlv(struct mt76_dev *dev, struct sk_buff *skb,
- }
- EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_ht_tlv);
-
--int mt76_connac_mcu_sta_cmd(struct mt76_phy *phy,
-- struct mt76_sta_cmd_info *info)
-+int mt76_connac_mcu_add_sta_cmd(struct mt76_phy *phy,
-+ struct mt76_sta_cmd_info *info)
- {
- struct mt76_vif *mvif = (struct mt76_vif *)info->vif->drv_priv;
- struct mt76_dev *dev = phy->dev;
-@@ -882,11 +843,10 @@ int mt76_connac_mcu_sta_cmd(struct mt76_phy *phy,
-
- if (info->sta || !info->offload_fw)
- mt76_connac_mcu_sta_basic_tlv(skb, info->vif, info->sta,
-- info->enable, info->newly);
-+ info->enable);
- if (info->sta && info->enable)
- mt76_connac_mcu_sta_tlv(phy, skb, info->sta,
-- info->vif, info->rcpi,
-- info->state);
-+ info->vif, info->rcpi);
-
- sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
- sizeof(struct tlv));
-@@ -901,8 +861,6 @@ int mt76_connac_mcu_sta_cmd(struct mt76_phy *phy,
- mt76_connac_mcu_wtbl_generic_tlv(dev, skb, info->vif,
- info->sta, sta_wtbl,
- wtbl_hdr);
-- mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, info->vif, info->wcid,
-- sta_wtbl, wtbl_hdr);
- if (info->sta)
- mt76_connac_mcu_wtbl_ht_tlv(dev, skb, info->sta,
- sta_wtbl, wtbl_hdr);
-@@ -910,7 +868,7 @@ int mt76_connac_mcu_sta_cmd(struct mt76_phy *phy,
-
- return mt76_mcu_skb_send_msg(dev, skb, info->cmd, true);
- }
--EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_cmd);
-+EXPORT_SYMBOL_GPL(mt76_connac_mcu_add_sta_cmd);
-
- void mt76_connac_mcu_wtbl_ba_tlv(struct mt76_dev *dev, struct sk_buff *skb,
- struct ieee80211_ampdu_params *params,
-@@ -939,10 +897,8 @@ void mt76_connac_mcu_wtbl_ba_tlv(struct mt76_dev *dev, struct sk_buff *skb,
- ba->rst_ba_sb = 1;
- }
-
-- if (is_mt7921(dev)) {
-- ba->ba_winsize = enable ? cpu_to_le16(params->buf_size) : 0;
-+ if (is_mt7921(dev))
- return;
-- }
-
- if (enable && tx) {
- u8 ba_range[] = { 4, 8, 12, 24, 36, 48, 54, 64 };
-@@ -1317,7 +1273,6 @@ int mt76_connac_mcu_uni_add_bss(struct mt76_phy *phy,
- u8 pad[3];
- } __packed hdr;
- struct bss_info_uni_he he;
-- struct bss_info_uni_bss_color bss_color;
- } he_req = {
- .hdr = {
- .bss_idx = mvif->idx,
-@@ -1326,21 +1281,8 @@ int mt76_connac_mcu_uni_add_bss(struct mt76_phy *phy,
- .tag = cpu_to_le16(UNI_BSS_INFO_HE_BASIC),
- .len = cpu_to_le16(sizeof(struct bss_info_uni_he)),
- },
-- .bss_color = {
-- .tag = cpu_to_le16(UNI_BSS_INFO_BSS_COLOR),
-- .len = cpu_to_le16(sizeof(struct bss_info_uni_bss_color)),
-- .enable = 0,
-- .bss_color = 0,
-- },
- };
-
-- if (enable) {
-- he_req.bss_color.enable =
-- vif->bss_conf.he_bss_color.enabled;
-- he_req.bss_color.bss_color =
-- vif->bss_conf.he_bss_color.color;
-- }
--
- mt76_connac_mcu_uni_bss_he_tlv(phy, vif,
- (struct tlv *)&he_req.he);
- err = mt76_mcu_send_msg(mdev, MCU_UNI_CMD_BSS_INFO_UPDATE,
-@@ -1523,16 +1465,14 @@ int mt76_connac_mcu_sched_scan_req(struct mt76_phy *phy,
- req->version = 1;
- req->seq_num = mvif->scan_seq_num | ext_phy << 7;
-
-- if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
-- u8 *addr = is_mt7663(phy->dev) ? req->mt7663.random_mac
-- : req->mt7921.random_mac;
--
-- req->scan_func = 1;
-- get_random_mask_addr(addr, sreq->mac_addr,
-+ if (is_mt7663(phy->dev) &&
-+ (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR)) {
-+ get_random_mask_addr(req->mt7663.random_mac, sreq->mac_addr,
- sreq->mac_addr_mask);
-- }
-- if (is_mt7921(phy->dev))
-+ req->scan_func = 1;
-+ } else if (is_mt7921(phy->dev)) {
- req->mt7921.bss_idx = mvif->idx;
-+ }
-
- req->ssids_num = sreq->n_ssids;
- for (i = 0; i < req->ssids_num; i++) {
-@@ -1618,26 +1558,6 @@ int mt76_connac_mcu_set_deep_sleep(struct mt76_dev *dev, bool enable)
- }
- EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_deep_sleep);
-
--int mt76_connac_sta_state_dp(struct mt76_dev *dev,
-- enum ieee80211_sta_state old_state,
-- enum ieee80211_sta_state new_state)
--{
-- if ((old_state == IEEE80211_STA_ASSOC &&
-- new_state == IEEE80211_STA_AUTHORIZED) ||
-- (old_state == IEEE80211_STA_NONE &&
-- new_state == IEEE80211_STA_NOTEXIST))
-- mt76_connac_mcu_set_deep_sleep(dev, true);
--
-- if ((old_state == IEEE80211_STA_NOTEXIST &&
-- new_state == IEEE80211_STA_NONE) ||
-- (old_state == IEEE80211_STA_AUTHORIZED &&
-- new_state == IEEE80211_STA_ASSOC))
-- mt76_connac_mcu_set_deep_sleep(dev, false);
--
-- return 0;
--}
--EXPORT_SYMBOL_GPL(mt76_connac_sta_state_dp);
--
- void mt76_connac_mcu_coredump_event(struct mt76_dev *dev, struct sk_buff *skb,
- struct mt76_connac_coredump *coredump)
- {
-@@ -1652,60 +1572,6 @@ void mt76_connac_mcu_coredump_event(struct mt76_dev *dev, struct sk_buff *skb,
- }
- EXPORT_SYMBOL_GPL(mt76_connac_mcu_coredump_event);
-
--int mt76_connac_mcu_get_nic_capability(struct mt76_phy *phy)
--{
-- struct mt76_connac_cap_hdr {
-- __le16 n_element;
-- u8 rsv[2];
-- } __packed * hdr;
-- struct sk_buff *skb;
-- int ret, i;
--
-- ret = mt76_mcu_send_and_get_msg(phy->dev, MCU_CMD_GET_NIC_CAPAB, NULL,
-- 0, true, &skb);
-- if (ret)
-- return ret;
--
-- hdr = (struct mt76_connac_cap_hdr *)skb->data;
-- if (skb->len < sizeof(*hdr)) {
-- ret = -EINVAL;
-- goto out;
-- }
--
-- skb_pull(skb, sizeof(*hdr));
--
-- for (i = 0; i < le16_to_cpu(hdr->n_element); i++) {
-- struct tlv_hdr {
-- __le32 type;
-- __le32 len;
-- } __packed * tlv = (struct tlv_hdr *)skb->data;
-- int len;
--
-- if (skb->len < sizeof(*tlv))
-- break;
--
-- skb_pull(skb, sizeof(*tlv));
--
-- len = le32_to_cpu(tlv->len);
-- if (skb->len < len)
-- break;
--
-- switch (le32_to_cpu(tlv->type)) {
-- case MT_NIC_CAP_6G:
-- phy->cap.has_6ghz = skb->data[0];
-- break;
-- default:
-- break;
-- }
-- skb_pull(skb, len);
-- }
--out:
-- dev_kfree_skb(skb);
--
-- return ret;
--}
--EXPORT_SYMBOL_GPL(mt76_connac_mcu_get_nic_capability);
--
- static void
- mt76_connac_mcu_build_sku(struct mt76_dev *dev, s8 *sku,
- struct mt76_power_limits *limits,
-@@ -1768,15 +1634,12 @@ mt76_connac_mcu_rate_txpower_band(struct mt76_phy *phy,
- 142, 144, 149, 151, 153, 155, 157,
- 159, 161, 165
- };
-- int i, n_chan, batch_size, idx = 0, tx_power, last_ch;
- struct mt76_connac_sku_tlv sku_tlbv;
-+ int i, n_chan, batch_size, idx = 0;
- struct mt76_power_limits limits;
- const u8 *ch_list;
-
- sku_len = is_mt7921(dev) ? sizeof(sku_tlbv) : sizeof(sku_tlbv) - 92;
-- tx_power = 2 * phy->hw->conf.power_level;
-- if (!tx_power)
-- tx_power = 127;
-
- if (band == NL80211_BAND_2GHZ) {
- n_chan = ARRAY_SIZE(chan_list_2ghz);
-@@ -1787,48 +1650,39 @@ mt76_connac_mcu_rate_txpower_band(struct mt76_phy *phy,
- }
- batch_size = DIV_ROUND_UP(n_chan, batch_len);
-
-- if (!phy->cap.has_5ghz)
-- last_ch = chan_list_2ghz[n_chan - 1];
-- else
-- last_ch = chan_list_5ghz[n_chan - 1];
--
- for (i = 0; i < batch_size; i++) {
-+ bool last_msg = i == batch_size - 1;
-+ int num_ch = last_msg ? n_chan % batch_len : batch_len;
- struct mt76_connac_tx_power_limit_tlv tx_power_tlv = {
- .band = band == NL80211_BAND_2GHZ ? 1 : 2,
-+ .n_chan = num_ch,
-+ .last_msg = last_msg,
- };
-- int j, err, msg_len, num_ch;
- struct sk_buff *skb;
-+ int j, err, msg_len;
-
-- num_ch = i == batch_size - 1 ? n_chan % batch_len : batch_len;
- msg_len = sizeof(tx_power_tlv) + num_ch * sizeof(sku_tlbv);
- skb = mt76_mcu_msg_alloc(dev, NULL, msg_len);
- if (!skb)
- return -ENOMEM;
-
-- skb_reserve(skb, sizeof(tx_power_tlv));
--
- BUILD_BUG_ON(sizeof(dev->alpha2) > sizeof(tx_power_tlv.alpha2));
- memcpy(tx_power_tlv.alpha2, dev->alpha2, sizeof(dev->alpha2));
-- tx_power_tlv.n_chan = num_ch;
-
-+ skb_put_data(skb, &tx_power_tlv, sizeof(tx_power_tlv));
- for (j = 0; j < num_ch; j++, idx++) {
- struct ieee80211_channel chan = {
- .hw_value = ch_list[idx],
- .band = band,
- };
-
-- mt76_get_rate_power_limits(phy, &chan, &limits,
-- tx_power);
-+ mt76_get_rate_power_limits(phy, &chan, &limits, 127);
-
-- tx_power_tlv.last_msg = ch_list[idx] == last_ch;
- sku_tlbv.channel = ch_list[idx];
--
- mt76_connac_mcu_build_sku(dev, sku_tlbv.pwr_limit,
- &limits, band);
- skb_put_data(skb, &sku_tlbv, sku_len);
- }
-- __skb_push(skb, sizeof(tx_power_tlv));
-- memcpy(skb->data, &tx_power_tlv, sizeof(tx_power_tlv));
-
- err = mt76_mcu_skb_send_msg(dev, skb,
- MCU_CMD_SET_RATE_TX_POWER, false);
-@@ -1843,20 +1697,11 @@ int mt76_connac_mcu_set_rate_txpower(struct mt76_phy *phy)
- {
- int err;
-
-- if (phy->cap.has_2ghz) {
-- err = mt76_connac_mcu_rate_txpower_band(phy,
-- NL80211_BAND_2GHZ);
-- if (err < 0)
-- return err;
-- }
-- if (phy->cap.has_5ghz) {
-- err = mt76_connac_mcu_rate_txpower_band(phy,
-- NL80211_BAND_5GHZ);
-- if (err < 0)
-- return err;
-- }
-+ err = mt76_connac_mcu_rate_txpower_band(phy, NL80211_BAND_2GHZ);
-+ if (err < 0)
-+ return err;
-
-- return 0;
-+ return mt76_connac_mcu_rate_txpower_band(phy, NL80211_BAND_5GHZ);
- }
- EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_rate_txpower);
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
-index 1c73beb22677..facebed1e301 100644
---- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
-@@ -559,7 +559,6 @@ enum {
- MCU_CMD_SET_RATE_TX_POWER = MCU_CE_PREFIX | 0x5d,
- MCU_CMD_SCHED_SCAN_ENABLE = MCU_CE_PREFIX | 0x61,
- MCU_CMD_SCHED_SCAN_REQ = MCU_CE_PREFIX | 0x62,
-- MCU_CMD_GET_NIC_CAPAB = MCU_CE_PREFIX | 0x8a,
- MCU_CMD_REG_WRITE = MCU_CE_PREFIX | 0xc0,
- MCU_CMD_REG_READ = MCU_CE_PREFIX | MCU_QUERY_MASK | 0xc0,
- MCU_CMD_CHIP_CONFIG = MCU_CE_PREFIX | 0xca,
-@@ -576,7 +575,6 @@ enum {
- enum {
- UNI_BSS_INFO_BASIC = 0,
- UNI_BSS_INFO_RLM = 2,
-- UNI_BSS_INFO_BSS_COLOR = 4,
- UNI_BSS_INFO_HE_BASIC = 5,
- UNI_BSS_INFO_BCN_CONTENT = 7,
- UNI_BSS_INFO_QBSS = 15,
-@@ -592,28 +590,6 @@ enum {
- UNI_OFFLOAD_OFFLOAD_BMC_RPY_DETECT,
- };
-
--enum {
-- MT_NIC_CAP_TX_RESOURCE,
-- MT_NIC_CAP_TX_EFUSE_ADDR,
-- MT_NIC_CAP_COEX,
-- MT_NIC_CAP_SINGLE_SKU,
-- MT_NIC_CAP_CSUM_OFFLOAD,
-- MT_NIC_CAP_HW_VER,
-- MT_NIC_CAP_SW_VER,
-- MT_NIC_CAP_MAC_ADDR,
-- MT_NIC_CAP_PHY,
-- MT_NIC_CAP_MAC,
-- MT_NIC_CAP_FRAME_BUF,
-- MT_NIC_CAP_BEAM_FORM,
-- MT_NIC_CAP_LOCATION,
-- MT_NIC_CAP_MUMIMO,
-- MT_NIC_CAP_BUFFER_MODE_INFO,
-- MT_NIC_CAP_HW_ADIE_VERSION = 0x14,
-- MT_NIC_CAP_ANTSWP = 0x16,
-- MT_NIC_CAP_WFDMA_REALLOC,
-- MT_NIC_CAP_6G,
--};
--
- #define UNI_WOW_DETECT_TYPE_MAGIC BIT(0)
- #define UNI_WOW_DETECT_TYPE_ANY BIT(1)
- #define UNI_WOW_DETECT_TYPE_DISCONNECT BIT(2)
-@@ -802,9 +778,7 @@ struct mt76_connac_sched_scan_req {
- } mt7663;
- struct {
- u8 bss_idx;
-- u8 pad2[19];
-- u8 random_mac[ETH_ALEN];
-- u8 pad3[38];
-+ u8 pad2[63];
- } mt7921;
- };
- } __packed;
-@@ -815,14 +789,6 @@ struct mt76_connac_sched_scan_done {
- __le16 pad;
- } __packed;
-
--struct bss_info_uni_bss_color {
-- __le16 tag;
-- __le16 len;
-- u8 enable;
-- u8 bss_color;
-- u8 rsv[2];
--} __packed;
--
- struct bss_info_uni_he {
- __le16 tag;
- __le16 len;
-@@ -927,12 +893,6 @@ struct mt76_connac_suspend_tlv {
- u8 pad[5];
- } __packed;
-
--enum mt76_sta_info_state {
-- MT76_STA_INFO_STATE_NONE,
-- MT76_STA_INFO_STATE_AUTH,
-- MT76_STA_INFO_STATE_ASSOC
--};
--
- struct mt76_sta_cmd_info {
- struct ieee80211_sta *sta;
- struct mt76_wcid *wcid;
-@@ -941,10 +901,8 @@ struct mt76_sta_cmd_info {
-
- bool offload_fw;
- bool enable;
-- bool newly;
- int cmd;
- u8 rcpi;
-- u8 state;
- };
-
- #define MT_SKU_POWER_LIMIT 161
-@@ -1014,23 +972,18 @@ int mt76_connac_mcu_set_channel_domain(struct mt76_phy *phy);
- int mt76_connac_mcu_set_vif_ps(struct mt76_dev *dev, struct ieee80211_vif *vif);
- void mt76_connac_mcu_sta_basic_tlv(struct sk_buff *skb,
- struct ieee80211_vif *vif,
-- struct ieee80211_sta *sta, bool enable,
-- bool newly);
-+ struct ieee80211_sta *sta, bool enable);
- void mt76_connac_mcu_wtbl_generic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
- struct ieee80211_vif *vif,
- struct ieee80211_sta *sta, void *sta_wtbl,
- void *wtbl_tlv);
- void mt76_connac_mcu_wtbl_hdr_trans_tlv(struct sk_buff *skb,
-- struct ieee80211_vif *vif,
- struct mt76_wcid *wcid,
- void *sta_wtbl, void *wtbl_tlv);
--int mt76_connac_mcu_sta_update_hdr_trans(struct mt76_dev *dev,
-- struct ieee80211_vif *vif,
-- struct mt76_wcid *wcid, int cmd);
- void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
- struct ieee80211_sta *sta,
- struct ieee80211_vif *vif,
-- u8 rcpi, u8 state);
-+ u8 rcpi);
- void mt76_connac_mcu_wtbl_ht_tlv(struct mt76_dev *dev, struct sk_buff *skb,
- struct ieee80211_sta *sta, void *sta_wtbl,
- void *wtbl_tlv);
-@@ -1052,8 +1005,8 @@ int mt76_connac_mcu_uni_add_bss(struct mt76_phy *phy,
- struct ieee80211_vif *vif,
- struct mt76_wcid *wcid,
- bool enable);
--int mt76_connac_mcu_sta_cmd(struct mt76_phy *phy,
-- struct mt76_sta_cmd_info *info);
-+int mt76_connac_mcu_add_sta_cmd(struct mt76_phy *phy,
-+ struct mt76_sta_cmd_info *info);
- void mt76_connac_mcu_beacon_loss_iter(void *priv, u8 *mac,
- struct ieee80211_vif *vif);
- int mt76_connac_mcu_set_rts_thresh(struct mt76_dev *dev, u32 val, u8 band);
-@@ -1064,7 +1017,6 @@ int mt76_connac_mcu_init_download(struct mt76_dev *dev, u32 addr, u32 len,
- int mt76_connac_mcu_start_patch(struct mt76_dev *dev);
- int mt76_connac_mcu_patch_sem_ctrl(struct mt76_dev *dev, bool get);
- int mt76_connac_mcu_start_firmware(struct mt76_dev *dev, u32 addr, u32 option);
--int mt76_connac_mcu_get_nic_capability(struct mt76_phy *phy);
-
- int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif,
- struct ieee80211_scan_request *scan_req);
-@@ -1085,9 +1037,6 @@ int mt76_connac_mcu_update_gtk_rekey(struct ieee80211_hw *hw,
- int mt76_connac_mcu_set_hif_suspend(struct mt76_dev *dev, bool suspend);
- void mt76_connac_mcu_set_suspend_iter(void *priv, u8 *mac,
- struct ieee80211_vif *vif);
--int mt76_connac_sta_state_dp(struct mt76_dev *dev,
-- enum ieee80211_sta_state old_state,
-- enum ieee80211_sta_state new_state);
- int mt76_connac_mcu_chip_config(struct mt76_dev *dev);
- int mt76_connac_mcu_set_deep_sleep(struct mt76_dev *dev, bool enable);
- void mt76_connac_mcu_coredump_event(struct mt76_dev *dev, struct sk_buff *skb,
-diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.c b/drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.c
-index cea24213186c..dd66fd12a2e6 100644
---- a/drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.c
-@@ -68,7 +68,7 @@ static void mt76x0_set_chip_cap(struct mt76x02_dev *dev)
- nic_conf1 &= 0xff00;
-
- if (nic_conf1 & MT_EE_NIC_CONF_1_HW_RF_CTRL)
-- dev_dbg(dev->mt76.dev,
-+ dev_err(dev->mt76.dev,
- "driver does not support HW RF ctrl\n");
-
- if (!mt76x02_field_valid(nic_conf0 >> 8))
-diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_mac.c b/drivers/net/wireless/mediatek/mt76/mt76x02_mac.c
-index c32e6dc68773..10d66775c391 100644
---- a/drivers/net/wireless/mediatek/mt76/mt76x02_mac.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt76x02_mac.c
-@@ -1022,12 +1022,12 @@ void mt76x02_mac_set_tx_protection(struct mt76x02_dev *dev, bool legacy_prot,
- mt76_wr(dev, MT_TX_PROT_CFG6 + i * 4, vht_prot[i]);
- }
-
--void mt76x02_update_channel(struct mt76_phy *mphy)
-+void mt76x02_update_channel(struct mt76_dev *mdev)
- {
-- struct mt76x02_dev *dev = container_of(mphy->dev, struct mt76x02_dev, mt76);
-+ struct mt76x02_dev *dev = container_of(mdev, struct mt76x02_dev, mt76);
- struct mt76_channel_state *state;
-
-- state = mphy->chan_state;
-+ state = mdev->phy.chan_state;
- state->cc_busy += mt76_rr(dev, MT_CH_BUSY);
-
- spin_lock_bh(&dev->mt76.cc_lock);
-@@ -1169,7 +1169,7 @@ void mt76x02_mac_work(struct work_struct *work)
-
- mutex_lock(&dev->mt76.mutex);
-
-- mt76_update_survey(&dev->mphy);
-+ mt76_update_survey(&dev->mt76);
- for (i = 0, idx = 0; i < 16; i++) {
- u32 val = mt76_rr(dev, MT_TX_AGG_CNT(i));
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_mac.h b/drivers/net/wireless/mediatek/mt76/mt76x02_mac.h
-index 5dc6c834111e..0cfbaca50210 100644
---- a/drivers/net/wireless/mediatek/mt76/mt76x02_mac.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt76x02_mac.h
-@@ -195,7 +195,7 @@ void mt76x02_mac_write_txwi(struct mt76x02_dev *dev, struct mt76x02_txwi *txwi,
- struct ieee80211_sta *sta, int len);
- void mt76x02_mac_poll_tx_status(struct mt76x02_dev *dev, bool irq);
- void mt76x02_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e);
--void mt76x02_update_channel(struct mt76_phy *mphy);
-+void mt76x02_update_channel(struct mt76_dev *mdev);
- void mt76x02_mac_work(struct work_struct *work);
-
- void mt76x02_mac_cc_reset(struct mt76x02_dev *dev);
-diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_util.c b/drivers/net/wireless/mediatek/mt76/mt76x02_util.c
-index ccdbab341271..02db5d66735d 100644
---- a/drivers/net/wireless/mediatek/mt76/mt76x02_util.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt76x02_util.c
-@@ -7,18 +7,24 @@
- #include <linux/module.h>
- #include "mt76x02.h"
-
--#define MT76x02_CCK_RATE(_idx, _rate) { \
-+#define CCK_RATE(_idx, _rate) { \
- .bitrate = _rate, \
- .flags = IEEE80211_RATE_SHORT_PREAMBLE, \
- .hw_value = (MT_PHY_TYPE_CCK << 8) | (_idx), \
- .hw_value_short = (MT_PHY_TYPE_CCK << 8) | (8 + (_idx)), \
- }
-
-+#define OFDM_RATE(_idx, _rate) { \
-+ .bitrate = _rate, \
-+ .hw_value = (MT_PHY_TYPE_OFDM << 8) | (_idx), \
-+ .hw_value_short = (MT_PHY_TYPE_OFDM << 8) | (_idx), \
-+}
-+
- struct ieee80211_rate mt76x02_rates[] = {
-- MT76x02_CCK_RATE(0, 10),
-- MT76x02_CCK_RATE(1, 20),
-- MT76x02_CCK_RATE(2, 55),
-- MT76x02_CCK_RATE(3, 110),
-+ CCK_RATE(0, 10),
-+ CCK_RATE(1, 20),
-+ CCK_RATE(2, 55),
-+ CCK_RATE(3, 110),
- OFDM_RATE(0, 60),
- OFDM_RATE(1, 90),
- OFDM_RATE(2, 120),
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/Makefile b/drivers/net/wireless/mediatek/mt76/mt7915/Makefile
-index 80e49244348e..40c8061787e9 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/Makefile
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/Makefile
-@@ -1,4 +1,4 @@
--# SPDX-License-Identifier: ISC
-+#SPDX-License-Identifier: ISC
-
- obj-$(CONFIG_MT7915E) += mt7915e.o
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c b/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
-index 64048243e34b..6a8ddeeecbe9 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
-@@ -3,7 +3,6 @@
-
- #include "mt7915.h"
- #include "eeprom.h"
--#include "mcu.h"
-
- /** global debugfs **/
-
-@@ -17,7 +16,7 @@ mt7915_implicit_txbf_set(void *data, u64 val)
-
- dev->ibf = !!val;
-
-- return mt7915_mcu_set_txbf(dev, MT_BF_TYPE_UPDATE);
-+ return mt7915_mcu_set_txbf_type(dev);
- }
-
- static int
-@@ -148,9 +147,6 @@ mt7915_txbf_stat_read_phy(struct mt7915_phy *phy, struct seq_file *s)
- {
- struct mt7915_dev *dev = s->private;
- bool ext_phy = phy != &dev->phy;
-- static const char * const bw[] = {
-- "BW20", "BW40", "BW80", "BW160"
-- };
- int cnt;
-
- if (!phy)
-@@ -168,16 +164,11 @@ mt7915_txbf_stat_read_phy(struct mt7915_phy *phy, struct seq_file *s)
- seq_puts(s, "Tx Beamformer Rx feedback statistics: ");
-
- cnt = mt76_rr(dev, MT_ETBF_RX_FB_CNT(ext_phy));
-- seq_printf(s, "All: %ld, HE: %ld, VHT: %ld, HT: %ld, ",
-+ seq_printf(s, "All: %ld, HE: %ld, VHT: %ld, HT: %ld\n",
- FIELD_GET(MT_ETBF_RX_FB_ALL, cnt),
- FIELD_GET(MT_ETBF_RX_FB_HE, cnt),
- FIELD_GET(MT_ETBF_RX_FB_VHT, cnt),
- FIELD_GET(MT_ETBF_RX_FB_HT, cnt));
-- cnt = mt76_rr(dev, MT_ETBF_RX_FB_CONT(ext_phy));
-- seq_printf(s, "%s, NC: %ld, NR: %ld\n",
-- bw[FIELD_GET(MT_ETBF_RX_FB_BW, cnt)],
-- FIELD_GET(MT_ETBF_RX_FB_NC, cnt),
-- FIELD_GET(MT_ETBF_RX_FB_NR, cnt));
-
- /* Tx Beamformee Rx NDPA & Tx feedback report */
- cnt = mt76_rr(dev, MT_ETBF_TX_NDP_BFRP(ext_phy));
-@@ -213,7 +204,7 @@ mt7915_tx_stats_show(struct seq_file *file, void *data)
- mt7915_txbf_stat_read_phy(mt7915_ext_phy(dev), file);
-
- /* Tx amsdu info */
-- seq_puts(file, "Tx MSDU statistics:\n");
-+ seq_puts(file, "Tx MSDU stat:\n");
- for (i = 0, n = 0; i < ARRAY_SIZE(stat); i++) {
- stat[i] = mt76_rr(dev, MT_PLE_AMSDU_PACK_MSDU_CNT(i));
- n += stat[i];
-@@ -233,6 +224,18 @@ mt7915_tx_stats_show(struct seq_file *file, void *data)
-
- DEFINE_SHOW_ATTRIBUTE(mt7915_tx_stats);
-
-+static int mt7915_read_temperature(struct seq_file *s, void *data)
-+{
-+ struct mt7915_dev *dev = dev_get_drvdata(s->private);
-+ int temp;
-+
-+ /* cpu */
-+ temp = mt7915_mcu_get_temperature(dev, 0);
-+ seq_printf(s, "Temperature: %d\n", temp);
-+
-+ return 0;
-+}
-+
- static int
- mt7915_queues_acq(struct seq_file *s, void *data)
- {
-@@ -304,23 +307,54 @@ mt7915_puts_rate_txpower(struct seq_file *s, struct mt7915_phy *phy)
- "RU26", "RU52", "RU106", "RU242/SU20",
- "RU484/SU40", "RU996/SU80", "RU2x996/SU160"
- };
-- s8 txpower[MT7915_SKU_RATE_NUM], *buf;
-- int i;
-+ struct mt7915_dev *dev = dev_get_drvdata(s->private);
-+ bool ext_phy = phy != &dev->phy;
-+ u32 reg_base;
-+ int i, idx = 0;
-
- if (!phy)
- return;
-
-- seq_printf(s, "\nBand %d\n", phy != &phy->dev->phy);
-+ reg_base = MT_TMAC_FP0R0(ext_phy);
-+ seq_printf(s, "\nBand %d\n", ext_phy);
-
-- mt7915_mcu_get_txpower_sku(phy, txpower, sizeof(txpower));
-- for (i = 0, buf = txpower; i < ARRAY_SIZE(mt7915_sku_group_len); i++) {
-- u8 mcs_num = mt7915_sku_group_len[i];
-+ for (i = 0; i < ARRAY_SIZE(mt7915_sku_group_len); i++) {
-+ u8 cnt, mcs_num = mt7915_sku_group_len[i];
-+ s8 txpower[12];
-+ int j;
-
-- if (i >= SKU_VHT_BW20 && i <= SKU_VHT_BW160)
-+ if (i == SKU_HT_BW20 || i == SKU_HT_BW40) {
-+ mcs_num = 8;
-+ } else if (i >= SKU_VHT_BW20 && i <= SKU_VHT_BW160) {
- mcs_num = 10;
-+ } else if (i == SKU_HE_RU26) {
-+ reg_base = MT_TMAC_FP0R18(ext_phy);
-+ idx = 0;
-+ }
-+
-+ for (j = 0, cnt = 0; j < DIV_ROUND_UP(mcs_num, 4); j++) {
-+ u32 val;
-+
-+ if (i == SKU_VHT_BW160 && idx == 60) {
-+ reg_base = MT_TMAC_FP0R15(ext_phy);
-+ idx = 0;
-+ }
-+
-+ val = mt76_rr(dev, reg_base + (idx / 4) * 4);
-+
-+ if (idx && idx % 4)
-+ val >>= (idx % 4) * 8;
-+
-+ while (val > 0 && cnt < mcs_num) {
-+ s8 pwr = FIELD_GET(MT_TMAC_FP_MASK, val);
-+
-+ txpower[cnt++] = pwr;
-+ val >>= 8;
-+ idx++;
-+ }
-+ }
-
-- mt76_seq_puts_array(s, sku_group_name[i], buf, mcs_num);
-- buf += mt7915_sku_group_len[i];
-+ mt76_seq_puts_array(s, sku_group_name[i], txpower, mcs_num);
- }
- }
-
-@@ -356,6 +390,8 @@ int mt7915_init_debugfs(struct mt7915_dev *dev)
- debugfs_create_file("radar_trigger", 0200, dir, dev,
- &fops_radar_trigger);
- debugfs_create_file("ser_trigger", 0200, dir, dev, &fops_ser_trigger);
-+ debugfs_create_devm_seqfile(dev->mt76.dev, "temperature", dir,
-+ mt7915_read_temperature);
- debugfs_create_devm_seqfile(dev->mt76.dev, "txpower_sku", dir,
- mt7915_read_rate_txpower);
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/dma.c b/drivers/net/wireless/mediatek/mt76/mt7915/dma.c
-index 9182568f95c7..11d0b760abd7 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/dma.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/dma.c
-@@ -19,6 +19,39 @@ int mt7915_init_tx_queues(struct mt7915_phy *phy, int idx, int n_desc)
- return 0;
- }
-
-+void mt7915_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
-+ struct sk_buff *skb)
-+{
-+ struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
-+ __le32 *rxd = (__le32 *)skb->data;
-+ enum rx_pkt_type type;
-+
-+ type = FIELD_GET(MT_RXD0_PKT_TYPE, le32_to_cpu(rxd[0]));
-+
-+ switch (type) {
-+ case PKT_TYPE_TXRX_NOTIFY:
-+ mt7915_mac_tx_free(dev, skb);
-+ break;
-+ case PKT_TYPE_RX_EVENT:
-+ mt7915_mcu_rx_event(dev, skb);
-+ break;
-+#ifdef CONFIG_NL80211_TESTMODE
-+ case PKT_TYPE_TXRXV:
-+ mt7915_mac_fill_rx_vector(dev, skb);
-+ break;
-+#endif
-+ case PKT_TYPE_NORMAL:
-+ if (!mt7915_mac_fill_rx(dev, skb)) {
-+ mt76_rx(&dev->mt76, q, skb);
-+ return;
-+ }
-+ fallthrough;
-+ default:
-+ dev_kfree_skb(skb);
-+ break;
-+ }
-+}
-+
- static void
- mt7915_tx_cleanup(struct mt7915_dev *dev)
- {
-@@ -79,6 +112,8 @@ void mt7915_dma_prefetch(struct mt7915_dev *dev)
-
- int mt7915_dma_init(struct mt7915_dev *dev)
- {
-+ /* Increase buffer size to receive large VHT/HE MPDUs */
-+ int rx_buf_size = MT_RX_BUF_SIZE * 2;
- u32 hif1_ofs = 0;
- int ret;
-
-@@ -142,28 +177,28 @@ int mt7915_dma_init(struct mt7915_dev *dev)
- /* event from WM */
- ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU],
- MT7915_RXQ_MCU_WM, MT7915_RX_MCU_RING_SIZE,
-- MT_RX_BUF_SIZE, MT_RX_EVENT_RING_BASE);
-+ rx_buf_size, MT_RX_EVENT_RING_BASE);
- if (ret)
- return ret;
-
- /* event from WA */
- ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU_WA],
- MT7915_RXQ_MCU_WA, MT7915_RX_MCU_RING_SIZE,
-- MT_RX_BUF_SIZE, MT_RX_EVENT_RING_BASE);
-+ rx_buf_size, MT_RX_EVENT_RING_BASE);
- if (ret)
- return ret;
-
- /* rx data queue */
- ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MAIN],
- MT7915_RXQ_BAND0, MT7915_RX_RING_SIZE,
-- MT_RX_BUF_SIZE, MT_RX_DATA_RING_BASE);
-+ rx_buf_size, MT_RX_DATA_RING_BASE);
- if (ret)
- return ret;
-
- if (dev->dbdc_support) {
- ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_EXT],
- MT7915_RXQ_BAND1, MT7915_RX_RING_SIZE,
-- MT_RX_BUF_SIZE,
-+ rx_buf_size,
- MT_RX_DATA_RING_BASE + hif1_ofs);
- if (ret)
- return ret;
-@@ -172,7 +207,7 @@ int mt7915_dma_init(struct mt7915_dev *dev)
- ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_EXT_WA],
- MT7915_RXQ_MCU_WA_EXT,
- MT7915_RX_MCU_RING_SIZE,
-- MT_RX_BUF_SIZE,
-+ rx_buf_size,
- MT_RX_EVENT_RING_BASE + hif1_ofs);
- if (ret)
- return ret;
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c b/drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c
-index ee3d64434821..8ededf2e5279 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c
-@@ -4,12 +4,22 @@
- #include "mt7915.h"
- #include "eeprom.h"
-
-+static u32 mt7915_eeprom_read(struct mt7915_dev *dev, u32 offset)
-+{
-+ u8 *data = dev->mt76.eeprom.data;
-+
-+ if (data[offset] == 0xff && !dev->flash_mode)
-+ mt7915_mcu_get_eeprom(dev, offset);
-+
-+ return data[offset];
-+}
-+
- static int mt7915_eeprom_load_precal(struct mt7915_dev *dev)
- {
- struct mt76_dev *mdev = &dev->mt76;
-- u8 *eeprom = mdev->eeprom.data;
-- u32 val = eeprom[MT_EE_DO_PRE_CAL];
-+ u32 val;
-
-+ val = mt7915_eeprom_read(dev, MT_EE_DO_PRE_CAL);
- if (val != (MT_EE_WIFI_CAL_DPD | MT_EE_WIFI_CAL_GROUP))
- return 0;
-
-@@ -33,13 +43,7 @@ static int mt7915_eeprom_load(struct mt7915_dev *dev)
- dev->flash_mode = true;
- ret = mt7915_eeprom_load_precal(dev);
- } else {
-- u32 block_num, i;
--
-- block_num = DIV_ROUND_UP(MT7915_EEPROM_SIZE,
-- MT7915_EEPROM_BLOCK_SIZE);
-- for (i = 0; i < block_num; i++)
-- mt7915_mcu_get_eeprom(dev,
-- i * MT7915_EEPROM_BLOCK_SIZE);
-+ memset(dev->mt76.eeprom.data, -1, MT7915_EEPROM_SIZE);
- }
-
- return ret;
-@@ -48,7 +52,10 @@ static int mt7915_eeprom_load(struct mt7915_dev *dev)
- static int mt7915_check_eeprom(struct mt7915_dev *dev)
- {
- u8 *eeprom = dev->mt76.eeprom.data;
-- u16 val = get_unaligned_le16(eeprom);
-+ u16 val;
-+
-+ mt7915_eeprom_read(dev, MT_EE_CHIP_ID);
-+ val = get_unaligned_le16(eeprom);
-
- switch (val) {
- case 0x7915:
-@@ -62,10 +69,9 @@ void mt7915_eeprom_parse_band_config(struct mt7915_phy *phy)
- {
- struct mt7915_dev *dev = phy->dev;
- bool ext_phy = phy != &dev->phy;
-- u8 *eeprom = dev->mt76.eeprom.data;
- u32 val;
-
-- val = eeprom[MT_EE_WIFI_CONF + ext_phy];
-+ val = mt7915_eeprom_read(dev, MT_EE_WIFI_CONF + ext_phy);
- val = FIELD_GET(MT_EE_WIFI_CONF0_BAND_SEL, val);
- if (val == MT_EE_BAND_SEL_DEFAULT && dev->dbdc_support)
- val = ext_phy ? MT_EE_BAND_SEL_5GHZ : MT_EE_BAND_SEL_2GHZ;
-@@ -137,7 +143,6 @@ int mt7915_eeprom_get_target_power(struct mt7915_dev *dev,
- struct ieee80211_channel *chan,
- u8 chain_idx)
- {
-- u8 *eeprom = dev->mt76.eeprom.data;
- int index, target_power;
- bool tssi_on;
-
-@@ -148,18 +153,18 @@ int mt7915_eeprom_get_target_power(struct mt7915_dev *dev,
-
- if (chan->band == NL80211_BAND_2GHZ) {
- index = MT_EE_TX0_POWER_2G + chain_idx * 3;
-- target_power = eeprom[index];
-+ target_power = mt7915_eeprom_read(dev, index);
-
- if (!tssi_on)
-- target_power += eeprom[index + 1];
-+ target_power += mt7915_eeprom_read(dev, index + 1);
- } else {
- int group = mt7915_get_channel_group(chan->hw_value);
-
- index = MT_EE_TX0_POWER_5G + chain_idx * 12;
-- target_power = eeprom[index + group];
-+ target_power = mt7915_eeprom_read(dev, index + group);
-
- if (!tssi_on)
-- target_power += eeprom[index + 8];
-+ target_power += mt7915_eeprom_read(dev, index + 8);
- }
-
- return target_power;
-@@ -167,14 +172,13 @@ int mt7915_eeprom_get_target_power(struct mt7915_dev *dev,
-
- s8 mt7915_eeprom_get_power_delta(struct mt7915_dev *dev, int band)
- {
-- u8 *eeprom = dev->mt76.eeprom.data;
- u32 val;
- s8 delta;
-
- if (band == NL80211_BAND_2GHZ)
-- val = eeprom[MT_EE_RATE_DELTA_2G];
-+ val = mt7915_eeprom_read(dev, MT_EE_RATE_DELTA_2G);
- else
-- val = eeprom[MT_EE_RATE_DELTA_5G];
-+ val = mt7915_eeprom_read(dev, MT_EE_RATE_DELTA_5G);
-
- if (!(val & MT_EE_RATE_DELTA_EN))
- return 0;
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/init.c b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
-index 4798d6344305..feb2aa57ef22 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/init.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
-@@ -2,14 +2,39 @@
- /* Copyright (C) 2020 MediaTek Inc. */
-
- #include <linux/etherdevice.h>
--#include <linux/hwmon.h>
--#include <linux/hwmon-sysfs.h>
--#include <linux/thermal.h>
- #include "mt7915.h"
- #include "mac.h"
- #include "mcu.h"
- #include "eeprom.h"
-
-+#define CCK_RATE(_idx, _rate) { \
-+ .bitrate = _rate, \
-+ .flags = IEEE80211_RATE_SHORT_PREAMBLE, \
-+ .hw_value = (MT_PHY_TYPE_CCK << 8) | (_idx), \
-+ .hw_value_short = (MT_PHY_TYPE_CCK << 8) | (4 + (_idx)), \
-+}
-+
-+#define OFDM_RATE(_idx, _rate) { \
-+ .bitrate = _rate, \
-+ .hw_value = (MT_PHY_TYPE_OFDM << 8) | (_idx), \
-+ .hw_value_short = (MT_PHY_TYPE_OFDM << 8) | (_idx), \
-+}
-+
-+static struct ieee80211_rate mt7915_rates[] = {
-+ CCK_RATE(0, 10),
-+ CCK_RATE(1, 20),
-+ CCK_RATE(2, 55),
-+ CCK_RATE(3, 110),
-+ OFDM_RATE(11, 60),
-+ OFDM_RATE(15, 90),
-+ OFDM_RATE(10, 120),
-+ OFDM_RATE(14, 180),
-+ OFDM_RATE(9, 240),
-+ OFDM_RATE(13, 360),
-+ OFDM_RATE(8, 480),
-+ OFDM_RATE(12, 540),
-+};
-+
- static const struct ieee80211_iface_limit if_limits[] = {
- {
- .max = 1,
-@@ -42,117 +67,6 @@ static const struct ieee80211_iface_combination if_comb[] = {
- }
- };
-
--static ssize_t mt7915_thermal_show_temp(struct device *dev,
-- struct device_attribute *attr,
-- char *buf)
--{
-- struct mt7915_phy *phy = dev_get_drvdata(dev);
-- int temperature;
--
-- temperature = mt7915_mcu_get_temperature(phy);
-- if (temperature < 0)
-- return temperature;
--
-- /* display in millidegree celcius */
-- return sprintf(buf, "%u\n", temperature * 1000);
--}
--
--static SENSOR_DEVICE_ATTR(temp1_input, 0444, mt7915_thermal_show_temp,
-- NULL, 0);
--
--static struct attribute *mt7915_hwmon_attrs[] = {
-- &sensor_dev_attr_temp1_input.dev_attr.attr,
-- NULL,
--};
--ATTRIBUTE_GROUPS(mt7915_hwmon);
--
--static int
--mt7915_thermal_get_max_throttle_state(struct thermal_cooling_device *cdev,
-- unsigned long *state)
--{
-- *state = MT7915_THERMAL_THROTTLE_MAX;
--
-- return 0;
--}
--
--static int
--mt7915_thermal_get_cur_throttle_state(struct thermal_cooling_device *cdev,
-- unsigned long *state)
--{
-- struct mt7915_phy *phy = cdev->devdata;
--
-- *state = phy->throttle_state;
--
-- return 0;
--}
--
--static int
--mt7915_thermal_set_cur_throttle_state(struct thermal_cooling_device *cdev,
-- unsigned long state)
--{
-- struct mt7915_phy *phy = cdev->devdata;
-- int ret;
--
-- if (state > MT7915_THERMAL_THROTTLE_MAX)
-- return -EINVAL;
--
-- if (state == phy->throttle_state)
-- return 0;
--
-- ret = mt7915_mcu_set_thermal_throttling(phy, state);
-- if (ret)
-- return ret;
--
-- phy->throttle_state = state;
--
-- return 0;
--}
--
--static const struct thermal_cooling_device_ops mt7915_thermal_ops = {
-- .get_max_state = mt7915_thermal_get_max_throttle_state,
-- .get_cur_state = mt7915_thermal_get_cur_throttle_state,
-- .set_cur_state = mt7915_thermal_set_cur_throttle_state,
--};
--
--static void mt7915_unregister_thermal(struct mt7915_phy *phy)
--{
-- struct wiphy *wiphy = phy->mt76->hw->wiphy;
--
-- if (!phy->cdev)
-- return;
--
-- sysfs_remove_link(&wiphy->dev.kobj, "cooling_device");
-- thermal_cooling_device_unregister(phy->cdev);
--}
--
--static int mt7915_thermal_init(struct mt7915_phy *phy)
--{
-- struct wiphy *wiphy = phy->mt76->hw->wiphy;
-- struct thermal_cooling_device *cdev;
-- struct device *hwmon;
--
-- cdev = thermal_cooling_device_register(wiphy_name(wiphy), phy,
-- &mt7915_thermal_ops);
-- if (!IS_ERR(cdev)) {
-- if (sysfs_create_link(&wiphy->dev.kobj, &cdev->device.kobj,
-- "cooling_device") < 0)
-- thermal_cooling_device_unregister(cdev);
-- else
-- phy->cdev = cdev;
-- }
--
-- if (!IS_REACHABLE(CONFIG_HWMON))
-- return 0;
--
-- hwmon = devm_hwmon_device_register_with_groups(&wiphy->dev,
-- wiphy_name(wiphy), phy,
-- mt7915_hwmon_groups);
-- if (IS_ERR(hwmon))
-- return PTR_ERR(hwmon);
--
-- return 0;
--}
--
- static void
- mt7915_init_txpower(struct mt7915_dev *dev,
- struct ieee80211_supported_band *sband)
-@@ -287,6 +201,7 @@ mt7915_mac_init_band(struct mt7915_dev *dev, u8 band)
- FIELD_PREP(MT_MDP_RCFR1_RX_DROPPED_MCAST, MT_MDP_TO_HIF);
- mt76_rmw(dev, MT_MDP_BNRCFR1(band), mask, set);
-
-+ mt76_set(dev, MT_WF_RMAC_MIB_TIME0(band), MT_WF_RMAC_MIB_RXTIME_EN);
- mt76_set(dev, MT_WF_RMAC_MIB_AIRTIME0(band), MT_WF_RMAC_MIB_RXTIME_EN);
-
- mt76_rmw_field(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_MAX_RX_LEN, 1536);
-@@ -313,19 +228,20 @@ static int mt7915_txbf_init(struct mt7915_dev *dev)
- {
- int ret;
-
-+
- if (dev->dbdc_support) {
-- ret = mt7915_mcu_set_txbf(dev, MT_BF_MODULE_UPDATE);
-+ ret = mt7915_mcu_set_txbf_module(dev);
- if (ret)
- return ret;
- }
-
- /* trigger sounding packets */
-- ret = mt7915_mcu_set_txbf(dev, MT_BF_SOUNDING_ON);
-+ ret = mt7915_mcu_set_txbf_sounding(dev);
- if (ret)
- return ret;
-
- /* enable eBF */
-- return mt7915_mcu_set_txbf(dev, MT_BF_TYPE_UPDATE);
-+ return mt7915_mcu_set_txbf_type(dev);
- }
-
- static int mt7915_register_ext_phy(struct mt7915_dev *dev)
-@@ -365,12 +281,8 @@ static int mt7915_register_ext_phy(struct mt7915_dev *dev)
- if (ret)
- goto error;
-
-- ret = mt76_register_phy(mphy, true, mt76_rates,
-- ARRAY_SIZE(mt76_rates));
-- if (ret)
-- goto error;
--
-- ret = mt7915_thermal_init(phy);
-+ ret = mt76_register_phy(mphy, true, mt7915_rates,
-+ ARRAY_SIZE(mt7915_rates));
- if (ret)
- goto error;
-
-@@ -667,6 +579,8 @@ mt7915_init_he_caps(struct mt7915_phy *phy, enum nl80211_band band,
-
- switch (i) {
- case NL80211_IFTYPE_AP:
-+ he_cap_elem->mac_cap_info[0] |=
-+ IEEE80211_HE_MAC_CAP0_TWT_RES;
- he_cap_elem->mac_cap_info[2] |=
- IEEE80211_HE_MAC_CAP2_BSR;
- he_cap_elem->mac_cap_info[4] |=
-@@ -680,6 +594,8 @@ mt7915_init_he_caps(struct mt7915_phy *phy, enum nl80211_band band,
- IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT;
- break;
- case NL80211_IFTYPE_STATION:
-+ he_cap_elem->mac_cap_info[0] |=
-+ IEEE80211_HE_MAC_CAP0_TWT_REQ;
- he_cap_elem->mac_cap_info[1] |=
- IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US;
-
-@@ -774,7 +690,6 @@ static void mt7915_unregister_ext_phy(struct mt7915_dev *dev)
- if (!phy)
- return;
-
-- mt7915_unregister_thermal(phy);
- mt76_unregister_phy(mphy);
- ieee80211_free_hw(mphy->hw);
- }
-@@ -816,12 +731,8 @@ int mt7915_register_device(struct mt7915_dev *dev)
- dev->mt76.test_ops = &mt7915_testmode_ops;
- #endif
-
-- ret = mt76_register_device(&dev->mt76, true, mt76_rates,
-- ARRAY_SIZE(mt76_rates));
-- if (ret)
-- return ret;
--
-- ret = mt7915_thermal_init(&dev->phy);
-+ ret = mt76_register_device(&dev->mt76, true, mt7915_rates,
-+ ARRAY_SIZE(mt7915_rates));
- if (ret)
- return ret;
-
-@@ -837,12 +748,10 @@ int mt7915_register_device(struct mt7915_dev *dev)
- void mt7915_unregister_device(struct mt7915_dev *dev)
- {
- mt7915_unregister_ext_phy(dev);
-- mt7915_unregister_thermal(&dev->phy);
- mt76_unregister_device(&dev->mt76);
- mt7915_mcu_exit(dev);
- mt7915_tx_token_put(dev);
- mt7915_dma_cleanup(dev);
-- tasklet_disable(&dev->irq_tasklet);
-
- mt76_free_device(&dev->mt76);
- }
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
-index 2462704094b0..f4544c46c173 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
-@@ -307,8 +307,7 @@ mt7915_mac_decode_he_radiotap(struct sk_buff *skb,
- }
- }
-
--static int
--mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
-+int mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
- {
- struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
- struct mt76_phy *mphy = &dev->mt76.phy;
-@@ -624,10 +623,9 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
- return 0;
- }
-
--static void
--mt7915_mac_fill_rx_vector(struct mt7915_dev *dev, struct sk_buff *skb)
--{
- #ifdef CONFIG_NL80211_TESTMODE
-+void mt7915_mac_fill_rx_vector(struct mt7915_dev *dev, struct sk_buff *skb)
-+{
- struct mt7915_phy *phy = &dev->phy;
- __le32 *rxd = (__le32 *)skb->data;
- __le32 *rxv_hdr = rxd + 2;
-@@ -665,10 +663,10 @@ mt7915_mac_fill_rx_vector(struct mt7915_dev *dev, struct sk_buff *skb)
-
- phy->test.last_freq_offset = foe;
- phy->test.last_snr = snr;
--#endif
-
- dev_kfree_skb(skb);
- }
-+#endif
-
- static void
- mt7915_mac_write_txwi_tm(struct mt7915_phy *phy, __le32 *txwi,
-@@ -900,7 +898,7 @@ mt7915_mac_write_txwi_80211(struct mt7915_dev *dev, __le32 *txwi,
- }
-
- void mt7915_mac_write_txwi(struct mt7915_dev *dev, __le32 *txwi,
-- struct sk_buff *skb, struct mt76_wcid *wcid, int pid,
-+ struct sk_buff *skb, struct mt76_wcid *wcid,
- struct ieee80211_key_conf *key, bool beacon)
- {
- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-@@ -959,12 +957,7 @@ void mt7915_mac_write_txwi(struct mt7915_dev *dev, __le32 *txwi,
-
- txwi[3] = cpu_to_le32(val);
- txwi[4] = 0;
--
-- val = FIELD_PREP(MT_TXD5_PID, pid);
-- if (pid >= MT_PACKET_ID_FIRST)
-- val |= MT_TXD5_TX_STATUS_HOST;
-- txwi[5] = cpu_to_le32(val);
--
-+ txwi[5] = 0;
- txwi[6] = 0;
- txwi[7] = wcid->amsdu ? cpu_to_le32(MT_TXD7_HW_AMSDU) : 0;
-
-@@ -1004,11 +997,11 @@ int mt7915_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx_info->skb);
- struct ieee80211_key_conf *key = info->control.hw_key;
- struct ieee80211_vif *vif = info->control.vif;
-+ struct mt76_tx_cb *cb = mt76_tx_skb_cb(tx_info->skb);
- struct mt76_txwi_cache *t;
- struct mt7915_txp *txp;
- int id, i, nbuf = tx_info->nbuf - 1;
- u8 *txwi = (u8 *)txwi_ptr;
-- int pid;
-
- if (unlikely(tx_info->skb->len <= ETH_HLEN))
- return -EINVAL;
-@@ -1016,11 +1009,11 @@ int mt7915_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
- if (!wcid)
- wcid = &dev->mt76.global_wcid;
-
-- pid = mt76_tx_status_skb_add(mdev, wcid, tx_info->skb);
--
-- mt7915_mac_write_txwi(dev, txwi_ptr, tx_info->skb, wcid, pid, key,
-+ mt7915_mac_write_txwi(dev, txwi_ptr, tx_info->skb, wcid, key,
- false);
-
-+ cb->wcid = wcid->idx;
-+
- txp = (struct mt7915_txp *)(txwi + MT_TXD_SIZE);
- for (i = 0; i < nbuf; i++) {
- txp->buf[i] = cpu_to_le32(tx_info->buf[i + 1].addr);
-@@ -1091,50 +1084,65 @@ mt7915_tx_check_aggr(struct ieee80211_sta *sta, __le32 *txwi)
- }
-
- static void
--mt7915_txp_skb_unmap(struct mt76_dev *dev, struct mt76_txwi_cache *t)
-+mt7915_tx_complete_status(struct mt76_dev *mdev, struct sk_buff *skb,
-+ struct ieee80211_sta *sta, u8 stat,
-+ struct list_head *free_list)
- {
-- struct mt7915_txp *txp;
-- int i;
--
-- txp = mt7915_txwi_to_txp(dev, t);
-- for (i = 0; i < txp->nbuf; i++)
-- dma_unmap_single(dev->dev, le32_to_cpu(txp->buf[i]),
-- le16_to_cpu(txp->len[i]), DMA_TO_DEVICE);
--}
-+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-+ struct ieee80211_tx_status status = {
-+ .sta = sta,
-+ .info = info,
-+ .skb = skb,
-+ .free_list = free_list,
-+ };
-+ struct ieee80211_hw *hw;
-
--static void
--mt7915_txwi_free(struct mt7915_dev *dev, struct mt76_txwi_cache *t,
-- struct ieee80211_sta *sta, struct list_head *free_list)
--{
-- struct mt76_dev *mdev = &dev->mt76;
-- struct mt76_wcid *wcid;
-- __le32 *txwi;
-- u16 wcid_idx;
-+ if (sta) {
-+ struct mt7915_sta *msta;
-
-- mt7915_txp_skb_unmap(mdev, t);
-- if (!t->skb)
-- goto out;
-+ msta = (struct mt7915_sta *)sta->drv_priv;
-+ status.rate = &msta->stats.tx_rate;
-+ }
-
-- txwi = (__le32 *)mt76_get_txwi_ptr(mdev, t);
-- if (sta) {
-- wcid = (struct mt76_wcid *)sta->drv_priv;
-- wcid_idx = wcid->idx;
-+#ifdef CONFIG_NL80211_TESTMODE
-+ if (mt76_is_testmode_skb(mdev, skb, &hw)) {
-+ struct mt7915_phy *phy = mt7915_hw_phy(hw);
-+ struct ieee80211_vif *vif = phy->monitor_vif;
-+ struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
-
-- if (likely(t->skb->protocol != cpu_to_be16(ETH_P_PAE)))
-- mt7915_tx_check_aggr(sta, txwi);
-- } else {
-- wcid_idx = FIELD_GET(MT_TXD1_WLAN_IDX, le32_to_cpu(txwi[1]));
-+ mt76_tx_complete_skb(mdev, mvif->sta.wcid.idx, skb);
-+ return;
- }
-+#endif
-+
-+ hw = mt76_tx_status_get_hw(mdev, skb);
-
-- __mt76_tx_complete_skb(mdev, wcid_idx, t->skb, free_list);
-+ if (info->flags & IEEE80211_TX_CTL_AMPDU)
-+ info->flags |= IEEE80211_TX_STAT_AMPDU;
-
--out:
-- t->skb = NULL;
-- mt76_put_txwi(mdev, t);
-+ if (stat)
-+ ieee80211_tx_info_clear_status(info);
-+
-+ if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
-+ info->flags |= IEEE80211_TX_STAT_ACK;
-+
-+ info->status.tx_time = 0;
-+ ieee80211_tx_status_ext(hw, &status);
- }
-
--static void
--mt7915_mac_tx_free(struct mt7915_dev *dev, struct sk_buff *skb)
-+void mt7915_txp_skb_unmap(struct mt76_dev *dev,
-+ struct mt76_txwi_cache *t)
-+{
-+ struct mt7915_txp *txp;
-+ int i;
-+
-+ txp = mt7915_txwi_to_txp(dev, t);
-+ for (i = 0; i < txp->nbuf; i++)
-+ dma_unmap_single(dev->dev, le32_to_cpu(txp->buf[i]),
-+ le16_to_cpu(txp->len[i]), DMA_TO_DEVICE);
-+}
-+
-+void mt7915_mac_tx_free(struct mt7915_dev *dev, struct sk_buff *skb)
- {
- struct mt7915_tx_free *free = (struct mt7915_tx_free *)skb->data;
- struct mt76_dev *mdev = &dev->mt76;
-@@ -1199,7 +1207,28 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, struct sk_buff *skb)
- if (!txwi)
- continue;
-
-- mt7915_txwi_free(dev, txwi, sta, &free_list);
-+ mt7915_txp_skb_unmap(mdev, txwi);
-+ if (txwi->skb) {
-+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(txwi->skb);
-+ void *txwi_ptr = mt76_get_txwi_ptr(mdev, txwi);
-+
-+ if (likely(txwi->skb->protocol != cpu_to_be16(ETH_P_PAE)))
-+ mt7915_tx_check_aggr(sta, txwi_ptr);
-+
-+ if (sta && !info->tx_time_est) {
-+ struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
-+ int pending;
-+
-+ pending = atomic_dec_return(&wcid->non_aql_packets);
-+ if (pending < 0)
-+ atomic_cmpxchg(&wcid->non_aql_packets, pending, 0);
-+ }
-+
-+ mt7915_tx_complete_status(mdev, txwi->skb, sta, stat, &free_list);
-+ txwi->skb = NULL;
-+ }
-+
-+ mt76_put_txwi(mdev, txwi);
- }
-
- mt7915_mac_sta_poll(dev);
-@@ -1217,120 +1246,6 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, struct sk_buff *skb)
- }
- }
-
--static bool
--mt7915_mac_add_txs_skb(struct mt7915_dev *dev, struct mt76_wcid *wcid, int pid,
-- __le32 *txs_data)
--{
-- struct mt76_dev *mdev = &dev->mt76;
-- struct ieee80211_tx_info *info;
-- struct sk_buff_head list;
-- struct sk_buff *skb;
--
-- mt76_tx_status_lock(mdev, &list);
-- skb = mt76_tx_status_skb_get(mdev, wcid, pid, &list);
-- if (!skb)
-- goto out;
--
-- info = IEEE80211_SKB_CB(skb);
-- if (!(txs_data[0] & le32_to_cpu(MT_TXS0_ACK_ERROR_MASK)))
-- info->flags |= IEEE80211_TX_STAT_ACK;
--
-- info->status.ampdu_len = 1;
-- info->status.ampdu_ack_len = !!(info->flags &
-- IEEE80211_TX_STAT_ACK);
--
-- info->status.rates[0].idx = -1;
-- mt76_tx_status_skb_done(mdev, skb, &list);
--
--out:
-- mt76_tx_status_unlock(mdev, &list);
--
-- return !!skb;
--}
--
--static void mt7915_mac_add_txs(struct mt7915_dev *dev, void *data)
--{
-- struct mt7915_sta *msta = NULL;
-- struct mt76_wcid *wcid;
-- __le32 *txs_data = data;
-- u16 wcidx;
-- u32 txs;
-- u8 pid;
--
-- txs = le32_to_cpu(txs_data[0]);
-- if (FIELD_GET(MT_TXS0_TXS_FORMAT, txs) > 1)
-- return;
--
-- txs = le32_to_cpu(txs_data[2]);
-- wcidx = FIELD_GET(MT_TXS2_WCID, txs);
--
-- txs = le32_to_cpu(txs_data[3]);
-- pid = FIELD_GET(MT_TXS3_PID, txs);
--
-- if (pid < MT_PACKET_ID_FIRST)
-- return;
--
-- if (wcidx >= MT7915_WTBL_SIZE)
-- return;
--
-- rcu_read_lock();
--
-- wcid = rcu_dereference(dev->mt76.wcid[wcidx]);
-- if (!wcid)
-- goto out;
--
-- mt7915_mac_add_txs_skb(dev, wcid, pid, txs_data);
--
-- if (!wcid->sta)
-- goto out;
--
-- msta = container_of(wcid, struct mt7915_sta, wcid);
-- spin_lock_bh(&dev->sta_poll_lock);
-- if (list_empty(&msta->poll_list))
-- list_add_tail(&msta->poll_list, &dev->sta_poll_list);
-- spin_unlock_bh(&dev->sta_poll_lock);
--
--out:
-- rcu_read_unlock();
--}
--
--void mt7915_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
-- struct sk_buff *skb)
--{
-- struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
-- __le32 *rxd = (__le32 *)skb->data;
-- __le32 *end = (__le32 *)&skb->data[skb->len];
-- enum rx_pkt_type type;
--
-- type = FIELD_GET(MT_RXD0_PKT_TYPE, le32_to_cpu(rxd[0]));
--
-- switch (type) {
-- case PKT_TYPE_TXRX_NOTIFY:
-- mt7915_mac_tx_free(dev, skb);
-- break;
-- case PKT_TYPE_RX_EVENT:
-- mt7915_mcu_rx_event(dev, skb);
-- break;
-- case PKT_TYPE_TXRXV:
-- mt7915_mac_fill_rx_vector(dev, skb);
-- break;
-- case PKT_TYPE_TXS:
-- for (rxd += 2; rxd + 8 <= end; rxd += 8)
-- mt7915_mac_add_txs(dev, rxd);
-- dev_kfree_skb(skb);
-- break;
-- case PKT_TYPE_NORMAL:
-- if (!mt7915_mac_fill_rx(dev, skb)) {
-- mt76_rx(&dev->mt76, q, skb);
-- return;
-- }
-- fallthrough;
-- default:
-- dev_kfree_skb(skb);
-- break;
-- }
--}
--
- void mt7915_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e)
- {
- struct mt7915_dev *dev;
-@@ -1352,8 +1267,15 @@ void mt7915_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e)
- e->skb = t ? t->skb : NULL;
- }
-
-- if (e->skb)
-- mt76_tx_complete_skb(mdev, e->wcid, e->skb);
-+ if (e->skb) {
-+ struct mt76_tx_cb *cb = mt76_tx_skb_cb(e->skb);
-+ struct mt76_wcid *wcid;
-+
-+ wcid = rcu_dereference(dev->mt76.wcid[cb->wcid]);
-+
-+ mt7915_tx_complete_status(mdev, e->skb, wcid_to_sta(wcid), 0,
-+ NULL);
-+ }
- }
-
- void mt7915_mac_cca_stats_reset(struct mt7915_phy *phy)
-@@ -1387,10 +1309,14 @@ void mt7915_mac_reset_counters(struct mt7915_phy *phy)
- memset(&dev->mt76.aggr_stats[i], 0, sizeof(dev->mt76.aggr_stats) / 2);
-
- /* reset airtime counters */
-+ mt76_rr(dev, MT_MIB_SDR9(ext_phy));
-+ mt76_rr(dev, MT_MIB_SDR36(ext_phy));
-+ mt76_rr(dev, MT_MIB_SDR37(ext_phy));
-+
-+ mt76_set(dev, MT_WF_RMAC_MIB_TIME0(ext_phy),
-+ MT_WF_RMAC_MIB_RXTIME_CLR);
- mt76_set(dev, MT_WF_RMAC_MIB_AIRTIME0(ext_phy),
- MT_WF_RMAC_MIB_RXTIME_CLR);
--
-- mt7915_mcu_get_chan_mib_info(phy, true);
- }
-
- void mt7915_mac_set_timing(struct mt7915_phy *phy)
-@@ -1484,24 +1410,53 @@ mt7915_phy_get_nf(struct mt7915_phy *phy, int idx)
- return sum / n;
- }
-
--void mt7915_update_channel(struct mt76_phy *mphy)
-+static void
-+mt7915_phy_update_channel(struct mt76_phy *mphy, int idx)
- {
-+ struct mt7915_dev *dev = container_of(mphy->dev, struct mt7915_dev, mt76);
- struct mt7915_phy *phy = (struct mt7915_phy *)mphy->priv;
-- struct mt76_channel_state *state = mphy->chan_state;
-- bool ext_phy = phy != &phy->dev->phy;
-+ struct mt76_channel_state *state;
-+ u64 busy_time, tx_time, rx_time, obss_time;
- int nf;
-
-- mt7915_mcu_get_chan_mib_info(phy, false);
-+ busy_time = mt76_get_field(dev, MT_MIB_SDR9(idx),
-+ MT_MIB_SDR9_BUSY_MASK);
-+ tx_time = mt76_get_field(dev, MT_MIB_SDR36(idx),
-+ MT_MIB_SDR36_TXTIME_MASK);
-+ rx_time = mt76_get_field(dev, MT_MIB_SDR37(idx),
-+ MT_MIB_SDR37_RXTIME_MASK);
-+ obss_time = mt76_get_field(dev, MT_WF_RMAC_MIB_AIRTIME14(idx),
-+ MT_MIB_OBSSTIME_MASK);
-
-- nf = mt7915_phy_get_nf(phy, ext_phy);
-+ nf = mt7915_phy_get_nf(phy, idx);
- if (!phy->noise)
- phy->noise = nf << 4;
- else if (nf)
- phy->noise += nf - (phy->noise >> 4);
-
-+ state = mphy->chan_state;
-+ state->cc_busy += busy_time;
-+ state->cc_tx += tx_time;
-+ state->cc_rx += rx_time + obss_time;
-+ state->cc_bss_rx += rx_time;
- state->noise = -(phy->noise >> 4);
- }
-
-+void mt7915_update_channel(struct mt76_dev *mdev)
-+{
-+ struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
-+
-+ mt7915_phy_update_channel(&mdev->phy, 0);
-+ if (mdev->phy2)
-+ mt7915_phy_update_channel(mdev->phy2, 1);
-+
-+ /* reset obss airtime */
-+ mt76_set(dev, MT_WF_RMAC_MIB_TIME0(0), MT_WF_RMAC_MIB_RXTIME_CLR);
-+ if (mdev->phy2)
-+ mt76_set(dev, MT_WF_RMAC_MIB_TIME0(1),
-+ MT_WF_RMAC_MIB_RXTIME_CLR);
-+}
-+
- static bool
- mt7915_wait_reset_state(struct mt7915_dev *dev, u32 state)
- {
-@@ -1588,18 +1543,14 @@ mt7915_dma_reset(struct mt7915_dev *dev)
- mt76_set(dev, MT_WFDMA0_GLO_CFG,
- MT_WFDMA0_GLO_CFG_TX_DMA_EN | MT_WFDMA0_GLO_CFG_RX_DMA_EN);
- mt76_set(dev, MT_WFDMA1_GLO_CFG,
-- MT_WFDMA1_GLO_CFG_TX_DMA_EN | MT_WFDMA1_GLO_CFG_RX_DMA_EN |
-- MT_WFDMA1_GLO_CFG_OMIT_TX_INFO |
-- MT_WFDMA1_GLO_CFG_OMIT_RX_INFO);
-+ MT_WFDMA1_GLO_CFG_TX_DMA_EN | MT_WFDMA1_GLO_CFG_RX_DMA_EN);
- if (dev->hif2) {
- mt76_set(dev, MT_WFDMA0_GLO_CFG + hif1_ofs,
- (MT_WFDMA0_GLO_CFG_TX_DMA_EN |
- MT_WFDMA0_GLO_CFG_RX_DMA_EN));
- mt76_set(dev, MT_WFDMA1_GLO_CFG + hif1_ofs,
- (MT_WFDMA1_GLO_CFG_TX_DMA_EN |
-- MT_WFDMA1_GLO_CFG_RX_DMA_EN |
-- MT_WFDMA1_GLO_CFG_OMIT_TX_INFO |
-- MT_WFDMA1_GLO_CFG_OMIT_RX_INFO));
-+ MT_WFDMA1_GLO_CFG_RX_DMA_EN));
- }
- }
-
-@@ -1610,7 +1561,14 @@ void mt7915_tx_token_put(struct mt7915_dev *dev)
-
- spin_lock_bh(&dev->mt76.token_lock);
- idr_for_each_entry(&dev->mt76.token, txwi, id) {
-- mt7915_txwi_free(dev, txwi, NULL, NULL);
-+ mt7915_txp_skb_unmap(&dev->mt76, txwi);
-+ if (txwi->skb) {
-+ struct ieee80211_hw *hw;
-+
-+ hw = mt76_tx_status_get_hw(&dev->mt76, txwi->skb);
-+ ieee80211_free_txskb(hw, txwi->skb);
-+ }
-+ mt76_put_txwi(&dev->mt76, txwi);
- dev->mt76.token_count--;
- }
- spin_unlock_bh(&dev->mt76.token_lock);
-@@ -1643,6 +1601,11 @@ void mt7915_mac_reset_work(struct work_struct *work)
- set_bit(MT76_RESET, &phy2->mt76->state);
- cancel_delayed_work_sync(&phy2->mt76->mac_work);
- }
-+ /* lock/unlock all queues to ensure that no tx is pending */
-+ mt76_txq_schedule_all(&dev->mphy);
-+ if (ext_phy)
-+ mt76_txq_schedule_all(ext_phy);
-+
- mt76_worker_disable(&dev->mt76.tx_worker);
- napi_disable(&dev->mt76.napi[0]);
- napi_disable(&dev->mt76.napi[1]);
-@@ -1668,6 +1631,10 @@ void mt7915_mac_reset_work(struct work_struct *work)
- if (phy2)
- clear_bit(MT76_RESET, &phy2->mt76->state);
-
-+ mt76_worker_enable(&dev->mt76.tx_worker);
-+ napi_enable(&dev->mt76.tx_napi);
-+ napi_schedule(&dev->mt76.tx_napi);
-+
- napi_enable(&dev->mt76.napi[0]);
- napi_schedule(&dev->mt76.napi[0]);
-
-@@ -1676,20 +1643,14 @@ void mt7915_mac_reset_work(struct work_struct *work)
-
- napi_enable(&dev->mt76.napi[2]);
- napi_schedule(&dev->mt76.napi[2]);
-- tasklet_schedule(&dev->irq_tasklet);
--
-- mt76_wr(dev, MT_MCU_INT_EVENT, MT_MCU_INT_EVENT_RESET_DONE);
-- mt7915_wait_reset_state(dev, MT_MCU_CMD_NORMAL_STATE);
--
-- mt76_worker_enable(&dev->mt76.tx_worker);
--
-- napi_enable(&dev->mt76.tx_napi);
-- napi_schedule(&dev->mt76.tx_napi);
-
- ieee80211_wake_queues(mt76_hw(dev));
- if (ext_phy)
- ieee80211_wake_queues(ext_phy->hw);
-
-+ mt76_wr(dev, MT_MCU_INT_EVENT, MT_MCU_INT_EVENT_RESET_DONE);
-+ mt7915_wait_reset_state(dev, MT_MCU_CMD_NORMAL_STATE);
-+
- mutex_unlock(&dev->mt76.mutex);
-
- mt7915_update_beacons(dev);
-@@ -1703,7 +1664,7 @@ void mt7915_mac_reset_work(struct work_struct *work)
- }
-
- static void
--mt7915_mac_update_stats(struct mt7915_phy *phy)
-+mt7915_mac_update_mib_stats(struct mt7915_phy *phy)
- {
- struct mt7915_dev *dev = phy->dev;
- struct mib_stats *mib = &phy->mib;
-@@ -1785,10 +1746,8 @@ void mt7915_mac_sta_rc_work(struct work_struct *work)
-
- if (changed & (IEEE80211_RC_SUPP_RATES_CHANGED |
- IEEE80211_RC_NSS_CHANGED |
-- IEEE80211_RC_BW_CHANGED)) {
-- mt7915_mcu_add_he(dev, vif, sta);
-+ IEEE80211_RC_BW_CHANGED))
- mt7915_mcu_add_rate_ctrl(dev, vif, sta);
-- }
-
- if (changed & IEEE80211_RC_SMPS_CHANGED)
- mt7915_mcu_add_smps(dev, vif, sta);
-@@ -1810,11 +1769,11 @@ void mt7915_mac_work(struct work_struct *work)
-
- mutex_lock(&mphy->dev->mutex);
-
-- mt76_update_survey(mphy);
-+ mt76_update_survey(mphy->dev);
- if (++mphy->mac_work_count == 5) {
- mphy->mac_work_count = 0;
-
-- mt7915_mac_update_stats(phy);
-+ mt7915_mac_update_mib_stats(phy);
- }
-
- if (++phy->sta_work_count == 10) {
-@@ -1824,8 +1783,6 @@ void mt7915_mac_work(struct work_struct *work)
-
- mutex_unlock(&mphy->dev->mutex);
-
-- mt76_tx_status_check(mphy->dev, NULL, false);
--
- ieee80211_queue_delayed_work(mphy->hw, &mphy->mac_work,
- MT7915_WATCHDOG_TIME);
- }
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.h b/drivers/net/wireless/mediatek/mt76/mt7915/mac.h
-index eb1885f4bd8e..0f929fb53027 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.h
-@@ -304,62 +304,6 @@ struct mt7915_tx_free {
- /* will support this field in further revision */
- #define MT_TX_FREE_RATE GENMASK(13, 0)
-
--#define MT_TXS0_FIXED_RATE BIT(31)
--#define MT_TXS0_BW GENMASK(30, 29)
--#define MT_TXS0_TID GENMASK(28, 26)
--#define MT_TXS0_AMPDU BIT(25)
--#define MT_TXS0_TXS_FORMAT GENMASK(24, 23)
--#define MT_TXS0_BA_ERROR BIT(22)
--#define MT_TXS0_PS_FLAG BIT(21)
--#define MT_TXS0_TXOP_TIMEOUT BIT(20)
--#define MT_TXS0_BIP_ERROR BIT(19)
--
--#define MT_TXS0_QUEUE_TIMEOUT BIT(18)
--#define MT_TXS0_RTS_TIMEOUT BIT(17)
--#define MT_TXS0_ACK_TIMEOUT BIT(16)
--#define MT_TXS0_ACK_ERROR_MASK GENMASK(18, 16)
--
--#define MT_TXS0_TX_STATUS_HOST BIT(15)
--#define MT_TXS0_TX_STATUS_MCU BIT(14)
--#define MT_TXS0_TX_RATE GENMASK(13, 0)
--
--#define MT_TXS1_SEQNO GENMASK(31, 20)
--#define MT_TXS1_RESP_RATE GENMASK(19, 16)
--#define MT_TXS1_RXV_SEQNO GENMASK(15, 8)
--#define MT_TXS1_TX_POWER_DBM GENMASK(7, 0)
--
--#define MT_TXS2_BF_STATUS GENMASK(31, 30)
--#define MT_TXS2_LAST_TX_RATE GENMASK(29, 27)
--#define MT_TXS2_SHARED_ANTENNA BIT(26)
--#define MT_TXS2_WCID GENMASK(25, 16)
--#define MT_TXS2_TX_DELAY GENMASK(15, 0)
--
--#define MT_TXS3_PID GENMASK(31, 24)
--#define MT_TXS3_ANT_ID GENMASK(23, 0)
--
--#define MT_TXS4_TIMESTAMP GENMASK(31, 0)
--
--#define MT_TXS5_F0_FINAL_MPDU BIT(31)
--#define MT_TXS5_F0_QOS BIT(30)
--#define MT_TXS5_F0_TX_COUNT GENMASK(29, 25)
--#define MT_TXS5_F0_FRONT_TIME GENMASK(24, 0)
--#define MT_TXS5_F1_MPDU_TX_COUNT GENMASK(31, 24)
--#define MT_TXS5_F1_MPDU_TX_BYTES GENMASK(23, 0)
--
--#define MT_TXS6_F0_NOISE_3 GENMASK(31, 24)
--#define MT_TXS6_F0_NOISE_2 GENMASK(23, 16)
--#define MT_TXS6_F0_NOISE_1 GENMASK(15, 8)
--#define MT_TXS6_F0_NOISE_0 GENMASK(7, 0)
--#define MT_TXS6_F1_MPDU_FAIL_COUNT GENMASK(31, 24)
--#define MT_TXS6_F1_MPDU_FAIL_BYTES GENMASK(23, 0)
--
--#define MT_TXS7_F0_RCPI_3 GENMASK(31, 24)
--#define MT_TXS7_F0_RCPI_2 GENMASK(23, 16)
--#define MT_TXS7_F0_RCPI_1 GENMASK(15, 8)
--#define MT_TXS7_F0_RCPI_0 GENMASK(7, 0)
--#define MT_TXS7_F1_MPDU_RETRY_COUNT GENMASK(31, 24)
--#define MT_TXS7_F1_MPDU_RETRY_BYTES GENMASK(23, 0)
--
- struct mt7915_dfs_pulse {
- u32 max_width; /* us */
- int max_pwr; /* dbm */
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/main.c b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
-index c25f8da590dd..e5bd687546b6 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/main.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
-@@ -139,6 +139,12 @@ static int get_omac_idx(enum nl80211_iftype type, u64 mask)
- if (type != NL80211_IFTYPE_STATION)
- break;
-
-+ /* next, try to find a free repeater entry for the sta */
-+ i = get_free_idx(mask >> REPEATER_BSSID_START, 0,
-+ REPEATER_BSSID_MAX - REPEATER_BSSID_START);
-+ if (i)
-+ return i + 32 - 1;
-+
- i = get_free_idx(mask, EXT_BSSID_1, EXT_BSSID_MAX);
- if (i)
- return i - 1;
-@@ -166,22 +172,6 @@ static int get_omac_idx(enum nl80211_iftype type, u64 mask)
- return -1;
- }
-
--static void mt7915_init_bitrate_mask(struct ieee80211_vif *vif)
--{
-- struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
-- int i;
--
-- for (i = 0; i < ARRAY_SIZE(mvif->bitrate_mask.control); i++) {
-- mvif->bitrate_mask.control[i].legacy = GENMASK(31, 0);
-- memset(mvif->bitrate_mask.control[i].ht_mcs, GENMASK(7, 0),
-- sizeof(mvif->bitrate_mask.control[i].ht_mcs));
-- memset(mvif->bitrate_mask.control[i].vht_mcs, GENMASK(15, 0),
-- sizeof(mvif->bitrate_mask.control[i].vht_mcs));
-- memset(mvif->bitrate_mask.control[i].he_mcs, GENMASK(15, 0),
-- sizeof(mvif->bitrate_mask.control[i].he_mcs));
-- }
--}
--
- static int mt7915_add_interface(struct ieee80211_hw *hw,
- struct ieee80211_vif *vif)
- {
-@@ -251,8 +241,6 @@ static int mt7915_add_interface(struct ieee80211_hw *hw,
- vif->offload_flags = 0;
- vif->offload_flags |= IEEE80211_OFFLOAD_ENCAP_4ADDR;
-
-- mt7915_init_bitrate_mask(vif);
--
- out:
- mutex_unlock(&dev->mt76.mutex);
-
-@@ -810,8 +798,7 @@ mt7915_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
-
- n = mvif->omac_idx > HW_BSSID_MAX ? HW_BSSID_0 : mvif->omac_idx;
- /* TSF software read */
-- mt76_rmw(dev, MT_LPON_TCR(band, n), MT_LPON_TCR_SW_MODE,
-- MT_LPON_TCR_SW_READ);
-+ mt76_set(dev, MT_LPON_TCR(band, n), MT_LPON_TCR_SW_MODE);
- tsf.t32[0] = mt76_rr(dev, MT_LPON_UTTR0(band));
- tsf.t32[1] = mt76_rr(dev, MT_LPON_UTTR1(band));
-
-@@ -840,34 +827,7 @@ mt7915_set_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- mt76_wr(dev, MT_LPON_UTTR0(band), tsf.t32[0]);
- mt76_wr(dev, MT_LPON_UTTR1(band), tsf.t32[1]);
- /* TSF software overwrite */
-- mt76_rmw(dev, MT_LPON_TCR(band, n), MT_LPON_TCR_SW_MODE,
-- MT_LPON_TCR_SW_WRITE);
--
-- mutex_unlock(&dev->mt76.mutex);
--}
--
--static void
--mt7915_offset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
-- s64 timestamp)
--{
-- struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
-- struct mt7915_dev *dev = mt7915_hw_dev(hw);
-- struct mt7915_phy *phy = mt7915_hw_phy(hw);
-- bool band = phy != &dev->phy;
-- union {
-- u64 t64;
-- u32 t32[2];
-- } tsf = { .t64 = timestamp, };
-- u16 n;
--
-- mutex_lock(&dev->mt76.mutex);
--
-- n = mvif->omac_idx > HW_BSSID_MAX ? HW_BSSID_0 : mvif->omac_idx;
-- mt76_wr(dev, MT_LPON_UTTR0(band), tsf.t32[0]);
-- mt76_wr(dev, MT_LPON_UTTR1(band), tsf.t32[1]);
-- /* TSF software adjust*/
-- mt76_rmw(dev, MT_LPON_TCR(band, n), MT_LPON_TCR_SW_MODE,
-- MT_LPON_TCR_SW_ADJUST);
-+ mt76_set(dev, MT_LPON_TCR(band, n), MT_LPON_TCR_SW_WRITE);
-
- mutex_unlock(&dev->mt76.mutex);
- }
-@@ -951,15 +911,17 @@ static void mt7915_sta_statistics(struct ieee80211_hw *hw,
- sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
- }
-
--static void mt7915_sta_rc_work(void *data, struct ieee80211_sta *sta)
-+static void
-+mt7915_sta_rc_update(struct ieee80211_hw *hw,
-+ struct ieee80211_vif *vif,
-+ struct ieee80211_sta *sta,
-+ u32 changed)
- {
-+ struct mt7915_dev *dev = mt7915_hw_dev(hw);
- struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
-- struct mt7915_dev *dev = msta->vif->phy->dev;
-- struct ieee80211_hw *hw = msta->vif->phy->mt76->hw;
-- u32 *changed = data;
-
- spin_lock_bh(&dev->sta_poll_lock);
-- msta->stats.changed |= *changed;
-+ msta->stats.changed |= changed;
- if (list_empty(&msta->rc_list))
- list_add_tail(&msta->rc_list, &dev->sta_rc_list);
- spin_unlock_bh(&dev->sta_poll_lock);
-@@ -967,39 +929,6 @@ static void mt7915_sta_rc_work(void *data, struct ieee80211_sta *sta)
- ieee80211_queue_work(hw, &dev->rc_work);
- }
-
--static void mt7915_sta_rc_update(struct ieee80211_hw *hw,
-- struct ieee80211_vif *vif,
-- struct ieee80211_sta *sta,
-- u32 changed)
--{
-- mt7915_sta_rc_work(&changed, sta);
--}
--
--static int
--mt7915_set_bitrate_mask(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
-- const struct cfg80211_bitrate_mask *mask)
--{
-- struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
-- enum nl80211_band band = mvif->phy->mt76->chandef.chan->band;
-- u32 changed;
--
-- if (mask->control[band].gi == NL80211_TXRATE_FORCE_LGI)
-- return -EINVAL;
--
-- changed = IEEE80211_RC_SUPP_RATES_CHANGED;
-- mvif->bitrate_mask = *mask;
--
-- /* Update firmware rate control to add a boundary on top of table
-- * to limit the rate selection for each peer, so when set bitrates
-- * vht-mcs-5 1:9, which actually means nss = 1 mcs = 0~9. This only
-- * applies to data frames as for the other mgmt, mcast, bcast still
-- * use legacy rates as it is.
-- */
-- ieee80211_iterate_stations_atomic(hw, mt7915_sta_rc_work, &changed);
--
-- return 0;
--}
--
- static void mt7915_sta_set_4addr(struct ieee80211_hw *hw,
- struct ieee80211_vif *vif,
- struct ieee80211_sta *sta,
-@@ -1058,11 +987,9 @@ const struct ieee80211_ops mt7915_ops = {
- .get_stats = mt7915_get_stats,
- .get_tsf = mt7915_get_tsf,
- .set_tsf = mt7915_set_tsf,
-- .offset_tsf = mt7915_offset_tsf,
- .get_survey = mt76_get_survey,
- .get_antenna = mt76_get_antenna,
- .set_antenna = mt7915_set_antenna,
-- .set_bitrate_mask = mt7915_set_bitrate_mask,
- .set_coverage_class = mt7915_set_coverage_class,
- .sta_statistics = mt7915_sta_statistics,
- .sta_set_4addr = mt7915_sta_set_4addr,
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
-index 43960770a9af..106177072d18 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
-@@ -147,10 +147,10 @@ mt7915_get_he_phy_cap(struct mt7915_phy *phy, struct ieee80211_vif *vif)
- }
-
- static u8
--mt7915_get_phy_mode(struct ieee80211_vif *vif, struct ieee80211_sta *sta)
-+mt7915_get_phy_mode(struct mt76_phy *mphy, struct ieee80211_vif *vif,
-+ struct ieee80211_sta *sta)
- {
-- struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
-- enum nl80211_band band = mvif->phy->mt76->chandef.chan->band;
-+ enum nl80211_band band = mphy->chandef.chan->band;
- struct ieee80211_sta_ht_cap *ht_cap;
- struct ieee80211_sta_vht_cap *vht_cap;
- const struct ieee80211_sta_he_cap *he_cap;
-@@ -163,7 +163,7 @@ mt7915_get_phy_mode(struct ieee80211_vif *vif, struct ieee80211_sta *sta)
- } else {
- struct ieee80211_supported_band *sband;
-
-- sband = mvif->phy->mt76->hw->wiphy->bands[band];
-+ sband = mphy->hw->wiphy->bands[band];
-
- ht_cap = &sband->ht_cap;
- vht_cap = &sband->vht_cap;
-@@ -209,112 +209,6 @@ mt7915_mcu_get_sta_nss(u16 mcs_map)
- return nss - 1;
- }
-
--static void
--mt7915_mcu_set_sta_he_mcs(struct ieee80211_sta *sta, __le16 *he_mcs,
-- const u16 *mask)
--{
-- struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
-- struct cfg80211_chan_def *chandef = &msta->vif->phy->mt76->chandef;
-- int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
-- u16 mcs_map;
--
-- switch (chandef->width) {
-- case NL80211_CHAN_WIDTH_80P80:
-- mcs_map = le16_to_cpu(sta->he_cap.he_mcs_nss_supp.rx_mcs_80p80);
-- break;
-- case NL80211_CHAN_WIDTH_160:
-- mcs_map = le16_to_cpu(sta->he_cap.he_mcs_nss_supp.rx_mcs_160);
-- break;
-- default:
-- mcs_map = le16_to_cpu(sta->he_cap.he_mcs_nss_supp.rx_mcs_80);
-- break;
-- }
--
-- for (nss = 0; nss < max_nss; nss++) {
-- int mcs;
--
-- switch ((mcs_map >> (2 * nss)) & 0x3) {
-- case IEEE80211_HE_MCS_SUPPORT_0_11:
-- mcs = GENMASK(11, 0);
-- break;
-- case IEEE80211_HE_MCS_SUPPORT_0_9:
-- mcs = GENMASK(9, 0);
-- break;
-- case IEEE80211_HE_MCS_SUPPORT_0_7:
-- mcs = GENMASK(7, 0);
-- break;
-- default:
-- mcs = 0;
-- }
--
-- mcs = mcs ? fls(mcs & mask[nss]) - 1 : -1;
--
-- switch (mcs) {
-- case 0 ... 7:
-- mcs = IEEE80211_HE_MCS_SUPPORT_0_7;
-- break;
-- case 8 ... 9:
-- mcs = IEEE80211_HE_MCS_SUPPORT_0_9;
-- break;
-- case 10 ... 11:
-- mcs = IEEE80211_HE_MCS_SUPPORT_0_11;
-- break;
-- default:
-- mcs = IEEE80211_HE_MCS_NOT_SUPPORTED;
-- break;
-- }
-- mcs_map &= ~(0x3 << (nss * 2));
-- mcs_map |= mcs << (nss * 2);
--
-- /* only support 2ss on 160MHz */
-- if (nss > 1 && (sta->bandwidth == IEEE80211_STA_RX_BW_160))
-- break;
-- }
--
-- *he_mcs = cpu_to_le16(mcs_map);
--}
--
--static void
--mt7915_mcu_set_sta_vht_mcs(struct ieee80211_sta *sta, __le16 *vht_mcs,
-- const u16 *mask)
--{
-- u16 mcs_map = le16_to_cpu(sta->vht_cap.vht_mcs.rx_mcs_map);
-- int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
-- u16 mcs;
--
-- for (nss = 0; nss < max_nss; nss++, mcs_map >>= 2) {
-- switch (mcs_map & 0x3) {
-- case IEEE80211_VHT_MCS_SUPPORT_0_9:
-- mcs = GENMASK(9, 0);
-- break;
-- case IEEE80211_VHT_MCS_SUPPORT_0_8:
-- mcs = GENMASK(8, 0);
-- break;
-- case IEEE80211_VHT_MCS_SUPPORT_0_7:
-- mcs = GENMASK(7, 0);
-- break;
-- default:
-- mcs = 0;
-- }
--
-- vht_mcs[nss] = cpu_to_le16(mcs & mask[nss]);
--
-- /* only support 2ss on 160MHz */
-- if (nss > 1 && (sta->bandwidth == IEEE80211_STA_RX_BW_160))
-- break;
-- }
--}
--
--static void
--mt7915_mcu_set_sta_ht_mcs(struct ieee80211_sta *sta, u8 *ht_mcs,
-- const u8 *mask)
--{
-- int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
--
-- for (nss = 0; nss < max_nss; nss++)
-- ht_mcs[nss] = sta->ht_cap.mcs.rx_mask[nss] & mask[nss];
--}
--
- static int
- mt7915_mcu_parse_response(struct mt76_dev *mdev, int cmd,
- struct sk_buff *skb, int seq)
-@@ -455,24 +349,6 @@ mt7915_mcu_rx_csa_notify(struct mt7915_dev *dev, struct sk_buff *skb)
- mt7915_mcu_csa_finish, mphy->hw);
- }
-
--static void
--mt7915_mcu_rx_thermal_notify(struct mt7915_dev *dev, struct sk_buff *skb)
--{
-- struct mt76_phy *mphy = &dev->mt76.phy;
-- struct mt7915_mcu_thermal_notify *t;
-- struct mt7915_phy *phy;
--
-- t = (struct mt7915_mcu_thermal_notify *)skb->data;
-- if (t->ctrl.ctrl_id != THERMAL_PROTECT_ENABLE)
-- return;
--
-- if (t->ctrl.band_idx && dev->mt76.phy2)
-- mphy = dev->mt76.phy2;
--
-- phy = (struct mt7915_phy *)mphy->priv;
-- phy->throttle_state = t->ctrl.duty.duty_cycle;
--}
--
- static void
- mt7915_mcu_rx_radar_detected(struct mt7915_dev *dev, struct sk_buff *skb)
- {
-@@ -593,7 +469,6 @@ mt7915_mcu_tx_rate_report(struct mt7915_dev *dev, struct sk_buff *skb)
- u16 attempts = le16_to_cpu(ra->attempts);
- u16 curr = le16_to_cpu(ra->curr_rate);
- u16 wcidx = le16_to_cpu(ra->wlan_idx);
-- struct ieee80211_tx_status status = {};
- struct mt76_phy *mphy = &dev->mphy;
- struct mt7915_sta_stats *stats;
- struct mt7915_sta *msta;
-@@ -625,13 +500,6 @@ mt7915_mcu_tx_rate_report(struct mt7915_dev *dev, struct sk_buff *skb)
-
- stats->per = 1000 * (attempts - success) / attempts;
- }
--
-- status.sta = wcid_to_sta(wcid);
-- if (!status.sta)
-- return;
--
-- status.rate = &stats->tx_rate;
-- ieee80211_tx_status_ext(mphy->hw, &status);
- }
-
- static void
-@@ -663,9 +531,6 @@ mt7915_mcu_rx_ext_event(struct mt7915_dev *dev, struct sk_buff *skb)
- struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
-
- switch (rxd->ext_eid) {
-- case MCU_EXT_EVENT_THERMAL_PROTECT:
-- mt7915_mcu_rx_thermal_notify(dev, skb);
-- break;
- case MCU_EXT_EVENT_RDD_REPORT:
- mt7915_mcu_rx_radar_detected(dev, skb);
- break;
-@@ -868,7 +733,7 @@ mt7915_mcu_bss_basic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
- memcpy(bss->bssid, vif->bss_conf.bssid, ETH_ALEN);
- bss->bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int);
- bss->dtim_period = vif->bss_conf.dtim_period;
-- bss->phy_mode = mt7915_get_phy_mode(vif, NULL);
-+ bss->phy_mode = mt7915_get_phy_mode(phy->mt76, vif, NULL);
- } else {
- memcpy(bss->bssid, phy->mt76->macaddr, ETH_ALEN);
- }
-@@ -1471,11 +1336,8 @@ mt7915_mcu_sta_basic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
- static void
- mt7915_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
- {
-- struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
- struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
- struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem;
-- enum nl80211_band band = msta->vif->phy->mt76->chandef.chan->band;
-- const u16 *mcs_mask = msta->vif->bitrate_mask.control[band].he_mcs;
- struct sta_rec_he *he;
- struct tlv *tlv;
- u32 cap = 0;
-@@ -1566,18 +1428,15 @@ mt7915_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
- case IEEE80211_STA_RX_BW_160:
- if (elem->phy_cap_info[0] &
- IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
-- mt7915_mcu_set_sta_he_mcs(sta,
-- &he->max_nss_mcs[CMD_HE_MCS_BW8080],
-- mcs_mask);
-+ he->max_nss_mcs[CMD_HE_MCS_BW8080] =
-+ he_cap->he_mcs_nss_supp.rx_mcs_80p80;
-
-- mt7915_mcu_set_sta_he_mcs(sta,
-- &he->max_nss_mcs[CMD_HE_MCS_BW160],
-- mcs_mask);
-+ he->max_nss_mcs[CMD_HE_MCS_BW160] =
-+ he_cap->he_mcs_nss_supp.rx_mcs_160;
- fallthrough;
- default:
-- mt7915_mcu_set_sta_he_mcs(sta,
-- &he->max_nss_mcs[CMD_HE_MCS_BW80],
-- mcs_mask);
-+ he->max_nss_mcs[CMD_HE_MCS_BW80] =
-+ he_cap->he_mcs_nss_supp.rx_mcs_80;
- break;
- }
-
-@@ -1685,18 +1544,27 @@ mt7915_mcu_sta_muru_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
- HE_PHY(CAP2_UL_MU_PARTIAL_MU_MIMO, elem->phy_cap_info[2]);
- }
-
--static void
--mt7915_mcu_sta_vht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
-+static int
-+mt7915_mcu_add_mu(struct mt7915_dev *dev, struct ieee80211_vif *vif,
-+ struct ieee80211_sta *sta)
- {
-- struct sta_rec_vht *vht;
-- struct tlv *tlv;
-+ struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
-+ struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
-+ struct sk_buff *skb;
-+ int len = sizeof(struct sta_req_hdr) + sizeof(struct sta_rec_muru);
-+
-+ if (!sta->vht_cap.vht_supported && !sta->he_cap.has_he)
-+ return 0;
-+
-+ skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len);
-+ if (IS_ERR(skb))
-+ return PTR_ERR(skb);
-
-- tlv = mt7915_mcu_add_tlv(skb, STA_REC_VHT, sizeof(*vht));
-+ /* starec muru */
-+ mt7915_mcu_sta_muru_tlv(skb, sta);
-
-- vht = (struct sta_rec_vht *)tlv;
-- vht->vht_cap = cpu_to_le32(sta->vht_cap.cap);
-- vht->vht_rx_mcs_map = sta->vht_cap.vht_mcs.rx_mcs_map;
-- vht->vht_tx_mcs_map = sta->vht_cap.vht_mcs.tx_mcs_map;
-+ return mt76_mcu_skb_send_msg(&dev->mt76, skb,
-+ MCU_EXT_CMD(STA_REC_UPDATE), true);
- }
-
- static void
-@@ -1748,6 +1616,17 @@ mt7915_mcu_sta_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
- mt7915_mcu_sta_amsdu_tlv(skb, sta);
- }
-
-+ /* starec vht */
-+ if (sta->vht_cap.vht_supported) {
-+ struct sta_rec_vht *vht;
-+
-+ tlv = mt7915_mcu_add_tlv(skb, STA_REC_VHT, sizeof(*vht));
-+ vht = (struct sta_rec_vht *)tlv;
-+ vht->vht_cap = cpu_to_le32(sta->vht_cap.cap);
-+ vht->vht_rx_mcs_map = sta->vht_cap.vht_mcs.rx_mcs_map;
-+ vht->vht_tx_mcs_map = sta->vht_cap.vht_mcs.tx_mcs_map;
-+ }
-+
- /* starec he */
- if (sta->he_cap.has_he)
- mt7915_mcu_sta_he_tlv(skb, sta);
-@@ -2137,21 +2016,26 @@ mt7915_mcu_add_txbf(struct mt7915_dev *dev, struct ieee80211_vif *vif,
- vc = mt7915_get_he_phy_cap(phy, vif);
- ve = &vc->he_cap_elem;
-
-- ebfee = !!(HE_PHY(CAP3_SU_BEAMFORMER, pe->phy_cap_info[3]) &&
-+ ebfee = !!((HE_PHY(CAP3_SU_BEAMFORMER, pe->phy_cap_info[3]) ||
-+ HE_PHY(CAP4_MU_BEAMFORMER, pe->phy_cap_info[4])) &&
- HE_PHY(CAP4_SU_BEAMFORMEE, ve->phy_cap_info[4]));
-- ebf = !!(HE_PHY(CAP3_SU_BEAMFORMER, ve->phy_cap_info[3]) &&
-+ ebf = !!((HE_PHY(CAP3_SU_BEAMFORMER, ve->phy_cap_info[3]) ||
-+ HE_PHY(CAP4_MU_BEAMFORMER, ve->phy_cap_info[4])) &&
- HE_PHY(CAP4_SU_BEAMFORMEE, pe->phy_cap_info[4]));
- } else if (sta->vht_cap.vht_supported) {
- struct ieee80211_sta_vht_cap *pc;
- struct ieee80211_sta_vht_cap *vc;
-+ u32 cr, ce;
-
- pc = &sta->vht_cap;
- vc = &phy->mt76->sband_5g.sband.vht_cap;
-+ cr = IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
-+ IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE;
-+ ce = IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
-+ IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
-
-- ebfee = !!((pc->cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) &&
-- (vc->cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
-- ebf = !!((vc->cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) &&
-- (pc->cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
-+ ebfee = !!((pc->cap & cr) && (vc->cap & ce));
-+ ebf = !!((vc->cap & cr) && (pc->cap & ce));
- }
-
- /* must keep each tag independent */
-@@ -2195,47 +2079,57 @@ static void
- mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7915_dev *dev,
- struct ieee80211_vif *vif, struct ieee80211_sta *sta)
- {
-- struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
-- struct cfg80211_chan_def *chandef = &mvif->phy->mt76->chandef;
-- struct cfg80211_bitrate_mask *mask = &mvif->bitrate_mask;
-- enum nl80211_band band = chandef->chan->band;
-+ struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
-+ struct mt76_phy *mphy = &dev->mphy;
-+ enum nl80211_band band;
- struct sta_rec_ra *ra;
- struct tlv *tlv;
-- u32 supp_rate = sta->supp_rates[band];
-- u32 cap = sta->wme ? STA_CAP_WMM : 0;
-+ u32 supp_rate, n_rates, cap = sta->wme ? STA_CAP_WMM : 0;
-+ u8 i, nss = sta->rx_nss, mcs = 0;
-
- tlv = mt7915_mcu_add_tlv(skb, STA_REC_RA, sizeof(*ra));
- ra = (struct sta_rec_ra *)tlv;
-
-+ if (msta->wcid.ext_phy && dev->mt76.phy2)
-+ mphy = dev->mt76.phy2;
-+
-+ band = mphy->chandef.chan->band;
-+ supp_rate = sta->supp_rates[band];
-+ n_rates = hweight32(supp_rate);
-+
- ra->valid = true;
- ra->auto_rate = true;
-- ra->phy_mode = mt7915_get_phy_mode(vif, sta);
-- ra->channel = chandef->chan->hw_value;
-+ ra->phy_mode = mt7915_get_phy_mode(mphy, vif, sta);
-+ ra->channel = mphy->chandef.chan->hw_value;
- ra->bw = sta->bandwidth;
-+ ra->rate_len = n_rates;
- ra->phy.bw = sta->bandwidth;
-
-- if (supp_rate) {
-- supp_rate &= mask->control[band].legacy;
-- ra->rate_len = hweight32(supp_rate);
--
-+ if (n_rates) {
- if (band == NL80211_BAND_2GHZ) {
- ra->supp_mode = MODE_CCK;
- ra->supp_cck_rate = supp_rate & GENMASK(3, 0);
-+ ra->phy.type = MT_PHY_TYPE_CCK;
-
-- if (ra->rate_len > 4) {
-+ if (n_rates > 4) {
- ra->supp_mode |= MODE_OFDM;
- ra->supp_ofdm_rate = supp_rate >> 4;
-+ ra->phy.type = MT_PHY_TYPE_OFDM;
- }
- } else {
- ra->supp_mode = MODE_OFDM;
- ra->supp_ofdm_rate = supp_rate;
-+ ra->phy.type = MT_PHY_TYPE_OFDM;
- }
- }
-
- if (sta->ht_cap.ht_supported) {
-- const u8 *mcs_mask = mask->control[band].ht_mcs;
-+ for (i = 0; i < nss; i++)
-+ ra->ht_mcs[i] = sta->ht_cap.mcs.rx_mask[i];
-
-+ ra->supp_ht_mcs = *(__le32 *)ra->ht_mcs;
- ra->supp_mode |= MODE_HT;
-+ mcs = hweight32(le32_to_cpu(ra->supp_ht_mcs)) - 1;
- ra->af = sta->ht_cap.ampdu_factor;
- ra->ht_gf = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD);
-
-@@ -2250,16 +2144,13 @@ mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7915_dev *dev,
- cap |= STA_CAP_RX_STBC;
- if (sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING)
- cap |= STA_CAP_LDPC;
--
-- mt7915_mcu_set_sta_ht_mcs(sta, ra->ht_mcs, mcs_mask);
-- ra->supp_ht_mcs = *(__le32 *)ra->ht_mcs;
- }
-
- if (sta->vht_cap.vht_supported) {
-- const u16 *mcs_mask = mask->control[band].vht_mcs;
-- u8 af;
-+ u16 mcs_map = le16_to_cpu(sta->vht_cap.vht_mcs.rx_mcs_map);
-+ u16 vht_mcs;
-+ u8 af, mcs_prev;
-
-- ra->supp_mode |= MODE_VHT;
- af = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
- sta->vht_cap.cap);
- ra->af = max_t(u8, ra->af, af);
-@@ -2276,7 +2167,33 @@ mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7915_dev *dev,
- if (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC)
- cap |= STA_CAP_VHT_LDPC;
-
-- mt7915_mcu_set_sta_vht_mcs(sta, ra->supp_vht_mcs, mcs_mask);
-+ ra->supp_mode |= MODE_VHT;
-+ for (mcs = 0, i = 0; i < nss; i++, mcs_map >>= 2) {
-+ switch (mcs_map & 0x3) {
-+ case IEEE80211_VHT_MCS_SUPPORT_0_9:
-+ vht_mcs = GENMASK(9, 0);
-+ break;
-+ case IEEE80211_VHT_MCS_SUPPORT_0_8:
-+ vht_mcs = GENMASK(8, 0);
-+ break;
-+ case IEEE80211_VHT_MCS_SUPPORT_0_7:
-+ vht_mcs = GENMASK(7, 0);
-+ break;
-+ default:
-+ vht_mcs = 0;
-+ }
-+
-+ ra->supp_vht_mcs[i] = cpu_to_le16(vht_mcs);
-+
-+ mcs_prev = hweight16(vht_mcs) - 1;
-+ if (mcs_prev > mcs)
-+ mcs = mcs_prev;
-+
-+ /* only support 2ss on 160MHz */
-+ if (i > 1 && (ra->bw == CMD_CBW_160MHZ ||
-+ ra->bw == CMD_CBW_8080MHZ))
-+ break;
-+ }
- }
-
- if (sta->he_cap.has_he) {
-@@ -2284,7 +2201,28 @@ mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7915_dev *dev,
- cap |= STA_CAP_HE;
- }
-
-- ra->sta_cap = cpu_to_le32(cap);
-+ ra->sta_status = cpu_to_le32(cap);
-+
-+ switch (BIT(fls(ra->supp_mode) - 1)) {
-+ case MODE_VHT:
-+ ra->phy.type = MT_PHY_TYPE_VHT;
-+ ra->phy.mcs = mcs;
-+ ra->phy.nss = nss;
-+ ra->phy.stbc = !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_TXSTBC);
-+ ra->phy.ldpc = !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC);
-+ ra->phy.sgi =
-+ !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80);
-+ break;
-+ case MODE_HT:
-+ ra->phy.type = MT_PHY_TYPE_HT;
-+ ra->phy.mcs = mcs;
-+ ra->phy.ldpc = sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING;
-+ ra->phy.stbc = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_TX_STBC);
-+ ra->phy.sgi = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20);
-+ break;
-+ default:
-+ break;
-+ }
- }
-
- int mt7915_mcu_add_rate_ctrl(struct mt7915_dev *dev, struct ieee80211_vif *vif,
-@@ -2305,87 +2243,6 @@ int mt7915_mcu_add_rate_ctrl(struct mt7915_dev *dev, struct ieee80211_vif *vif,
- MCU_EXT_CMD(STA_REC_UPDATE), true);
- }
-
--int mt7915_mcu_add_he(struct mt7915_dev *dev, struct ieee80211_vif *vif,
-- struct ieee80211_sta *sta)
--{
-- struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
-- struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
-- struct sk_buff *skb;
-- int len;
--
-- if (!sta->he_cap.has_he)
-- return 0;
--
-- len = sizeof(struct sta_req_hdr) + sizeof(struct sta_rec_he);
--
-- skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len);
-- if (IS_ERR(skb))
-- return PTR_ERR(skb);
--
-- mt7915_mcu_sta_he_tlv(skb, sta);
--
-- return mt76_mcu_skb_send_msg(&dev->mt76, skb,
-- MCU_EXT_CMD(STA_REC_UPDATE), true);
--}
--
--static int
--mt7915_mcu_add_group(struct mt7915_dev *dev, struct ieee80211_vif *vif,
-- struct ieee80211_sta *sta)
--{
--#define MT_STA_BSS_GROUP 1
-- struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
-- struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
-- struct {
-- __le32 action;
-- u8 wlan_idx_lo;
-- u8 status;
-- u8 wlan_idx_hi;
-- u8 rsv0[5];
-- __le32 val;
-- u8 rsv1[8];
-- } __packed req = {
-- .action = cpu_to_le32(MT_STA_BSS_GROUP),
-- .wlan_idx_lo = to_wcid_lo(msta->wcid.idx),
-- .wlan_idx_hi = to_wcid_hi(msta->wcid.idx),
-- .val = cpu_to_le32(mvif->idx % 16),
-- };
--
-- return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_DRR_CTRL), &req,
-- sizeof(req), true);
--}
--
--static int
--mt7915_mcu_add_mu(struct mt7915_dev *dev, struct ieee80211_vif *vif,
-- struct ieee80211_sta *sta)
--{
-- struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
-- struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
-- struct sk_buff *skb;
-- int ret;
--
-- if (!sta->vht_cap.vht_supported && !sta->he_cap.has_he)
-- return 0;
--
-- ret = mt7915_mcu_add_group(dev, vif, sta);
-- if (ret)
-- return ret;
--
-- skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta,
-- MT7915_STA_UPDATE_MAX_SIZE);
-- if (IS_ERR(skb))
-- return PTR_ERR(skb);
--
-- /* wait until TxBF and MU ready to update stare vht */
--
-- /* starec muru */
-- mt7915_mcu_sta_muru_tlv(skb, sta);
-- /* starec vht */
-- mt7915_mcu_sta_vht_tlv(skb, sta);
--
-- return mt76_mcu_skb_send_msg(&dev->mt76, skb,
-- MCU_EXT_CMD(STA_REC_UPDATE), true);
--}
--
- int mt7915_mcu_add_sta_adv(struct mt7915_dev *dev, struct ieee80211_vif *vif,
- struct ieee80211_sta *sta, bool enable)
- {
-@@ -2396,14 +2253,17 @@ int mt7915_mcu_add_sta_adv(struct mt7915_dev *dev, struct ieee80211_vif *vif,
-
- /* must keep the order */
- ret = mt7915_mcu_add_txbf(dev, vif, sta, enable);
-- if (ret || !enable)
-+ if (ret)
- return ret;
-
- ret = mt7915_mcu_add_mu(dev, vif, sta);
- if (ret)
- return ret;
-
-- return mt7915_mcu_add_rate_ctrl(dev, vif, sta);
-+ if (enable)
-+ return mt7915_mcu_add_rate_ctrl(dev, vif, sta);
-+
-+ return 0;
- }
-
- int mt7915_mcu_add_sta(struct mt7915_dev *dev, struct ieee80211_vif *vif,
-@@ -2572,7 +2432,7 @@ mt7915_mcu_beacon_cont(struct mt7915_dev *dev, struct sk_buff *rskb,
- cont->csa_ofs = cpu_to_le16(offs->cntdwn_counter_offs[0] - 4);
-
- buf = (u8 *)tlv + sizeof(*cont);
-- mt7915_mac_write_txwi(dev, (__le32 *)buf, skb, wcid, 0, NULL,
-+ mt7915_mac_write_txwi(dev, (__le32 *)buf, skb, wcid, NULL,
- true);
- memcpy(buf + MT_TXD_SIZE, skb->data, skb->len);
- }
-@@ -3447,8 +3307,7 @@ int mt7915_mcu_set_eeprom(struct mt7915_dev *dev)
- int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset)
- {
- struct mt7915_mcu_eeprom_info req = {
-- .addr = cpu_to_le32(round_down(offset,
-- MT7915_EEPROM_BLOCK_SIZE)),
-+ .addr = cpu_to_le32(round_down(offset, 16)),
- };
- struct mt7915_mcu_eeprom_info *res;
- struct sk_buff *skb;
-@@ -3462,7 +3321,7 @@ int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset)
-
- res = (struct mt7915_mcu_eeprom_info *)skb->data;
- buf = dev->mt76.eeprom.data + le32_to_cpu(res->addr);
-- memcpy(buf, res->data, MT7915_EEPROM_BLOCK_SIZE);
-+ memcpy(buf, res->data, 16);
- dev_kfree_skb(skb);
-
- return 0;
-@@ -3611,128 +3470,22 @@ int mt7915_mcu_apply_tx_dpd(struct mt7915_phy *phy)
- return 0;
- }
-
--int mt7915_mcu_get_chan_mib_info(struct mt7915_phy *phy, bool chan_switch)
--{
-- /* strict order */
-- static const enum mt7915_chan_mib_offs offs[] = {
-- MIB_BUSY_TIME, MIB_TX_TIME, MIB_RX_TIME, MIB_OBSS_AIRTIME
-- };
-- struct mt76_channel_state *state = phy->mt76->chan_state;
-- struct mt76_channel_state *state_ts = &phy->state_ts;
-- struct mt7915_dev *dev = phy->dev;
-- struct mt7915_mcu_mib *res, req[4];
-- struct sk_buff *skb;
-- int i, ret;
--
-- for (i = 0; i < 4; i++) {
-- req[i].band = cpu_to_le32(phy != &dev->phy);
-- req[i].offs = cpu_to_le32(offs[i]);
-- }
--
-- ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD(GET_MIB_INFO),
-- req, sizeof(req), true, &skb);
-- if (ret)
-- return ret;
--
-- res = (struct mt7915_mcu_mib *)(skb->data + 20);
--
-- if (chan_switch)
-- goto out;
--
--#define __res_u64(s) le64_to_cpu(res[s].data)
-- state->cc_busy += __res_u64(0) - state_ts->cc_busy;
-- state->cc_tx += __res_u64(1) - state_ts->cc_tx;
-- state->cc_bss_rx += __res_u64(2) - state_ts->cc_bss_rx;
-- state->cc_rx += __res_u64(2) + __res_u64(3) - state_ts->cc_rx;
--
--out:
-- state_ts->cc_busy = __res_u64(0);
-- state_ts->cc_tx = __res_u64(1);
-- state_ts->cc_bss_rx = __res_u64(2);
-- state_ts->cc_rx = __res_u64(2) + __res_u64(3);
--#undef __res_u64
--
-- dev_kfree_skb(skb);
--
-- return 0;
--}
--
--int mt7915_mcu_get_temperature(struct mt7915_phy *phy)
-+int mt7915_mcu_get_temperature(struct mt7915_dev *dev, int index)
- {
-- struct mt7915_dev *dev = phy->dev;
- struct {
- u8 ctrl_id;
- u8 action;
-- u8 dbdc_idx;
-+ u8 band;
- u8 rsv[5];
- } req = {
- .ctrl_id = THERMAL_SENSOR_TEMP_QUERY,
-- .dbdc_idx = phy != &dev->phy,
-+ .action = index,
- };
-
- return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_CTRL), &req,
- sizeof(req), true);
- }
-
--int mt7915_mcu_set_thermal_throttling(struct mt7915_phy *phy, u8 state)
--{
-- struct mt7915_dev *dev = phy->dev;
-- struct {
-- struct mt7915_mcu_thermal_ctrl ctrl;
--
-- __le32 trigger_temp;
-- __le32 restore_temp;
-- __le16 sustain_time;
-- u8 rsv[2];
-- } __packed req = {
-- .ctrl = {
-- .band_idx = phy != &dev->phy,
-- },
-- };
-- int level;
--
--#define TRIGGER_TEMPERATURE 122
--#define RESTORE_TEMPERATURE 116
--#define SUSTAIN_PERIOD 10
--
-- if (!state) {
-- req.ctrl.ctrl_id = THERMAL_PROTECT_DISABLE;
-- goto out;
-- }
--
-- /* set duty cycle and level */
-- for (level = 0; level < 4; level++) {
-- int ret;
--
-- req.ctrl.ctrl_id = THERMAL_PROTECT_DUTY_CONFIG;
-- req.ctrl.duty.duty_level = level;
-- req.ctrl.duty.duty_cycle = state;
-- state = state * 4 / 5;
--
-- ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_PROT),
-- &req, sizeof(req.ctrl), false);
-- if (ret)
-- return ret;
-- }
--
-- /* currently use fixed values for throttling, and would be better
-- * to implement thermal zone for dynamic trip in the long run.
-- */
--
-- /* set high-temperature trigger threshold */
-- req.ctrl.ctrl_id = THERMAL_PROTECT_ENABLE;
-- req.trigger_temp = cpu_to_le32(TRIGGER_TEMPERATURE);
-- req.restore_temp = cpu_to_le32(RESTORE_TEMPERATURE);
-- req.sustain_time = cpu_to_le16(SUSTAIN_PERIOD);
--
--out:
-- req.ctrl.type.protect_type = 1;
-- req.ctrl.type.trigger_type = 1;
--
-- return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_PROT),
-- &req, sizeof(req), false);
--}
--
- int mt7915_mcu_get_tx_rate(struct mt7915_dev *dev, u32 cmd, u16 wlan_idx)
- {
- struct {
-@@ -3753,6 +3506,7 @@ int mt7915_mcu_get_tx_rate(struct mt7915_dev *dev, u32 cmd, u16 wlan_idx)
-
- int mt7915_mcu_set_txpower_sku(struct mt7915_phy *phy)
- {
-+#define MT7915_SKU_RATE_NUM 161
- struct mt7915_dev *dev = phy->dev;
- struct mt76_phy *mphy = phy->mt76;
- struct ieee80211_hw *hw = mphy->hw;
-@@ -3802,39 +3556,6 @@ int mt7915_mcu_set_txpower_sku(struct mt7915_phy *phy)
- sizeof(req), true);
- }
-
--int mt7915_mcu_get_txpower_sku(struct mt7915_phy *phy, s8 *txpower, int len)
--{
--#define RATE_POWER_INFO 2
-- struct mt7915_dev *dev = phy->dev;
-- struct {
-- u8 format_id;
-- u8 category;
-- u8 band;
-- u8 _rsv;
-- } __packed req = {
-- .format_id = 7,
-- .category = RATE_POWER_INFO,
-- .band = phy != &dev->phy,
-- };
-- s8 res[MT7915_SKU_RATE_NUM][2];
-- struct sk_buff *skb;
-- int ret, i;
--
-- ret = mt76_mcu_send_and_get_msg(&dev->mt76,
-- MCU_EXT_CMD(TX_POWER_FEATURE_CTRL),
-- &req, sizeof(req), true, &skb);
-- if (ret)
-- return ret;
--
-- memcpy(res, skb->data + 4, sizeof(res));
-- for (i = 0; i < len; i++)
-- txpower[i] = res[i][req.band];
--
-- dev_kfree_skb(skb);
--
-- return 0;
--}
--
- int mt7915_mcu_set_test_param(struct mt7915_dev *dev, u8 param, bool test_mode,
- u8 en)
- {
-@@ -3893,50 +3614,57 @@ int mt7915_mcu_set_ser(struct mt7915_dev *dev, u8 action, u8 set, u8 band)
- &req, sizeof(req), false);
- }
-
--int mt7915_mcu_set_txbf(struct mt7915_dev *dev, u8 action)
-+int mt7915_mcu_set_txbf_module(struct mt7915_dev *dev)
- {
-+#define MT_BF_MODULE_UPDATE 25
- struct {
- u8 action;
-- union {
-- struct {
-- u8 snd_mode;
-- u8 sta_num;
-- u8 rsv;
-- u8 wlan_idx[4];
-- __le32 snd_period; /* ms */
-- } __packed snd;
-- struct {
-- bool ebf;
-- bool ibf;
-- u8 rsv;
-- } __packed type;
-- struct {
-- u8 bf_num;
-- u8 bf_bitmap;
-- u8 bf_sel[8];
-- u8 rsv[5];
-- } __packed mod;
-- };
-+ u8 bf_num;
-+ u8 bf_bitmap;
-+ u8 bf_sel[8];
-+ u8 rsv[8];
- } __packed req = {
-- .action = action,
-+ .action = MT_BF_MODULE_UPDATE,
-+ .bf_num = 2,
-+ .bf_bitmap = GENMASK(1, 0),
- };
-
--#define MT_BF_PROCESSING 4
-- switch (action) {
-- case MT_BF_SOUNDING_ON:
-- req.snd.snd_mode = MT_BF_PROCESSING;
-- break;
-- case MT_BF_TYPE_UPDATE:
-- req.type.ebf = true;
-- req.type.ibf = dev->ibf;
-- break;
-- case MT_BF_MODULE_UPDATE:
-- req.mod.bf_num = 2;
-- req.mod.bf_bitmap = GENMASK(1, 0);
-- break;
-- default:
-- return -EINVAL;
-- }
-+ return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TXBF_ACTION), &req,
-+ sizeof(req), true);
-+}
-+
-+int mt7915_mcu_set_txbf_type(struct mt7915_dev *dev)
-+{
-+#define MT_BF_TYPE_UPDATE 20
-+ struct {
-+ u8 action;
-+ bool ebf;
-+ bool ibf;
-+ u8 rsv;
-+ } __packed req = {
-+ .action = MT_BF_TYPE_UPDATE,
-+ .ebf = true,
-+ .ibf = dev->ibf,
-+ };
-+
-+ return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TXBF_ACTION), &req,
-+ sizeof(req), true);
-+}
-+
-+int mt7915_mcu_set_txbf_sounding(struct mt7915_dev *dev)
-+{
-+#define MT_BF_PROCESSING 4
-+ struct {
-+ u8 action;
-+ u8 snd_mode;
-+ u8 sta_num;
-+ u8 rsv;
-+ u8 wlan_idx[4];
-+ __le32 snd_period; /* ms */
-+ } __packed req = {
-+ .action = true,
-+ .snd_mode = MT_BF_PROCESSING,
-+ };
-
- return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TXBF_ACTION), &req,
- sizeof(req), true);
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h
-index e68a562cc5b4..c0255c3ac7d0 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h
-@@ -68,29 +68,6 @@ struct mt7915_mcu_rxd {
- u8 s2d_index;
- };
-
--struct mt7915_mcu_thermal_ctrl {
-- u8 ctrl_id;
-- u8 band_idx;
-- union {
-- struct {
-- u8 protect_type; /* 1: duty admit, 2: radio off */
-- u8 trigger_type; /* 0: low, 1: high */
-- } __packed type;
-- struct {
-- u8 duty_level; /* level 0~3 */
-- u8 duty_cycle;
-- } __packed duty;
-- };
--} __packed;
--
--struct mt7915_mcu_thermal_notify {
-- struct mt7915_mcu_rxd rxd;
--
-- struct mt7915_mcu_thermal_ctrl ctrl;
-- __le32 temperature;
-- u8 rsv[8];
--} __packed;
--
- struct mt7915_mcu_csa_notify {
- struct mt7915_mcu_rxd rxd;
-
-@@ -216,19 +193,6 @@ struct mt7915_mcu_phy_rx_info {
- #define MT_RA_RATE_DCM_EN BIT(4)
- #define MT_RA_RATE_BW GENMASK(14, 13)
-
--struct mt7915_mcu_mib {
-- __le32 band;
-- __le32 offs;
-- __le64 data;
--} __packed;
--
--enum mt7915_chan_mib_offs {
-- MIB_BUSY_TIME = 14,
-- MIB_TX_TIME = 81,
-- MIB_RX_TIME,
-- MIB_OBSS_AIRTIME = 86
--};
--
- struct edca {
- u8 queue;
- u8 set;
-@@ -298,7 +262,6 @@ enum {
- MCU_EXT_CMD_FW_LOG_2_HOST = 0x13,
- MCU_EXT_CMD_TXBF_ACTION = 0x1e,
- MCU_EXT_CMD_EFUSE_BUFFER_MODE = 0x21,
-- MCU_EXT_CMD_THERMAL_PROT = 0x23,
- MCU_EXT_CMD_STA_REC_UPDATE = 0x25,
- MCU_EXT_CMD_BSS_INFO_UPDATE = 0x26,
- MCU_EXT_CMD_EDCA_UPDATE = 0x27,
-@@ -314,7 +277,6 @@ enum {
- MCU_EXT_CMD_MUAR_UPDATE = 0x48,
- MCU_EXT_CMD_SET_RX_PATH = 0x4e,
- MCU_EXT_CMD_TX_POWER_FEATURE_CTRL = 0x58,
-- MCU_EXT_CMD_GET_MIB_INFO = 0x5a,
- MCU_EXT_CMD_MWDS_SUPPORT = 0x80,
- MCU_EXT_CMD_SET_SER_TRIGGER = 0x81,
- MCU_EXT_CMD_SCS_CTRL = 0x82,
-@@ -957,7 +919,7 @@ struct sta_rec_ra {
- u8 op_vht_rx_nss;
- u8 op_vht_rx_nss_type;
-
-- __le32 sta_cap;
-+ __le32 sta_status;
-
- struct ra_phy phy;
- } __packed;
-@@ -1104,28 +1066,11 @@ enum {
- THERMAL_SENSOR_TASK_CTRL,
- };
-
--enum {
-- THERMAL_PROTECT_PARAMETER_CTRL,
-- THERMAL_PROTECT_BASIC_INFO,
-- THERMAL_PROTECT_ENABLE,
-- THERMAL_PROTECT_DISABLE,
-- THERMAL_PROTECT_DUTY_CONFIG,
-- THERMAL_PROTECT_MECH_INFO,
-- THERMAL_PROTECT_DUTY_INFO,
-- THERMAL_PROTECT_STATE_ACT,
--};
--
- enum {
- MT_EBF = BIT(0), /* explicit beamforming */
- MT_IBF = BIT(1) /* implicit beamforming */
- };
-
--enum {
-- MT_BF_SOUNDING_ON = 1,
-- MT_BF_TYPE_UPDATE = 20,
-- MT_BF_MODULE_UPDATE = 25
--};
--
- #define MT7915_WTBL_UPDATE_MAX_SIZE (sizeof(struct wtbl_req_hdr) + \
- sizeof(struct wtbl_generic) + \
- sizeof(struct wtbl_rx) + \
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
-index 3f613fae6218..4ea8972d4e2f 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
-@@ -9,7 +9,7 @@
- #include "../mt76.h"
- #include "regs.h"
-
--#define MT7915_MAX_INTERFACES 19
-+#define MT7915_MAX_INTERFACES 32
- #define MT7915_MAX_WMM_SETS 4
- #define MT7915_WTBL_SIZE 288
- #define MT7915_WTBL_RESERVED (MT7915_WTBL_SIZE - 1)
-@@ -31,7 +31,6 @@
- #define MT7915_ROM_PATCH "mediatek/mt7915_rom_patch.bin"
-
- #define MT7915_EEPROM_SIZE 3584
--#define MT7915_EEPROM_BLOCK_SIZE 16
- #define MT7915_TOKEN_SIZE 8192
-
- #define MT7915_CFEND_RATE_DEFAULT 0x49 /* OFDM 24M */
-@@ -39,10 +38,6 @@
- #define MT7915_5G_RATE_DEFAULT 0x4b /* OFDM 6M */
- #define MT7915_2G_RATE_DEFAULT 0x0 /* CCK 1M */
-
--#define MT7915_THERMAL_THROTTLE_MAX 100
--
--#define MT7915_SKU_RATE_NUM 161
--
- struct mt7915_vif;
- struct mt7915_sta;
- struct mt7915_dfs_pulse;
-@@ -105,7 +100,6 @@ struct mt7915_vif {
- struct mt7915_phy *phy;
-
- struct ieee80211_tx_queue_params queue_params[IEEE80211_NUM_ACS];
-- struct cfg80211_bitrate_mask bitrate_mask;
- };
-
- struct mib_stats {
-@@ -132,9 +126,6 @@ struct mt7915_phy {
-
- struct ieee80211_vif *monitor_vif;
-
-- struct thermal_cooling_device *cdev;
-- u8 throttle_state;
--
- u32 rxfilter;
- u64 omac_mask;
-
-@@ -150,7 +141,6 @@ struct mt7915_phy {
- u32 ampdu_ref;
-
- struct mib_stats mib;
-- struct mt76_channel_state state_ts;
- struct list_head stats_list;
-
- u8 sta_work_count;
-@@ -179,7 +169,6 @@ struct mt7915_dev {
- struct mt7915_hif *hif2;
-
- const struct mt76_bus_ops *bus_ops;
-- struct tasklet_struct irq_tasklet;
- struct mt7915_phy phy;
-
- u16 chainmask;
-@@ -333,8 +322,6 @@ int mt7915_mcu_add_obss_spr(struct mt7915_dev *dev, struct ieee80211_vif *vif,
- bool enable);
- int mt7915_mcu_add_rate_ctrl(struct mt7915_dev *dev, struct ieee80211_vif *vif,
- struct ieee80211_sta *sta);
--int mt7915_mcu_add_he(struct mt7915_dev *dev, struct ieee80211_vif *vif,
-- struct ieee80211_sta *sta);
- int mt7915_mcu_add_smps(struct mt7915_dev *dev, struct ieee80211_vif *vif,
- struct ieee80211_sta *sta);
- int mt7915_set_channel(struct mt7915_phy *phy);
-@@ -355,8 +342,9 @@ int mt7915_mcu_set_rts_thresh(struct mt7915_phy *phy, u32 val);
- int mt7915_mcu_set_pm(struct mt7915_dev *dev, int band, int enter);
- int mt7915_mcu_set_sku_en(struct mt7915_phy *phy, bool enable);
- int mt7915_mcu_set_txpower_sku(struct mt7915_phy *phy);
--int mt7915_mcu_get_txpower_sku(struct mt7915_phy *phy, s8 *txpower, int len);
--int mt7915_mcu_set_txbf(struct mt7915_dev *dev, u8 action);
-+int mt7915_mcu_set_txbf_type(struct mt7915_dev *dev);
-+int mt7915_mcu_set_txbf_module(struct mt7915_dev *dev);
-+int mt7915_mcu_set_txbf_sounding(struct mt7915_dev *dev);
- int mt7915_mcu_set_fcc5_lpn(struct mt7915_dev *dev, int val);
- int mt7915_mcu_set_pulse_th(struct mt7915_dev *dev,
- const struct mt7915_dfs_pulse *pulse);
-@@ -364,9 +352,7 @@ int mt7915_mcu_set_radar_th(struct mt7915_dev *dev, int index,
- const struct mt7915_dfs_pattern *pattern);
- int mt7915_mcu_apply_group_cal(struct mt7915_dev *dev);
- int mt7915_mcu_apply_tx_dpd(struct mt7915_phy *phy);
--int mt7915_mcu_get_chan_mib_info(struct mt7915_phy *phy, bool chan_switch);
--int mt7915_mcu_get_temperature(struct mt7915_phy *phy);
--int mt7915_mcu_set_thermal_throttling(struct mt7915_phy *phy, u8 state);
-+int mt7915_mcu_get_temperature(struct mt7915_dev *dev, int index);
- int mt7915_mcu_get_tx_rate(struct mt7915_dev *dev, u32 cmd, u16 wlan_idx);
- int mt7915_mcu_get_rx_rate(struct mt7915_phy *phy, struct ieee80211_vif *vif,
- struct ieee80211_sta *sta, struct rate_info *rate);
-@@ -388,11 +374,9 @@ void mt7915_dual_hif_set_irq_mask(struct mt7915_dev *dev, bool write_reg,
- static inline void mt7915_irq_enable(struct mt7915_dev *dev, u32 mask)
- {
- if (dev->hif2)
-- mt7915_dual_hif_set_irq_mask(dev, false, 0, mask);
-+ mt7915_dual_hif_set_irq_mask(dev, true, 0, mask);
- else
-- mt76_set_irq_mask(&dev->mt76, 0, 0, mask);
--
-- tasklet_schedule(&dev->irq_tasklet);
-+ mt76_set_irq_mask(&dev->mt76, MT_INT_MASK_CSR, 0, mask);
- }
-
- static inline void mt7915_irq_disable(struct mt7915_dev *dev, u32 mask)
-@@ -408,9 +392,12 @@ void mt7915_mac_reset_counters(struct mt7915_phy *phy);
- void mt7915_mac_cca_stats_reset(struct mt7915_phy *phy);
- void mt7915_mac_enable_nf(struct mt7915_dev *dev, bool ext_phy);
- void mt7915_mac_write_txwi(struct mt7915_dev *dev, __le32 *txwi,
-- struct sk_buff *skb, struct mt76_wcid *wcid, int pid,
-+ struct sk_buff *skb, struct mt76_wcid *wcid,
- struct ieee80211_key_conf *key, bool beacon);
- void mt7915_mac_set_timing(struct mt7915_phy *phy);
-+int mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb);
-+void mt7915_mac_fill_rx_vector(struct mt7915_dev *dev, struct sk_buff *skb);
-+void mt7915_mac_tx_free(struct mt7915_dev *dev, struct sk_buff *skb);
- int mt7915_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
- struct ieee80211_sta *sta);
- void mt7915_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
-@@ -430,11 +417,13 @@ void mt7915_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
- struct sk_buff *skb);
- void mt7915_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta, bool ps);
- void mt7915_stats_work(struct work_struct *work);
-+void mt7915_txp_skb_unmap(struct mt76_dev *dev,
-+ struct mt76_txwi_cache *txwi);
- int mt76_dfs_start_rdd(struct mt7915_dev *dev, bool force);
- int mt7915_dfs_init_radar_detector(struct mt7915_phy *phy);
- void mt7915_set_stream_he_caps(struct mt7915_phy *phy);
- void mt7915_set_stream_vht_txbf_caps(struct mt7915_phy *phy);
--void mt7915_update_channel(struct mt76_phy *mphy);
-+void mt7915_update_channel(struct mt76_dev *mdev);
- int mt7915_init_debugfs(struct mt7915_dev *dev);
- #ifdef CONFIG_MAC80211_DEBUGFS
- void mt7915_sta_add_debugfs(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/pci.c b/drivers/net/wireless/mediatek/mt76/mt7915/pci.c
-index 340b364da5f0..643f171884cf 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/pci.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/pci.c
-@@ -94,15 +94,11 @@ mt7915_rx_poll_complete(struct mt76_dev *mdev, enum mt76_rxq_id q)
- }
-
- /* TODO: support 2/4/6/8 MSI-X vectors */
--static void mt7915_irq_tasklet(struct tasklet_struct *t)
-+static irqreturn_t mt7915_irq_handler(int irq, void *dev_instance)
- {
-- struct mt7915_dev *dev = from_tasklet(dev, t, irq_tasklet);
-+ struct mt7915_dev *dev = dev_instance;
- u32 intr, intr1, mask;
-
-- mt76_wr(dev, MT_INT_MASK_CSR, 0);
-- if (dev->hif2)
-- mt76_wr(dev, MT_INT1_MASK_CSR, 0);
--
- intr = mt76_rr(dev, MT_INT_SOURCE_CSR);
- intr &= dev->mt76.mmio.irqmask;
- mt76_wr(dev, MT_INT_SOURCE_CSR, intr);
-@@ -115,6 +111,9 @@ static void mt7915_irq_tasklet(struct tasklet_struct *t)
- intr |= intr1;
- }
-
-+ if (!test_bit(MT76_STATE_INITIALIZED, &dev->mphy.state))
-+ return IRQ_NONE;
-+
- trace_dev_irq(&dev->mt76, intr, dev->mt76.mmio.irqmask);
-
- mask = intr & MT_INT_RX_DONE_ALL;
-@@ -151,20 +150,6 @@ static void mt7915_irq_tasklet(struct tasklet_struct *t)
- wake_up(&dev->reset_wait);
- }
- }
--}
--
--static irqreturn_t mt7915_irq_handler(int irq, void *dev_instance)
--{
-- struct mt7915_dev *dev = dev_instance;
--
-- mt76_wr(dev, MT_INT_MASK_CSR, 0);
-- if (dev->hif2)
-- mt76_wr(dev, MT_INT1_MASK_CSR, 0);
--
-- if (!test_bit(MT76_STATE_INITIALIZED, &dev->mphy.state))
-- return IRQ_NONE;
--
-- tasklet_schedule(&dev->irq_tasklet);
-
- return IRQ_HANDLED;
- }
-@@ -255,8 +240,6 @@ static int mt7915_pci_probe(struct pci_dev *pdev,
- if (ret)
- return ret;
-
-- mt76_pci_disable_aspm(pdev);
--
- if (id->device == 0x7916)
- return mt7915_pci_hif2_probe(pdev);
-
-@@ -267,18 +250,10 @@ static int mt7915_pci_probe(struct pci_dev *pdev,
-
- dev = container_of(mdev, struct mt7915_dev, mt76);
-
-- ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES);
-- if (ret < 0)
-- goto free;
--
- ret = mt7915_mmio_init(mdev, pcim_iomap_table(pdev)[0], pdev->irq);
- if (ret)
- goto error;
-
-- tasklet_setup(&dev->irq_tasklet, mt7915_irq_tasklet);
--
-- mt76_wr(dev, MT_INT_MASK_CSR, 0);
--
- /* master switch of PCIe tnterrupt enable */
- mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0xff);
-
-@@ -291,14 +266,10 @@ static int mt7915_pci_probe(struct pci_dev *pdev,
-
- ret = mt7915_register_device(dev);
- if (ret)
-- goto free_irq;
-+ goto error;
-
- return 0;
--free_irq:
-- devm_free_irq(mdev->dev, pdev->irq, dev);
- error:
-- pci_free_irq_vectors(pdev);
--free:
- mt76_free_device(&dev->mt76);
-
- return ret;
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/regs.h b/drivers/net/wireless/mediatek/mt76/mt7915/regs.h
-index a213b5cb82f8..efe0f2904c66 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/regs.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/regs.h
-@@ -82,6 +82,11 @@
- #define MT_TMAC_CTCR0_INS_DDLMT_EN BIT(17)
- #define MT_TMAC_CTCR0_INS_DDLMT_VHT_SMPDU_EN BIT(18)
-
-+#define MT_TMAC_FP0R0(_band) MT_WF_TMAC(_band, 0x020)
-+#define MT_TMAC_FP0R15(_band) MT_WF_TMAC(_band, 0x080)
-+#define MT_TMAC_FP0R18(_band) MT_WF_TMAC(_band, 0x270)
-+#define MT_TMAC_FP_MASK GENMASK(7, 0)
-+
- #define MT_TMAC_TFCR0(_band) MT_WF_TMAC(_band, 0x1e0)
-
- #define MT_WF_DMA_BASE(_band) ((_band) ? 0xa1e00 : 0x21e00)
-@@ -99,11 +104,6 @@
- #define MT_ETBF_TX_FB_CPL GENMASK(31, 16)
- #define MT_ETBF_TX_FB_TRI GENMASK(15, 0)
-
--#define MT_ETBF_RX_FB_CONT(_band) MT_WF_ETBF(_band, 0x068)
--#define MT_ETBF_RX_FB_BW GENMASK(7, 6)
--#define MT_ETBF_RX_FB_NC GENMASK(5, 3)
--#define MT_ETBF_RX_FB_NR GENMASK(2, 0)
--
- #define MT_ETBF_TX_APP_CNT(_band) MT_WF_ETBF(_band, 0x0f0)
- #define MT_ETBF_TX_IBF_CNT GENMASK(31, 16)
- #define MT_ETBF_TX_EBF_CNT GENMASK(15, 0)
-@@ -124,8 +124,6 @@
- #define MT_LPON_TCR(_band, n) MT_WF_LPON(_band, 0x0a8 + (n) * 4)
- #define MT_LPON_TCR_SW_MODE GENMASK(1, 0)
- #define MT_LPON_TCR_SW_WRITE BIT(0)
--#define MT_LPON_TCR_SW_ADJUST BIT(1)
--#define MT_LPON_TCR_SW_READ GENMASK(1, 0)
-
- /* MIB: band 0(0x24800), band 1(0xa4800) */
- #define MT_WF_MIB_BASE(_band) ((_band) ? 0xa4800 : 0x24800)
-@@ -134,9 +132,20 @@
- #define MT_MIB_SDR3(_band) MT_WF_MIB(_band, 0x014)
- #define MT_MIB_SDR3_FCS_ERR_MASK GENMASK(15, 0)
-
-+#define MT_MIB_SDR9(_band) MT_WF_MIB(_band, 0x02c)
-+#define MT_MIB_SDR9_BUSY_MASK GENMASK(23, 0)
-+
-+#define MT_MIB_SDR16(_band) MT_WF_MIB(_band, 0x048)
-+#define MT_MIB_SDR16_BUSY_MASK GENMASK(23, 0)
-+
- #define MT_MIB_SDR34(_band) MT_WF_MIB(_band, 0x090)
- #define MT_MIB_MU_BF_TX_CNT GENMASK(15, 0)
-
-+#define MT_MIB_SDR36(_band) MT_WF_MIB(_band, 0x098)
-+#define MT_MIB_SDR36_TXTIME_MASK GENMASK(23, 0)
-+#define MT_MIB_SDR37(_band) MT_WF_MIB(_band, 0x09c)
-+#define MT_MIB_SDR37_RXTIME_MASK GENMASK(23, 0)
-+
- #define MT_MIB_DR8(_band) MT_WF_MIB(_band, 0x0c0)
- #define MT_MIB_DR9(_band) MT_WF_MIB(_band, 0x0c4)
- #define MT_MIB_DR11(_band) MT_WF_MIB(_band, 0x0cc)
-@@ -149,6 +158,9 @@
- #define MT_MIB_BA_MISS_COUNT_MASK GENMASK(15, 0)
- #define MT_MIB_ACK_FAIL_COUNT_MASK GENMASK(31, 16)
-
-+#define MT_MIB_MB_SDR2(_band, n) MT_WF_MIB(_band, 0x108 + ((n) << 4))
-+#define MT_MIB_FRAME_RETRIES_COUNT_MASK GENMASK(15, 0)
-+
- #define MT_TX_AGG_CNT(_band, n) MT_WF_MIB(_band, 0x0a8 + ((n) << 2))
- #define MT_TX_AGG_CNT2(_band, n) MT_WF_MIB(_band, 0x164 + ((n) << 2))
- #define MT_MIB_ARNG(_band, n) MT_WF_MIB(_band, 0x4b8 + ((n) << 2))
-@@ -246,10 +258,14 @@
- #define MT_WF_RFCR1_DROP_CFEND BIT(7)
- #define MT_WF_RFCR1_DROP_CFACK BIT(8)
-
--#define MT_WF_RMAC_MIB_AIRTIME0(_band) MT_WF_RMAC(_band, 0x0380)
-+#define MT_WF_RMAC_MIB_TIME0(_band) MT_WF_RMAC(_band, 0x03c4)
- #define MT_WF_RMAC_MIB_RXTIME_CLR BIT(31)
- #define MT_WF_RMAC_MIB_RXTIME_EN BIT(30)
-
-+#define MT_WF_RMAC_MIB_AIRTIME14(_band) MT_WF_RMAC(_band, 0x03b8)
-+#define MT_MIB_OBSSTIME_MASK GENMASK(23, 0)
-+#define MT_WF_RMAC_MIB_AIRTIME0(_band) MT_WF_RMAC(_band, 0x0380)
-+
- /* WFDMA0 */
- #define MT_WFDMA0_BASE 0xd4000
- #define MT_WFDMA0(ofs) (MT_WFDMA0_BASE + (ofs))
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/testmode.h b/drivers/net/wireless/mediatek/mt76/mt7915/testmode.h
-index 397a6b5532bc..8f8533ef9859 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/testmode.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/testmode.h
-@@ -1,4 +1,4 @@
--/* SPDX-License-Identifier: ISC */
-+// SPDX-License-Identifier: ISC
- /* Copyright (C) 2020 MediaTek Inc. */
-
- #ifndef __MT7915_TESTMODE_H
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/Makefile b/drivers/net/wireless/mediatek/mt76/mt7921/Makefile
-index 0ebb59966a08..e531666f9fb4 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/Makefile
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/Makefile
-@@ -1,4 +1,4 @@
--# SPDX-License-Identifier: ISC
-+#SPDX-License-Identifier: ISC
-
- obj-$(CONFIG_MT7921E) += mt7921e.o
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/debugfs.c b/drivers/net/wireless/mediatek/mt76/mt7921/debugfs.c
-index 77468bdae460..6602903c0d02 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/debugfs.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/debugfs.c
-@@ -250,9 +250,6 @@ mt7921_pm_set(void *data, u64 val)
- ieee80211_iterate_active_interfaces(mphy->hw,
- IEEE80211_IFACE_ITER_RESUME_ALL,
- mt7921_pm_interface_iter, mphy->priv);
--
-- mt76_connac_mcu_set_deep_sleep(&dev->mt76, pm->ds_enable);
--
- mt7921_mutex_release(dev);
-
- return 0;
-@@ -270,36 +267,6 @@ mt7921_pm_get(void *data, u64 *val)
-
- DEFINE_DEBUGFS_ATTRIBUTE(fops_pm, mt7921_pm_get, mt7921_pm_set, "%lld\n");
-
--static int
--mt7921_deep_sleep_set(void *data, u64 val)
--{
-- struct mt7921_dev *dev = data;
-- struct mt76_connac_pm *pm = &dev->pm;
-- bool enable = !!val;
--
-- mt7921_mutex_acquire(dev);
-- if (pm->ds_enable != enable) {
-- mt76_connac_mcu_set_deep_sleep(&dev->mt76, enable);
-- pm->ds_enable = enable;
-- }
-- mt7921_mutex_release(dev);
--
-- return 0;
--}
--
--static int
--mt7921_deep_sleep_get(void *data, u64 *val)
--{
-- struct mt7921_dev *dev = data;
--
-- *val = dev->pm.ds_enable;
--
-- return 0;
--}
--
--DEFINE_DEBUGFS_ATTRIBUTE(fops_ds, mt7921_deep_sleep_get,
-- mt7921_deep_sleep_set, "%lld\n");
--
- static int
- mt7921_pm_stats(struct seq_file *s, void *data)
- {
-@@ -391,7 +358,6 @@ int mt7921_init_debugfs(struct mt7921_dev *dev)
- debugfs_create_file("chip_reset", 0600, dir, dev, &fops_reset);
- debugfs_create_devm_seqfile(dev->mt76.dev, "runtime_pm_stats", dir,
- mt7921_pm_stats);
-- debugfs_create_file("deep-sleep", 0600, dir, dev, &fops_ds);
-
- return 0;
- }
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/dma.c b/drivers/net/wireless/mediatek/mt76/mt7921/dma.c
-index 7d7d43a5422f..7fca7dc466b8 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/dma.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/dma.c
-@@ -74,7 +74,7 @@ static int mt7921_poll_tx(struct napi_struct *napi, int budget)
- mt7921_tx_cleanup(dev);
- if (napi_complete(napi))
- mt7921_irq_enable(dev, MT_INT_TX_DONE_ALL);
-- mt76_connac_pm_unref(&dev->mphy, &dev->pm);
-+ mt76_connac_pm_unref(&dev->pm);
-
- return 0;
- }
-@@ -92,7 +92,7 @@ static int mt7921_poll_rx(struct napi_struct *napi, int budget)
- return 0;
- }
- done = mt76_dma_rx_poll(napi, budget);
-- mt76_connac_pm_unref(&dev->mphy, &dev->pm);
-+ mt76_connac_pm_unref(&dev->pm);
-
- return done;
- }
-@@ -380,7 +380,9 @@ int mt7921_wpdma_reinit_cond(struct mt7921_dev *dev)
-
- int mt7921_dma_init(struct mt7921_dev *dev)
- {
-+ /* Increase buffer size to receive large VHT/HE MPDUs */
- struct mt76_bus_ops *bus_ops;
-+ int rx_buf_size = MT_RX_BUF_SIZE * 2;
- int ret;
-
- dev->bus_ops = dev->mt76.bus;
-@@ -428,7 +430,7 @@ int mt7921_dma_init(struct mt7921_dev *dev)
- ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU],
- MT7921_RXQ_MCU_WM,
- MT7921_RX_MCU_RING_SIZE,
-- MT_RX_BUF_SIZE, MT_RX_EVENT_RING_BASE);
-+ rx_buf_size, MT_RX_EVENT_RING_BASE);
- if (ret)
- return ret;
-
-@@ -436,14 +438,14 @@ int mt7921_dma_init(struct mt7921_dev *dev)
- ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU_WA],
- MT7921_RXQ_MCU_WM,
- MT7921_RX_MCU_RING_SIZE,
-- MT_RX_BUF_SIZE, MT_WFDMA0(0x540));
-+ rx_buf_size, MT_WFDMA0(0x540));
- if (ret)
- return ret;
-
- /* rx data */
- ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MAIN],
- MT7921_RXQ_BAND0, MT7921_RX_RING_SIZE,
-- MT_RX_BUF_SIZE, MT_RX_DATA_RING_BASE);
-+ rx_buf_size, MT_RX_DATA_RING_BASE);
- if (ret)
- return ret;
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/init.c b/drivers/net/wireless/mediatek/mt76/mt7921/init.c
-index a9ce10b98827..db7e436076b3 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/init.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/init.c
-@@ -7,6 +7,34 @@
- #include "mcu.h"
- #include "eeprom.h"
-
-+#define CCK_RATE(_idx, _rate) { \
-+ .bitrate = _rate, \
-+ .flags = IEEE80211_RATE_SHORT_PREAMBLE, \
-+ .hw_value = (MT_PHY_TYPE_CCK << 8) | (_idx), \
-+ .hw_value_short = (MT_PHY_TYPE_CCK << 8) | (4 + (_idx)), \
-+}
-+
-+#define OFDM_RATE(_idx, _rate) { \
-+ .bitrate = _rate, \
-+ .hw_value = (MT_PHY_TYPE_OFDM << 8) | (_idx), \
-+ .hw_value_short = (MT_PHY_TYPE_OFDM << 8) | (_idx), \
-+}
-+
-+static struct ieee80211_rate mt7921_rates[] = {
-+ CCK_RATE(0, 10),
-+ CCK_RATE(1, 20),
-+ CCK_RATE(2, 55),
-+ CCK_RATE(3, 110),
-+ OFDM_RATE(11, 60),
-+ OFDM_RATE(15, 90),
-+ OFDM_RATE(10, 120),
-+ OFDM_RATE(14, 180),
-+ OFDM_RATE(9, 240),
-+ OFDM_RATE(13, 360),
-+ OFDM_RATE(8, 480),
-+ OFDM_RATE(12, 540),
-+};
-+
- static const struct ieee80211_iface_limit if_limits[] = {
- {
- .max = MT7921_MAX_INTERFACES,
-@@ -51,7 +79,6 @@ mt7921_init_wiphy(struct ieee80211_hw *hw)
- hw->queues = 4;
- hw->max_rx_aggregation_subframes = 64;
- hw->max_tx_aggregation_subframes = 128;
-- hw->netdev_features = NETIF_F_RXCSUM;
-
- hw->radiotap_timestamp.units_pos =
- IEEE80211_RADIOTAP_TIMESTAMP_UNIT_US;
-@@ -62,8 +89,6 @@ mt7921_init_wiphy(struct ieee80211_hw *hw)
- hw->vif_data_size = sizeof(struct mt7921_vif);
-
- wiphy->iface_combinations = if_comb;
-- wiphy->flags &= ~WIPHY_FLAG_IBSS_RSN;
-- wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
- wiphy->n_iface_combinations = ARRAY_SIZE(if_comb);
- wiphy->max_scan_ie_len = MT76_CONNAC_SCAN_IE_LEN;
- wiphy->max_scan_ssids = 4;
-@@ -76,14 +101,12 @@ mt7921_init_wiphy(struct ieee80211_hw *hw)
- wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
- wiphy->reg_notifier = mt7921_regd_notifier;
-
-- wiphy->features |= NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR |
-- NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
-+ wiphy->features |= NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
- wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_SET_SCAN_DWELL);
-
- ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS);
- ieee80211_hw_set(hw, HAS_RATE_CONTROL);
- ieee80211_hw_set(hw, SUPPORTS_TX_ENCAP_OFFLOAD);
-- ieee80211_hw_set(hw, SUPPORTS_RX_DECAP_OFFLOAD);
- ieee80211_hw_set(hw, WANT_MONITOR_VIF);
- ieee80211_hw_set(hw, SUPPORTS_PS);
- ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS);
-@@ -111,15 +134,14 @@ mt7921_mac_init_band(struct mt7921_dev *dev, u8 band)
- mt76_clear(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_RXD_G5_EN);
- }
-
--int mt7921_mac_init(struct mt7921_dev *dev)
-+void mt7921_mac_init(struct mt7921_dev *dev)
- {
- int i;
-
- mt76_rmw_field(dev, MT_MDP_DCR1, MT_MDP_DCR1_MAX_RX_LEN, 1536);
-- /* enable hardware de-agg */
-- mt76_set(dev, MT_MDP_DCR0, MT_MDP_DCR0_DAMSDU_EN);
-- /* enable hardware rx header translation */
-- mt76_set(dev, MT_MDP_DCR0, MT_MDP_DCR0_RX_HDR_TRANS_EN);
-+ /* disable hardware de-agg */
-+ mt76_clear(dev, MT_MDP_DCR0, MT_MDP_DCR0_DAMSDU_EN);
-+ mt76_clear(dev, MT_MDP_DCR0, MT_MDP_DCR0_RX_HDR_TRANS_EN);
-
- for (i = 0; i < MT7921_WTBL_SIZE; i++)
- mt7921_mac_wtbl_update(dev, i,
-@@ -127,7 +149,7 @@ int mt7921_mac_init(struct mt7921_dev *dev)
- for (i = 0; i < 2; i++)
- mt7921_mac_init_band(dev, i);
-
-- return mt76_connac_mcu_set_rts_thresh(&dev->mt76, 0x92b, 0);
-+ mt76_connac_mcu_set_rts_thresh(&dev->mt76, 0x92b, 0);
- }
-
- static int mt7921_init_hardware(struct mt7921_dev *dev)
-@@ -167,7 +189,9 @@ static int mt7921_init_hardware(struct mt7921_dev *dev)
- dev->mt76.global_wcid.tx_info |= MT_WCID_TX_INFO_SET;
- rcu_assign_pointer(dev->mt76.wcid[idx], &dev->mt76.global_wcid);
-
-- return mt7921_mac_init(dev);
-+ mt7921_mac_init(dev);
-+
-+ return 0;
- }
-
- int mt7921_register_device(struct mt7921_dev *dev)
-@@ -186,6 +210,7 @@ int mt7921_register_device(struct mt7921_dev *dev)
- mutex_init(&dev->pm.mutex);
- init_waitqueue_head(&dev->pm.wait);
- spin_lock_init(&dev->pm.txq_lock);
-+ set_bit(MT76_STATE_PM, &dev->mphy.state);
- INIT_LIST_HEAD(&dev->phy.stats_list);
- INIT_DELAYED_WORK(&dev->mphy.mac_work, mt7921_mac_work);
- INIT_DELAYED_WORK(&dev->phy.scan_work, mt7921_scan_work);
-@@ -200,8 +225,6 @@ int mt7921_register_device(struct mt7921_dev *dev)
- dev->pm.idle_timeout = MT7921_PM_TIMEOUT;
- dev->pm.stats.last_wake_event = jiffies;
- dev->pm.stats.last_doze_event = jiffies;
-- dev->pm.enable = true;
-- dev->pm.ds_enable = true;
-
- ret = mt7921_init_hardware(dev);
- if (ret)
-@@ -216,33 +239,19 @@ int mt7921_register_device(struct mt7921_dev *dev)
- IEEE80211_HT_CAP_MAX_AMSDU;
- dev->mphy.sband_5g.sband.vht_cap.cap |=
- IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991 |
-- IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK |
-- IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
-- IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE |
-- (3 << IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT);
--
-+ IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK;
- dev->mphy.hw->wiphy->available_antennas_rx = dev->mphy.chainmask;
- dev->mphy.hw->wiphy->available_antennas_tx = dev->mphy.chainmask;
-
- mt76_set_stream_caps(&dev->mphy, true);
- mt7921_set_stream_he_caps(&dev->phy);
-
-- ret = mt76_register_device(&dev->mt76, true, mt76_rates,
-- ARRAY_SIZE(mt76_rates));
-+ ret = mt76_register_device(&dev->mt76, true, mt7921_rates,
-+ ARRAY_SIZE(mt7921_rates));
- if (ret)
- return ret;
-
-- ret = mt7921_init_debugfs(dev);
-- if (ret)
-- return ret;
--
-- ret = mt76_connac_mcu_set_deep_sleep(&dev->mt76, dev->pm.ds_enable);
-- if (ret)
-- return ret;
--
-- dev->hw_init_done = true;
--
-- return 0;
-+ return mt7921_init_debugfs(dev);
- }
-
- void mt7921_unregister_device(struct mt7921_dev *dev)
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mac.c b/drivers/net/wireless/mediatek/mt76/mt7921/mac.c
-index 7fe2e3a50428..d7d8c909acdf 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/mac.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mac.c
-@@ -308,24 +308,21 @@ mt7921_mac_assoc_rssi(struct mt7921_dev *dev, struct sk_buff *skb)
-
- int mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb)
- {
-- u32 csum_mask = MT_RXD0_NORMAL_IP_SUM | MT_RXD0_NORMAL_UDP_TCP_SUM;
- struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
-- bool hdr_trans, unicast, insert_ccmp_hdr = false;
-- u8 chfreq, qos_ctl = 0, remove_pad, amsdu_info;
-- __le32 *rxv = NULL, *rxd = (__le32 *)skb->data;
- struct mt76_phy *mphy = &dev->mt76.phy;
- struct mt7921_phy *phy = &dev->phy;
- struct ieee80211_supported_band *sband;
- struct ieee80211_hdr *hdr;
-- u32 rxd0 = le32_to_cpu(rxd[0]);
-+ __le32 *rxd = (__le32 *)skb->data;
-+ __le32 *rxv = NULL;
-+ u32 mode = 0;
- u32 rxd1 = le32_to_cpu(rxd[1]);
- u32 rxd2 = le32_to_cpu(rxd[2]);
- u32 rxd3 = le32_to_cpu(rxd[3]);
-- u32 rxd4 = le32_to_cpu(rxd[4]);
-- u16 seq_ctrl = 0;
-- __le16 fc = 0;
-- u32 mode = 0;
-+ bool unicast, insert_ccmp_hdr = false;
-+ u8 remove_pad;
- int i, idx;
-+ u8 chfreq;
-
- memset(status, 0, sizeof(*status));
-
-@@ -335,13 +332,9 @@ int mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb)
- if (!test_bit(MT76_STATE_RUNNING, &mphy->state))
- return -EINVAL;
-
-- if (rxd2 & MT_RXD2_NORMAL_AMSDU_ERR)
-- return -EINVAL;
--
- chfreq = FIELD_GET(MT_RXD3_NORMAL_CH_FREQ, rxd3);
- unicast = FIELD_GET(MT_RXD3_NORMAL_ADDR_TYPE, rxd3) == MT_RXD3_NORMAL_U2M;
- idx = FIELD_GET(MT_RXD1_NORMAL_WLAN_IDX, rxd1);
-- hdr_trans = rxd2 & MT_RXD2_NORMAL_HDR_TRANS;
- status->wcid = mt7921_rx_get_wcid(dev, idx, unicast);
-
- if (status->wcid) {
-@@ -364,9 +357,6 @@ int mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb)
- if (!sband->channels)
- return -EINVAL;
-
-- if ((rxd0 & csum_mask) == csum_mask)
-- skb->ip_summed = CHECKSUM_UNNECESSARY;
--
- if (rxd1 & MT_RXD1_NORMAL_FCS_ERR)
- status->flag |= RX_FLAG_FAILED_FCS_CRC;
-
-@@ -387,13 +377,6 @@ int mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb)
-
- rxd += 6;
- if (rxd1 & MT_RXD1_NORMAL_GROUP_4) {
-- u32 v0 = le32_to_cpu(rxd[0]);
-- u32 v2 = le32_to_cpu(rxd[2]);
--
-- fc = cpu_to_le16(FIELD_GET(MT_RXD6_FRAME_CONTROL, v0));
-- seq_ctrl = FIELD_GET(MT_RXD8_SEQ_CTRL, v2);
-- qos_ctl = FIELD_GET(MT_RXD8_QOS_CTL, v2);
--
- rxd += 4;
- if ((u8 *)rxd - skb->data >= skb->len)
- return -EINVAL;
-@@ -573,35 +556,10 @@ int mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb)
-
- skb_pull(skb, (u8 *)rxd - skb->data + 2 * remove_pad);
-
-- amsdu_info = FIELD_GET(MT_RXD4_NORMAL_PAYLOAD_FORMAT, rxd4);
-- status->amsdu = !!amsdu_info;
-- if (status->amsdu) {
-- status->first_amsdu = amsdu_info == MT_RXD4_FIRST_AMSDU_FRAME;
-- status->last_amsdu = amsdu_info == MT_RXD4_LAST_AMSDU_FRAME;
-- if (!hdr_trans) {
-- memmove(skb->data + 2, skb->data,
-- ieee80211_get_hdrlen_from_skb(skb));
-- skb_pull(skb, 2);
-- }
-- }
-+ if (insert_ccmp_hdr) {
-+ u8 key_id = FIELD_GET(MT_RXD1_NORMAL_KEY_ID, rxd1);
-
-- if (!hdr_trans) {
-- if (insert_ccmp_hdr) {
-- u8 key_id = FIELD_GET(MT_RXD1_NORMAL_KEY_ID, rxd1);
--
-- mt76_insert_ccmp_hdr(skb, key_id);
-- }
--
-- hdr = mt76_skb_get_hdr(skb);
-- fc = hdr->frame_control;
-- if (ieee80211_is_data_qos(fc)) {
-- seq_ctrl = le16_to_cpu(hdr->seq_ctrl);
-- qos_ctl = *ieee80211_get_qos_ctl(hdr);
-- }
-- } else {
-- status->flag &= ~(RX_FLAG_RADIOTAP_HE |
-- RX_FLAG_RADIOTAP_HE_MU);
-- status->flag |= RX_FLAG_8023;
-+ mt76_insert_ccmp_hdr(skb, key_id);
- }
-
- mt7921_mac_assoc_rssi(dev, skb);
-@@ -609,12 +567,14 @@ int mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb)
- if (rxv && status->flag & RX_FLAG_RADIOTAP_HE)
- mt7921_mac_decode_he_radiotap(skb, status, rxv, mode);
-
-- if (!status->wcid || !ieee80211_is_data_qos(fc))
-+ hdr = mt76_skb_get_hdr(skb);
-+ if (!status->wcid || !ieee80211_is_data_qos(hdr->frame_control))
- return 0;
-
-- status->aggr = unicast && !ieee80211_is_qos_nullfunc(fc);
-- status->seqno = IEEE80211_SEQ_TO_SN(seq_ctrl);
-- status->qos_ctl = qos_ctl;
-+ status->aggr = unicast &&
-+ !ieee80211_is_qos_nullfunc(hdr->frame_control);
-+ status->qos_ctl = *ieee80211_get_qos_ctl(hdr);
-+ status->seqno = IEEE80211_SEQ_TO_SN(le16_to_cpu(hdr->seq_ctrl));
-
- return 0;
- }
-@@ -732,23 +692,6 @@ mt7921_mac_write_txwi_80211(struct mt7921_dev *dev, __le32 *txwi,
- txwi[7] |= cpu_to_le32(val);
- }
-
--static void mt7921_update_txs(struct mt76_wcid *wcid, __le32 *txwi)
--{
-- struct mt7921_sta *msta = container_of(wcid, struct mt7921_sta, wcid);
-- u32 pid, frame_type = FIELD_GET(MT_TXD2_FRAME_TYPE, txwi[2]);
--
-- if (!(frame_type & (IEEE80211_FTYPE_DATA >> 2)))
-- return;
--
-- if (time_is_after_eq_jiffies(msta->next_txs_ts))
-- return;
--
-- msta->next_txs_ts = jiffies + msecs_to_jiffies(250);
-- pid = mt76_get_next_pkt_id(wcid);
-- txwi[5] |= cpu_to_le32(MT_TXD5_TX_STATUS_MCU |
-- FIELD_PREP(MT_TXD5_PID, pid));
--}
--
- void mt7921_mac_write_txwi(struct mt7921_dev *dev, __le32 *txwi,
- struct sk_buff *skb, struct mt76_wcid *wcid,
- struct ieee80211_key_conf *key, bool beacon)
-@@ -825,8 +768,6 @@ void mt7921_mac_write_txwi(struct mt7921_dev *dev, __le32 *txwi,
- txwi[6] |= cpu_to_le32(val);
- txwi[3] |= cpu_to_le32(MT_TXD3_BA_DISABLE);
- }
--
-- mt7921_update_txs(wcid, txwi);
- }
-
- static void
-@@ -1229,18 +1170,18 @@ mt7921_phy_update_channel(struct mt76_phy *mphy, int idx)
- state->noise = -(phy->noise >> 4);
- }
-
--void mt7921_update_channel(struct mt76_phy *mphy)
-+void mt7921_update_channel(struct mt76_dev *mdev)
- {
-- struct mt7921_dev *dev = container_of(mphy->dev, struct mt7921_dev, mt76);
-+ struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76);
-
-- if (mt76_connac_pm_wake(mphy, &dev->pm))
-+ if (mt76_connac_pm_wake(&dev->mphy, &dev->pm))
- return;
-
-- mt7921_phy_update_channel(mphy, 0);
-+ mt7921_phy_update_channel(&mdev->phy, 0);
- /* reset obss airtime */
- mt76_set(dev, MT_WF_RMAC_MIB_TIME0(0), MT_WF_RMAC_MIB_RXTIME_CLR);
-
-- mt76_connac_power_save_sched(mphy, &dev->pm);
-+ mt76_connac_power_save_sched(&dev->mphy, &dev->pm);
- }
-
- void mt7921_tx_token_put(struct mt7921_dev *dev)
-@@ -1288,7 +1229,6 @@ mt7921_mac_reset(struct mt7921_dev *dev)
- mt76_wr(dev, MT_WFDMA0_HOST_INT_ENA, 0);
- mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0x0);
-
-- set_bit(MT76_RESET, &dev->mphy.state);
- set_bit(MT76_MCU_RESET, &dev->mphy.state);
- wake_up(&dev->mt76.mcu.wait);
- skb_queue_purge(&dev->mt76.mcu.res_q);
-@@ -1304,13 +1244,19 @@ mt7921_mac_reset(struct mt7921_dev *dev)
- mt7921_tx_token_put(dev);
- idr_init(&dev->mt76.token);
-
-- mt7921_wpdma_reset(dev, true);
-+ err = mt7921_wpdma_reset(dev, true);
-+ if (err)
-+ return err;
-
- mt76_for_each_q_rx(&dev->mt76, i) {
- napi_enable(&dev->mt76.napi[i]);
- napi_schedule(&dev->mt76.napi[i]);
- }
-
-+ napi_enable(&dev->mt76.tx_napi);
-+ napi_schedule(&dev->mt76.tx_napi);
-+ mt76_worker_enable(&dev->mt76.tx_worker);
-+
- clear_bit(MT76_MCU_RESET, &dev->mphy.state);
-
- mt76_wr(dev, MT_WFDMA0_HOST_INT_ENA,
-@@ -1320,25 +1266,14 @@ mt7921_mac_reset(struct mt7921_dev *dev)
-
- err = mt7921_run_firmware(dev);
- if (err)
-- goto out;
-+ return err;
-
- err = mt7921_mcu_set_eeprom(dev);
- if (err)
-- goto out;
--
-- err = mt7921_mac_init(dev);
-- if (err)
-- goto out;
--
-- err = __mt7921_start(&dev->phy);
--out:
-- clear_bit(MT76_RESET, &dev->mphy.state);
--
-- napi_enable(&dev->mt76.tx_napi);
-- napi_schedule(&dev->mt76.tx_napi);
-- mt76_worker_enable(&dev->mt76.tx_worker);
-+ return err;
-
-- return err;
-+ mt7921_mac_init(dev);
-+ return __mt7921_start(&dev->phy);
- }
-
- /* system error recovery */
-@@ -1390,13 +1325,11 @@ void mt7921_reset(struct mt76_dev *mdev)
- {
- struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76);
-
-- if (!dev->hw_init_done)
-- return;
--
-- if (dev->hw_full_reset)
-+ if (!test_bit(MT76_STATE_RUNNING, &dev->mphy.state))
- return;
-
-- queue_work(dev->mt76.wq, &dev->reset_work);
-+ if (!dev->hw_full_reset)
-+ queue_work(dev->mt76.wq, &dev->reset_work);
- }
-
- static void
-@@ -1430,6 +1363,30 @@ mt7921_mac_update_mib_stats(struct mt7921_phy *phy)
- }
- }
-
-+static void
-+mt7921_mac_sta_stats_work(struct mt7921_phy *phy)
-+{
-+ struct mt7921_dev *dev = phy->dev;
-+ struct mt7921_sta *msta;
-+ LIST_HEAD(list);
-+
-+ spin_lock_bh(&dev->sta_poll_lock);
-+ list_splice_init(&phy->stats_list, &list);
-+
-+ while (!list_empty(&list)) {
-+ msta = list_first_entry(&list, struct mt7921_sta, stats_list);
-+ list_del_init(&msta->stats_list);
-+ spin_unlock_bh(&dev->sta_poll_lock);
-+
-+ /* query wtbl info to report tx rate for further devices */
-+ mt7921_get_wtbl_info(dev, msta->wcid.idx);
-+
-+ spin_lock_bh(&dev->sta_poll_lock);
-+ }
-+
-+ spin_unlock_bh(&dev->sta_poll_lock);
-+}
-+
- void mt7921_mac_work(struct work_struct *work)
- {
- struct mt7921_phy *phy;
-@@ -1441,12 +1398,16 @@ void mt7921_mac_work(struct work_struct *work)
-
- mt7921_mutex_acquire(phy->dev);
-
-- mt76_update_survey(mphy);
-+ mt76_update_survey(mphy->dev);
- if (++mphy->mac_work_count == 2) {
- mphy->mac_work_count = 0;
-
- mt7921_mac_update_mib_stats(phy);
- }
-+ if (++phy->sta_work_count == 4) {
-+ phy->sta_work_count = 0;
-+ mt7921_mac_sta_stats_work(phy);
-+ }
-
- mt7921_mutex_release(phy->dev);
- ieee80211_queue_delayed_work(phy->mt76->hw, &mphy->mac_work,
-@@ -1482,15 +1443,13 @@ void mt7921_pm_power_save_work(struct work_struct *work)
- {
- struct mt7921_dev *dev;
- unsigned long delta;
-- struct mt76_phy *mphy;
-
- dev = (struct mt7921_dev *)container_of(work, struct mt7921_dev,
- pm.ps_work.work);
-- mphy = dev->phy.mt76;
-
- delta = dev->pm.idle_timeout;
-- if (test_bit(MT76_HW_SCANNING, &mphy->state) ||
-- test_bit(MT76_HW_SCHED_SCANNING, &mphy->state))
-+ if (test_bit(MT76_HW_SCANNING, &dev->mphy.state) ||
-+ test_bit(MT76_HW_SCHED_SCANNING, &dev->mphy.state))
- goto out;
-
- if (time_is_after_jiffies(dev->pm.last_activity + delta)) {
-@@ -1498,10 +1457,8 @@ void mt7921_pm_power_save_work(struct work_struct *work)
- goto out;
- }
-
-- if (!mt7921_mcu_fw_pmctrl(dev)) {
-- cancel_delayed_work_sync(&mphy->mac_work);
-+ if (!mt7921_mcu_fw_pmctrl(dev))
- return;
-- }
- out:
- queue_delayed_work(dev->mt76.wq, &dev->pm.ps_work, delta);
- }
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mac.h b/drivers/net/wireless/mediatek/mt76/mt7921/mac.h
-index 3af67fac213d..109c8849d106 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/mac.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mac.h
-@@ -88,9 +88,6 @@ enum rx_pkt_type {
-
- /* RXD DW4 */
- #define MT_RXD4_NORMAL_PAYLOAD_FORMAT GENMASK(1, 0)
--#define MT_RXD4_FIRST_AMSDU_FRAME GENMASK(1, 0)
--#define MT_RXD4_MID_AMSDU_FRAME BIT(1)
--#define MT_RXD4_LAST_AMSDU_FRAME BIT(0)
- #define MT_RXD4_NORMAL_PATTERN_DROP BIT(9)
- #define MT_RXD4_NORMAL_CLS BIT(10)
- #define MT_RXD4_NORMAL_OFLD GENMASK(12, 11)
-@@ -100,17 +97,6 @@ enum rx_pkt_type {
- #define MT_RXD3_NORMAL_PF_MODE BIT(29)
- #define MT_RXD3_NORMAL_PF_STS GENMASK(31, 30)
-
--/* RXD GROUP4 */
--#define MT_RXD6_FRAME_CONTROL GENMASK(15, 0)
--#define MT_RXD6_TA_LO GENMASK(31, 16)
--
--#define MT_RXD7_TA_HI GENMASK(31, 0)
--
--#define MT_RXD8_SEQ_CTRL GENMASK(15, 0)
--#define MT_RXD8_QOS_CTL GENMASK(31, 16)
--
--#define MT_RXD9_HT_CONTROL GENMASK(31, 0)
--
- /* P-RXV DW0 */
- #define MT_PRXV_TX_RATE GENMASK(6, 0)
- #define MT_PRXV_TX_DCM BIT(4)
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/main.c b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
-index 63ec140c9c37..992a74e122e5 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/main.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
-@@ -79,14 +79,13 @@ mt7921_init_he_caps(struct mt7921_phy *phy, enum nl80211_band band,
- he_cap_elem->phy_cap_info[1] =
- IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD;
- he_cap_elem->phy_cap_info[2] =
-- IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US |
- IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ |
-- IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ |
-- IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
-- IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
-+ IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ;
-
- switch (i) {
- case NL80211_IFTYPE_STATION:
-+ he_cap_elem->mac_cap_info[0] |=
-+ IEEE80211_HE_MAC_CAP0_TWT_REQ;
- he_cap_elem->mac_cap_info[1] |=
- IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US;
-
-@@ -103,15 +102,7 @@ mt7921_init_he_caps(struct mt7921_phy *phy, enum nl80211_band band,
- he_cap_elem->phy_cap_info[3] |=
- IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_QPSK |
- IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_QPSK;
-- he_cap_elem->phy_cap_info[4] |=
-- IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE |
-- IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_4;
-- he_cap_elem->phy_cap_info[5] |=
-- IEEE80211_HE_PHY_CAP5_NG16_SU_FEEDBACK |
-- IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
- he_cap_elem->phy_cap_info[6] |=
-- IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_42_SU |
-- IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
- IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
- IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE |
- IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT;
-@@ -325,7 +316,7 @@ static void mt7921_remove_interface(struct ieee80211_hw *hw,
- spin_unlock_bh(&dev->sta_poll_lock);
- }
-
--static int mt7921_set_channel(struct mt7921_phy *phy)
-+int mt7921_set_channel(struct mt7921_phy *phy)
- {
- struct mt7921_dev *dev = phy->dev;
- int ret;
-@@ -389,7 +380,6 @@ static int mt7921_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
- case WLAN_CIPHER_SUITE_WEP104:
- if (!mvif->wep_sta)
- return -EOPNOTSUPP;
-- break;
- case WLAN_CIPHER_SUITE_TKIP:
- case WLAN_CIPHER_SUITE_CCMP:
- case WLAN_CIPHER_SUITE_CCMP_256:
-@@ -442,9 +432,6 @@ static int mt7921_config(struct ieee80211_hw *hw, u32 changed)
-
- mt7921_mutex_acquire(dev);
-
-- if (changed & IEEE80211_CONF_CHANGE_POWER)
-- mt76_connac_mcu_set_rate_txpower(phy->mt76);
--
- if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
- bool enabled = !!(hw->conf.flags & IEEE80211_CONF_MONITOR);
-
-@@ -590,8 +577,7 @@ static void mt7921_bss_info_changed(struct ieee80211_hw *hw,
- mt7921_mcu_uni_bss_ps(dev, vif);
-
- if (changed & BSS_CHANGED_ASSOC) {
-- mt7921_mcu_sta_update(dev, NULL, vif, true,
-- MT76_STA_INFO_STATE_ASSOC);
-+ mt7921_mcu_sta_add(dev, NULL, vif, true);
- mt7921_bss_bcnft_apply(dev, vif, info->assoc);
- }
-
-@@ -630,14 +616,17 @@ int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
- if (ret)
- return ret;
-
-- if (vif->type == NL80211_IFTYPE_STATION)
-+ if (vif->type == NL80211_IFTYPE_STATION) {
- mvif->wep_sta = msta;
-+ if (!sta->tdls)
-+ mt76_connac_mcu_uni_add_bss(&dev->mphy, vif,
-+ &mvif->sta.wcid, true);
-+ }
-
- mt7921_mac_wtbl_update(dev, idx,
- MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
-
-- ret = mt7921_mcu_sta_update(dev, sta, vif, true,
-- MT76_STA_INFO_STATE_NONE);
-+ ret = mt7921_mcu_sta_add(dev, sta, vif, true);
- if (ret)
- return ret;
-
-@@ -646,27 +635,6 @@ int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
- return 0;
- }
-
--void mt7921_mac_sta_assoc(struct mt76_dev *mdev, struct ieee80211_vif *vif,
-- struct ieee80211_sta *sta)
--{
-- struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76);
-- struct mt7921_sta *msta = (struct mt7921_sta *)sta->drv_priv;
-- struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
--
-- mt7921_mutex_acquire(dev);
--
-- if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls)
-- mt76_connac_mcu_uni_add_bss(&dev->mphy, vif, &mvif->sta.wcid,
-- true);
--
-- mt7921_mac_wtbl_update(dev, msta->wcid.idx,
-- MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
--
-- mt7921_mcu_sta_update(dev, sta, vif, true, MT76_STA_INFO_STATE_ASSOC);
--
-- mt7921_mutex_release(dev);
--}
--
- void mt7921_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
- struct ieee80211_sta *sta)
- {
-@@ -676,7 +644,7 @@ void mt7921_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
- mt76_connac_free_pending_tx_skbs(&dev->pm, &msta->wcid);
- mt76_connac_pm_wake(&dev->mphy, &dev->pm);
-
-- mt7921_mcu_sta_update(dev, sta, vif, false, MT76_STA_INFO_STATE_NONE);
-+ mt7921_mcu_sta_add(dev, sta, vif, false);
- mt7921_mac_wtbl_update(dev, msta->wcid.idx,
- MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
-
-@@ -711,7 +679,7 @@ void mt7921_tx_worker(struct mt76_worker *w)
- }
-
- mt76_txq_schedule_all(&dev->mphy);
-- mt76_connac_pm_unref(&dev->mphy, &dev->pm);
-+ mt76_connac_pm_unref(&dev->pm);
- }
-
- static void mt7921_tx(struct ieee80211_hw *hw,
-@@ -741,7 +709,7 @@ static void mt7921_tx(struct ieee80211_hw *hw,
-
- if (mt76_connac_pm_ref(mphy, &dev->pm)) {
- mt76_tx(mphy, control->sta, wcid, skb);
-- mt76_connac_pm_unref(mphy, &dev->pm);
-+ mt76_connac_pm_unref(&dev->pm);
- return;
- }
-
-@@ -822,21 +790,20 @@ mt7921_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- return ret;
- }
-
--static int mt7921_sta_state(struct ieee80211_hw *hw,
-- struct ieee80211_vif *vif,
-- struct ieee80211_sta *sta,
-- enum ieee80211_sta_state old_state,
-- enum ieee80211_sta_state new_state)
-+static int
-+mt7921_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
-+ struct ieee80211_sta *sta)
- {
-- struct mt7921_dev *dev = mt7921_hw_dev(hw);
--
-- if (dev->pm.ds_enable) {
-- mt7921_mutex_acquire(dev);
-- mt76_connac_sta_state_dp(&dev->mt76, old_state, new_state);
-- mt7921_mutex_release(dev);
-- }
-+ return mt76_sta_state(hw, vif, sta, IEEE80211_STA_NOTEXIST,
-+ IEEE80211_STA_NONE);
-+}
-
-- return mt76_sta_state(hw, vif, sta, old_state, new_state);
-+static int
-+mt7921_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
-+ struct ieee80211_sta *sta)
-+{
-+ return mt76_sta_state(hw, vif, sta, IEEE80211_STA_NONE,
-+ IEEE80211_STA_NOTEXIST);
- }
-
- static int
-@@ -1155,23 +1122,6 @@ static void mt7921_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- HZ / 2);
- }
-
--static void mt7921_sta_set_decap_offload(struct ieee80211_hw *hw,
-- struct ieee80211_vif *vif,
-- struct ieee80211_sta *sta,
-- bool enabled)
--{
-- struct mt7921_sta *msta = (struct mt7921_sta *)sta->drv_priv;
-- struct mt7921_dev *dev = mt7921_hw_dev(hw);
--
-- if (enabled)
-- set_bit(MT_WCID_FLAG_HDR_TRANS, &msta->wcid.flags);
-- else
-- clear_bit(MT_WCID_FLAG_HDR_TRANS, &msta->wcid.flags);
--
-- mt76_connac_mcu_sta_update_hdr_trans(&dev->mt76, vif, &msta->wcid,
-- MCU_UNI_CMD_STA_REC_UPDATE);
--}
--
- const struct ieee80211_ops mt7921_ops = {
- .tx = mt7921_tx,
- .start = mt7921_start,
-@@ -1182,10 +1132,10 @@ const struct ieee80211_ops mt7921_ops = {
- .conf_tx = mt7921_conf_tx,
- .configure_filter = mt7921_configure_filter,
- .bss_info_changed = mt7921_bss_info_changed,
-- .sta_state = mt7921_sta_state,
-+ .sta_add = mt7921_sta_add,
-+ .sta_remove = mt7921_sta_remove,
- .sta_pre_rcu_remove = mt76_sta_pre_rcu_remove,
- .set_key = mt7921_set_key,
-- .sta_set_decap_offload = mt7921_sta_set_decap_offload,
- .ampdu_action = mt7921_ampdu_action,
- .set_rts_threshold = mt7921_set_rts_threshold,
- .wake_tx_queue = mt76_wake_tx_queue,
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
-index 9fbaacc67cfa..fc0d7dc3a5f3 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
-@@ -398,6 +398,43 @@ mt7921_mcu_tx_rate_parse(struct mt76_phy *mphy,
- }
- }
-
-+static void
-+mt7921_mcu_tx_rate_report(struct mt7921_dev *dev, struct sk_buff *skb,
-+ u16 wlan_idx)
-+{
-+ struct mt7921_mcu_wlan_info_event *wtbl_info;
-+ struct mt76_phy *mphy = &dev->mphy;
-+ struct mt7921_sta_stats *stats;
-+ struct rate_info rate = {};
-+ struct mt7921_sta *msta;
-+ struct mt76_wcid *wcid;
-+ u8 idx;
-+
-+ if (wlan_idx >= MT76_N_WCIDS)
-+ return;
-+
-+ wtbl_info = (struct mt7921_mcu_wlan_info_event *)skb->data;
-+ idx = wtbl_info->rate_info.rate_idx;
-+ if (idx >= ARRAY_SIZE(wtbl_info->rate_info.rate))
-+ return;
-+
-+ rcu_read_lock();
-+
-+ wcid = rcu_dereference(dev->mt76.wcid[wlan_idx]);
-+ if (!wcid)
-+ goto out;
-+
-+ msta = container_of(wcid, struct mt7921_sta, wcid);
-+ stats = &msta->stats;
-+
-+ /* current rate */
-+ mt7921_mcu_tx_rate_parse(mphy, &wtbl_info->peer_cap, &rate,
-+ le16_to_cpu(wtbl_info->rate_info.rate[idx]));
-+ stats->tx_rate = rate;
-+out:
-+ rcu_read_unlock();
-+}
-+
- static void
- mt7921_mcu_scan_event(struct mt7921_dev *dev, struct sk_buff *skb)
- {
-@@ -497,49 +534,6 @@ mt7921_mcu_low_power_event(struct mt7921_dev *dev, struct sk_buff *skb)
- trace_lp_event(dev, event->state);
- }
-
--static void
--mt7921_mcu_tx_done_event(struct mt7921_dev *dev, struct sk_buff *skb)
--{
-- struct mt7921_mcu_tx_done_event *event;
-- struct mt7921_sta *msta;
-- struct mt7921_phy *mphy = &dev->phy;
-- struct mt7921_mcu_peer_cap peer;
-- struct ieee80211_sta *sta;
-- LIST_HEAD(list);
--
-- skb_pull(skb, sizeof(struct mt7921_mcu_rxd));
-- event = (struct mt7921_mcu_tx_done_event *)skb->data;
--
-- spin_lock_bh(&dev->sta_poll_lock);
-- list_splice_init(&mphy->stats_list, &list);
--
-- while (!list_empty(&list)) {
-- msta = list_first_entry(&list, struct mt7921_sta, stats_list);
-- list_del_init(&msta->stats_list);
--
-- if (msta->wcid.idx != event->wlan_idx)
-- continue;
--
-- spin_unlock_bh(&dev->sta_poll_lock);
--
-- sta = wcid_to_sta(&msta->wcid);
--
-- /* peer config based on IEEE SPEC */
-- memset(&peer, 0x0, sizeof(peer));
-- peer.bw = event->bw;
-- peer.g2 = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20);
-- peer.g4 = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40);
-- peer.g8 = !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80);
-- peer.g16 = !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160);
-- mt7921_mcu_tx_rate_parse(mphy->mt76, &peer,
-- &msta->stats.tx_rate, event->tx_rate);
--
-- spin_lock_bh(&dev->sta_poll_lock);
-- break;
-- }
-- spin_unlock_bh(&dev->sta_poll_lock);
--}
--
- static void
- mt7921_mcu_rx_unsolicited_event(struct mt7921_dev *dev, struct sk_buff *skb)
- {
-@@ -566,9 +560,6 @@ mt7921_mcu_rx_unsolicited_event(struct mt7921_dev *dev, struct sk_buff *skb)
- case MCU_EVENT_LP_INFO:
- mt7921_mcu_low_power_event(dev, skb);
- break;
-- case MCU_EVENT_TX_DONE:
-- mt7921_mcu_tx_done_event(dev, skb);
-- break;
- default:
- break;
- }
-@@ -589,7 +580,6 @@ void mt7921_mcu_rx_event(struct mt7921_dev *dev, struct sk_buff *skb)
- rxd->eid == MCU_EVENT_SCHED_SCAN_DONE ||
- rxd->eid == MCU_EVENT_BSS_ABSENCE ||
- rxd->eid == MCU_EVENT_SCAN_DONE ||
-- rxd->eid == MCU_EVENT_TX_DONE ||
- rxd->eid == MCU_EVENT_DBG_MSG ||
- rxd->eid == MCU_EVENT_COREDUMP ||
- rxd->eid == MCU_EVENT_LP_INFO ||
-@@ -956,6 +946,8 @@ static int mt7921_load_firmware(struct mt7921_dev *dev)
- dev->mt76.hw->wiphy->wowlan = &mt76_connac_wowlan_support;
- #endif /* CONFIG_PM */
-
-+ clear_bit(MT76_STATE_PM, &dev->mphy.state);
-+
- dev_err(dev->mt76.dev, "Firmware init done\n");
-
- return 0;
-@@ -989,7 +981,7 @@ int mt7921_run_firmware(struct mt7921_dev *dev)
- set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
- mt7921_mcu_fw_log_2_host(dev, 1);
-
-- return mt76_connac_mcu_get_nic_capability(&dev->mphy);
-+ return 0;
- }
-
- int mt7921_mcu_init(struct mt7921_dev *dev)
-@@ -1156,6 +1148,26 @@ int mt7921_mcu_get_eeprom(struct mt7921_dev *dev, u32 offset)
- return 0;
- }
-
-+u32 mt7921_get_wtbl_info(struct mt7921_dev *dev, u32 wlan_idx)
-+{
-+ struct mt7921_mcu_wlan_info wtbl_info = {
-+ .wlan_idx = cpu_to_le32(wlan_idx),
-+ };
-+ struct sk_buff *skb;
-+ int ret;
-+
-+ ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_CMD_GET_WTBL,
-+ &wtbl_info, sizeof(wtbl_info), true,
-+ &skb);
-+ if (ret)
-+ return ret;
-+
-+ mt7921_mcu_tx_rate_report(dev, skb, wlan_idx);
-+ dev_kfree_skb(skb);
-+
-+ return 0;
-+}
-+
- int mt7921_mcu_uni_bss_ps(struct mt7921_dev *dev, struct ieee80211_vif *vif)
- {
- struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
-@@ -1268,9 +1280,8 @@ int mt7921_mcu_set_bss_pm(struct mt7921_dev *dev, struct ieee80211_vif *vif,
- sizeof(req), false);
- }
-
--int mt7921_mcu_sta_update(struct mt7921_dev *dev, struct ieee80211_sta *sta,
-- struct ieee80211_vif *vif, bool enable,
-- enum mt76_sta_info_state state)
-+int mt7921_mcu_sta_add(struct mt7921_dev *dev, struct ieee80211_sta *sta,
-+ struct ieee80211_vif *vif, bool enable)
- {
- struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
- int rssi = -ewma_rssi_read(&mvif->rssi);
-@@ -1279,7 +1290,6 @@ int mt7921_mcu_sta_update(struct mt7921_dev *dev, struct ieee80211_sta *sta,
- .vif = vif,
- .enable = enable,
- .cmd = MCU_UNI_CMD_STA_REC_UPDATE,
-- .state = state,
- .offload_fw = true,
- .rcpi = to_rcpi(rssi),
- };
-@@ -1287,9 +1297,8 @@ int mt7921_mcu_sta_update(struct mt7921_dev *dev, struct ieee80211_sta *sta,
-
- msta = sta ? (struct mt7921_sta *)sta->drv_priv : NULL;
- info.wcid = msta ? &msta->wcid : &mvif->sta.wcid;
-- info.newly = msta ? state != MT76_STA_INFO_STATE_ASSOC : true;
-
-- return mt76_connac_mcu_sta_cmd(&dev->mphy, &info);
-+ return mt76_connac_mcu_add_sta_cmd(&dev->mphy, &info);
- }
-
- int __mt7921_mcu_drv_pmctrl(struct mt7921_dev *dev)
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.h b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.h
-index de3c091f6736..adad20819341 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.h
-@@ -81,7 +81,6 @@ enum {
- MCU_EVENT_REG_ACCESS = 0x05,
- MCU_EVENT_LP_INFO = 0x07,
- MCU_EVENT_SCAN_DONE = 0x0d,
-- MCU_EVENT_TX_DONE = 0x0f,
- MCU_EVENT_BSS_ABSENCE = 0x11,
- MCU_EVENT_BSS_BEACON_LOSS = 0x13,
- MCU_EVENT_CH_PRIVILEGE = 0x18,
-@@ -255,6 +254,86 @@ struct mt7921_mcu_reg_event {
- __le32 val;
- } __packed;
-
-+struct mt7921_mcu_tx_config {
-+ u8 peer_addr[ETH_ALEN];
-+ u8 sw;
-+ u8 dis_rx_hdr_tran;
-+
-+ u8 aad_om;
-+ u8 pfmu_idx;
-+ __le16 partial_aid;
-+
-+ u8 ibf;
-+ u8 ebf;
-+ u8 is_ht;
-+ u8 is_vht;
-+
-+ u8 mesh;
-+ u8 baf_en;
-+ u8 cf_ack;
-+ u8 rdg_ba;
-+
-+ u8 rdg;
-+ u8 pm;
-+ u8 rts;
-+ u8 smps;
-+
-+ u8 txop_ps;
-+ u8 not_update_ipsm;
-+ u8 skip_tx;
-+ u8 ldpc;
-+
-+ u8 qos;
-+ u8 from_ds;
-+ u8 to_ds;
-+ u8 dyn_bw;
-+
-+ u8 amdsu_cross_lg;
-+ u8 check_per;
-+ u8 gid_63;
-+ u8 he;
-+
-+ u8 vht_ibf;
-+ u8 vht_ebf;
-+ u8 vht_ldpc;
-+ u8 he_ldpc;
-+} __packed;
-+
-+struct mt7921_mcu_sec_config {
-+ u8 wpi_flag;
-+ u8 rv;
-+ u8 ikv;
-+ u8 rkv;
-+
-+ u8 rcid;
-+ u8 rca1;
-+ u8 rca2;
-+ u8 even_pn;
-+
-+ u8 key_id;
-+ u8 muar_idx;
-+ u8 cipher_suit;
-+ u8 rsv[1];
-+} __packed;
-+
-+struct mt7921_mcu_key_config {
-+ u8 key[32];
-+} __packed;
-+
-+struct mt7921_mcu_rate_info {
-+ u8 mpdu_fail;
-+ u8 mpdu_tx;
-+ u8 rate_idx;
-+ u8 rsv[1];
-+ __le16 rate[8];
-+} __packed;
-+
-+struct mt7921_mcu_ba_config {
-+ u8 ba_en;
-+ u8 rsv[3];
-+ __le32 ba_winsize;
-+} __packed;
-+
- struct mt7921_mcu_ant_id_config {
- u8 ant_id[4];
- } __packed;
-@@ -278,6 +357,41 @@ struct mt7921_mcu_peer_cap {
- u8 rsv[1];
- } __packed;
-
-+struct mt7921_mcu_rx_cnt {
-+ u8 rx_rcpi[4];
-+ u8 rx_cc[4];
-+ u8 rx_cc_sel;
-+ u8 ce_rmsd;
-+ u8 rsv[2];
-+} __packed;
-+
-+struct mt7921_mcu_tx_cnt {
-+ __le16 rate1_cnt;
-+ __le16 rate1_fail_cnt;
-+ __le16 rate2_cnt;
-+ __le16 rate3_cnt;
-+ __le16 cur_bw_tx_cnt;
-+ __le16 cur_bw_tx_fail_cnt;
-+ __le16 other_bw_tx_cnt;
-+ __le16 other_bw_tx_fail_cnt;
-+} __packed;
-+
-+struct mt7921_mcu_wlan_info_event {
-+ struct mt7921_mcu_tx_config tx_config;
-+ struct mt7921_mcu_sec_config sec_config;
-+ struct mt7921_mcu_key_config key_config;
-+ struct mt7921_mcu_rate_info rate_info;
-+ struct mt7921_mcu_ba_config ba_config;
-+ struct mt7921_mcu_peer_cap peer_cap;
-+ struct mt7921_mcu_rx_cnt rx_cnt;
-+ struct mt7921_mcu_tx_cnt tx_cnt;
-+} __packed;
-+
-+struct mt7921_mcu_wlan_info {
-+ __le32 wlan_idx;
-+ struct mt7921_mcu_wlan_info_event event;
-+} __packed;
-+
- struct mt7921_txpwr_req {
- u8 ver;
- u8 action;
-@@ -293,31 +407,4 @@ struct mt7921_txpwr_event {
- struct mt7921_txpwr txpwr;
- } __packed;
-
--struct mt7921_mcu_tx_done_event {
-- u8 pid;
-- u8 status;
-- u16 seq;
--
-- u8 wlan_idx;
-- u8 tx_cnt;
-- u16 tx_rate;
--
-- u8 flag;
-- u8 tid;
-- u8 rsp_rate;
-- u8 mcs;
--
-- u8 bw;
-- u8 tx_pwr;
-- u8 reason;
-- u8 rsv0[1];
--
-- u32 delay;
-- u32 timestamp;
-- u32 applied_flag;
--
-- u8 txs[28];
--
-- u8 rsv1[32];
--} __packed;
- #endif
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
-index 2d8bd6bfc820..957084c3ca43 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
-@@ -92,8 +92,6 @@ struct mt7921_sta {
- unsigned long ampdu_state;
-
- struct mt7921_sta_key_conf bip;
--
-- unsigned long next_txs_ts;
- };
-
- DECLARE_EWMA(rssi, 10, 8);
-@@ -160,8 +158,7 @@ struct mt7921_dev {
- u16 chainmask;
-
- struct work_struct reset_work;
-- bool hw_full_reset:1;
-- bool hw_init_done:1;
-+ bool hw_full_reset;
-
- struct list_head sta_poll_list;
- spinlock_t sta_poll_lock;
-@@ -262,9 +259,9 @@ int mt7921_mcu_init(struct mt7921_dev *dev);
- int mt7921_mcu_add_key(struct mt7921_dev *dev, struct ieee80211_vif *vif,
- struct mt7921_sta *msta, struct ieee80211_key_conf *key,
- enum set_key_cmd cmd);
--int mt7921_mcu_sta_update(struct mt7921_dev *dev, struct ieee80211_sta *sta,
-- struct ieee80211_vif *vif, bool enable,
-- enum mt76_sta_info_state state);
-+int mt7921_set_channel(struct mt7921_phy *phy);
-+int mt7921_mcu_sta_add(struct mt7921_dev *dev, struct ieee80211_sta *sta,
-+ struct ieee80211_vif *vif, bool enable);
- int mt7921_mcu_set_chan_info(struct mt7921_phy *phy, int cmd);
- int mt7921_mcu_set_tx(struct mt7921_dev *dev, struct ieee80211_vif *vif);
- int mt7921_mcu_set_eeprom(struct mt7921_dev *dev);
-@@ -324,7 +321,7 @@ static inline bool mt7921_dma_need_reinit(struct mt7921_dev *dev)
- return !mt76_get_field(dev, MT_WFDMA_DUMMY_CR, MT_WFDMA_NEED_REINIT);
- }
-
--int mt7921_mac_init(struct mt7921_dev *dev);
-+void mt7921_mac_init(struct mt7921_dev *dev);
- bool mt7921_mac_wtbl_update(struct mt7921_dev *dev, int idx, u32 mask);
- void mt7921_mac_reset_counters(struct mt7921_phy *phy);
- void mt7921_mac_write_txwi(struct mt7921_dev *dev, __le32 *txwi,
-@@ -336,8 +333,6 @@ void mt7921_mac_fill_rx_vector(struct mt7921_dev *dev, struct sk_buff *skb);
- void mt7921_mac_tx_free(struct mt7921_dev *dev, struct sk_buff *skb);
- int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
- struct ieee80211_sta *sta);
--void mt7921_mac_sta_assoc(struct mt76_dev *mdev, struct ieee80211_vif *vif,
-- struct ieee80211_sta *sta);
- void mt7921_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
- struct ieee80211_sta *sta);
- void mt7921_mac_work(struct work_struct *work);
-@@ -360,7 +355,7 @@ void mt7921_stats_work(struct work_struct *work);
- void mt7921_txp_skb_unmap(struct mt76_dev *dev,
- struct mt76_txwi_cache *txwi);
- void mt7921_set_stream_he_caps(struct mt7921_phy *phy);
--void mt7921_update_channel(struct mt76_phy *mphy);
-+void mt7921_update_channel(struct mt76_dev *mdev);
- int mt7921_init_debugfs(struct mt7921_dev *dev);
-
- int mt7921_mcu_uni_tx_ba(struct mt7921_dev *dev,
-@@ -370,6 +365,7 @@ int mt7921_mcu_uni_rx_ba(struct mt7921_dev *dev,
- struct ieee80211_ampdu_params *params,
- bool enable);
- void mt7921_scan_work(struct work_struct *work);
-+u32 mt7921_get_wtbl_info(struct mt7921_dev *dev, u32 wlan_idx);
- int mt7921_mcu_uni_bss_ps(struct mt7921_dev *dev, struct ieee80211_vif *vif);
- int mt7921_mcu_uni_bss_bcnft(struct mt7921_dev *dev, struct ieee80211_vif *vif,
- bool enable);
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
-index c3905bcab360..13263f50dc00 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
-@@ -106,7 +106,6 @@ static int mt7921_pci_probe(struct pci_dev *pdev,
- .rx_poll_complete = mt7921_rx_poll_complete,
- .sta_ps = mt7921_sta_ps,
- .sta_add = mt7921_mac_sta_add,
-- .sta_assoc = mt7921_mac_sta_assoc,
- .sta_remove = mt7921_mac_sta_remove,
- .update_survey = mt7921_update_channel,
- };
-@@ -208,10 +207,8 @@ static int mt7921_pci_suspend(struct pci_dev *pdev, pm_message_t state)
- goto restore_suspend;
- }
-
-- /* always enable deep sleep during suspend to reduce
-- * power consumption
-- */
-- mt76_connac_mcu_set_deep_sleep(&dev->mt76, true);
-+ if (!pm->enable)
-+ mt76_connac_mcu_set_deep_sleep(&dev->mt76, true);
-
- napi_disable(&mdev->tx_napi);
- mt76_worker_disable(&mdev->tx_worker);
-@@ -254,7 +251,7 @@ static int mt7921_pci_suspend(struct pci_dev *pdev, pm_message_t state)
- }
- napi_enable(&mdev->tx_napi);
-
-- if (!pm->ds_enable)
-+ if (!pm->enable)
- mt76_connac_mcu_set_deep_sleep(&dev->mt76, false);
-
- if (hif_suspend)
-@@ -270,10 +267,9 @@ static int mt7921_pci_resume(struct pci_dev *pdev)
- {
- struct mt76_dev *mdev = pci_get_drvdata(pdev);
- struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76);
-- struct mt76_connac_pm *pm = &dev->pm;
- int i, err;
-
-- pm->suspended = false;
-+ dev->pm.suspended = false;
- err = pci_set_power_state(pdev, PCI_D0);
- if (err)
- return err;
-@@ -304,8 +300,7 @@ static int mt7921_pci_resume(struct pci_dev *pdev)
- napi_enable(&mdev->tx_napi);
- napi_schedule(&mdev->tx_napi);
-
-- /* restore previous ds setting */
-- if (!pm->ds_enable)
-+ if (!dev->pm.enable)
- mt76_connac_mcu_set_deep_sleep(&dev->mt76, false);
-
- if (!test_bit(MT76_STATE_SUSPEND, &dev->mphy.state))
-diff --git a/drivers/net/wireless/mediatek/mt76/sdio.c b/drivers/net/wireless/mediatek/mt76/sdio.c
-index 783a15635ec5..a18d2896ee1f 100644
---- a/drivers/net/wireless/mediatek/mt76/sdio.c
-+++ b/drivers/net/wireless/mediatek/mt76/sdio.c
-@@ -184,6 +184,9 @@ static int mt76s_process_tx_queue(struct mt76_dev *dev, struct mt76_queue *q)
- if (!q->queued)
- wake_up(&dev->tx_wait);
-
-+ if (!mcu)
-+ mt76_txq_schedule(&dev->phy, q->qid);
-+
- return nframes;
- }
-
-@@ -192,28 +195,19 @@ static void mt76s_status_worker(struct mt76_worker *w)
- struct mt76_sdio *sdio = container_of(w, struct mt76_sdio,
- status_worker);
- struct mt76_dev *dev = container_of(sdio, struct mt76_dev, sdio);
-- bool resched = false;
- int i, nframes;
-
- do {
-- int ndata_frames = 0;
--
- nframes = mt76s_process_tx_queue(dev, dev->q_mcu[MT_MCUQ_WM]);
-
- for (i = 0; i <= MT_TXQ_PSD; i++)
-- ndata_frames += mt76s_process_tx_queue(dev,
-- dev->phy.q_tx[i]);
-- nframes += ndata_frames;
-- if (ndata_frames > 0)
-- resched = true;
-+ nframes += mt76s_process_tx_queue(dev,
-+ dev->phy.q_tx[i]);
-
- if (dev->drv->tx_status_data &&
- !test_and_set_bit(MT76_READING_STATS, &dev->phy.state))
- queue_work(dev->wq, &dev->sdio.stat_work);
- } while (nframes > 0);
--
-- if (resched)
-- mt76_worker_schedule(&dev->sdio.txrx_worker);
- }
-
- static void mt76s_tx_status_data(struct work_struct *work)
-@@ -262,7 +256,6 @@ mt76s_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q,
-
- q->entry[q->head].skb = tx_info.skb;
- q->entry[q->head].buf_sz = len;
-- q->entry[q->head].wcid = 0xffff;
-
- smp_wmb();
-
-diff --git a/drivers/net/wireless/mediatek/mt76/testmode.c b/drivers/net/wireless/mediatek/mt76/testmode.c
-index f73ffbd6e622..f614c887f323 100644
---- a/drivers/net/wireless/mediatek/mt76/testmode.c
-+++ b/drivers/net/wireless/mediatek/mt76/testmode.c
-@@ -88,8 +88,17 @@ static void
- mt76_testmode_free_skb(struct mt76_phy *phy)
- {
- struct mt76_testmode_data *td = &phy->test;
-+ struct sk_buff *skb = td->tx_skb;
-+
-+ if (!skb)
-+ return;
-
-- dev_kfree_skb(td->tx_skb);
-+ if (skb_has_frag_list(skb)) {
-+ kfree_skb_list(skb_shinfo(skb)->frag_list);
-+ skb_shinfo(skb)->frag_list = NULL;
-+ }
-+
-+ dev_kfree_skb(skb);
- td->tx_skb = NULL;
- }
-
-@@ -521,14 +530,6 @@ mt76_testmode_dump_stats(struct mt76_phy *phy, struct sk_buff *msg)
- u64 rx_fcs_error = 0;
- int i;
-
-- if (dev->test_ops->dump_stats) {
-- int ret;
--
-- ret = dev->test_ops->dump_stats(phy, msg);
-- if (ret)
-- return ret;
-- }
--
- for (i = 0; i < ARRAY_SIZE(td->rx_stats.packets); i++) {
- rx_packets += td->rx_stats.packets[i];
- rx_fcs_error += td->rx_stats.fcs_error[i];
-@@ -543,6 +544,9 @@ mt76_testmode_dump_stats(struct mt76_phy *phy, struct sk_buff *msg)
- MT76_TM_STATS_ATTR_PAD))
- return -EMSGSIZE;
-
-+ if (dev->test_ops->dump_stats)
-+ return dev->test_ops->dump_stats(phy, msg);
-+
- return 0;
- }
-
-diff --git a/drivers/net/wireless/mediatek/mt76/tx.c b/drivers/net/wireless/mediatek/mt76/tx.c
-index f0f7a913eaab..441d06e30b1a 100644
---- a/drivers/net/wireless/mediatek/mt76/tx.c
-+++ b/drivers/net/wireless/mediatek/mt76/tx.c
-@@ -54,23 +54,11 @@ mt76_tx_status_unlock(struct mt76_dev *dev, struct sk_buff_head *list)
-
- spin_unlock_bh(&dev->status_list.lock);
-
-- rcu_read_lock();
- while ((skb = __skb_dequeue(list)) != NULL) {
-- struct ieee80211_tx_status status = {
-- .skb = skb,
-- .info = IEEE80211_SKB_CB(skb),
-- };
-- struct mt76_tx_cb *cb = mt76_tx_skb_cb(skb);
-- struct mt76_wcid *wcid;
--
-- wcid = rcu_dereference(dev->wcid[cb->wcid]);
-- if (wcid)
-- status.sta = wcid_to_sta(wcid);
--
- hw = mt76_tx_status_get_hw(dev, skb);
-- ieee80211_tx_status_ext(hw, &status);
-+ ieee80211_tx_status(hw, skb);
- }
-- rcu_read_unlock();
-+
- }
- EXPORT_SYMBOL_GPL(mt76_tx_status_unlock);
-
-@@ -92,7 +80,7 @@ __mt76_tx_status_skb_done(struct mt76_dev *dev, struct sk_buff *skb, u8 flags,
-
- /* Tx status can be unreliable. if it fails, mark the frame as ACKed */
- if (flags & MT_TX_CB_TXS_FAILED) {
-- info->status.rates[0].count = 0;
-+ ieee80211_tx_info_clear_status(info);
- info->status.rates[0].idx = -1;
- info->flags |= IEEE80211_TX_STAT_ACK;
- }
-@@ -129,7 +117,12 @@ mt76_tx_status_skb_add(struct mt76_dev *dev, struct mt76_wcid *wcid,
- spin_lock_bh(&dev->status_list.lock);
-
- memset(cb, 0, sizeof(*cb));
-- pid = mt76_get_next_pkt_id(wcid);
-+ wcid->packet_id = (wcid->packet_id + 1) & MT_PACKET_ID_MASK;
-+ if (wcid->packet_id == MT_PACKET_ID_NO_ACK ||
-+ wcid->packet_id == MT_PACKET_ID_NO_SKB)
-+ wcid->packet_id = MT_PACKET_ID_FIRST;
-+
-+ pid = wcid->packet_id;
- cb->wcid = wcid->idx;
- cb->pktid = pid;
- cb->jiffies = jiffies;
-@@ -180,37 +173,36 @@ mt76_tx_status_check(struct mt76_dev *dev, struct mt76_wcid *wcid, bool flush)
- EXPORT_SYMBOL_GPL(mt76_tx_status_check);
-
- static void
--mt76_tx_check_non_aql(struct mt76_dev *dev, struct mt76_wcid *wcid,
-- struct sk_buff *skb)
-+mt76_tx_check_non_aql(struct mt76_dev *dev, u16 wcid_idx, struct sk_buff *skb)
- {
- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-+ struct mt76_wcid *wcid;
- int pending;
-
-- if (!wcid || info->tx_time_est)
-+ if (info->tx_time_est)
-+ return;
-+
-+ if (wcid_idx >= ARRAY_SIZE(dev->wcid))
- return;
-
-- pending = atomic_dec_return(&wcid->non_aql_packets);
-- if (pending < 0)
-- atomic_cmpxchg(&wcid->non_aql_packets, pending, 0);
-+ rcu_read_lock();
-+
-+ wcid = rcu_dereference(dev->wcid[wcid_idx]);
-+ if (wcid) {
-+ pending = atomic_dec_return(&wcid->non_aql_packets);
-+ if (pending < 0)
-+ atomic_cmpxchg(&wcid->non_aql_packets, pending, 0);
-+ }
-+
-+ rcu_read_unlock();
- }
-
--void __mt76_tx_complete_skb(struct mt76_dev *dev, u16 wcid_idx, struct sk_buff *skb,
-- struct list_head *free_list)
-+void mt76_tx_complete_skb(struct mt76_dev *dev, u16 wcid_idx, struct sk_buff *skb)
- {
-- struct ieee80211_tx_status status = {
-- .skb = skb,
-- .free_list = free_list,
-- };
-- struct mt76_wcid *wcid = NULL;
- struct ieee80211_hw *hw;
- struct sk_buff_head list;
-
-- rcu_read_lock();
--
-- if (wcid_idx < ARRAY_SIZE(dev->wcid))
-- wcid = rcu_dereference(dev->wcid[wcid_idx]);
--
-- mt76_tx_check_non_aql(dev, wcid, skb);
-+ mt76_tx_check_non_aql(dev, wcid_idx, skb);
-
- #ifdef CONFIG_NL80211_TESTMODE
- if (mt76_is_testmode_skb(dev, skb, &hw)) {
-@@ -222,25 +214,21 @@ void __mt76_tx_complete_skb(struct mt76_dev *dev, u16 wcid_idx, struct sk_buff *
- wake_up(&dev->tx_wait);
-
- dev_kfree_skb_any(skb);
-- goto out;
-+ return;
- }
- #endif
-
- if (!skb->prev) {
- hw = mt76_tx_status_get_hw(dev, skb);
-- status.sta = wcid_to_sta(wcid);
-- ieee80211_tx_status_ext(hw, &status);
-- goto out;
-+ ieee80211_free_txskb(hw, skb);
-+ return;
- }
-
- mt76_tx_status_lock(dev, &list);
- __mt76_tx_status_skb_done(dev, skb, MT_TX_CB_DMA_DONE, &list);
- mt76_tx_status_unlock(dev, &list);
--
--out:
-- rcu_read_unlock();
- }
--EXPORT_SYMBOL_GPL(__mt76_tx_complete_skb);
-+EXPORT_SYMBOL_GPL(mt76_tx_complete_skb);
-
- static int
- __mt76_tx_queue_skb(struct mt76_phy *phy, int qid, struct sk_buff *skb,
-@@ -256,15 +244,11 @@ __mt76_tx_queue_skb(struct mt76_phy *phy, int qid, struct sk_buff *skb,
-
- non_aql = !info->tx_time_est;
- idx = dev->queue_ops->tx_queue_skb(dev, q, skb, wcid, sta);
-- if (idx < 0 || !sta)
-+ if (idx < 0 || !sta || !non_aql)
- return idx;
-
- wcid = (struct mt76_wcid *)sta->drv_priv;
- q->entry[idx].wcid = wcid->idx;
--
-- if (!non_aql)
-- return idx;
--
- pending = atomic_inc_return(&wcid->non_aql_packets);
- if (stop && pending >= MT_MAX_NON_AQL_PKT)
- *stop = true;
-diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c
-index 1e9f60bb811a..30bc54e98c58 100644
---- a/drivers/net/wireless/mediatek/mt76/usb.c
-+++ b/drivers/net/wireless/mediatek/mt76/usb.c
-@@ -925,7 +925,6 @@ mt76u_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q,
-
- q->head = (q->head + 1) % q->ndesc;
- q->entry[idx].skb = tx_info.skb;
-- q->entry[idx].wcid = 0xffff;
- q->queued++;
-
- return idx;
-diff --git a/drivers/net/wireless/mediatek/mt7601u/usb.c b/drivers/net/wireless/mediatek/mt7601u/usb.c
-index cc772045d526..6bcc4a13ae6c 100644
---- a/drivers/net/wireless/mediatek/mt7601u/usb.c
-+++ b/drivers/net/wireless/mediatek/mt7601u/usb.c
-@@ -26,7 +26,6 @@ static const struct usb_device_id mt7601u_device_table[] = {
- { USB_DEVICE(0x2717, 0x4106) },
- { USB_DEVICE(0x2955, 0x0001) },
- { USB_DEVICE(0x2955, 0x1001) },
-- { USB_DEVICE(0x2955, 0x1003) },
- { USB_DEVICE(0x2a5f, 0x1000) },
- { USB_DEVICE(0x7392, 0x7710) },
- { 0, }