]> www.infradead.org Git - users/hch/misc.git/commitdiff
wifi: rtw89: coex: Add Bluetooth RSSI level information
authorChing-Te Ku <ku920601@realtek.com>
Mon, 18 Dec 2023 06:13:38 +0000 (14:13 +0800)
committerKalle Valo <kvalo@kernel.org>
Wed, 20 Dec 2023 18:27:42 +0000 (20:27 +0200)
In order to control RF LNA setting, need Bluetooth RSSI level information.
RSSI level separate Bluetooth RSSI to several level, so the mechanism can
assign a corresponding setting.

Signed-off-by: Ching-Te Ku <ku920601@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://msgid.link/20231218061341.51255-9-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/coex.c
drivers/net/wireless/realtek/rtw89/core.h

index 43a95f9b0868eded3d52c2313622225f9912d643..d1368b2bc688123b52f0d41346de00d504883fe0 100644 (file)
@@ -5761,6 +5761,37 @@ void rtw89_btc_ntfy_icmp_packet_work(struct work_struct *work)
        mutex_unlock(&rtwdev->mutex);
 }
 
+static u8 _update_bt_rssi_level(struct rtw89_dev *rtwdev, u8 rssi)
+{
+       const struct rtw89_chip_info *chip = rtwdev->chip;
+       struct rtw89_btc *btc = &rtwdev->btc;
+       struct rtw89_btc_bt_info *bt = &btc->cx.bt;
+       u8 *rssi_st, rssi_th, rssi_level = 0;
+       u8 i;
+
+       /* for rssi locate in which {40, 36, 31, 28}
+        * if rssi >= 40% (-60dBm) --> rssi_level = 4
+        * if 36% <= rssi < 40%    --> rssi_level = 3
+        * if 31% <= rssi < 36%    --> rssi_level = 2
+        * if 28% <= rssi < 31%    --> rssi_level = 1
+        * if rssi < 28%           --> rssi_level = 0
+        */
+
+       /* check if rssi across bt_rssi_thres boundary */
+       for (i = 0; i < BTC_BT_RSSI_THMAX; i++) {
+               rssi_th = chip->bt_rssi_thres[i];
+               rssi_st = &bt->link_info.rssi_state[i];
+
+               *rssi_st = _update_rssi_state(rtwdev, *rssi_st, rssi, rssi_th);
+
+               if (BTC_RSSI_HIGH(*rssi_st)) {
+                       rssi_level = BTC_BT_RSSI_THMAX - i;
+                       break;
+               }
+       }
+       return rssi_level;
+}
+
 #define BT_PROFILE_PROTOCOL_MASK GENMASK(7, 4)
 
 static void _update_bt_info(struct rtw89_dev *rtwdev, u8 *buf, u32 len)
@@ -5836,7 +5867,8 @@ static void _update_bt_info(struct rtw89_dev *rtwdev, u8 *buf, u32 len)
        btinfo.val = bt->raw_info[BTC_BTINFO_H0];
        /* raw val is dBm unit, translate from -100~ 0dBm to 0~100%*/
        b->rssi = chip->ops->btc_get_bt_rssi(rtwdev, btinfo.hb0.rssi);
-       btc->dm.trx_info.bt_rssi = b->rssi;
+       bt->rssi_level = _update_bt_rssi_level(rtwdev, b->rssi);
+       btc->dm.trx_info.bt_rssi = bt->rssi_level;
 
        /* parse raw info high-Byte1 */
        btinfo.val = bt->raw_info[BTC_BTINFO_H1];
@@ -6686,8 +6718,9 @@ static void _show_bt_info(struct rtw89_dev *rtwdev, struct seq_file *m)
                   bt_linfo->pan_desc.active ? "Y" : "N");
 
        seq_printf(m,
-                  " %-15s : rssi:%ddBm, tx_rate:%dM, %s%s%s",
+                  " %-15s : rssi:%ddBm(lvl:%d), tx_rate:%dM, %s%s%s",
                   "[link]", bt_linfo->rssi - 100,
+                  bt->rssi_level,
                   bt_linfo->tx_3m ? 3 : 2,
                   bt_linfo->status.map.inq_pag ? " inq-page!!" : "",
                   bt_linfo->status.map.acl_busy ? " acl_busy!!" : "",
index 0e7b8360ace724d7a491b8ead3194aa5c8aab340..7c92330ba06ad37d7e247302e2babe5af3573341 100644 (file)
@@ -1814,6 +1814,7 @@ struct rtw89_btc_bt_info {
        union rtw89_btc_bt_rfk_info_map rfk_info;
 
        u8 raw_info[BTC_BTINFO_MAX]; /* raw bt info from mailbox */
+       u8 rssi_level;
 
        u32 scbd;
        u32 feature;