Commit 1bf6fa8a authored by Chin-Yen Lee's avatar Chin-Yen Lee Committed by Kalle Valo

wifi: rtw89: update DMA function with different generation

The register of control and polling function for TX/RX DMA is different
from different generation, so update them. Also rename polling_dma
function to polling_dma_idle to avoid misunderstanding.
Signed-off-by: default avatarChin-Yen Lee <timlee@realtek.com>
Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://msgid.link/20240302005828.13666-4-pkshih@realtek.com
parent a0f00465
...@@ -3202,7 +3202,7 @@ struct rtw89_hci_ops { ...@@ -3202,7 +3202,7 @@ struct rtw89_hci_ops {
void (*ctrl_txdma_ch)(struct rtw89_dev *rtwdev, bool enable); void (*ctrl_txdma_ch)(struct rtw89_dev *rtwdev, bool enable);
void (*ctrl_txdma_fw_ch)(struct rtw89_dev *rtwdev, bool enable); void (*ctrl_txdma_fw_ch)(struct rtw89_dev *rtwdev, bool enable);
void (*ctrl_trxhci)(struct rtw89_dev *rtwdev, bool enable); void (*ctrl_trxhci)(struct rtw89_dev *rtwdev, bool enable);
int (*poll_txdma_ch)(struct rtw89_dev *rtwdev); int (*poll_txdma_ch_idle)(struct rtw89_dev *rtwdev);
void (*clr_idx_all)(struct rtw89_dev *rtwdev); void (*clr_idx_all)(struct rtw89_dev *rtwdev);
void (*clear)(struct rtw89_dev *rtwdev, struct pci_dev *pdev); void (*clear)(struct rtw89_dev *rtwdev, struct pci_dev *pdev);
void (*disable_intr)(struct rtw89_dev *rtwdev); void (*disable_intr)(struct rtw89_dev *rtwdev);
...@@ -5253,12 +5253,12 @@ static inline void rtw89_hci_ctrl_trxhci(struct rtw89_dev *rtwdev, bool enable) ...@@ -5253,12 +5253,12 @@ static inline void rtw89_hci_ctrl_trxhci(struct rtw89_dev *rtwdev, bool enable)
rtwdev->hci.ops->ctrl_trxhci(rtwdev, enable); rtwdev->hci.ops->ctrl_trxhci(rtwdev, enable);
} }
static inline int rtw89_hci_poll_txdma_ch(struct rtw89_dev *rtwdev) static inline int rtw89_hci_poll_txdma_ch_idle(struct rtw89_dev *rtwdev)
{ {
int ret = 0; int ret = 0;
if (rtwdev->hci.ops->poll_txdma_ch) if (rtwdev->hci.ops->poll_txdma_ch_idle)
ret = rtwdev->hci.ops->poll_txdma_ch(rtwdev); ret = rtwdev->hci.ops->poll_txdma_ch_idle(rtwdev);
return ret; return ret;
} }
......
...@@ -218,7 +218,7 @@ int rtw89_pci_sync_skb_for_device_and_validate_rx_info(struct rtw89_dev *rtwdev, ...@@ -218,7 +218,7 @@ int rtw89_pci_sync_skb_for_device_and_validate_rx_info(struct rtw89_dev *rtwdev,
return ret; return ret;
} }
static void rtw89_pci_ctrl_txdma_ch_pcie(struct rtw89_dev *rtwdev, bool enable) static void rtw89_pci_ctrl_txdma_ch_ax(struct rtw89_dev *rtwdev, bool enable)
{ {
const struct rtw89_pci_info *info = rtwdev->pci_info; const struct rtw89_pci_info *info = rtwdev->pci_info;
const struct rtw89_reg_def *dma_stop1 = &info->dma_stop1; const struct rtw89_reg_def *dma_stop1 = &info->dma_stop1;
...@@ -235,7 +235,7 @@ static void rtw89_pci_ctrl_txdma_ch_pcie(struct rtw89_dev *rtwdev, bool enable) ...@@ -235,7 +235,7 @@ static void rtw89_pci_ctrl_txdma_ch_pcie(struct rtw89_dev *rtwdev, bool enable)
} }
} }
static void rtw89_pci_ctrl_txdma_fw_ch_pcie(struct rtw89_dev *rtwdev, bool enable) static void rtw89_pci_ctrl_txdma_fw_ch_ax(struct rtw89_dev *rtwdev, bool enable)
{ {
const struct rtw89_pci_info *info = rtwdev->pci_info; const struct rtw89_pci_info *info = rtwdev->pci_info;
const struct rtw89_reg_def *dma_stop1 = &info->dma_stop1; const struct rtw89_reg_def *dma_stop1 = &info->dma_stop1;
...@@ -2524,7 +2524,7 @@ static void rtw89_pci_clr_idx_all_ax(struct rtw89_dev *rtwdev) ...@@ -2524,7 +2524,7 @@ static void rtw89_pci_clr_idx_all_ax(struct rtw89_dev *rtwdev)
B_AX_CLR_RXQ_IDX | B_AX_CLR_RPQ_IDX); B_AX_CLR_RXQ_IDX | B_AX_CLR_RPQ_IDX);
} }
static int rtw89_poll_txdma_ch_idle_pcie(struct rtw89_dev *rtwdev) static int rtw89_pci_poll_txdma_ch_idle_ax(struct rtw89_dev *rtwdev)
{ {
const struct rtw89_pci_info *info = rtwdev->pci_info; const struct rtw89_pci_info *info = rtwdev->pci_info;
u32 ret, check, dma_busy; u32 ret, check, dma_busy;
...@@ -2551,7 +2551,7 @@ static int rtw89_poll_txdma_ch_idle_pcie(struct rtw89_dev *rtwdev) ...@@ -2551,7 +2551,7 @@ static int rtw89_poll_txdma_ch_idle_pcie(struct rtw89_dev *rtwdev)
return 0; return 0;
} }
static int rtw89_poll_rxdma_ch_idle_pcie(struct rtw89_dev *rtwdev) static int rtw89_pci_poll_rxdma_ch_idle_ax(struct rtw89_dev *rtwdev)
{ {
const struct rtw89_pci_info *info = rtwdev->pci_info; const struct rtw89_pci_info *info = rtwdev->pci_info;
u32 ret, check, dma_busy; u32 ret, check, dma_busy;
...@@ -2571,13 +2571,13 @@ static int rtw89_pci_poll_dma_all_idle(struct rtw89_dev *rtwdev) ...@@ -2571,13 +2571,13 @@ static int rtw89_pci_poll_dma_all_idle(struct rtw89_dev *rtwdev)
{ {
u32 ret; u32 ret;
ret = rtw89_poll_txdma_ch_idle_pcie(rtwdev); ret = rtw89_pci_poll_txdma_ch_idle_ax(rtwdev);
if (ret) { if (ret) {
rtw89_err(rtwdev, "txdma ch busy\n"); rtw89_err(rtwdev, "txdma ch busy\n");
return ret; return ret;
} }
ret = rtw89_poll_rxdma_ch_idle_pcie(rtwdev); ret = rtw89_pci_poll_rxdma_ch_idle_ax(rtwdev);
if (ret) { if (ret) {
rtw89_err(rtwdev, "rxdma ch busy\n"); rtw89_err(rtwdev, "rxdma ch busy\n");
return ret; return ret;
...@@ -2756,8 +2756,8 @@ static int rtw89_pci_ops_mac_pre_init_ax(struct rtw89_dev *rtwdev) ...@@ -2756,8 +2756,8 @@ static int rtw89_pci_ops_mac_pre_init_ax(struct rtw89_dev *rtwdev)
} }
/* disable all channels except to FW CMD channel to download firmware */ /* disable all channels except to FW CMD channel to download firmware */
rtw89_pci_ctrl_txdma_ch_pcie(rtwdev, false); rtw89_pci_ctrl_txdma_ch_ax(rtwdev, false);
rtw89_pci_ctrl_txdma_fw_ch_pcie(rtwdev, true); rtw89_pci_ctrl_txdma_fw_ch_ax(rtwdev, true);
/* start DMA activities */ /* start DMA activities */
rtw89_pci_ctrl_dma_all(rtwdev, true); rtw89_pci_ctrl_dma_all(rtwdev, true);
...@@ -2870,7 +2870,7 @@ static int rtw89_pci_ops_mac_post_init_ax(struct rtw89_dev *rtwdev) ...@@ -2870,7 +2870,7 @@ static int rtw89_pci_ops_mac_post_init_ax(struct rtw89_dev *rtwdev)
} }
/* enable DMA for all queues */ /* enable DMA for all queues */
rtw89_pci_ctrl_txdma_ch_pcie(rtwdev, true); rtw89_pci_ctrl_txdma_ch_ax(rtwdev, true);
/* Release PCI IO */ /* Release PCI IO */
rtw89_write32_clr(rtwdev, info->dma_stop1.addr, rtw89_write32_clr(rtwdev, info->dma_stop1.addr,
...@@ -4093,6 +4093,10 @@ const struct rtw89_pci_gen_def rtw89_pci_gen_ax = { ...@@ -4093,6 +4093,10 @@ const struct rtw89_pci_gen_def rtw89_pci_gen_ax = {
.lv1rst_stop_dma = rtw89_pci_lv1rst_stop_dma_ax, .lv1rst_stop_dma = rtw89_pci_lv1rst_stop_dma_ax,
.lv1rst_start_dma = rtw89_pci_lv1rst_start_dma_ax, .lv1rst_start_dma = rtw89_pci_lv1rst_start_dma_ax,
.ctrl_txdma_ch = rtw89_pci_ctrl_txdma_ch_ax,
.ctrl_txdma_fw_ch = rtw89_pci_ctrl_txdma_fw_ch_ax,
.poll_txdma_ch_idle = rtw89_pci_poll_txdma_ch_idle_ax,
.aspm_set = rtw89_pci_aspm_set_ax, .aspm_set = rtw89_pci_aspm_set_ax,
.clkreq_set = rtw89_pci_clkreq_set_ax, .clkreq_set = rtw89_pci_clkreq_set_ax,
.l1ss_set = rtw89_pci_l1ss_set_ax, .l1ss_set = rtw89_pci_l1ss_set_ax,
...@@ -4130,10 +4134,11 @@ static const struct rtw89_hci_ops rtw89_pci_ops = { ...@@ -4130,10 +4134,11 @@ static const struct rtw89_hci_ops rtw89_pci_ops = {
.recovery_start = rtw89_pci_ops_recovery_start, .recovery_start = rtw89_pci_ops_recovery_start,
.recovery_complete = rtw89_pci_ops_recovery_complete, .recovery_complete = rtw89_pci_ops_recovery_complete,
.ctrl_txdma_ch = rtw89_pci_ctrl_txdma_ch_pcie, .ctrl_txdma_ch = rtw89_pci_ctrl_txdma_ch,
.ctrl_txdma_fw_ch = rtw89_pci_ctrl_txdma_fw_ch_pcie, .ctrl_txdma_fw_ch = rtw89_pci_ctrl_txdma_fw_ch,
.ctrl_trxhci = rtw89_pci_ctrl_dma_trx, .ctrl_trxhci = rtw89_pci_ctrl_dma_trx,
.poll_txdma_ch = rtw89_poll_txdma_ch_idle_pcie, .poll_txdma_ch_idle = rtw89_pci_poll_txdma_ch_idle,
.clr_idx_all = rtw89_pci_clr_idx_all, .clr_idx_all = rtw89_pci_clr_idx_all,
.clear = rtw89_pci_clear_resource, .clear = rtw89_pci_clear_resource,
.disable_intr = rtw89_pci_disable_intr_lock, .disable_intr = rtw89_pci_disable_intr_lock,
......
...@@ -1243,6 +1243,10 @@ struct rtw89_pci_gen_def { ...@@ -1243,6 +1243,10 @@ struct rtw89_pci_gen_def {
int (*lv1rst_stop_dma)(struct rtw89_dev *rtwdev); int (*lv1rst_stop_dma)(struct rtw89_dev *rtwdev);
int (*lv1rst_start_dma)(struct rtw89_dev *rtwdev); int (*lv1rst_start_dma)(struct rtw89_dev *rtwdev);
void (*ctrl_txdma_ch)(struct rtw89_dev *rtwdev, bool enable);
void (*ctrl_txdma_fw_ch)(struct rtw89_dev *rtwdev, bool enable);
int (*poll_txdma_ch_idle)(struct rtw89_dev *rtwdev);
void (*aspm_set)(struct rtw89_dev *rtwdev, bool enable); void (*aspm_set)(struct rtw89_dev *rtwdev, bool enable);
void (*clkreq_set)(struct rtw89_dev *rtwdev, bool enable); void (*clkreq_set)(struct rtw89_dev *rtwdev, bool enable);
void (*l1ss_set)(struct rtw89_dev *rtwdev, bool enable); void (*l1ss_set)(struct rtw89_dev *rtwdev, bool enable);
...@@ -1709,4 +1713,27 @@ static inline int rtw89_pci_reset_bdram(struct rtw89_dev *rtwdev) ...@@ -1709,4 +1713,27 @@ static inline int rtw89_pci_reset_bdram(struct rtw89_dev *rtwdev)
return gen_def->rst_bdram(rtwdev); return gen_def->rst_bdram(rtwdev);
} }
static inline void rtw89_pci_ctrl_txdma_ch(struct rtw89_dev *rtwdev, bool enable)
{
const struct rtw89_pci_info *info = rtwdev->pci_info;
const struct rtw89_pci_gen_def *gen_def = info->gen_def;
return gen_def->ctrl_txdma_ch(rtwdev, enable);
}
static inline void rtw89_pci_ctrl_txdma_fw_ch(struct rtw89_dev *rtwdev, bool enable)
{
const struct rtw89_pci_info *info = rtwdev->pci_info;
const struct rtw89_pci_gen_def *gen_def = info->gen_def;
return gen_def->ctrl_txdma_fw_ch(rtwdev, enable);
}
static inline int rtw89_pci_poll_txdma_ch_idle(struct rtw89_dev *rtwdev)
{
const struct rtw89_pci_info *info = rtwdev->pci_info;
const struct rtw89_pci_gen_def *gen_def = info->gen_def;
return gen_def->poll_txdma_ch_idle(rtwdev);
}
#endif #endif
...@@ -317,8 +317,7 @@ static void rtw89_pci_ser_setting_be(struct rtw89_dev *rtwdev) ...@@ -317,8 +317,7 @@ static void rtw89_pci_ser_setting_be(struct rtw89_dev *rtwdev)
rtw89_write32(rtwdev, R_BE_REG_PL1_MASK, val32); rtw89_write32(rtwdev, R_BE_REG_PL1_MASK, val32);
} }
static void rtw89_pci_ctrl_txdma_ch_be(struct rtw89_dev *rtwdev, bool all_en, static void rtw89_pci_ctrl_txdma_ch_be(struct rtw89_dev *rtwdev, bool enable)
bool h2c_en)
{ {
u32 mask_all; u32 mask_all;
u32 val; u32 val;
...@@ -331,12 +330,19 @@ static void rtw89_pci_ctrl_txdma_ch_be(struct rtw89_dev *rtwdev, bool all_en, ...@@ -331,12 +330,19 @@ static void rtw89_pci_ctrl_txdma_ch_be(struct rtw89_dev *rtwdev, bool all_en,
val = rtw89_read32(rtwdev, R_BE_HAXI_DMA_STOP1); val = rtw89_read32(rtwdev, R_BE_HAXI_DMA_STOP1);
val |= B_BE_STOP_CH13 | B_BE_STOP_CH14; val |= B_BE_STOP_CH13 | B_BE_STOP_CH14;
if (all_en) if (enable)
val &= ~mask_all; val &= ~mask_all;
else else
val |= mask_all; val |= mask_all;
if (h2c_en) rtw89_write32(rtwdev, R_BE_HAXI_DMA_STOP1, val);
}
static void rtw89_pci_ctrl_txdma_fw_ch_be(struct rtw89_dev *rtwdev, bool enable)
{
u32 val = rtw89_read32(rtwdev, R_BE_HAXI_DMA_STOP1);
if (enable)
val &= ~B_BE_STOP_CH12; val &= ~B_BE_STOP_CH12;
else else
val |= B_BE_STOP_CH12; val |= B_BE_STOP_CH12;
...@@ -375,7 +381,8 @@ static int rtw89_pci_ops_mac_pre_init_be(struct rtw89_dev *rtwdev) ...@@ -375,7 +381,8 @@ static int rtw89_pci_ops_mac_pre_init_be(struct rtw89_dev *rtwdev)
rtw89_pci_pcie_setting_be(rtwdev); rtw89_pci_pcie_setting_be(rtwdev);
rtw89_pci_ser_setting_be(rtwdev); rtw89_pci_ser_setting_be(rtwdev);
rtw89_pci_ctrl_txdma_ch_be(rtwdev, false, true); rtw89_pci_ctrl_txdma_ch_be(rtwdev, false);
rtw89_pci_ctrl_txdma_fw_ch_be(rtwdev, true);
rtw89_pci_ctrl_trxdma_pcie_be(rtwdev, MAC_AX_PCIE_ENABLE, rtw89_pci_ctrl_trxdma_pcie_be(rtwdev, MAC_AX_PCIE_ENABLE,
MAC_AX_PCIE_ENABLE, MAC_AX_PCIE_ENABLE); MAC_AX_PCIE_ENABLE, MAC_AX_PCIE_ENABLE);
...@@ -485,7 +492,8 @@ static int rtw89_pci_ops_mac_post_init_be(struct rtw89_dev *rtwdev) ...@@ -485,7 +492,8 @@ static int rtw89_pci_ops_mac_post_init_be(struct rtw89_dev *rtwdev)
rtw89_pci_ctrl_trxdma_pcie_be(rtwdev, MAC_AX_PCIE_IGNORE, rtw89_pci_ctrl_trxdma_pcie_be(rtwdev, MAC_AX_PCIE_IGNORE,
MAC_AX_PCIE_IGNORE, MAC_AX_PCIE_ENABLE); MAC_AX_PCIE_IGNORE, MAC_AX_PCIE_ENABLE);
rtw89_pci_ctrl_wpdma_pcie_be(rtwdev, true); rtw89_pci_ctrl_wpdma_pcie_be(rtwdev, true);
rtw89_pci_ctrl_txdma_ch_be(rtwdev, true, true); rtw89_pci_ctrl_txdma_ch_be(rtwdev, true);
rtw89_pci_ctrl_txdma_fw_ch_be(rtwdev, true);
rtw89_pci_configure_mit_be(rtwdev); rtw89_pci_configure_mit_be(rtwdev);
return 0; return 0;
...@@ -559,6 +567,10 @@ const struct rtw89_pci_gen_def rtw89_pci_gen_be = { ...@@ -559,6 +567,10 @@ const struct rtw89_pci_gen_def rtw89_pci_gen_be = {
.lv1rst_stop_dma = rtw89_pci_lv1rst_stop_dma_be, .lv1rst_stop_dma = rtw89_pci_lv1rst_stop_dma_be,
.lv1rst_start_dma = rtw89_pci_lv1rst_start_dma_be, .lv1rst_start_dma = rtw89_pci_lv1rst_start_dma_be,
.ctrl_txdma_ch = rtw89_pci_ctrl_txdma_ch_be,
.ctrl_txdma_fw_ch = rtw89_pci_ctrl_txdma_fw_ch_be,
.poll_txdma_ch_idle = rtw89_pci_poll_txdma_ch_idle_be,
.aspm_set = rtw89_pci_aspm_set_be, .aspm_set = rtw89_pci_aspm_set_be,
.clkreq_set = rtw89_pci_clkreq_set_be, .clkreq_set = rtw89_pci_clkreq_set_be,
.l1ss_set = rtw89_pci_l1ss_set_be, .l1ss_set = rtw89_pci_l1ss_set_be,
......
...@@ -560,7 +560,7 @@ static int rtw89_wow_enable_trx_pre(struct rtw89_dev *rtwdev) ...@@ -560,7 +560,7 @@ static int rtw89_wow_enable_trx_pre(struct rtw89_dev *rtwdev)
rtw89_mac_ptk_drop_by_band_and_wait(rtwdev, RTW89_MAC_0); rtw89_mac_ptk_drop_by_band_and_wait(rtwdev, RTW89_MAC_0);
ret = rtw89_hci_poll_txdma_ch(rtwdev); ret = rtw89_hci_poll_txdma_ch_idle(rtwdev);
if (ret) { if (ret) {
rtw89_err(rtwdev, "txdma ch busy\n"); rtw89_err(rtwdev, "txdma ch busy\n");
return ret; return ret;
...@@ -583,7 +583,7 @@ static int rtw89_wow_enable_trx_post(struct rtw89_dev *rtwdev) ...@@ -583,7 +583,7 @@ static int rtw89_wow_enable_trx_post(struct rtw89_dev *rtwdev)
rtw89_hci_disable_intr(rtwdev); rtw89_hci_disable_intr(rtwdev);
rtw89_hci_ctrl_trxhci(rtwdev, false); rtw89_hci_ctrl_trxhci(rtwdev, false);
ret = rtw89_hci_poll_txdma_ch(rtwdev); ret = rtw89_hci_poll_txdma_ch_idle(rtwdev);
if (ret) { if (ret) {
rtw89_err(rtwdev, "failed to poll txdma ch idle pcie\n"); rtw89_err(rtwdev, "failed to poll txdma ch idle pcie\n");
return ret; return ret;
......
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