summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--wmi/inc/wmi_unified_param.h17
-rw-r--r--wmi/src/wmi_unified_tlv.c46
2 files changed, 54 insertions, 9 deletions
diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h
index 28439c85e52d..e3d747e1c24d 100644
--- a/wmi/inc/wmi_unified_param.h
+++ b/wmi/inc/wmi_unified_param.h
@@ -2339,7 +2339,7 @@ struct plm_req_params {
#define MAX_SSID_ALLOWED_LIST 4
#define MAX_BSSID_AVOID_LIST 16
#define MAX_BSSID_FAVORED 16
-
+#define MAX_RSSI_AVOID_BSSID_LIST 10
/**
* struct mac_ts_info_tfc - mac ts info parameters
@@ -3277,6 +3277,19 @@ struct ssid_hotlist_param {
};
/**
+ * struct rssi_disallow_bssid - Structure holding Rssi based avoid candidate
+ * @bssid: BSSID of the AP
+ * @remaining_duration: remaining disallow duration in ms
+ * @expected_rssi: RSSI at which STA can initate in dBm
+ */
+struct rssi_disallow_bssid {
+ struct qdf_mac_addr bssid;
+ uint32_t remaining_duration;
+ int8_t expected_rssi;
+};
+
+
+/**
* struct roam_scan_filter_params - Structure holding roaming scan
* parameters
* @op_bitmap: bitmap to determine reason of roaming
@@ -3321,6 +3334,8 @@ struct roam_scan_filter_params {
uint32_t disallow_duration;
uint32_t rssi_channel_penalization;
uint32_t num_disallowed_aps;
+ uint32_t num_rssi_rejection_ap;
+ struct rssi_disallow_bssid rssi_rejection_ap[MAX_RSSI_AVOID_BSSID_LIST];
};
/**
diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c
index f29a3911fa84..cc6733af1f46 100644
--- a/wmi/src/wmi_unified_tlv.c
+++ b/wmi/src/wmi_unified_tlv.c
@@ -5034,7 +5034,7 @@ QDF_STATUS send_roam_scan_filter_cmd_tlv(wmi_unified_t wmi_handle,
wmi_buf_t buf = NULL;
QDF_STATUS status;
uint32_t i;
- uint32_t len;
+ uint32_t len, blist_len = 0;
uint8_t *buf_ptr;
wmi_roam_filter_fixed_param *roam_filter;
uint8_t *bssid_src_ptr = NULL;
@@ -5042,6 +5042,7 @@ QDF_STATUS send_roam_scan_filter_cmd_tlv(wmi_unified_t wmi_handle,
wmi_ssid *ssid_ptr = NULL;
uint32_t *bssid_preferred_factor_ptr = NULL;
wmi_roam_lca_disallow_config_tlv_param *blist_param;
+ wmi_roam_rssi_rejection_oce_config_param *rssi_rej;
len = sizeof(wmi_roam_filter_fixed_param);
@@ -5056,9 +5057,15 @@ QDF_STATUS send_roam_scan_filter_cmd_tlv(wmi_unified_t wmi_handle,
len += roam_req->num_bssid_preferred_list * sizeof(wmi_mac_addr);
len += roam_req->num_bssid_preferred_list * sizeof(A_UINT32);
}
- if (roam_req->lca_disallow_config_present)
- len += WMI_TLV_HDR_SIZE +
- sizeof(wmi_roam_lca_disallow_config_tlv_param);
+ len += WMI_TLV_HDR_SIZE;
+ if (roam_req->lca_disallow_config_present) {
+ len += sizeof(*blist_param);
+ blist_len = sizeof(*blist_param);
+ }
+
+ len += WMI_TLV_HDR_SIZE;
+ if (roam_req->num_rssi_rejection_ap)
+ len += roam_req->num_rssi_rejection_ap * sizeof(*rssi_rej);
buf = wmi_buf_alloc(wmi_handle, len);
if (!buf) {
@@ -5079,6 +5086,8 @@ QDF_STATUS send_roam_scan_filter_cmd_tlv(wmi_unified_t wmi_handle,
roam_filter->num_ssid_white_list = roam_req->num_ssid_white_list;
roam_filter->num_bssid_preferred_list =
roam_req->num_bssid_preferred_list;
+ roam_filter->num_rssi_rejection_ap =
+ roam_req->num_rssi_rejection_ap;
buf_ptr += sizeof(wmi_roam_filter_fixed_param);
WMITLV_SET_HDR((buf_ptr),
@@ -5130,11 +5139,10 @@ QDF_STATUS send_roam_scan_filter_cmd_tlv(wmi_unified_t wmi_handle,
buf_ptr += WMI_TLV_HDR_SIZE +
(roam_req->num_bssid_preferred_list * sizeof(uint32_t));
+ WMITLV_SET_HDR(buf_ptr,
+ WMITLV_TAG_ARRAY_STRUC, blist_len);
+ buf_ptr += WMI_TLV_HDR_SIZE;
if (roam_req->lca_disallow_config_present) {
- WMITLV_SET_HDR(buf_ptr,
- WMITLV_TAG_ARRAY_STRUC,
- sizeof(wmi_roam_lca_disallow_config_tlv_param));
- buf_ptr += WMI_TLV_HDR_SIZE;
blist_param =
(wmi_roam_lca_disallow_config_tlv_param *) buf_ptr;
WMITLV_SET_HDR(&blist_param->tlv_header,
@@ -5150,6 +5158,28 @@ QDF_STATUS send_roam_scan_filter_cmd_tlv(wmi_unified_t wmi_handle,
buf_ptr += (sizeof(wmi_roam_lca_disallow_config_tlv_param));
}
+ WMITLV_SET_HDR(buf_ptr,
+ WMITLV_TAG_ARRAY_STRUC,
+ (roam_req->num_rssi_rejection_ap * sizeof(*rssi_rej)));
+ buf_ptr += WMI_TLV_HDR_SIZE;
+ for (i = 0; i < roam_req->num_rssi_rejection_ap; i++) {
+ rssi_rej =
+ (wmi_roam_rssi_rejection_oce_config_param *) buf_ptr;
+ WMITLV_SET_HDR(&rssi_rej->tlv_header,
+ WMITLV_TAG_STRUC_wmi_roam_rssi_rejection_oce_config_param,
+ WMITLV_GET_STRUCT_TLVLEN(
+ wmi_roam_rssi_rejection_oce_config_param));
+ WMI_CHAR_ARRAY_TO_MAC_ADDR(
+ roam_req->rssi_rejection_ap[i].bssid.bytes,
+ &rssi_rej->bssid);
+ rssi_rej->remaining_disallow_duration =
+ roam_req->rssi_rejection_ap[i].remaining_duration;
+ rssi_rej->requested_rssi =
+ (A_INT32)roam_req->rssi_rejection_ap[i].expected_rssi;
+ buf_ptr +=
+ (sizeof(wmi_roam_rssi_rejection_oce_config_param));
+ }
+
status = wmi_unified_cmd_send(wmi_handle, buf,
len, WMI_ROAM_FILTER_CMDID);
if (QDF_IS_STATUS_ERROR(status)) {