18e93258fSBjoern A. Zeeb // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 28e93258fSBjoern A. Zeeb /* Copyright(c) 2020-2022 Realtek Corporation 38e93258fSBjoern A. Zeeb */ 48e93258fSBjoern A. Zeeb 58e93258fSBjoern A. Zeeb #include <linux/module.h> 68e93258fSBjoern A. Zeeb #include <linux/pci.h> 78e93258fSBjoern A. Zeeb 88e93258fSBjoern A. Zeeb #include "pci.h" 98e93258fSBjoern A. Zeeb #include "reg.h" 108e93258fSBjoern A. Zeeb #include "rtw8852c.h" 118e93258fSBjoern A. Zeeb 128e93258fSBjoern A. Zeeb static const struct rtw89_pci_bd_idx_addr rtw8852c_bd_idx_addr_low_power = { 138e93258fSBjoern A. Zeeb .tx_bd_addrs = {R_AX_DRV_FW_HSK_0, R_AX_DRV_FW_HSK_1, R_AX_DRV_FW_HSK_2, 148e93258fSBjoern A. Zeeb R_AX_DRV_FW_HSK_3, 0, 0, 158e93258fSBjoern A. Zeeb 0, 0, R_AX_DRV_FW_HSK_4, 168e93258fSBjoern A. Zeeb 0, 0, 0, 178e93258fSBjoern A. Zeeb R_AX_DRV_FW_HSK_5}, 188e93258fSBjoern A. Zeeb .rx_bd_addrs = {R_AX_DRV_FW_HSK_6, R_AX_DRV_FW_HSK_7}, 198e93258fSBjoern A. Zeeb }; 208e93258fSBjoern A. Zeeb 218e93258fSBjoern A. Zeeb static const struct rtw89_pci_info rtw8852c_pci_info = { 226d67aabdSBjoern A. Zeeb .gen_def = &rtw89_pci_gen_ax, 238e93258fSBjoern A. Zeeb .txbd_trunc_mode = MAC_AX_BD_TRUNC, 248e93258fSBjoern A. Zeeb .rxbd_trunc_mode = MAC_AX_BD_TRUNC, 258e93258fSBjoern A. Zeeb .rxbd_mode = MAC_AX_RXBD_PKT, 268e93258fSBjoern A. Zeeb .tag_mode = MAC_AX_TAG_MULTI, 278e93258fSBjoern A. Zeeb .tx_burst = MAC_AX_TX_BURST_V1_256B, 288e93258fSBjoern A. Zeeb .rx_burst = MAC_AX_RX_BURST_V1_128B, 298e93258fSBjoern A. Zeeb .wd_dma_idle_intvl = MAC_AX_WD_DMA_INTVL_256NS, 308e93258fSBjoern A. Zeeb .wd_dma_act_intvl = MAC_AX_WD_DMA_INTVL_256NS, 318e93258fSBjoern A. Zeeb .multi_tag_num = MAC_AX_TAG_NUM_8, 328e93258fSBjoern A. Zeeb .lbc_en = MAC_AX_PCIE_ENABLE, 338e93258fSBjoern A. Zeeb .lbc_tmr = MAC_AX_LBC_TMR_2MS, 348e93258fSBjoern A. Zeeb .autok_en = MAC_AX_PCIE_DISABLE, 358e93258fSBjoern A. Zeeb .io_rcy_en = MAC_AX_PCIE_ENABLE, 368e93258fSBjoern A. Zeeb .io_rcy_tmr = MAC_AX_IO_RCY_ANA_TMR_6MS, 376d67aabdSBjoern A. Zeeb .rx_ring_eq_is_full = false, 386d67aabdSBjoern A. Zeeb .check_rx_tag = false, 39*df279a26SBjoern A. Zeeb .no_rxbd_fs = false, 408e93258fSBjoern A. Zeeb 418e93258fSBjoern A. Zeeb .init_cfg_reg = R_AX_HAXI_INIT_CFG1, 428e93258fSBjoern A. Zeeb .txhci_en_bit = B_AX_TXHCI_EN_V1, 438e93258fSBjoern A. Zeeb .rxhci_en_bit = B_AX_RXHCI_EN_V1, 448e93258fSBjoern A. Zeeb .rxbd_mode_bit = B_AX_RXBD_MODE_V1, 458e93258fSBjoern A. Zeeb .exp_ctrl_reg = R_AX_HAXI_EXP_CTRL, 468e93258fSBjoern A. Zeeb .max_tag_num_mask = B_AX_MAX_TAG_NUM_V1_MASK, 478e93258fSBjoern A. Zeeb .rxbd_rwptr_clr_reg = R_AX_RXBD_RWPTR_CLR_V1, 488e93258fSBjoern A. Zeeb .txbd_rwptr_clr2_reg = R_AX_TXBD_RWPTR_CLR2_V1, 496d67aabdSBjoern A. Zeeb .dma_io_stop = {R_AX_HAXI_INIT_CFG1, B_AX_STOP_AXI_MST}, 50e2340276SBjoern A. Zeeb .dma_stop1 = {R_AX_HAXI_DMA_STOP1, B_AX_TX_STOP1_MASK}, 51e2340276SBjoern A. Zeeb .dma_stop2 = {R_AX_HAXI_DMA_STOP2, B_AX_TX_STOP2_ALL}, 52e2340276SBjoern A. Zeeb .dma_busy1 = {R_AX_HAXI_DMA_BUSY1, DMA_BUSY1_CHECK}, 538e93258fSBjoern A. Zeeb .dma_busy2_reg = R_AX_HAXI_DMA_BUSY2, 548e93258fSBjoern A. Zeeb .dma_busy3_reg = R_AX_HAXI_DMA_BUSY3, 558e93258fSBjoern A. Zeeb 568e93258fSBjoern A. Zeeb .rpwm_addr = R_AX_PCIE_HRPWM_V1, 578e93258fSBjoern A. Zeeb .cpwm_addr = R_AX_PCIE_CRPWM, 586d67aabdSBjoern A. Zeeb .mit_addr = R_AX_INT_MIT_RX_V1, 596d67aabdSBjoern A. Zeeb .wp_sel_addr = R_AX_WP_ADDR_H_SEL0_3, 60e2340276SBjoern A. Zeeb .tx_dma_ch_mask = 0, 618e93258fSBjoern A. Zeeb .bd_idx_addr_low_power = &rtw8852c_bd_idx_addr_low_power, 628e93258fSBjoern A. Zeeb .dma_addr_set = &rtw89_pci_ch_dma_addr_set_v1, 63e2340276SBjoern A. Zeeb .bd_ram_table = &rtw89_bd_ram_table_dual, 648e93258fSBjoern A. Zeeb 658e93258fSBjoern A. Zeeb .ltr_set = rtw89_pci_ltr_set_v1, 668e93258fSBjoern A. Zeeb .fill_txaddr_info = rtw89_pci_fill_txaddr_info_v1, 678e93258fSBjoern A. Zeeb .config_intr_mask = rtw89_pci_config_intr_mask_v1, 688e93258fSBjoern A. Zeeb .enable_intr = rtw89_pci_enable_intr_v1, 698e93258fSBjoern A. Zeeb .disable_intr = rtw89_pci_disable_intr_v1, 708e93258fSBjoern A. Zeeb .recognize_intrs = rtw89_pci_recognize_intrs_v1, 71*df279a26SBjoern A. Zeeb 72*df279a26SBjoern A. Zeeb .ssid_quirks = NULL, 738e93258fSBjoern A. Zeeb }; 748e93258fSBjoern A. Zeeb 756d67aabdSBjoern A. Zeeb static const struct dmi_system_id rtw8852c_pci_quirks[] = { 766d67aabdSBjoern A. Zeeb { 776d67aabdSBjoern A. Zeeb .ident = "Dell Inc. Vostro 16 5640", 786d67aabdSBjoern A. Zeeb .matches = { 796d67aabdSBjoern A. Zeeb DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 806d67aabdSBjoern A. Zeeb DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 16 5640"), 816d67aabdSBjoern A. Zeeb DMI_MATCH(DMI_PRODUCT_SKU, "0CA0"), 826d67aabdSBjoern A. Zeeb }, 836d67aabdSBjoern A. Zeeb .driver_data = (void *)RTW89_QUIRK_PCI_BER, 846d67aabdSBjoern A. Zeeb }, 856d67aabdSBjoern A. Zeeb { 866d67aabdSBjoern A. Zeeb .ident = "Dell Inc. Inspiron 16 5640", 876d67aabdSBjoern A. Zeeb .matches = { 886d67aabdSBjoern A. Zeeb DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 896d67aabdSBjoern A. Zeeb DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 16 5640"), 906d67aabdSBjoern A. Zeeb DMI_MATCH(DMI_PRODUCT_SKU, "0C9F"), 916d67aabdSBjoern A. Zeeb }, 926d67aabdSBjoern A. Zeeb .driver_data = (void *)RTW89_QUIRK_PCI_BER, 936d67aabdSBjoern A. Zeeb }, 946d67aabdSBjoern A. Zeeb {}, 956d67aabdSBjoern A. Zeeb }; 966d67aabdSBjoern A. Zeeb 978e93258fSBjoern A. Zeeb static const struct rtw89_driver_info rtw89_8852ce_info = { 988e93258fSBjoern A. Zeeb .chip = &rtw8852c_chip_info, 99*df279a26SBjoern A. Zeeb .variant = NULL, 1006d67aabdSBjoern A. Zeeb .quirks = rtw8852c_pci_quirks, 1018e93258fSBjoern A. Zeeb .bus = { 1028e93258fSBjoern A. Zeeb .pci = &rtw8852c_pci_info, 1038e93258fSBjoern A. Zeeb }, 1048e93258fSBjoern A. Zeeb }; 1058e93258fSBjoern A. Zeeb 1068e93258fSBjoern A. Zeeb static const struct pci_device_id rtw89_8852ce_id_table[] = { 1078e93258fSBjoern A. Zeeb { 1088e93258fSBjoern A. Zeeb PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0xc852), 1098e93258fSBjoern A. Zeeb .driver_data = (kernel_ulong_t)&rtw89_8852ce_info, 1108e93258fSBjoern A. Zeeb }, 1118e93258fSBjoern A. Zeeb {}, 1128e93258fSBjoern A. Zeeb }; 1138e93258fSBjoern A. Zeeb MODULE_DEVICE_TABLE(pci, rtw89_8852ce_id_table); 1148e93258fSBjoern A. Zeeb 1158e93258fSBjoern A. Zeeb static struct pci_driver rtw89_8852ce_driver = { 1168e93258fSBjoern A. Zeeb .name = "rtw89_8852ce", 1178e93258fSBjoern A. Zeeb .id_table = rtw89_8852ce_id_table, 1188e93258fSBjoern A. Zeeb .probe = rtw89_pci_probe, 1198e93258fSBjoern A. Zeeb .remove = rtw89_pci_remove, 1208e93258fSBjoern A. Zeeb .driver.pm = &rtw89_pm_ops, 1218e93258fSBjoern A. Zeeb #if defined(__FreeBSD__) 1228e93258fSBjoern A. Zeeb .bsddriver.name = KBUILD_MODNAME, 1238e93258fSBjoern A. Zeeb #endif 1248e93258fSBjoern A. Zeeb }; 1258e93258fSBjoern A. Zeeb module_pci_driver(rtw89_8852ce_driver); 1268e93258fSBjoern A. Zeeb 1278e93258fSBjoern A. Zeeb MODULE_AUTHOR("Realtek Corporation"); 1288e93258fSBjoern A. Zeeb MODULE_DESCRIPTION("Realtek 802.11ax wireless 8852CE driver"); 1298e93258fSBjoern A. Zeeb MODULE_LICENSE("Dual BSD/GPL"); 130