wifi: rtw89: 8922ae: add 8922AE PCI entry and basic info
authorPing-Ke Shih <pkshih@realtek.com>
Thu, 26 Oct 2023 12:00:46 +0000 (20:00 +0800)
committerKalle Valo <kvalo@kernel.org>
Mon, 30 Oct 2023 17:23:00 +0000 (19:23 +0200)
8922AE is a PCIE 802.11be wireless adapter with PID 0x8922. We add basic
configurations including PCI DMA mode, PCI parameters, register address to
control TX/RX rings and etc.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20231026120049.9187-2-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/pci.h
drivers/net/wireless/realtek/rtw89/reg.h
drivers/net/wireless/realtek/rtw89/rtw8922ae.c [new file with mode: 0644]

index 2f3d1ad3b0f7d0b7b75657bc215110c434adabe0..907478db83efa1be1cc3e6434b52f83692c6d74a 100644 (file)
 #define B_AX_CH11_BUSY                 BIT(1)
 #define B_AX_CH10_BUSY                 BIT(0)
 
+#define R_BE_HAXI_DMA_STOP1 0xB010
+#define B_BE_STOP_WPDMA BIT(31)
+#define B_BE_STOP_CH14 BIT(14)
+#define B_BE_STOP_CH13 BIT(13)
+#define B_BE_STOP_CH12 BIT(12)
+#define B_BE_STOP_CH11 BIT(11)
+#define B_BE_STOP_CH10 BIT(10)
+#define B_BE_STOP_CH9 BIT(9)
+#define B_BE_STOP_CH8 BIT(8)
+#define B_BE_STOP_CH7 BIT(7)
+#define B_BE_STOP_CH6 BIT(6)
+#define B_BE_STOP_CH5 BIT(5)
+#define B_BE_STOP_CH4 BIT(4)
+#define B_BE_STOP_CH3 BIT(3)
+#define B_BE_STOP_CH2 BIT(2)
+#define B_BE_STOP_CH1 BIT(1)
+#define B_BE_STOP_CH0 BIT(0)
+#define B_BE_TX_STOP1_MASK (B_BE_STOP_CH0 | B_BE_STOP_CH1 | \
+                           B_BE_STOP_CH2 | B_BE_STOP_CH3 | \
+                           B_BE_STOP_CH4 | B_BE_STOP_CH5 | \
+                           B_BE_STOP_CH6 | B_BE_STOP_CH7 | \
+                           B_BE_STOP_CH8 | B_BE_STOP_CH9 | \
+                           B_BE_STOP_CH10 | B_BE_STOP_CH11 | \
+                           B_BE_STOP_CH12)
+
 /* Configure */
 #define R_AX_PCIE_INIT_CFG2            0x1004
 #define B_AX_WD_ITVL_IDLE              GENMASK(27, 24)
 #define R_AX_PCIE_HRPWM_V1             0x30C0
 #define R_AX_PCIE_CRPWM                        0x30C4
 
