Commit d3be4d11 authored by Yan-Hsuan Chuang's avatar Yan-Hsuan Chuang Committed by Kalle Valo

rtw88: select deep PS mode when module is inserted

Add a module parameter to select deep PS mode. And the mode
cannot be changed after the module has been inserted and probed.
If anyone wants to change the deep mode, should change the mode
and probe the device again to setup the changed deep mode.

When the device is probed, driver will check the deep PS mode
with different IC's PS mode suppotability. If none of the
PS mode is matched, the deep PS mode is changed to NONE,
means deep PS is disabled.
Signed-off-by: default avatarYan-Hsuan Chuang <yhchuang@realtek.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 3a068a2a
...@@ -14,13 +14,17 @@ ...@@ -14,13 +14,17 @@
#include "efuse.h" #include "efuse.h"
#include "debug.h" #include "debug.h"
unsigned int rtw_fw_lps_deep_mode;
EXPORT_SYMBOL(rtw_fw_lps_deep_mode);
static bool rtw_fw_support_lps; static bool rtw_fw_support_lps;
unsigned int rtw_debug_mask; unsigned int rtw_debug_mask;
EXPORT_SYMBOL(rtw_debug_mask); EXPORT_SYMBOL(rtw_debug_mask);
module_param_named(lps_deep_mode, rtw_fw_lps_deep_mode, uint, 0644);
module_param_named(support_lps, rtw_fw_support_lps, bool, 0644); module_param_named(support_lps, rtw_fw_support_lps, bool, 0644);
module_param_named(debug_mask, rtw_debug_mask, uint, 0644); module_param_named(debug_mask, rtw_debug_mask, uint, 0644);
MODULE_PARM_DESC(lps_deep_mode, "Deeper PS mode. If 0, deep PS is disabled");
MODULE_PARM_DESC(support_lps, "Set Y to enable Leisure Power Save support, to turn radio off between beacons"); MODULE_PARM_DESC(support_lps, "Set Y to enable Leisure Power Save support, to turn radio off between beacons");
MODULE_PARM_DESC(debug_mask, "Debugging mask"); MODULE_PARM_DESC(debug_mask, "Debugging mask");
...@@ -1152,6 +1156,7 @@ EXPORT_SYMBOL(rtw_chip_info_setup); ...@@ -1152,6 +1156,7 @@ EXPORT_SYMBOL(rtw_chip_info_setup);
int rtw_core_init(struct rtw_dev *rtwdev) int rtw_core_init(struct rtw_dev *rtwdev)
{ {
struct rtw_chip_info *chip = rtwdev->chip;
struct rtw_coex *coex = &rtwdev->coex; struct rtw_coex *coex = &rtwdev->coex;
int ret; int ret;
...@@ -1183,6 +1188,10 @@ int rtw_core_init(struct rtw_dev *rtwdev) ...@@ -1183,6 +1188,10 @@ int rtw_core_init(struct rtw_dev *rtwdev)
rtwdev->sec.total_cam_num = 32; rtwdev->sec.total_cam_num = 32;
rtwdev->hal.current_channel = 1; rtwdev->hal.current_channel = 1;
set_bit(RTW_BC_MC_MACID, rtwdev->mac_id_map); set_bit(RTW_BC_MC_MACID, rtwdev->mac_id_map);
if (!(BIT(rtw_fw_lps_deep_mode) & chip->lps_deep_mode_supported))
rtwdev->lps_conf.deep_mode = LPS_DEEP_MODE_NONE;
else
rtwdev->lps_conf.deep_mode = rtw_fw_lps_deep_mode;
mutex_lock(&rtwdev->mutex); mutex_lock(&rtwdev->mutex);
rtw_add_rsvd_page(rtwdev, RSVD_BEACON, false); rtw_add_rsvd_page(rtwdev, RSVD_BEACON, false);
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#define RTW_RF_PATH_MAX 4 #define RTW_RF_PATH_MAX 4
#define HW_FEATURE_LEN 13 #define HW_FEATURE_LEN 13
extern unsigned int rtw_fw_lps_deep_mode;
extern unsigned int rtw_debug_mask; extern unsigned int rtw_debug_mask;
extern const struct ieee80211_ops rtw_ops; extern const struct ieee80211_ops rtw_ops;
extern struct rtw_chip_info rtw8822b_hw_spec; extern struct rtw_chip_info rtw8822b_hw_spec;
...@@ -528,6 +529,11 @@ enum rtw_lps_mode { ...@@ -528,6 +529,11 @@ enum rtw_lps_mode {
RTW_MODE_WMM_PS = 2, RTW_MODE_WMM_PS = 2,
}; };
enum rtw_lps_deep_mode {
LPS_DEEP_MODE_NONE = 0,
LPS_DEEP_MODE_LCLK = 1,
};
enum rtw_pwr_state { enum rtw_pwr_state {
RTW_RF_OFF = 0x0, RTW_RF_OFF = 0x0,
RTW_RF_ON = 0x4, RTW_RF_ON = 0x4,
...@@ -536,6 +542,7 @@ enum rtw_pwr_state { ...@@ -536,6 +542,7 @@ enum rtw_pwr_state {
struct rtw_lps_conf { struct rtw_lps_conf {
enum rtw_lps_mode mode; enum rtw_lps_mode mode;
enum rtw_lps_deep_mode deep_mode;
enum rtw_pwr_state state; enum rtw_pwr_state state;
u8 awake_interval; u8 awake_interval;
u8 rlbm; u8 rlbm;
...@@ -844,6 +851,7 @@ struct rtw_chip_info { ...@@ -844,6 +851,7 @@ struct rtw_chip_info {
bool ht_supported; bool ht_supported;
bool vht_supported; bool vht_supported;
u8 lps_deep_mode_supported;
/* init values */ /* init values */
u8 sys_func_en; u8 sys_func_en;
......
...@@ -132,6 +132,9 @@ static void rtw_leave_lps_core(struct rtw_dev *rtwdev) ...@@ -132,6 +132,9 @@ static void rtw_leave_lps_core(struct rtw_dev *rtwdev)
static void __rtw_enter_lps_deep(struct rtw_dev *rtwdev) static void __rtw_enter_lps_deep(struct rtw_dev *rtwdev)
{ {
if (rtwdev->lps_conf.deep_mode == LPS_DEEP_MODE_NONE)
return;
if (!test_bit(RTW_FLAG_LEISURE_PS, rtwdev->flags)) { if (!test_bit(RTW_FLAG_LEISURE_PS, rtwdev->flags)) {
rtw_dbg(rtwdev, RTW_DBG_PS, rtw_dbg(rtwdev, RTW_DBG_PS,
"Should enter LPS before entering deep PS\n"); "Should enter LPS before entering deep PS\n");
......
...@@ -1977,6 +1977,7 @@ struct rtw_chip_info rtw8822b_hw_spec = { ...@@ -1977,6 +1977,7 @@ struct rtw_chip_info rtw8822b_hw_spec = {
.dig_min = 0x1c, .dig_min = 0x1c,
.ht_supported = true, .ht_supported = true,
.vht_supported = true, .vht_supported = true,
.lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
.sys_func_en = 0xDC, .sys_func_en = 0xDC,
.pwr_on_seq = card_enable_flow_8822b, .pwr_on_seq = card_enable_flow_8822b,
.pwr_off_seq = card_disable_flow_8822b, .pwr_off_seq = card_disable_flow_8822b,
......
...@@ -3747,6 +3747,7 @@ struct rtw_chip_info rtw8822c_hw_spec = { ...@@ -3747,6 +3747,7 @@ struct rtw_chip_info rtw8822c_hw_spec = {
.dig_min = 0x20, .dig_min = 0x20,
.ht_supported = true, .ht_supported = true,
.vht_supported = true, .vht_supported = true,
.lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
.sys_func_en = 0xD8, .sys_func_en = 0xD8,
.pwr_on_seq = card_enable_flow_8822c, .pwr_on_seq = card_enable_flow_8822c,
.pwr_off_seq = card_disable_flow_8822c, .pwr_off_seq = card_disable_flow_8822c,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment