Browse Source

qcacld-3.0: Enable vdev manager support for LFR3.0

Enable vdev manager support for LFR3.0

Change-Id: I5e8a420eadd98786fe43d7d6e60980209f7a42e1
CRs-Fixed: 2405842
Sandeep Puligilla 6 years ago
parent
commit
3746d5db95

+ 21 - 0
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,

+ 14 - 0
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

+ 14 - 0
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

+ 74 - 13
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

+ 16 - 0
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)
 {