Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a7b3199e authored by Dundi Raviteja's avatar Dundi Raviteja
Browse files

wlan: WDA and WDI changes to support SW PTA

Changes required in WDA and WDI layers to support SW PTA.

Add new WDI Request and Response commands
i.e WDI_SW_PTA_COEX_PARAMS_REQ and WDI_SW_PTA_COEX_PARAMS_RESP
which are used to send SCO, NUD and BT status to firmware.

Change-Id: I4ca28055cda817af97581e26c254eb42405b9670
CRs-Fixed: 2792125
parent 453d6f91
Loading
Loading
Loading
Loading
+111 −0
Original line number Diff line number Diff line
@@ -16795,6 +16795,110 @@ wda_get_mdns_stats_req(tWDA_CbContext *wda_handle,
}
#endif /* MDNS_OFFLOAD */
#ifdef FEATURE_WLAN_SW_PTA
/**
 * WDA_sw_pta_resp_cb() - WDA callback api to get sw pta resp status
 * @status: SW PTA response status
 * @user_data: user data
 *
 * Retrun: None
 */
static void WDA_sw_pta_resp_cb(uint8_t status, void *user_data)
{
	tWDA_ReqParams *wda_params = (tWDA_ReqParams *)user_data;
	vos_msg_t msg;
	VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
		  "<------ %s", __func__);
	if (!wda_params) {
		VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
			  "%s: wda_params received NULL", __func__);
		VOS_ASSERT(0);
		return;
	}
	if (!wda_params->wdaMsgParam) {
		VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
			  "%s: wda_params->wdaMsgParam is NULL", __func__);
		VOS_ASSERT(0);
		vos_mem_free(wda_params->wdaWdiApiMsgParam);
		vos_mem_free(wda_params);
		return;
	}
	/* VOS message wrapper */
	msg.type = eWNI_SME_SW_PTA_RESP;
	msg.bodyptr = NULL;
	msg.bodyval = status;
	if (vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t *)&msg) !=
	    VOS_STATUS_SUCCESS) {
		VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
			  "%s: Failed to post message to SME", __func__);
	}
	vos_mem_free(wda_params->wdaWdiApiMsgParam);
	vos_mem_free(wda_params->wdaMsgParam);
	vos_mem_free(wda_params);
	VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
		  "EXIT <------ %s ", __func__);
}
/* WDA_process_sw_pta_req - Process sw pta request
 * @wda: wda handle
 * @sw_pta_req: sw pta coex params request
 *
 * Return: VOS_STATUS
 */
