109 lines
3.3 KiB
Diff
109 lines
3.3 KiB
Diff
From f0e741e4ddbc01610ca87167a123702b3fdac51f Mon Sep 17 00:00:00 2001
|
|
From: Po-Hao Huang <phhuang@realtek.com>
|
|
Date: Fri, 14 Apr 2023 20:11:28 +0800
|
|
Subject: [PATCH 32/45] wifi: rtw88: add bitmap for dynamic port settings
|
|
|
|
In order to support multiple interfaces, multiple port settings will
|
|
be required. Current code always uses port 0 and should be changed.
|
|
Declare a bitmap with size equal to hardware port number to record
|
|
the current usage.
|
|
|
|
Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
|
|
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
|
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
|
Link: https://lore.kernel.org/r/20230414121135.17828-2-pkshih@realtek.com
|
|
---
|
|
drivers/net/wireless/realtek/rtw88/mac80211.c | 13 ++++++++++---
|
|
drivers/net/wireless/realtek/rtw88/main.c | 1 +
|
|
drivers/net/wireless/realtek/rtw88/main.h | 10 ++++++++++
|
|
3 files changed, 21 insertions(+), 3 deletions(-)
|
|
|
|
--- a/drivers/net/wireless/realtek/rtw88/mac80211.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/mac80211.c
|
|
@@ -146,25 +146,30 @@ static int rtw_ops_add_interface(struct
|
|
struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv;
|
|
enum rtw_net_type net_type;
|
|
u32 config = 0;
|
|
- u8 port = 0;
|
|
+ u8 port;
|
|
u8 bcn_ctrl = 0;
|
|
|
|
if (rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_BCN_FILTER))
|
|
vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER |
|
|
IEEE80211_VIF_SUPPORTS_CQM_RSSI;
|
|
- rtwvif->port = port;
|
|
rtwvif->stats.tx_unicast = 0;
|
|
rtwvif->stats.rx_unicast = 0;
|
|
rtwvif->stats.tx_cnt = 0;
|
|
rtwvif->stats.rx_cnt = 0;
|
|
rtwvif->scan_req = NULL;
|
|
memset(&rtwvif->bfee, 0, sizeof(struct rtw_bfee));
|
|
- rtwvif->conf = &rtw_vif_port[port];
|
|
rtw_txq_init(rtwdev, vif->txq);
|
|
INIT_LIST_HEAD(&rtwvif->rsvd_page_list);
|
|
|
|
mutex_lock(&rtwdev->mutex);
|
|
|
|
+ port = find_first_zero_bit(rtwdev->hw_port, RTW_PORT_NUM);
|
|
+ if (port >= RTW_PORT_NUM)
|
|
+ return -EINVAL;
|
|
+ set_bit(port, rtwdev->hw_port);
|
|
+
|
|
+ rtwvif->port = port;
|
|
+ rtwvif->conf = &rtw_vif_port[port];
|
|
rtw_leave_lps_deep(rtwdev);
|
|
|
|
switch (vif->type) {
|
|
@@ -186,6 +191,7 @@ static int rtw_ops_add_interface(struct
|
|
break;
|
|
default:
|
|
WARN_ON(1);
|
|
+ clear_bit(rtwvif->port, rtwdev->hw_port);
|
|
mutex_unlock(&rtwdev->mutex);
|
|
return -EINVAL;
|
|
}
|
|
@@ -425,6 +431,7 @@ static void rtw_ops_bss_info_changed(str
|
|
rtw_recalc_lps(rtwdev, NULL);
|
|
|
|
rtw_vif_port_config(rtwdev, rtwvif, config);
|
|
+ clear_bit(rtwvif->port, rtwdev->hw_port);
|
|
|
|
mutex_unlock(&rtwdev->mutex);
|
|
}
|
|
--- a/drivers/net/wireless/realtek/rtw88/main.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/main.c
|
|
@@ -625,6 +625,7 @@ free:
|
|
rcu_read_unlock();
|
|
rtw_iterate_stas_atomic(rtwdev, rtw_reset_sta_iter, rtwdev);
|
|
rtw_iterate_vifs_atomic(rtwdev, rtw_reset_vif_iter, rtwdev);
|
|
+ bitmap_zero(rtwdev->hw_port, RTW_PORT_NUM);
|
|
rtw_enter_ips(rtwdev);
|
|
}
|
|
|
|
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
|
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
|
@@ -395,6 +395,15 @@ enum rtw_snr {
|
|
RTW_SNR_NUM
|
|
};
|
|
|
|
+enum rtw_port {
|
|
+ RTW_PORT_0 = 0,
|
|
+ RTW_PORT_1 = 1,
|
|
+ RTW_PORT_2 = 2,
|
|
+ RTW_PORT_3 = 3,
|
|
+ RTW_PORT_4 = 4,
|
|
+ RTW_PORT_NUM
|
|
+};
|
|
+
|
|
enum rtw_wow_flags {
|
|
RTW_WOW_FLAG_EN_MAGIC_PKT,
|
|
RTW_WOW_FLAG_EN_REKEY_PKT,
|
|
@@ -2039,6 +2048,7 @@ struct rtw_dev {
|
|
u8 sta_cnt;
|
|
u32 rts_threshold;
|
|
|
|
+ DECLARE_BITMAP(hw_port, RTW_PORT_NUM);
|
|
DECLARE_BITMAP(mac_id_map, RTW_MAX_MAC_ID_NUM);
|
|
DECLARE_BITMAP(flags, NUM_OF_RTW_FLAGS);
|
|
|