]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: ps: refactor channel info to firmware before entering PS
authorPing-Ke Shih <pkshih@realtek.com>
Fri, 6 Dec 2024 05:57:11 +0000 (13:57 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Thu, 12 Dec 2024 02:17:02 +0000 (10:17 +0800)
In PS mode, firmware needs hardware parameters related to channel info
to configure hardware itself. Before entering PS, driver prepares these
info to firmware via firmware H2C command.

Since firmware only consider PS for single one vif, change the argument
of entry function to rtwvif, and only consider first link for this old
H2C command that only support legacy.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20241206055716.18598-3-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/fw.c
drivers/net/wireless/realtek/rtw89/fw.h
drivers/net/wireless/realtek/rtw89/ps.c

index c604ea1d39f17929396feaecbe0e50ccacfb8c9b..d17c6037c9a65ef3d1172480af9f1e482bb10ce4 100644 (file)
@@ -2594,14 +2594,17 @@ fail:
        return ret;
 }
 
-int rtw89_fw_h2c_lps_ch_info(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link)
+int rtw89_fw_h2c_lps_ch_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
 {
-       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
-                                                      rtwvif_link->chanctx_idx);
        const struct rtw89_chip_info *chip = rtwdev->chip;
+       const struct rtw89_chan *chan;
+       struct rtw89_vif_link *rtwvif_link;
        struct rtw89_h2c_lps_ch_info *h2c;
        u32 len = sizeof(*h2c);
+       unsigned int link_id;
        struct sk_buff *skb;
+       bool no_chan = true;
+       u8 phy_idx;
        u32 done;
        int ret;
 
@@ -2616,11 +2619,27 @@ int rtw89_fw_h2c_lps_ch_info(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rt
        skb_put(skb, len);
        h2c = (struct rtw89_h2c_lps_ch_info *)skb->data;
 
-       h2c->info[0].central_ch = chan->channel;
-       h2c->info[0].pri_ch = chan->primary_channel;
-       h2c->info[0].band = chan->band_type;
-       h2c->info[0].bw = chan->band_width;
-       h2c->mlo_dbcc_mode_lps = cpu_to_le32(MLO_2_PLUS_0_1RF);
+       rtw89_vif_for_each_link(rtwvif, rtwvif_link, link_id) {
+               phy_idx = rtwvif_link->phy_idx;
+               if (phy_idx >= ARRAY_SIZE(h2c->info))
+                       continue;
+
+               chan = rtw89_chan_get(rtwdev, rtwvif_link->chanctx_idx);
+               no_chan = false;
+
+               h2c->info[phy_idx].central_ch = chan->channel;
+               h2c->info[phy_idx].pri_ch = chan->primary_channel;
+               h2c->info[phy_idx].band = chan->band_type;
+               h2c->info[phy_idx].bw = chan->band_width;
+       }
+
+       if (no_chan) {
+               rtw89_err(rtwdev, "no chan for h2c lps_ch_info\n");
+               ret = -ENOENT;
+               goto fail;
+       }
+
+       h2c->mlo_dbcc_mode_lps = cpu_to_le32(rtwdev->mlo_dbcc_mode);
 
        rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
                              H2C_CAT_OUTSRC, H2C_CL_OUTSRC_DM,
index 95681c390bb844ce395f7ac13a668801985106da..b38705868caae64e89edaa018a27825a182e6fd1 100644 (file)
@@ -4638,8 +4638,7 @@ int rtw89_fw_h2c_init_ba_cam_users(struct rtw89_dev *rtwdev, u8 users,
 
 int rtw89_fw_h2c_lps_parm(struct rtw89_dev *rtwdev,
                          struct rtw89_lps_parm *lps_param);
-int rtw89_fw_h2c_lps_ch_info(struct rtw89_dev *rtwdev,
-                            struct rtw89_vif_link *rtwvif_link);
+int rtw89_fw_h2c_lps_ch_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
 int rtw89_fw_h2c_fwips(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
                       bool enable);
 struct sk_buff *rtw89_fw_h2c_alloc_skb_with_hdr(struct rtw89_dev *rtwdev, u32 len);
index 5e3a5e3c9776fdfeae0db266e6a2c11cd8a0fbbd..a8b4b9095dc818c9dd0a84ce9c72728daecf414b 100644 (file)
@@ -93,7 +93,6 @@ static void __rtw89_enter_lps_link(struct rtw89_dev *rtwdev,
 
        rtw89_btc_ntfy_radio_state(rtwdev, BTC_RFCTRL_FW_CTRL);
        rtw89_fw_h2c_lps_parm(rtwdev, &lps_param);
-       rtw89_fw_h2c_lps_ch_info(rtwdev, rtwvif_link);
 }
 
 static void __rtw89_leave_lps(struct rtw89_dev *rtwdev,
@@ -137,6 +136,8 @@ void rtw89_enter_lps(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
                        can_ps_mode = false;
        }
 
+       rtw89_fw_h2c_lps_ch_info(rtwdev, rtwvif);
+
        if (ps_mode && can_ps_mode)
                __rtw89_enter_ps_mode(rtwdev);
 }