diff --git a/package/kernel/mt76/Makefile b/package/kernel/mt76/Makefile index f525877fd7..c94d76456e 100644 --- a/package/kernel/mt76/Makefile +++ b/package/kernel/mt76/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mt76 -PKG_RELEASE=1 +PKG_RELEASE=2 PKG_LICENSE:=BSD-3-Clause-Clear PKG_LICENSE_FILES:= diff --git a/package/kernel/mt76/patches/001-wifi-cfg80211-mac80211-Add-support-to-get-radio-inde.patch b/package/kernel/mt76/patches/001-wifi-cfg80211-mac80211-Add-support-to-get-radio-inde.patch new file mode 100644 index 0000000000..1ef903918f --- /dev/null +++ b/package/kernel/mt76/patches/001-wifi-cfg80211-mac80211-Add-support-to-get-radio-inde.patch @@ -0,0 +1,406 @@ +From 6434ec7449b854fbdf8b1cab9c142e67a0a8a9a4 Mon Sep 17 00:00:00 2001 +From: Roopni Devanathan +Date: Sun, 15 Jun 2025 13:53:09 +0530 +Subject: [PATCH] wifi: cfg80211/mac80211: Add support to get radio index + +Currently, per-radio attributes are set on per-phy basis, i.e., all the +radios present in a wiphy will take attributes values sent from user. But +each radio in a wiphy can get different values from userspace based on +its requirement. + +To extend support to set per-radio attributes, add support to get radio +index from userspace. Add an NL attribute - NL80211_ATTR_WIPHY_RADIO_INDEX, +to get user specified radio index for which attributes should be changed. +Pass this to individual drivers, so that the drivers can use this radio +index to change per-radio attributes when necessary. Currently, per-radio +attributes identified are: +NL80211_ATTR_WIPHY_TX_POWER_LEVEL +NL80211_ATTR_WIPHY_ANTENNA_TX +NL80211_ATTR_WIPHY_ANTENNA_RX +NL80211_ATTR_WIPHY_RETRY_SHORT +NL80211_ATTR_WIPHY_RETRY_LONG +NL80211_ATTR_WIPHY_FRAG_THRESHOLD +NL80211_ATTR_WIPHY_RTS_THRESHOLD +NL80211_ATTR_WIPHY_COVERAGE_CLASS +NL80211_ATTR_TXQ_LIMIT +NL80211_ATTR_TXQ_MEMORY_LIMIT +NL80211_ATTR_TXQ_QUANTUM + +By default, the radio index is set to -1. This means the attribute should +be treated as a global configuration. If the user has not specified any +index, then the radio index passed to individual drivers would be -1. This +would indicate that the attribute applies to all radios in that wiphy. + +Signed-off-by: Roopni Devanathan +Link: https://patch.msgid.link/20250615082312.619639-2-quic_rdevanat@quicinc.com +Signed-off-by: Johannes Berg +--- + mac80211.c | 3 ++- + mt76.h | 3 ++- + mt7603/main.c | 5 +++-- + mt7615/main.c | 11 +++++++---- + mt76x0/main.c | 2 +- + mt76x0/mt76x0.h | 2 +- + mt76x02.h | 4 ++-- + mt76x02_util.c | 4 ++-- + mt76x2/pci_main.c | 6 +++--- + mt76x2/usb_main.c | 2 +- + mt7915/main.c | 13 ++++++++----- + mt7921/main.c | 8 +++++--- + mt7925/main.c | 8 +++++--- + mt792x.h | 3 ++- + mt792x_core.c | 3 ++- + mt7996/main.c | 11 +++++++---- + 16 files changed, 53 insertions(+), 35 deletions(-) + +--- a/mac80211.c ++++ b/mac80211.c +@@ -1936,7 +1936,8 @@ void mt76_sw_scan_complete(struct ieee80 + } + EXPORT_SYMBOL_GPL(mt76_sw_scan_complete); + +-int mt76_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant) ++int mt76_get_antenna(struct ieee80211_hw *hw, int radio_idx, u32 *tx_ant, ++ u32 *rx_ant) + { + struct mt76_phy *phy = hw->priv; + struct mt76_dev *dev = phy->dev; +--- a/mt76.h ++++ b/mt76.h +@@ -1598,7 +1598,8 @@ int mt76_get_sar_power(struct mt76_phy * + void mt76_csa_check(struct mt76_dev *dev); + void mt76_csa_finish(struct mt76_dev *dev); + +-int mt76_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant); ++int mt76_get_antenna(struct ieee80211_hw *hw, int radio_idx, u32 *tx_ant, ++ u32 *rx_ant); + int mt76_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta, bool set); + void mt76_insert_ccmp_hdr(struct sk_buff *skb, u8 key_id); + int mt76_get_rate(struct mt76_dev *dev, +--- a/mt7603/main.c ++++ b/mt7603/main.c +@@ -216,7 +216,7 @@ static int mt7603_set_sar_specs(struct i + } + + static int +-mt7603_config(struct ieee80211_hw *hw, u32 changed) ++mt7603_config(struct ieee80211_hw *hw, int radio_idx, u32 changed) + { + struct mt7603_dev *dev = hw->priv; + int ret = 0; +@@ -657,7 +657,8 @@ mt7603_sta_rate_tbl_update(struct ieee80 + } + + static void +-mt7603_set_coverage_class(struct ieee80211_hw *hw, s16 coverage_class) ++mt7603_set_coverage_class(struct ieee80211_hw *hw, int radio_idx, ++ s16 coverage_class) + { + struct mt7603_dev *dev = hw->priv; + +--- a/mt7615/main.c ++++ b/mt7615/main.c +@@ -420,7 +420,7 @@ static int mt7615_set_sar_specs(struct i + return mt76_update_channel(phy->mt76); + } + +-static int mt7615_config(struct ieee80211_hw *hw, u32 changed) ++static int mt7615_config(struct ieee80211_hw *hw, int radio_idx, u32 changed) + { + struct mt7615_dev *dev = mt7615_hw_dev(hw); + struct mt7615_phy *phy = mt7615_hw_phy(hw); +@@ -784,7 +784,8 @@ static void mt7615_tx(struct ieee80211_h + mt76_connac_pm_queue_skb(hw, &dev->pm, wcid, skb); + } + +-static int mt7615_set_rts_threshold(struct ieee80211_hw *hw, u32 val) ++static int mt7615_set_rts_threshold(struct ieee80211_hw *hw, int radio_idx, ++ u32 val) + { + struct mt7615_dev *dev = mt7615_hw_dev(hw); + struct mt7615_phy *phy = mt7615_hw_phy(hw); +@@ -972,7 +973,8 @@ mt7615_offset_tsf(struct ieee80211_hw *h + } + + static void +-mt7615_set_coverage_class(struct ieee80211_hw *hw, s16 coverage_class) ++mt7615_set_coverage_class(struct ieee80211_hw *hw, int radio_idx, ++ s16 coverage_class) + { + struct mt7615_phy *phy = mt7615_hw_phy(hw); + struct mt7615_dev *dev = phy->dev; +@@ -984,7 +986,8 @@ mt7615_set_coverage_class(struct ieee802 + } + + static int +-mt7615_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant) ++mt7615_set_antenna(struct ieee80211_hw *hw, int radio_idx, ++ u32 tx_ant, u32 rx_ant) + { + struct mt7615_dev *dev = mt7615_hw_dev(hw); + struct mt7615_phy *phy = mt7615_hw_phy(hw); +--- a/mt76x0/main.c ++++ b/mt76x0/main.c +@@ -57,7 +57,7 @@ out: + } + EXPORT_SYMBOL_GPL(mt76x0_set_sar_specs); + +-int mt76x0_config(struct ieee80211_hw *hw, u32 changed) ++int mt76x0_config(struct ieee80211_hw *hw, int radio_idx, u32 changed) + { + struct mt76x02_dev *dev = hw->priv; + +--- a/mt76x0/mt76x0.h ++++ b/mt76x0/mt76x0.h +@@ -48,7 +48,7 @@ void mt76x0_chip_onoff(struct mt76x02_de + + void mt76x0_mac_stop(struct mt76x02_dev *dev); + +-int mt76x0_config(struct ieee80211_hw *hw, u32 changed); ++int mt76x0_config(struct ieee80211_hw *hw, int radio_idx, u32 changed); + int mt76x0_set_channel(struct mt76_phy *mphy); + int mt76x0_set_sar_specs(struct ieee80211_hw *hw, + const struct cfg80211_sar_specs *sar); +--- a/mt76x02.h ++++ b/mt76x02.h +@@ -183,8 +183,8 @@ void mt76x02_wdt_work(struct work_struct + void mt76x02_tx_set_txpwr_auto(struct mt76x02_dev *dev, s8 txpwr); + void mt76x02_set_tx_ackto(struct mt76x02_dev *dev); + void mt76x02_set_coverage_class(struct ieee80211_hw *hw, +- s16 coverage_class); +-int mt76x02_set_rts_threshold(struct ieee80211_hw *hw, u32 val); ++ int radio_idx, s16 coverage_class); ++int mt76x02_set_rts_threshold(struct ieee80211_hw *hw, int radio_idx, u32 val); + void mt76x02_remove_hdr_pad(struct sk_buff *skb, int len); + bool mt76x02_tx_status_data(struct mt76_dev *mdev, u8 *update); + void mt76x02_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q, +--- a/mt76x02_util.c ++++ b/mt76x02_util.c +@@ -548,7 +548,7 @@ void mt76x02_set_tx_ackto(struct mt76x02 + EXPORT_SYMBOL_GPL(mt76x02_set_tx_ackto); + + void mt76x02_set_coverage_class(struct ieee80211_hw *hw, +- s16 coverage_class) ++ int radio_idx, s16 coverage_class) + { + struct mt76x02_dev *dev = hw->priv; + +@@ -559,7 +559,7 @@ void mt76x02_set_coverage_class(struct i + } + EXPORT_SYMBOL_GPL(mt76x02_set_coverage_class); + +-int mt76x02_set_rts_threshold(struct ieee80211_hw *hw, u32 val) ++int mt76x02_set_rts_threshold(struct ieee80211_hw *hw, int radio_idx, u32 val) + { + struct mt76x02_dev *dev = hw->priv; + +--- a/mt76x2/pci_main.c ++++ b/mt76x2/pci_main.c +@@ -54,7 +54,7 @@ int mt76x2e_set_channel(struct mt76_phy + } + + static int +-mt76x2_config(struct ieee80211_hw *hw, u32 changed) ++mt76x2_config(struct ieee80211_hw *hw, int radio_idx, u32 changed) + { + struct mt76x02_dev *dev = hw->priv; + +@@ -99,8 +99,8 @@ mt76x2_flush(struct ieee80211_hw *hw, st + { + } + +-static int mt76x2_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, +- u32 rx_ant) ++static int mt76x2_set_antenna(struct ieee80211_hw *hw, int radio_idx, ++ u32 tx_ant, u32 rx_ant) + { + struct mt76x02_dev *dev = hw->priv; + +--- a/mt76x2/usb_main.c ++++ b/mt76x2/usb_main.c +@@ -50,7 +50,7 @@ int mt76x2u_set_channel(struct mt76_phy + } + + static int +-mt76x2u_config(struct ieee80211_hw *hw, u32 changed) ++mt76x2u_config(struct ieee80211_hw *hw, int radio_idx, u32 changed) + { + struct mt76x02_dev *dev = hw->priv; + int err = 0; +--- a/mt7915/main.c ++++ b/mt7915/main.c +@@ -449,7 +449,8 @@ out: + return err; + } + +-static int mt7915_config(struct ieee80211_hw *hw, u32 changed) ++static int mt7915_config(struct ieee80211_hw *hw, int radio_idx, ++ u32 changed) + { + struct mt7915_dev *dev = mt7915_hw_dev(hw); + struct mt7915_phy *phy = mt7915_hw_phy(hw); +@@ -913,7 +914,8 @@ static void mt7915_tx(struct ieee80211_h + mt76_tx(mphy, control->sta, wcid, skb); + } + +-static int mt7915_set_rts_threshold(struct ieee80211_hw *hw, u32 val) ++static int mt7915_set_rts_threshold(struct ieee80211_hw *hw, int radio_idx, ++ u32 val) + { + struct mt7915_dev *dev = mt7915_hw_dev(hw); + struct mt7915_phy *phy = mt7915_hw_phy(hw); +@@ -1109,7 +1111,8 @@ mt7915_offset_tsf(struct ieee80211_hw *h + } + + static void +-mt7915_set_coverage_class(struct ieee80211_hw *hw, s16 coverage_class) ++mt7915_set_coverage_class(struct ieee80211_hw *hw, int radio_idx, ++ s16 coverage_class) + { + struct mt7915_phy *phy = mt7915_hw_phy(hw); + struct mt7915_dev *dev = phy->dev; +@@ -1121,7 +1124,7 @@ mt7915_set_coverage_class(struct ieee802 + } + + static int +-mt7915_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant) ++mt7915_set_antenna(struct ieee80211_hw *hw, int radio_idx, u32 tx_ant, u32 rx_ant) + { + struct mt7915_dev *dev = mt7915_hw_dev(hw); + struct mt7915_phy *phy = mt7915_hw_phy(hw); +@@ -1699,7 +1702,7 @@ mt7915_twt_teardown_request(struct ieee8 + } + + static int +-mt7915_set_frag_threshold(struct ieee80211_hw *hw, u32 val) ++mt7915_set_frag_threshold(struct ieee80211_hw *hw, int radio_idx, u32 val) + { + return 0; + } +--- a/mt7921/main.c ++++ b/mt7921/main.c +@@ -626,7 +626,7 @@ void mt7921_set_runtime_pm(struct mt792x + mt76_connac_mcu_set_deep_sleep(&dev->mt76, pm->ds_enable); + } + +-static int mt7921_config(struct ieee80211_hw *hw, u32 changed) ++static int mt7921_config(struct ieee80211_hw *hw, int radio_idx, u32 changed) + { + struct mt792x_dev *dev = mt792x_hw_dev(hw); + struct mt792x_phy *phy = mt792x_hw_phy(hw); +@@ -915,7 +915,8 @@ void mt7921_mac_sta_remove(struct mt76_d + } + EXPORT_SYMBOL_GPL(mt7921_mac_sta_remove); + +-static int mt7921_set_rts_threshold(struct ieee80211_hw *hw, u32 val) ++static int mt7921_set_rts_threshold(struct ieee80211_hw *hw, int radio_idx, ++ u32 val) + { + struct mt792x_dev *dev = mt792x_hw_dev(hw); + +@@ -1096,7 +1097,8 @@ mt7921_stop_sched_scan(struct ieee80211_ + } + + static int +-mt7921_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant) ++mt7921_set_antenna(struct ieee80211_hw *hw, int radio_idx, ++ u32 tx_ant, u32 rx_ant) + { + struct mt792x_dev *dev = mt792x_hw_dev(hw); + struct mt792x_phy *phy = mt792x_hw_phy(hw); +--- a/mt7925/main.c ++++ b/mt7925/main.c +@@ -758,7 +758,7 @@ void mt7925_set_runtime_pm(struct mt792x + mt7925_mcu_set_deep_sleep(dev, pm->ds_enable); + } + +-static int mt7925_config(struct ieee80211_hw *hw, u32 changed) ++static int mt7925_config(struct ieee80211_hw *hw, int radio_idx, u32 changed) + { + struct mt792x_dev *dev = mt792x_hw_dev(hw); + int ret = 0; +@@ -1219,7 +1219,8 @@ void mt7925_mac_sta_remove(struct mt76_d + } + EXPORT_SYMBOL_GPL(mt7925_mac_sta_remove); + +-static int mt7925_set_rts_threshold(struct ieee80211_hw *hw, u32 val) ++static int mt7925_set_rts_threshold(struct ieee80211_hw *hw, int radio_idx, ++ u32 val) + { + struct mt792x_dev *dev = mt792x_hw_dev(hw); + +@@ -1438,7 +1439,8 @@ mt7925_stop_sched_scan(struct ieee80211_ + } + + static int +-mt7925_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant) ++mt7925_set_antenna(struct ieee80211_hw *hw, int radio_idx, ++ u32 tx_ant, u32 rx_ant) + { + struct mt792x_dev *dev = mt792x_hw_dev(hw); + struct mt792x_phy *phy = mt792x_hw_phy(hw); +--- a/mt792x.h ++++ b/mt792x.h +@@ -413,7 +413,8 @@ void mt792x_sta_statistics(struct ieee80 + struct ieee80211_vif *vif, + struct ieee80211_sta *sta, + struct station_info *sinfo); +-void mt792x_set_coverage_class(struct ieee80211_hw *hw, s16 coverage_class); ++void mt792x_set_coverage_class(struct ieee80211_hw *hw, int radio_idx, ++ s16 coverage_class); + void mt792x_dma_cleanup(struct mt792x_dev *dev); + int mt792x_dma_enable(struct mt792x_dev *dev); + int mt792x_wpdma_reset(struct mt792x_dev *dev, bool force); +--- a/mt792x_core.c ++++ b/mt792x_core.c +@@ -601,7 +601,8 @@ void mt792x_sta_statistics(struct ieee80 + } + EXPORT_SYMBOL_GPL(mt792x_sta_statistics); + +-void mt792x_set_coverage_class(struct ieee80211_hw *hw, s16 coverage_class) ++void mt792x_set_coverage_class(struct ieee80211_hw *hw, int radio_idx, ++ s16 coverage_class) + { + struct mt792x_phy *phy = mt792x_hw_phy(hw); + struct mt792x_dev *dev = phy->dev; +--- a/mt7996/main.c ++++ b/mt7996/main.c +@@ -644,7 +644,7 @@ static int mt7996_set_key(struct ieee802 + return err; + } + +-static int mt7996_config(struct ieee80211_hw *hw, u32 changed) ++static int mt7996_config(struct ieee80211_hw *hw, int radio_idx, u32 changed) + { + return 0; + } +@@ -1370,7 +1370,8 @@ unlock: + rcu_read_unlock(); + } + +-static int mt7996_set_rts_threshold(struct ieee80211_hw *hw, u32 val) ++static int mt7996_set_rts_threshold(struct ieee80211_hw *hw, int radio_idx, ++ u32 val) + { + struct mt7996_dev *dev = mt7996_hw_dev(hw); + int i, ret = 0; +@@ -1590,7 +1591,8 @@ unlock: + } + + static void +-mt7996_set_coverage_class(struct ieee80211_hw *hw, s16 coverage_class) ++mt7996_set_coverage_class(struct ieee80211_hw *hw, int radio_idx, ++ s16 coverage_class) + { + struct mt7996_dev *dev = mt7996_hw_dev(hw); + struct mt7996_phy *phy; +@@ -1604,7 +1606,8 @@ mt7996_set_coverage_class(struct ieee802 + } + + static int +-mt7996_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant) ++mt7996_set_antenna(struct ieee80211_hw *hw, int radio_idx, ++ u32 tx_ant, u32 rx_ant) + { + struct mt7996_dev *dev = mt7996_hw_dev(hw); + int i;