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 bfdc27c187f6d70e238f256d9b4dcb785ac61a64..592b28ed93765637273d80f2334cfcaf9e351410 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 a9752c34c9d8189017a508df8d30d60caf9fb910..e5ea30c04ac50b86f3b9aa57f58a2d5a0a99b39e 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 d57de1a6cdcce15eff41275c654b9476f4e4f408..5a3e9cc7c40072e74fd8a9f69fa27014034bdc5b 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 4fc2d0bb2704bba43927d2b18fb8f3f9f76cb126..bfad27d10c407a407cbc36ea73ee0cdfa3ffd64b 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,