Browse Source

qcacld-3.0: Free up ndp sme command resources at sme close

This is qcacld-2.0 to qcacld-3.0 propagation

Free up memory allocated for NDP SME commands at sme_close, so that in
the event of unload while NDP command response was awaited, resources
can be freed.

Change-Id: I287ad77cbdca4b816f38bea436173b88e6eafc93
CRs-Fixed: 962367
Naveen Rawat 8 years ago
parent
commit
64a9a1a5b3
3 changed files with 83 additions and 12 deletions
  1. 12 0
      core/sme/inc/sme_nan_datapath.h
  2. 12 0
      core/sme/src/csr/csr_api_roam.c
  3. 59 12
      core/sme/src/nan/nan_datapath_api.c

+ 12 - 0
core/sme/inc/sme_nan_datapath.h

@@ -124,6 +124,11 @@ void sme_ndp_msg_processor(tpAniSirGlobal mac_ctx, cds_msg_t *msg);
 
 QDF_STATUS csr_process_ndp_responder_request(tpAniSirGlobal mac_ctx,
 							tSmeCmd *cmd);
+
+void csr_release_ndp_initiator_req(tpAniSirGlobal mac_ctx, tSmeCmd *cmd);
+void csr_release_ndp_responder_req(tpAniSirGlobal mac_ctx, tSmeCmd *cmd);
+void csr_release_ndp_data_end_req(tpAniSirGlobal mac_ctx, tSmeCmd *cmd);
+
 #else
 
 /* Start NDI BSS */
@@ -189,5 +194,12 @@ static inline QDF_STATUS csr_process_ndp_data_end_request(
 	return QDF_STATUS_SUCCESS;
 }
 
+static inline void csr_release_ndp_initiator_req(tpAniSirGlobal mac_ctx,
+						 tSmeCmd *cmd) {}
+static inline void csr_release_ndp_responder_req(tpAniSirGlobal mac_ctx,
+						 tSmeCmd *cmd) {}
+static inline void csr_release_ndp_data_end_req(tpAniSirGlobal mac_ctx,
+						tSmeCmd *cmd) {}
+
 #endif /* WLAN_FEATURE_NAN_DATAPATH */
 #endif /* __SME_NAN_DATAPATH_H */

+ 12 - 0
core/sme/src/csr/csr_api_roam.c

@@ -1208,6 +1208,18 @@ void csr_abort_command(tpAniSirGlobal pMac, tSmeCmd *pCommand, bool fStopping)
 			csr_release_command_set_key(pMac, pCommand);
 			break;
 
+		case eSmeCommandNdpInitiatorRequest:
+			csr_release_ndp_initiator_req(pMac, pCommand);
+			break;
+
+		case eSmeCommandNdpResponderRequest:
+			csr_release_ndp_responder_req(pMac, pCommand);
+			break;
+
+		case eSmeCommandNdpDataEndInitiatorRequest:
+			csr_release_ndp_data_end_req(pMac, pCommand);
+			break;
+
 		default:
 			sms_log(pMac, LOGW, " CSR abort standard command %d",
 				pCommand->command);

+ 59 - 12
core/sme/src/nan/nan_datapath_api.c

