rtw88: update regulartory mapping and adaptivity
Ping-Ke Shih
maintainerv2 cover rtw88: update regulartory mapping and adaptivity
Mapping table of regulatory, which manages tx power limit, is updated, and we update the mapping architecture according to this change. In order to choose proper regulatory domain from this table, we regard efuse value and regulatory hint. With proper regulatory domain, we can have adaptivity for ETSI/JP DFS region, and also have a firmware version of adaptivity.
v2:
- avoid acronyms in commit message
- add a comment to explain the use of rtw_edcca_enabled
Chin-Yen Lee (1):
rtw88: move adaptivity mechanism to firmware
Zong-Zhe Yang (3):
rtw88: upgrade rtw_regulatory mechanism and mapping
rtw88: add regulatory strategy by chip type
rtw88: support adaptivity for ETSI/JP DFS region
drivers/net/wireless/realtek/rtw88/debug.c | 41 +- drivers/net/wireless/realtek/rtw88/debug.h | 1 + drivers/net/wireless/realtek/rtw88/fw.c | 47 ++ drivers/net/wireless/realtek/rtw88/fw.h | 24 + drivers/net/wireless/realtek/rtw88/main.c | 21 +- drivers/net/wireless/realtek/rtw88/main.h | 48 +- drivers/net/wireless/realtek/rtw88/phy.c | 119 ++- drivers/net/wireless/realtek/rtw88/phy.h | 2 + drivers/net/wireless/realtek/rtw88/reg.h | 5 + drivers/net/wireless/realtek/rtw88/regd.c | 753 ++++++++++-------- drivers/net/wireless/realtek/rtw88/regd.h | 8 +- drivers/net/wireless/realtek/rtw88/rtw8821c.c | 3 +- drivers/net/wireless/realtek/rtw88/rtw8822b.c | 46 +- drivers/net/wireless/realtek/rtw88/rtw8822b.h | 8 + drivers/net/wireless/realtek/rtw88/rtw8822c.c | 47 ++ drivers/net/wireless/realtek/rtw88/rtw8822c.h | 3 + 16 files changed, 851 insertions(+), 325 deletions(-)
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH v2 1/4 rtw88: upgrade rtw_regulatory mechanism and mapping
From: Zong-Zhe Yang <[email protected]>
Mapping table from country code to rtw_regulatory, which manages tx power limit according to countries, is updated. And mapping architecture is also upgraded. For more precise control on tx power limit, it allows different rtw_regulatory for different bands logically. Besides, a helper function to query rtw_regulatory for current band under current country is provided.
For older chips, some newly added rtw_regulatory may not be configured. To avoid that those chips have no limit on some countries mapping to a newer rtw_regulatory after table update, a backward selection mechanism of rtw_regulatory is introduced. It can help chips use a rtw_regulatory which has been configured as an alternative of a newer one which is not configured.
In addition, rtw88 actually doesn't manage channel plans by itself. Instead, it follows them from stack. So, correct some naming about chplan with regd, and remove the unnecessary channel control for now.
--- drivers/net/wireless/realtek/rtw88/debug.c | 3 +- drivers/net/wireless/realtek/rtw88/main.h | 4 +- drivers/net/wireless/realtek/rtw88/phy.c | 56 +- drivers/net/wireless/realtek/rtw88/regd.c | 595 +++++++++--------- drivers/net/wireless/realtek/rtw88/regd.h | 2 + drivers/net/wireless/realtek/rtw88/rtw8821c.c | 3 +- drivers/net/wireless/realtek/rtw88/rtw8822b.c | 3 +- 7 files changed, 371 insertions(+), 295 deletions(-)
drivers/net/wireless/realtek/rtw88/debug.c +2 -1
@@ -12,6 +12,7 @@#include "phy.h" #include "reg.h" #include "ps.h" +#include "regd.h" #ifdef CONFIG_RTW88_DEBUGFS
@@ -587,7 +588,7 @@ static int rtw_debugfs_get_tx_pwr_tbl(struct seq_file *m, void *v)struct rtw_power_params pwr_param = {0 };u8 bw = hal->current_band_width;u8 ch = hal->current_channel; -u8 regd = rtwdev->regd.txpwr_regd; +u8 regd =rtw_regd_get (rtwdev);seq_printf (m,"regulatory: %s\n" ,rtw_get_regd_string (regd)); seq_printf(m, "%-4s %-10s %-3s%6s %-4s %4s (%-4s %-4s) %-4s\n",
drivers/net/wireless/realtek/rtw88/main.h +2 -2
@@ -800,8 +800,8 @@ struct rtw_vif {struct rtw_regulatory {char alpha2[2 ]; -u8 chplan; -u8 txpwr_regd; +u8 txpwr_regd_2g; +u8 txpwr_regd_5g; };struct rtw_chip_ops {
drivers/net/wireless/realtek/rtw88/phy.c +55 -1
85 lines not on this page · raw message
drivers/net/wireless/realtek/rtw88/regd.c +306 -289
633 lines not on this page · raw message
drivers/net/wireless/realtek/rtw88/regd.h +2 -0
@@ -68,4 +68,6 @@ int rtw_regd_init(struct rtw_dev *rtwdev,void (*reg_notifier)(struct wiphy *wiphy, struct regulatory_request *request));void rtw_regd_notifier (struct wiphy *wiphy,struct regulatory_request *request); +u8 rtw_regd_get (struct rtw_dev *rtwdev); +bool rtw_regd_has_alt (u8 regd,u8 *regd_alt);#endif
drivers/net/wireless/realtek/rtw88/rtw8821c.c +2 -1
@@ -14,6 +14,7 @@#include "reg.h" #include "debug.h" #include "bf.h" +#include "regd.h" static const s8 lna_gain_table_0[8 ] = {22 ,8 ,-6 ,-22 ,-31 ,-40 ,-46 ,-52 };static const s8 lna_gain_table_1[16 ] = {10 ,6 ,2 ,-2 ,-6 ,-10 ,-14 ,-17 ,
@@ -993,7 +994,7 @@ static void rtw8821c_pwrtrack_set(struct rtw_dev *rtwdev)s8 pwr_idx_offset_lower;u8 channel = rtwdev->hal.current_channel;u8 band_width = rtwdev->hal.current_band_width; -u8 regd = rtwdev->regd.txpwr_regd; +u8 regd =rtw_regd_get (rtwdev);u8 tx_rate = dm_info->tx_rate;u8 max_pwr_idx = rtwdev->chip->max_power_index;
drivers/net/wireless/realtek/rtw88/rtw8822b.c +2 -1
@@ -15,6 +15,7 @@#include "reg.h" #include "debug.h" #include "bf.h" +#include "regd.h" static void rtw8822b_config_trx_mode (struct rtw_dev *rtwdev,u8 tx_path,u8 rx_path,bool is_tx2_path);
@@ -1436,7 +1437,7 @@ static void rtw8822b_pwrtrack_set(struct rtw_dev *rtwdev, u8 path)u8 pwr_idx_offset, tx_pwr_idx;u8 channel = rtwdev->hal.current_channel;u8 band_width = rtwdev->hal.current_band_width; -u8 regd = rtwdev->regd.txpwr_regd; +u8 regd =rtw_regd_get (rtwdev);u8 tx_rate = dm_info->tx_rate;u8 max_pwr_idx = rtwdev->chip->max_power_index;
Signature · 1 line
2.25.1
Re: [PATCH v2 1/4] rtw88: upgrade rtw_regulatory mechanism and mapping
Quoted 15 lines · Ping-Ke Shih
From: Zong-Zhe Yang <[email protected]>
Mapping table from country code to
rtw_regulatory, which manages tx power limit according to countries, is updated. And mapping architecture is also upgraded. For more precise control on tx power limit, it allows differentrtw_regulatoryfor different bands logically. Besides, a helper function to queryrtw_regulatoryfor current band under current country is provided.For older chips, some newly added
rtw_regulatorymay not be configured. To avoid that those chips have no limit on some countries mapping to a newerrtw_regulatoryafter table update, a backward selection mechanism ofrtw_regulatoryis introduced. It can help chips use artw_regulatorywhich has been configured as an alternative of a newer one which is not configured.
Quoted 6 lines
In addition, rtw88 actually doesn't manage channel plans by itself. Instead, it follows them from stack. So, correct some naming about chplan with regd, and remove the unnecessary channel control for now.
Signed-off-by Zong-Zhe Yang <[email protected]>Signed-off-by Ping-Ke Shih <[email protected]>
4 patches applied to wireless-drivers-next.git, thanks.
f8509c38ecec rtw88: upgrade rtw_regulatory mechanism and mapping 8d4fb3998c05 rtw88: add regulatory strategy by chip type 7285eb9693a2 rtw88: support adaptivity for ETSI/JP DFS region fe7bc23a8c5e rtw88: move adaptivity mechanism to firmware
Signature · 3 lines
https://patchwork.kernel.org/project/linux-wireless/patch/[email protected]/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
Ping-Ke Shih
maintainerPATCH v2 2/4 rtw88: add regulatory strategy by chip type
In reply to Ping-Ke ShihFrom: Zong-Zhe Yang <[email protected]>
Realtek chips can program a specific country domain on efuse to indicate what is the expected rtw_regulatory. For chips with a programmed country domain, we set REGULATORY_STRICT_REG to tell stack to consider follow-up regulatory_hint() as the superset of our regulatory rule. Besides, on driver side, only the request via NL80211_REGDOM_SET_BY_DRIVER, which matches programmed country domain, will be handled to keep rtw_regulatory unchanged.
For worldwide roaming chips, i.e. ones without a specific programmed country domain, system of distro can set expected regulatory via NL80211_REGDOM_SET_BY_USER. With setting from it, rtw_regulatory will handle the requests only via NL80211_REGDOM_SET_BY_USER to follow setting from system of distro. REGULATORY_COUNTRY_IE_IGNORE will then be set to tell stack to ignore country IE for us. The restrictions mentioned above will remain until 00, i.e. worldwide, is set via NL80211_REGDOM_SET_BY_USER.
On the other hand, for worldwide roamin chips, if there is no specific regulatory set via NL80211_REGDOM_SET_BY_USER, requests from all regulatory notifications will be handled by rtw_regulatory. And REGULATORY_COUNTRY_IE_IGNORE won't be set.
--- drivers/net/wireless/realtek/rtw88/main.c | 13 +- drivers/net/wireless/realtek/rtw88/main.h | 15 +- drivers/net/wireless/realtek/rtw88/regd.c | 180 +++++++++++++++++----- drivers/net/wireless/realtek/rtw88/regd.h | 6 +- 4 files changed, 171 insertions(+), 43 deletions(-)
drivers/net/wireless/realtek/rtw88/main.c +10 -3
@@ -1964,7 +1964,11 @@ int rtw_register_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw)rtw_set_supported_band (hw, rtwdev->chip);SET_IEEE80211_PERM_ADDR (hw, rtwdev->efuse.addr); -rtw_regd_init (rtwdev, rtw_regd_notifier); + ret =rtw_regd_init (rtwdev); +if (ret) { +rtw_err (rtwdev,"failed to init regd\n" ); +return ret; + } ret =ieee80211_register_hw (hw);if (ret) {
@@ -1972,8 +1976,11 @@ int rtw_register_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw)return ret; } -if (regulatory_hint (hw->wiphy, rtwdev->regd.alpha2)) -rtw_err (rtwdev,"regulatory_hint fail\n" ); + ret =rtw_regd_hint (rtwdev); +if (ret) { +rtw_err (rtwdev,"failed to hint regd\n" ); +return ret; + }rtw_debugfs_init (rtwdev);
drivers/net/wireless/realtek/rtw88/main.h +14 -1
@@ -804,6 +804,19 @@ struct rtw_regulatory {u8 txpwr_regd_5g; }; +enum rtw_regd_state { +RTW_REGD_STATE_WORLDWIDE , +RTW_REGD_STATE_PROGRAMMED , +RTW_REGD_STATE_SETTING , + +RTW_REGD_STATE_NR , +}; + +struct rtw_regd { +enum rtw_regd_state state; +const struct rtw_regulatory *regulatory; +}; +struct rtw_chip_ops {int (*mac_init)(struct rtw_dev *rtwdev);int (*dump_fw_crash)(struct rtw_dev *rtwdev);
@@ -1833,7 +1846,7 @@ struct rtw_dev {struct rtw_efuse efuse;struct rtw_sec_desc sec;struct rtw_traffic_stats stats; -struct rtw_regulatory regd; +struct rtw_regd regd;struct rtw_bf_info bf_info;struct rtw_dm_info dm_info;
drivers/net/wireless/realtek/rtw88/regd.c +145 -35
234 lines not on this page · raw message
drivers/net/wireless/realtek/rtw88/regd.h +2 -4
@@ -64,10 +64,8 @@ enum country_code_type {COUNTRY_CODE_MAX }; -int rtw_regd_init (struct rtw_dev *rtwdev, -void (*reg_notifier)(struct wiphy *wiphy, -struct regulatory_request *request)); -void rtw_regd_notifier (struct wiphy *wiphy,struct regulatory_request *request); +int rtw_regd_init (struct rtw_dev *rtwdev); +int rtw_regd_hint (struct rtw_dev *rtwdev);u8 rtw_regd_get (struct rtw_dev *rtwdev);bool rtw_regd_has_alt (u8 regd,u8 *regd_alt);#endif
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH v2 3/4 rtw88: support adaptivity for ETSI/JP DFS region
In reply to Ping-Ke ShihFrom: Zong-Zhe Yang <[email protected]>
Add Energy Detected CCA (EDCCA) mechanism to detect energy on the channel. And EDCCA support adaptivity mode now. From MIC Ordinance Regulating Radio Equipment article 49.20, ETSI EN-300-328 and EN-301-893, the device should be able to dynamically pause TX activity when energy detected on the air. According to ETSI/JP DFS region, driver will set corresponding threshold and stop TX activity if the detected energy exceeds the threshold. For now, we support it on 8822b and 8822c first.
By default, EDCCA mechanism is turned on. For ETSI/JP DFS region, it will turn to adaptivity mode. However, with adaptivity, if environment is too noisy, TX may often be halted. So, a debugfs for EDCCA is added. It can show what EDCCA mode is used currently. And EDCCA mechanism can be turned on/off through the debugfs while debugging.
--- drivers/net/wireless/realtek/rtw88/debug.c | 38 ++++++++++++ drivers/net/wireless/realtek/rtw88/main.c | 8 +++ drivers/net/wireless/realtek/rtw88/main.h | 29 +++++++++ drivers/net/wireless/realtek/rtw88/phy.c | 59 +++++++++++++++++++ drivers/net/wireless/realtek/rtw88/phy.h | 2 + drivers/net/wireless/realtek/rtw88/reg.h | 2 + drivers/net/wireless/realtek/rtw88/regd.c | 8 ++- drivers/net/wireless/realtek/rtw88/rtw8822b.c | 43 ++++++++++++++ drivers/net/wireless/realtek/rtw88/rtw8822b.h | 8 +++ drivers/net/wireless/realtek/rtw88/rtw8822c.c | 47 +++++++++++++++ drivers/net/wireless/realtek/rtw88/rtw8822c.h | 3 + 11 files changed, 245 insertions(+), 2 deletions(-)
drivers/net/wireless/realtek/rtw88/debug.c +38 -0
@@ -829,6 +829,38 @@ static int rtw_debugfs_get_coex_enable(struct seq_file *m, void *v)return 0 ; } +static ssize_t rtw_debugfs_set_edcca_enable (struct file *filp, +const char __user *buffer, +size_t count,loff_t *loff) +{ +struct seq_file *seqpriv = (struct seq_file *)filp->private_data; +struct rtw_debugfs_priv *debugfs_priv = seqpriv->private; +struct rtw_dev *rtwdev = debugfs_priv->rtwdev; +bool input; +int err; + + err =kstrtobool_from_user (buffer, count, &input); +if (err) +return err; + + rtw_edcca_enabled = input; +rtw_phy_adaptivity_set_mode (rtwdev); + +return count; +} + +static int rtw_debugfs_get_edcca_enable (struct seq_file *m,void *v) +{ +struct rtw_debugfs_priv *debugfs_priv = m->private; +struct rtw_dev *rtwdev = debugfs_priv->rtwdev; +struct rtw_dm_info *dm_info = &rtwdev->dm_info; + +seq_printf (m,"EDCCA %s: EDCCA mode %d\n" , + rtw_edcca_enabled ?"enabled" :"disabled" , + dm_info->edcca_mode); +return 0 ; +} +static ssize_t rtw_debugfs_set_fw_crash (struct file *filp,const char __user *buffer,size_t count,loff_t *loff)
@@ -1049,6 +1081,11 @@ static struct rtw_debugfs_priv rtw_debug_priv_coex_info = { .cb_read = rtw_debugfs_get_coex_info, }; +static struct rtw_debugfs_priv rtw_debug_priv_edcca_enable = { + .cb_write = rtw_debugfs_set_edcca_enable, + .cb_read = rtw_debugfs_get_edcca_enable, +}; +static struct rtw_debugfs_priv rtw_debug_priv_fw_crash = { .cb_write = rtw_debugfs_set_fw_crash, .cb_read = rtw_debugfs_get_fw_crash,
@@ -1132,6 +1169,7 @@ void rtw_debugfs_init(struct rtw_dev *rtwdev) }rtw_debugfs_add_r (rf_dump);rtw_debugfs_add_r (tx_pwr_tbl); +rtw_debugfs_add_rw (edcca_enable);rtw_debugfs_add_rw (fw_crash);rtw_debugfs_add_rw (dm_cap); }
drivers/net/wireless/realtek/rtw88/main.c +8 -0
@@ -23,6 +23,14 @@ EXPORT_SYMBOL(rtw_disable_lps_deep_mode);bool rtw_bf_support = true;unsigned int rtw_debug_mask;EXPORT_SYMBOL (rtw_debug_mask); +/* EDCCA is enabled during normal behavior. For debugging purpose in +* a noisy environment, it can be disabled via edcca debugfs. Because +* all rtw88 devices will probably be affected if environment is noisy, +* rtw_edcca_enabled is just declared by driver instead of by device. +* So, turning it off will take effect for all rtw88 devices before +* there is a tough reason to maintain rtw_edcca_enabled by device. +*/ +bool rtw_edcca_enabled = true;module_param_named (disable_lps_deep, rtw_disable_lps_deep_mode, bool,0644 );module_param_named (support_bf, rtw_bf_support, bool,0644 );
drivers/net/wireless/realtek/rtw88/main.h +29 -0
@@ -41,6 +41,7 @@extern bool rtw_bf_support;extern bool rtw_disable_lps_deep_mode;extern unsigned int rtw_debug_mask; +extern bool rtw_edcca_enabled;extern const struct ieee80211_ops rtw_ops;#define RTW_MAX_CHANNEL_NUM_2G 14
@@ -545,6 +546,11 @@ struct rtw_rf_sipi_addr {u32 lssi_read_pi; }; +struct rtw_hw_reg_offset { +struct rtw_hw_reg hw_reg; +u8 offset; +}; +struct rtw_backup_info {u8 len;u32 reg;
@@ -815,6 +821,7 @@ enum rtw_regd_state {struct rtw_regd {enum rtw_regd_state state;const struct rtw_regulatory *regulatory; +enum nl80211_dfs_regions dfs_region; };struct rtw_chip_ops {
@@ -852,6 +859,8 @@ struct rtw_chip_ops { struct ieee80211_bss_conf *conf);void (*cfg_csi_rate)(struct rtw_dev *rtwdev,u8 rssi,u8 cur_rate,u8 fixrate_en,u8 *new_rate); +void (*adaptivity_init)(struct rtw_dev *rtwdev); +void (*adaptivity)(struct rtw_dev *rtwdev);void (*cfo_init)(struct rtw_dev *rtwdev);void (*cfo_track)(struct rtw_dev *rtwdev); void (*config_tx_path)(struct rtw_dev *rtwdev, u8 tx_path,
@@ -1207,6 +1216,10 @@ struct rtw_chip_info {u8 bfer_su_max_num;u8 bfer_mu_max_num; +struct rtw_hw_reg_offset *edcca_th; +s8 l2h_th_ini_cs; +s8 l2h_th_ini_ad; +const char *wow_fw_name;const struct wiphy_wowlan_support *wowlan_stub;const u8 max_sched_scan_ssids;
@@ -1555,6 +1568,20 @@ struct rtw_gapk_info {u8 channel; }; +#define EDCCA_TH_L2H_IDX 0 +#define EDCCA_TH_H2L_IDX 1 +#define EDCCA_TH_L2H_LB 48 +#define EDCCA_ADC_BACKOFF 12 +#define EDCCA_IGI_BASE 50 +#define EDCCA_IGI_L2H_DIFF 8 +#define EDCCA_L2H_H2L_DIFF 7 +#define EDCCA_L2H_H2L_DIFF_NORMAL 8 + +enum rtw_edcca_mode { +RTW_EDCCA_NORMAL =0 , +RTW_EDCCA_ADAPTIVITY =1 , +}; +struct rtw_cfo_track {bool is_adjust;u8 crystal_cap;
@@ -1646,6 +1673,8 @@ struct rtw_dm_info {struct rtw_gapk_info gapk;bool is_bt_iqk_timeout; +s8 l2h_th_ini; +enum rtw_edcca_mode edcca_mode;u8 scan_density; };
drivers/net/wireless/realtek/rtw88/phy.c +59 -0
77 lines not on this page · raw message
drivers/net/wireless/realtek/rtw88/phy.h +2 -0
@@ -59,6 +59,8 @@ bool rtw_phy_pwrtrack_need_lck(struct rtw_dev *rtwdev);bool rtw_phy_pwrtrack_need_iqk (struct rtw_dev *rtwdev);void rtw_phy_config_swing_table (struct rtw_dev *rtwdev,struct rtw_swing_table *swing_table); +void rtw_phy_set_edcca_th (struct rtw_dev *rtwdev,u8 l2h,u8 h2l); +void rtw_phy_adaptivity_set_mode (struct rtw_dev *rtwdev);void rtw_phy_parsing_cfo (struct rtw_dev *rtwdev,struct rtw_rx_pkt_stat *pkt_stat);void rtw_phy_tx_path_diversity (struct rtw_dev *rtwdev);
drivers/net/wireless/realtek/rtw88/reg.h +2 -0
@@ -361,10 +361,12 @@#define REG_AGGR_BREAK_TIME 0x051A#define REG_SLOT 0x051B#define REG_TX_PTCL_CTRL 0x0520 +#define BIT_DIS_EDCCA BIT(15)#define BIT_SIFS_BK_EN BIT(12)#define REG_TXPAUSE 0x0522#define BIT_AC_QUEUE GENMASK(7, 0)#define REG_RD_CTRL 0x0524 +#define BIT_EDCCA_MSK_CNTDOWN_EN BIT(11)#define BIT_DIS_TXOP_CFE BIT(10)#define BIT_DIS_LSIG_CFE BIT(9)#define BIT_DIS_STBC_CFE BIT(8)
drivers/net/wireless/realtek/rtw88/regd.c +6 -2
@@ -18,12 +18,13 @@ do { \struct rtw_dev *__d = (_dev); \const struct rtw_regd *__r = &__d->regd; \rtw_dbg (__d,RTW_DBG_REGD , _msg \ -"apply alpha2 %c%c, regd {%d, %d}\n" , \ +"apply alpha2 %c%c, regd {%d, %d}, dfs_region %d\n" ,\ ##_args, \ __r->regulatory->alpha2[0 ], \ __r->regulatory->alpha2[1 ], \ __r->regulatory->txpwr_regd_2g, \ - __r->regulatory->txpwr_regd_5g); \ + __r->regulatory->txpwr_regd_5g, \ + __r->dfs_region); \ }while (0 )/* If country code is not correctly defined in efuse,
@@ -357,6 +358,7 @@ int rtw_regd_init(struct rtw_dev *rtwdev) } rtwdev->regd.regulatory = &rtw_reg_ww; + rtwdev->regd.dfs_region =NL80211_DFS_UNSET ;rtw_dbg_regd_dump (rtwdev,"regd init state %d: " , rtwdev->regd.state);rtw_regd_apply_hw_cap_flags (wiphy);
@@ -450,6 +452,7 @@ static bool rtw_regd_state_hdl(struct rtw_dev *rtwdev, struct regulatory_request *request) { next_regd->regulatory =rtw_reg_find_by_name (request->alpha2); + next_regd->dfs_region = request->dfs_region;return rtw_regd_handler[rtwdev->regd.state](rtwdev, next_regd, request); }
@@ -482,6 +485,7 @@ void rtw_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request) request->alpha2[1 ], request->initiator); +rtw_phy_adaptivity_set_mode (rtwdev);rtw_phy_set_tx_power_level (rtwdev, hal->current_channel); }
drivers/net/wireless/realtek/rtw88/rtw8822b.c +43 -0
67 lines not on this page · raw message
drivers/net/wireless/realtek/rtw88/rtw8822b.h +8 -0
@@ -140,6 +140,8 @@ _rtw_write32s_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask, u32 data)#define GET_PHY_STAT_P1_RXSNR_B (phy_stat) \ le32_get_bits(*((__le32 *)(phy_stat) + 0x06), GENMASK(15, 8)) +#define RTW8822B_EDCCA_MAX 0x7f +#define RTW8822B_EDCCA_SRC_DEF 1#define REG_HTSTFWT 0x800#define REG_RXPSEL 0x808#define BIT_RX_PSEL_RST (BIT(28) | BIT(29))
@@ -152,11 +154,17 @@ _rtw_write32s_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask, u32 data)#define REG_L1PKWT 0x840#define REG_MRC 0x850#define REG_CLKTRK 0x860 +#define REG_EDCCA_POW_MA 0x8a0 +#define BIT_MA_LEVEL GENMASK(1, 0)#define REG_ADCCLK 0x8ac#define REG_ADC160 0x8c4#define REG_ADC40 0x8c8 +#define REG_EDCCA_DECISION 0x8dc +#define BIT_EDCCA_OPTION BIT(5)#define REG_CDDTXP 0x93c#define REG_TXPSEL1 0x940 +#define REG_EDCCA_SOURCE 0x944 +#define BIT_SOURCE_OPTION GENMASK(29, 28)#define REG_ACBB0 0x948#define REG_ACBBRXFIR 0x94c#define REG_ACGG2TBL 0x958
drivers/net/wireless/realtek/rtw88/rtw8822c.c +47 -0
71 lines not on this page · raw message
drivers/net/wireless/realtek/rtw88/rtw8822c.h +3 -0
@@ -162,6 +162,7 @@ const struct rtw_table name ## _tbl = { \#define GET_PHY_STAT_P1_RXSNR_B (phy_stat) \ le32_get_bits(*((__le32 *)(phy_stat) + 0x06), GENMASK(15, 8)) +#define RTW8822C_EDCCA_MAX 0x7f#define REG_ANAPARLDO_POW_MAC 0x0029#define BIT_LDOE25_PON BIT(0)#define XCAP_MASK GENMASK(6, 0)
@@ -174,6 +175,8 @@ const struct rtw_table name ## _tbl = { \#define REG_ANTMAP0 0x820#define BIT_ANT_PATH GENMASK(1, 0)#define REG_ANTMAP 0x824 +#define REG_EDCCA_DECISION 0x844 +#define BIT_EDCCA_OPTION GENMASK(30, 29)#define REG_DYMPRITH 0x86c#define REG_DYMENTH0 0x870#define REG_DYMENTH 0x874
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH v2 4/4 rtw88: move adaptivity mechanism to firmware
In reply to Ping-Ke ShihFrom: Chin-Yen Lee <[email protected]>
Current adaptivity mechanism is achieved in driver, by periodically referencing the IGI value and then updating related registers. But we find that this way may halt TX activity too long if huge and temporary energy is detected frequently. So we move the mechanism to firmware for immediately reacting this case to recover TX rapidly.
--- drivers/net/wireless/realtek/rtw88/debug.h | 1 + drivers/net/wireless/realtek/rtw88/fw.c | 47 ++++++++++++++++++++++ drivers/net/wireless/realtek/rtw88/fw.h | 24 +++++++++++ drivers/net/wireless/realtek/rtw88/phy.c | 6 ++- drivers/net/wireless/realtek/rtw88/reg.h | 3 ++ 5 files changed, 80 insertions(+), 1 deletion(-)
drivers/net/wireless/realtek/rtw88/debug.h +1 -0
@@ -21,6 +21,7 @@ enum rtw_debug_mask {RTW_DBG_WOW =0x00001000 ,RTW_DBG_CFO =0x00002000 ,RTW_DBG_PATH_DIV =0x00004000 , +RTW_DBG_ADAPTIVITY =0x00008000 , RTW_DBG_ALL = 0xffffffff };
drivers/net/wireless/realtek/rtw88/fw.c +47 -0
65 lines not on this page · raw message
drivers/net/wireless/realtek/rtw88/fw.h +24 -0
@@ -41,6 +41,7 @@ enum rtw_c2h_cmd_id {C2H_WLAN_INFO =0x27 ,C2H_WLAN_RFON =0x32 ,C2H_BCN_FILTER_NOTIFY =0x36 , +C2H_ADAPTIVITY =0x37 ,C2H_SCAN_RESULT =0x38 ,C2H_HW_FEATURE_DUMP =0xfd , C2H_HALMAC = 0xff,
@@ -56,6 +57,15 @@ struct rtw_c2h_cmd {u8 payload[]; } __packed; +struct rtw_c2h_adaptivity { +u8 density; +u8 igi; +u8 l2h_th_init; +u8 l2h; +u8 h2l; +u8 option; +} __packed; +enum rtw_rsvd_packet_type {RSVD_BEACON ,RSVD_DUMMY ,
@@ -90,6 +100,7 @@ enum rtw_fw_feature {FW_FEATURE_PG =BIT (3 ),FW_FEATURE_BCN_FILTER =BIT (5 ),FW_FEATURE_NOTIFY_SCAN =BIT (6 ), +FW_FEATURE_ADAPTIVITY =BIT (7 ), FW_FEATURE_MAX = BIT(31), };
@@ -375,6 +386,7 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id)#define H2C_CMD_BCN_FILTER_OFFLOAD_P1 0x57#define H2C_CMD_WL_PHY_INFO 0x58#define H2C_CMD_SCAN 0x59 +#define H2C_CMD_ADAPTIVITY 0x5A#define H2C_CMD_COEX_TDMA_TYPE 0x60#define H2C_CMD_QUERY_BT_INFO 0x61
@@ -428,6 +440,17 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id)#define SET_SCAN_START (h2c_pkt, value) \ le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(8)) +#define SET_ADAPTIVITY_MODE (h2c_pkt, value) \ + le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(11, 8)) +#define SET_ADAPTIVITY_OPTION (h2c_pkt, value) \ + le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(15, 12)) +#define SET_ADAPTIVITY_IGI (h2c_pkt, value) \ + le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(23, 16)) +#define SET_ADAPTIVITY_L2H (h2c_pkt, value) \ + le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(31, 24)) +#define SET_ADAPTIVITY_DENSITY (h2c_pkt, value) \ + le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(7, 0)) +#define SET_PWR_MODE_SET_MODE (h2c_pkt, value) \ le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(14, 8))#define SET_PWR_MODE_SET_RLBM (h2c_pkt, value) \
@@ -662,4 +685,5 @@ void rtw_fw_c2h_cmd_isr(struct rtw_dev *rtwdev);int rtw_fw_dump_fifo (struct rtw_dev *rtwdev,u8 fifo_sel,u32 addr,u32 size,u32 *buffer);void rtw_fw_scan_notify (struct rtw_dev *rtwdev,bool start); +void rtw_fw_adaptivity (struct rtw_dev *rtwdev);#endif
drivers/net/wireless/realtek/rtw88/phy.c +5 -1
@@ -770,7 +770,11 @@ void rtw_phy_dynamic_mechanism(struct rtw_dev *rtwdev)rtw_phy_cfo_track (rtwdev);rtw_phy_dpk_track (rtwdev);rtw_phy_pwr_track (rtwdev); -rtw_phy_adaptivity (rtwdev); + +if (rtw_fw_feature_check (&rtwdev->fw,FW_FEATURE_ADAPTIVITY )) +rtw_fw_adaptivity (rtwdev); +else +rtw_phy_adaptivity (rtwdev); }#define FRAC_BITS 3
drivers/net/wireless/realtek/rtw88/reg.h +3 -0
@@ -642,6 +642,9 @@#define REG_HRCV_MSG 0x1cf +#define REG_EDCCA_REPORT 0x2d38 +#define BIT_EDCCA_FLAG BIT(24) +#define REG_IGN_GNTBT4 0x4160#define RF_MODE 0x00
Signature · 1 line
2.25.1