]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: rtw89: mcc: support courtesy mechanism on both roles at the same time
authorZong-Zhe Yang <kevin_yang@realtek.com>
Tue, 22 Apr 2025 01:46:18 +0000 (09:46 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Mon, 28 Apr 2025 06:38:59 +0000 (14:38 +0800)
MCC has a courtesy mechanism which allows one role to use another's
duration in a given cycle. Originally, this courtesy mechanism only
supports in one direction. However, in some field cases, both of MCC
roles may simultaneously have timing configurations that are not good
enough. So, support courtesy mechanism in both directions.

Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20250422014620.18421-11-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/chan.c
drivers/net/wireless/realtek/rtw89/chan.h
drivers/net/wireless/realtek/rtw89/core.h

index ac88f51c679b42dd778837d53882e782b5580ee0..faa9fbe9d2593c216972194fbc40a342fa8c16be 100644 (file)
@@ -942,37 +942,44 @@ static void rtw89_mcc_assign_pattern(struct rtw89_dev *rtwdev,
        struct rtw89_mcc_role *aux = &mcc->role_aux;
        struct rtw89_mcc_config *config = &mcc->config;
        struct rtw89_mcc_pattern *pattern = &config->pattern;
+       struct rtw89_mcc_courtesy_cfg *crtz;
 
        rtw89_debug(rtwdev, RTW89_DBG_CHAN,
                    "MCC assign pattern: ref {%d | %d}, aux {%d | %d}\n",
                    new->tob_ref, new->toa_ref, new->tob_aux, new->toa_aux);
 
+       rtw89_debug(rtwdev, RTW89_DBG_CHAN, "MCC pattern plan: %d\n", new->plan);
+
        *pattern = *new;
        memset(&pattern->courtesy, 0, sizeof(pattern->courtesy));
 
-       if (pattern->tob_aux <= 0 || pattern->toa_aux <= 0) {
-               pattern->courtesy.macid_tgt = aux->rtwvif_link->mac_id;
-               pattern->courtesy.macid_src = ref->rtwvif_link->mac_id;
-               pattern->courtesy.slot_num = RTW89_MCC_DFLT_COURTESY_SLOT;
-               pattern->courtesy.enable = true;
-       } else if (pattern->tob_ref <= 0 || pattern->toa_ref <= 0) {
-               pattern->courtesy.macid_tgt = ref->rtwvif_link->mac_id;
-               pattern->courtesy.macid_src = aux->rtwvif_link->mac_id;
-               pattern->courtesy.slot_num = RTW89_MCC_DFLT_COURTESY_SLOT;
-               pattern->courtesy.enable = true;
+       if (RTW89_MCC_REQ_COURTESY(pattern, aux)) {
+               crtz = &pattern->courtesy.ref;
+               ref->crtz = crtz;
+
+               crtz->macid_tgt = aux->rtwvif_link->mac_id;
+               crtz->slot_num = RTW89_MCC_DFLT_COURTESY_SLOT;
+
+               rtw89_debug(rtwdev, RTW89_DBG_CHAN,
+                           "MCC courtesy ref: tgt %d, slot %d\n",
+                           crtz->macid_tgt, crtz->slot_num);
+       } else {
+               ref->crtz = NULL;
        }
 
-       rtw89_debug(rtwdev, RTW89_DBG_CHAN,
-                   "MCC pattern flags: plan %d, courtesy_en %d\n",
-                   pattern->plan, pattern->courtesy.enable);
+       if (RTW89_MCC_REQ_COURTESY(pattern, ref)) {
+               crtz = &pattern->courtesy.aux;
+               aux->crtz = crtz;
 
-       if (!pattern->courtesy.enable)
-               return;
+               crtz->macid_tgt = ref->rtwvif_link->mac_id;
+               crtz->slot_num = RTW89_MCC_DFLT_COURTESY_SLOT;
 
-       rtw89_debug(rtwdev, RTW89_DBG_CHAN,
-                   "MCC pattern courtesy: tgt %d, src %d, slot %d\n",
-                   pattern->courtesy.macid_tgt, pattern->courtesy.macid_src,
-                   pattern->courtesy.slot_num);
+               rtw89_debug(rtwdev, RTW89_DBG_CHAN,
+                           "MCC courtesy aux: tgt %d, slot %d\n",
+                           crtz->macid_tgt, crtz->slot_num);
+       } else {
+               aux->crtz = NULL;
+       }
 }
 
 /* The follow-up roughly shows the relationship between the parameters
@@ -1528,10 +1535,8 @@ bottom:
 
 static int __mcc_fw_add_role(struct rtw89_dev *rtwdev, struct rtw89_mcc_role *role)
 {
+       const struct rtw89_mcc_courtesy_cfg *crtz = role->crtz;
        struct rtw89_mcc_info *mcc = &rtwdev->mcc;
-       struct rtw89_mcc_config *config = &mcc->config;
-       struct rtw89_mcc_pattern *pattern = &config->pattern;
-       struct rtw89_mcc_courtesy *courtesy = &pattern->courtesy;
        struct rtw89_mcc_policy *policy = &role->policy;
        struct rtw89_fw_mcc_add_req req = {};
        const struct rtw89_chan *chan;
@@ -1554,9 +1559,9 @@ static int __mcc_fw_add_role(struct rtw89_dev *rtwdev, struct rtw89_mcc_role *ro
        req.duration = role->duration;
        req.btc_in_2g = false;
 
-       if (courtesy->enable && courtesy->macid_src == req.macid) {
-               req.courtesy_target = courtesy->macid_tgt;
-               req.courtesy_num = courtesy->slot_num;
+       if (crtz) {
+               req.courtesy_target = crtz->macid_tgt;
+               req.courtesy_num = crtz->slot_num;
                req.courtesy_en = true;
        }
 
@@ -1736,26 +1741,23 @@ static void __mrc_fw_add_courtesy(struct rtw89_dev *rtwdev,
        struct rtw89_mcc_info *mcc = &rtwdev->mcc;
        struct rtw89_mcc_role *ref = &mcc->role_ref;
        struct rtw89_mcc_role *aux = &mcc->role_aux;
-       struct rtw89_mcc_config *config = &mcc->config;
-       struct rtw89_mcc_pattern *pattern = &config->pattern;
-       struct rtw89_mcc_courtesy *courtesy = &pattern->courtesy;
        struct rtw89_fw_mrc_add_slot_arg *slot_arg_src;
-       u8 slot_idx_tgt;
 
-       if (!courtesy->enable)
-               return;
-
-       if (courtesy->macid_src == ref->rtwvif_link->mac_id) {
+       if (ref->crtz) {
                slot_arg_src = &arg->slots[ref->slot_idx];
-               slot_idx_tgt = aux->slot_idx;
-       } else {
-               slot_arg_src = &arg->slots[aux->slot_idx];
-               slot_idx_tgt = ref->slot_idx;
+
+               slot_arg_src->courtesy_target = aux->slot_idx;
+               slot_arg_src->courtesy_period = ref->crtz->slot_num;
+               slot_arg_src->courtesy_en = true;
        }
 
-       slot_arg_src->courtesy_target = slot_idx_tgt;
-       slot_arg_src->courtesy_period = courtesy->slot_num;
-       slot_arg_src->courtesy_en = true;
+       if (aux->crtz) {
+               slot_arg_src = &arg->slots[aux->slot_idx];
+
+               slot_arg_src->courtesy_target = ref->slot_idx;
+               slot_arg_src->courtesy_period = aux->crtz->slot_num;
+               slot_arg_src->courtesy_en = true;
+       }
 }
 
 static int __mrc_fw_start(struct rtw89_dev *rtwdev, bool replace)
index e6391f6f2aa78d1e7d9974f61d05f21c6fa2528e..1bcb87a8f9ee073e9a093211b22ab50b3640d552 100644 (file)
 #define RTW89_MCC_DFLT_TX_NULL_EARLY 3
 #define RTW89_MCC_DFLT_COURTESY_SLOT 3
 
+#define RTW89_MCC_REQ_COURTESY_TIME 5
+#define RTW89_MCC_REQ_COURTESY(pattern, role)                  \
+({                                                             \
+       const struct rtw89_mcc_pattern *p = pattern;            \
+       p->tob_ ## role <= RTW89_MCC_REQ_COURTESY_TIME ||       \
+       p->toa_ ## role <= RTW89_MCC_REQ_COURTESY_TIME;         \
+})
+
 #define NUM_OF_RTW89_MCC_ROLES 2
 
 enum rtw89_chanctx_pause_reasons {
index a5fc3deab268abaeb2499f7d56dda6f19d0e4125..be1259cfa7125c963b038f275faac44bb5af8a1e 100644 (file)
@@ -5640,6 +5640,8 @@ struct rtw89_mcc_role {
        struct rtw89_mcc_policy policy;
        struct rtw89_mcc_limit limit;
 
+       const struct rtw89_mcc_courtesy_cfg *crtz;
+
        /* only valid when running with FW MRC mechanism */
        u8 slot_idx;
 
@@ -5657,13 +5659,16 @@ struct rtw89_mcc_bt_role {
        u16 duration; /* TU */
 };
 
-struct rtw89_mcc_courtesy {
-       bool enable;
+struct rtw89_mcc_courtesy_cfg {
        u8 slot_num;
-       u8 macid_src;
        u8 macid_tgt;
 };
 
+struct rtw89_mcc_courtesy {
+       struct rtw89_mcc_courtesy_cfg ref;
+       struct rtw89_mcc_courtesy_cfg aux;
+};
+
 enum rtw89_mcc_plan {
        RTW89_MCC_PLAN_TAIL_BT,
        RTW89_MCC_PLAN_MID_BT,