Merge "wlan: SME changes to support SW PTA" into wlan-driver.lnx.1.0
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 601c91a..5eb95fe 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -6501,4 +6501,31 @@
     uint8_t sae_status;
     tSirMacAddr peer_mac_addr;
 };
+
+#ifdef FEATURE_WLAN_SW_PTA
+/**
+ * enum sir_sw_pta_param_type - Type of sw pta coex param
+ * @SCO_STATUS: Enable/Disable SCO
+ * @NUD_STATUS: Enable/Disable NUD
+ * @BT_STATUS: Enable/Disable BT
+ */
+enum sir_sw_pta_param_type {
+	SCO_STATUS,
+	NUD_STATUS,
+	BT_STATUS,
+};
+
+#define SW_PTA_COEX_PARAMS_MAX_LEN 32
+/**
+ * struct sir_sw_pta_req - sw pta coex params request
+ * @param_type: sw pta coex param type
+ * @length: sw pta coex params value length
+ * @value: sw pta coex params value
+ */
+struct sir_sw_pta_req {
+	enum sir_sw_pta_param_type param_type;
+	uint8_t length;
+	uint8_t value[SW_PTA_COEX_PARAMS_MAX_LEN];
+};
+#endif
 #endif /* __SIR_API_H */
diff --git a/CORE/MAC/inc/wniApi.h b/CORE/MAC/inc/wniApi.h
index 67839eb..e1ea5a5 100644
--- a/CORE/MAC/inc/wniApi.h
+++ b/CORE/MAC/inc/wniApi.h
@@ -404,6 +404,9 @@
     eWNI_SME_TRIGGER_SAE,
     eWNI_SME_SEND_MGMT_FRAME_TX,
     eWNI_SME_SEND_SAE_MSG,
+#ifdef FEATURE_WLAN_SW_PTA
+    eWNI_SME_SW_PTA_RESP,
+#endif
     eWNI_SME_MSG_TYPES_END
 };
 
diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h
index 51f6b0f..4f76572 100644
--- a/CORE/MAC/src/include/sirParams.h
+++ b/CORE/MAC/src/include/sirParams.h
@@ -832,6 +832,10 @@
 
 #define SIR_HAL_BLACKLIST_REQ              (SIR_HAL_ITC_MSG_TYPES_BEGIN + 308)
 
+#ifdef FEATURE_WLAN_SW_PTA
+#define SIR_HAL_SW_PTA_REQ                (SIR_HAL_ITC_MSG_TYPES_BEGIN + 309)
+#endif
+
 #define SIR_HAL_MSG_TYPES_END              (SIR_HAL_MSG_TYPES_BEGIN + 0x1FF)
 
 // CFG message types
diff --git a/CORE/SME/inc/smeInside.h b/CORE/SME/inc/smeInside.h
index 38aa648..562dad3 100644
--- a/CORE/SME/inc/smeInside.h
+++ b/CORE/SME/inc/smeInside.h
@@ -211,6 +211,9 @@
         tpSirUpdateChanList chan_list;
         tpRoamParams RoamParams;
         bool olpc_mode_enable;
+#ifdef FEATURE_WLAN_SW_PTA
+	struct sir_sw_pta_req *sw_pta_req;
+#endif
     }u;
 }tSmeCmd;
 
diff --git a/CORE/SME/inc/smeInternal.h b/CORE/SME/inc/smeInternal.h
index 1a598ad..907f8d1 100644
--- a/CORE/SME/inc/smeInternal.h
+++ b/CORE/SME/inc/smeInternal.h
@@ -110,6 +110,9 @@
     eSmeCommandRemainOnChannel,
     eSmeCommandNoAUpdate,
     eSmeCommandBlackList,
+#ifdef FEATURE_WLAN_SW_PTA
+    eSmeCommandSwPTAReq,
+#endif
 } eSmeCommandType;
 
 
@@ -195,6 +198,9 @@
    void (*roaming_mbb_callback)(void* mac, tANI_U32 session_id,
           void* bss_description, void *reassoc_req, tANI_U32 csr_roam_op_code);
 #endif
+#ifdef FEATURE_WLAN_SW_PTA
+    void (*sw_pta_resp_cb)(uint8_t status);
+#endif
 } tSmeStruct, *tpSmeStruct;
 
 
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 04cc78b..cb6592c 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -4178,4 +4178,34 @@
  */
 eHalStatus sme_update_olpc_mode(tHalHandle hHal, bool enable);
 
