diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 0b59a140230a..4490a28d8853 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -2340,7 +2340,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 @@ -3214,6 +3214,19 @@ struct ssid_hotlist_param { int32_t rssi_high; }; +/** + * 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 @@ -3259,6 +3272,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 e183b3820a34..e7beec6aedba 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -5949,7 +5949,7 @@ static 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; @@ -5957,6 +5957,7 @@ static 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); @@ -5971,9 +5972,15 @@ static 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) { @@ -5994,6 +6001,8 @@ static 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), @@ -6045,11 +6054,10 @@ static 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, @@ -6065,6 +6073,28 @@ static 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)) {