diff options
| -rw-r--r-- | wmi/inc/wmi_unified_param.h | 17 | ||||
| -rw-r--r-- | wmi/src/wmi_unified_tlv.c | 46 |
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)) { |
