Skip to content

Commit d720cca

Browse files
Zong-Zhe YangKalle Valo
authored andcommitted
wifi: rtw89: pci: stop/start DMA for level 1 recovery according to chip gen
Level 1 recovery is to recover TX/RX rings, so it needs PCI to stop/start DMA. But, different chip gen have different implementations, either register address/mask or function flow. So, configure callback of stop/start DMA by chip gen. Signed-off-by: Zong-Zhe Yang <[email protected]> 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 d5d717a commit d720cca

File tree

4 files changed

+78
-8
lines changed

4 files changed

+78
-8
lines changed

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

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1755,7 +1755,7 @@ static void rtw89_pci_ctrl_dma_io(struct rtw89_dev *rtwdev, bool enable)
17551755
rtw89_write32_set(rtwdev, reg->addr, reg->mask);
17561756
}
17571757

1758-
static void rtw89_pci_ctrl_dma_all(struct rtw89_dev *rtwdev, bool enable)
1758+
void rtw89_pci_ctrl_dma_all(struct rtw89_dev *rtwdev, bool enable)
17591759
{
17601760
rtw89_pci_ctrl_dma_io(rtwdev, enable);
17611761
rtw89_pci_ctrl_dma_trx(rtwdev, enable);
@@ -3640,7 +3640,7 @@ static void rtw89_pci_l1ss_cfg(struct rtw89_dev *rtwdev)
36403640
rtw89_pci_l1ss_set(rtwdev, true);
36413641
}
36423642

3643-
static int rtw89_pci_poll_io_idle(struct rtw89_dev *rtwdev)
3643+
static int rtw89_pci_poll_io_idle_ax(struct rtw89_dev *rtwdev)
36443644
{
36453645
int ret = 0;
36463646
u32 sts;
@@ -3657,7 +3657,7 @@ static int rtw89_pci_poll_io_idle(struct rtw89_dev *rtwdev)
36573657
return ret;
36583658
}
36593659

