2 \brief Declaration of library functions
4 Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
9 /*******************************************************************************
10 * C O M P I L E R F L A G S
11 ********************************************************************************
14 /*******************************************************************************
16 ********************************************************************************
22 #define DFT_TAG "[WMT-CORE]"
25 /*******************************************************************************
26 * E X T E R N A L R E F E R E N C E S
27 ********************************************************************************
29 #include "osal_typedef.h"
41 #if CFG_CORE_MT6620_SUPPORT
42 extern WMT_IC_OPS wmt_ic_ops_mt6620;
45 #if CFG_CORE_MT6628_SUPPORT
46 extern WMT_IC_OPS wmt_ic_ops_mt6628;
49 #if CFG_FUNC_BT_SUPPORT
50 extern WMT_FUNC_OPS wmt_func_bt_ops;
53 #if CFG_FUNC_FM_SUPPORT
54 extern WMT_FUNC_OPS wmt_func_fm_ops;
57 #if CFG_FUNC_GPS_SUPPORT
58 extern WMT_FUNC_OPS wmt_func_gps_ops;
61 #if CFG_FUNC_WIFI_SUPPORT
62 extern WMT_FUNC_OPS wmt_func_wifi_ops;
65 P_WMT_FUNC_OPS gpWmtFuncOps[4] = {
66 #if CFG_FUNC_BT_SUPPORT
67 [0] = &wmt_func_bt_ops,
72 #if CFG_FUNC_FM_SUPPORT
73 [1] = &wmt_func_fm_ops,
78 #if CFG_FUNC_GPS_SUPPORT
79 [2] = &wmt_func_gps_ops,
84 #if CFG_FUNC_WIFI_SUPPORT
85 [3] = &wmt_func_wifi_ops,
92 /*******************************************************************************
94 ********************************************************************************
97 // TODO:[FixMe][GeorgeKuo]: is it an MT6620 only or general general setting? move to wmt_ic_6620 temporarily.
98 /* #define CFG_WMT_BT_PORT2 (1) */ /* BT Port 2 Feature.*/
100 /*******************************************************************************
102 ********************************************************************************
105 static WMT_CTX gMtkWmtCtx;
106 static UINT8 gLpbkBuf[WMT_LPBK_BUF_LEN] = {0};
108 /*******************************************************************************
109 * F U N C T I O N D E C L A R A T I O N S
110 ********************************************************************************
113 static INT32 opfunc_hif_conf (P_WMT_OP pWmtOp);
114 static INT32 opfunc_pwr_on (P_WMT_OP pWmtOp);
115 static INT32 opfunc_pwr_off (P_WMT_OP pWmtOp);
116 static INT32 opfunc_func_on (P_WMT_OP pWmtOp);
117 static INT32 opfunc_func_off (P_WMT_OP pWmtOp);
118 static INT32 opfunc_reg_rw ( P_WMT_OP pWmtOp);
119 static INT32 opfunc_exit (P_WMT_OP pWmtOp);
120 static INT32 opfunc_pwr_sv (P_WMT_OP pWmtOp);
121 static INT32 opfunc_dsns (P_WMT_OP pWmtOp);
122 static INT32 opfunc_lpbk (P_WMT_OP pWmtOp);
123 static INT32 opfunc_cmd_test (P_WMT_OP pWmtOp);
124 static INT32 opfunc_hw_rst (P_WMT_OP pWmtOp);
125 static INT32 opfunc_sw_rst (P_WMT_OP pWmtOp);
126 static INT32 opfunc_stp_rst (P_WMT_OP pWmtOp);
127 static INT32 opfunc_therm_ctrl (P_WMT_OP pWmtOp);
128 static INT32 opfunc_efuse_rw (P_WMT_OP pWmtOp);
129 static INT32 opfunc_therm_ctrl (P_WMT_OP pWmtOp);
130 static INT32 opfunc_gpio_ctrl (P_WMT_OP pWmtOp);
131 static INT32 opfunc_sdio_ctrl (P_WMT_OP pWmtOp);
132 static INT32 opfunc_pin_state (P_WMT_OP pWmtOp);
133 static VOID wmt_core_dump_func_state (CHAR *pSource);
134 static INT32 wmt_core_stp_init (VOID);
135 static INT32 wmt_core_stp_deinit (VOID);
136 static INT32 wmt_core_hw_check (VOID);
140 /*******************************************************************************
141 * P U B L I C D A T A
142 ********************************************************************************
145 /*******************************************************************************
146 * P R I V A T E D A T A
147 ********************************************************************************
150 const static UCHAR WMT_SLEEP_CMD[] = {0x01, 0x03, 0x01, 0x00, 0x01};
151 const static UCHAR WMT_SLEEP_EVT[] = {0x02, 0x03, 0x02, 0x00, 0x00, 0x01};
153 const static UCHAR WMT_HOST_AWAKE_CMD[] = {0x01, 0x03, 0x01, 0x00, 0x02};
154 const static UCHAR WMT_HOST_AWAKE_EVT[] = {0x02, 0x03, 0x02, 0x00, 0x00, 0x02};
156 const static UCHAR WMT_WAKEUP_CMD[] = {0xFF};
157 const static UCHAR WMT_WAKEUP_EVT[] = {0x02, 0x03, 0x02, 0x00, 0x00, 0x03};
159 static UCHAR WMT_THERM_CMD[] = {0x01, 0x11, 0x01, 0x00,
160 0x00 /*thermal sensor operation*/
162 static UCHAR WMT_THERM_CTRL_EVT[] = {0x02, 0x11, 0x01, 0x00, 0x00};
163 static UCHAR WMT_THERM_READ_EVT[] = {0x02, 0x11, 0x02, 0x00, 0x00, 0x00};
165 static UCHAR WMT_EFUSE_CMD[] = {0x01, 0x0D, 0x08, 0x00,
166 0x01, /*[4]operation, 0:init, 1:write 2:read*/
167 0x01, /*[5]Number of register setting*/
168 0xAA, 0xAA, /*[6-7]Address*/
169 0xBB, 0xBB, 0xBB, 0xBB /*[8-11] Value*/
172 static UCHAR WMT_EFUSE_EVT[] = {0x02, 0x0D, 0x08, 0x00,
173 0xAA, /*[4]operation, 0:init, 1:write 2:read*/
174 0xBB, /*[5]Number of register setting*/
175 0xCC, 0xCC, /*[6-7]Address*/
176 0xDD, 0xDD, 0xDD, 0xDD /*[8-11] Value*/
179 static UCHAR WMT_DSNS_CMD[] = {0x01, 0x0E, 0x02, 0x00, 0x01,
182 static UCHAR WMT_DSNS_EVT[] = {0x02, 0x0E, 0x01, 0x00, 0x00 };
184 // TODO:[NewFeature][GeorgeKuo] Update register group in ONE CMD/EVT
185 static UCHAR WMT_SET_REG_CMD[] = {0x01, 0x08, 0x10, 0x00 /*length*/
186 , 0x00 /*op: w(1) & r(2) */
187 , 0x01 /*type: reg */
189 , 0x01 /*1 register*/
190 , 0x00, 0x00, 0x00, 0x00 /* addr */
191 , 0x00, 0x00, 0x00, 0x00 /* value */
192 , 0xFF, 0xFF, 0xFF, 0xFF /*mask */
194 static UCHAR WMT_SET_REG_WR_EVT[] = {0x02, 0x08, 0x04, 0x00/*length*/
196 , 0x00 /*type: reg */
198 , 0x01 /*1 register*/
199 //, 0x00, 0x00, 0x00, 0x00 /* addr */
200 //, 0x00, 0x00, 0x00, 0x00 /* value */
202 static UCHAR WMT_SET_REG_RD_EVT[] = {0x02, 0x08, 0x04, 0x00/*length*/
204 , 0x00 /*type: reg */
206 , 0x01 /*1 register*/
207 , 0x00, 0x00, 0x00, 0x00 /* addr */
208 , 0x00, 0x00, 0x00, 0x00 /* value */
211 /* GeorgeKuo: Use designated initializers described in
212 * http://gcc.gnu.org/onlinedocs/gcc-4.0.4/gcc/Designated-Inits.html
215 const static WMT_OPID_FUNC wmt_core_opfunc[] = {
216 [WMT_OPID_HIF_CONF] = opfunc_hif_conf,
217 [WMT_OPID_PWR_ON] = opfunc_pwr_on,
218 [WMT_OPID_PWR_OFF] = opfunc_pwr_off,
219 [WMT_OPID_FUNC_ON] = opfunc_func_on,
220 [WMT_OPID_FUNC_OFF] = opfunc_func_off,
221 [WMT_OPID_REG_RW] = opfunc_reg_rw, // TODO:[ChangeFeature][George] is this OP obsoleted?
222 [WMT_OPID_EXIT] = opfunc_exit,
223 [WMT_OPID_PWR_SV] = opfunc_pwr_sv,
224 [WMT_OPID_DSNS] = opfunc_dsns,
225 [WMT_OPID_LPBK] = opfunc_lpbk,
226 [WMT_OPID_CMD_TEST] = opfunc_cmd_test,
227 [WMT_OPID_HW_RST] = opfunc_hw_rst,
228 [WMT_OPID_SW_RST] = opfunc_sw_rst,
229 [WMT_OPID_STP_RST] = opfunc_stp_rst,
230 [WMT_OPID_THERM_CTRL] = opfunc_therm_ctrl,
231 [WMT_OPID_EFUSE_RW] = opfunc_efuse_rw,
232 [WMT_OPID_GPIO_CTRL] = opfunc_gpio_ctrl,
233 [WMT_OPID_SDIO_CTRL] = opfunc_sdio_ctrl,
234 [WMT_OPID_GPIO_STATE] = opfunc_pin_state,
237 /*******************************************************************************
239 ********************************************************************************
241 INT32 wmt_core_init(VOID)
245 osal_memset(&gMtkWmtCtx, 0, osal_sizeof(gMtkWmtCtx));
246 /* gMtkWmtCtx.p_ops is cleared to NULL */
248 /* default FUNC_OFF state */
249 for (i = 0; i < WMTDRV_TYPE_MAX; ++i) {
250 /* WinMo is default to DRV_STS_UNREG;*/
251 gMtkWmtCtx.eDrvStatus[i] = DRV_STS_POWER_OFF;
257 INT32 wmt_core_deinit(VOID)
259 //return to init state
260 osal_memset(&gMtkWmtCtx, 0, osal_sizeof(gMtkWmtCtx));
261 /* gMtkWmtCtx.p_ops is cleared to NULL */
265 // TODO: [ChangeFeature][George] Is wmt_ctrl a good interface? maybe not......
266 // parameters shall be copied in/from ctrl buffer, which is also a size-wasting buffer.
272 const MTK_WCN_BOOL bRawFlag
276 #if 0 /* Test using direct function call instead of wmt_ctrl() interface */
277 WMT_CTRL_DATA ctrlData;
278 ctrlData.ctrlId = WMT_CTRL_TX;
279 ctrlData.au4CtrlData[0] = (UINT32)pData;
280 ctrlData.au4CtrlData[1] = size;
281 ctrlData.au4CtrlData[2] = (UINT32)writtenSize;
282 ctrlData.au4CtrlData[3] = bRawFlag;
284 iRet = wmt_ctrl(&ctrlData);
287 WMT_ERR_FUNC("WMT-CORE: wmt_core_ctrl failed: WMT_CTRL_TX, iRet:%d\n", iRet);
288 //(*sys_dbg_assert)(0, __FILE__, __LINE__);
292 iRet = wmt_ctrl_tx_ex(pData, size, writtenSize, bRawFlag);
296 INT32 wmt_core_rx(PUINT8 pBuf, UINT32 bufLen, UINT32 *readSize)
299 WMT_CTRL_DATA ctrlData;
300 ctrlData.ctrlId = WMT_CTRL_RX;
301 ctrlData.au4CtrlData[0] = (UINT32)pBuf;
302 ctrlData.au4CtrlData[1] = bufLen;
303 ctrlData.au4CtrlData[2] = (UINT32)readSize;
305 iRet = wmt_ctrl(&ctrlData);
308 WMT_ERR_FUNC("WMT-CORE: wmt_core_ctrl failed: WMT_CTRL_RX, iRet:%d\n", iRet);
309 mtk_wcn_stp_dbg_dump_package();
315 INT32 wmt_core_rx_flush(UINT32 type)
318 WMT_CTRL_DATA ctrlData;
319 ctrlData.ctrlId = WMT_CTRL_RX_FLUSH;
320 ctrlData.au4CtrlData[0] = (UINT32)type;
322 iRet = wmt_ctrl(&ctrlData);
325 WMT_ERR_FUNC("WMT-CORE: wmt_core_ctrl failed: WMT_CTRL_RX_FLUSH, iRet:%d\n", iRet);
331 INT32 wmt_core_func_ctrl_cmd (
332 ENUM_WMTDRV_TYPE_T type,
337 UINT32 u4WmtCmdPduLen;
338 UINT32 u4WmtEventPduLen;
340 UINT32 u4WrittenSize;
342 WMT_PKT rWmtPktEvent;
345 // TODO:[ChangeFeature][George] remove WMT_PKT. replace it with hardcoded arrays.
346 // Using this struct relies on compiler's implementation and pack() settings
347 osal_memset(&rWmtPktCmd, 0, osal_sizeof(rWmtPktCmd));
348 osal_memset(&rWmtPktEvent, 0, osal_sizeof(rWmtPktEvent));
350 rWmtPktCmd.eType = (UINT8)PKT_TYPE_CMD;
351 rWmtPktCmd.eOpCode = (UINT8)OPCODE_FUNC_CTRL;
353 // Flag field: driver type
354 rWmtPktCmd.aucParam[0] = (UINT8)type;
355 // Parameter field: ON/OFF
356 rWmtPktCmd.aucParam[1] = (fgEn == WMT_FUNC_CTRL_ON) ? 1 : 0;
357 rWmtPktCmd.u2SduLen = WMT_FLAG_LEN + WMT_FUNC_CTRL_PARAM_LEN; // (2)
359 // WMT Header + WMT SDU
360 u4WmtCmdPduLen = WMT_HDR_LEN + rWmtPktCmd.u2SduLen; // (6)
361 u4WmtEventPduLen = WMT_HDR_LEN + WMT_STS_LEN; // (5)
364 fgFail = MTK_WCN_BOOL_TRUE;
365 // iRet = (*kal_stp_tx)((PUINT8)&rWmtPktCmd, u4WmtCmdPduLen, &u4WrittenSize);
366 iRet = wmt_core_tx((PUINT8)&rWmtPktCmd, u4WmtCmdPduLen, &u4WrittenSize, MTK_WCN_BOOL_FALSE);
368 WMT_ERR_FUNC("WMT-CORE: wmt_func_ctrl_cmd kal_stp_tx failed \n");
372 iRet = wmt_core_rx((PUINT8)&rWmtPktEvent, u4WmtEventPduLen, &u4ReadSize);
374 WMT_ERR_FUNC("WMT-CORE: wmt_func_ctrl_cmd kal_stp_rx failed\n");
379 if (PKT_TYPE_EVENT != rWmtPktEvent.eType) {
380 WMT_ERR_FUNC("WMT-CORE: wmt_func_ctrl_cmd PKT_TYPE_EVENT != rWmtPktEvent.eType %d\n", rWmtPktEvent.eType);
384 if (rWmtPktCmd.eOpCode != rWmtPktEvent.eOpCode) {
385 WMT_ERR_FUNC("WMT-CORE: wmt_func_ctrl_cmd rWmtPktCmd.eOpCode(0x%x) != rWmtPktEvent.eType(0x%x)\n",
386 rWmtPktCmd.eOpCode, rWmtPktEvent.eOpCode);
390 if (u4WmtEventPduLen != (rWmtPktEvent.u2SduLen + WMT_HDR_LEN)) {
391 WMT_ERR_FUNC("WMT-CORE: wmt_func_ctrl_cmd u4WmtEventPduLen(0x%x) != rWmtPktEvent.u2SduLen(0x%x)+4\n",
392 u4WmtEventPduLen, rWmtPktEvent.u2SduLen);
396 // Status field of event check
397 if (0 != rWmtPktEvent.aucParam[0]) {
398 WMT_ERR_FUNC("WMT-CORE: wmt_func_ctrl_cmd, 0 != status(%d)\n", rWmtPktEvent.aucParam[0]);
402 fgFail = MTK_WCN_BOOL_FALSE;
405 if (MTK_WCN_BOOL_FALSE == fgFail) {
406 //WMT_INFO_FUNC("WMT-CORE: wmt_func_ctrl_cmd OK!\n");
410 WMT_ERR_FUNC("WMT-CORE: wmt_func_ctrl_cmd 0x%x FAIL\n", rWmtPktCmd.aucParam[0]);
415 INT32 wmt_core_opid_handler(P_WMT_OP pWmtOp)
422 if (wmt_core_opfunc[opId]) {
423 ret = (*(wmt_core_opfunc[opId]))(pWmtOp); /*wmtCoreOpidHandlerPack[].opHandler*/
427 WMT_ERR_FUNC("WMT-CORE: null handler (%d)\n", pWmtOp->opId);
432 INT32 wmt_core_opid(P_WMT_OP pWmtOp)
436 if (NULL == pWmtOp) {
437 WMT_ERR_FUNC("null pWmtOP\n");
438 /*print some message with error info*/
442 if (WMT_OPID_MAX <= pWmtOp->opId) {
443 WMT_ERR_FUNC("WMT-CORE: invalid OPID(%d)\n", pWmtOp->opId);
447 // TODO: [FixMe][GeorgeKuo] do sanity check to const function table when init and skip checking here
448 return wmt_core_opid_handler(pWmtOp);
451 INT32 wmt_core_ctrl (ENUM_WMT_CTRL_T ctrId, PUINT32 pPa1, PUINT32 pPa2)
454 WMT_CTRL_DATA ctrlData;
455 UINT32 val1 = (pPa1) ? *pPa1: 0;
456 UINT32 val2 = (pPa2) ? *pPa2 : 0;
458 ctrlData.ctrlId= (UINT32)ctrId;
459 ctrlData.au4CtrlData[0] = val1;
460 ctrlData.au4CtrlData[1] = val2;
462 iRet = wmt_ctrl(&ctrlData);
465 WMT_ERR_FUNC("WMT-CORE: wmt_core_ctrl failed: id(%d), type(%d), value(%d) iRet:(%d)\n", ctrId, val1, val2, iRet);
470 *pPa1 = ctrlData.au4CtrlData[0];
473 *pPa2 = ctrlData.au4CtrlData[1];
480 VOID wmt_core_dump_data (
488 WMT_INFO_FUNC("%s len=%d\n", pTitle, len);
489 for(k=0; k < len ; k++) {
490 if (k % 16 == 0) WMT_INFO_FUNC("\n");
491 WMT_INFO_FUNC("0x%02x ", *ptr);
494 WMT_INFO_FUNC("--end\n");
498 * \brief An WMT-CORE function to support read, write, and read after write to
499 * an internal register.
501 * Detailed description.
503 * \param isWrite 1 for write, 0 for read
504 * \param offset of register to be written or read
505 * \param pVal a pointer to the 32-bit value to be writtern or read
506 * \param mask a 32-bit mask to be applied for the read or write operation
508 * \retval 0 operation success
509 * \retval -1 invalid parameters
510 * \retval -2 tx cmd fail
511 * \retval -3 rx event fail
512 * \retval -4 read check error
515 wmt_core_reg_rw_raw (
525 UINT8 evtBuf[16] = {0};
527 WMT_SET_REG_CMD[4] = (isWrite) ? 0x1 : 0x2; /* w:1, r:2 */
528 osal_memcpy(&WMT_SET_REG_CMD[8], &offset, 4); /* offset */
529 osal_memcpy(&WMT_SET_REG_CMD[12], pVal, 4); /* [2] is var addr */
530 osal_memcpy(&WMT_SET_REG_CMD[16], &mask, 4); /* mask */
533 iRet = wmt_core_tx(WMT_SET_REG_CMD, sizeof(WMT_SET_REG_CMD), &u4Res, MTK_WCN_BOOL_FALSE);
534 if ( (iRet) || (u4Res != sizeof(WMT_SET_REG_CMD)) ) {
535 WMT_ERR_FUNC("Tx REG_CMD fail!(%d) len (%d, %d) \n", iRet, u4Res, sizeof(WMT_SET_REG_CMD));
540 evtLen = (isWrite) ? sizeof(WMT_SET_REG_WR_EVT) : sizeof(WMT_SET_REG_RD_EVT);
541 iRet = wmt_core_rx(evtBuf, evtLen, &u4Res);
542 if ( (iRet) || (u4Res != evtLen) ) {
543 WMT_ERR_FUNC("Rx REG_EVT fail!(%d) len(%d, %d)\n", iRet, u4Res, evtLen);
550 osal_memcpy(&txCmdAddr, &WMT_SET_REG_CMD[8], 4);
551 osal_memcpy(&rxEvtAddr, &evtBuf[8], 4);
553 /* check read result */
554 if (txCmdAddr != rxEvtAddr) {
555 WMT_ERR_FUNC("Check read addr fail (0x%08x, 0x%08x)\n", rxEvtAddr, txCmdAddr);
559 WMT_DBG_FUNC("Check read addr(0x%08x) ok\n", rxEvtAddr);
561 osal_memcpy(pVal, &evtBuf[12], 4);
564 /* no error here just return 0 */
569 wmt_core_init_script (
570 struct init_script *script,
579 for (i = 0; i < count; i++) {
580 WMT_DBG_FUNC("WMT-CORE: init_script operation %s start \n", script[i].str);
582 //iRet = (*kal_stp_tx)(script[i].cmd, script[i].cmdSz, &u4Res);
583 iRet = wmt_core_tx(script[i].cmd, script[i].cmdSz, &u4Res, MTK_WCN_BOOL_FALSE);
584 if (iRet || (u4Res != script[i].cmdSz)) {
585 WMT_ERR_FUNC("WMT-CORE: write (%s) iRet(%d) cmd len err(%d, %d) \n", script[i].str, iRet, u4Res, script[i].cmdSz);
589 osal_memset(evtBuf, 0, sizeof(evtBuf));
590 iRet = wmt_core_rx(evtBuf, script[i].evtSz, &u4Res);
591 if (iRet || (u4Res != script[i].evtSz)) {
592 WMT_ERR_FUNC("WMT-CORE: read (%s) iRet(%d) evt len err(rx:%d, exp:%d) \n", script[i].str, iRet, u4Res, script[i].evtSz);
593 mtk_wcn_stp_dbg_dump_package();
597 if (osal_memcmp(evtBuf, script[i].evt, script[i].evtSz) != 0) {
598 WMT_ERR_FUNC("WMT-CORE:compare %s result error \n", script[i].str);
599 WMT_ERR_FUNC("WMT-CORE:rx(%d):[%02X,%02X,%02X,%02X,%02X] exp(%d):[%02X,%02X,%02X,%02X,%02X]\n",
600 u4Res, evtBuf[0], evtBuf[1], evtBuf[2], evtBuf[3], evtBuf[4],
601 script[i].evtSz, script[i].evt[0], script[i].evt[1], script[i].evt[2], script[i].evt[3], script[i].evt[4]);
602 mtk_wcn_stp_dbg_dump_package();
606 WMT_DBG_FUNC("init_script operation %s ok \n", script[i].str);
609 return (i == count) ? 0 : -1;
613 wmt_core_stp_init (VOID)
618 P_WMT_CTX pctx = &gMtkWmtCtx;
619 P_WMT_GEN_CONF pWmtGenConf = NULL;
620 wmt_conf_read_file();
621 pWmtGenConf = wmt_conf_get_cfg();
622 if (!(pctx->wmtInfoBit & WMT_OP_HIF_BIT)) {
623 WMT_ERR_FUNC("WMT-CORE: no hif info!\n");
628 //4 <0> turn on SDIO2 for common SDIO
629 if (WMT_HIF_SDIO == pctx->wmtHifConf.hifType) {
630 ctrlPa1 = WMT_SDIO_SLOT_SDIO2;
631 ctrlPa2 = 1; /* turn on SDIO2 slot */
632 iRet = wmt_core_ctrl(WMT_CTRL_SDIO_HW, &ctrlPa1, &ctrlPa2) ;
634 WMT_ERR_FUNC("WMT-CORE: turn on SLOT_SDIO2 fail (%d)\n", iRet);
639 pctx->eDrvStatus[WMTDRV_TYPE_SDIO2] = DRV_STS_FUNC_ON;
641 ctrlPa1 = WMT_SDIO_FUNC_STP;
642 ctrlPa2 = 1; /* turn on STP driver */
643 iRet = wmt_core_ctrl(WMT_CTRL_SDIO_FUNC, &ctrlPa1, &ctrlPa2) ;
645 WMT_ERR_FUNC("WMT-CORE: turn on SDIO_FUNC_STP func fail (%d)\n", iRet);
647 /* check all sub-func and do power off */
653 ctrlPa1 = 0; ctrlPa2 = 0;
654 iRet = wmt_core_ctrl(WMT_CTRL_STP_OPEN, &ctrlPa1, &ctrlPa2);
656 WMT_ERR_FUNC("WMT-CORE: wmt open stp\n");
660 if (WMT_HIF_UART == pctx->wmtHifConf.hifType) {
661 ctrlPa1 = WMT_DEFAULT_BAUD_RATE; ctrlPa2 = 0;
662 iRet = wmt_core_ctrl(WMT_CTRL_HOST_BAUDRATE_SET, &ctrlPa1, &ctrlPa2);
664 WMT_ERR_FUNC("WMT-CORE: change host baudrate(%d) fails \n", pctx->wmtHifConf.au4HifConf[0]);
668 //WMT_DBG_FUNC("WMT-CORE: change host baudrate(%d) ok \n", gMtkWmtCtx.wmtHifConf.au4HifConf[0]);
670 //4 <1.5> disable and un-ready stp
671 ctrlPa1 = WMT_STP_CONF_EN; ctrlPa2 = 0;
672 iRet += wmt_core_ctrl(WMT_CTRL_STP_CONF, &ctrlPa1, &ctrlPa2);
673 ctrlPa1 = WMT_STP_CONF_RDY; ctrlPa2 = 0;
674 iRet += wmt_core_ctrl(WMT_CTRL_STP_CONF, &ctrlPa1, &ctrlPa2);
676 //4 <2> set mode and enable
677 if (WMT_HIF_UART == pctx->wmtHifConf.hifType) {
678 ctrlPa1 = WMT_STP_CONF_MODE; ctrlPa2 = MTKSTP_UART_MAND_MODE;
679 iRet += wmt_core_ctrl(WMT_CTRL_STP_CONF, &ctrlPa1, &ctrlPa2);
681 else if (WMT_HIF_SDIO == pctx->wmtHifConf.hifType) {
682 ctrlPa1 = WMT_STP_CONF_MODE; ctrlPa2 = MTKSTP_SDIO_MODE;
683 iRet += wmt_core_ctrl(WMT_CTRL_STP_CONF, &ctrlPa1, &ctrlPa2);
685 ctrlPa1 = WMT_STP_CONF_EN; ctrlPa2 = 1;
686 iRet += wmt_core_ctrl(WMT_CTRL_STP_CONF, &ctrlPa1, &ctrlPa2);
688 WMT_ERR_FUNC("WMT-CORE: stp_init <1><2> fail:%d\n", iRet);
692 // TODO: [ChangeFeature][GeorgeKuo] can we apply raise UART baud rate firstly for ALL supported chips???
694 iRet = wmt_core_hw_check();
696 WMT_ERR_FUNC("hw_check fail:%d\n", iRet);
699 /* mtkWmtCtx.p_ic_ops is identified and checked ok */
700 if ((NULL != pctx->p_ic_ops->co_clock_ctrl) && (pWmtGenConf != NULL))
702 (*(pctx->p_ic_ops->co_clock_ctrl))(pWmtGenConf->co_clock_flag == 0 ? WMT_CO_CLOCK_DIS : WMT_CO_CLOCK_EN);
706 WMT_INFO_FUNC("pctx->p_ic_ops->co_clock_ctrl(0x%x), pWmtGenConf(0x%x)\n", pctx->p_ic_ops->co_clock_ctrl, pWmtGenConf);
708 osal_assert(NULL != pctx->p_ic_ops->sw_init);
709 if (NULL != pctx->p_ic_ops->sw_init) {
710 iRet = (*(pctx->p_ic_ops->sw_init))(&pctx->wmtHifConf);
713 WMT_ERR_FUNC("gMtkWmtCtx.p_ic_ops->sw_init is NULL\n");
717 WMT_ERR_FUNC("gMtkWmtCtx.p_ic_ops->sw_init fail:%d\n", iRet);
721 //4 <10> set stp ready
722 ctrlPa1 = WMT_STP_CONF_RDY; ctrlPa2 = 1;
723 iRet = wmt_core_ctrl(WMT_CTRL_STP_CONF, &ctrlPa1, &ctrlPa2);
728 static INT32 wmt_core_stp_deinit (VOID)
734 WMT_DBG_FUNC(" start\n");
736 if (NULL == gMtkWmtCtx.p_ic_ops) {
737 WMT_WARN_FUNC("gMtkWmtCtx.p_ic_ops is NULL\n");
738 goto deinit_ic_ops_done;
740 if (NULL != gMtkWmtCtx.p_ic_ops->sw_deinit) {
741 iRet = (*(gMtkWmtCtx.p_ic_ops->sw_deinit))(&gMtkWmtCtx.wmtHifConf);
743 gMtkWmtCtx.p_ic_ops= NULL;
746 WMT_ERR_FUNC("gMtkWmtCtx.p_ic_ops->sw_init is NULL\n");
751 //4 <1> un-ready, disable, and close stp.
752 ctrlPa1 = WMT_STP_CONF_RDY; ctrlPa2 = 0;
753 iRet = wmt_core_ctrl(WMT_CTRL_STP_CONF, &ctrlPa1, &ctrlPa2);
754 ctrlPa1 = WMT_STP_CONF_EN; ctrlPa2 = 0;
755 iRet += wmt_core_ctrl(WMT_CTRL_STP_CONF, &ctrlPa1, &ctrlPa2);
756 ctrlPa1 = 0; ctrlPa2 = 0;
757 iRet += wmt_core_ctrl(WMT_CTRL_STP_CLOSE, &ctrlPa1, &ctrlPa2);
759 //4 <1.1> turn off SDIO2 for common SDIO
760 if (WMT_HIF_SDIO == gMtkWmtCtx.wmtHifConf.hifType) {
761 ctrlPa1 = WMT_SDIO_FUNC_STP;
762 ctrlPa2 = 0; /* turn off STP driver */
763 iRet = wmt_core_ctrl(WMT_CTRL_SDIO_FUNC, &ctrlPa1, &ctrlPa2) ;
765 WMT_WARN_FUNC("turn off SDIO_FUNC_STP fail (%d)\n", iRet);
766 /* Anyway, continue turning SDIO HW off */
769 WMT_INFO_FUNC("turn off SDIO_FUNC_STP ok \n");
772 ctrlPa1 = WMT_SDIO_SLOT_SDIO2;
773 ctrlPa2 = 0; /* turn off SDIO2 slot */
774 iRet = wmt_core_ctrl(WMT_CTRL_SDIO_HW, &ctrlPa1, &ctrlPa2) ;
776 WMT_WARN_FUNC("turn off SDIO2 HW fail (%d)\n", iRet);
777 /* Anyway, continue turning STP SDIO to POWER OFF state*/
780 WMT_INFO_FUNC("turn off SDIO2 HW ok \n");
782 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_SDIO2] = DRV_STS_POWER_OFF;
786 WMT_WARN_FUNC("end with fail:%d\n", iRet);
793 wmt_core_dump_func_state (
797 WMT_INFO_FUNC("[%s]status(b:%d f:%d g:%d w:%d lpbk:%d coredump:%d wmt:%d sd1:%d sd2:%d stp:%d)\n",
798 (pSource == NULL ? (CHAR *)"CORE" : pSource),
799 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_BT],
800 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_FM],
801 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_GPS],
802 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WIFI],
803 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_LPBK],
804 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_COREDUMP],
805 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WMT],
806 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_SDIO1],
807 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_SDIO2],
808 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_STP]
815 wmt_core_patch_check (
820 if (MAJORNUM(u4HwVer) != MAJORNUM(u4PatchVer)) {
821 /*major no. does not match*/
822 WMT_ERR_FUNC("WMT-CORE: chip version(0x%d) does not match patch version(0x%d)\n", u4HwVer, u4PatchVer);
823 return MTK_WCN_BOOL_FALSE;
825 return MTK_WCN_BOOL_TRUE;
829 wmt_core_hw_check (VOID)
837 WMT_LOUD_FUNC("before read hwcode (chip id)\n");
838 iret = wmt_core_reg_rw_raw(0, GEN_HCR, &chipid, GEN_HCR_MASK); /* read 0x80000008 */
840 WMT_ERR_FUNC("get hwcode (chip id) fail (%d)\n", iret);
843 WMT_INFO_FUNC("get hwcode (chip id) (0x%x)\n", chipid);
845 // TODO:[ChangeFeature][George]: use a better way to select a correct ops table based on chip id
847 #if CFG_CORE_MT6620_SUPPORT
849 p_ops = &wmt_ic_ops_mt6620;
852 #if CFG_CORE_MT6628_SUPPORT
854 p_ops = &wmt_ic_ops_mt6628;
858 p_ops = (P_WMT_IC_OPS)NULL;
863 WMT_ERR_FUNC("unsupported chip id (hw_code): 0x%x\n", chipid);
866 else if ( MTK_WCN_BOOL_FALSE == wmt_core_ic_ops_check(p_ops)) {
867 WMT_ERR_FUNC("chip id(0x%x) with null operation fp: init(0x%p), deinit(0x%p), pin_ctrl(0x%p), ver_chk(0x%p)\n",
868 chipid, p_ops->sw_init, p_ops->sw_deinit, p_ops->ic_pin_ctrl, p_ops->ic_ver_check);
871 WMT_DBG_FUNC("chip id(0x%x) fp: init(0x%p), deinit(0x%p), pin_ctrl(0x%p), ver_chk(0x%p)\n",
872 chipid, p_ops->sw_init, p_ops->sw_deinit, p_ops->ic_pin_ctrl, p_ops->ic_ver_check);
874 iret = p_ops->ic_ver_check();
876 WMT_ERR_FUNC("chip id(0x%x) ver_check error:%d\n", chipid, iret);
880 WMT_INFO_FUNC("chip id(0x%x) ver_check ok\n", chipid);
881 gMtkWmtCtx.p_ic_ops = p_ops;
885 static INT32 opfunc_hif_conf(P_WMT_OP pWmtOp)
887 if (!(pWmtOp->u4InfoBit & WMT_OP_HIF_BIT)) {
888 WMT_ERR_FUNC("WMT-CORE: no HIF_BIT in WMT_OP!\n");
892 if (gMtkWmtCtx.wmtInfoBit & WMT_OP_HIF_BIT) {
893 WMT_ERR_FUNC("WMT-CORE: WMT HIF already exist. overwrite! old (%d), new(%d))\n",
894 gMtkWmtCtx.wmtHifConf.hifType,
895 pWmtOp->au4OpData[0]);
898 gMtkWmtCtx.wmtInfoBit |= WMT_OP_HIF_BIT;
899 WMT_ERR_FUNC("WMT-CORE: WMT HIF info added\n");
902 osal_memcpy(&gMtkWmtCtx.wmtHifConf,
903 &pWmtOp->au4OpData[0],
904 osal_sizeof(gMtkWmtCtx.wmtHifConf));
909 static INT32 opfunc_pwr_on(P_WMT_OP pWmtOp)
915 INT32 retry = WMT_PWRON_RTY_DFT;
917 if (DRV_STS_POWER_OFF != gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WMT]) {
918 WMT_ERR_FUNC("WMT-CORE: already powered on, WMT DRV_STS_[0x%x]\n",
919 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WMT]);
924 // TODO: [FixMe][GeorgeKuo]: clarify the following is reqiured or not!
925 if (pWmtOp->u4InfoBit & WMT_OP_HIF_BIT) {
926 opfunc_hif_conf(pWmtOp);
930 /* power on control */
933 iRet = wmt_core_ctrl(WMT_CTRL_HW_PWR_ON, &ctrlPa1, &ctrlPa2) ;
935 WMT_ERR_FUNC("WMT-CORE: WMT_CTRL_HW_PWR_ON fail iRet(%d)\n", iRet);
937 WMT_INFO_FUNC("WMT-CORE: retry (%d)\n", retry);
942 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WMT] = DRV_STS_POWER_ON;
945 iRet = wmt_core_stp_init();
947 WMT_ERR_FUNC("WMT-CORE: wmt_core_stp_init fail (%d)\n", iRet);
951 iRet = wmt_core_stp_deinit();
952 iRet = opfunc_pwr_off(pWmtOp);
954 WMT_ERR_FUNC("WMT-CORE: opfunc_pwr_off fail during pwr_on retry\n");
958 WMT_INFO_FUNC("WMT-CORE: retry (%d)\n", retry);
965 WMT_DBG_FUNC("WMT-CORE: WMT [FUNC_ON]\n");
966 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WMT] = DRV_STS_FUNC_ON;
968 /* What to do when state is changed from POWER_OFF to POWER_ON?
969 * 1. STP driver does s/w reset
970 * 2. UART does 0xFF wake up
971 * 3. SDIO does re-init command(changed to trigger by host)
977 static INT32 opfunc_pwr_off(P_WMT_OP pWmtOp)
984 if (DRV_STS_POWER_OFF == gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WMT]) {
985 WMT_WARN_FUNC("WMT-CORE: WMT already off, WMT DRV_STS_[0x%x]\n", gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WMT]);
990 /* wmt and stp are initialized successfully */
991 if (DRV_STS_FUNC_ON == gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WMT]) {
992 iRet = wmt_core_stp_deinit();
994 WMT_WARN_FUNC("wmt_core_stp_deinit fail (%d)\n", iRet);
995 /*should let run to power down chip*/
998 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WMT] = DRV_STS_POWER_ON;
1000 /* power off control */
1003 iRet = wmt_core_ctrl(WMT_CTRL_HW_PWR_OFF, &ctrlPa1, &ctrlPa2) ;
1005 WMT_WARN_FUNC("HW_PWR_OFF fail (%d)\n", iRet);
1008 WMT_WARN_FUNC("HW_PWR_OFF ok\n");
1011 /*anyway, set to POWER_OFF state */
1012 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WMT] = DRV_STS_POWER_OFF;
1023 INT32 iPwrOffRet = -1;
1028 drvType = pWmtOp->au4OpData[0];
1030 /* Check abnormal type */
1031 if (WMTDRV_TYPE_COREDUMP < drvType) {
1032 WMT_ERR_FUNC("abnormal Fun(%d)\n",
1038 /* Check abnormal state */
1039 if ( (DRV_STS_POWER_OFF > gMtkWmtCtx.eDrvStatus[drvType])
1040 || (DRV_STS_MAX <= gMtkWmtCtx.eDrvStatus[drvType]) ) {
1041 WMT_ERR_FUNC("func(%d) status[0x%x] abnormal\n",
1043 gMtkWmtCtx.eDrvStatus[drvType]);
1048 /* check if func already on */
1049 if (DRV_STS_FUNC_ON == gMtkWmtCtx.eDrvStatus[drvType]) {
1050 WMT_WARN_FUNC("func(%d) already on\n", drvType);
1054 /* check if chip power on is needed */
1055 if (DRV_STS_FUNC_ON != gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WMT]) {
1056 iRet = opfunc_pwr_on(pWmtOp);
1059 WMT_ERR_FUNC("func(%d) pwr_on fail(%d)\n", drvType, iRet);
1062 /* check all sub-func and do power off */
1067 if (WMTDRV_TYPE_WMT > drvType) {
1068 if (NULL != gpWmtFuncOps[drvType] && NULL != gpWmtFuncOps[drvType]->func_on)
1071 /* special handling for Wi-Fi */
1072 if (WMTDRV_TYPE_WIFI == drvType) {
1073 if (WMT_HIF_UART == gMtkWmtCtx.wmtHifConf.hifType) {
1074 ctrlPa1 = WMT_SDIO_SLOT_SDIO1;
1075 ctrlPa2 = 1; /* turn on SDIO1 slot */
1076 iRet = wmt_core_ctrl(WMT_CTRL_SDIO_HW, &ctrlPa1, &ctrlPa2) ;
1078 WMT_ERR_FUNC("turn on SLOT_SDIO1 fail (%d)\n", iRet);
1080 /* check all sub-func and do power off */
1083 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_SDIO1] = DRV_STS_FUNC_ON;
1086 else if (WMT_HIF_SDIO == gMtkWmtCtx.wmtHifConf.hifType) {
1087 if (DRV_STS_FUNC_ON == gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_SDIO2]) {
1088 WMT_DBG_FUNC("SLOT_SDIO2 ready for WIFI\n");
1091 /* SDIO2 slot power shall be either turned on in STP init
1092 * procedures already, or failed in STP init before. Here is
1093 * the assert condition.
1095 WMT_ERR_FUNC("WMT-CORE: turn on Wi-Fi in comm SDIO2 but SDIO in FUNC_OFF state(0x%x)\n", gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_SDIO2]);
1101 WMT_ERR_FUNC("WMT-CORE: error, not implemented yet gMtkWmtCtx.wmtHifConf.hifType: 0x%x, unspecified wifi_hif\n", gMtkWmtCtx.wmtHifConf.hifType);
1102 // TODO: Wi-Fi/WMT uses other interfaces. NOT IMPLEMENTED YET!
1106 iRet = (*(gpWmtFuncOps[drvType]->func_on))(gMtkWmtCtx.p_ic_ops, wmt_conf_get_cfg());
1109 if (WMTDRV_TYPE_WIFI == drvType && WMT_HIF_UART == gMtkWmtCtx.wmtHifConf.hifType) {
1110 /*need to power SDIO off when Power on Wi-Fi fail, in case of power leakage and right SDIO power status maintain*/
1111 ctrlPa1 = WMT_SDIO_SLOT_SDIO1;
1112 ctrlPa2 = 0; /* turn off SDIO1 slot */
1113 wmt_core_ctrl(WMT_CTRL_SDIO_HW, &ctrlPa1, &ctrlPa2) ;
1114 //does not need to check turn off result
1115 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_SDIO1] = DRV_STS_POWER_OFF;
1118 gMtkWmtCtx.eDrvStatus[drvType] = DRV_STS_POWER_OFF;
1122 gMtkWmtCtx.eDrvStatus[drvType] = DRV_STS_FUNC_ON;
1127 WMT_WARN_FUNC("WMT-CORE: ops for type(%d) not found\n", drvType);
1133 if (WMTDRV_TYPE_LPBK == drvType) {
1134 gMtkWmtCtx.eDrvStatus[drvType] = DRV_STS_FUNC_ON;
1136 else if (WMTDRV_TYPE_COREDUMP == drvType) {
1137 gMtkWmtCtx.eDrvStatus[drvType] = DRV_STS_FUNC_ON;
1143 WMT_ERR_FUNC("WMT-CORE:type(0x%x) function on failed, ret(%d)\n", drvType, iRet);
1145 //FIX-ME:[Chaozhong Liang], Error handling? check subsystem state and do pwr off if necessary?
1146 /* check all sub-func and do power off */
1147 if ( (DRV_STS_POWER_OFF == gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_BT]) &&
1148 (DRV_STS_POWER_OFF == gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_GPS]) &&
1149 (DRV_STS_POWER_OFF == gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_FM]) &&
1150 (DRV_STS_POWER_OFF == gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WIFI]) &&
1151 (DRV_STS_POWER_OFF == gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_LPBK]) &&
1152 (DRV_STS_POWER_OFF == gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_COREDUMP])) {
1153 WMT_INFO_FUNC("WMT-CORE:Fun(%d) [POWER_OFF] and power down chip\n", drvType);
1155 iPwrOffRet = opfunc_pwr_off(pWmtOp);
1157 WMT_ERR_FUNC("WMT-CORE: wmt_pwr_off fail(%d) when turn off func(%d)\n", iPwrOffRet, drvType);
1164 wmt_core_dump_func_state("AF FUNC ON");
1169 static INT32 opfunc_func_off(P_WMT_OP pWmtOp)
1177 drvType = pWmtOp->au4OpData[0];
1178 /* Check abnormal type */
1179 if (WMTDRV_TYPE_COREDUMP < drvType) {
1180 WMT_ERR_FUNC("WMT-CORE: abnormal Fun(%d) in wmt_func_off \n", drvType);
1185 /* Check abnormal state */
1186 if (DRV_STS_MAX <= gMtkWmtCtx.eDrvStatus[drvType]) {
1187 WMT_ERR_FUNC("WMT-CORE: Fun(%d) DRV_STS_[0x%x] abnormal in wmt_func_off \n",
1189 gMtkWmtCtx.eDrvStatus[drvType]);
1194 if (DRV_STS_FUNC_ON != gMtkWmtCtx.eDrvStatus[drvType]) {
1195 WMT_WARN_FUNC("WMT-CORE: Fun(%d) DRV_STS_[0x%x] already non-FUN_ON in wmt_func_off \n",
1197 gMtkWmtCtx.eDrvStatus[drvType]);
1198 //needs to check 4 subsystem's state?
1200 }else if (WMTDRV_TYPE_WMT > drvType) {
1201 if (NULL != gpWmtFuncOps[drvType] && NULL != gpWmtFuncOps[drvType]->func_off)
1203 iRet = (*(gpWmtFuncOps[drvType]->func_off))(gMtkWmtCtx.p_ic_ops, wmt_conf_get_cfg());
1205 if (WMTDRV_TYPE_WIFI == drvType && WMT_HIF_UART == gMtkWmtCtx.wmtHifConf.hifType) {
1207 ctrlPa1 = WMT_SDIO_SLOT_SDIO1;
1208 ctrlPa2 = 0; /* turn off SDIO1 slot */
1209 iRet = wmt_core_ctrl(WMT_CTRL_SDIO_HW, &ctrlPa1, &ctrlPa2) ;
1211 WMT_ERR_FUNC("WMT-CORE: turn on SLOT_SDIO1 fail (%d)\n", iRet);
1213 /* check all sub-func and do power off */
1215 //Anyway, turn SDIO1 state to POWER_OFF state
1216 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_SDIO1] = DRV_STS_POWER_OFF;
1221 WMT_WARN_FUNC("WMT-CORE: ops for type(%d) not found\n", drvType);
1225 if (WMTDRV_TYPE_LPBK == drvType) {
1226 gMtkWmtCtx.eDrvStatus[drvType] = DRV_STS_POWER_OFF;
1227 }else if (WMTDRV_TYPE_COREDUMP == drvType) {
1228 gMtkWmtCtx.eDrvStatus[drvType] = DRV_STS_POWER_OFF;
1233 //shall we put device state to POWER_OFF state when fail?
1234 gMtkWmtCtx.eDrvStatus[drvType] = DRV_STS_POWER_OFF;
1236 WMT_ERR_FUNC("WMT-CORE: type(0x%x) function off failed, ret(%d)\n", drvType, iRet);
1238 //no matter subsystem function control fail or not, chip should be powered off when no subsystem is active
1243 /* check all sub-func and do power off */
1244 if ( (DRV_STS_POWER_OFF == gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_BT]) &&
1245 (DRV_STS_POWER_OFF == gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_GPS]) &&
1246 (DRV_STS_POWER_OFF == gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_FM]) &&
1247 (DRV_STS_POWER_OFF == gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WIFI]) &&
1248 (DRV_STS_POWER_OFF == gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_LPBK]) &&
1249 (DRV_STS_POWER_OFF == gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_COREDUMP])) {
1250 WMT_INFO_FUNC("WMT-CORE:Fun(%d) [POWER_OFF] and power down chip\n", drvType);
1252 iRet = opfunc_pwr_off(pWmtOp);
1254 WMT_ERR_FUNC("WMT-CORE: wmt_pwr_off fail(%d) when turn off func(%d)\n", iRet, drvType);
1259 wmt_core_dump_func_state("AF FUNC OFF");
1263 // TODO:[ChangeFeature][George] is this OP obsoleted?
1271 if (DRV_STS_FUNC_ON != gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WMT]) {
1272 WMT_ERR_FUNC("reg_rw when WMT is powered off\n");
1275 iret = wmt_core_reg_rw_raw(pWmtOp->au4OpData[0],
1276 pWmtOp->au4OpData[1],
1277 (PUINT32)pWmtOp->au4OpData[2],
1278 pWmtOp->au4OpData[3]);
1288 // TODO: [FixMe][George] is ok to leave this function empty???
1289 WMT_WARN_FUNC("EMPTY FUNCTION\n");
1293 static INT32 opfunc_pwr_sv(P_WMT_OP pWmtOp)
1298 UINT8 evt_buf[16] = {0};
1300 typedef INT32 (*STP_PSM_CB)(INT32);
1303 if (SLEEP == pWmtOp->au4OpData[0]) {
1304 WMT_DBG_FUNC("**** Send sleep command\n");
1305 //mtk_wcn_stp_set_psm_state(ACT_INACT);
1306 //(*kal_stp_flush_rx)(WMT_TASK_INDX);
1307 ret = wmt_core_tx(&WMT_SLEEP_CMD[0], sizeof(WMT_SLEEP_CMD), &u4_result, 0);
1308 if (ret || (u4_result != sizeof(WMT_SLEEP_CMD))) {
1309 WMT_ERR_FUNC("wmt_core: SLEEP_CMD ret(%d) cmd len err(%d, %d) ", ret, u4_result, sizeof(WMT_SLEEP_CMD));
1313 evt_len = sizeof(WMT_SLEEP_EVT);
1314 ret = wmt_core_rx(evt_buf, evt_len, &u4_result);
1315 if (ret || (u4_result != evt_len))
1317 wmt_core_rx_flush(WMT_TASK_INDX);
1318 WMT_ERR_FUNC("wmt_core: read SLEEP_EVT fail(%d) len(%d, %d)", ret, u4_result, evt_len);
1319 mtk_wcn_stp_dbg_dump_package();
1323 if (osal_memcmp(evt_buf, WMT_SLEEP_EVT, sizeof(WMT_SLEEP_EVT)) != 0)
1325 WMT_ERR_FUNC("wmt_core: compare WMT_SLEEP_EVT error\n");
1326 wmt_core_rx_flush(WMT_TASK_INDX);
1327 WMT_ERR_FUNC("wmt_core: rx(%d):[%02X,%02X,%02X,%02X,%02X,%02X] exp(%d):[%02X,%02X,%02X,%02X,%02X,%02X]\n",
1328 u4_result, evt_buf[0], evt_buf[1], evt_buf[2], evt_buf[3], evt_buf[4], evt_buf[5],
1329 sizeof(WMT_SLEEP_EVT), WMT_SLEEP_EVT[0], WMT_SLEEP_EVT[1],
1330 WMT_SLEEP_EVT[2], WMT_SLEEP_EVT[3], WMT_SLEEP_EVT[4], WMT_SLEEP_EVT[5]);
1331 mtk_wcn_stp_dbg_dump_package();
1336 WMT_INFO_FUNC("Send sleep command OK!\n");
1339 else if (pWmtOp->au4OpData[0] == WAKEUP)
1341 WMT_DBG_FUNC("**** Send wakeup command\n");
1342 ret = wmt_core_tx(WMT_WAKEUP_CMD, sizeof(WMT_WAKEUP_CMD), &u4_result, 1);
1344 if (ret || (u4_result != sizeof(WMT_WAKEUP_CMD)))
1346 wmt_core_rx_flush(WMT_TASK_INDX);
1347 WMT_ERR_FUNC("wmt_core: WAKEUP_CMD ret(%d) cmd len err(%d, %d) ", ret, u4_result, sizeof(WMT_WAKEUP_CMD));
1351 evt_len = sizeof(WMT_WAKEUP_EVT);
1352 ret = wmt_core_rx(evt_buf, evt_len, &u4_result);
1353 if (ret || (u4_result != evt_len))
1355 WMT_ERR_FUNC("wmt_core: read WAKEUP_EVT fail(%d) len(%d, %d)", ret, u4_result, evt_len);
1356 mtk_wcn_stp_dbg_dump_package();
1360 if (osal_memcmp(evt_buf, WMT_WAKEUP_EVT, sizeof(WMT_WAKEUP_EVT)) != 0)
1362 WMT_ERR_FUNC("wmt_core: compare WMT_WAKEUP_EVT error\n");
1363 wmt_core_rx_flush(WMT_TASK_INDX);
1364 WMT_ERR_FUNC("wmt_core: rx(%d):[%02X,%02X,%02X,%02X,%02X,%02X] exp(%d):[%02X,%02X,%02X,%02X,%02X,%02X]\n",
1365 u4_result, evt_buf[0], evt_buf[1], evt_buf[2], evt_buf[3], evt_buf[4], evt_buf[5],
1366 sizeof(WMT_WAKEUP_EVT), WMT_WAKEUP_EVT[0], WMT_WAKEUP_EVT[1],
1367 WMT_WAKEUP_EVT[2], WMT_WAKEUP_EVT[3], WMT_WAKEUP_EVT[4], WMT_WAKEUP_EVT[5]);
1368 mtk_wcn_stp_dbg_dump_package();
1373 WMT_INFO_FUNC("Send wakeup command OK!\n");
1375 } else if (pWmtOp->au4OpData[0] == HOST_AWAKE){
1377 WMT_DBG_FUNC("**** Send host awake command\n");
1379 psm_cb = (STP_PSM_CB)pWmtOp->au4OpData[1];
1380 //(*kal_stp_flush_rx)(WMT_TASK_INDX);
1381 ret = wmt_core_tx(WMT_HOST_AWAKE_CMD, sizeof(WMT_HOST_AWAKE_CMD), &u4_result, 0);
1382 if (ret || (u4_result != sizeof(WMT_HOST_AWAKE_CMD)))
1384 WMT_ERR_FUNC("wmt_core: HOST_AWAKE_CMD ret(%d) cmd len err(%d, %d) ", ret, u4_result, sizeof(WMT_HOST_AWAKE_CMD));
1388 evt_len = sizeof(WMT_HOST_AWAKE_EVT);
1389 ret = wmt_core_rx(evt_buf, evt_len, &u4_result);
1390 if (ret || (u4_result != evt_len))
1392 wmt_core_rx_flush(WMT_TASK_INDX);
1393 WMT_ERR_FUNC("wmt_core: read HOST_AWAKE_EVT fail(%d) len(%d, %d)", ret, u4_result, evt_len);
1394 mtk_wcn_stp_dbg_dump_package();
1398 if (osal_memcmp(evt_buf, WMT_HOST_AWAKE_EVT, sizeof(WMT_HOST_AWAKE_EVT)) != 0)
1400 WMT_ERR_FUNC("wmt_core: compare WMT_HOST_AWAKE_EVT error\n");
1401 wmt_core_rx_flush(WMT_TASK_INDX);
1402 WMT_ERR_FUNC("wmt_core: rx(%d):[%02X,%02X,%02X,%02X,%02X,%02X] exp(%d):[%02X,%02X,%02X,%02X,%02X,%02X]\n",
1403 u4_result, evt_buf[0], evt_buf[1], evt_buf[2], evt_buf[3], evt_buf[4], evt_buf[5],
1404 sizeof(WMT_HOST_AWAKE_EVT), WMT_HOST_AWAKE_EVT[0], WMT_HOST_AWAKE_EVT[1],
1405 WMT_HOST_AWAKE_EVT[2], WMT_HOST_AWAKE_EVT[3], WMT_HOST_AWAKE_EVT[4], WMT_HOST_AWAKE_EVT[5]);
1406 mtk_wcn_stp_dbg_dump_package();
1411 WMT_INFO_FUNC("Send host awake command OK!\n");
1416 if (pWmtOp->au4OpData[0] < STP_PSM_MAX_ACTION) {
1417 psm_cb = (STP_PSM_CB)pWmtOp->au4OpData[1];
1418 WMT_DBG_FUNC("Do STP-CB! %d %p\n", pWmtOp->au4OpData[0], (PVOID)pWmtOp->au4OpData[1]);
1419 if (NULL != psm_cb) {
1420 psm_cb(pWmtOp->au4OpData[0]);
1423 WMT_ERR_FUNC("fatal error !!!, psm_cb = %p, god, someone must have corrupted our memory.\n", psm_cb);
1430 static INT32 opfunc_dsns(P_WMT_OP pWmtOp)
1436 UINT8 evtBuf[16] = {0};
1438 WMT_DSNS_CMD[4] = pWmtOp->au4OpData[0];
1439 WMT_DSNS_CMD[5] = pWmtOp->au4OpData[1];
1442 //iRet = (*kal_stp_tx)(WMT_DSNS_CMD, osal_sizeof(WMT_DSNS_CMD), &u4Res);
1443 iRet = wmt_core_tx((PUINT8)WMT_DSNS_CMD, osal_sizeof(WMT_DSNS_CMD), &u4Res, MTK_WCN_BOOL_FALSE);
1444 if (iRet || (u4Res != osal_sizeof(WMT_DSNS_CMD))) {
1445 WMT_ERR_FUNC("WMT-CORE: DSNS_CMD iRet(%d) cmd len err(%d, %d) \n", iRet, u4Res, osal_sizeof(WMT_DSNS_CMD));
1449 evtLen = osal_sizeof(WMT_DSNS_EVT);
1451 iRet = wmt_core_rx(evtBuf, evtLen, &u4Res);
1452 if (iRet || (u4Res != evtLen)) {
1453 WMT_ERR_FUNC("WMT-CORE: read DSNS_EVT fail(%d) len(%d, %d)\n", iRet, u4Res, evtLen);
1454 mtk_wcn_stp_dbg_dump_package();
1458 if (osal_memcmp(evtBuf, WMT_DSNS_EVT, osal_sizeof(WMT_DSNS_EVT)) != 0) {
1459 WMT_ERR_FUNC("WMT-CORE: compare WMT_DSNS_EVT error\n");
1460 WMT_ERR_FUNC("WMT-CORE: rx(%d):[%02X,%02X,%02X,%02X,%02X] exp(%d):[%02X,%02X,%02X,%02X,%02X]\n",
1461 u4Res, evtBuf[0], evtBuf[1], evtBuf[2], evtBuf[3], evtBuf[4],
1462 osal_sizeof(WMT_DSNS_EVT), WMT_DSNS_EVT[0], WMT_DSNS_EVT[1], WMT_DSNS_EVT[2], WMT_DSNS_EVT[3], WMT_DSNS_EVT[4]);
1464 WMT_INFO_FUNC("Send WMT_DSNS_CMD command OK!\n");
1471 static INT32 opfunc_lpbk(P_WMT_OP pWmtOp)
1475 UINT32 u4WrittenSize = 0;
1476 UINT32 u4ReadSize = 0;
1477 UINT32 buf_length = 0;
1478 UINT32 *pbuffer = NULL;
1481 UINT8 WMT_TEST_LPBK_CMD[] = {0x1, 0x2, 0x0, 0x0, 0x7};
1482 UINT8 WMT_TEST_LPBK_EVT[] = {0x2, 0x2, 0x0, 0x0, 0x0};
1484 //UINT8 lpbk_buf[1024 + 5] = {0};
1485 MTK_WCN_BOOL fgFail;
1486 buf_length = pWmtOp->au4OpData[0]; //packet length
1487 pbuffer = (VOID *)pWmtOp->au4OpData[1]; //packet buffer pointer
1488 WMT_DBG_FUNC("WMT-CORE: -->wmt_do_lpbk \n");
1489 /*check if WMTDRV_TYPE_LPBK function is already on */
1490 if (DRV_STS_FUNC_ON!= gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_LPBK] || buf_length + osal_sizeof(WMT_TEST_LPBK_CMD) > osal_sizeof(gLpbkBuf)) {
1491 WMT_ERR_FUNC("WMT-CORE: abnormal LPBK in wmt_do_lpbk\n");
1495 /*package loopback for STP*/
1498 osal_memset(gLpbkBuf, 0, osal_sizeof(gLpbkBuf));
1500 len_in_cmd = buf_length + 1; /* add flag field */
1502 osal_memcpy(&WMT_TEST_LPBK_CMD[2], &len_in_cmd, 2);
1503 osal_memcpy(&WMT_TEST_LPBK_EVT[2], &len_in_cmd, 2);
1506 osal_memcpy(gLpbkBuf, WMT_TEST_LPBK_CMD, osal_sizeof(WMT_TEST_LPBK_CMD));
1507 osal_memcpy(gLpbkBuf + osal_sizeof(WMT_TEST_LPBK_CMD), pbuffer, buf_length);
1510 fgFail = MTK_WCN_BOOL_TRUE;
1511 /*send packet through STP*/
1513 //iRet = (*kal_stp_tx)((PUINT8)gLpbkBuf, osal_sizeof(WMT_TEST_LPBK_CMD) + buf_length, &u4WrittenSize);
1514 iRet = wmt_core_tx((PUINT8)gLpbkBuf, (osal_sizeof(WMT_TEST_LPBK_CMD) + buf_length), &u4WrittenSize, MTK_WCN_BOOL_FALSE);
1516 WMT_ERR_FUNC("opfunc_lpbk wmt_core_tx failed \n");
1519 /*receive firmware response from STP*/
1520 iRet = wmt_core_rx((PUINT8)gLpbkBuf, (osal_sizeof(WMT_TEST_LPBK_EVT) + buf_length), &u4ReadSize);
1522 WMT_ERR_FUNC("opfunc_lpbk wmt_core_rx failed \n");
1525 /*check if loopback response ok or not*/
1526 if (u4ReadSize != (osal_sizeof(WMT_TEST_LPBK_CMD) + buf_length)) {
1527 WMT_ERR_FUNC("lpbk event read size wrong(%d, %d) \n", u4ReadSize, (osal_sizeof(WMT_TEST_LPBK_CMD) + buf_length));
1530 if (osal_memcmp(WMT_TEST_LPBK_EVT, gLpbkBuf, osal_sizeof(WMT_TEST_LPBK_EVT))) {
1531 WMT_ERR_FUNC("WMT-CORE WMT_TEST_LPBK_EVT error! read len %d [%02x,%02x,%02x,%02x,%02x] \n",
1533 gLpbkBuf[0], gLpbkBuf[1], gLpbkBuf[2], gLpbkBuf[3], gLpbkBuf[4]
1537 pWmtOp->au4OpData[0] = u4ReadSize - osal_sizeof(WMT_TEST_LPBK_EVT);
1538 osal_memcpy((VOID *)pWmtOp->au4OpData[1], gLpbkBuf + osal_sizeof(WMT_TEST_LPBK_CMD), buf_length);
1539 fgFail = MTK_WCN_BOOL_FALSE;
1542 //WMT_DBG_FUNC("WMT-CORE: <--wmt_do_lpbk, fgFail = %d \n", fgFail);
1547 static INT32 opfunc_cmd_test(P_WMT_OP pWmtOp)
1556 UINT8 tstEvtTmp[64];
1558 UINT32 tstCmdSz = 0;
1559 UINT32 tstEvtSz = 0;
1562 UINT32 resBufRoom = 0;
1563 /*test command list*/
1565 UINT8 WMT_ASSERT_CMD[] = {0x01, 0x02, 0x01, 0x00, 0x08};
1566 UINT8 WMT_ASSERT_EVT[] = {0x02, 0x02, 0x00, 0x00, 0x00};
1567 UINT8 WMT_EXCEPTION_CMD[] = {0x01, 0x02, 0x01, 0x00, 0x09};
1568 UINT8 WMT_EXCEPTION_EVT[] = {0x02, 0x02, 0x00, 0x00, 0x00};
1570 UINT8 WMT_COEXDBG_CMD[] = {0x01,0x10,0x02,0x00,
1572 0xAA /*Debugging Parameter*/
1574 UINT8 WMT_COEXDBG_1_EVT[] = {0x02,0x10,0x05,0x00,
1576 0xAA,0xAA,0xAA,0xAA /*event content*/
1578 UINT8 WMT_COEXDBG_2_EVT[] = {0x02,0x10,0x07,0x00,
1580 0xAA,0xAA,0xAA,0xAA,0xBB,0xBB /*event content*/
1582 UINT8 WMT_COEXDBG_3_EVT[] = {0x02,0x10,0x0B,0x00,
1584 0xAA,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB /*event content*/
1586 /*test command list -end*/
1588 cmdNo = pWmtOp->au4OpData[0];
1590 WMT_INFO_FUNC("Send Test command %d!\n", cmdNo);
1593 WMT_INFO_FUNC("Send Assert command !\n");
1594 tstCmdSz = osal_sizeof(WMT_ASSERT_CMD);
1595 tstEvtSz = osal_sizeof(WMT_ASSERT_EVT);
1596 osal_memcpy(tstCmd, WMT_ASSERT_CMD, tstCmdSz);
1597 osal_memcpy(tstEvt, WMT_ASSERT_EVT, tstEvtSz);
1598 } else if (cmdNo == 1) {
1600 WMT_INFO_FUNC("Send Exception command !\n");
1601 tstCmdSz = osal_sizeof(WMT_EXCEPTION_CMD);
1602 tstEvtSz = osal_sizeof(WMT_EXCEPTION_EVT);
1603 osal_memcpy(tstCmd, WMT_EXCEPTION_CMD, tstCmdSz);
1604 osal_memcpy(tstEvt, WMT_EXCEPTION_EVT, tstEvtSz);
1605 } else if (cmdNo == 2) {
1606 cmdNoPa = pWmtOp->au4OpData[1];
1607 pRes = (UINT8 *)pWmtOp->au4OpData[2];
1608 resBufRoom = pWmtOp->au4OpData[3];
1609 if ((cmdNoPa >= 0x0) && (cmdNoPa <= 0xf)) {
1610 WMT_INFO_FUNC("Send Coexistence Debug command [0x%x]!\n", cmdNoPa);
1611 tstCmdSz = osal_sizeof(WMT_COEXDBG_CMD);
1612 osal_memcpy(tstCmd, WMT_COEXDBG_CMD, tstCmdSz);
1614 tstCmd[5] = cmdNoPa;
1617 /*setup the expected event length*/
1618 if (cmdNoPa >= 0x0 && cmdNoPa <= 0x4) {
1619 tstEvtSz = osal_sizeof(WMT_COEXDBG_1_EVT);
1620 osal_memcpy(tstEvt, WMT_COEXDBG_1_EVT, tstEvtSz);
1621 }else if (cmdNoPa == 0x5) {
1622 tstEvtSz = osal_sizeof(WMT_COEXDBG_2_EVT);
1623 osal_memcpy(tstEvt, WMT_COEXDBG_2_EVT, tstEvtSz);
1624 }else if (cmdNoPa >= 0x6 && cmdNoPa <= 0xf) {
1625 tstEvtSz = osal_sizeof(WMT_COEXDBG_3_EVT);
1626 osal_memcpy(tstEvt, WMT_COEXDBG_3_EVT, tstEvtSz);
1632 WMT_ERR_FUNC("cmdNoPa is wrong\n");
1636 /*Placed youer test WMT command here, easiler to integrate and test with F/W side*/
1640 //iRet = (*kal_stp_tx)(tstCmd, tstCmdSz, &u4Res);
1641 iRet = wmt_core_tx((PUINT8)tstCmd, tstCmdSz, &u4Res, MTK_WCN_BOOL_FALSE);
1642 if (iRet || (u4Res != tstCmdSz)) {
1643 WMT_ERR_FUNC("WMT-CORE: wmt_cmd_test iRet(%d) cmd len err(%d, %d) \n", iRet, u4Res, tstCmdSz);
1647 if ((cmdNo == 0) || (cmdNo == 1)) {
1648 WMT_INFO_FUNC("WMT-CORE: not to rx event for assert command\n");
1652 iRet = wmt_core_rx(tstEvtTmp, tstEvtSz, &u4Res);
1654 /*Event Post Handling*/
1656 WMT_INFO_FUNC("#=========================================================#\n");
1657 WMT_INFO_FUNC("coext debugging id = %d", cmdNoPa);
1659 wmt_core_dump_data(&tstEvtTmp[5], "coex debugging ", tstEvtSz - 5);
1661 WMT_ERR_FUNC("error coex debugging event\n");
1663 /*put response to buffer for shell to read*/
1664 if (pRes != NULL && resBufRoom > 0)
1666 pWmtOp->au4OpData[3] = resBufRoom < tstEvtSz - 5 ? resBufRoom : tstEvtSz - 5;
1667 osal_memcpy(pRes, &tstEvtTmp[5], pWmtOp->au4OpData[3]);
1671 pWmtOp->au4OpData[3] = 0;
1673 WMT_INFO_FUNC("#=========================================================#\n");
1680 static INT32 opfunc_hw_rst(P_WMT_OP pWmtOp)
1687 wmt_core_dump_func_state("BE HW RST");
1688 /*-->Reset WMT data structure*/
1689 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_BT] = DRV_STS_POWER_OFF;
1690 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_FM] = DRV_STS_POWER_OFF;
1691 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_GPS] = DRV_STS_POWER_OFF;
1692 //gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WIFI] = DRV_STS_POWER_OFF;
1693 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_LPBK] = DRV_STS_POWER_OFF;
1694 //gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_SDIO1]= DRV_STS_POWER_OFF;
1695 //gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_SDIO2]= DRV_STS_POWER_OFF;
1696 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_STP] = DRV_STS_POWER_OFF;
1698 /* if wmt is poweroff, we need poweron chip first*/
1699 if (DRV_STS_POWER_OFF == gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WMT]) {
1700 WMT_WARN_FUNC("WMT-CORE: WMT is off, need re-poweron\n");
1701 /* power on control */
1704 iRet = wmt_core_ctrl(WMT_CTRL_HW_PWR_ON, &ctrlPa1, &ctrlPa2) ;
1706 WMT_ERR_FUNC("WMT-CORE: WMT_CTRL_HW_PWR_ON fail iRet(%d)\n", iRet);
1709 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WMT] = DRV_STS_POWER_ON;
1712 /*--> reset SDIO fucntion/slot additionally if wifi ON*/
1713 if (gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WIFI] == DRV_STS_FUNC_ON) {
1714 ctrlPa1 = WMT_SDIO_FUNC_WIFI;
1715 ctrlPa2 = 0; /* turn off Wi-Fi driver */
1716 iRet = wmt_core_ctrl(WMT_CTRL_SDIO_FUNC, &ctrlPa1, &ctrlPa2) ;
1718 WMT_ERR_FUNC("WMT-CORE: turn off SDIO_WIFI func fail (%d)\n", iRet);
1720 /* check all sub-func and do power off */
1722 WMT_INFO_FUNC("wmt core: turn off SDIO WIFI func ok!!\n");
1724 //Anyway, turn off Wi-Fi Function
1725 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WIFI] = DRV_STS_POWER_OFF;
1727 if (WMT_HIF_UART == gMtkWmtCtx.wmtHifConf.hifType) {
1728 ctrlPa1 = WMT_SDIO_SLOT_SDIO1;
1729 ctrlPa2 = 0; /* turn off SDIO1 slot */
1730 iRet = wmt_core_ctrl(WMT_CTRL_SDIO_HW, &ctrlPa1, &ctrlPa2) ;
1732 WMT_ERR_FUNC("WMT-CORE: turn off SLOT_SDIO1 fail (%d)\n", iRet);
1735 /* check all sub-func and do power off */
1737 WMT_INFO_FUNC("WMT-CORE: turn off SLOT_SDIO1 successfully (%d)\n", iRet);
1739 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_SDIO1] = DRV_STS_POWER_OFF;
1741 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WIFI] = DRV_STS_POWER_OFF;
1744 if (WMT_HIF_SDIO == gMtkWmtCtx.wmtHifConf.hifType) {
1745 ctrlPa1 = WMT_SDIO_FUNC_STP;
1746 ctrlPa2 = 0; /* turn off STP driver */
1747 iRet = wmt_core_ctrl(WMT_CTRL_SDIO_FUNC, &ctrlPa1, &ctrlPa2) ;
1749 WMT_ERR_FUNC("WMT-CORE: turn off SDIO_FUNC_STP func fail (%d)\n", iRet);
1751 /* check all sub-func and do power off */
1752 //goto stp_deinit_done;
1754 WMT_INFO_FUNC("WMT-CORE: turn off SDIO_FUNC_STP func successfully (%d)\n", iRet);
1757 ctrlPa1 = WMT_SDIO_SLOT_SDIO2;
1758 ctrlPa2 = 0; /* turn off SDIO2 slot */
1759 iRet = wmt_core_ctrl(WMT_CTRL_SDIO_HW, &ctrlPa1, &ctrlPa2) ;
1761 WMT_ERR_FUNC("WMT-CORE: turn off SLOT_SDIO2 fail (%d)\n", iRet);
1764 /* check all sub-func and do power off */
1765 //goto stp_deinit_done;
1767 WMT_INFO_FUNC("WMT-CORE: turn off SLOT_SDIO2 successfully (%d)\n", iRet);
1769 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_SDIO2] = DRV_STS_POWER_OFF;
1772 /*<4>Power off Combo chip*/
1773 ctrlPa1 = 0; ctrlPa2 = 0;
1774 iRet = wmt_core_ctrl(WMT_CTRL_HW_RST, &ctrlPa1, &ctrlPa2) ;
1776 WMT_ERR_FUNC("WMT-CORE: [HW RST] WMT_CTRL_POWER_OFF fail (%d)", iRet);
1778 WMT_INFO_FUNC("WMT-CORE: [HW RST] WMT_CTRL_POWER_OFF ok (%d)", iRet);
1781 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WMT] = DRV_STS_POWER_OFF;
1783 /*-->PesetCombo chip*/
1784 iRet = wmt_core_ctrl(WMT_CTRL_HW_RST, &ctrlPa1, &ctrlPa2) ;
1786 WMT_ERR_FUNC("WMT-CORE: -->[HW RST] fail iRet(%d)\n", iRet);
1788 WMT_INFO_FUNC("WMT-CORE: -->[HW RST] ok\n");
1792 ctrlPa1 = 0; ctrlPa2 = 0;
1793 iRet = wmt_core_ctrl(WMT_CTRL_STP_CLOSE, &ctrlPa1, &ctrlPa2);
1795 WMT_ERR_FUNC("WMT-CORE: wmt close stp failed\n");
1799 wmt_core_dump_func_state("AF HW RST");
1804 static INT32 opfunc_sw_rst(P_WMT_OP pWmtOp)
1808 if (NULL != gMtkWmtCtx.p_ic_ops->swInit)
1810 iRet = (*(gMtkWmtCtx.p_ic_ops->swInit))(&gMtkWmtCtx.wmtHifConf);
1814 WMT_ERR_FUNC("WMT-CORE: error, gMtkWmtCtx.p_ic_ops->swInit(NULL)\n");
1819 WMT_ERR_FUNC("WMT-CORE: WMT-->[FUNC_ON] succeed\n");
1820 gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WMT] = DRV_STS_FUNC_ON;
1826 return wmt_core_stp_init();
1829 static INT32 opfunc_stp_rst(P_WMT_OP pWmtOp)
1835 static INT32 opfunc_therm_ctrl(P_WMT_OP pWmtOp)
1841 UINT8 evtBuf[16] = {0};
1843 WMT_THERM_CMD[4] = pWmtOp->au4OpData[0];/*CMD type, refer to ENUM_WMTTHERM_TYPE_T*/
1846 //iRet = (*kal_stp_tx)(WMT_THERM_CMD, osal_sizeof(WMT_THERM_CMD), &u4Res);
1847 iRet = wmt_core_tx((PUINT8)WMT_THERM_CMD, osal_sizeof(WMT_THERM_CMD), &u4Res, MTK_WCN_BOOL_FALSE);
1848 if (iRet || (u4Res != osal_sizeof(WMT_THERM_CMD))) {
1849 WMT_ERR_FUNC("WMT-CORE: THERM_CTRL_CMD iRet(%d) cmd len err(%d, %d) \n", iRet, u4Res, osal_sizeof(WMT_THERM_CMD));
1855 iRet = wmt_core_rx(evtBuf, evtLen, &u4Res);
1856 if (iRet || ((u4Res != osal_sizeof(WMT_THERM_CTRL_EVT)) && (u4Res != osal_sizeof(WMT_THERM_READ_EVT) ))) {
1857 WMT_ERR_FUNC("WMT-CORE: read THERM_CTRL_EVT/THERM_READ_EVENT fail(%d) len(%d, %d)\n", iRet, u4Res, evtLen);
1858 mtk_wcn_stp_dbg_dump_package();
1861 if (u4Res == osal_sizeof(WMT_THERM_CTRL_EVT))
1863 if (osal_memcmp(evtBuf, WMT_THERM_CTRL_EVT, osal_sizeof(WMT_THERM_CTRL_EVT)) != 0) {
1864 WMT_ERR_FUNC("WMT-CORE: compare WMT_THERM_CTRL_EVT error\n");
1865 WMT_ERR_FUNC("WMT-CORE: rx(%d):[%02X,%02X,%02X,%02X,%02X] exp(%d):[%02X,%02X,%02X,%02X,%02X]\n",
1866 u4Res, evtBuf[0], evtBuf[1], evtBuf[2], evtBuf[3],evtBuf[4],
1867 osal_sizeof(WMT_THERM_CTRL_EVT), WMT_THERM_CTRL_EVT[0], WMT_THERM_CTRL_EVT[1], WMT_THERM_CTRL_EVT[2], WMT_THERM_CTRL_EVT[3], WMT_THERM_CTRL_EVT[4]);
1868 pWmtOp->au4OpData[1] = MTK_WCN_BOOL_FALSE;/*will return to function driver*/
1869 mtk_wcn_stp_dbg_dump_package();
1871 WMT_INFO_FUNC("Send WMT_THERM_CTRL_CMD command OK!\n");
1872 pWmtOp->au4OpData[1] = MTK_WCN_BOOL_TRUE;/*will return to function driver*/
1877 /*no need to judge the real thermal value*/
1878 if (osal_memcmp(evtBuf, WMT_THERM_READ_EVT, osal_sizeof(WMT_THERM_READ_EVT) - 1) != 0) {
1879 WMT_ERR_FUNC("WMT-CORE: compare WMT_THERM_READ_EVT error\n");
1880 WMT_ERR_FUNC("WMT-CORE: rx(%d):[%02X,%02X,%02X,%02X,%02X,%02X] exp(%d):[%02X,%02X,%02X,%02X]\n",
1881 u4Res, evtBuf[0], evtBuf[1], evtBuf[2], evtBuf[3],evtBuf[4],evtBuf[5],
1882 osal_sizeof(WMT_THERM_READ_EVT), WMT_THERM_READ_EVT[0], WMT_THERM_READ_EVT[1], WMT_THERM_READ_EVT[2], WMT_THERM_READ_EVT[3]);
1883 pWmtOp->au4OpData[1] = 0xFF; /*will return to function driver*/
1884 mtk_wcn_stp_dbg_dump_package();
1886 WMT_INFO_FUNC("Send WMT_THERM_READ_CMD command OK!\n");
1887 pWmtOp->au4OpData[1] = evtBuf[5];/*will return to function driver*/
1895 static INT32 opfunc_efuse_rw(P_WMT_OP pWmtOp)
1901 UINT8 evtBuf[16] = {0};
1903 if (DRV_STS_FUNC_ON != gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WMT]) {
1904 WMT_ERR_FUNC("WMT-CORE: wmt_efuse_rw fail: chip is powered off\n");
1908 WMT_EFUSE_CMD[4] = (pWmtOp->au4OpData[0]) ? 0x1 : 0x2; /* w:2, r:1 */
1909 osal_memcpy(&WMT_EFUSE_CMD[6], (PUINT8)&pWmtOp->au4OpData[1], 2); /* address */
1910 osal_memcpy(&WMT_EFUSE_CMD[8], (PUINT32)pWmtOp->au4OpData[2], 4); /* value */
1912 wmt_core_dump_data(&WMT_EFUSE_CMD[0], "efuse_cmd", osal_sizeof(WMT_EFUSE_CMD));
1915 //iRet = (*kal_stp_tx)(WMT_EFUSE_CMD, osal_sizeof(WMT_EFUSE_CMD), &u4Res);
1916 iRet = wmt_core_tx((PUINT8)WMT_EFUSE_CMD, osal_sizeof(WMT_EFUSE_CMD), &u4Res, MTK_WCN_BOOL_FALSE);
1917 if (iRet || (u4Res != osal_sizeof(WMT_EFUSE_CMD))) {
1918 WMT_ERR_FUNC("WMT-CORE: EFUSE_CMD iRet(%d) cmd len err(%d, %d) \n", iRet, u4Res, osal_sizeof(WMT_EFUSE_CMD));
1922 evtLen = (pWmtOp->au4OpData[0]) ? osal_sizeof(WMT_EFUSE_EVT) : osal_sizeof(WMT_EFUSE_EVT);
1924 iRet = wmt_core_rx(evtBuf, evtLen, &u4Res);
1925 if (iRet || (u4Res != evtLen)) {
1926 WMT_ERR_FUNC("WMT-CORE: read REG_EVB fail(%d) len(%d, %d)\n", iRet, u4Res, evtLen);
1928 wmt_core_dump_data(&evtBuf[0], "efuse_evt", osal_sizeof(evtBuf));
1934 static INT32 opfunc_gpio_ctrl (P_WMT_OP pWmtOp)
1938 WMT_IC_PIN_STATE stat;
1941 if (DRV_STS_FUNC_ON != gMtkWmtCtx.eDrvStatus[WMTDRV_TYPE_WMT]) {
1942 WMT_ERR_FUNC("WMT-CORE: wmt_gpio_ctrl fail: chip is powered off\n");
1946 if (!gMtkWmtCtx.p_ic_ops->ic_pin_ctrl) {
1947 WMT_ERR_FUNC("WMT-CORE: error, gMtkWmtCtx.p_ic_ops->ic_pin_ctrl(NULL)\n");
1951 id = pWmtOp->au4OpData[0];
1952 stat = pWmtOp->au4OpData[1];
1953 flag = pWmtOp->au4OpData[2];
1955 WMT_INFO_FUNC("ic pin id:%d, stat:%d, flag:0x%x\n", id , stat, flag);
1957 iRet = (*(gMtkWmtCtx.p_ic_ops->ic_pin_ctrl))(id , stat, flag);
1962 //turn on/off sdio function
1963 INT32 opfunc_sdio_ctrl (P_WMT_OP pWmtOp)
1968 ctrlPa1 = WMT_HIF_SDIO == gMtkWmtCtx.wmtHifConf.hifType ? WMT_SDIO_SLOT_SDIO2 : WMT_SDIO_SLOT_SDIO1;
1969 ctrlPa2 = pWmtOp->au4OpData[0]; /* turn off/on SDIO slot */
1970 iRet = wmt_core_ctrl(WMT_CTRL_SDIO_HW, &ctrlPa1, &ctrlPa2) ;
1972 WMT_WARN_FUNC("SDIO hw ctrl fail ret(%d)\n", iRet);
1973 /* Anyway, continue turning STP SDIO to POWER OFF/ON state*/
1974 gMtkWmtCtx.eDrvStatus[ctrlPa1] = DRV_STS_POWER_OFF;
1977 WMT_INFO_FUNC("SDIO hw ctrl succeed \n");
1978 gMtkWmtCtx.eDrvStatus[ctrlPa1] = 0 ==ctrlPa2 ? DRV_STS_POWER_OFF : DRV_STS_POWER_ON;
1986 MTK_WCN_BOOL wmt_core_is_quick_ps_support (void)
1988 P_WMT_CTX pctx = &gMtkWmtCtx;
1989 if ((NULL != pctx->p_ic_ops) && (NULL != pctx->p_ic_ops->is_quick_sleep))
1991 return (*(pctx->p_ic_ops->is_quick_sleep))();
1993 return MTK_WCN_BOOL_FALSE;
1996 MTK_WCN_BOOL wmt_core_get_aee_dump_flag(void)
1998 MTK_WCN_BOOL bRet = MTK_WCN_BOOL_FALSE;
1999 P_WMT_CTX pctx = &gMtkWmtCtx;
2001 if ((NULL != pctx->p_ic_ops) && (NULL != pctx->p_ic_ops->is_aee_dump_support))
2003 bRet = (*(pctx->p_ic_ops->is_aee_dump_support))();
2007 bRet = MTK_WCN_BOOL_FALSE;
2014 INT32 opfunc_pin_state (P_WMT_OP pWmtOp)
2020 iRet = wmt_core_ctrl(WMT_CTRL_HW_STATE_DUMP, &ctrlPa1, &ctrlPa2) ;