]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: rtw89: pci: add quirks by PCI subsystem ID for thermal protection
authorPing-Ke Shih <pkshih@realtek.com>
Wed, 16 Oct 2024 13:37:35 +0000 (21:37 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Fri, 25 Oct 2024 01:31:13 +0000 (09:31 +0800)
Specific PCI subsystem ID (SSID) of WiFi cards is used by specific
customer who want to enable various features with different arguments.

Define PCI SSID quirks tables to enable thermal protection with two kinds
of thermal values for 110 and 120 degree Celsius.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20241016133735.7571-3-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.c
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/pci.c
drivers/net/wireless/realtek/rtw89/pci.h
drivers/net/wireless/realtek/rtw89/rtw8851be.c
drivers/net/wireless/realtek/rtw89/rtw8852ae.c
drivers/net/wireless/realtek/rtw89/rtw8852be.c
drivers/net/wireless/realtek/rtw89/rtw8852bte.c
drivers/net/wireless/realtek/rtw89/rtw8852ce.c
drivers/net/wireless/realtek/rtw89/rtw8922ae.c

index bba5bde95bb4d199a3e2fb7684e1ef1841f90075..dc2578a331fc02be1436aeb9150216ce4d166146 100644 (file)
@@ -4818,11 +4818,20 @@ static void rtw89_read_chip_ver(struct rtw89_dev *rtwdev)
 
 static void rtw89_core_setup_phycap(struct rtw89_dev *rtwdev)
 {
+       const struct rtw89_chip_info *chip = rtwdev->chip;
+
        rtwdev->hal.support_cckpd =
                !(rtwdev->chip->chip_id == RTL8852A && rtwdev->hal.cv <= CHIP_CBV) &&
                !(rtwdev->chip->chip_id == RTL8852B && rtwdev->hal.cv <= CHIP_CAV);
        rtwdev->hal.support_igi =
                rtwdev->chip->chip_id == RTL8852A && rtwdev->hal.cv <= CHIP_CBV;
+
+       if (test_bit(RTW89_QUIRK_THERMAL_PROT_120C, rtwdev->quirks))
+               rtwdev->hal.thermal_prot_th = chip->thermal_th[1];
+       else if (test_bit(RTW89_QUIRK_THERMAL_PROT_110C, rtwdev->quirks))
+               rtwdev->hal.thermal_prot_th = chip->thermal_th[0];
+       else
+               rtwdev->hal.thermal_prot_th = 0;
 }
 
 static void rtw89_core_setup_rfe_parms(struct rtw89_dev *rtwdev)
index 4637c576e825a23dad984243e015d7726c46c0c9..fed743e650d1e77d04d48340ef84fbc22dcf31ba 100644 (file)
@@ -4719,10 +4719,22 @@ enum rtw89_flags {
 
 enum rtw89_quirks {
        RTW89_QUIRK_PCI_BER,
+       RTW89_QUIRK_THERMAL_PROT_120C,
+       RTW89_QUIRK_THERMAL_PROT_110C,
 
        NUM_OF_RTW89_QUIRKS,
 };
 
+enum rtw89_custid {
+       RTW89_CUSTID_NONE,
+       RTW89_CUSTID_ACER,
+       RTW89_CUSTID_AMD,
+       RTW89_CUSTID_ASUS,
+       RTW89_CUSTID_DELL,
+       RTW89_CUSTID_HP,
+       RTW89_CUSTID_LENOVO,
+};
+
 enum rtw89_pkt_drop_sel {
        RTW89_PKT_DROP_SEL_MACID_BE_ONCE,
        RTW89_PKT_DROP_SEL_MACID_BK_ONCE,
@@ -5520,6 +5532,7 @@ struct rtw89_dev {
        struct rtw89_efuse efuse;
        struct rtw89_traffic_stats stats;
        struct rtw89_rfe_data *rfe_data;
+       enum rtw89_custid custid;
 
        /* ensures exclusive access from mac80211 callbacks */
        struct mutex mutex;
index b0753dd2e54c1279d60644c157f5cb40f28c0aad..b0477ece7012c8da40cdb69fad0ac65320fa24e9 100644 (file)
@@ -4177,6 +4177,36 @@ static int rtw89_pci_napi_poll(struct napi_struct *napi, int budget)
        return work_done;
 }
 
+static
+void rtw89_check_pci_ssid_quirks(struct rtw89_dev *rtwdev,
+                                struct pci_dev *pdev,
+                                const struct rtw89_pci_ssid_quirk *ssid_quirks)
+{
+       int i;
+
+       if (!ssid_quirks)
+               return;
+
+       for (i = 0; i < 200; i++, ssid_quirks++) {
+               if (ssid_quirks->vendor == 0 && ssid_quirks->device == 0)
+                       break;
+
+               if (ssid_quirks->vendor != pdev->vendor ||
+                   ssid_quirks->device != pdev->device ||
+                   ssid_quirks->subsystem_vendor != pdev->subsystem_vendor ||
+                   ssid_quirks->subsystem_device != pdev->subsystem_device)
+                       continue;
+
+               bitmap_or(rtwdev->quirks, rtwdev->quirks, &ssid_quirks->bitmap,
+                         NUM_OF_RTW89_QUIRKS);
+               rtwdev->custid = ssid_quirks->custid;
+               break;
+       }
+
+       rtw89_debug(rtwdev, RTW89_DBG_HCI, "quirks=%*ph custid=%d\n",
+                   (int)sizeof(rtwdev->quirks), rtwdev->quirks, rtwdev->custid);
+}
+
 static int __maybe_unused rtw89_pci_suspend(struct device *dev)
 {
        struct ieee80211_hw *hw = dev_get_drvdata(dev);
@@ -4351,6 +4381,7 @@ int rtw89_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        rtwdev->hci.cpwm_addr = pci_info->cpwm_addr;
 
        rtw89_check_quirks(rtwdev, info->quirks);
+       rtw89_check_pci_ssid_quirks(rtwdev, pdev, pci_info->ssid_quirks);
 
        SET_IEEE80211_DEV(rtwdev->hw, &pdev->dev);
 
index 796f6cd3c96568e1576639689e3fe7cae91ba079..b68e2d82eea90d05c1d12c02d0ee8aade791fa72 100644 (file)
@@ -1292,6 +1292,19 @@ struct rtw89_pci_gen_def {
        void (*disable_eq)(struct rtw89_dev *rtwdev);
 };
 
+#define RTW89_PCI_SSID(v, d, ssv, ssd, cust) \
+       .vendor = v, .device = d, .subsystem_vendor = ssv, .subsystem_device = ssd, \
+       .custid = RTW89_CUSTID_ ##cust
+
+struct rtw89_pci_ssid_quirk {
+       unsigned short vendor;
+       unsigned short device;
+       unsigned short subsystem_vendor;
+       unsigned short subsystem_device;
+       enum rtw89_custid custid;
+       unsigned long bitmap; /* bitmap of rtw89_quirks */
+};
+
 struct rtw89_pci_info {
        const struct rtw89_pci_gen_def *gen_def;
        enum mac_ax_bd_trunc_mode txbd_trunc_mode;
@@ -1345,6 +1358,8 @@ struct rtw89_pci_info {
        void (*recognize_intrs)(struct rtw89_dev *rtwdev,
                                struct rtw89_pci *rtwpci,
                                struct rtw89_pci_isrs *isrs);
+
+       const struct rtw89_pci_ssid_quirk *ssid_quirks;
 };
 
 struct rtw89_pci_tx_data {
index d334924faec8cd455bd3141d3b695a7a90318995..651cbce1dd7e2006ffdb2b7c5198b6db0fdb2968 100644 (file)
@@ -60,6 +60,8 @@ static const struct rtw89_pci_info rtw8851b_pci_info = {
        .enable_intr            = rtw89_pci_enable_intr,
        .disable_intr           = rtw89_pci_disable_intr,
        .recognize_intrs        = rtw89_pci_recognize_intrs,
+
+       .ssid_quirks            = NULL,
 };
 
 static const struct rtw89_driver_info rtw89_8851be_info = {
index 9a675e2193bcd84a0ad050d18239c2dfee9110bb..701187d69e14c6b951bb95dd16e8c3c9538d1414 100644 (file)
@@ -58,6 +58,8 @@ static const struct rtw89_pci_info rtw8852a_pci_info = {
        .enable_intr            = rtw89_pci_enable_intr,
        .disable_intr           = rtw89_pci_disable_intr,
        .recognize_intrs        = rtw89_pci_recognize_intrs,
+
+       .ssid_quirks            = NULL,
 };
 
 static const struct rtw89_driver_info rtw89_8852ae_info = {
index d8f9d92ca0fb90686930781974d3e483890bad87..a13ea1cce4a70a7181a0e67929ddc5350cfbe442 100644 (file)
@@ -60,6 +60,8 @@ static const struct rtw89_pci_info rtw8852b_pci_info = {
        .enable_intr            = rtw89_pci_enable_intr,
        .disable_intr           = rtw89_pci_disable_intr,
        .recognize_intrs        = rtw89_pci_recognize_intrs,
+
+       .ssid_quirks            = NULL,
 };
 
 static const struct rtw89_driver_info rtw89_8852be_info = {
index 70294811964686d29cb71164e10fb5144a303b6b..e4f40c2e287ded98481af1a3e8dd847df0ed8475 100644 (file)
@@ -60,6 +60,8 @@ static const struct rtw89_pci_info rtw8852bt_pci_info = {
        .enable_intr            = rtw89_pci_enable_intr,
        .disable_intr           = rtw89_pci_disable_intr,
        .recognize_intrs        = rtw89_pci_recognize_intrs,
+
+       .ssid_quirks            = NULL,
 };
 
 static const struct rtw89_driver_info rtw89_8852bte_info = {
index 8aaad7d58c0d974ee07f7938c04ce078734d783b..1a46878be96b2c47a20f20f4ee37736bc5acf1df 100644 (file)
@@ -67,6 +67,8 @@ static const struct rtw89_pci_info rtw8852c_pci_info = {
        .enable_intr            = rtw89_pci_enable_intr_v1,
        .disable_intr           = rtw89_pci_disable_intr_v1,
        .recognize_intrs        = rtw89_pci_recognize_intrs_v1,
+
+       .ssid_quirks            = NULL,
 };
 
 static const struct dmi_system_id rtw8852c_pci_quirks[] = {
index 47f855a7a2688dc5474ace97a80c2ef3d1e160ec..edfb1f220af024685846280a884781ae8527dce9 100644 (file)
@@ -9,6 +9,12 @@
 #include "reg.h"
 #include "rtw8922a.h"
 
+static const struct rtw89_pci_ssid_quirk rtw8922a_pci_ssid_quirks[] = {
+       {RTW89_PCI_SSID(PCI_VENDOR_ID_REALTEK, 0x8922, 0x10EC, 0xA891, DELL),
+        .bitmap = BIT(RTW89_QUIRK_THERMAL_PROT_120C)},
+       {},
+};
+
 static const struct rtw89_pci_info rtw8922a_pci_info = {
        .gen_def                = &rtw89_pci_gen_be,
        .txbd_trunc_mode        = MAC_AX_BD_TRUNC,
@@ -58,6 +64,8 @@ static const struct rtw89_pci_info rtw8922a_pci_info = {
        .enable_intr            = rtw89_pci_enable_intr_v2,
        .disable_intr           = rtw89_pci_disable_intr_v2,
        .recognize_intrs        = rtw89_pci_recognize_intrs_v2,
+
+       .ssid_quirks            = rtw8922a_pci_ssid_quirks,
 };
 
 static const struct rtw89_driver_info rtw89_8922ae_info = {