]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: rtw89: add H2C command of TX time for WiFi 7 chips
authorPing-Ke Shih <pkshih@realtek.com>
Mon, 17 Feb 2025 06:30:53 +0000 (14:30 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Fri, 21 Feb 2025 01:41:31 +0000 (09:41 +0800)
BT-coexistence configure WiFi TX time to share time slots with Bluetooth
devices. Since the format is different from WiFi 6 chips, add the new
format accordingly.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20250217063053.38936-3-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/fw.c
drivers/net/wireless/realtek/rtw89/fw.h
drivers/net/wireless/realtek/rtw89/mac.c
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/rtw8852bt.c
drivers/net/wireless/realtek/rtw89/rtw8852c.c
drivers/net/wireless/realtek/rtw89/rtw8922a.c

index eb2a6b90c9407b35da05c0ea388f679c974614a2..542390f1d28cbb70ccb0743405581c768acb1722 100644 (file)
@@ -3676,6 +3676,8 @@ struct rtw89_chip_ops {
        int (*h2c_ampdu_cmac_tbl)(struct rtw89_dev *rtwdev,
                                  struct rtw89_vif_link *rtwvif_link,
                                  struct rtw89_sta_link *rtwsta_link);
+       int (*h2c_txtime_cmac_tbl)(struct rtw89_dev *rtwdev,
+                                  struct rtw89_sta_link *rtwsta_link);
        int (*h2c_default_dmac_tbl)(struct rtw89_dev *rtwdev,
                                    struct rtw89_vif_link *rtwvif_link,
                                    struct rtw89_sta_link *rtwsta_link);
index 6dbea18355a3d1a95adbc0ab77c3de781e504e6e..eff94f0592c9eabc1bfadbfe2b893441bad4ec67 100644 (file)
@@ -3574,6 +3574,61 @@ fail:
 
        return ret;
 }
+EXPORT_SYMBOL(rtw89_fw_h2c_txtime_cmac_tbl);
+
+int rtw89_fw_h2c_txtime_cmac_tbl_g7(struct rtw89_dev *rtwdev,
+                                   struct rtw89_sta_link *rtwsta_link)
+{
+       struct rtw89_h2c_cctlinfo_ud_g7 *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 txtime_cmac_g7\n");
+               return -ENOMEM;
+       }
+       skb_put(skb, len);
+       h2c = (struct rtw89_h2c_cctlinfo_ud_g7 *)skb->data;
+
+       h2c->c0 = le32_encode_bits(rtwsta_link->mac_id, CCTLINFO_G7_C0_MACID) |
+                 le32_encode_bits(1, CCTLINFO_G7_C0_OP);
+
+       if (rtwsta_link->cctl_tx_time) {
+               h2c->w3 |= le32_encode_bits(1, CCTLINFO_G7_W3_AMPDU_TIME_SEL);
+               h2c->m3 |= cpu_to_le32(CCTLINFO_G7_W3_AMPDU_TIME_SEL);
+
+               h2c->w2 |= le32_encode_bits(rtwsta_link->ampdu_max_time,
+                                          CCTLINFO_G7_W2_AMPDU_MAX_TIME);
+               h2c->m2 |= cpu_to_le32(CCTLINFO_G7_W2_AMPDU_MAX_TIME);
+       }
+       if (rtwsta_link->cctl_tx_retry_limit) {
+               h2c->w2 |= le32_encode_bits(1, CCTLINFO_G7_W2_DATA_TXCNT_LMT_SEL) |
+                          le32_encode_bits(rtwsta_link->data_tx_cnt_lmt,
+                                           CCTLINFO_G7_W2_DATA_TX_CNT_LMT);
+               h2c->m2 |= cpu_to_le32(CCTLINFO_G7_W2_DATA_TXCNT_LMT_SEL |
+                                      CCTLINFO_G7_W2_DATA_TX_CNT_LMT);
+       }
+
+       rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
+                             H2C_CAT_MAC, H2C_CL_MAC_FR_EXCHG,
+                             H2C_FUNC_MAC_CCTLINFO_UD_G7, 0, 1,
+                             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;
+}
+EXPORT_SYMBOL(rtw89_fw_h2c_txtime_cmac_tbl_g7);
 
 int rtw89_fw_h2c_txpath_cmac_tbl(struct rtw89_dev *rtwdev,
                                 struct rtw89_sta_link *rtwsta_link)
