mirror of
https://github.com/torvalds/linux.git
synced 2026-06-01 11:03:43 +02:00
wifi: rtw89: mcc: stop at a role holding chanctx
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
This commit is contained in:
parent
62c5a91b25
commit
39b9271095
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user