wifi: rtw89: pci: add quirks by PCI subsystem ID for thermal protection

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
This commit is contained in:
Ping-Ke Shih 2024-10-16 21:37:35 +08:00
parent 63aca17262
commit 9ef90a49b0
10 changed files with 86 additions and 0 deletions

View 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)

View 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;

View 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);

View 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 {

View 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 = {

View 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 = {

View 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 = {

View 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 = {

View 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[] = {

View 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 = {