+#define R_BE_PCIE_HRPWM 0x30C0
+#define R_BE_PCIE_CRPWM 0x30C4
+
+#define R_BE_TXBD_RWPTR_CLR1 0xB014
+#define B_BE_CLR_CH14_IDX BIT(14)
+#define B_BE_CLR_CH13_IDX BIT(13)
+#define B_BE_CLR_CH12_IDX BIT(12)
+#define B_BE_CLR_CH11_IDX BIT(11)
+#define B_BE_CLR_CH10_IDX BIT(10)
+#define B_BE_CLR_CH9_IDX BIT(9)
+#define B_BE_CLR_CH8_IDX BIT(8)
+#define B_BE_CLR_CH7_IDX BIT(7)
+#define B_BE_CLR_CH6_IDX BIT(6)
+#define B_BE_CLR_CH5_IDX BIT(5)
+#define B_BE_CLR_CH4_IDX BIT(4)
+#define B_BE_CLR_CH3_IDX BIT(3)
+#define B_BE_CLR_CH2_IDX BIT(2)
+#define B_BE_CLR_CH1_IDX BIT(1)
+#define B_BE_CLR_CH0_IDX BIT(0)
+
+#define R_BE_RXBD_RWPTR_CLR1_V1 0xB018
+#define B_BE_CLR_ROQ1_IDX_V1 BIT(5)
+#define B_BE_CLR_RPQ1_IDX_V1 BIT(4)
+#define B_BE_CLR_RXQ1_IDX_V1 BIT(3)
+#define B_BE_CLR_ROQ0_IDX BIT(2)
+#define B_BE_CLR_RPQ0_IDX BIT(1)
+#define B_BE_CLR_RXQ0_IDX BIT(0)
+
+#define R_BE_HAXI_DMA_BUSY1 0xB01C
+#define B_BE_HAXI_MST_BUSY BIT(31)
+#define B_BE_HAXI_RX_IDLE BIT(25)
+#define B_BE_HAXI_TX_IDLE BIT(24)
+#define B_BE_ROQ1_BUSY_V1 BIT(21)
+#define B_BE_RPQ1_BUSY_V1 BIT(20)
+#define B_BE_RXQ1_BUSY_V1 BIT(19)
+#define B_BE_ROQ0_BUSY_V1 BIT(18)
+#define B_BE_RPQ0_BUSY_V1 BIT(17)
+#define B_BE_RXQ0_BUSY_V1 BIT(16)
+#define B_BE_WPDMA_BUSY BIT(15)
+#define B_BE_CH14_BUSY BIT(14)
+#define B_BE_CH13_BUSY BIT(13)
+#define B_BE_CH12_BUSY BIT(12)
+#define B_BE_CH11_BUSY BIT(11)
+#define B_BE_CH10_BUSY BIT(10)
+#define B_BE_CH9_BUSY BIT(9)
+#define B_BE_CH8_BUSY BIT(8)
+#define B_BE_CH7_BUSY BIT(7)
+#define B_BE_CH6_BUSY BIT(6)
+#define B_BE_CH5_BUSY BIT(5)
+#define B_BE_CH4_BUSY BIT(4)
+#define B_BE_CH3_BUSY BIT(3)
+#define B_BE_CH2_BUSY BIT(2)
+#define B_BE_CH1_BUSY BIT(1)
+#define B_BE_CH0_BUSY BIT(0)
+#define DMA_BUSY1_CHECK_BE (B_BE_CH0_BUSY | B_BE_CH1_BUSY | B_BE_CH2_BUSY | \
+                           B_BE_CH3_BUSY | B_BE_CH4_BUSY | B_BE_CH5_BUSY | \
+                           B_BE_CH6_BUSY | B_BE_CH7_BUSY | B_BE_CH8_BUSY | \
+                           B_BE_CH9_BUSY | B_BE_CH10_BUSY | B_BE_CH11_BUSY | \
+                           B_BE_CH12_BUSY | B_BE_CH13_BUSY | B_BE_CH14_BUSY)
+
+#define R_BE_HAXI_EXP_CTRL_V1 0xB020
+#define B_BE_R_NO_SEC_ACCESS BIT(31)
+#define B_BE_FORCE_EN_DMA_RX_GCLK BIT(5)
+#define B_BE_FORCE_EN_DMA_TX_GCLK BIT(4)
+#define B_BE_MAX_TAG_NUM_MASK GENMASK(3, 0)
+
 #define RTW89_PCI_TXBD_NUM_MAX         256
 #define RTW89_PCI_RXBD_NUM_MAX         256
 #define RTW89_PCI_TXWD_NUM_MAX         512
index ccd5481e8a3dc8f0dddd548c55e09f030647ef30..b509e9582ccf421bf505f1df6b68d4b21a2f9483 100644 (file)
 #define R_BE_PLE_DBG_FUN_INTF_DATA 0x9114
 #define B_BE_PLE_DFI_DATA_MASK GENMASK(31, 0)
 
