rtw88: add interface config for 8822c
authorYan-Hsuan Chuang <yhchuang@realtek.com>
Thu, 19 Dec 2019 08:58:12 +0000 (16:58 +0800)
committerKalle Valo <kvalo@codeaurora.org>
Sun, 26 Jan 2020 15:37:01 +0000 (17:37 +0200)
Some devices need to configure interface/HCI related reigsters
in power on flow. Add interface_cfg for HCI for the settings.

The driver only supports RTL8822BE/RTL8822CE now, and since
RTL8822BE does not need to configure PCIE, the configuration
is only added for RTL8822CE. Without it, some of the RTL8822CE
device can crash and disconnected to host in suspend/wowlan mode.

Signed-off-by: Tzu-En Huang <tehuang@realtek.com>
Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/realtek/rtw88/hci.h
drivers/net/wireless/realtek/rtw88/mac.c
drivers/net/wireless/realtek/rtw88/pci.c
drivers/net/wireless/realtek/rtw88/reg.h

index 3d91aea942c3c9be6e567671cc656d15d1ef43b1..85a81a578fd590a6636bd583e56bf1f2a6e90597 100644 (file)
@@ -15,6 +15,7 @@ struct rtw_hci_ops {
        void (*stop)(struct rtw_dev *rtwdev);
        void (*deep_ps)(struct rtw_dev *rtwdev, bool enter);
        void (*link_ps)(struct rtw_dev *rtwdev, bool enter);
+       void (*interface_cfg)(struct rtw_dev *rtwdev);
 
        int (*write_data_rsvd_page)(struct rtw_dev *rtwdev, u8 *buf, u32 size);
        int (*write_data_h2c)(struct rtw_dev *rtwdev, u8 *buf, u32 size);
@@ -59,6 +60,11 @@ static inline void rtw_hci_link_ps(struct rtw_dev *rtwdev, bool enter)
        rtwdev->hci.ops->link_ps(rtwdev, enter);
 }
 
+static inline void rtw_hci_interface_cfg(struct rtw_dev *rtwdev)
+{
+       rtwdev->hci.ops->interface_cfg(rtwdev);
+}
+
 static inline int
 rtw_hci_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf, u32 size)
 {
index 507970387b2ae6b058a1f682d97bbbd36c76755d..03a82de053ea8dcbb23e8b5c94330af7d9b691f9 100644 (file)
@@ -1034,5 +1034,7 @@ int rtw_mac_init(struct rtw_dev *rtwdev)
        if (ret)
                return ret;
 
+       rtw_hci_interface_cfg(rtwdev);
+
        return 0;
 }
index c394df494c9569fb0a698cdee2c317defa813a89..a60d9b1070069e6b878849393dff314accbe2764 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/pci.h>
 #include "main.h"
 #include "pci.h"
+#include "reg.h"
 #include "tx.h"
 #include "rx.h"
 #include "fw.h"
@@ -1224,6 +1225,21 @@ static void rtw_pci_link_cfg(struct rtw_dev *rtwdev)
        rtwpci->link_ctrl = link_ctrl;
 }
 
+static void rtw_pci_interface_cfg(struct rtw_dev *rtwdev)
+{
+       struct rtw_chip_info *chip = rtwdev->chip;
+
+       switch (chip->id) {
+       case RTW_CHIP_TYPE_8822C:
+               if (rtwdev->hal.cut_version >= RTW_CHIP_VER_CUT_D)
+                       rtw_write32_mask(rtwdev, REG_HCI_MIX_CFG,
+                                        BIT_PCIE_EMAC_PDN_AUX_TO_FAST_CLK, 1);
+               break;
+       default:
+               break;
+       }
+}
+
 static void rtw_pci_phy_cfg(struct rtw_dev *rtwdev)
 {
        struct rtw_chip_info *chip = rtwdev->chip;
@@ -1332,6 +1348,7 @@ static struct rtw_hci_ops rtw_pci_ops = {
        .stop = rtw_pci_stop,
        .deep_ps = rtw_pci_deep_ps,
        .link_ps = rtw_pci_link_ps,
+       .interface_cfg = rtw_pci_interface_cfg,
 
        .read8 = rtw_pci_read8,
        .read16 = rtw_pci_read16,
index 7e817bc997eb89de43f72eda2b93364d2ba83246..cd6b14c379ba48e79b57c82dfebf174630fd3b5c 100644 (file)
 #define REG_H2C_INFO           0x0254
 
 #define REG_INT_MIG            0x0304
+#define REG_HCI_MIX_CFG                0x03FC
+#define BIT_PCIE_EMAC_PDN_AUX_TO_FAST_CLK BIT(26)
 
 #define REG_FWHW_TXQ_CTRL      0x0420
 #define BIT_EN_BCNQ_DL         BIT(22)