@@ -72,6 +72,7 @@ QDF_STATUS sme_ndp_initiator_req_handler(tHalHandle hal,
 		cmd->u.initiator_req.ndp_info.ndp_app_info =
 			qdf_mem_malloc(req_params->ndp_info.ndp_app_info_len);
 		if (NULL == cmd->u.initiator_req.ndp_info.ndp_app_info) {
+			csr_release_command_roam(mac_ctx, cmd);
 			sme_release_global_lock(&mac_ctx->sme);
 			return QDF_STATUS_E_NOMEM;
 		}
@@ -100,11 +101,7 @@ QDF_STATUS sme_ndp_initiator_req_handler(tHalHandle hal,
 	if (QDF_STATUS_SUCCESS != status) {
 		sms_log(mac_ctx, LOGE, FL("SME enqueue failed, status:%d"),
 			status);
-		qdf_mem_free(cmd->u.initiator_req.ndp_info.ndp_app_info);
-		qdf_mem_free(cmd->u.initiator_req.ndp_config.ndp_cfg);
-		cmd->u.initiator_req.ndp_info.ndp_app_info_len = 0;
-		cmd->u.initiator_req.ndp_config.ndp_cfg_len = 0;
-		csr_release_command_roam(mac_ctx, cmd);
+		csr_release_ndp_initiator_req(mac_ctx, cmd);
 	}
 
 	sme_release_global_lock(&mac_ctx->sme);
@@ -184,10 +181,7 @@ QDF_STATUS sme_ndp_responder_req_handler(tHalHandle hal,
 	if (QDF_STATUS_SUCCESS != status) {
 		sms_log(mac_ctx, LOGE,
 			FL("SME enqueue failed, status:%d"), status);
-		qdf_mem_free(cmd->u.responder_req.ndp_info.ndp_app_info);
-		qdf_mem_free(cmd->u.responder_req.ndp_config.ndp_cfg);
-		cmd->u.responder_req.ndp_info.ndp_app_info_len = 0;
-		cmd->u.responder_req.ndp_config.ndp_cfg_len = 0;
+		csr_release_ndp_responder_req(mac_ctx, cmd);
 	}
 	sme_release_global_lock(&mac_ctx->sme);
 	return status;
@@ -243,10 +237,8 @@ QDF_STATUS sme_ndp_end_req_handler(tHalHandle hal, struct ndp_end_req *req)
 	if (QDF_STATUS_SUCCESS != status) {
 		sms_log(mac_ctx, LOGE, FL("SME enqueue failed, status:%d"),
 			status);
-		qdf_mem_free(cmd->u.data_end_req);
-		cmd->u.data_end_req = NULL;
 		ret = QDF_STATUS_E_FAILURE;
-		csr_release_command_roam(mac_ctx, cmd);
+		csr_release_ndp_data_end_req(mac_ctx, cmd);
 	}
 
 	sme_release_global_lock(&mac_ctx->sme);
@@ -762,3 +754,58 @@ void sme_ndp_msg_processor(tpAniSirGlobal mac_ctx, cds_msg_t *msg)
 		sme_process_pending_queue(mac_ctx);
 	}
 }
+
+/**
+ * csr_release_ndp_initiator_req() - free resouces from sme command for ndp
+ * initiator request
+ * @mac_ctx: Global MAC context
+ * @cmd: sme command msg
+ *
+ * Return: None
+ */
+void csr_release_ndp_initiator_req(tpAniSirGlobal mac_ctx, tSmeCmd *cmd)
+{
+	qdf_mem_free(cmd->u.initiator_req.ndp_config.ndp_cfg);
+	cmd->u.initiator_req.ndp_config.ndp_cfg = NULL;
+	cmd->u.initiator_req.ndp_config.ndp_cfg_len = 0;
+	qdf_mem_free(cmd->u.initiator_req.ndp_info.ndp_app_info);
+	cmd->u.initiator_req.ndp_info.ndp_app_info = NULL;
+	cmd->u.initiator_req.ndp_info.ndp_app_info_len = 0;
+	sme_release_command(mac_ctx, cmd);
+}
+
+
+/**
+ * csr_release_ndp_responder_req() - free resouces from sme command for ndp
+ * responder request
+ * @mac_ctx: Global MAC context
+ * @cmd: sme command msg
+ *
+ * Return: None
+ */
+void csr_release_ndp_responder_req(tpAniSirGlobal mac_ctx, tSmeCmd *cmd)
+{
+	qdf_mem_free(cmd->u.responder_req.ndp_config.ndp_cfg);
+	cmd->u.responder_req.ndp_config.ndp_cfg = NULL;
+	cmd->u.responder_req.ndp_config.ndp_cfg_len = 0;
+	qdf_mem_free(cmd->u.responder_req.ndp_info.ndp_app_info);
+	cmd->u.responder_req.ndp_info.ndp_app_info = NULL;
+	cmd->u.responder_req.ndp_info.ndp_app_info_len = 0;
+	sme_release_command(mac_ctx, cmd);
+}
+
+
+/**
+ * csr_release_ndp_data_end_req() - free resouces from sme command for ndp
+ * data end request
+ * @mac_ctx: Global MAC context
+ * @cmd: sme command msg
+ *
+ * Return: None
+ */
+void csr_release_ndp_data_end_req(tpAniSirGlobal mac_ctx, tSmeCmd *cmd)
+{
+	qdf_mem_free(cmd->u.data_end_req);
+	cmd->u.data_end_req = NULL;
+	sme_release_command(mac_ctx, cmd);
+}