+#ifdef FEATURE_WLAN_SW_PTA
+/**
+ * sme_sw_pta_req() - Send sw pta coex params request to sme
+ * @hal: The handle returned by mac_open
+ * @resp_callback: callback to indicate sw pta response to hdd
+ * @session_id: session id
+ * @type: sw pta coex param type
+ * @length: length of sw pta coex param value
+ * @value: sw pta coex params value
+ *
+ * Return: HAL_STATUS
+ */
+eHalStatus sme_sw_pta_req(tHalHandle hal,
+			  void (*resp_callback)(uint8_t resp_status),
+			  uint8_t session_id, enum sir_sw_pta_param_type type,
+			  uint8_t length, uint8_t *value);
+
+/**
+ * sme_sco_req() - Send sco request status to sme
+ * @hal: The handle returned by mac_open
+ * @resp_callback: callback to indicate sco response to hdd
+ * @session_id: session id
+ * @req_status: sco request status
+ *
+ * Return: HAL_STATUS
+ */
+eHalStatus sme_sco_req(tHalHandle hal,
+		       void (*resp_callback)(uint8_t resp_status),
+		       uint8_t session_id, uint8_t req_status);
+#endif /* FEATURE_WLAN_SW_PTA */
 #endif //#if !defined( __SME_API_H )
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 670a39d..7d83661 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -1022,6 +1022,36 @@
     }
 }
 
+#ifdef FEATURE_WLAN_SW_PTA
+/**
+ * sme_process_sw_pta_req() - Process sw pta request
+ * @mac - context handler
+ * @sme_cmd: cmd param containing sw pta request
+ *
+ * The function sends sw pta request to firmware
+ */
+static void sme_process_sw_pta_req(tpAniSirGlobal mac, tSmeCmd *sme_cmd)
+{
+	tSirRetStatus ret = eSIR_SUCCESS;
+	tSirMsgQ msg;
+
+	msg.type = WDA_SW_PTA_REQ;
+	msg.reserved = 0;
+	msg.bodyptr = sme_cmd->u.sw_pta_req;
+	msg.bodyval = 0;
+
+	ret = wdaPostCtrlMsg(mac, &msg);
+	if (ret != eSIR_SUCCESS) {
+		smsLog(mac, LOGE,
+		       FL("Posting WDA_SW_PTA_REQ to WDA failed, reason=%X"),
+		       ret);
+		vos_mem_free(sme_cmd->u.sw_pta_req);
+	} else {
+		smsLog(mac, LOG1, FL("posted WDA_SW_PTA_REQ command"));
+	}
+}
+#endif /* FEATURE_WLAN_SW_PTA */
+
 tANI_BOOLEAN smeProcessCommand( tpAniSirGlobal pMac )
 {
     tANI_BOOLEAN fContinue = eANI_BOOLEAN_FALSE;
@@ -1499,7 +1529,19 @@
                                       "sme_command_olpc_mode processed");
                             fContinue = eANI_BOOLEAN_TRUE;
                             break;
-
+#ifdef FEATURE_WLAN_SW_PTA
+                        case eSmeCommandSwPTAReq:
+                            csrLLUnlock(&pMac->sme.smeCmdActiveList);
+                            sme_process_sw_pta_req(pMac, pCommand);
+                            if (csrLLRemoveEntry(&pMac->sme.smeCmdActiveList,
+                                &pCommand->Link, LL_ACCESS_LOCK)) {
+                                csrReleaseCommand(pMac, pCommand);
+                            }
+                            VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+                                      "eSmeCommandScoIndReq processed");
+                            fContinue = eANI_BOOLEAN_TRUE;
+                            break;
+#endif /* FEATURE_WLAN_SW_PTA */
                         default:
                             //something is wrong
                             //remove it from the active list
@@ -3182,6 +3224,20 @@
                          FL("Empty message for (eWNI_SME_ECSA_IE_BEACON_COMP_IND)"));
               }
               break;
+#ifdef FEATURE_WLAN_SW_PTA
+          case eWNI_SME_SW_PTA_RESP:
+                MTRACE(vos_trace(VOS_MODULE_ID_SME,
+                       TRACE_CODE_SME_RX_WDA_MSG, NO_SESSION, pMsg->type));
+
+                if (pMac->sme.sw_pta_resp_cb) {
+                   smsLog(pMac, LOGE, FL("sw pta response"));
+                   pMac->sme.sw_pta_resp_cb(pMsg->bodyval);
+                } else {
+                   smsLog(pMac, LOGE,
+                          FL("sw pta response is NULL"));
+                }
+              break;
+#endif
 
           default:
 
@@ -15586,4 +15642,73 @@
     return eHAL_STATUS_SUCCESS;
 }
 
