Skip to content

Commit 9e1aff4

Browse files
Ping-Ke ShihKalle Valo
authored andcommitted
wifi: rtw89: pci: add pre_deinit to be called after probe complete
At probe stage, we only do partial initialization to enable ability to download firmware and read capabilities. After that, we use this pre_deinit to disable HCI to save power. Signed-off-by: Ping-Ke Shih <[email protected]> Signed-off-by: Kalle Valo <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent d720cca commit 9e1aff4

File tree

6 files changed

+49
-0
lines changed

6 files changed

+49
-0
lines changed

drivers/net/wireless/realtek/rtw89/core.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4236,6 +4236,8 @@ static int rtw89_chip_efuse_info_setup(struct rtw89_dev *rtwdev)
42364236

42374237
rtw89_core_setup_phycap(rtwdev);
42384238

4239+
rtw89_hci_mac_pre_deinit(rtwdev);
4240+
42394241
rtw89_mac_pwr_off(rtwdev);
42404242

42414243
return 0;

drivers/net/wireless/realtek/rtw89/core.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3064,6 +3064,7 @@ struct rtw89_hci_ops {
30643064
void (*write32)(struct rtw89_dev *rtwdev, u32 addr, u32 data);
30653065

30663066
int (*mac_pre_init)(struct rtw89_dev *rtwdev);
3067+
int (*mac_pre_deinit)(struct rtw89_dev *rtwdev);
30673068
int (*mac_post_init)(struct rtw89_dev *rtwdev);
30683069
int (*deinit)(struct rtw89_dev *rtwdev);
30693070

@@ -4803,6 +4804,11 @@ static inline void rtw89_hci_tx_kick_off(struct rtw89_dev *rtwdev, u8 txch)
48034804
return rtwdev->hci.ops->tx_kick_off(rtwdev, txch);
48044805
}
48054806

