qcacld-3.0: Send roam triggers from vendor cmd to firmware

Userspace can configure different roam triggers as defined
in qca_vendor_roam_triggers through the roam subcmd
QCA_WLAN_VENDOR_ROAMING_SUBCMD_CONTROL_SET and the
attribute QCA_ATTR_ROAM_CONTROL_TRIGGERS. Send the roam trigger
bitmap to firmware

Change-Id: I692110a2ae1ee5a35bb248b9138080a7dfb02cf6
CRs-Fixed: 2508776
This commit is contained in:
Srinivas Dasari 2019-08-22 03:39:48 +05:30 • committed by nshrivas
commit f4e1b1208c
8 changed files with 131 additions and 1 deletions

View file

@ -4112,6 +4112,7 @@ static const struct nla_policy
roam_control_policy[QCA_ATTR_ROAM_CONTROL_MAX + 1] = {
[PARAM_FREQ_LIST_SCHEME] = {.type = NLA_NESTED},
[QCA_ATTR_ROAM_CONTROL_FULL_SCAN_PERIOD] = {.type = NLA_U32},
[QCA_ATTR_ROAM_CONTROL_TRIGGERS] = {.type = NLA_U32},
};
/**
@ -4146,6 +4147,35 @@ hdd_send_roam_full_scan_period_to_sme(struct hdd_context *hdd_ctx,
return status;
}
/**
* hdd_send_roam_triggers_to_sme() - Send roam trigger bitmap to SME
* @hdd_ctx: HDD context
* @vdev_id: vdev id
* @roam_trigger_bitmap: Vendor configured roam trigger bitmap to be configured
* to firmware
*
* Send the roam trigger bitmap received to SME
*
* Return: QDF_STATUS
*/
static QDF_STATUS
hdd_send_roam_triggers_to_sme(struct hdd_context *hdd_ctx,
uint8_t vdev_id,
uint32_t roam_trigger_bitmap)
{
QDF_STATUS status;
struct roam_triggers triggers;
triggers.vdev_id = vdev_id;
triggers.trigger_bitmap = roam_trigger_bitmap;
status = sme_set_roam_triggers(hdd_ctx->mac_handle, &triggers);
if (QDF_IS_STATUS_ERROR(status))
hdd_err("Failed to set roam control trigger bitmap");
return status;
}
/**
* hdd_set_roam_with_control_config() - Set roam control configuration
* @hdd_ctx: HDD context
@ -4199,6 +4229,17 @@ hdd_set_roam_with_control_config(struct hdd_context *hdd_ctx,
hdd_err("failed to config full scan period");
}
if (tb2[QCA_ATTR_ROAM_CONTROL_TRIGGERS]) {
hdd_debug("Parse and send roam triggers to firmware");
value = nla_get_u32(tb2[QCA_ATTR_ROAM_CONTROL_TRIGGERS]);
hdd_debug("Received roam trigger bitmap: 0x%x", value);
status = hdd_send_roam_triggers_to_sme(hdd_ctx,
vdev_id,
value);
if (status)
hdd_err("failed to config roam triggers");
}
return qdf_status_to_os_return(status);
}

View file

@ -665,7 +665,9 @@ struct sir_cfg_action_frm_tb_ppdu {
#define SIR_HAL_SEND_PEER_UNMAP_CONF (SIR_HAL_ITC_MSG_TYPES_BEGIN + 411)
#define SIR_HAL_GET_ISOLATION (SIR_HAL_ITC_MSG_TYPES_BEGIN + 412)
#define SIR_HAL_GET_ISOLATION (SIR_HAL_ITC_MSG_TYPES_BEGIN + 412)
#define SIR_HAL_SET_ROAM_TRIGGERS (SIR_HAL_ITC_MSG_TYPES_BEGIN + 413)
#define SIR_HAL_MSG_TYPES_END (SIR_HAL_MSG_TYPES_BEGIN + 0x1FF)

View file

@ -3633,4 +3633,19 @@ void sme_chan_to_freq_list(
uint32_t *freq_list,
const uint8_t *chan_list,
uint32_t chan_list_len);
/**
* sme_set_roam_triggers() - Send roam trigger bitmap to WMA
* @mac_handle: Opaque handle to the MAC context
* @triggers: Carries pointer of the object containing vdev id and
* roam_trigger_bitmap.
*
* Send the roam trigger bitmap received to WMA/WMI. WMI converts
* the bitmap to firmware compatible bitmap as per reasons
* defined @WMI_ROAM_TRIGGER_REASON_ID
*
* Return: QDF_STATUS
*/
QDF_STATUS sme_set_roam_triggers(mac_handle_t mac_handle,
struct roam_triggers *triggers);
#endif /* #if !defined( __SME_API_H ) */

