wifi: rtw89: mcc: stop at a role holding chanctx
authorZong-Zhe Yang <kevin_yang@realtek.com>
Sat, 27 Jul 2024 08:06:45 +0000 (16:06 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Fri, 2 Aug 2024 01:33:23 +0000 (09:33 +0800)
In general, MCC (multi-channel concurrency) stops when some chanctx is
unassigned. Originally, we let FW to stop at a fixed role. However, it
might be the one to be unassigned.

So, iterate MCC roles and select one which is still holding chanctx.

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

index 3789c98de36af319c74e3aecccb2b67864cbbe43..0d848aef72b9e2acf6b6560ca4f226a517b80468 100644 (file)
@@ -1934,22 +1934,53 @@ static int rtw89_mcc_start(struct rtw89_dev *rtwdev)
        return 0;
 }
 
+struct rtw89_mcc_stop_sel {
+       u8 mac_id;
+       u8 slot_idx;
+};
+
+static void rtw89_mcc_stop_sel_fill(struct rtw89_mcc_stop_sel *sel,
+                                   const struct rtw89_mcc_role *mcc_role)
+{
+       sel->mac_id = mcc_role->rtwvif->mac_id;
+       sel->slot_idx = mcc_role->slot_idx;
+}
+
+static int rtw89_mcc_stop_sel_iterator(struct rtw89_dev *rtwdev,
+                                      struct rtw89_mcc_role *mcc_role,
+                                      unsigned int ordered_idx,
+                                      void *data)
+{
+       struct rtw89_mcc_stop_sel *sel = data;
+
+       if (!mcc_role->rtwvif->chanctx_assigned)
+               return 0;
+
+       rtw89_mcc_stop_sel_fill(sel, mcc_role);
+       return 1; /* break iteration */
+}
+
 static void rtw89_mcc_stop(struct rtw89_dev *rtwdev)
 {
        struct rtw89_mcc_info *mcc = &rtwdev->mcc;
        struct rtw89_mcc_role *ref = &mcc->role_ref;
+       struct rtw89_mcc_stop_sel sel;
        int ret;
 
-       rtw89_debug(rtwdev, RTW89_DBG_CHAN, "MCC stop\n");
+       /* by default, stop at ref */
+       rtw89_mcc_stop_sel_fill(&sel, ref);
+       rtw89_iterate_mcc_roles(rtwdev, rtw89_mcc_stop_sel_iterator, &sel);
+
+       rtw89_debug(rtwdev, RTW89_DBG_CHAN, "MCC stop at <macid %d>\n", sel.mac_id);
 
        if (rtw89_concurrent_via_mrc(rtwdev)) {
-               ret = rtw89_fw_h2c_mrc_del(rtwdev, mcc->group);
+               ret = rtw89_fw_h2c_mrc_del(rtwdev, mcc->group, sel.slot_idx);
                if (ret)
                        rtw89_debug(rtwdev, RTW89_DBG_CHAN,
                                    "MRC h2c failed to trigger del: %d\n", ret);
        } else {
                ret = rtw89_fw_h2c_stop_mcc(rtwdev, mcc->group,
-                                           ref->rtwvif->mac_id, true);
+                                           sel.mac_id, true);
                if (ret)
                        rtw89_debug(rtwdev, RTW89_DBG_CHAN,
                                    "MCC h2c failed to trigger stop: %d\n", ret);
index c832749507936b798502f48ca95cb726166c66c0..6ff7cd77a2597e6603521bfd85b9a9f590d459d8 100644 (file)
@@ -7345,7 +7345,7 @@ int rtw89_fw_h2c_mrc_start(struct rtw89_dev *rtwdev,
        return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond);
 }
 
-int rtw89_fw_h2c_mrc_del(struct rtw89_dev *rtwdev, u8 sch_idx)
+int rtw89_fw_h2c_mrc_del(struct rtw89_dev *rtwdev, u8 sch_idx, u8 slot_idx)
 {
        struct rtw89_wait_info *wait = &rtwdev->mcc.wait;
        struct rtw89_h2c_mrc_del *h2c;
@@ -7362,7 +7362,8 @@ int rtw89_fw_h2c_mrc_del(struct rtw89_dev *rtwdev, u8 sch_idx)
        skb_put(skb, len);
        h2c = (struct rtw89_h2c_mrc_del *)skb->data;
 
-       h2c->w0 = le32_encode_bits(sch_idx, RTW89_H2C_MRC_DEL_W0_SCH_IDX);
+       h2c->w0 = le32_encode_bits(sch_idx, RTW89_H2C_MRC_DEL_W0_SCH_IDX) |
+                 le32_encode_bits(slot_idx, RTW89_H2C_MRC_DEL_W0_STOP_SLOT_IDX);
 
        rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
                              H2C_CAT_MAC,
index 935f89c090547a52f6b9daed3851bedcca77e7db..7d48383c6244d8f61466e41b2b441d280571560d 100644 (file)
@@ -4499,7 +4499,7 @@ int rtw89_fw_h2c_mrc_add(struct rtw89_dev *rtwdev,
                         const struct rtw89_fw_mrc_add_arg *arg);
 int rtw89_fw_h2c_mrc_start(struct rtw89_dev *rtwdev,
                           const struct rtw89_fw_mrc_start_arg *arg);
-int rtw89_fw_h2c_mrc_del(struct rtw89_dev *rtwdev, u8 sch_idx);
+int rtw89_fw_h2c_mrc_del(struct rtw89_dev *rtwdev, u8 sch_idx, u8 slot_idx);
 int rtw89_fw_h2c_mrc_req_tsf(struct rtw89_dev *rtwdev,
                             const struct rtw89_fw_mrc_req_tsf_arg *arg,
                             struct rtw89_mac_mrc_tsf_rpt *rpt);