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_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_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_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_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_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"); } } if(WMT_STP_CONF_RDY == type) { if (value) { osal_set_bit(WMT_STAT_STP_RDY, &pDev->state); WMT_DBG_FUNC("STP ready\n"); } else { osal_clear_bit(WMT_STAT_STP_RDY, &pDev->state); WMT_DBG_FUNC("STP not ready\n"); } } } 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_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); /*do coredump when bt on 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 -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_ctrl_host_baudrate_set(P_WMT_CTRL_DATA pWmtCtrlData) { INT32 iRet = -1; INT8 cmdStr[NAME_MAX + 1] = { 0 }; UINT32 u4Baudrate = pWmtCtrlData->au4CtrlData[0]; UINT32 u4FlowCtrl = pWmtCtrlData->au4CtrlData[1]; WMT_DBG_FUNC("baud(%d), flowctrl(%d)\n", u4Baudrate, u4FlowCtrl); if (osal_test_bit(WMT_STAT_STP_OPEN, &gDevWmt.state)) { osal_snprintf(cmdStr, NAME_MAX, "baud_%d_%d", u4Baudrate, u4FlowCtrl); iRet = wmt_ctrl_ul_cmd(&gDevWmt, cmdStr); if (iRet) { WMT_WARN_FUNC("CTRL_BAUDRATE baud(%d), flowctrl(%d) fail(%d)\n", u4Baudrate, pWmtCtrlData->au4CtrlData[1], iRet); } else { WMT_DBG_FUNC("CTRL_BAUDRATE baud(%d), flowctrl(%d) ok\n", u4Baudrate, u4FlowCtrl); } } else { WMT_INFO_FUNC("CTRL_BAUDRATE but invalid Handle of WmtStp\n"); } return iRet; }
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; }
INT32 wmt_ctrl_rx(P_WMT_CTRL_DATA pWmtCtrlData/*UINT8 *pBuff, UINT32 buffLen, UINT32 *readSize*/) { P_DEV_WMT pDev = &gDevWmt; /* single instance */ INT32 readLen; LONG waitRet = -1; UINT8 *pBuff = (UINT8 *)pWmtCtrlData->au4CtrlData[0]; UINT32 buffLen = pWmtCtrlData->au4CtrlData[1]; UINT32 *readSize = (UINT32 *)pWmtCtrlData->au4CtrlData[2]; if (readSize) { *readSize = 0; } /* sanity check */ if (!buffLen ) { WMT_WARN_FUNC("buffLen = 0\n"); osal_assert(buffLen); return 0; } #if 0 if (!pDev) { WMT_WARN_FUNC("gpDevWmt = NULL\n"); osal_assert(pDev); return -1; } #endif if (!osal_test_bit(WMT_STAT_STP_OPEN, &pDev->state)) { WMT_WARN_FUNC("state(0x%lx) \n", pDev->state); osal_assert(osal_test_bit(WMT_STAT_STP_OPEN, &pDev->state)); return -2; } /* sanity ok, proceeding rx operation */ /* read_len = mtk_wcn_stp_receive_data(data, size, WMT_TASK_INDX); */ readLen = mtk_wcn_stp_receive_data(pBuff, buffLen, WMT_TASK_INDX); while (readLen == 0) { // got nothing, wait for STP's signal WMT_LOUD_FUNC("before wmt_dev_rx_timeout\n"); //iRet = wait_event_interruptible(pdev->rWmtRxWq, osal_test_bit(WMT_STAT_RX, &pdev->state)); //waitRet = wait_event_interruptible_timeout(pDev->rWmtRxWq, osal_test_bit(WMT_STAT_RX, &pdev->state), msecs_to_jiffies(WMT_LIB_RX_TIMEOUT)); pDev->rWmtRxWq.timeoutValue = WMT_LIB_RX_TIMEOUT; //waitRet = osal_wait_for_event_bit_timeout(&pDev->rWmtRxWq, &pDev->state, WMT_STAT_RX); waitRet = wmt_dev_rx_timeout(&pDev->rWmtRxWq); WMT_LOUD_FUNC("wmt_dev_rx_timeout returned\n"); if (0 == waitRet) { WMT_ERR_FUNC("wmt_dev_rx_timeout: timeout,jiffies(%lu),timeoutvalue(%d) \n", jiffies,pDev->rWmtRxWq.timeoutValue); return -1; } else if (waitRet < 0) { WMT_WARN_FUNC("wmt_dev_rx_timeout: interrupted by signal (%ld)\n", waitRet); return waitRet; } WMT_DBG_FUNC("wmt_dev_rx_timeout, iRet(%ld)\n", waitRet); /* read_len = mtk_wcn_stp_receive_data(data, size, WMT_TASK_INDX); */ readLen = mtk_wcn_stp_receive_data(pBuff, buffLen, WMT_TASK_INDX); if (0 == readLen) { WMT_WARN_FUNC("wmt_ctrl_rx be signaled, but no rx data(%ld)\n", waitRet); } WMT_DBG_FUNC("readLen(%d) \n", readLen); } if (readSize) { *readSize = readLen ; } return 0; }