index 994d109a9c3c9bece320130d9ed5176820b6adde..53a4083ba12875e094a649a7feb8ae45b86d854e 100644 (file)
@@ -4588,6 +4588,8 @@ int rtw89_fw_h2c_ampdu_cmac_tbl_g7(struct rtw89_dev *rtwdev,
                                   struct rtw89_sta_link *rtwsta_link);
 int rtw89_fw_h2c_txtime_cmac_tbl(struct rtw89_dev *rtwdev,
                                 struct rtw89_sta_link *rtwsta_link);
+int rtw89_fw_h2c_txtime_cmac_tbl_g7(struct rtw89_dev *rtwdev,
+                                   struct rtw89_sta_link *rtwsta_link);
 int rtw89_fw_h2c_txpath_cmac_tbl(struct rtw89_dev *rtwdev,
                                 struct rtw89_sta_link *rtwsta_link);
 int rtw89_fw_h2c_update_beacon(struct rtw89_dev *rtwdev,
@@ -4869,6 +4871,15 @@ static inline int rtw89_chip_h2c_ampdu_cmac_tbl(struct rtw89_dev *rtwdev,
        return 0;
 }
 
+static inline
+int rtw89_chip_h2c_txtime_cmac_tbl(struct rtw89_dev *rtwdev,
+                                  struct rtw89_sta_link *rtwsta_link)
+{
+       const struct rtw89_chip_info *chip = rtwdev->chip;
+
+       return chip->ops->h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
+}
+
 static inline
 int rtw89_chip_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
                          bool valid, struct ieee80211_ampdu_params *params)