static VOS_STATUS
WDA_process_sw_pta_req(tWDA_CbContext *wda,
		       struct sir_sw_pta_req *sw_pta_req)
{
	struct wdi_sw_pta_req *wdi_sw_pta_req;
	tWDA_ReqParams *wda_params;
	WDI_Status wdi_status;
	VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, FL("Enter"));
	wdi_sw_pta_req = (struct wdi_sw_pta_req *)
		vos_mem_malloc(sizeof(tWDA_ReqParams));
	if (!wdi_sw_pta_req) {
		VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
			  "%s: VOS MEM Alloc Failure", __func__);
		vos_mem_free(sw_pta_req);
		return VOS_STATUS_E_NOMEM;
	}
	wda_params = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams));
	if (!wda_params) {
		VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
			  "%s: VOS MEM Alloc Failure", __func__);
		vos_mem_free(wdi_sw_pta_req);
		vos_mem_free(sw_pta_req);
	}
	memcpy(wdi_sw_pta_req, sw_pta_req, sizeof(*sw_pta_req));
	/* Store Params pass it to WDI */
	wda_params->wdaWdiApiMsgParam = (void *)wdi_sw_pta_req;
	wda_params->pWdaContext = wda;
	/* Store param pointer as passed in by caller */
	wda_params->wdaMsgParam = sw_pta_req;
	wdi_status = WDI_sw_pta_req(WDA_sw_pta_resp_cb, wdi_sw_pta_req,
				    wda_params);
	if (IS_WDI_STATUS_FAILURE(wdi_status)) {
		VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
			  FL("Error in WDA sw pta request"));
		vos_mem_free(wdi_sw_pta_req);
		vos_mem_free(sw_pta_req);
	}
	return CONVERT_WDI2VOS_STATUS(wdi_status);
}
#endif
/*
 * FUNCTION: WDA_McProcessMsg
 * Trigger DAL-AL to start CFG download 
@@ -17870,6 +17974,13 @@ VOS_STATUS WDA_McProcessMsg( v_CONTEXT_t pVosContext, vos_msg_t *pMsg )
         WDA_ProcessGetARPStatsReq(pWDA, (getArpStatsParams *)pMsg->bodyptr);
         break;
      }
#ifdef FEATURE_WLAN_SW_PTA
      case WDA_SW_PTA_REQ:
      {
         WDA_process_sw_pta_req(pWDA, (struct sir_sw_pta_req *)pMsg->bodyptr);
         break;
      }
#endif
      default:
      {
         VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+44 −0
Original line number Diff line number Diff line
@@ -6680,6 +6680,34 @@ struct WDI_sap_ofl_enable_params{
    wpt_uint32 tsf_hi;
} wdi_cap_tsf_rsp_t;

#ifdef FEATURE_WLAN_SW_PTA
/**
 * enum wdi_sw_pta_param_type - Type of sw pta coex param
 * @WDI_SCO_STATUS: Enable/Disable SCO
 * @WDI_NUD_STATUS: Enable/Disable NUD
 * @WDI_BT_STATUS: Enable/Disable BT
 */
/* Copied from sirApi.h to avoid compile error */
enum wdi_sw_pta_param_type {
	WDI_SCO_STATUS,
	WDI_NUD_STATUS,
	WDI_BT_STATUS,
};

#define WDI_SW_PTA_COEX_PARAMS_MAX_LEN 32
/**
 * wdi_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 wdi_sw_pta_req {
	enum wdi_sw_pta_param_type param_type;
	uint8_t length;
	uint8_t value[WDI_SW_PTA_COEX_PARAMS_MAX_LEN];
};
#endif

/*----------------------------------------------------------------------------
 *   WDI callback types
 *--------------------------------------------------------------------------*/
@@ -12563,5 +12591,21 @@ wdi_process_get_tsf_req (wdi_cap_tsf_params_t *wdi_get_tsf_req,
                         wdi_tsf_rsp_cb wdi_tsf_rsp_callback,
                         void *user_data);

#ifdef FEATURE_WLAN_SW_PTA
typedef void (*WDI_sw_pta_resp_cb)(uint8_t status, void *user_data);

/**
 * @WDI_sw_pta_req - SW PTA request
 *
 * @wdi_sw_pta_resp_cb: WDI sw pta response callback
 * @wdi_sw_pta_req: sw pta request params
 * @user_data: user data
 *
 * @Return: WDI_Status
 */
WDI_Status
WDI_sw_pta_req(WDI_sw_pta_resp_cb wdi_sw_pta_resp_cb,
	       struct wdi_sw_pta_req *wdi_sw_pta_req,
	       void *user_data);
#endif /* FEATURE_WLAN_SW_PTA */
#endif /* #ifndef WLAN_QCT_WDI_H */
+36 −0
Original line number Diff line number Diff line
@@ -508,6 +508,12 @@ typedef enum
  /* BLACKLIST Request */
  WDI_BLACKLIST_REQ                              = 127,
  WDI_SET_LOW_POWER_REQ                          = 128,

#ifdef FEATURE_WLAN_SW_PTA
  /* SW PTA coex params request */
  WDI_SW_PTA_COEX_PARAMS_REQ                     = 129,
#endif

  WDI_MAX_REQ,

  /*Send a suspend Indication down to HAL*/
