wifi: rtw89: phy: add phy_gen_def::cr_base to support WiFi 7 chips
authorPing-Ke Shih <pkshih@realtek.com>
Tue, 22 Aug 2023 12:58:21 +0000 (20:58 +0800)
committerKalle Valo <kvalo@kernel.org>
Fri, 25 Aug 2023 09:59:54 +0000 (12:59 +0300)
cr_base is base address of PHY control register. The base of WiFi 6 and 7
chips are 0x1_0000 and 0x2_0000 respectively, so define them accordingly.
For example, if PHY address is 0x1330, absolute address is 0x1_1330 for
WiFi 6 chips, and 0x2_1330 for WiFi 7 chips.

Meanwhile, there are two copies of PHY hardware named PHY0 and PHY1. The
offset between them is 0x2_0000, so the base address of PHY0 and PHY1 are
0x2_0000 and 0x4_0000 respectively.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20230822125822.23817-6-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/phy.c
drivers/net/wireless/realtek/rtw89/phy.h
drivers/net/wireless/realtek/rtw89/phy_be.c [new file with mode: 0644]
drivers/net/wireless/realtek/rtw89/rtw8851b.c
drivers/net/wireless/realtek/rtw89/rtw8852a.c
drivers/net/wireless/realtek/rtw89/rtw8852b.c
drivers/net/wireless/realtek/rtw89/rtw8852c.c

index 2806d1cf2c0d6de805f62fd4ccb8d6bed094e5b8..17f6418e44046bff7f907cb3999675224dbbc732 100644 (file)
@@ -15,6 +15,7 @@
 struct rtw89_dev;
 struct rtw89_pci_info;
 struct rtw89_mac_gen_def;
+struct rtw89_phy_gen_def;
 
 extern const struct ieee80211_ops rtw89_ops;
 
@@ -3437,6 +3438,7 @@ struct rtw89_chip_info {
        enum rtw89_chip_gen chip_gen;
        const struct rtw89_chip_ops *ops;
        const struct rtw89_mac_gen_def *mac_def;
+       const struct rtw89_phy_gen_def *phy_def;
        const char *fw_basename;
        u8 fw_format_max;
        bool try_ce_fw;
index 7c72d92d5c91bcf0f062198346e8a446a499ff3e..85d3205d6e680ac66a7b8ca0ef1dfcc9babd878c 100644 (file)
@@ -1448,6 +1448,9 @@ static u32 rtw89_phy0_phy1_offset(struct rtw89_dev *rtwdev, u32 addr)
        u32 phy_page = addr >> 8;
        u32 ofst = 0;
 
+       if (rtwdev->chip->chip_gen == RTW89_CHIP_BE)
+               return addr < 0x10000 ? 0x20000 : 0;
+
        switch (phy_page) {
        case 0x6:
        case 0x7:
@@ -4732,3 +4735,8 @@ void rtw89_phy_config_edcca(struct rtw89_dev *rtwdev, bool scan)
                rtw89_phy_write32(rtwdev, reg, hal->edcca_bak);
        }
 }
+
+const struct rtw89_phy_gen_def rtw89_phy_gen_ax = {
+       .cr_base = 0x10000,
+};
+EXPORT_SYMBOL(rtw89_phy_gen_ax);
index ab174a0ba4888b0893530b64bf7df56c750cee52..36a24676b2fe0baa21f682c485618169780c605c 100644 (file)
@@ -7,7 +7,6 @@
 
 #include "core.h"
 
-#define RTW89_PHY_ADDR_OFFSET  0x10000
 #define RTW89_RF_ADDR_ADSEL_MASK  BIT(16)
 
 #define get_phy_headline(addr)         FIELD_GET(GENMASK(31, 28), addr)
@@ -337,61 +336,88 @@ struct rtw89_nbi_reg_def {
        struct rtw89_reg_def notch2_en;
 };
 
