Browse Source

qcacmn: Support multivdev restart response handling

Add TGT_IF change to support consolidated multi vdev restart
response handling.

Change-Id: I8d507dda8f39d36102a7aa7a7baf425335097047
CRs-Fixed: 2595769
Santosh Anbu 5 years ago
parent
commit
99028d078d
1 changed files with 89 additions and 5 deletions
  1. 89 5
      target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c

+ 89 - 5
target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c

@@ -643,6 +643,77 @@ int target_if_vdev_mgr_ext_tbttoffset_update_handler(
 	return qdf_status_to_os_return(status);
 	return qdf_status_to_os_return(status);
 }
 }
 
 
+static int target_if_vdev_mgr_multi_vdev_restart_resp_handler(
+							ol_scn_t scn,
+							uint8_t *data,
+							uint32_t datalen)
+{
+	QDF_STATUS status = QDF_STATUS_E_INVAL;
+	struct wlan_objmgr_psoc *psoc;
+	struct wmi_unified *wmi_handle;
+	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
+	struct multi_vdev_restart_resp restart_resp;
+	struct vdev_response_timer *vdev_rsp;
+	uint8_t max_vdevs, vdev_idx;
+
+	if (!scn || !data) {
+		mlme_err("Invalid input");
+		return -EINVAL;
+	}
+
+	psoc = target_if_get_psoc_from_scn_hdl(scn);
+	if (!psoc) {
+		mlme_err("PSOC is NULL");
+		return -EINVAL;
+	}
+
+	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
+	if (!rx_ops || !rx_ops->vdev_mgr_multi_vdev_restart_resp ||
+	    !rx_ops->psoc_get_vdev_response_timer_info) {
+		mlme_err("No Rx Ops");
+		return -EINVAL;
+	}
+
+	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
+	if (!wmi_handle) {
+		mlme_err("wmi_handle is null");
+		return -EINVAL;
+	}
+
+	qdf_mem_zero(&restart_resp, sizeof(restart_resp));
+	if (wmi_extract_multi_vdev_restart_resp_event(wmi_handle, data,
+						      &restart_resp)) {
+		mlme_err("WMI extract failed");
+		return -EINVAL;
+	}
+
+	max_vdevs = wlan_psoc_get_max_vdev_count(psoc);
+	for (vdev_idx = 0; vdev_idx < max_vdevs; vdev_idx++) {
+		if (!qdf_test_bit(vdev_idx, restart_resp.vdev_id_bmap))
+			continue;
+
+		mlme_debug("PSOC_%d VDEV_%d: Restart resp received",
+			   wlan_psoc_get_id(psoc), vdev_idx);
+		vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc,
+								     vdev_idx);
+		if (!vdev_rsp) {
+			mlme_err("PSOC_%d VDEV_%d: VDEV RSP is NULL",
+				 wlan_psoc_get_id(psoc), vdev_idx);
+			continue;
+		}
+
+		status = target_if_vdev_mgr_rsp_timer_stop(
+				psoc, vdev_rsp, RESTART_RESPONSE_BIT);
+		if (QDF_IS_STATUS_ERROR(status))
+			mlme_err("PSOC_%d VDEV_%d: VDE MGR RSP Timer stop failed",
+				 wlan_psoc_get_id(psoc), vdev_idx);
+	}
+
+	status = rx_ops->vdev_mgr_multi_vdev_restart_resp(psoc, &restart_resp);
+
+	return qdf_status_to_os_return(status);
+}
+
 QDF_STATUS target_if_vdev_mgr_wmi_event_register(
 QDF_STATUS target_if_vdev_mgr_wmi_event_register(
 				struct wlan_objmgr_psoc *psoc)
 				struct wlan_objmgr_psoc *psoc)
 {
 {
@@ -692,6 +763,14 @@ QDF_STATUS target_if_vdev_mgr_wmi_event_register(
 	if (retval)
 	if (retval)
 		mlme_err("failed to register for peer delete all response");
 		mlme_err("failed to register for peer delete all response");
 
 
+	retval = wmi_unified_register_event_handler(
+			wmi_handle,
+			wmi_pdev_multi_vdev_restart_response_event_id,
+			target_if_vdev_mgr_multi_vdev_restart_resp_handler,
+			VDEV_RSP_RX_CTX);
+	if (retval)
+		mlme_err("failed to register for multivdev restart response");
+
 	return qdf_status_from_os_return(retval);
 	return qdf_status_from_os_return(retval);
 }
 }
 
 
@@ -711,17 +790,22 @@ QDF_STATUS target_if_vdev_mgr_wmi_event_unregister(
 		return QDF_STATUS_E_INVAL;
 		return QDF_STATUS_E_INVAL;
 	}
 	}
 
 
+	wmi_unified_unregister_event_handler(
+			wmi_handle,
+			wmi_pdev_multi_vdev_restart_response_event_id);
+
+	wmi_unified_unregister_event_handler(
+			wmi_handle,
+			wmi_peer_delete_all_response_event_id);
+
 	wmi_unified_unregister_event_handler(wmi_handle,
 	wmi_unified_unregister_event_handler(wmi_handle,
-					     wmi_vdev_stopped_event_id);
+					     wmi_vdev_start_resp_event_id);
 
 
 	wmi_unified_unregister_event_handler(wmi_handle,
 	wmi_unified_unregister_event_handler(wmi_handle,
 					     wmi_vdev_delete_resp_event_id);
 					     wmi_vdev_delete_resp_event_id);
 
 
 	wmi_unified_unregister_event_handler(wmi_handle,
 	wmi_unified_unregister_event_handler(wmi_handle,
-					     wmi_vdev_start_resp_event_id);
+					     wmi_vdev_stopped_event_id);
 
 
-	wmi_unified_unregister_event_handler(
-					wmi_handle,
-					wmi_peer_delete_all_response_event_id);
 	return QDF_STATUS_SUCCESS;
 	return QDF_STATUS_SUCCESS;
 }
 }