index 0b2e4ad52774621b31ce009f76f3efdd65e7ea5f..513c317b286cc79a61f3007475268e8d237e783f 100644 (file)
@@ -6441,7 +6441,7 @@ __rtw89_mac_set_tx_time(struct rtw89_dev *rtwdev, struct rtw89_sta_link *rtwsta_
 
        if (rtwsta_link->cctl_tx_time) {
                rtwsta_link->ampdu_max_time = (max_tx_time - 512) >> 9;
-               ret = rtw89_fw_h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
+               ret = rtw89_chip_h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
        } else {
                ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL);
                if (ret) {
@@ -6507,9 +6507,9 @@ int rtw89_mac_set_tx_retry_limit(struct rtw89_dev *rtwdev,
 
        if (!resume) {
                rtwsta_link->cctl_tx_retry_limit = true;
-               ret = rtw89_fw_h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
+               ret = rtw89_chip_h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
        } else {
-               ret = rtw89_fw_h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
+               ret = rtw89_chip_h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
                rtwsta_link->cctl_tx_retry_limit = false;
        }
 
index 82289dbad1f4da37869c464d99a904f6869f461e..3ef07d80caf16f4bdf8c920a2603f7884a287606 100644 (file)
@@ -2423,6 +2423,7 @@ static const struct rtw89_chip_ops rtw8851b_chip_ops = {
        .h2c_default_cmac_tbl   = rtw89_fw_h2c_default_cmac_tbl,
        .h2c_assoc_cmac_tbl     = rtw89_fw_h2c_assoc_cmac_tbl,
        .h2c_ampdu_cmac_tbl     = NULL,
+       .h2c_txtime_cmac_tbl    = rtw89_fw_h2c_txtime_cmac_tbl,
        .h2c_default_dmac_tbl   = NULL,
        .h2c_update_beacon      = rtw89_fw_h2c_update_beacon,
        .h2c_ba_cam             = rtw89_fw_h2c_ba_cam,
index 2046832d021fdd99ab7417de7a7f2f96fbb15482..bcd71d6fce29757d0e3c580e6701b13772a881a1 100644 (file)
@@ -2149,6 +2149,7 @@ static const struct rtw89_chip_ops rtw8852a_chip_ops = {
        .h2c_default_cmac_tbl   = rtw89_fw_h2c_default_cmac_tbl,
        .h2c_assoc_cmac_tbl     = rtw89_fw_h2c_assoc_cmac_tbl,
        .h2c_ampdu_cmac_tbl     = NULL,
+       .h2c_txtime_cmac_tbl    = rtw89_fw_h2c_txtime_cmac_tbl,
        .h2c_default_dmac_tbl   = NULL,
        .h2c_update_beacon      = rtw89_fw_h2c_update_beacon,
        .h2c_ba_cam             = rtw89_fw_h2c_ba_cam,
index 652914a362451e9ffe24faa8cd22d7f8984711c4..2ef534b4e95136f8000caf060b3d4090ffe0e6fa 100644 (file)
@@ -776,6 +776,7 @@ static const struct rtw89_chip_ops rtw8852b_chip_ops = {
        .h2c_default_cmac_tbl   = rtw89_fw_h2c_default_cmac_tbl,
        .h2c_assoc_cmac_tbl     = rtw89_fw_h2c_assoc_cmac_tbl,
        .h2c_ampdu_cmac_tbl     = NULL,
+       .h2c_txtime_cmac_tbl    = rtw89_fw_h2c_txtime_cmac_tbl,
        .h2c_default_dmac_tbl   = NULL,
        .h2c_update_beacon      = rtw89_fw_h2c_update_beacon,
        .h2c_ba_cam             = rtw89_fw_h2c_ba_cam,
index 6f15245b2f74967193bafb6f2bdc03ebb370e89b..8f2dccc07bb51d91d99f036664bf78b64498b1db 100644 (file)
@@ -710,6 +710,7 @@ static const struct rtw89_chip_ops rtw8852bt_chip_ops = {
        .h2c_default_cmac_tbl   = rtw89_fw_h2c_default_cmac_tbl,
        .h2c_assoc_cmac_tbl     = rtw89_fw_h2c_assoc_cmac_tbl,
        .h2c_ampdu_cmac_tbl     = NULL,
+       .h2c_txtime_cmac_tbl    = rtw89_fw_h2c_txtime_cmac_tbl,
        .h2c_default_dmac_tbl   = NULL,
        .h2c_update_beacon      = rtw89_fw_h2c_update_beacon,
        .h2c_ba_cam             = rtw89_fw_h2c_ba_cam,
index ecc1ff358583158d32aa7d3ecb7a2a5aeaccc9d5..5876b1e8bb6b701311c5f9591353d4a9876b26f5 100644 (file)
@@ -2941,6 +2941,7 @@ static const struct rtw89_chip_ops rtw8852c_chip_ops = {
        .h2c_default_cmac_tbl   = rtw89_fw_h2c_default_cmac_tbl,
        .h2c_assoc_cmac_tbl     = rtw89_fw_h2c_assoc_cmac_tbl,
        .h2c_ampdu_cmac_tbl     = NULL,
+       .h2c_txtime_cmac_tbl    = rtw89_fw_h2c_txtime_cmac_tbl,
        .h2c_default_dmac_tbl   = NULL,
        .h2c_update_beacon      = rtw89_fw_h2c_update_beacon,
        .h2c_ba_cam             = rtw89_fw_h2c_ba_cam,
index 898a65a721dc4f7f5adefcb60399f04e97ee3041..f3661eb894dcd9468f09c5d0e737aa95865f5862 100644 (file)
@@ -2702,6 +2702,7 @@ static const struct rtw89_chip_ops rtw8922a_chip_ops = {
        .h2c_default_cmac_tbl   = rtw89_fw_h2c_default_cmac_tbl_g7,
        .h2c_assoc_cmac_tbl     = rtw89_fw_h2c_assoc_cmac_tbl_g7,
        .h2c_ampdu_cmac_tbl     = rtw89_fw_h2c_ampdu_cmac_tbl_g7,
+       .h2c_txtime_cmac_tbl    = rtw89_fw_h2c_txtime_cmac_tbl_g7,
        .h2c_default_dmac_tbl   = rtw89_fw_h2c_default_dmac_tbl_v2,
        .h2c_update_beacon      = rtw89_fw_h2c_update_beacon_be,
        .h2c_ba_cam             = rtw89_fw_h2c_ba_cam_v1,