From 3746d5db95dc0cc5edfa0462fc96c840d8b78ecb Mon Sep 17 00:00:00 2001 From: Sandeep Puligilla Date: Tue, 23 Oct 2018 16:01:11 -0700 Subject: [PATCH] qcacld-3.0: Enable vdev manager support for LFR3.0 Enable vdev manager support for LFR3.0 Change-Id: I5e8a420eadd98786fe43d7d6e60980209f7a42e1 CRs-Fixed: 2405842 --- .../core/src/wlan_mlme_vdev_mgr_interface.c | 21 +++++ core/wma/inc/wma_api.h | 14 +++ core/wma/inc/wma_internal.h | 14 +++ core/wma/src/wma_scan_roam.c | 87 ++++++++++++++++--- core/wma/src/wma_utils.c | 16 ++++ 5 files changed, 139 insertions(+), 13 deletions(-) diff --git a/components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c b/components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c index 150f2c63090e..d79a90d41a37 100644 --- a/components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c +++ b/components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c @@ -197,6 +197,26 @@ static QDF_STATUS sta_mlme_vdev_notify_up_complete(struct vdev_mlme_obj *vdev_ml return QDF_STATUS_SUCCESS; } +/** + * sta_mlme_vdev_notify_roam_start() - MLME vdev Roam start callback + * @vdev_mlme: vdev mlme object + * @event_data_len: event data length + * @event_data: event data + * + * This function is called to VDEV MLME on roaming + * to UP state + * + * Return: QDF_STATUS + */ +static +QDF_STATUS sta_mlme_vdev_notify_roam_start(struct vdev_mlme_obj *vdev_mlme, + uint16_t event_data_len, + void *event_data) +{ + return wma_sta_mlme_vdev_roam_notify(vdev_mlme, event_data_len, + event_data); +} + /** * sta_mlme_vdev_disconnect_bss() - MLME vdev disconnect bss callback * @vdev_mlme: vdev mlme object @@ -715,6 +735,7 @@ static struct vdev_mlme_ops sta_mlme_ops = { .mlme_vdev_sta_conn_start = sta_mlme_vdev_start_connection, .mlme_vdev_up_send = sta_mlme_vdev_up_send, .mlme_vdev_notify_up_complete = sta_mlme_vdev_notify_up_complete, + .mlme_vdev_notify_roam_start = sta_mlme_vdev_notify_roam_start, .mlme_vdev_disconnect_peers = sta_mlme_vdev_disconnect_bss, .mlme_vdev_stop_send = sta_mlme_vdev_stop_send, .mlme_vdev_stop_continue = vdevmgr_mlme_stop_continue, diff --git a/core/wma/inc/wma_api.h b/core/wma/inc/wma_api.h index bae6a85ea2ae..831fd7b32fa8 100644 --- a/core/wma/inc/wma_api.h +++ b/core/wma/inc/wma_api.h @@ -461,6 +461,20 @@ void wma_set_channel_switch_in_progress(struct wma_txrx_node *iface) QDF_STATUS wma_sta_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme, uint16_t data_len, void *data); +/** + * wma_sta_mlme_vdev_roam_notify - VDEV roam notify handling + * @vdev_mlme_obj: VDEV MLME comp object + * @data_len: data size + * @data: event data + * + * API invokes VDEV roam event handling + * + * Return: SUCCESS on successful completion of roam event handling + * FAILURE, if it fails due to any + */ +QDF_STATUS wma_sta_mlme_vdev_roam_notify(struct vdev_mlme_obj *vdev_mlme, + uint16_t data_len, void *data); + /** * wma_ap_mlme_vdev_start_continue - VDEV start response handling * @vdev_mlme_obj: VDEV MLME comp object diff --git a/core/wma/inc/wma_internal.h b/core/wma/inc/wma_internal.h index e67179020993..f7fafce66f00 100644 --- a/core/wma/inc/wma_internal.h +++ b/core/wma/inc/wma_internal.h @@ -205,6 +205,20 @@ void wma_process_roam_synch_fail(WMA_HANDLE handle, int wma_roam_synch_event_handler(void *handle, uint8_t *event, uint32_t len); +/** + * wma_mlme_roam_synch_event_handler_cb() - roam synch event handler + * @handle: wma handle + * @event: event data + * @len: length of data + * + * This function is roam synch event handler. It sends roam + * indication for upper layer. + * + * Return: Success or Failure status + */ +int wma_mlme_roam_synch_event_handler_cb(void *handle, uint8_t *event, + uint32_t len); + /** * wma_roam_synch_frame_event_handler() - roam synch frame event handler * @handle: wma handle diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 01cabae41139..866d0120b453 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -2389,19 +2389,8 @@ static void wma_roam_update_vdev(tp_wma_handle wma, qdf_mem_free(add_sta_params); } -/** - * wma_roam_synch_event_handler() - roam synch event handler - * @handle: wma handle - * @event: event data - * @len: length of data - * - * This function is roam synch event handler. It sends roam - * indication for upper layer. - * - * Return: Success or Failure status - */ -int wma_roam_synch_event_handler(void *handle, uint8_t *event, - uint32_t len) +int wma_mlme_roam_synch_event_handler_cb(void *handle, uint8_t *event, + uint32_t len) { WMI_ROAM_SYNCH_EVENTID_param_tlvs *param_buf = NULL; wmi_roam_synch_event_fixed_param *synch_event = NULL; @@ -2787,6 +2776,78 @@ int wma_roam_synch_frame_event_handler(void *handle, uint8_t *event, return 0; } +#ifdef CONFIG_VDEV_SM +/** + * __wma_roam_synch_event_handler() - roam synch event handler + * @handle: wma handle + * @event: event data + * @len: length of data + * + * This function is roam synch event handler.It sends roam + * indication for upper layer. + * + * Return: Success or Failure status + */ +int wma_roam_synch_event_handler(void *handle, uint8_t *event, + uint32_t len) +{ + QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE; + int status = -EINVAL; + tp_wma_handle wma = (tp_wma_handle) handle; + struct wma_txrx_node *iface = NULL; + wmi_roam_synch_event_fixed_param *synch_event = NULL; + WMI_ROAM_SYNCH_EVENTID_param_tlvs *param_buf = NULL; + + if (!event) { + wma_err_rl("event param null"); + goto cleanup; + } + + param_buf = (WMI_ROAM_SYNCH_EVENTID_param_tlvs *)event; + if (!param_buf) { + wma_err_rl("received null buf from target"); + goto cleanup; + } + synch_event = param_buf->fixed_param; + if (!synch_event) { + wma_err_rl("received null event data from target"); + goto cleanup; + } + + if (synch_event->vdev_id >= wma->max_bssid) { + wma_err_rl("received invalid vdev_id %d", + synch_event->vdev_id); + goto cleanup; + } + + iface = &wma->interfaces[synch_event->vdev_id]; + qdf_status = wlan_vdev_mlme_sm_deliver_evt(iface->vdev, + WLAN_VDEV_SM_EV_ROAM, + sizeof(*synch_event), + synch_event); + if (QDF_IS_STATUS_ERROR(qdf_status)) { + wma_err("Failed to send the EV_ROAM"); + } else { + wma_debug("Posted EV_ROAM to VDEV SM"); + return 0; + } + +cleanup: + if (wma && synch_event) + iface->roam_synch_in_progress = false; + + return status; +} +#else +int wma_roam_synch_event_handler(void *handle, uint8_t *event, + uint32_t len) +{ + wma_mlme_roam_synch_event_handler_cb(handle, event, len); + + return 0; +} +#endif + #define RSN_CAPS_SHIFT 16 /** * wma_roam_scan_fill_self_caps() - fill capabilities diff --git a/core/wma/src/wma_utils.c b/core/wma/src/wma_utils.c index 2b1329079766..3120ea0f9499 100644 --- a/core/wma/src/wma_utils.c +++ b/core/wma/src/wma_utils.c @@ -4923,6 +4923,22 @@ QDF_STATUS wma_sta_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme, return QDF_STATUS_SUCCESS; } +QDF_STATUS wma_sta_mlme_vdev_roam_notify(struct vdev_mlme_obj *vdev_mlme, + uint16_t data_len, void *data) +{ + tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA); + int ret; + QDF_STATUS status = QDF_STATUS_SUCCESS; + + ret = wma_mlme_roam_synch_event_handler_cb(wma, data, data_len); + if (ret != 0) { + wma_err("Failed to process roam synch event"); + status = QDF_STATUS_E_FAILURE; + } + + return status; +} + QDF_STATUS wma_ap_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme, uint16_t data_len, void *data) {