+#ifdef FEATURE_WLAN_SW_PTA
+eHalStatus sme_sw_pta_req(tHalHandle hal,
+			  void (*resp_callback)(uint8_t resp_status),
+			  uint8_t session_id, enum sir_sw_pta_param_type type,
+			  uint8_t length, uint8_t *value)
+{
+	tpAniSirGlobal mac = PMAC_STRUCT(hal);
+	struct sir_sw_pta_req *sw_pta_req;
+	eHalStatus status;
+	tSmeCmd *sme_cmd;
 
+	if (length > SW_PTA_COEX_PARAMS_MAX_LEN) {
+		smsLog(mac, LOGE, FL("Invalid length"));
+		return eHAL_STATUS_FAILURE;
+	}
+
+	sme_cmd = csrGetCommandBuffer(mac);
+	if (!sme_cmd) {
+		smsLog(mac, LOGE, FL("Failed to get buffer for sw pta req"));
+		return eHAL_STATUS_RESOURCES;
+	}
+
+	sw_pta_req = vos_mem_malloc(sizeof(*sw_pta_req));
+	if (!sw_pta_req) {
+		smsLog(mac, LOGE, FL("Failed to allocate memory for sw pta"));
+		csrReleaseCommand(mac, sme_cmd);
+		return eHAL_STATUS_RESOURCES;
+	}
+
+	sw_pta_req->param_type = type;
+	sw_pta_req->length = length;
+	memcpy(sw_pta_req->value, value, length);
+
+	status = sme_AcquireGlobalLock(&mac->sme);
+	if (HAL_STATUS_SUCCESS(status)) {
+		mac->sme.sw_pta_resp_cb = resp_callback;
+
+		smsLog(mac, LOG1, "Posting sw pta request to csr queue");
+		sme_cmd->command = eSmeCommandSwPTAReq;
+		sme_cmd->sessionId = session_id;
+		sme_cmd->u.sw_pta_req = sw_pta_req;
+
+		if (!HAL_STATUS_SUCCESS(csrQueueSmeCommand(mac,
+					sme_cmd, TRUE))) {
+			VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
+				  FL("failed queueing sme command"));
+			sme_ReleaseGlobalLock(&mac->sme);
+			csrReleaseCommand(mac, sme_cmd);
+			vos_mem_free(sw_pta_req);
+			return eHAL_STATUS_FAILURE;
+		}
+	} else {
+		smsLog(mac, LOGE, FL("sme_AcquireGlobalLock failed"));
+		csrReleaseCommand(mac, sme_cmd);
+		vos_mem_free(sw_pta_req);
+		return eHAL_STATUS_FAILURE;
+	}
+
+	sme_ReleaseGlobalLock(&mac->sme);
+	return eHAL_STATUS_SUCCESS;
+}
+
+eHalStatus sme_sco_req(tHalHandle hal,
+		       void (*resp_callback)(uint8_t resp_status),
+		       uint8_t session_id, uint8_t req_status)
+{
+	return sme_sw_pta_req(hal, resp_callback, session_id,
+			      SCO_STATUS, sizeof(req_status), &req_status);
+}
+#endif /* FEATURE_WLAN_SW_PTA */
diff --git a/CORE/SYS/legacy/src/utils/src/macTrace.c b/CORE/SYS/legacy/src/utils/src/macTrace.c
index 4d98d99..6bd31ab 100644
--- a/CORE/SYS/legacy/src/utils/src/macTrace.c
+++ b/CORE/SYS/legacy/src/utils/src/macTrace.c
@@ -853,6 +853,9 @@
         CASE_RETURN_STRING(WDA_GET_ROAM_RSSI_RSP);
         CASE_RETURN_STRING(WDA_NAN_REQUEST);
         CASE_RETURN_STRING(WDA_BLACKLIST_REQ);
+#ifdef FEATURE_WLAN_SW_PTA
+        CASE_RETURN_STRING(WDA_SW_PTA_REQ);
+#endif
         CASE_RETURN_STRING(WDA_START_SCAN_OFFLOAD_REQ);
         CASE_RETURN_STRING(WDA_START_SCAN_OFFLOAD_RSP);
         CASE_RETURN_STRING(WDA_STOP_SCAN_OFFLOAD_REQ);
diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h
index 7ca2db4..2bd5594 100644
--- a/CORE/WDA/inc/wlan_qct_wda.h
+++ b/CORE/WDA/inc/wlan_qct_wda.h
@@ -1244,6 +1244,10 @@
 
 #define WDA_BLACKLIST_REQ          SIR_HAL_BLACKLIST_REQ
 
+#ifdef FEATURE_WLAN_SW_PTA
+#define WDA_SW_PTA_REQ             SIR_HAL_SW_PTA_REQ
+#endif
+
 #define WDA_START_SCAN_OFFLOAD_REQ  SIR_HAL_START_SCAN_OFFLOAD_REQ
 #define WDA_START_SCAN_OFFLOAD_RSP  SIR_HAL_START_SCAN_OFFLOAD_RSP
 #define WDA_STOP_SCAN_OFFLOAD_REQ  SIR_HAL_STOP_SCAN_OFFLOAD_REQ