]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: pci: add to read PCI configuration space from common code
authorPing-Ke Shih <pkshih@realtek.com>
Tue, 11 Nov 2025 02:24:45 +0000 (10:24 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Thu, 13 Nov 2025 01:30:03 +0000 (09:30 +0800)
Normally only access PCI device in pci.c. However for debug purpose,
a set of registers predefined in firmware element including PCI
configuration space should be read for diagnosis.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20251111022452.28093-2-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/mac.h
drivers/net/wireless/realtek/rtw89/pci.c

index 71eb7078a0dc54cb0cc22a7166abcc4f3377f214..e6584462f6c0fadd5501c693bd788a4ec13451b4 100644 (file)
@@ -39,6 +39,8 @@ extern const struct ieee80211_ops rtw89_ops;
 #define RFREG_MASK 0xfffff
 #define INV_RF_DATA 0xffffffff
 #define BYPASS_CR_DATA 0xbabecafe
+#define RTW89_R32_EA 0xEAEAEAEA
+#define RTW89_R32_DEAD 0xDEADBEEF
 
 #define RTW89_TRACK_WORK_PERIOD        round_jiffies_relative(HZ * 2)
 #define RTW89_TRACK_PS_WORK_PERIOD msecs_to_jiffies(100)
@@ -3674,6 +3676,8 @@ struct rtw89_hci_ops {
        void (*write16)(struct rtw89_dev *rtwdev, u32 addr, u16 data);
        void (*write32)(struct rtw89_dev *rtwdev, u32 addr, u32 data);
 
+       u32 (*read32_pci_cfg)(struct rtw89_dev *rtwdev, u32 addr);
+
        int (*mac_pre_init)(struct rtw89_dev *rtwdev);
        int (*mac_pre_deinit)(struct rtw89_dev *rtwdev);
        int (*mac_post_init)(struct rtw89_dev *rtwdev);
@@ -6658,6 +6662,15 @@ rtw89_write_rf(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path,
        mutex_unlock(&rtwdev->rf_mutex);
 }
 
+static inline u32 rtw89_read32_pci_cfg(struct rtw89_dev *rtwdev, u32 addr)
+{
+       if (rtwdev->hci.type != RTW89_HCI_TYPE_PCIE ||
+           !rtwdev->hci.ops->read32_pci_cfg)
+               return RTW89_R32_EA;
+
+       return rtwdev->hci.ops->read32_pci_cfg(rtwdev, addr);
+}
+
 static inline struct ieee80211_txq *rtw89_txq_to_txq(struct rtw89_txq *rtwtxq)
 {
        void *p = rtwtxq;
index 868413335f6ce990cfcadc0588a94fc001a64200..3cc97fd0c0ec7562964a6ff1f6a56ee666e1623b 100644 (file)
@@ -581,8 +581,6 @@ enum rtw89_mac_bf_rrsc_rate {
        RTW89_MAC_BF_RRSC_MAX = 32
 };
 
-#define RTW89_R32_EA           0xEAEAEAEA
-#define RTW89_R32_DEAD         0xDEADBEEF
 #define MAC_REG_POOL_COUNT     10
 #define ACCESS_CMAC(_addr) \
        ({typeof(_addr) __addr = (_addr); \
index b1985193a18f0f36a95a34c476c69089a22acae5..a66fcdb0293b64810f84132798c29d1d916c0804 100644 (file)
@@ -2064,6 +2064,20 @@ static void rtw89_pci_ops_write32(struct rtw89_dev *rtwdev, u32 addr, u32 data)
        writel(data, rtwpci->mmap + addr);
 }
 
+static u32 rtw89_pci_ops_read32_pci_cfg(struct rtw89_dev *rtwdev, u32 addr)
+{
+       struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv;
+       struct pci_dev *pdev = rtwpci->pdev;
+       u32 value;
+       int ret;
+
+       ret = pci_read_config_dword(pdev, addr, &value);
+       if (ret)
+               return RTW89_R32_EA;
+
+       return value;
+}
+
 static void rtw89_pci_ctrl_dma_trx(struct rtw89_dev *rtwdev, bool enable)
 {
        const struct rtw89_pci_info *info = rtwdev->pci_info;
@@ -4683,6 +4697,8 @@ static const struct rtw89_hci_ops rtw89_pci_ops = {
        .write16        = rtw89_pci_ops_write16,
        .write32        = rtw89_pci_ops_write32,
 
+       .read32_pci_cfg = rtw89_pci_ops_read32_pci_cfg,
+
        .mac_pre_init   = rtw89_pci_ops_mac_pre_init,
        .mac_pre_deinit = rtw89_pci_ops_mac_pre_deinit,
        .mac_post_init  = rtw89_pci_ops_mac_post_init,