wifi: rtw89: 8922a: download template probe requests for 6 GHz band
authorPo-Hao Huang <phhuang@realtek.com>
Thu, 28 Mar 2024 05:26:55 +0000 (13:26 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Wed, 3 Apr 2024 02:22:41 +0000 (10:22 +0800)
8922a FW supports RNR parsing, provide template probe requests and
let FW do the replacement for SSID/BSSID/short SSIDs.
Don't declare WIPHY_FLAG_SPLIT_SCAN_6GHZ so proper IEs such as
6 GHz capabilities can be passed down within the same scan request.

Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://msgid.link/20240328052656.18823-3-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.c
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/rtw8851b.c
drivers/net/wireless/realtek/rtw89/rtw8852a.c
drivers/net/wireless/realtek/rtw89/rtw8852b.c
drivers/net/wireless/realtek/rtw89/rtw8852c.c
drivers/net/wireless/realtek/rtw89/rtw8922a.c

index d474b8d5df3dd8c5e2c7589d84fad6c389429fda..1de40fa5cd9de42941fad2de9994ddf18775fe0b 100644 (file)
@@ -4486,7 +4486,11 @@ static int rtw89_core_register_hw(struct rtw89_dev *rtwdev)
 
        hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS |
                            WIPHY_FLAG_TDLS_EXTERNAL_SETUP |
-                           WIPHY_FLAG_AP_UAPSD | WIPHY_FLAG_SPLIT_SCAN_6GHZ;
+                           WIPHY_FLAG_AP_UAPSD;
+
+       if (!chip->support_rnr)
+               hw->wiphy->flags |= WIPHY_FLAG_SPLIT_SCAN_6GHZ;
+
        hw->wiphy->features |= NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
 
        hw->wiphy->max_scan_ssids = RTW89_SCANOFLD_MAX_SSID;
index fc1ed8612cf133945388e970a647ebce2c763279..12133bc3e8106315ddd7ead5c22b3d47cc77a168 100644 (file)
@@ -3981,6 +3981,7 @@ struct rtw89_chip_info {
        u8 support_bands;
        u16 support_bandwidths;
        bool support_unii4;
+       bool support_rnr;
        bool ul_tb_waveform_ctrl;
        bool ul_tb_pwr_diff;
        bool hw_sec_hdr;
index f27486d35cbcd9847c5812b01cc0d0685e8e9be1..18bef266b56f0c4c7ba3c1ddc93d3bbdcada2d22 100644 (file)
@@ -4692,6 +4692,7 @@ int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
        struct rtw89_h2c_scanofld_be_macc_role *macc_role;
        struct rtw89_chan *op = &scan_info->op_chan;
        struct rtw89_h2c_scanofld_be_opch *opch;
+       struct rtw89_pktofld_info *pkt_info;
        struct rtw89_h2c_scanofld_be *h2c;
        struct sk_buff *skb;
        u8 macc_role_size = sizeof(*macc_role) * option->num_macc_role;
@@ -4716,6 +4717,16 @@ int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
        h2c = (struct rtw89_h2c_scanofld_be *)skb->data;
        ptr = skb->data;
 
+       memset(probe_id, RTW89_SCANOFLD_PKT_NONE, sizeof(probe_id));
+
+       list_for_each_entry(pkt_info, &scan_info->pkt_list[NL80211_BAND_6GHZ], list) {
+               if (pkt_info->wildcard_6ghz) {
+                       /* Provide wildcard as template */
+                       probe_id[NL80211_BAND_6GHZ] = pkt_info->id;
+                       break;
+               }
+       }
+
        h2c->w0 = le32_encode_bits(option->operation, RTW89_H2C_SCANOFLD_BE_W0_OP) |
                  le32_encode_bits(option->scan_mode,
                                   RTW89_H2C_SCANOFLD_BE_W0_SCAN_MODE) |
@@ -5553,6 +5564,7 @@ static bool rtw89_is_6ghz_wildcard_probe_req(struct rtw89_dev *rtwdev,
                info->ssid_len = req->ssids[ssid_idx].ssid_len;
                return false;
        } else {
+               info->wildcard_6ghz = true;
                return true;
        }
 }
@@ -5587,12 +5599,8 @@ static int rtw89_append_probe_req_ie(struct rtw89_dev *rtwdev,
                        goto out;
                }
 
-               if (rtw89_is_6ghz_wildcard_probe_req(rtwdev, rtwvif, info, band,
-                                                    ssid_idx)) {
-                       kfree_skb(new);
-                       kfree(info);
-                       goto out;
-               }
+               rtw89_is_6ghz_wildcard_probe_req(rtwdev, rtwvif, info, band,
+                                                ssid_idx);
 
                ret = rtw89_fw_h2c_add_pkt_offload(rtwdev, &info->id, new);
                if (ret) {
@@ -5750,6 +5758,10 @@ static void rtw89_hw_scan_add_chan(struct rtw89_dev *rtwdev, int chan_type,
                                continue;
                        else if (info->channel_6ghz && probe_count != 0)
                                ch_info->period += RTW89_CHANNEL_TIME_6G;
+
+                       if (info->wildcard_6ghz)
+                               continue;
+
                        ch_info->pkt_id[probe_count++] = info->id;
                        if (probe_count >= RTW89_SCANOFLD_MAX_SSID)
                                break;
@@ -5804,6 +5816,10 @@ static void rtw89_hw_scan_add_chan_be(struct rtw89_dev *rtwdev, int chan_type,
                        if (info->channel_6ghz &&
                            ch_info->pri_ch != info->channel_6ghz)
                                continue;
+
+                       if (info->wildcard_6ghz)
+                               continue;
+
                        ch_info->pkt_id[probe_count++] = info->id;
                        if (probe_count >= RTW89_SCANOFLD_MAX_SSID)
                                break;
index a7e78a881f7f73a2526864d87a7a6ee4f5ecc27d..d247fe4b3bb13f35a22d1459a4c5d8c490025286 100644 (file)
@@ -340,8 +340,9 @@ struct rtw89_mac_chinfo_be {
 struct rtw89_pktofld_info {
        struct list_head list;
        u8 id;
+       bool wildcard_6ghz;
 
-       /* Below fields are for 6 GHz RNR use only */
+       /* Below fields are for WiFi 6 chips 6 GHz RNR use only */
        u8 ssid[IEEE80211_MAX_SSID_LEN];
        u8 ssid_len;
        u8 bssid[ETH_ALEN];
index 51d3e61eaa1d42c2ffafaed4e2de80235ad477dc..2e89c18fbf19dcc5c794bf195a343145975bd8db 100644 (file)
@@ -2447,6 +2447,7 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
        .dig_regs               = &rtw8851b_dig_regs,
        .tssi_dbw_table         = NULL,
        .support_chanctx_num    = 0,
+       .support_rnr            = false,
        .support_bands          = BIT(NL80211_BAND_2GHZ) |
                                  BIT(NL80211_BAND_5GHZ),
        .support_bandwidths     = BIT(NL80211_CHAN_WIDTH_20) |
index 2deadec715cf7a91297e6f733c1ef1a2dce5b4f8..e93cee1456bda33b99e5d41e3669ec355064f6cc 100644 (file)
@@ -2163,6 +2163,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
        .dig_regs               = &rtw8852a_dig_regs,
        .tssi_dbw_table         = NULL,
        .support_chanctx_num    = 1,
+       .support_rnr            = false,
        .support_bands          = BIT(NL80211_BAND_2GHZ) |
                                  BIT(NL80211_BAND_5GHZ),
        .support_bandwidths     = BIT(NL80211_CHAN_WIDTH_20) |
index d025c4135e1c8c696f81a90fd0e674d64c512cb7..85908c55baa9f69ae1f148cb3727ca3e587ce52d 100644 (file)
@@ -2597,6 +2597,7 @@ const struct rtw89_chip_info rtw8852b_chip_info = {
        .dig_regs               = &rtw8852b_dig_regs,
        .tssi_dbw_table         = NULL,
        .support_chanctx_num    = 0,
+       .support_rnr            = false,
        .support_bands          = BIT(NL80211_BAND_2GHZ) |
                                  BIT(NL80211_BAND_5GHZ),
        .support_bandwidths     = BIT(NL80211_CHAN_WIDTH_20) |
index 17e6164855fa128e9cfab7116b085a49571a44fd..db354afc486e85d892e0ffbd8a4fbf5592578d6f 100644 (file)
@@ -2934,6 +2934,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
        .dig_regs               = &rtw8852c_dig_regs,
        .tssi_dbw_table         = &rtw89_8852c_tssi_dbw_table,
        .support_chanctx_num    = 2,
+       .support_rnr            = false,
        .support_bands          = BIT(NL80211_BAND_2GHZ) |
                                  BIT(NL80211_BAND_5GHZ) |
                                  BIT(NL80211_BAND_6GHZ),
index 0a5dc429b46d8da8ba52c2d698b1fc609ef721f3..b45a96fd05409f4719686ebf4723237771a6e65e 100644 (file)
@@ -2545,6 +2545,7 @@ const struct rtw89_chip_info rtw8922a_chip_info = {
        .dig_regs               = &rtw8922a_dig_regs,
        .tssi_dbw_table         = NULL,
        .support_chanctx_num    = 2,
+       .support_rnr            = true,
        .support_bands          = BIT(NL80211_BAND_2GHZ) |
                                  BIT(NL80211_BAND_5GHZ) |
                                  BIT(NL80211_BAND_6GHZ),