rtw88: 8723d: Add shutdown callback to disable BT USB suspend
authorPing-Ke Shih <pkshih@realtek.com>
Tue, 12 May 2020 10:26:16 +0000 (18:26 +0800)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 13 May 2020 15:48:45 +0000 (18:48 +0300)
Without this patch, wifi card can't initialize properly due to BT in USB
suspend state. So, we disable BT USB suspend (wakeup) in shutdown callback
that is the moment before rebooting. To save BT USB power, we can't do this
in 'remove' callback.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20200512102621.5148-5-yhchuang@realtek.com
drivers/net/wireless/realtek/rtw88/main.h
drivers/net/wireless/realtek/rtw88/pci.c
drivers/net/wireless/realtek/rtw88/reg.h
drivers/net/wireless/realtek/rtw88/rtw8723d.c

index bfdc27c..592b28e 100644 (file)
@@ -795,6 +795,7 @@ struct rtw_regulatory {
 
 struct rtw_chip_ops {
        int (*mac_init)(struct rtw_dev *rtwdev);
+       void (*shutdown)(struct rtw_dev *rtwdev);
        int (*read_efuse)(struct rtw_dev *rtwdev, u8 *map);
        void (*phy_set_param)(struct rtw_dev *rtwdev);
        void (*set_channel)(struct rtw_dev *rtwdev, u8 channel,
index a9752c3..e5ea30c 100644 (file)
@@ -1573,6 +1573,22 @@ static void rtw_pci_remove(struct pci_dev *pdev)
        ieee80211_free_hw(hw);
 }
 
+static void rtw_pci_shutdown(struct pci_dev *pdev)
+{
+       struct ieee80211_hw *hw = pci_get_drvdata(pdev);
+       struct rtw_dev *rtwdev;
+       struct rtw_chip_info *chip;
+
+       if (!hw)
+               return;
+
+       rtwdev = hw->priv;
+       chip = rtwdev->chip;
+
+       if (chip->ops->shutdown)
+               chip->ops->shutdown(rtwdev);
+}
+
 static const struct pci_device_id rtw_pci_id_table[] = {
 #ifdef CONFIG_RTW88_8822BE
        { RTK_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0xB822, rtw8822b_hw_spec) },
@@ -1593,6 +1609,7 @@ static struct pci_driver rtw_pci_driver = {
        .probe = rtw_pci_probe,
        .remove = rtw_pci_remove,
        .driver.pm = &rtw_pm_ops,
+       .shutdown = rtw_pci_shutdown,
 };
 module_pci_driver(rtw_pci_driver);
 
index d57de1a..5a3e9cc 100644 (file)
@@ -83,6 +83,7 @@
 #define BIT_DBG_GNT_WL_BT      BIT(27)
 #define BIT_LTE_MUX_CTRL_PATH  BIT(26)
 #define REG_HCI_OPT_CTRL       0x0074
+#define BIT_USB_SUS_DIS                BIT(8)
 
 #define REG_AFE_CTRL_4         0x0078
 #define BIT_CK320M_AFE_EN      BIT(4)
index 4fc2d0b..bfad27d 100644 (file)
@@ -549,6 +549,11 @@ static int rtw8723d_mac_init(struct rtw_dev *rtwdev)
        return 0;
 }
 
+static void rtw8723d_shutdown(struct rtw_dev *rtwdev)
+{
+       rtw_write16_set(rtwdev, REG_HCI_OPT_CTRL, BIT_USB_SUS_DIS);
+}
+
 static void rtw8723d_cfg_ldo25(struct rtw_dev *rtwdev, bool enable)
 {
        u8 ldo_pwr;
@@ -1790,6 +1795,7 @@ static struct rtw_chip_ops rtw8723d_ops = {
        .query_rx_desc          = rtw8723d_query_rx_desc,
        .set_channel            = rtw8723d_set_channel,
        .mac_init               = rtw8723d_mac_init,
+       .shutdown               = rtw8723d_shutdown,
        .read_rf                = rtw_phy_read_rf_sipi,
        .write_rf               = rtw_phy_write_rf_reg_sipi,
        .set_tx_power_index     = rtw8723d_set_tx_power_index,