3660-
static int rtw89_pci_lv1rst_stop_dma(struct rtw89_dev *rtwdev)
3660+
static int rtw89_pci_lv1rst_stop_dma_ax(struct rtw89_dev *rtwdev)
36613661
{
36623662
u32 val;
36633663
int ret;
@@ -3666,7 +3666,7 @@ static int rtw89_pci_lv1rst_stop_dma(struct rtw89_dev *rtwdev)
36663666
return 0;
36673667

36683668
rtw89_pci_ctrl_dma_all(rtwdev, false);
3669-
ret = rtw89_pci_poll_io_idle(rtwdev);
3669+
ret = rtw89_pci_poll_io_idle_ax(rtwdev);
36703670
if (ret) {
36713671
val = rtw89_read32(rtwdev, R_AX_DBG_ERR_FLAG);
36723672
rtw89_debug(rtwdev, RTW89_DBG_HCI,
@@ -3677,7 +3677,7 @@ static int rtw89_pci_lv1rst_stop_dma(struct rtw89_dev *rtwdev)
36773677
if (val & B_AX_RX_STUCK)
36783678
rtw89_mac_ctrl_hci_dma_rx(rtwdev, false);
36793679
rtw89_mac_ctrl_hci_dma_trx(rtwdev, true);
3680-
ret = rtw89_pci_poll_io_idle(rtwdev);
3680+
ret = rtw89_pci_poll_io_idle_ax(rtwdev);
36813681
val = rtw89_read32(rtwdev, R_AX_DBG_ERR_FLAG);
36823682
rtw89_debug(rtwdev, RTW89_DBG_HCI,
36833683
"[PCIe] poll_io_idle fail, after 0x%08x: 0x%08x\n",
@@ -3687,7 +3687,7 @@ static int rtw89_pci_lv1rst_stop_dma(struct rtw89_dev *rtwdev)
36873687
return ret;
36883688
}
36893689

3690-
static int rtw89_pci_lv1rst_start_dma(struct rtw89_dev *rtwdev)
3690+
static int rtw89_pci_lv1rst_start_dma_ax(struct rtw89_dev *rtwdev)
36913691
{
36923692
u32 ret;
36933693

@@ -3709,18 +3709,20 @@ static int rtw89_pci_lv1rst_start_dma(struct rtw89_dev *rtwdev)
37093709
static int rtw89_pci_ops_mac_lv1_recovery(struct rtw89_dev *rtwdev,
37103710
enum rtw89_lv1_rcvy_step step)
37113711
{
3712+
const struct rtw89_pci_info *info = rtwdev->pci_info;
3713+
const struct rtw89_pci_gen_def *gen_def = info->gen_def;
37123714
int ret;
37133715

37143716
switch (step) {
37153717
case RTW89_LV1_RCVY_STEP_1:
3716-
ret = rtw89_pci_lv1rst_stop_dma(rtwdev);
3718+
ret = gen_def->lv1rst_stop_dma(rtwdev);
37173719
if (ret)
37183720
rtw89_err(rtwdev, "lv1 rcvy pci stop dma fail\n");
37193721

37203722
break;
37213723

37223724
case RTW89_LV1_RCVY_STEP_2:
3723-
ret = rtw89_pci_lv1rst_start_dma(rtwdev);
3725+
ret = gen_def->lv1rst_start_dma(rtwdev);
37243726
if (ret)
37253727
rtw89_err(rtwdev, "lv1 rcvy pci start dma fail\n");
37263728
break;
@@ -3839,6 +3841,9 @@ const struct rtw89_pci_gen_def rtw89_pci_gen_ax = {
38393841

38403842
.clr_idx_all = rtw89_pci_clr_idx_all_ax,
38413843
.rst_bdram = rtw89_pci_rst_bdram_ax,
3844+
3845+
.lv1rst_stop_dma = rtw89_pci_lv1rst_stop_dma_ax,
3846+
.lv1rst_start_dma = rtw89_pci_lv1rst_start_dma_ax,
38423847
};
38433848
EXPORT_SYMBOL(rtw89_pci_gen_ax);
38443849

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,6 +1042,9 @@ struct rtw89_pci_gen_def {
10421042

10431043
void (*clr_idx_all)(struct rtw89_dev *rtwdev);
10441044
int (*rst_bdram)(struct rtw89_dev *rtwdev);
1045+
1046+
int (*lv1rst_stop_dma)(struct rtw89_dev *rtwdev);
1047+
int (*lv1rst_start_dma)(struct rtw89_dev *rtwdev);
10451048
};
10461049

10471050
struct rtw89_pci_info {
@@ -1369,6 +1372,7 @@ u32 rtw89_pci_fill_txaddr_info(struct rtw89_dev *rtwdev,
13691372
u32 rtw89_pci_fill_txaddr_info_v1(struct rtw89_dev *rtwdev,
13701373
void *txaddr_info_addr, u32 total_len,
13711374
dma_addr_t dma, u8 *add_info_nr);
1375+
void rtw89_pci_ctrl_dma_all(struct rtw89_dev *rtwdev, bool enable);
13721376
void rtw89_pci_config_intr_mask(struct rtw89_dev *rtwdev);
13731377
void rtw89_pci_config_intr_mask_v1(struct rtw89_dev *rtwdev);
13741378
void rtw89_pci_enable_intr(struct rtw89_dev *rtwdev, struct rtw89_pci *rtwpci);

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

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include <linux/pci.h>
66

7+
#include "mac.h"
78
#include "pci.h"
89
#include "reg.h"
910

@@ -420,11 +421,65 @@ static int rtw89_pci_ops_mac_post_init_be(struct rtw89_dev *rtwdev)
420421
return 0;
421422
}
422423

424+
static int rtw89_pci_poll_io_idle_be(struct rtw89_dev *rtwdev)
425+
{
426+
u32 sts;
427+
int ret;
428+
429+
ret = read_poll_timeout_atomic(rtw89_read32, sts,
430+
!(sts & B_BE_HAXI_MST_BUSY),
431+
10, 1000, false, rtwdev,
432+
R_BE_HAXI_DMA_BUSY1);
433+
if (ret) {
434+
rtw89_err(rtwdev, "pci dmach busy1 0x%X\n", sts);
435+
return ret;
436+
}
437+
438+
return 0;
439+
}
440+
441+
static int rtw89_pci_lv1rst_stop_dma_be(struct rtw89_dev *rtwdev)
442+
{
443+
int ret;
444+
445+
rtw89_pci_ctrl_dma_all(rtwdev, false);
446+
ret = rtw89_pci_poll_io_idle_be(rtwdev);
447+
if (!ret)
448+
return 0;
449+
450+
rtw89_debug(rtwdev, RTW89_DBG_HCI,
451+
"[PCIe] poll_io_idle fail; reset hci dma trx\n");
452+
453+
rtw89_mac_ctrl_hci_dma_trx(rtwdev, false);
454+
rtw89_mac_ctrl_hci_dma_trx(rtwdev, true);
455+
456+
return rtw89_pci_poll_io_idle_be(rtwdev);
457+
}
458+
459+
static int rtw89_pci_lv1rst_start_dma_be(struct rtw89_dev *rtwdev)
460+
{
461+
int ret;
462+
463+
rtw89_mac_ctrl_hci_dma_trx(rtwdev, false);
464+
rtw89_mac_ctrl_hci_dma_trx(rtwdev, true);
465+
rtw89_pci_clr_idx_all(rtwdev);
466+
467+
ret = rtw89_pci_rst_bdram_be(rtwdev);
468+
if (ret)
469+
return ret;
470+
471+
rtw89_pci_ctrl_dma_all(rtwdev, true);
472+
return 0;
473+
}
474+
423475
const struct rtw89_pci_gen_def rtw89_pci_gen_be = {
424476
.mac_pre_init = rtw89_pci_ops_mac_pre_init_be,
425477
.mac_post_init = rtw89_pci_ops_mac_post_init_be,
426478

427479
.clr_idx_all = rtw89_pci_clr_idx_all_be,
428480
.rst_bdram = rtw89_pci_rst_bdram_be,
481+
482+
.lv1rst_stop_dma = rtw89_pci_lv1rst_stop_dma_be,
483+
.lv1rst_start_dma = rtw89_pci_lv1rst_start_dma_be,
429484
};
430485
EXPORT_SYMBOL(rtw89_pci_gen_be);

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,9 @@ static int hal_enable_dma(struct rtw89_ser *ser)
361361
ret = rtwdev->hci.ops->mac_lv1_rcvy(rtwdev, RTW89_LV1_RCVY_STEP_2);
362362
if (!ret)
363363
clear_bit(RTW89_SER_HAL_STOP_DMA, ser->flags);
364+
else
365+
rtw89_debug(rtwdev, RTW89_DBG_SER,
366+
"lv1 rcvy fail to start dma: %d\n", ret);
364367

365368
return ret;
366369
}
@@ -376,6 +379,9 @@ static int hal_stop_dma(struct rtw89_ser *ser)
376379
ret = rtwdev->hci.ops->mac_lv1_rcvy(rtwdev, RTW89_LV1_RCVY_STEP_1);
377380
if (!ret)
378381
set_bit(RTW89_SER_HAL_STOP_DMA, ser->flags);
382+
else
383+
rtw89_debug(rtwdev, RTW89_DBG_SER,
384+
"lv1 rcvy fail to stop dma: %d\n", ret);
379385

380386
return ret;
381387
}

0 commit comments

Comments
 (0)