4807+
static inline int rtw89_hci_mac_pre_deinit(struct rtw89_dev *rtwdev)
4808+
{
4809+
return rtwdev->hci.ops->mac_pre_deinit(rtwdev);
4810+
}
4811+
48064812
static inline void rtw89_hci_flush_queues(struct rtw89_dev *rtwdev, u32 queues,
48074813
bool drop)
48084814
{

drivers/net/wireless/realtek/rtw89/pci.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3837,6 +3837,7 @@ EXPORT_SYMBOL(rtw89_pm_ops);
38373837

38383838
const struct rtw89_pci_gen_def rtw89_pci_gen_ax = {
38393839
.mac_pre_init = rtw89_pci_ops_mac_pre_init_ax,
3840+
.mac_pre_deinit = NULL,
38403841
.mac_post_init = rtw89_pci_ops_mac_post_init_ax,
38413842

38423843
.clr_idx_all = rtw89_pci_clr_idx_all_ax,
@@ -3866,6 +3867,7 @@ static const struct rtw89_hci_ops rtw89_pci_ops = {
38663867
.write32 = rtw89_pci_ops_write32,
38673868

38683869
.mac_pre_init = rtw89_pci_ops_mac_pre_init,
3870+
.mac_pre_deinit = rtw89_pci_ops_mac_pre_deinit,
38693871
.mac_post_init = rtw89_pci_ops_mac_post_init,
38703872
.deinit = rtw89_pci_ops_deinit,
38713873

drivers/net/wireless/realtek/rtw89/pci.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,6 +1038,7 @@ struct rtw89_pci_bd_ram {
10381038

10391039
struct rtw89_pci_gen_def {
10401040
int (*mac_pre_init)(struct rtw89_dev *rtwdev);
1041+
int (*mac_pre_deinit)(struct rtw89_dev *rtwdev);
10411042
int (*mac_post_init)(struct rtw89_dev *rtwdev);
10421043

10431044
void (*clr_idx_all)(struct rtw89_dev *rtwdev);
@@ -1464,6 +1465,17 @@ static inline int rtw89_pci_ops_mac_pre_init(struct rtw89_dev *rtwdev)
14641465
return gen_def->mac_pre_init(rtwdev);
14651466
}
14661467

1468+
static inline int rtw89_pci_ops_mac_pre_deinit(struct rtw89_dev *rtwdev)
1469+
{
1470+
const struct rtw89_pci_info *info = rtwdev->pci_info;
1471+
const struct rtw89_pci_gen_def *gen_def = info->gen_def;
1472+
1473+
if (!gen_def->mac_pre_deinit)
1474+
return 0;
1475+
1476+
return gen_def->mac_pre_deinit(rtwdev);
1477+
}
1478+
14671479
static inline int rtw89_pci_ops_mac_post_init(struct rtw89_dev *rtwdev)
14681480
{
14691481
const struct rtw89_pci_info *info = rtwdev->pci_info;

drivers/net/wireless/realtek/rtw89/pci_be.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,23 @@ static int rtw89_pci_ops_mac_pre_init_be(struct rtw89_dev *rtwdev)
329329
return 0;
330330
}
331331

332+
static int rtw89_pci_ops_mac_pre_deinit_be(struct rtw89_dev *rtwdev)
333+
{
334+
u32 val;
335+
336+
_patch_pcie_power_wake_be(rtwdev, false);
337+
338+
val = rtw89_read32_mask(rtwdev, R_BE_IC_PWR_STATE, B_BE_WLMAC_PWR_STE_MASK);
339+
if (val == 0)
340+
return 0;
341+
342+
rtw89_pci_ctrl_trxdma_pcie_be(rtwdev, MAC_AX_PCIE_DISABLE,
343+
MAC_AX_PCIE_DISABLE, MAC_AX_PCIE_DISABLE);
344+
rtw89_pci_clr_idx_all_be(rtwdev);
345+
346+
return 0;
347+
}
348+
332349
int rtw89_pci_ltr_set_v2(struct rtw89_dev *rtwdev, bool en)
333350
{
334351
u32 ctrl0, cfg0, cfg1, dec_ctrl, idle_ltcy, act_ltcy, dis_ltcy;
@@ -474,6 +491,7 @@ static int rtw89_pci_lv1rst_start_dma_be(struct rtw89_dev *rtwdev)
474491

475492
const struct rtw89_pci_gen_def rtw89_pci_gen_be = {
476493
.mac_pre_init = rtw89_pci_ops_mac_pre_init_be,
494+
.mac_pre_deinit = rtw89_pci_ops_mac_pre_deinit_be,
477495
.mac_post_init = rtw89_pci_ops_mac_post_init_be,
478496

479497
.clr_idx_all = rtw89_pci_clr_idx_all_be,

drivers/net/wireless/realtek/rtw89/reg.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3871,6 +3871,15 @@
38713871
#define R_BE_UDM2 0x01F8
38723872
#define B_BE_UDM2_EPC_RA_MASK GENMASK(31, 0)
38733873

3874+
#define R_BE_IC_PWR_STATE 0x03F0
3875+
#define B_BE_WHOLE_SYS_PWR_STE_MASK GENMASK(25, 16)
3876+
#define MAC_AX_SYS_ACT 0x220
3877+
#define B_BE_WLMAC_PWR_STE_MASK GENMASK(9, 8)
3878+
#define B_BE_UART_HCISYS_PWR_STE_MASK GENMASK(7, 6)
3879+
#define B_BE_SDIO_HCISYS_PWR_STE_MASK GENMASK(5, 4)
3880+
#define B_BE_USB_HCISYS_PWR_STE_MASK GENMASK(3, 2)
3881+
#define B_BE_PCIE_HCISYS_PWR_STE_MASK GENMASK(1, 0)
3882+
38743883
#define R_BE_DCPU_PLATFORM_ENABLE 0x0888
38753884
#define B_BE_DCPU_SYM_DPLT_MEM_MUX_EN BIT(10)
38763885
#define B_BE_DCPU_WARM_EN BIT(9)

0 commit comments

Comments
 (0)