@@ -901,6 +907,10 @@ typedef enum
  WDI_BLACKLIST_RSP                              = 126,
  WDI_SET_LOW_POWER_RSP                          = 127,

#ifdef FEATURE_WLAN_SW_PTA
  /* SW PTA coex params response */
  WDI_SW_PTA_COEX_PARAMS_RSP                    = 128,
#endif
  /*-------------------------------------------------------------------------
    Indications
     !! Keep these last in the enum if possible
@@ -6931,5 +6941,31 @@ WDI_ProcessGetArpStatsResp
  WDI_EventInfoType*     pEventData
);

#ifdef FEATURE_WLAN_SW_PTA
/**
 * WDI_process_sw_pta_req() - process sw pta coex params request
 *
 * @pWDICtx: pointer to the WLAN DAL context
 * @pEventData: pointer to the event information structure
 *
 * @return Result of the function call
 */
WDI_Status
WDI_process_sw_pta_req(WDI_ControlBlockType *pWDICtx,
		       WDI_EventInfoType *pEventData);

/**
 * WDI_process_sw_pta_resp() - process sw pta coex params response
 *
 * @pWDICtx: pointer to the WLAN DAL context
 * @pEventData: pointer to the event information structure
 *
 * @return Result of the function call
 */
WDI_Status
WDI_process_sw_pta_resp(WDI_ControlBlockType *pWDICtx,
			WDI_EventInfoType *pEventData);
#endif /* FEATURE_WLAN_SW_PTA */

#endif /*WLAN_QCT_WDI_I_H*/
+127 −1
Original line number Diff line number Diff line
@@ -551,6 +551,10 @@ WDI_ReqProcFuncType pfnReqProcTbl[WDI_MAX_UMAC_IND] =
  WDI_ProcessBlackListReq,            /* WDI_BLACKLIST_REQ*/
  WDI_process_low_power_request,      /* WDI_SET_LOW_POWER_REQ */
#ifdef FEATURE_WLAN_SW_PTA
  WDI_process_sw_pta_req,            /* WDI_SW_PTA_COEX_PARAMS_REQ */
#endif
  /*-------------------------------------------------------------------------
    Indications
  -------------------------------------------------------------------------*/
@@ -907,6 +911,11 @@ WDI_RspProcFuncType pfnRspProcTbl[WDI_MAX_RESP] =
   WDI_low_power_rsp_callback,          /* WDI_SET_LOW_POWER_RSP */
   WDI_ProcessBlackListResp,            /* WDI_BLACKLIST_RSP */
#ifdef FEATURE_WLAN_SW_PTA
   WDI_process_sw_pta_resp,             /* WDI_SW_PTA_COEX_PARAMS_RESP */
#endif
  /*---------------------------------------------------------------------
    Indications
  ---------------------------------------------------------------------*/
@@ -1386,6 +1395,9 @@ static char *WDI_getReqMsgString(wpt_uint16 wdiReqMsgId)
#endif
    CASE_RETURN_STRING( WDI_FW_ARP_STATS_REQ );
    CASE_RETURN_STRING( WDI_FW_GET_ARP_STATS_REQ );
#ifdef FEATURE_WLAN_SW_PTA
    CASE_RETURN_STRING(WDI_SW_PTA_COEX_PARAMS_REQ);
#endif
    default:
        return "Unknown WDI MessageId";
@@ -1817,6 +1829,9 @@ static char *WDI_getRespMsgString(wpt_uint16 wdiRespMsgId)
    CASE_RETURN_STRING (WDI_CAPTURE_GET_TSF_TSTAMP_RSP);
    CASE_RETURN_STRING (WDI_BLACKLIST_RSP);
    CASE_RETURN_STRING (WDI_SET_LOW_POWER_RSP);
#ifdef FEATURE_WLAN_SW_PTA
    CASE_RETURN_STRING(WDI_SW_PTA_COEX_PARAMS_RSP);