+struct rtw89_phy_gen_def {
+       u32 cr_base;
+};
+
+extern const struct rtw89_phy_gen_def rtw89_phy_gen_ax;
+extern const struct rtw89_phy_gen_def rtw89_phy_gen_be;
+
 static inline void rtw89_phy_write8(struct rtw89_dev *rtwdev,
                                    u32 addr, u8 data)
 {
-       rtw89_write8(rtwdev, addr | RTW89_PHY_ADDR_OFFSET, data);
+       const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def;
+
+       rtw89_write8(rtwdev, addr + phy->cr_base, data);
 }
 
 static inline void rtw89_phy_write16(struct rtw89_dev *rtwdev,
                                     u32 addr, u16 data)
 {
-       rtw89_write16(rtwdev, addr | RTW89_PHY_ADDR_OFFSET, data);
+       const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def;
+
+       rtw89_write16(rtwdev, addr + phy->cr_base, data);
 }
 
 static inline void rtw89_phy_write32(struct rtw89_dev *rtwdev,
                                     u32 addr, u32 data)
 {
-       rtw89_write32(rtwdev, addr | RTW89_PHY_ADDR_OFFSET, data);
+       const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def;
+
+       rtw89_write32(rtwdev, addr + phy->cr_base, data);
 }
 
 static inline void rtw89_phy_write32_set(struct rtw89_dev *rtwdev,
                                         u32 addr, u32 bits)
 {
-       rtw89_write32_set(rtwdev, addr | RTW89_PHY_ADDR_OFFSET, bits);
+       const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def;
+
+       rtw89_write32_set(rtwdev, addr + phy->cr_base, bits);
 }
 
 static inline void rtw89_phy_write32_clr(struct rtw89_dev *rtwdev,
                                         u32 addr, u32 bits)
 {
-       rtw89_write32_clr(rtwdev, addr | RTW89_PHY_ADDR_OFFSET, bits);
+       const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def;
+
+       rtw89_write32_clr(rtwdev, addr + phy->cr_base, bits);
 }
 
 static inline void rtw89_phy_write32_mask(struct rtw89_dev *rtwdev,
                                          u32 addr, u32 mask, u32 data)
 {
-       rtw89_write32_mask(rtwdev, addr | RTW89_PHY_ADDR_OFFSET, mask, data);
+       const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def;
+
+       rtw89_write32_mask(rtwdev, addr + phy->cr_base, mask, data);
 }
 
 static inline u8 rtw89_phy_read8(struct rtw89_dev *rtwdev, u32 addr)
 {
-       return rtw89_read8(rtwdev, addr | RTW89_PHY_ADDR_OFFSET);
+       const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def;
+
+       return rtw89_read8(rtwdev, addr + phy->cr_base);
 }
 
 static inline u16 rtw89_phy_read16(struct rtw89_dev *rtwdev, u32 addr)
 {
-       return rtw89_read16(rtwdev, addr | RTW89_PHY_ADDR_OFFSET);
+       const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def;
+
+       return rtw89_read16(rtwdev, addr + phy->cr_base);
 }
 
 static inline u32 rtw89_phy_read32(struct rtw89_dev *rtwdev, u32 addr)
 {
-       return rtw89_read32(rtwdev, addr | RTW89_PHY_ADDR_OFFSET);
+       const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def;
+
+       return rtw89_read32(rtwdev, addr + phy->cr_base);
 }
 
 static inline u32 rtw89_phy_read32_mask(struct rtw89_dev *rtwdev,
                                        u32 addr, u32 mask)
 {
-       return rtw89_read32_mask(rtwdev, addr | RTW89_PHY_ADDR_OFFSET, mask);
+       const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def;
+
+       return rtw89_read32_mask(rtwdev, addr + phy->cr_base, mask);
 }
 
 static inline
diff --git a/drivers/net/wireless/realtek/rtw89/phy_be.c b/drivers/net/wireless/realtek/rtw89/phy_be.c
new file mode 100644 (file)
index 0000000..143f900
--- /dev/null
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/* Copyright(c) 2023  Realtek Corporation
+ */
+
+#include "phy.h"
+
+const struct rtw89_phy_gen_def rtw89_phy_gen_be = {
+       .cr_base = 0x20000,
+};
+EXPORT_SYMBOL(rtw89_phy_gen_be);
index ccf96c963bb43f1953ed4340bcca8cf43bb4c882..52eb7030fd0b122bd1e21e25c3672c4a8103e355 100644 (file)
@@ -2337,6 +2337,7 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
        .chip_gen               = RTW89_CHIP_AX,
        .ops                    = &rtw8851b_chip_ops,
        .mac_def                = &rtw89_mac_gen_ax,
+       .phy_def                = &rtw89_phy_gen_ax,
        .fw_basename            = RTW8851B_FW_BASENAME,
        .fw_format_max          = RTW8851B_FW_FORMAT_MAX,
        .try_ce_fw              = true,
index aefc72f24cf266660703b0bf34f5d2142b5b4f2d..eb6aad3bbb85265f7ffa251cc38e5f47d151c4c7 100644 (file)
@@ -2073,6 +2073,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
        .chip_gen               = RTW89_CHIP_AX,
        .ops                    = &rtw8852a_chip_ops,
        .mac_def                = &rtw89_mac_gen_ax,
+       .phy_def                = &rtw89_phy_gen_ax,
        .fw_basename            = RTW8852A_FW_BASENAME,
        .fw_format_max          = RTW8852A_FW_FORMAT_MAX,
        .try_ce_fw              = false,
index cd1863e7e6d41b6f2acf863eeccc146a13173298..49664cc44f364f9932a4393150f77e936c0c640a 100644 (file)
@@ -2506,6 +2506,7 @@ const struct rtw89_chip_info rtw8852b_chip_info = {
        .chip_gen               = RTW89_CHIP_AX,
        .ops                    = &rtw8852b_chip_ops,
        .mac_def                = &rtw89_mac_gen_ax,
+       .phy_def                = &rtw89_phy_gen_ax,
        .fw_basename            = RTW8852B_FW_BASENAME,
        .fw_format_max          = RTW8852B_FW_FORMAT_MAX,
        .try_ce_fw              = true,
index 4e936e0ba407a7a59bba79975ec4c3a842545e00..abd01e808d831ffbfb43221022494d9bc90cce94 100644 (file)
@@ -2803,6 +2803,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
        .chip_gen               = RTW89_CHIP_AX,
        .ops                    = &rtw8852c_chip_ops,
        .mac_def                = &rtw89_mac_gen_ax,
+       .phy_def                = &rtw89_phy_gen_ax,
        .fw_basename            = RTW8852C_FW_BASENAME,
        .fw_format_max          = RTW8852C_FW_FORMAT_MAX,
        .try_ce_fw              = false,