INT32 wmt_ctrl_stp_close(P_WMT_CTRL_DATA pWmtCtrlData) { P_DEV_WMT pDev = &gDevWmt; /* single instance */ INT32 iRet = 0; /* un-register to STP-core for rx */ iRet = mtk_wcn_stp_register_event_cb(WMT_TASK_INDX, NULL); /* mtk_wcn_stp_register_event_cb */ if (iRet) { WMT_WARN_FUNC("stp_reg cb unregister fail(%d)\n", iRet); return -1; } /*un-register rxcb to btif*/ iRet = mtk_wcn_stp_rxcb_register(NULL); if(iRet){ WMT_WARN_FUNC("mtk_wcn_stp_rxcb_unregister fail(%d)\n", iRet); return -2; } iRet = mtk_wcn_stp_close_btif(); if(iRet){ WMT_WARN_FUNC("mtk_wcn_stp_close_btif fail(%d)\n", iRet); return -3; } osal_clear_bit(WMT_STAT_STP_OPEN, &pDev->state); return 0; }
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_func_gps_off(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf) { INT32 iRet = 0; UINT32 ctrlPa1 = 0; UINT32 ctrlPa2 = 0; iRet = wmt_func_gps_pre_off(pOps, pConf); if (0 == iRet) { iRet = wmt_func_gps_ctrl(FUNC_OFF); if(!iRet) { osal_clear_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 stop sending de-sense CMD ctrlPa1 = 0; ctrlPa2 = 0; wmt_core_ctrl(WMT_CTRL_BGW_DESENSE_CTRL,&ctrlPa1,&ctrlPa2); } } } return iRet; }
INT32 wmt_ctrl_stp_close(P_WMT_CTRL_DATA pWmtCtrlData) { P_DEV_WMT pDev = &gDevWmt; /* single instance */ INT32 iRet = 0; UCHAR cmdStr[NAME_MAX + 1] = {0}; /* un-register to STP-core for rx */ iRet = mtk_wcn_stp_register_event_cb(WMT_TASK_INDX, NULL); /* mtk_wcn_stp_register_event_cb */ if (iRet) { WMT_WARN_FUNC("stp_reg cb unregister fail(%d)\n", iRet); return -1; } if (WMT_HIF_UART == pDev->rWmtHifConf.hifType) { osal_snprintf(cmdStr, NAME_MAX, "close_stp"); iRet = wmt_ctrl_ul_cmd(pDev, cmdStr); if (iRet) { WMT_WARN_FUNC("wmt_ctrl_ul_cmd fail(%d)\n", iRet); return -2; } } osal_clear_bit(WMT_STAT_STP_OPEN, &pDev->state); return 0; }
INT32 wmt_func_bt_off(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf) { //return wmt_func_bt_ctrl(FUNC_OFF); INT32 iRet1 = -1; INT32 iRet2 = -1; UINT32 ctrlPa1; UINT32 ctrlPa2; iRet1 = wmt_core_func_ctrl_cmd(WMTDRV_TYPE_BT, MTK_WCN_BOOL_FALSE); if(iRet1){ WMT_ERR_FUNC("wmt-func: wmt_core_func_ctrl_cmd(bt_off) failed(%d)\n",iRet1); } ctrlPa1 = BT_PALDO; ctrlPa2 = PALDO_OFF; iRet2 = wmt_core_ctrl(WMT_CTRL_SOC_PALDO_CTRL,&ctrlPa1,&ctrlPa2); if(iRet2){ WMT_ERR_FUNC("wmt-func: wmt_ctrl_soc_paldo_ctrl(bt_off) failed(%d)\n",iRet2); } if(iRet1 + iRet2) { return -1; } osal_clear_bit(WMT_BT_ON,&gBtWifiGpsState); if((!osal_test_bit(WMT_WIFI_ON,&gBtWifiGpsState)) && (osal_test_bit(WMT_GPS_ON,&gBtWifiGpsState))) { //send msg to GPS native for stopping send de-sense CMD ctrlPa1 = 0; ctrlPa2 = 0; wmt_core_ctrl(WMT_CTRL_BGW_DESENSE_CTRL,&ctrlPa1,&ctrlPa2); } return 0; }
INT32 wmt_func_bt_off(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf) { /* return wmt_func_bt_ctrl(FUNC_OFF); */ INT32 iRet1 = -1; INT32 iRet2 = -1; UINT32 ctrlPa1; UINT32 ctrlPa2; iRet1 = wmt_core_func_ctrl_cmd(WMTDRV_TYPE_BT, MTK_WCN_BOOL_FALSE); if (iRet1) WMT_ERR_FUNC("wmt-func: wmt_core_func_ctrl_cmd(bt_off) failed(%d)\n", iRet1); ctrlPa1 = BT_PALDO; ctrlPa2 = PALDO_OFF; iRet2 = wmt_core_ctrl(WMT_CTRL_SOC_PALDO_CTRL, &ctrlPa1, &ctrlPa2); if (iRet2) WMT_ERR_FUNC("wmt-func: wmt_ctrl_soc_paldo_ctrl(bt_off) failed(%d)\n", iRet2); if (iRet1 + iRet2) { /*do coredump when bt off fail */ wmt_core_set_coredump_state(DRV_STS_FUNC_ON); ctrlPa1 = WMTDRV_TYPE_BT; ctrlPa2 = 32; wmt_core_ctrl(WMT_CTRL_EVT_ERR_TRG_ASSERT, &ctrlPa1, &ctrlPa2); return -1; } osal_clear_bit(WMT_BT_ON, &gBtWifiGpsState); if ((!osal_test_bit(WMT_WIFI_ON, &gBtWifiGpsState)) && (osal_test_bit(WMT_GPS_ON, &gBtWifiGpsState))) { /* send msg to GPS native for stopping send de-sense CMD */ ctrlPa1 = 0; ctrlPa2 = 0; wmt_core_ctrl(WMT_CTRL_BGW_DESENSE_CTRL, &ctrlPa1, &ctrlPa2); } return 0; }
INT32 wmt_func_gps_off(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf) { INT32 iRet = 0; UINT32 ctrlPa1 = 0; UINT32 ctrlPa2 = 0; UINT8 co_clock_type = (pConf->co_clock_flag & 0x0f); iRet = wmt_func_gps_pre_off(pOps, pConf); if (0 == iRet) { iRet = wmt_func_gps_ctrl(FUNC_OFF); if (!iRet) { osal_clear_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 stop sending de-sense CMD */ ctrlPa1 = 0; 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 */ if (osal_test_bit(WMT_FM_ON, &gGpsFmState)) WMT_INFO_FUNC("FM is still on, do not turn off LDO VCN28\n"); else { ctrlPa1 = GPS_PALDO; ctrlPa2 = PALDO_OFF; wmt_core_ctrl(WMT_CTRL_SOC_PALDO_CTRL, &ctrlPa1, &ctrlPa2); } osal_clear_bit(WMT_GPS_ON, &gGpsFmState); } return iRet; }
INT32 wmt_func_wifi_off(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf) { int iRet = 0; UINT32 ctrlPa1 = 0; UINT32 ctrlPa2 = 0; if(NULL != mtk_wcn_wlan_remove){ WMT_INFO_FUNC("WMT-FUNC: wmt wlan func on befor wlan remove\n"); iRet = (*mtk_wcn_wlan_remove)(); if(iRet){ WMT_ERR_FUNC("WMT-FUNC: wmt call wlan remove fail(%d)\n",iRet); iRet = -1; }else{ WMT_INFO_FUNC("WMT-FUNC: wmt call wlan remove ok\n"); } }else{ WMT_ERR_FUNC("WMT-FUNC: null pointer mtk_wcn_wlan_remove\n"); iRet = -2; } if(!iRet) { osal_clear_bit(WMT_WIFI_ON,&gBtWifiGpsState); if((!osal_test_bit(WMT_BT_ON,&gBtWifiGpsState)) && (osal_test_bit(WMT_GPS_ON,&gBtWifiGpsState))) { //send msg to GPS native for stopping send de-sense CMD ctrlPa1 = 0; ctrlPa2 = 0; wmt_core_ctrl(WMT_CTRL_BGW_DESENSE_CTRL,&ctrlPa1,&ctrlPa2); } } return iRet; #if 0 return wmt_func_wifi_ctrl(FUNC_OFF); #endif }
INT32 wmt_func_fm_off(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf) { /* return wmt_func_fm_ctrl(FUNC_OFF); */ UINT32 ctrlPa1 = 0; UINT32 ctrlPa2 = 0; INT32 iRet = -1; UINT8 co_clock_type = (pConf->co_clock_flag & 0x0f); iRet = wmt_core_func_ctrl_cmd(WMTDRV_TYPE_FM, MTK_WCN_BOOL_FALSE); if (co_clock_type) { if (osal_test_bit(WMT_GPS_ON, &gGpsFmState)) { WMT_INFO_FUNC("GPS is still on, do not turn off LDO VCN28\n"); } else { ctrlPa1 = FM_PALDO; ctrlPa2 = PALDO_OFF; wmt_core_ctrl(WMT_CTRL_SOC_PALDO_CTRL, &ctrlPa1, &ctrlPa2); } osal_clear_bit(WMT_FM_ON, &gGpsFmState); } 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; }