#endif
    default:
        return "Unknown WDI MessageId";
  }
@@ -25544,6 +25559,10 @@ WDI_2_HAL_REQ_TYPE
      return WLAN_HAL_FW_SET_CLEAR_ARP_STATS_REQ;
  case WDI_FW_GET_ARP_STATS_REQ:
      return WLAN_HAL_FW_GET_ARP_STATS_REQ;
#ifdef FEATURE_WLAN_SW_PTA
  case WDI_SW_PTA_COEX_PARAMS_REQ:
       return WLAN_HAL_HOST_SW_PTA_COEX_PARAMS_REQ;
#endif
  default:
    return WLAN_HAL_MSG_MAX;
  }
@@ -25935,6 +25954,10 @@ case WLAN_HAL_DEL_STA_SELF_RSP:
       return WDI_FW_GET_ARP_STATS_RSP;
  case WLAN_HAL_POWER_CONTROL_MODE_CHANGE_RSP:
       return WDI_SET_LOW_POWER_RSP;
#ifdef FEATURE_WLAN_SW_PTA
  case WLAN_HAL_HOST_SW_PTA_COEX_PARAMS_RSP:
       return WDI_SW_PTA_COEX_PARAMS_RSP;
#endif
  default:
    return eDRIVER_TYPE_MAX;
  }
