From: Yan-Hsuan Chuang <[email protected]>

Some modules might not have full programed efuse.
Driver should check the BT FT S1 type to know that
if BT has been programed. If BT is not programed,
throw a warning to notify that this module is not
capable of working with WiFi + BT concurrently.

Signed-off-by: Yan-Hsuan Chuang <[email protected]>
---
v1 -> v2
    no change

 drivers/net/wireless/realtek/rtw88/efuse.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/drivers/net/wireless/realtek/rtw88/efuse.c 
b/drivers/net/wireless/realtek/rtw88/efuse.c
index 66e56f3..82aa26a 100644
--- a/drivers/net/wireless/realtek/rtw88/efuse.c
+++ b/drivers/net/wireless/realtek/rtw88/efuse.c
@@ -8,6 +8,11 @@
 #include "debug.h"
 
 #define RTW_EFUSE_BANK_WIFI            0x0
+#define RTW_EFUSE_BANK_BT              0x1
+
+#define EFUSE_BT_S1_ADDR               0x4a
+#define EFUSE_BT_S1_TYPE1              0xff
+#define EFUSE_BT_S1_TYPE2              0x00
 
 static void switch_efuse_bank(struct rtw_dev *rtwdev, u8 efuse_bank)
 {
@@ -89,6 +94,7 @@ static int rtw_dump_physical_efuse_map(struct rtw_dev 
*rtwdev, u8 *map)
        u32 efuse_ctl;
        u32 addr;
        u32 cnt;
+       u8 ft_ver;
 
        switch_efuse_bank(rtwdev, RTW_EFUSE_BANK_WIFI);
 
@@ -113,6 +119,24 @@ static int rtw_dump_physical_efuse_map(struct rtw_dev 
*rtwdev, u8 *map)
                *(map + addr) = (u8)(efuse_ctl & BIT_MASK_EF_DATA);
        }
 
+       /* verify BT FT S1 efuse type */
+       switch_efuse_bank(rtwdev, RTW_EFUSE_BANK_BT);
+
+       efuse_ctl = rtw_read32(rtwdev, REG_EFUSE_CTRL);
+       efuse_ctl &= ~(BIT_MASK_EF_DATA | BITS_EF_ADDR);
+       efuse_ctl |= (EFUSE_BT_S1_ADDR & BIT_MASK_EF_ADDR) << BIT_SHIFT_EF_ADDR;
+       rtw_write32(rtwdev, REG_EFUSE_CTRL, efuse_ctl & (~BIT_EF_FLAG));
+
+       if (!check_hw_ready(rtwdev, REG_EFUSE_CTRL, BIT_EF_FLAG, 0x1)) {
+               rtw_err(rtwdev, "failed to read BT efuse\n");
+               return -EBUSY;
+       }
+
+       efuse_ctl = rtw_read32(rtwdev, REG_EFUSE_CTRL);
+       ft_ver = (u8)(efuse_ctl & BIT_MASK_EF_DATA);
+       if (ft_ver == EFUSE_BT_S1_TYPE1 || ft_ver == EFUSE_BT_S1_TYPE2)
+               rtw_warn(rtwdev, "BT S1 not calibrated, not recommended to 
verify BT for this module\n");
+
        return 0;
 }
 
-- 
2.7.4

Reply via email to