OSDN Git Service

ath11k: Add support for 6g scan hint
authorPradeep Kumar Chitrapu <pradeepc@codeaurora.org>
Tue, 9 Jun 2020 06:31:04 +0000 (09:31 +0300)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 11 Jun 2020 05:05:21 +0000 (08:05 +0300)
Add support for 6Ghz short ssid and bssid hint mechanism
as part of scan command.

Signed-off-by: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20200603001724.12161-9-pradeepc@codeaurora.org
drivers/net/wireless/ath/ath11k/wmi.c
drivers/net/wireless/ath/ath11k/wmi.h

index 2f9a459..8191cb0 100644 (file)
@@ -2005,6 +2005,8 @@ int ath11k_wmi_send_scan_start_cmd(struct ath11k *ar,
        int i, ret, len;
        u32 *tmp_ptr;
        u8 extraie_len_with_pad = 0;
+       struct hint_short_ssid *s_ssid = NULL;
+       struct hint_bssid *hint_bssid = NULL;
 
        len = sizeof(*cmd);
 
@@ -2026,6 +2028,14 @@ int ath11k_wmi_send_scan_start_cmd(struct ath11k *ar,
                        roundup(params->extraie.len, sizeof(u32));
        len += extraie_len_with_pad;
 
+       if (params->num_hint_bssid)
+               len += TLV_HDR_SIZE +
+                      params->num_hint_bssid * sizeof(struct hint_bssid);
+
+       if (params->num_hint_s_ssid)
+               len += TLV_HDR_SIZE +
+                      params->num_hint_s_ssid * sizeof(struct hint_short_ssid);
+
        skb = ath11k_wmi_alloc_skb(wmi->wmi_ab, len);
        if (!skb)
                return -ENOMEM;
@@ -2126,6 +2136,68 @@ int ath11k_wmi_send_scan_start_cmd(struct ath11k *ar,
 
        ptr += extraie_len_with_pad;
 
+       if (params->num_hint_s_ssid) {
+               len = params->num_hint_s_ssid * sizeof(struct hint_short_ssid);
+               tlv = ptr;
+               tlv->header = FIELD_PREP(WMI_TLV_TAG, WMI_TAG_ARRAY_FIXED_STRUCT) |
+                             FIELD_PREP(WMI_TLV_LEN, len);
+               ptr += TLV_HDR_SIZE;
+               s_ssid = ptr;
+               for (i = 0; i < params->num_hint_s_ssid; ++i) {
+                       s_ssid->freq_flags = params->hint_s_ssid[i].freq_flags;
+                       s_ssid->short_ssid = params->hint_s_ssid[i].short_ssid;
+                       s_ssid++;
+               }
+               ptr += len;
+       }
+
+       if (params->num_hint_bssid) {
+               len = params->num_hint_bssid * sizeof(struct hint_bssid);
+               tlv = ptr;
+               tlv->header = FIELD_PREP(WMI_TLV_TAG, WMI_TAG_ARRAY_FIXED_STRUCT) |
+                             FIELD_PREP(WMI_TLV_LEN, len);
+               ptr += TLV_HDR_SIZE;
+               hint_bssid = ptr;
+               for (i = 0; i < params->num_hint_bssid; ++i) {
+                       hint_bssid->freq_flags =
+                               params->hint_bssid[i].freq_flags;
+                       ether_addr_copy(&params->hint_bssid[i].bssid.addr[0],
+                                       &hint_bssid->bssid.addr[0]);
+                       hint_bssid++;
+               }
+       }
+
+       len = params->num_hint_s_ssid * sizeof(struct hint_short_ssid);
+       tlv = ptr;
+       tlv->header = FIELD_PREP(WMI_TLV_TAG, WMI_TAG_ARRAY_FIXED_STRUCT) |
+                     FIELD_PREP(WMI_TLV_LEN, len);
+       ptr += TLV_HDR_SIZE;
+       if (params->num_hint_s_ssid) {
+               s_ssid = ptr;
+               for (i = 0; i < params->num_hint_s_ssid; ++i) {
+                       s_ssid->freq_flags = params->hint_s_ssid[i].freq_flags;
+                       s_ssid->short_ssid = params->hint_s_ssid[i].short_ssid;
+                       s_ssid++;
+               }
+       }
+       ptr += len;
+
+       len = params->num_hint_bssid * sizeof(struct hint_bssid);
+       tlv = ptr;
+       tlv->header = FIELD_PREP(WMI_TLV_TAG, WMI_TAG_ARRAY_FIXED_STRUCT) |
+                     FIELD_PREP(WMI_TLV_LEN, len);
+       ptr += TLV_HDR_SIZE;
+       if (params->num_hint_bssid) {
+               hint_bssid = ptr;
+               for (i = 0; i < params->num_hint_bssid; ++i) {
+                       hint_bssid->freq_flags =
+                               params->hint_bssid[i].freq_flags;
+                       ether_addr_copy(&params->hint_bssid[i].bssid.addr[0],
+                                       &hint_bssid->bssid.addr[0]);
+                       hint_bssid++;
+               }
+       }
+
        ret = ath11k_wmi_cmd_send(wmi, skb,
                                  WMI_START_SCAN_CMDID);
        if (ret) {
index 319ad72..1162bd7 100644 (file)
@@ -50,6 +50,14 @@ struct wmi_tlv {
 #define WMI_MAX_MEM_REQS        32
 #define ATH11K_MAX_HW_LISTEN_INTERVAL 5
 
+#define WLAN_SCAN_MAX_HINT_S_SSID        10
+#define WLAN_SCAN_MAX_HINT_BSSID         10
+#define MAX_RNR_BSS                    5
+
+#define WLAN_SCAN_MAX_HINT_S_SSID        10
+#define WLAN_SCAN_MAX_HINT_BSSID         10
+#define MAX_RNR_BSS                    5
+
 #define WLAN_SCAN_PARAMS_MAX_SSID    16
 #define WLAN_SCAN_PARAMS_MAX_BSSID   4
 #define WLAN_SCAN_PARAMS_MAX_IE_LEN  256
@@ -3105,6 +3113,16 @@ enum {
        ((flag) |= (((mode) << WMI_SCAN_DWELL_MODE_SHIFT) & \
                    WMI_SCAN_DWELL_MODE_MASK))
 
+struct hint_short_ssid {
+       u32 freq_flags;
+       u32 short_ssid;
+};
+
+struct hint_bssid {
+       u32 freq_flags;
+       struct wmi_mac_addr bssid;
+};
+
 struct scan_req_params {
        u32 scan_id;
        u32 scan_req_id;
@@ -3184,6 +3202,10 @@ struct scan_req_params {
        struct element_info extraie;
        struct element_info htcap;
        struct element_info vhtcap;
+       u32 num_hint_s_ssid;
+       u32 num_hint_bssid;
+       struct hint_short_ssid hint_s_ssid[WLAN_SCAN_MAX_HINT_S_SSID];
+       struct hint_bssid hint_bssid[WLAN_SCAN_MAX_HINT_BSSID];
 };
 
 struct wmi_ssid_arg {