Ejemplo n.º 1
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;
}
Ejemplo n.º 2
0
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
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
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;

}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
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");
            }
        }
        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;
}
Ejemplo n.º 7
0
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
}
Ejemplo n.º 8
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);

		/*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;
	}
}
Ejemplo n.º 9
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;
}
Ejemplo n.º 10
0
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;
}
Ejemplo n.º 11
0
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;
}
Ejemplo n.º 12
0
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;

}