+#define R_BE_HAXI_INIT_CFG1 0xB000
+#define B_BE_CFG_WD_PERIOD_IDLE_MASK GENMASK(31, 28)
+#define B_BE_CFG_WD_PERIOD_ACTIVE_MASK GENMASK(27, 24)
+#define B_BE_EN_RO_IDX_UPD_BY_IO BIT(19)
+#define B_BE_RST_KEEP_REG BIT(18)
+#define B_BE_FLUSH_HAXI_MST BIT(17)
+#define B_BE_SET_BDRAM_BOUND BIT(16)
+#define B_BE_ADDRINFO_ALIGN4B_EN BIT(15)
+#define B_BE_RXBD_DONE_MODE_MASK GENMASK(14, 13)
+#define B_BE_RXQ_RXBD_MODE_MASK GENMASK(12, 11)
+#define B_BE_DMA_MODE_MASK GENMASK(10, 8)
+#define S_BE_DMA_MOD_PCIE_NO_DATA_CPU 0x0
+#define S_BE_DMA_MOD_PCIE_DATA_CPU 0x1
+#define S_BE_DMA_MOD_USB 0x4
+#define S_BE_DMA_MOD_SDIO 0x6
+#define B_BE_STOP_AXI_MST BIT(7)
+#define B_BE_RXDMA_ALIGN64B_EN BIT(6)
+#define B_BE_RXDMA_EN BIT(5)
+#define B_BE_TXDMA_EN BIT(4)
+#define B_BE_MAX_RXDMA_MASK GENMASK(3, 2)
+#define B_BE_MAX_TXDMA_MASK GENMASK(1, 0)
+
 #define R_BE_CMAC_FUNC_EN 0x10000
 #define R_BE_CMAC_FUNC_EN_C1 0x14000
 #define B_BE_CMAC_CRPRT BIT(31)
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8922ae.c b/drivers/net/wireless/realtek/rtw89/rtw8922ae.c
new file mode 100644 (file)
index 0000000..948015a
--- /dev/null
@@ -0,0 +1,76 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/* Copyright(c) 2023  Realtek Corporation
+ */
+
+#include <linux/module.h>
+#include <linux/pci.h>
+
+#include "pci.h"
+#include "reg.h"
+
+static const struct rtw89_pci_info rtw8922a_pci_info = {
+       .txbd_trunc_mode        = MAC_AX_BD_TRUNC,
+       .rxbd_trunc_mode        = MAC_AX_BD_TRUNC,
+       .rxbd_mode              = MAC_AX_RXBD_PKT,
+       .tag_mode               = MAC_AX_TAG_MULTI,
+       .tx_burst               = MAC_AX_TX_BURST_V1_256B,
+       .rx_burst               = MAC_AX_RX_BURST_V1_128B,
+       .wd_dma_idle_intvl      = MAC_AX_WD_DMA_INTVL_256NS,
+       .wd_dma_act_intvl       = MAC_AX_WD_DMA_INTVL_256NS,
+       .multi_tag_num          = MAC_AX_TAG_NUM_8,
+       .lbc_en                 = MAC_AX_PCIE_ENABLE,
+       .lbc_tmr                = MAC_AX_LBC_TMR_2MS,
+       .autok_en               = MAC_AX_PCIE_DISABLE,
+       .io_rcy_en              = MAC_AX_PCIE_ENABLE,
+       .io_rcy_tmr             = MAC_AX_IO_RCY_ANA_TMR_DEF,
+
+       .init_cfg_reg           = R_BE_HAXI_INIT_CFG1,
+       .txhci_en_bit           = B_BE_TXDMA_EN,
+       .rxhci_en_bit           = B_BE_RXDMA_EN,
+       .rxbd_mode_bit          = B_BE_RXQ_RXBD_MODE_MASK,
+       .exp_ctrl_reg           = R_BE_HAXI_EXP_CTRL_V1,
+       .max_tag_num_mask       = B_BE_MAX_TAG_NUM_MASK,
+       .rxbd_rwptr_clr_reg     = R_BE_RXBD_RWPTR_CLR1_V1,
+       .txbd_rwptr_clr2_reg    = R_BE_TXBD_RWPTR_CLR1,
+       .dma_stop1              = {R_BE_HAXI_DMA_STOP1, B_BE_TX_STOP1_MASK},
+       .dma_stop2              = {0},
+       .dma_busy1              = {R_BE_HAXI_DMA_BUSY1, DMA_BUSY1_CHECK_BE},
+       .dma_busy2_reg          = 0,
+       .dma_busy3_reg          = R_BE_HAXI_DMA_BUSY1,
+
+       .rpwm_addr              = R_BE_PCIE_HRPWM,
+       .cpwm_addr              = R_BE_PCIE_CRPWM,
+       .tx_dma_ch_mask         = 0,
+       .bd_idx_addr_low_power  = NULL,
+       .bd_ram_table           = NULL,
+
+       .fill_txaddr_info       = rtw89_pci_fill_txaddr_info_v1,
+};
+
+static const struct rtw89_driver_info rtw89_8922ae_info = {
+       .bus = {
+               .pci = &rtw8922a_pci_info,
+       },
+};
+
+static const struct pci_device_id rtw89_8922ae_id_table[] = {
+       {
+               PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8922),
+               .driver_data = (kernel_ulong_t)&rtw89_8922ae_info,
+       },
+       {},
+};
+MODULE_DEVICE_TABLE(pci, rtw89_8922ae_id_table);
+
+static struct pci_driver rtw89_8922ae_driver = {
+       .name           = "rtw89_8922ae",
+       .id_table       = rtw89_8922ae_id_table,
+       .probe          = rtw89_pci_probe,
+       .remove         = rtw89_pci_remove,
+       .driver.pm      = &rtw89_pm_ops,
+};
+module_pci_driver(rtw89_8922ae_driver);
+
+MODULE_AUTHOR("Realtek Corporation");
+MODULE_DESCRIPTION("Realtek 802.11be wireless 8922AE driver");
+MODULE_LICENSE("Dual BSD/GPL");