INT32 wmt_ctrl_stp_conf(P_WMT_CTRL_DATA pWmtCtrlData) { INT32 iRet = -1; P_DEV_WMT pDev = &gDevWmt; /* single instance */ UINT32 type; UINT32 value; if (!osal_test_bit(WMT_STAT_STP_OPEN, &pDev->state)) { WMT_WARN_FUNC("CTRL_STP_ENABLE but invalid Handle of WmtStp \n"); return -1; } type = pWmtCtrlData->au4CtrlData[0]; value = pWmtCtrlData->au4CtrlData[1]; iRet = wmt_ctrl_stp_conf_ex(type, value); if (!iRet) { if (WMT_STP_CONF_EN == type) { if (value) { osal_set_bit(WMT_STAT_STP_EN, &pDev->state); WMT_DBG_FUNC("enable STP\n"); } else { osal_clear_bit(WMT_STAT_STP_EN, &pDev->state); WMT_DBG_FUNC("disable STP\n"); } } } return iRet; }
INT32 wmt_ctrl_stp_open(P_WMT_CTRL_DATA pWmtCtrlData) { P_DEV_WMT pDev = &gDevWmt; /* single instance */ INT32 iRet; iRet = mtk_wcn_stp_open_btif(); if(iRet){ WMT_WARN_FUNC("mtk_wcn_stp_open_btif fail(%d)\n", iRet); return -1; } /*register stp rx call back to btif*/ iRet = mtk_wcn_stp_rxcb_register((MTK_WCN_BTIF_RX_CB)mtk_wcn_stp_parser_data); if(iRet){ WMT_WARN_FUNC("mtk_wcn_stp_rxcb_register fail(%d)\n", iRet); return -2; } /* register to STP-core for rx */ iRet = mtk_wcn_stp_register_event_cb(WMT_TASK_INDX, wmt_dev_rx_event_cb); /* mtk_wcn_stp_register_event_cb */ if (iRet) { WMT_WARN_FUNC("stp_reg cb fail(%d)\n", iRet); return -3; } osal_set_bit(WMT_STAT_STP_OPEN, &pDev->state); #if 0 iRet = mtk_wcn_stp_lpbk_ctrl(1); #endif return 0; }
INT32 wmt_ctrl_stp_open(P_WMT_CTRL_DATA pWmtCtrlData) { P_DEV_WMT pDev = &gDevWmt; /* single instance */ INT32 iRet; UCHAR cmdStr[NAME_MAX + 1] = {0}; if (WMT_HIF_UART == pDev->rWmtHifConf.hifType) { osal_snprintf(cmdStr, NAME_MAX, "open_stp"); iRet = wmt_ctrl_ul_cmd(pDev, cmdStr); if (iRet) { WMT_WARN_FUNC("wmt_ctrl_ul_cmd fail(%d)\n", iRet); return -1; } } /* register to STP-core for rx */ iRet = mtk_wcn_stp_register_event_cb(WMT_TASK_INDX, wmt_dev_rx_event_cb); /* mtk_wcn_stp_register_event_cb */ if (iRet) { WMT_WARN_FUNC("stp_reg cb fail(%d)\n", iRet); return -2; } osal_set_bit(WMT_STAT_STP_OPEN, &pDev->state); return 0; }
INT32 wmt_func_bt_on(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf) { //return wmt_func_bt_ctrl(FUNC_ON); INT32 iRet = -1; UINT32 ctrlPa1; UINT32 ctrlPa2; ctrlPa1 = BT_PALDO; ctrlPa2 = PALDO_ON; iRet = wmt_core_ctrl(WMT_CTRL_SOC_PALDO_CTRL,&ctrlPa1,&ctrlPa2); if(iRet){ WMT_ERR_FUNC("wmt-func: wmt_ctrl_soc_paldo_ctrl failed(%d)(%d)(%d)\n",iRet,ctrlPa1,ctrlPa2); return -1; } iRet = wmt_core_func_ctrl_cmd(WMTDRV_TYPE_BT, MTK_WCN_BOOL_TRUE); if(iRet){ WMT_ERR_FUNC("wmt-func: wmt_core_func_ctrl_cmd(bt_on) failed(%d)\n",iRet); ctrlPa1 = BT_PALDO; ctrlPa2 = PALDO_OFF; wmt_core_ctrl(WMT_CTRL_SOC_PALDO_CTRL,&ctrlPa1,&ctrlPa2); return -2; }else { osal_set_bit(WMT_BT_ON,&gBtWifiGpsState); if(osal_test_bit(WMT_GPS_ON,&gBtWifiGpsState)) { //send msg to GPS native for sending de-sense CMD ctrlPa1 = 1; ctrlPa2 = 0; wmt_core_ctrl(WMT_CTRL_BGW_DESENSE_CTRL,&ctrlPa1,&ctrlPa2); } return 0; } }
INT32 wmt_func_fm_on(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf) { /* return wmt_func_fm_ctrl(FUNC_ON); */ UINT32 ctrlPa1 = 0; UINT32 ctrlPa2 = 0; INT32 iRet = -1; UINT8 co_clock_type = (pConf->co_clock_flag & 0x0f); if (co_clock_type) { if (!osal_test_bit(WMT_GPS_ON, &gGpsFmState)) { ctrlPa1 = FM_PALDO; ctrlPa2 = PALDO_ON; wmt_core_ctrl(WMT_CTRL_SOC_PALDO_CTRL, &ctrlPa1, &ctrlPa2); } else { WMT_INFO_FUNC("LDO VCN28 has been turn on by GPS\n"); } } iRet = wmt_core_func_ctrl_cmd(WMTDRV_TYPE_FM, MTK_WCN_BOOL_TRUE); if (!iRet) { if (co_clock_type) osal_set_bit(WMT_FM_ON, &gGpsFmState); } return iRet; }
INT32 wmt_func_gps_on(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf) { INT32 iRet = 0; UINT32 ctrlPa1; UINT32 ctrlPa2; UINT8 co_clock_type = (pConf->co_clock_flag & 0x0f); if ((co_clock_type) && (0 == pConf->wmt_gps_lna_enable)) { /* use SOC external LNA */ if (!osal_test_bit(WMT_FM_ON, &gGpsFmState)) { ctrlPa1 = GPS_PALDO; ctrlPa2 = PALDO_ON; wmt_core_ctrl(WMT_CTRL_SOC_PALDO_CTRL, &ctrlPa1, &ctrlPa2); } else { WMT_INFO_FUNC("LDO VCN28 has been turn on by FM\n"); } } iRet = wmt_func_gps_pre_on(pOps, pConf); if (0 == iRet) { iRet = wmt_func_gps_ctrl(FUNC_ON); if (!iRet) { osal_set_bit(WMT_GPS_ON, &gBtWifiGpsState); if ((osal_test_bit(WMT_BT_ON, &gBtWifiGpsState)) || (osal_test_bit(WMT_WIFI_ON, &gBtWifiGpsState))) { /* send msg to GPS native for sending de-sense CMD */ ctrlPa1 = 1; ctrlPa2 = 0; wmt_core_ctrl(WMT_CTRL_BGW_DESENSE_CTRL, &ctrlPa1, &ctrlPa2); } if ((co_clock_type) && (0 == pConf->wmt_gps_lna_enable)) /* use SOC external LNA */ osal_set_bit(WMT_GPS_ON, &gGpsFmState); } } return iRet; }
INT32 wmt_func_wifi_on(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf) { int iRet = 0; UINT32 ctrlPa1; UINT32 ctrlPa2; if(NULL != mtk_wcn_wlan_probe){ WMT_INFO_FUNC("WMT-FUNC: wmt wlan func on befor wlan probe\n"); iRet = (*mtk_wcn_wlan_probe)(); if(iRet){ WMT_ERR_FUNC("WMT-FUNC: wmt call wlan probe fail(%d)\n",iRet); iRet = -1; }else{ WMT_INFO_FUNC("WMT-FUNC: wmt call wlan probe ok\n"); } }else{ WMT_ERR_FUNC("WMT-FUNC: null pointer mtk_wcn_wlan_probe\n"); gWifiProbed = 1; iRet = -2; } if(!iRet) { osal_set_bit(WMT_WIFI_ON,&gBtWifiGpsState); if(osal_test_bit(WMT_GPS_ON,&gBtWifiGpsState)) { //send msg to GPS native for sending de-sense CMD ctrlPa1 = 1; ctrlPa2 = 0; wmt_core_ctrl(WMT_CTRL_BGW_DESENSE_CTRL,&ctrlPa1,&ctrlPa2); } } return iRet; #if 0 return wmt_func_wifi_ctrl(FUNC_ON); #endif }
INT32 wmt_func_gps_on(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf) { INT32 iRet = 0; UINT32 ctrlPa1; UINT32 ctrlPa2; iRet = wmt_func_gps_pre_on(pOps, pConf); if (0 == iRet) { iRet = wmt_func_gps_ctrl(FUNC_ON); if(!iRet) { osal_set_bit(WMT_GPS_ON,&gBtWifiGpsState); if((osal_test_bit(WMT_BT_ON,&gBtWifiGpsState)) || (osal_test_bit(WMT_WIFI_ON,&gBtWifiGpsState))) { //send msg to GPS native for sending de-sense CMD ctrlPa1 = 1; ctrlPa2 = 0; wmt_core_ctrl(WMT_CTRL_BGW_DESENSE_CTRL,&ctrlPa1,&ctrlPa2); } } } return iRet; }
INT32 wmt_ctrl_sdio_func(P_WMT_CTRL_DATA pWmtCtrlData) { INT32 iRet = -1; UINT32 statBit = WMT_STAT_SDIO_WIFI_ON; INT32 retry = 10; P_DEV_WMT pDev = &gDevWmt; /* single instance */ WMT_SDIO_FUNC_TYPE sdioFuncType = pWmtCtrlData->au4CtrlData[0]; UINT32 u4On = pWmtCtrlData->au4CtrlData[1]; if (WMT_SDIO_FUNC_MAX <= sdioFuncType) { WMT_ERR_FUNC("CTRL_SDIO_FUNC, invalid func type (%d) \n", sdioFuncType); return -1; } if (WMT_SDIO_FUNC_STP == sdioFuncType) { statBit = WMT_STAT_SDIO_STP_ON; } if (u4On) { if (osal_test_bit(statBit, &pDev->state)) { WMT_WARN_FUNC("CTRL_SDIO_FUNC(%d) but already ON \n", sdioFuncType); iRet = 0; } else { while (retry-- > 0 && iRet != 0) { if (iRet) { /* sleep 150ms before sdio slot ON ready */ osal_sleep_ms(150); } iRet = mtk_wcn_hif_sdio_wmt_control(sdioFuncType, MTK_WCN_BOOL_TRUE); if (HIF_SDIO_ERR_NOT_PROBED == iRet) { /* not probed case, retry */ continue; } else if (HIF_SDIO_ERR_CLT_NOT_REG == iRet){ /* For WiFi, client not reg yet, no need to retry, WiFi function can work any time when wlan.ko is insert into system*/ iRet = 0; } else { /* other fail cases, stop */ break; } } if (!retry || iRet) { WMT_ERR_FUNC("mtk_wcn_hif_sdio_wmt_control(%d, TRUE) fail(%d) retry(%d)\n", sdioFuncType, iRet, retry); } else { osal_set_bit(statBit, &pDev->state); } } } else { if (osal_test_bit(statBit, &pDev->state)) { iRet = mtk_wcn_hif_sdio_wmt_control(sdioFuncType, MTK_WCN_BOOL_FALSE); if (iRet) { WMT_ERR_FUNC("mtk_wcn_hif_sdio_wmt_control(%d, FALSE) fail(%d)\n", sdioFuncType, iRet); } /*any way, set to OFF state*/ osal_clear_bit(statBit, &pDev->state); } else { WMT_WARN_FUNC("CTRL_SDIO_FUNC(%d) but already OFF \n", sdioFuncType); iRet = 0; } } return iRet; }