]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: coex: Add H2C command to collect driver outsource information to firmware
authorChing-Te Ku <ku920601@realtek.com>
Wed, 11 Jun 2025 03:55:19 +0000 (11:55 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Mon, 16 Jun 2025 05:54:16 +0000 (13:54 +0800)
In order to reduce driver I/O & some detail instant hardware control, some
of the necessary API offload to Wi-Fi firmware. Collect the reference
parameters to let firmware do decisions.

Signed-off-by: Ching-Te Ku <ku920601@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20250611035523.36432-7-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/coex.c
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/fw.c
drivers/net/wireless/realtek/rtw89/fw.h

index 6ec83b928bc2ba0b6a451de2c0b8725324cb638e..d2d673fe8e18d148865387a5b5f016db2188bd3f 100644 (file)
@@ -154,7 +154,7 @@ static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = {
         .fcxstep = 7,   .fcxnullsta = 7, .fcxmreg = 7,  .fcxgpiodbg = 7,
         .fcxbtver = 7,  .fcxbtscan = 7,  .fcxbtafh = 7, .fcxbtdevinfo = 7,
         .fwlrole = 8,   .frptmap = 3,    .fcxctrl = 7,  .fcxinit = 7,
-        .fwevntrptl = 1, .fwc2hfunc = 2, .drvinfo_type = 1, .info_buf = 1800,
+        .fwevntrptl = 1, .fwc2hfunc = 2, .drvinfo_type = 2, .info_buf = 1800,
         .max_role_num = 6, .fcxosi = 1,  .fcxmlo = 1,
        },
        {RTL8922A, RTW89_FW_VER_CODE(0, 35, 8, 0),
@@ -2776,6 +2776,16 @@ static void _fw_set_drv_info(struct rtw89_dev *rtwdev, u8 type)
        case CXDRVINFO_FDDT:
        case CXDRVINFO_MLO:
        case CXDRVINFO_OSI:
+               if (!ver->fcxosi)
+                       return;
+
+               if (ver->drvinfo_type == 2)
+                       type = 7;
+               else
+                       return;
+
+               rtw89_fw_h2c_cxdrv_osi_info(rtwdev, type);
+               break;
        default:
                break;
        }
index 6ee0fb44915d65f5d0831a0e731989f97b73cc16..328d4e9352fe0fb3dac2987e8b4972418f7ca308 100644 (file)
@@ -1205,7 +1205,7 @@ struct rtw89_mac_ax_gnt {
 struct rtw89_mac_ax_wl_act {
        u8 wlan_act_en;
        u8 wlan_act;
-};
+} __packed;
 
 #define RTW89_MAC_AX_COEX_GNT_NR 2
 struct rtw89_mac_ax_coex_gnt {
@@ -2933,12 +2933,26 @@ enum btc_rf_path {
        BTC_RF_NUM,
 };
 
+struct rtw89_btc_fbtc_outsrc_set_info {
+       u8 rf_band[BTC_RF_NUM]; /* 0:2G, 1:non-2G */
+       u8 btg_rx[BTC_RF_NUM];
+       u8 nbtg_tx[BTC_RF_NUM];
+
+       struct rtw89_mac_ax_gnt gnt_set[BTC_RF_NUM]; /* refer to btc_gnt_ctrl */
+       struct rtw89_mac_ax_wl_act wlact_set[BTC_RF_NUM]; /* BT0/BT1 */
+
+       u8 pta_req_hw_band;
+       u8 rf_gbt_source;
+} __packed;
+
 union rtw89_btc_fbtc_slot_u {
        struct rtw89_btc_fbtc_slot v1[CXST_MAX];
        struct rtw89_btc_fbtc_slot_v7 v7[CXST_MAX];
 };
 
 struct rtw89_btc_dm {
+       struct rtw89_btc_fbtc_outsrc_set_info ost_info_last; /* outsrc API setup info */
+       struct rtw89_btc_fbtc_outsrc_set_info ost_info; /* outsrc API setup info */
        union rtw89_btc_fbtc_slot_u slot;
        union rtw89_btc_fbtc_slot_u slot_now;
        struct rtw89_btc_fbtc_tdma tdma;
index 2d649186b70059baf06903023a9158a8212a4e4f..c613431e754f68ec3a605f14693ed4e8652c9db0 100644 (file)
@@ -5084,6 +5084,46 @@ fail:
        return ret;
 }
 
+int rtw89_fw_h2c_cxdrv_osi_info(struct rtw89_dev *rtwdev, u8 type)
+{
+       struct rtw89_btc *btc = &rtwdev->btc;
+       struct rtw89_btc_fbtc_outsrc_set_info *osi = &btc->dm.ost_info;
+       struct rtw89_h2c_cxosi *h2c;
+       u32 len = sizeof(*h2c);
+       struct sk_buff *skb;
+       int ret;
+
+       skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
+       if (!skb) {
+               rtw89_err(rtwdev, "failed to alloc skb for h2c cxdrv_osi\n");
+               return -ENOMEM;
+       }
+       skb_put(skb, len);
+       h2c = (struct rtw89_h2c_cxosi *)skb->data;
+
+       h2c->hdr.type = type;
+       h2c->hdr.ver = btc->ver->fcxosi;
+       h2c->hdr.len = len - H2C_LEN_CXDRVHDR_V7;
+       h2c->osi = *osi;
+
+       rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
+                             H2C_CAT_OUTSRC, BTFC_SET,
+                             SET_DRV_INFO, 0, 0,
+                             len);
+
+       ret = rtw89_h2c_tx(rtwdev, skb, false);
+       if (ret) {
+               rtw89_err(rtwdev, "failed to send h2c\n");
+               goto fail;
+       }
+
+       return 0;
+fail:
+       dev_kfree_skb_any(skb);
+
+       return ret;
+}
+
 #define H2C_LEN_CXDRVINFO_CTRL (4 + H2C_LEN_CXDRVHDR)
 int rtw89_fw_h2c_cxdrv_ctrl(struct rtw89_dev *rtwdev, u8 type)
 {
index 116a17f7dfc6c232306cfedc4f61ac5adeec3aa2..24d2e8b0d07919a0194d36e547d71ae85e633479 100644 (file)
@@ -2251,6 +2251,11 @@ struct rtw89_h2c_cxrole_v8 {
        struct rtw89_btc_wl_role_info_v8_u32 _u32;
 } __packed;
 
+struct rtw89_h2c_cxosi {
+       struct rtw89_h2c_cxhdr_v7 hdr;
+       struct rtw89_btc_fbtc_outsrc_set_info osi;
+} __packed;
+
 struct rtw89_h2c_cxinit {
        struct rtw89_h2c_cxhdr hdr;
        u8 ant_type;
@@ -4746,6 +4751,7 @@ int rtw89_fw_h2c_cxdrv_role_v1(struct rtw89_dev *rtwdev, u8 type);
 int rtw89_fw_h2c_cxdrv_role_v2(struct rtw89_dev *rtwdev, u8 type);
 int rtw89_fw_h2c_cxdrv_role_v7(struct rtw89_dev *rtwdev, u8 type);
 int rtw89_fw_h2c_cxdrv_role_v8(struct rtw89_dev *rtwdev, u8 type);
+int rtw89_fw_h2c_cxdrv_osi_info(struct rtw89_dev *rtwdev, u8 type);
 int rtw89_fw_h2c_cxdrv_ctrl(struct rtw89_dev *rtwdev, u8 type);
 int rtw89_fw_h2c_cxdrv_ctrl_v7(struct rtw89_dev *rtwdev, u8 type);
 int rtw89_fw_h2c_cxdrv_trx(struct rtw89_dev *rtwdev, u8 type);