]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: rtw89: add dev_id_quirks to driver_info for per-device quirk control
authorJohnson Tsai <wenjie.tsai@realtek.com>
Fri, 29 May 2026 07:50:31 +0000 (15:50 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Wed, 3 Jun 2026 06:46:38 +0000 (14:46 +0800)
Add a dev_id_quirks field to rtw89_driver_info so that per-device
(VID/PID) quirks can be expressed independently of chip-level
default_quirks. Apply the bitmap in rtw89_alloc_ieee80211_hw() so
both USB and PCI probes benefit automatically.

All existing driver_info structs initialize dev_id_quirks to 0;
no behavior change.

Signed-off-by: Johnson Tsai <wenjie.tsai@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20260529075032.16807-2-pkshih@realtek.com
16 files changed:
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/rtw8851be.c
drivers/net/wireless/realtek/rtw89/rtw8851bu.c
drivers/net/wireless/realtek/rtw89/rtw8852ae.c
drivers/net/wireless/realtek/rtw89/rtw8852au.c
drivers/net/wireless/realtek/rtw89/rtw8852be.c
drivers/net/wireless/realtek/rtw89/rtw8852bte.c
drivers/net/wireless/realtek/rtw89/rtw8852bu.c
drivers/net/wireless/realtek/rtw89/rtw8852ce.c
drivers/net/wireless/realtek/rtw89/rtw8852cu.c
drivers/net/wireless/realtek/rtw89/rtw8922ae.c
drivers/net/wireless/realtek/rtw89/rtw8922au.c
drivers/net/wireless/realtek/rtw89/rtw8922de.c
drivers/net/wireless/realtek/rtw89/usb.c

index c1df3e2ba11e659b3e6c57ac392af63d9eb45d9d..68dad6090f87e22cc996beffa601b32847716951 100644 (file)
@@ -7532,9 +7532,11 @@ EXPORT_SYMBOL(rtw89_core_unregister);
 
 struct rtw89_dev *rtw89_alloc_ieee80211_hw(struct device *device,
                                           u32 bus_data_size,
-                                          const struct rtw89_chip_info *chip,
-                                          const struct rtw89_chip_variant *variant)
+                                          const struct rtw89_driver_info *info)
 {
+       const unsigned long *dev_id_quirks = &info->dev_id_quirks;
+       const struct rtw89_chip_variant *variant = info->variant;
+       const struct rtw89_chip_info *chip = info->chip;
        struct rtw89_fw_info early_fw = {};
        const struct firmware *firmware;
        struct ieee80211_hw *hw;
@@ -7600,6 +7602,9 @@ struct rtw89_dev *rtw89_alloc_ieee80211_hw(struct device *device,
        rtwdev->fw.fw_format = fw_format;
        rtwdev->support_mlo = support_mlo;
 
+       bitmap_or(rtwdev->quirks, rtwdev->quirks, dev_id_quirks,
+                 NUM_OF_RTW89_QUIRKS);
+
        rtw89_debug(rtwdev, RTW89_DBG_CHAN, "probe driver %s chanctx\n",
                    no_chanctx ? "without" : "with");
        rtw89_debug(rtwdev, RTW89_DBG_CHAN, "probe driver %s MLO cap\n",
index fb32d2bd9cb03f691bcd4ed4b991ce1d742dc03b..4c638c2bdc4f7f3f529b555abbf743eba7d91dee 100644 (file)
@@ -4803,6 +4803,7 @@ struct rtw89_driver_info {
        const struct rtw89_chip_info *chip;
        const struct rtw89_chip_variant *variant;
        const struct dmi_system_id *quirks;
+       unsigned long dev_id_quirks; /* bitmap of rtw89_quirks */
        union rtw89_bus_info bus;
 };
 
@@ -8129,8 +8130,7 @@ int rtw89_core_register(struct rtw89_dev *rtwdev);
 void rtw89_core_unregister(struct rtw89_dev *rtwdev);
 struct rtw89_dev *rtw89_alloc_ieee80211_hw(struct device *device,
                                           u32 bus_data_size,
-                                          const struct rtw89_chip_info *chip,
-                                          const struct rtw89_chip_variant *variant);
+                                          const struct rtw89_driver_info *info);
 void rtw89_free_ieee80211_hw(struct rtw89_dev *rtwdev);
 u8 rtw89_acquire_mac_id(struct rtw89_dev *rtwdev);
 void rtw89_release_mac_id(struct rtw89_dev *rtwdev, u8 mac_id);
index fe1152c560bd34a9b3593d1fd2f9852fc40a3b29..102bae4881805b467a44111dee8866580b1b1f48 100644 (file)
@@ -4772,8 +4772,7 @@ int rtw89_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        info = (const struct rtw89_driver_info *)id->driver_data;
 
        rtwdev = rtw89_alloc_ieee80211_hw(&pdev->dev,
-                                         sizeof(struct rtw89_pci),
-                                         info->chip, info->variant);
+                                         sizeof(struct rtw89_pci), info);
        if (!rtwdev) {
                dev_err(&pdev->dev, "failed to allocate hw\n");
                return -ENOMEM;
index ce59ac9f56ba87a3cb747266643e5777e44dfc39..640672eb0d268a8572f062150b3a65c07bb27049 100644 (file)
@@ -73,6 +73,7 @@ static const struct rtw89_driver_info rtw89_8851be_info = {
        .chip = &rtw8851b_chip_info,
        .variant = NULL,
        .quirks = NULL,
+       .dev_id_quirks = 0,
        .bus = {
                .pci = &rtw8851b_pci_info,
        },
index 14f1b703902f6c00e6a76b9eb513808876ed5f53..34ba5661d7713f28309e153e49faa6fede801adb 100644 (file)
@@ -31,6 +31,7 @@ static const struct rtw89_driver_info rtw89_8851bu_info = {
        .chip = &rtw8851b_chip_info,
        .variant = NULL,
        .quirks = NULL,
+       .dev_id_quirks = 0,
        .bus = {
                .usb = &rtw8851b_usb_info,
        }
index 9e05e831569d232531e411c7d9d595fb2dc7b25e..64306cdc1ee481011df50435e11b1b67f8056369 100644 (file)
@@ -71,6 +71,7 @@ static const struct rtw89_driver_info rtw89_8852ae_info = {
        .chip = &rtw8852a_chip_info,
        .variant = NULL,
        .quirks = NULL,
+       .dev_id_quirks = 0,
        .bus = {
                .pci = &rtw8852a_pci_info,
        },
index 4cced4619b7d9f34f7832f46ffce46cd968610a8..29b7f77693700250df2df6dca4a33f6478b308fa 100644 (file)
@@ -33,6 +33,7 @@ static const struct rtw89_driver_info rtw89_8852au_info = {
        .chip = &rtw8852a_chip_info,
        .variant = NULL,
        .quirks = NULL,
+       .dev_id_quirks = 0,
        .bus = {
                .usb = &rtw8852a_usb_info,
        }
index 12db0d0be5479b511421e4c2f5c550f4ca1be2ae..5bc0a6a99d1d2b352c43044c80ad11d0c1ba076c 100644 (file)
@@ -73,6 +73,7 @@ static const struct rtw89_driver_info rtw89_8852be_info = {
        .chip = &rtw8852b_chip_info,
        .variant = NULL,
        .quirks = NULL,
+       .dev_id_quirks = 0,
        .bus = {
                .pci = &rtw8852b_pci_info,
        },
index 8c995aa953251fd12ae675826f7fe93e664a61c2..49a72ca835ac7ee6216612a89b2f91c9086acb90 100644 (file)
@@ -79,6 +79,7 @@ static const struct rtw89_driver_info rtw89_8852bte_info = {
        .chip = &rtw8852bt_chip_info,
        .variant = NULL,
        .quirks = NULL,
+       .dev_id_quirks = 0,
        .bus = {
                .pci = &rtw8852bt_pci_info,
        },
index 37111fed276f234cbf031003d7d3a994f712053b..308d3d570ff3d4a61c22ae8770a7f2962a5a30fd 100644 (file)
@@ -31,6 +31,7 @@ static const struct rtw89_driver_info rtw89_8852bu_info = {
        .chip = &rtw8852b_chip_info,
        .variant = NULL,
        .quirks = NULL,
+       .dev_id_quirks = 0,
        .bus = {
                .usb = &rtw8852b_usb_info,
        }
index 150fed189414d35889202b94a9267373e77543e4..3c64c0539205cfaf7a122d9f9cdb008f6c737b5a 100644 (file)
@@ -102,6 +102,7 @@ static const struct rtw89_driver_info rtw89_8852ce_info = {
        .chip = &rtw8852c_chip_info,
        .variant = NULL,
        .quirks = rtw8852c_pci_quirks,
+       .dev_id_quirks = 0,
        .bus = {
                .pci = &rtw8852c_pci_info,
        },
index 790fd1dec66d2588c745f7d24d644daac0d3f3bc..8f89f9a3145594d64efcffd04c311c6f099219bb 100644 (file)
@@ -33,6 +33,7 @@ static const struct rtw89_driver_info rtw89_8852cu_info = {
        .chip = &rtw8852c_chip_info,
        .variant = NULL,
        .quirks = NULL,
+       .dev_id_quirks = 0,
        .bus = {
                .usb = &rtw8852c_usb_info,
        },
index 90c62b757c57bd0157ab143c2ae05702a0eb3777..5527a8db393b5c21ea775ee2ad0821097eda9aac 100644 (file)
@@ -77,6 +77,7 @@ static const struct rtw89_driver_info rtw89_8922ae_info = {
        .chip = &rtw8922a_chip_info,
        .variant = NULL,
        .quirks = NULL,
+       .dev_id_quirks = 0,
        .bus = {
                .pci = &rtw8922a_pci_info,
        },
@@ -86,6 +87,7 @@ static const struct rtw89_driver_info rtw89_8922ae_vs_info = {
        .chip = &rtw8922a_chip_info,
        .variant = &rtw8922ae_vs_variant,
        .quirks = NULL,
+       .dev_id_quirks = 0,
        .bus = {
                .pci = &rtw8922a_pci_info,
        },
index 347bde171391be0077c566af68705ec4b4315673..2b81de501d6208187c0b9e226a681f905886488a 100644 (file)
@@ -32,6 +32,7 @@ static const struct rtw89_driver_info rtw89_8922au_info = {
        .chip = &rtw8922a_chip_info,
        .variant = NULL,
        .quirks = NULL,
+       .dev_id_quirks = 0,
        .bus = {
                .usb = &rtw8922a_usb_info,
        },
index f144e7fc76de8384d67e2050aea700b32bfe5441..a1a81c338be3f6768f2c31d0d7500584e2ee421a 100644 (file)
@@ -73,6 +73,7 @@ static const struct rtw89_driver_info rtw89_8922de_vs_info = {
        .chip = &rtw8922d_chip_info,
        .variant = &rtw8922de_vs_variant,
        .quirks = NULL,
+       .dev_id_quirks = 0,
        .bus = {
                .pci = &rtw8922d_pci_info,
        },
@@ -82,6 +83,7 @@ static const struct rtw89_driver_info rtw89_8922de_info = {
        .chip = &rtw8922d_chip_info,
        .variant = NULL,
        .quirks = NULL,
+       .dev_id_quirks = 0,
        .bus = {
                .pci = &rtw8922d_pci_info,
        },
index 198378018062fc26c9d5ee52d84ff351a71e1c20..67ebf2d9bb7d15af935e6980fd1e8e932a28bdf7 100644 (file)
@@ -1161,8 +1161,7 @@ int rtw89_usb_probe(struct usb_interface *intf,
        info = (const struct rtw89_driver_info *)id->driver_info;
 
        rtwdev = rtw89_alloc_ieee80211_hw(&intf->dev,
-                                         sizeof(struct rtw89_usb),
-                                         info->chip, info->variant);
+                                         sizeof(struct rtw89_usb), info);
        if (!rtwdev) {
                dev_err(&intf->dev, "failed to allocate hw\n");
                return -ENOMEM;