View file

@ -15994,3 +15994,39 @@ void sme_chan_to_freq_list(
freq_list[count] =
wlan_reg_chan_to_freq(pdev, (uint32_t)chan_list[count]);
}
QDF_STATUS sme_set_roam_triggers(mac_handle_t mac_handle,
struct roam_triggers *triggers)
{
QDF_STATUS status;
struct mac_context *mac = MAC_CONTEXT(mac_handle);
struct scheduler_msg message = {0};
struct roam_triggers *roam_trigger_data;
/* per contract must make a copy of the params when messaging */
roam_trigger_data = qdf_mem_malloc(sizeof(*roam_trigger_data));
if (!roam_trigger_data)
return QDF_STATUS_E_NOMEM;
*roam_trigger_data = *triggers;
status = sme_acquire_global_lock(&mac->sme);
if (QDF_IS_STATUS_ERROR(status)) {
qdf_mem_free(roam_trigger_data);
return status;
}
/* Serialize the req through MC thread */
message.bodyptr = roam_trigger_data;
message.type = SIR_HAL_SET_ROAM_TRIGGERS;
status = scheduler_post_message(QDF_MODULE_ID_SME,
QDF_MODULE_ID_WMA,
QDF_MODULE_ID_WMA,
&message);
sme_release_global_lock(&mac->sme);
if (QDF_IS_STATUS_ERROR(status)) {
sme_err("failed to post ROAM_TRIGGERS msg");
qdf_mem_free(roam_trigger_data);
}
return status;
}

View file

@ -1607,4 +1607,14 @@ void wma_send_vdev_down(tp_wma_handle wma, struct wma_target_req *req);
*/
int wma_cold_boot_cal_event_handler(void *wma_ctx, uint8_t *event_buff,
uint32_t len);
/**
* wma_set_roam_triggers() - Send roam trigger bitmap to WMI
* @wma_handle: wma handle
* @triggers: Carries vdev id and roam trigger bitmap.
*
* Return: Success or Failure status
*/
QDF_STATUS wma_set_roam_triggers(tp_wma_handle wma_handle,
struct roam_triggers *triggers);
#endif

View file

@ -455,6 +455,7 @@
#ifdef WLAN_MWS_INFO_DEBUGFS
#define WMA_GET_MWS_COEX_INFO_REQ SIR_HAL_GET_MWS_COEX_INFO_REQ
#endif
#define WMA_SET_ROAM_TRIGGERS SIR_HAL_SET_ROAM_TRIGGERS
/* Bit 6 will be used to control BD rate for Management frames */
#define HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME 0x40

View file

@ -9149,6 +9149,10 @@ static QDF_STATUS wma_mc_process_msg(struct scheduler_msg *msg)
qdf_mem_free(msg->bodyptr);
break;
#endif
case WMA_SET_ROAM_TRIGGERS:
wma_set_roam_triggers(wma_handle, msg->bodyptr);
qdf_mem_free(msg->bodyptr);
break;
default:
WMA_LOGD("Unhandled WMA message of type %d", msg->type);
if (msg->bodyptr)

View file

@ -5679,3 +5679,24 @@ int wma_handle_btm_blacklist_event(void *handle, uint8_t *cmd_param_info,
wma_send_msg(wma, WMA_ROAM_BLACKLIST_MSG, (void *)dst_list, 0);
return 0;
}
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
QDF_STATUS wma_set_roam_triggers(tp_wma_handle wma,
struct roam_triggers *triggers)
{
if (!wma_is_vdev_valid(triggers->vdev_id)) {
WMA_LOGE("%s: vdev_id: %d is not active", __func__,
triggers->vdev_id);
return QDF_STATUS_E_INVAL;
}
return wmi_unified_set_roam_triggers(wma->wmi_handle, triggers);
}
#else
inline QDF_STATUS
wma_set_roam_triggers(tp_wma_handle wma, struct roam_triggers *triggers)
{
return QDF_STATUS_E_NOSUPPORT;
}
#endif