@@ -40092,4 +40115,107 @@ wdi_get_tsf_rsp
        return WDI_STATUS_SUCCESS;
}
#ifdef FEATURE_WLAN_SW_PTA
WDI_Status
WDI_sw_pta_req(WDI_sw_pta_resp_cb wdi_sw_pta_resp_cb,
	      struct wdi_sw_pta_req *wdi_sw_pta_req,
	      void *user_data)
{
	WDI_EventInfoType wdiEventData;
	if (gWDIInitialized == eWLAN_PAL_FALSE) {
		WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
			   "WDI API called before module is initialized");
		return WDI_STATUS_E_NOT_ALLOWED;
	}
	VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "%s", __func__);
	wdiEventData.wdiRequest      = WDI_SW_PTA_COEX_PARAMS_REQ;
	wdiEventData.pEventData      = (void *)wdi_sw_pta_req;
	wdiEventData.uEventDataSize  = sizeof(*wdi_sw_pta_req);
	wdiEventData.pUserData       = user_data;
	wdiEventData.pCBfnc          = wdi_sw_pta_resp_cb;
	return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
}
WDI_Status
WDI_process_sw_pta_req(WDI_ControlBlockType *pWDICtx,
		       WDI_EventInfoType *pEventData)
{
	struct wdi_sw_pta_req *wdi_sw_pta_req;
	wpt_uint8 *pSendBuffer = NULL;
	tpHalSwPTAReq hal_sw_pta_req;
	wpt_uint16 usDataOffset = 0;
	wpt_uint16 usSendSize = 0;
	WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
		   "WDI_process_sw_pta_req");
	if (!pEventData) {
		WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
			   "%s: Invalid parameters", __func__);
		WDI_ASSERT(0);
		return WDI_STATUS_E_FAILURE;
	}
	if (WDI_STATUS_SUCCESS != WDI_GetMessageBuffer(pWDICtx,
	     WDI_SW_PTA_COEX_PARAMS_REQ, sizeof(*hal_sw_pta_req),
	     &pSendBuffer, &usDataOffset, &usSendSize) ||
	     (usSendSize < (usDataOffset + sizeof(*hal_sw_pta_req)))) {
		WPAL_TRACE(eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
			   "Unable to get buffer in sw pta request %pK",
			   pEventData);
		WDI_ASSERT(0);
		return WDI_STATUS_E_FAILURE;
	}
	wdi_sw_pta_req = (struct wdi_sw_pta_req *)pEventData->pEventData;
	hal_sw_pta_req = (tpHalSwPTAReq) (pSendBuffer + usDataOffset);;
	hal_sw_pta_req->param_type = wdi_sw_pta_req->param_type;
	hal_sw_pta_req->length = wdi_sw_pta_req->length;
	memcpy(hal_sw_pta_req->value, wdi_sw_pta_req->value,
	       wdi_sw_pta_req->length);
	return WDI_SendMsg(pWDICtx, pSendBuffer, usSendSize,
			   pEventData->pCBfnc, pEventData->pUserData,
			   WDI_SW_PTA_COEX_PARAMS_RSP);
}
WDI_Status
WDI_process_sw_pta_resp(WDI_ControlBlockType *wdi_ctx,
			WDI_EventInfoType *pEventData)
{
	WDI_sw_pta_resp_cb wdi_sw_pta_resp_cb;
	uint8_t sw_pta_status;
	if ((!wdi_ctx) || (!pEventData) ||
	    !pEventData->pEventData) {
		WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
			   "%s: Invalid parameters", __func__);
		WDI_ASSERT(0);
		return WDI_STATUS_E_FAILURE;
	}
	sw_pta_status = *((uint8_t *)pEventData->pEventData);
	VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
		  "%s : Received SW PTA coex params response, status : %d",
		  __func__, sw_pta_status);
	wdi_sw_pta_resp_cb = (WDI_sw_pta_resp_cb)wdi_ctx->pfncRspCB;
	if (wdi_sw_pta_resp_cb) {
		wdi_sw_pta_resp_cb(sw_pta_status, wdi_ctx->pRspCBUserData);
	} else {
		VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
			  "%s : wdi_sw_pta_resp_cb is NULL", __func__);
		return WDI_STATUS_E_FAILURE;
	}
	return WDI_STATUS_SUCCESS;
}
#endif /* FEATURE_WLAN_SW_PTA */
#endif
+30 −0
Original line number Diff line number Diff line
@@ -635,6 +635,8 @@ typedef enum
   WLAN_HAL_QPOWER_ENABLE_BY_HOST_IND        = 361,
   WLAN_HAL_BLACK_LIST_SSID_REQ              = 362,
   WLAN_HAL_BLACK_LIST_SSID_RSP              = 363,
   WLAN_HAL_HOST_SW_PTA_COEX_PARAMS_REQ      = 364,
   WLAN_HAL_HOST_SW_PTA_COEX_PARAMS_RSP      = 365,

   WLAN_HAL_MSG_MAX = WLAN_HAL_MSG_TYPE_MAX_ENUM_SIZE
}tHalHostMsgType;
@@ -9771,4 +9773,32 @@ typedef PACKED_PRE struct PACKED_POST
#else
#endif

#ifdef FEATURE_WLAN_SW_PTA
/**
 * enum hal_sw_pta_param_type - Type of sw pta coex param
 * @WDI_SCO_STATUS: Enable/Disable SCO
 * @WDI_NUD_STATUS: Enable/Disable NUD
 * @WDI_BT_STATUS: Enable/Disable BT
 */
/* Copied from sirApi.h to avoid compile error */
enum hal_sw_pta_param_type {
	HAL_SW_PTA_SCO_STATUS = 0,
	HAL_SW_PTA_NUD_STATUS = 1,
	HAL_SW_PTA_BT_STATUS = 2,
	HAL_SW_PTA_MAX = WLAN_HAL_MAX_ENUM_SIZE
};

#define HAL_SW_PTA_COEX_PARAMS_MAX_LEN 32
/**
 * hal_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
 */
typedef PACKED_PRE struct PACKED_POST {
	enum hal_sw_pta_param_type param_type;
	uint8_t length;
	uint8_t value[HAL_SW_PTA_COEX_PARAMS_MAX_LEN];
} tHalSwPTAReq, *tpHalSwPTAReq;
#endif
#endif /* _WLAN_HAL_MSG_H_ */