static MTK_WCN_BOOL mtk_wcn_wmt_func_ctrl ( ENUM_WMTDRV_TYPE_T type, ENUM_WMT_OPID_T opId ) { P_OSAL_OP pOp; MTK_WCN_BOOL bRet; P_OSAL_SIGNAL pSignal; pOp = wmt_lib_get_free_op(); if (!pOp) { WMT_WARN_FUNC("get_free_lxop fail\n"); return MTK_WCN_BOOL_FALSE; } pSignal = &pOp->signal; pOp->op.opId = opId; #if MTK_WCN_CMB_FOR_SDIO_1V_AUTOK if(WMTDRV_TYPE_AUTOK == type) pOp->op.au4OpData[0] = WMTDRV_TYPE_WIFI; else #endif pOp->op.au4OpData[0] = type; if (WMTDRV_TYPE_WIFI == type) pSignal->timeoutValue = 4000; /*workaround, donot block system server/Init/Netd from longer than 5s, in case of ANR happens*/ else pSignal->timeoutValue = (WMT_OPID_FUNC_ON == pOp->op.opId) ? MAX_FUNC_ON_TIME : MAX_FUNC_OFF_TIME; WMT_INFO_FUNC("OPID(%d) type(%d) start\n", pOp->op.opId, pOp->op.au4OpData[0]); /*do not check return value, we will do this either way*/ wmt_lib_host_awake_get(); /*wake up chip first*/ if (DISABLE_PSM_MONITOR()) { WMT_ERR_FUNC("wake up failed\n"); wmt_lib_put_op_to_free_queue(pOp); return MTK_WCN_BOOL_FALSE; } bRet = wmt_lib_put_act_op(pOp); ENABLE_PSM_MONITOR(); wmt_lib_host_awake_put(); if (MTK_WCN_BOOL_FALSE == bRet) { WMT_WARN_FUNC("OPID(%d) type(%d) fail\n", pOp->op.opId, pOp->op.au4OpData[0]); } else{ WMT_INFO_FUNC("OPID(%d) type(%d) ok\n", pOp->op.opId, pOp->op.au4OpData[0]); } return bRet; }
INT8 mtk_wcn_wmt_therm_ctrl(ENUM_WMTTHERM_TYPE_T eType) #endif { P_OSAL_OP pOp; P_WMT_OP pOpData; MTK_WCN_BOOL bRet; P_OSAL_SIGNAL pSignal; /*parameter validation check */ if (WMTTHERM_MAX < eType || WMTTHERM_ENABLE > eType) { WMT_ERR_FUNC("invalid thermal control command (%d)\n", eType); return MTK_WCN_BOOL_FALSE; } /*check if chip support thermal control function or not */ bRet = wmt_lib_is_therm_ctrl_support(); if (MTK_WCN_BOOL_FALSE == bRet) { WMT_DBG_FUNC("thermal ctrl function not supported\n"); return MTK_WCN_BOOL_FALSE; } pOp = wmt_lib_get_free_op(); if (!pOp) { WMT_DBG_FUNC("get_free_lxop fail\n"); return MTK_WCN_BOOL_FALSE; } pSignal = &pOp->signal; pOpData = &pOp->op; pOpData->opId = WMT_OPID_THERM_CTRL; /*parameter fill */ pOpData->au4OpData[0] = eType; pSignal->timeoutValue = MAX_EACH_WMT_CMD; WMT_DBG_FUNC("OPID(%d) type(%d) start\n", pOp->op.opId, pOp->op.au4OpData[0]); if (DISABLE_PSM_MONITOR()) { WMT_ERR_FUNC("wake up failed\n"); wmt_lib_put_op_to_free_queue(pOp); return -1; } bRet = wmt_lib_put_act_op(pOp); ENABLE_PSM_MONITOR(); if (MTK_WCN_BOOL_FALSE == bRet) { WMT_WARN_FUNC("OPID(%d) type(%d) fail\n\n", pOpData->opId, pOpData->au4OpData[0]); /*0xFF means read error occurs */ pOpData->au4OpData[1] = (eType == WMTTHERM_READ) ? 0xFF : MTK_WCN_BOOL_FALSE; /*will return to function driver */ } else { WMT_DBG_FUNC("OPID(%d) type(%d) return(%d) ok\n\n", pOpData->opId, pOpData->au4OpData[0], pOpData->au4OpData[1]); } /*return value will be put to lxop->op.au4OpData[1] */ WMT_DBG_FUNC("therm ctrl type(%d), iRet(0x%08x)\n", eType, pOpData->au4OpData[1]); return (INT8) pOpData->au4OpData[1]; }
MTK_WCN_BOOL mtk_wcn_wmt_dsns_ctrl(ENUM_WMTDSNS_TYPE_T eType) #endif { P_OSAL_OP pOp; P_WMT_OP pOpData; MTK_WCN_BOOL bRet; P_OSAL_SIGNAL pSignal; if (WMTDSNS_MAX <= eType) { WMT_ERR_FUNC("invalid desense control command (%d)\n", eType); return MTK_WCN_BOOL_FALSE; } /*check if chip support thermal control function or not */ bRet = wmt_lib_is_dsns_ctrl_support(); if (MTK_WCN_BOOL_FALSE == bRet) { WMT_ERR_FUNC("thermal ctrl function not supported\n"); return MTK_WCN_BOOL_FALSE; } pOp = wmt_lib_get_free_op(); if (!pOp) { WMT_DBG_FUNC("get_free_lxop fail\n"); return MTK_WCN_BOOL_FALSE; } pSignal = &pOp->signal; pOpData = &pOp->op; pOpData->opId = WMT_OPID_DSNS; pSignal->timeoutValue = MAX_EACH_WMT_CMD; /*parameter fill */ if ((WMTDSNS_FM_DISABLE <= eType) && (WMTDSNS_FM_GPS_ENABLE >= eType)) { pOpData->au4OpData[0] = WMTDRV_TYPE_FM; pOpData->au4OpData[1] = eType; } WMT_INFO_FUNC("OPID(%d) type(%d) start\n", pOp->op.opId, pOp->op.au4OpData[0]); if (DISABLE_PSM_MONITOR()) { WMT_ERR_FUNC("wake up failed\n"); wmt_lib_put_op_to_free_queue(pOp); return MTK_WCN_BOOL_FALSE; } bRet = wmt_lib_put_act_op(pOp); ENABLE_PSM_MONITOR(); if (MTK_WCN_BOOL_FALSE == bRet) { WMT_WARN_FUNC("OPID(%d) type(%d) fail\n\n", pOpData->opId, pOpData->au4OpData[0]); } else { WMT_INFO_FUNC("OPID(%d) type(%d) ok\n\n", pOpData->opId, pOpData->au4OpData[0]); } return bRet; }
static MTK_WCN_BOOL mtk_wcn_wmt_func_ctrl ( ENUM_WMTDRV_TYPE_T type, ENUM_WMT_OPID_T opId ) { P_OSAL_OP pOp; MTK_WCN_BOOL bRet; P_OSAL_SIGNAL pSignal; pOp = wmt_lib_get_free_op(); if (!pOp) { WMT_WARN_FUNC("get_free_lxop fail\n"); return MTK_WCN_BOOL_FALSE; } pSignal = &pOp->signal; pOp->op.opId = opId; pOp->op.au4OpData[0] = type; pSignal->timeoutValue= (WMT_OPID_FUNC_ON == pOp->op.opId) ? MAX_FUNC_ON_TIME : MAX_FUNC_OFF_TIME; WMT_INFO_FUNC("OPID(%d) type(%d) start\n", pOp->op.opId, pOp->op.au4OpData[0]); /*do not check return value, we will do this either way*/ wmt_lib_host_awake_get(); /*wake up chip first*/ if (DISABLE_PSM_MONITOR()) { WMT_ERR_FUNC("wake up failed\n"); wmt_lib_put_op_to_free_queue(pOp); return MTK_WCN_BOOL_FALSE; } bRet = wmt_lib_put_act_op(pOp); ENABLE_PSM_MONITOR(); wmt_lib_host_awake_put(); if (MTK_WCN_BOOL_FALSE == bRet) { WMT_WARN_FUNC("OPID(%d) type(%d) fail\n", pOp->op.opId, pOp->op.au4OpData[0]); } else{ WMT_INFO_FUNC("OPID(%d) type(%d) ok\n", pOp->op.opId, pOp->op.au4OpData[0]); } return bRet; }
MTK_WCN_BOOL mtk_wcn_wmt_assert ( ENUM_WMTDRV_TYPE_T type, UINT32 reason ) #endif { P_OSAL_OP pOp = NULL; MTK_WCN_BOOL bRet = MTK_WCN_BOOL_FALSE; P_OSAL_SIGNAL pSignal; pOp = wmt_lib_get_free_op(); if (!pOp ) { WMT_WARN_FUNC("get_free_lxop fail\n"); return MTK_WCN_BOOL_FALSE; } pSignal = &pOp ->signal; pOp ->op.opId = WMT_OPID_CMD_TEST; pSignal->timeoutValue= MAX_EACH_WMT_CMD; /*this test command should be run with usb cable connected, so no host awake is needed*/ //wmt_lib_host_awake_get(); pOp->op.au4OpData[0] = 0; /*wake up chip first*/ if (DISABLE_PSM_MONITOR()) { WMT_ERR_FUNC("wake up failed\n"); wmt_lib_put_op_to_free_queue(pOp); return MTK_WCN_BOOL_FALSE; } bRet = wmt_lib_put_act_op(pOp); ENABLE_PSM_MONITOR(); //wmt_lib_host_awake_put(); WMT_INFO_FUNC("CMD_TEST, opid (%d), par(%d, %d), ret(%d), result(%s)\n", \ pOp->op.opId, \ pOp->op.au4OpData[0], \ pOp->op.au4OpData[1], \ bRet, \ MTK_WCN_BOOL_FALSE == bRet ? "failed" : "succeed"\ ); return bRet; }
INT32 wmt_dbg_reg_write(INT32 par1, INT32 par2, INT32 par3) { //par2-->register address //par3-->value to set UINT32 iRet = -1; #if 0 DISABLE_PSM_MONITOR(); iRet = wmt_core_reg_rw_raw(1, par2, &par3, 0xffffffff); ENABLE_PSM_MONITOR(); #endif iRet = wmt_lib_reg_rw(1, par2, &par3, 0xffffffff); WMT_INFO_FUNC("write combo chip register (0x%08x) with value (0x%08x) %s\n", \ par2, \ par3, \ iRet != 0 ? "failed" : "succeed"\ ); return 0; }
INT32 wmt_dbg_reg_read(INT32 par1, INT32 par2, INT32 par3) { //par2-->register address //par3-->register mask UINT32 value = 0x0; UINT32 iRet = -1; #if 0 DISABLE_PSM_MONITOR(); iRet = wmt_core_reg_rw_raw(0, par2, &value, par3); ENABLE_PSM_MONITOR(); #endif iRet = wmt_lib_reg_rw(0, par2, &value, par3); WMT_INFO_FUNC("read combo chip register (0x%08x) with mask (0x%08x) %s, value = 0x%08x\n", \ par2, \ par3, \ iRet != 0 ? "failed" : "succeed", \ iRet != 0 ? -1: value\ ); return 0; }
INT32 wmt_dbg_cmd_test_api(ENUM_WMTDRV_CMD_T cmd) { P_OSAL_OP pOp = NULL; MTK_WCN_BOOL bRet = MTK_WCN_BOOL_FALSE; P_OSAL_SIGNAL pSignal; pOp = wmt_lib_get_free_op(); if (!pOp ) { WMT_WARN_FUNC("get_free_lxop fail\n"); return MTK_WCN_BOOL_FALSE; } pSignal = &pOp ->signal; pOp ->op.opId = WMT_OPID_CMD_TEST; pSignal->timeoutValue= MAX_EACH_WMT_CMD; /*this test command should be run with usb cable connected, so no host awake is needed*/ //wmt_lib_host_awake_get(); switch (cmd) { case WMTDRV_CMD_ASSERT: pOp->op.au4OpData[0] = 0; break; case WMTDRV_CMD_EXCEPTION: pOp->op.au4OpData[0] = 1; break; default: if (WMTDRV_CMD_COEXDBG_00 <= cmd && WMTDRV_CMD_COEXDBG_15 >= cmd) { pOp->op.au4OpData[0] = 2; pOp->op.au4OpData[1] = cmd - 2; } else { pOp->op.au4OpData[0] = 0xff; pOp->op.au4OpData[1] = 0xff; } pOp->op.au4OpData[2] = (ULONG)gCoexBuf.buffer; pOp->op.au4OpData[3] = osal_sizeof(gCoexBuf.buffer); break; } WMT_INFO_FUNC("CMD_TEST, opid(%d), par(%d, %d)\n", pOp->op.opId, pOp->op.au4OpData[0], pOp->op.au4OpData[1]); /*wake up chip first*/ DISABLE_PSM_MONITOR(); bRet = wmt_lib_put_act_op(pOp); ENABLE_PSM_MONITOR(); if ((cmd != WMTDRV_CMD_ASSERT) && (cmd != WMTDRV_CMD_EXCEPTION)) { if (MTK_WCN_BOOL_FALSE == bRet) { gCoexBuf.availSize = 0; } else { gCoexBuf.availSize = pOp->op.au4OpData[3]; WMT_INFO_FUNC("gCoexBuf.availSize = %d\n", gCoexBuf.availSize); } } //wmt_lib_host_awake_put(); WMT_INFO_FUNC("CMD_TEST, opid (%d), par(%d, %d), ret(%d), result(%s)\n", \ pOp->op.opId, \ pOp->op.au4OpData[0], \ pOp->op.au4OpData[1], \ bRet, \ MTK_WCN_BOOL_FALSE == bRet ? "failed" : "succeed"\ ); return 0; }
//INT32 WMT_ioctl(struct inode *inode, struct file *filp, UINT32 cmd, unsigned long arg) long WMT_unlocked_ioctl ( struct file *filp, unsigned int cmd, unsigned long arg ) { INT32 iRet = 0; UCHAR pBuffer[NAME_MAX + 1]; WMT_DBG_FUNC("cmd (%u), arg (0x%lx)\n", cmd, arg); switch(cmd) { case 4: /* patch location */ { #if 0 WMT_DBG_FUNC("old patch file: %s \n", pWmtDevCtx->cPatchName); if (copy_from_user(pWmtDevCtx->cPatchName, (void *)arg, NAME_MAX)) { iRet = -EFAULT; break; } pWmtDevCtx->cPatchName[NAME_MAX] = '\0'; WMT_DBG_FUNC("new patch file name: %s \n", pWmtDevCtx->cPatchName); #endif UCHAR cPatchName[NAME_MAX + 1]; if (copy_from_user(cPatchName, (void *)arg, NAME_MAX)) { iRet = -EFAULT; break; } cPatchName[NAME_MAX] = '\0'; wmt_lib_set_patch_name(cPatchName); } break; case 5: /* stp/hif/fm mode */ /* set hif conf */ do { P_OSAL_OP pOp; MTK_WCN_BOOL bRet; P_OSAL_SIGNAL pSignal = NULL; P_WMT_HIF_CONF pHif = NULL; iRet = wmt_lib_set_hif(arg); if (0 != iRet) { WMT_INFO_FUNC("wmt_lib_set_hif fail\n"); break; } pOp = wmt_lib_get_free_op(); if (!pOp) { WMT_INFO_FUNC("get_free_lxop fail\n"); break; } pSignal = &pOp->signal; pOp->op.opId = WMT_OPID_HIF_CONF; pHif = wmt_lib_get_hif(); osal_memcpy(&pOp->op.au4OpData[0], pHif, sizeof(WMT_HIF_CONF)); pOp->op.u4InfoBit = WMT_OP_HIF_BIT; pSignal->timeoutValue = 0; bRet = wmt_lib_put_act_op(pOp); WMT_DBG_FUNC("WMT_OPID_HIF_CONF result(%d) \n", bRet); iRet = (MTK_WCN_BOOL_FALSE == bRet) ? -EFAULT : 0; } while (0); break; case 6: /* test turn on/off func */ do { MTK_WCN_BOOL bRet = MTK_WCN_BOOL_FALSE; if (arg & 0x80000000) { bRet = mtk_wcn_wmt_func_on(arg & 0xF); } else { bRet = mtk_wcn_wmt_func_off(arg & 0xF); } iRet = (MTK_WCN_BOOL_FALSE == bRet) ? -EFAULT : 0; } while (0); break; case 7: /*switch Loopback function on/off arg: bit0 = 1:turn loopback function on bit0 = 0:turn loopback function off */ do{ MTK_WCN_BOOL bRet = MTK_WCN_BOOL_FALSE; if (arg & 0x01) { bRet = mtk_wcn_wmt_func_on(WMTDRV_TYPE_LPBK); } else { bRet = mtk_wcn_wmt_func_off(WMTDRV_TYPE_LPBK); } iRet = (MTK_WCN_BOOL_FALSE == bRet) ? -EFAULT : 0; }while(0); break; case 8: do { P_OSAL_OP pOp; MTK_WCN_BOOL bRet; UINT32 u4Wait; //UINT8 lpbk_buf[1024] = {0}; UINT32 effectiveLen = 0; P_OSAL_SIGNAL pSignal = NULL; if (copy_from_user(&effectiveLen, (void *)arg, sizeof(effectiveLen))) { iRet = -EFAULT; WMT_ERR_FUNC("copy_from_user failed at %d\n", __LINE__); break; } if(effectiveLen > sizeof(gLpbkBuf)) { iRet = -EFAULT; WMT_ERR_FUNC("length is too long\n"); break; } WMT_DBG_FUNC("len = %d\n", effectiveLen); pOp = wmt_lib_get_free_op(); if (!pOp) { WMT_WARN_FUNC("get_free_lxop fail \n"); iRet = -EFAULT; break; } u4Wait = 2000; if (copy_from_user(&gLpbkBuf[0], (void *)arg + sizeof(unsigned long), effectiveLen)) { WMT_ERR_FUNC("copy_from_user failed at %d\n", __LINE__); iRet = -EFAULT; break; } pSignal = &pOp->signal; pOp->op.opId = WMT_OPID_LPBK; pOp->op.au4OpData[0] = effectiveLen; //packet length pOp->op.au4OpData[1] = (UINT32)&gLpbkBuf[0]; //packet buffer pointer memcpy(&gLpbkBufLog, &gLpbkBuf[((effectiveLen >=4) ? effectiveLen-4:0)], 4); pSignal->timeoutValue = MAX_EACH_WMT_CMD; WMT_INFO_FUNC("OPID(%d) type(%d) start\n", pOp->op.opId, pOp->op.au4OpData[0]); DISABLE_PSM_MONITOR(); bRet = wmt_lib_put_act_op(pOp); ENABLE_PSM_MONITOR(); if (MTK_WCN_BOOL_FALSE == bRet) { WMT_WARN_FUNC("OPID(%d) type(%d) buf tail(0x%08x) fail\n", pOp->op.opId, pOp->op.au4OpData[0], gLpbkBufLog); iRet = -1; break; } else { WMT_INFO_FUNC("OPID(%d) length(%d) ok\n", pOp->op.opId, pOp->op.au4OpData[0]); iRet = pOp->op.au4OpData[0] ; if (copy_to_user((void *)arg + sizeof(ULONG) + sizeof(UCHAR[2048]), gLpbkBuf, iRet)) { iRet = -EFAULT; break; } } }while(0); break; #if 0 case 9: { #define LOG_BUF_SZ 300 UCHAR buf[LOG_BUF_SZ]; INT32 len = 0; INT32 remaining = 0; remaining = mtk_wcn_stp_btm_get_dmp(buf, &len); if(remaining == 0){ WMT_DBG_FUNC("waiting dmp \n"); wait_event_interruptible(dmp_wq, dmp_flag != 0); dmp_flag = 0; remaining = mtk_wcn_stp_btm_get_dmp(buf, &len); //WMT_INFO_FUNC("len = %d ###%s#\n", len, buf); } else { WMT_LOUD_FUNC("no waiting dmp \n"); } if(unlikely((len+sizeof(INT32)) >= LOG_BUF_SZ)){ WMT_ERR_FUNC("len is larger buffer\n"); iRet = -EFAULT; goto fail_exit; } buf[sizeof(INT32)+len]='\0'; if (copy_to_user((void *)arg, (UCHAR *)&len, sizeof(INT32))){ iRet = -EFAULT; goto fail_exit; } if (copy_to_user((void *)arg + sizeof(INT32), buf, len)){ iRet = -EFAULT; goto fail_exit; } } break; case 10: { WMT_INFO_FUNC("Enable combo trace32 dump\n"); wmt_cdev_t32dmp_enable(); WMT_INFO_FUNC("Enable STP debugging mode\n"); mtk_wcn_stp_dbg_enable(); } break; case 11: { WMT_INFO_FUNC("Disable combo trace32 dump\n"); wmt_cdev_t32dmp_disable(); WMT_INFO_FUNC("Disable STP debugging mode\n"); mtk_wcn_stp_dbg_disable(); } break; #endif case 10: { wmt_lib_host_awake_get(); #if 0 P_OSAL_OP pOp; MTK_WCN_BOOL bRet; P_OSAL_SIGNAL pSignal; pOp = wmt_lib_get_free_op(); if (!pOp) { WMT_WARN_FUNC("get_free_lxop fail\n"); return MTK_WCN_BOOL_FALSE; } pSignal = &pOp->signal; pOp->op.opId = WMT_OPID_FUNC_ON; pOp->op.au4OpData[0] = WMTDRV_TYPE_COREDUMP; pSignal->timeoutValue= 0; WMT_INFO_FUNC("OPID(%d) type(%d) start\n", pOp->op.opId, pOp->op.au4OpData[0]); /*do not check return value, we will do this either way*/ /*wake up chip first*/ DISABLE_PSM_MONITOR(); bRet = wmt_lib_put_act_op(pOp); ENABLE_PSM_MONITOR(); //wmt_lib_host_awake_put(); if (MTK_WCN_BOOL_FALSE == bRet) { WMT_WARN_FUNC("OPID(%d) type(%d) fail\n", pOp->op.opId, pOp->op.au4OpData[0]); } else { WMT_INFO_FUNC("OPID(%d) type(%d) ok\n", pOp->op.opId, pOp->op.au4OpData[0]); } #endif osal_strcpy(pBuffer, "MT662x f/w coredump start-"); if (copy_from_user(pBuffer + osal_strlen(pBuffer), (void *)arg, NAME_MAX)) { //osal_strcpy(pBuffer, "MT662x f/w assert core dump start"); WMT_ERR_FUNC("copy assert string failed\n"); } pBuffer[NAME_MAX] = '\0'; osal_dbg_assert_aee(pBuffer, pBuffer); } break; case 11: { osal_dbg_assert_aee("MT662x f/w coredump end", "MT662x firmware coredump ends"); wmt_lib_host_awake_put(); } break; case 12: { if (0 == arg) { return wmt_lib_get_icinfo(WMTCHIN_CHIPID); } else if (1 == arg) { return wmt_lib_get_icinfo(WMTCHIN_HWVER); } else if (2 == arg) { return wmt_lib_get_icinfo(WMTCHIN_FWVER); } } break; case 13: { if (1 == arg) { WMT_INFO_FUNC("launcher may be killed,block abnormal stp tx. \n"); wmt_lib_set_stp_wmt_last_close(1); } else { wmt_lib_set_stp_wmt_last_close(0); } } break; #ifdef MTK_MULTI_PATCH_SUPPORT case 14: { pAtchNum = arg; WMT_DBG_FUNC(" get patch num from launcher = %d\n",pAtchNum); wmt_lib_set_patch_num(pAtchNum); pPatchInfo = kzalloc(sizeof(WMT_PATCH_INFO)*pAtchNum,GFP_ATOMIC); if(!pPatchInfo) { WMT_ERR_FUNC("allocate memory fail!\n"); break; } } break; case 15: { WMT_PATCH_INFO wMtPatchInfo; P_WMT_PATCH_INFO pTemp = NULL; UINT32 dWloadSeq; static UINT32 counter = 0; if(!pPatchInfo) { WMT_ERR_FUNC("NULL patch info pointer\n"); break; } if (copy_from_user(&wMtPatchInfo, (void *)arg, sizeof(WMT_PATCH_INFO))) { WMT_ERR_FUNC("copy_from_user failed at %d\n", __LINE__); iRet = -EFAULT; break; } dWloadSeq = wMtPatchInfo.dowloadSeq; WMT_DBG_FUNC("current download seq no is %d,patch name is %s,addres info is 0x%02x,0x%02x,0x%02x,0x%02x\n",dWloadSeq,wMtPatchInfo.patchName,wMtPatchInfo.addRess[0],wMtPatchInfo.addRess[1],wMtPatchInfo.addRess[2],wMtPatchInfo.addRess[3]); osal_memcpy(pPatchInfo + dWloadSeq - 1,&wMtPatchInfo,sizeof(WMT_PATCH_INFO)); pTemp = pPatchInfo + dWloadSeq - 1; if(++counter == pAtchNum) { wmt_lib_set_patch_info(pPatchInfo); counter = 0; } } break; #endif default: iRet = -EINVAL; WMT_WARN_FUNC("unknown cmd (%d)\n", cmd); break; } return iRet; }
MTK_WCN_BOOL mtk_wcn_wmt_assert_timeout(ENUM_WMTDRV_TYPE_T type, UINT32 reason, INT32 timeout) #endif { P_OSAL_OP pOp = NULL; MTK_WCN_BOOL bRet = MTK_WCN_BOOL_FALSE; P_OSAL_SIGNAL pSignal; pOp = wmt_lib_get_free_op(); if (!pOp) { WMT_DBG_FUNC("get_free_lxop fail\n"); return MTK_WCN_BOOL_FALSE; } wmt_lib_set_host_assert_info(type,reason,1); pSignal = &pOp ->signal; pOp ->op.opId = WMT_OPID_TRIGGER_STP_ASSERT; pSignal->timeoutValue = timeout; /*this test command should be run with usb cable connected, so no host awake is needed*/ /* wmt_lib_host_awake_get(); */ pOp->op.au4OpData[0] = 0; /*wake up chip first*/ if (DISABLE_PSM_MONITOR()) { WMT_ERR_FUNC("wake up failed\n"); wmt_lib_put_op_to_free_queue(pOp); return MTK_WCN_BOOL_FALSE; } bRet = wmt_lib_put_act_op(pOp); ENABLE_PSM_MONITOR(); //wmt_lib_host_awake_put(); WMT_INFO_FUNC("STP_ASSERT, opid (%d), par(%d, %d), ret(%d), result(%s)\n", \ pOp->op.opId, \ pOp->op.au4OpData[0], \ pOp->op.au4OpData[1], \ bRet, \ MTK_WCN_BOOL_FALSE == bRet ? "failed" : "succeed"\ ); /*If trigger stp assert succeed, just return; trigger WMT level assert if failed*/ if (MTK_WCN_BOOL_TRUE == bRet) return bRet; pOp = wmt_lib_get_free_op(); if (!pOp) { WMT_DBG_FUNC("get_free_lxop fail\n"); return MTK_WCN_BOOL_FALSE; } wmt_lib_set_host_assert_info(type, reason, 1); pSignal = &pOp->signal; pOp->op.opId = WMT_OPID_CMD_TEST; pSignal->timeoutValue = timeout; /*this test command should be run with usb cable connected, so no host awake is needed */ /* wmt_lib_host_awake_get(); */ pOp->op.au4OpData[0] = 0; /*wake up chip first */ if (DISABLE_PSM_MONITOR()) { WMT_ERR_FUNC("wake up failed\n"); wmt_lib_put_op_to_free_queue(pOp); return MTK_WCN_BOOL_FALSE; } bRet = wmt_lib_put_act_op(pOp); ENABLE_PSM_MONITOR(); /* wmt_lib_host_awake_put(); */ WMT_INFO_FUNC("CMD_TEST, opid (%d), par(%d, %d), ret(%d), result(%s)\n", pOp->op.opId, pOp->op.au4OpData[0], pOp->op.au4OpData[1], bRet, MTK_WCN_BOOL_FALSE == bRet ? "failed" : "succeed"); return bRet; }
/* INT32 WMT_ioctl(struct inode *inode, struct file *filp, UINT32 cmd, unsigned long arg) */ long WMT_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { #define WMT_IOC_MAGIC 0xa0 #define WMT_IOCTL_SET_PATCH_NAME _IOW(WMT_IOC_MAGIC, 4, char*) #define WMT_IOCTL_SET_STP_MODE _IOW(WMT_IOC_MAGIC, 5, int) #define WMT_IOCTL_FUNC_ONOFF_CTRL _IOW(WMT_IOC_MAGIC, 6, int) #define WMT_IOCTL_LPBK_POWER_CTRL _IOW(WMT_IOC_MAGIC, 7, int) #define WMT_IOCTL_LPBK_TEST _IOWR(WMT_IOC_MAGIC, 8, char*) #define WMT_IOCTL_GET_CHIP_INFO _IOR(WMT_IOC_MAGIC, 12, int) #define WMT_IOCTL_SET_LAUNCHER_KILL _IOW(WMT_IOC_MAGIC, 13, int) #define WMT_IOCTL_SET_PATCH_NUM _IOW(WMT_IOC_MAGIC, 14, int) #define WMT_IOCTL_SET_PATCH_INFO _IOW(WMT_IOC_MAGIC, 15, char*) #define WMT_IOCTL_PORT_NAME _IOWR(WMT_IOC_MAGIC, 20, char*) #define WMT_IOCTL_WMT_CFG_NAME _IOWR(WMT_IOC_MAGIC, 21, char*) #define WMT_IOCTL_WMT_QUERY_CHIPID _IOR(WMT_IOC_MAGIC, 22, int) #define WMT_IOCTL_WMT_TELL_CHIPID _IOW(WMT_IOC_MAGIC, 23, int) #define WMT_IOCTL_WMT_COREDUMP_CTRL _IOW(WMT_IOC_MAGIC, 24, int) #define WMT_IOCTL_WMT_STP_ASSERT_CTRL _IOW(WMT_IOC_MAGIC, 27, int) INT32 iRet = 0; UINT8 pBuffer[NAME_MAX + 1]; WMT_DBG_FUNC("cmd (%u), arg (0x%lx)\n", cmd, arg); switch (cmd) { case WMT_IOCTL_SET_PATCH_NAME: /* patch location */ { if (copy_from_user(pBuffer, (void *)arg, NAME_MAX)) { iRet = -EFAULT; break; } pBuffer[NAME_MAX] = '\0'; wmt_lib_set_patch_name(pBuffer); } break; case WMT_IOCTL_SET_STP_MODE: /* stp/hif/fm mode */ /* set hif conf */ do { P_OSAL_OP pOp; MTK_WCN_BOOL bRet; P_OSAL_SIGNAL pSignal = NULL; P_WMT_HIF_CONF pHif = NULL; iRet = wmt_lib_set_hif(arg); if (0 != iRet) { WMT_INFO_FUNC("wmt_lib_set_hif fail (%lu)\n", arg); break; } pOp = wmt_lib_get_free_op(); if (!pOp) { WMT_INFO_FUNC("get_free_lxop fail\n"); break; } pSignal = &pOp->signal; pOp->op.opId = WMT_OPID_HIF_CONF; pHif = wmt_lib_get_hif(); osal_memcpy(&pOp->op.au4OpData[0], pHif, sizeof(WMT_HIF_CONF)); pOp->op.u4InfoBit = WMT_OP_HIF_BIT; pSignal->timeoutValue = 0; bRet = wmt_lib_put_act_op(pOp); WMT_DBG_FUNC("WMT_OPID_HIF_CONF result(%d)\n", bRet); iRet = (MTK_WCN_BOOL_FALSE == bRet) ? -EFAULT : 0; } while (0); break; case WMT_IOCTL_FUNC_ONOFF_CTRL: /* test turn on/off func */ do { MTK_WCN_BOOL bRet = MTK_WCN_BOOL_FALSE; if (arg & 0x80000000) { bRet = mtk_wcn_wmt_func_on(arg & 0xF); } else { bRet = mtk_wcn_wmt_func_off(arg & 0xF); } iRet = (MTK_WCN_BOOL_FALSE == bRet) ? -EFAULT : 0; } while (0); break; case WMT_IOCTL_LPBK_POWER_CTRL: /*switch Loopback function on/off arg: bit0 = 1:turn loopback function on bit0 = 0:turn loopback function off */ do { MTK_WCN_BOOL bRet = MTK_WCN_BOOL_FALSE; if (arg & 0x01) { bRet = mtk_wcn_wmt_func_on(WMTDRV_TYPE_LPBK); } else { bRet = mtk_wcn_wmt_func_off(WMTDRV_TYPE_LPBK); } iRet = (MTK_WCN_BOOL_FALSE == bRet) ? -EFAULT : 0; } while (0); break; case WMT_IOCTL_LPBK_TEST: do { P_OSAL_OP pOp; MTK_WCN_BOOL bRet; UINT32 u4Wait; /* UINT8 lpbk_buf[1024] = {0}; */ UINT32 effectiveLen = 0; P_OSAL_SIGNAL pSignal = NULL; if (copy_from_user(&effectiveLen, (void *)arg, sizeof(effectiveLen))) { iRet = -EFAULT; WMT_ERR_FUNC("copy_from_user failed at %d\n", __LINE__); break; } if (effectiveLen > sizeof(gLpbkBuf)) { iRet = -EFAULT; WMT_ERR_FUNC("length is too long\n"); break; } WMT_DBG_FUNC("len = %d\n", effectiveLen); pOp = wmt_lib_get_free_op(); if (!pOp) { WMT_WARN_FUNC("get_free_lxop fail\n"); iRet = -EFAULT; break; } u4Wait = 2000; if (copy_from_user (&gLpbkBuf[0], (void *)arg + sizeof(unsigned long), effectiveLen)) { WMT_ERR_FUNC("copy_from_user failed at %d\n", __LINE__); iRet = -EFAULT; break; } pSignal = &pOp->signal; pOp->op.opId = WMT_OPID_LPBK; pOp->op.au4OpData[0] = effectiveLen; /* packet length */ pOp->op.au4OpData[1] = (size_t) &gLpbkBuf[0]; memcpy(&gLpbkBufLog, &gLpbkBuf[((effectiveLen >= 4) ? effectiveLen - 4 : 0)], 4); pSignal->timeoutValue = MAX_EACH_WMT_CMD; WMT_INFO_FUNC("OPID(%d) type(%d) start\n", pOp->op.opId, pOp->op.au4OpData[0]); if (DISABLE_PSM_MONITOR()) { WMT_ERR_FUNC("wake up failed\n"); wmt_lib_put_op_to_free_queue(pOp); return -1; } bRet = wmt_lib_put_act_op(pOp); ENABLE_PSM_MONITOR(); if (MTK_WCN_BOOL_FALSE == bRet) { WMT_WARN_FUNC("OPID(%d) type(%d) buf tail(0x%08x) fail\n", pOp->op.opId, pOp->op.au4OpData[0], gLpbkBufLog); iRet = -1; break; } else { WMT_INFO_FUNC("OPID(%d) length(%d) ok\n", pOp->op.opId, pOp->op.au4OpData[0]); iRet = pOp->op.au4OpData[0]; if (copy_to_user ((void *)arg + sizeof(unsigned long) + sizeof(UINT8[2048]), gLpbkBuf, iRet)) { iRet = -EFAULT; break; } } } while (0); break; #if 0 case 9: { #define LOG_BUF_SZ 300 UINT8 buf[LOG_BUF_SZ]; INT32 len = 0; INT32 remaining = 0; remaining = mtk_wcn_stp_btm_get_dmp(buf, &len); if (remaining == 0) { WMT_DBG_FUNC("waiting dmp\n"); wait_event_interruptible(dmp_wq, dmp_flag != 0); dmp_flag = 0; remaining = mtk_wcn_stp_btm_get_dmp(buf, &len); /* WMT_INFO_FUNC("len = %d ###%s#\n", len, buf); */ } else { WMT_LOUD_FUNC("no waiting dmp\n"); } if (unlikely((len + sizeof(INT32)) >= LOG_BUF_SZ)) { WMT_ERR_FUNC("len is larger buffer\n"); iRet = -EFAULT; goto fail_exit; } buf[sizeof(INT32) + len] = '\0'; if (copy_to_user((void *)arg, (PUINT8)&len, sizeof(INT32))) { iRet = -EFAULT; goto fail_exit; } if (copy_to_user((void *)arg + sizeof(INT32), buf, len)) { iRet = -EFAULT; goto fail_exit; } } break; case 10: { WMT_INFO_FUNC("Enable combo trace32 dump\n"); wmt_cdev_t32dmp_enable(); WMT_INFO_FUNC("Enable STP debugging mode\n"); mtk_wcn_stp_dbg_enable(); } break; case 11: { WMT_INFO_FUNC("Disable combo trace32 dump\n"); wmt_cdev_t32dmp_disable(); WMT_INFO_FUNC("Disable STP debugging mode\n"); mtk_wcn_stp_dbg_disable(); } break; #endif case 10: { wmt_lib_host_awake_get(); mtk_wcn_stp_coredump_start_ctrl(1); osal_strcpy(pBuffer, "MT662x f/w coredump start-"); if (copy_from_user (pBuffer + osal_strlen(pBuffer), (void *)arg, NAME_MAX - osal_strlen(pBuffer))) { /* osal_strcpy(pBuffer, "MT662x f/w assert core dump start"); */ WMT_ERR_FUNC("copy assert string failed\n"); } pBuffer[NAME_MAX] = '\0'; osal_dbg_assert_aee(pBuffer, pBuffer); } break; case 11: { osal_dbg_assert_aee("MT662x f/w coredump end", "MT662x firmware coredump ends"); wmt_lib_host_awake_put(); } break; case WMT_IOCTL_GET_CHIP_INFO: { if (0 == arg) { return wmt_lib_get_icinfo(WMTCHIN_CHIPID); } else if (1 == arg) { return wmt_lib_get_icinfo(WMTCHIN_HWVER); } else if (2 == arg) { return wmt_lib_get_icinfo(WMTCHIN_FWVER); } } break; case WMT_IOCTL_SET_LAUNCHER_KILL:{ if (1 == arg) { WMT_INFO_FUNC("launcher may be killed,block abnormal stp tx.\n"); wmt_lib_set_stp_wmt_last_close(1); } else { wmt_lib_set_stp_wmt_last_close(0); } } break; case WMT_IOCTL_SET_PATCH_NUM:{ pAtchNum = arg; WMT_INFO_FUNC(" get patch num from launcher = %d\n", pAtchNum); wmt_lib_set_patch_num(pAtchNum); if (pAtchNum > 0) pPatchInfo = kzalloc(sizeof(WMT_PATCH_INFO) *pAtchNum, GFP_ATOMIC); else WMT_ERR_FUNC("patch num == 0!\n"); if (!pPatchInfo) { WMT_ERR_FUNC("allocate memory fail!\n"); break; } } break; case WMT_IOCTL_SET_PATCH_INFO:{ WMT_PATCH_INFO wMtPatchInfo; P_WMT_PATCH_INFO pTemp = NULL; UINT32 dWloadSeq; static UINT32 counter = 0; if (!pPatchInfo) { WMT_ERR_FUNC("NULL patch info pointer\n"); break; } if (copy_from_user(&wMtPatchInfo, (void *)arg, sizeof(WMT_PATCH_INFO))) { WMT_ERR_FUNC("copy_from_user failed at %d\n", __LINE__); iRet = -EFAULT; break; } dWloadSeq = wMtPatchInfo.dowloadSeq; WMT_DBG_FUNC ("current download seq no is %d,patch name is %s,addres info is 0x%02x,0x%02x,0x%02x,0x%02x\n", dWloadSeq, wMtPatchInfo.patchName, wMtPatchInfo.addRess[0], wMtPatchInfo.addRess[1], wMtPatchInfo.addRess[2], wMtPatchInfo.addRess[3]); osal_memcpy(pPatchInfo + dWloadSeq - 1, &wMtPatchInfo, sizeof(WMT_PATCH_INFO)); pTemp = pPatchInfo + dWloadSeq - 1; if (++counter == pAtchNum) { wmt_lib_set_patch_info(pPatchInfo); counter = 0; } } break; case WMT_IOCTL_PORT_NAME:{ INT8 cUartName[NAME_MAX + 1]; if (copy_from_user(cUartName, (void *)arg, NAME_MAX)) { iRet = -EFAULT; break; } cUartName[NAME_MAX] = '\0'; wmt_lib_set_uart_name(cUartName); } break; case WMT_IOCTL_WMT_CFG_NAME: { INT8 cWmtCfgName[NAME_MAX + 1]; if (copy_from_user(cWmtCfgName, (void *)arg, NAME_MAX)) { iRet = -EFAULT; break; } cWmtCfgName[NAME_MAX] = '\0'; wmt_conf_set_cfg_file(cWmtCfgName); } break; case WMT_IOCTL_WMT_QUERY_CHIPID: { #if !(DELETE_HIF_SDIO_CHRDEV) iRet = mtk_wcn_hif_sdio_query_chipid(1); #else iRet = mtk_wcn_wmt_chipid_query(); #endif } break; case WMT_IOCTL_WMT_TELL_CHIPID: { #if !(DELETE_HIF_SDIO_CHRDEV) iRet = mtk_wcn_hif_sdio_tell_chipid(arg); #endif if (0x6628 == arg || 0x6630 == arg) { wmt_lib_merge_if_flag_ctrl(1); } else { wmt_lib_merge_if_flag_ctrl(0); } } break; case WMT_IOCTL_WMT_COREDUMP_CTRL: { if (0 == arg) { mtk_wcn_stp_coredump_flag_ctrl(0); } else { mtk_wcn_stp_coredump_flag_ctrl(1); } } break; case WMT_IOCTL_WMT_STP_ASSERT_CTRL: if (MTK_WCN_BOOL_TRUE == wmt_lib_btm_cb(BTM_TRIGGER_STP_ASSERT_OP)) { WMT_INFO_FUNC("trigger stp assert succeed\n"); iRet = 0; } else { WMT_INFO_FUNC("trigger stp assert failed\n"); iRet = -1; } break; default: iRet = -EINVAL; WMT_WARN_FUNC("unknown cmd (%d)\n", cmd); break; } return iRet; }