//******************************************************************************
//
// Function Name: KRIL_StkSetProfile
//
// Description:   
// Notes:
//
//******************************************************************************
void KRIL_StkSetProfile(void *ril_cmd, Kril_CAPI2Info_t *capi2_rsp)
{
    KRIL_CmdList_t *pdata = (KRIL_CmdList_t*)ril_cmd;

    KRIL_DEBUG(DBG_INFO,"pdata->handler_state:0x%lX\n", pdata->handler_state);
    
    if (capi2_rsp && capi2_rsp->result != RESULT_OK)
    {
        KRIL_DEBUG(DBG_ERROR,"CAPI2 response failed:%d\n", capi2_rsp->result);
        pdata->handler_state = BCM_ErrorCAPI2Cmd;
        return;
    }
    
    switch (pdata->handler_state)
    {
        case BCM_SendCAPI2Cmd:
        {
            UInt8 *stkprofile = (UInt8*)pdata->ril_cmd->data;
    
            RawDataPrintfun(stkprofile, pdata->ril_cmd->datalen, "stkprofile");
            
            // Update terminal_profile_data[]
            memcpy(terminal_profile_data, stkprofile, sizeof(terminal_profile_data)/sizeof(UInt8));
            
            CAPI2_SatkApi_SetTermProfile(InitClientInfo(pdata->ril_cmd->SimId), stkprofile,
                pdata->ril_cmd->datalen);
            
            pdata->handler_state = BCM_RESPCAPI2Cmd;
            break;            
        }    
        
        case BCM_RESPCAPI2Cmd:
            pdata->result = BCM_E_SUCCESS;
            pdata->handler_state = BCM_FinishCAPI2Cmd;
            break;
                    
        default:
            KRIL_DEBUG(DBG_ERROR,"Error handler_state:0x%lX\n", pdata->handler_state);
            pdata->handler_state = BCM_ErrorCAPI2Cmd;
            break;        
        
    }    
}
void KRIL_InitCmdHandler(void *ril_cmd, Kril_CAPI2Info_t *capi2_rsp)
{
    KRIL_CmdList_t *pdata = (KRIL_CmdList_t *)ril_cmd;
    ClientInfo_t clientInfo;
    CAPI2_MS_Element_t data;

    if (capi2_rsp != NULL)
    {
        KRIL_DEBUG(DBG_INFO, "handler_state:0x%lX::result:%d\n", pdata->handler_state, capi2_rsp->result);
        
        if(capi2_rsp->result != RESULT_OK)
        {
           pdata->handler_state = BCM_ErrorCAPI2Cmd;
        }
    }

    switch(pdata->handler_state)
    {
        case BCM_SendCAPI2Cmd:
        {
            KrilInit_t *pInitData = (KrilInit_t *)(pdata->ril_cmd->data);

            // if there is a valid IMEI, make appropriate CAPI2 call to set
            // IMEI on CP, otherwise fall through to next init command
            if (pInitData->is_valid_imei)
            {
                KRIL_DEBUG(DBG_INFO, "OTP IMEI:%s\n", pInitData->imei);

#ifdef CONFIG_BRCM_SIM_SECURE_ENABLE
                    // Record IMEI1 infomation  
                    if (FALSE == ProcessImei((UInt8*)pInitData->imei, sImei_Info))
                    {
                        KRIL_DEBUG(DBG_ERROR,"Process IMEI:%s Failed!!!", pInitData->imei);
                        pdata->handler_state = BCM_ErrorCAPI2Cmd;
                        kernel_power_off();
                    }
#endif //CONFIG_BRCM_SIM_SECURE_ENABLE

                memset(&data, 0, sizeof(CAPI2_MS_Element_t));
                memcpy(data.data_u.imeidata, pInitData->imei, IMEI_DIGITS);
                data.inElemType = MS_LOCAL_PHCTRL_ELEM_IMEI;
                CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
                CAPI2_MsDbApi_SetElement(&clientInfo, &data);
                pdata->handler_state = BCM_SET_HSDPA_PHY_CATEGORY;
                break;
            }
#ifdef CONFIG_BRCM_SIM_SECURE_ENABLE 
            else
            {
                // For secure boot, the IMEI is important inform for verifying SIM lock data.
                KRIL_DEBUG(DBG_ERROR, "IMEI is invalid. Error!!!\n");
                kernel_power_off();
            }
#endif //CONFIG_BRCM_SIM_SECURE_ENABLE 

            // if OTP IMEI passed from URIL is not valid, we skip the
            // CAPI2_MS_SetElement() call and fall through to execute the
            // next CAPI2 init call instead...
        }
         
	case BCM_SET_HSDPA_PHY_CATEGORY:
		{
			struct file *filp;
			mm_segment_t fs;
			int ret;
			int hsdpa_phy_cat = 8;

			filp = filp_open("/data/hsdpa.dat",  O_RDWR|O_SYNC, 0);
			if (IS_ERR(filp))
			{
				// Do not set hsdpa phy category value. just go next case. (Normal operaton)
				pdata->handler_state = BCM_SMS_ELEM_CLIENT_HANDLE_MT_SMS;
			}
			else
			{
				// hsdpa phy category is changed to do Vodafone test			
				fs = get_fs();
				set_fs(get_ds());
				ret = filp->f_op->read(filp, (char __user *)&hsdpa_phy_cat, sizeof(hsdpa_phy_cat), &filp->f_pos);
				set_fs(fs);
				filp_close(filp, NULL);

				KRIL_DEBUG(DBG_ERROR,"BCM_SET_HSDPA_PHY_CATEGORY\n");
				CAPI2_SYSPARM_SetHSDPAPHYCategory(GetNewTID(), GetClientID(), hsdpa_phy_cat );
	        	pdata->handler_state = BCM_SMS_ELEM_CLIENT_HANDLE_MT_SMS;
	        	break;
			}
		}

        case BCM_SMS_ELEM_CLIENT_HANDLE_MT_SMS:
        {
            memset((UInt8*)&data, 0, sizeof(CAPI2_MS_Element_t));
            data.inElemType = MS_LOCAL_SMS_ELEM_CLIENT_HANDLE_MT_SMS;
            data.data_u.bData = TRUE;
            CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
            CAPI2_MsDbApi_SetElement(&clientInfo, &data);
            pdata->handler_state = BCM_SMS_SetSmsReadStatusChangeMode;
            break;
        }

        case BCM_SMS_SetSmsReadStatusChangeMode:
        {
            CAPI2_SMS_SetSmsReadStatusChangeMode(GetNewTID(), GetClientID(), FALSE);
            pdata->handler_state = BCM_SYS_SetFilteredEventMask;
            break;
        }

        case BCM_SYS_SetFilteredEventMask:
        {
            UInt16 filterList[]={MSG_RSSI_IND, MSG_CELL_INFO_IND, MSG_LCS_RRC_UE_STATE_IND, 
                                 MSG_DATE_TIMEZONE_IND, MSG_DATA_SUSPEND_IND, 
                                 MSG_DATA_RESUME_IND, MSG_CAPI2_AT_RESPONSE_IND, 
                                 MSG_UE_3G_STATUS_IND};
            CAPI2_SYS_SetFilteredEventMask(GetNewTID(), GetClientID(), &filterList[0], sizeof(filterList)/sizeof(UInt16), SYS_AP_DEEP_SLEEP_MSG_FILTER);
            pdata->handler_state = BCM_SYS_SetRssiThreshold;
            break;
        }

        case BCM_SYS_SetRssiThreshold:
        {
            CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
            CAPI2_PhoneCtrlApi_SetRssiThreshold(&clientInfo, g_RSSIThreshold, 20, g_RSSIThreshold, 20);
            pdata->handler_state = BCM_TIMEZONE_SetTZUpdateMode;
            break;
        }

        case BCM_TIMEZONE_SetTZUpdateMode:
        {
            CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
            CAPI2_NetRegApi_SetTZUpdateMode(&clientInfo, TIMEZONE_UPDATEMODE_NO_TZ_UPDATE);
            pdata->handler_state = BCM_SATK_SetTermProfile;
            break;
        }

        case BCM_SATK_SetTermProfile:
        {
            CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
            CAPI2_SatkApi_SetTermProfile(&clientInfo, terminal_profile_data,
                sizeof(terminal_profile_data)/sizeof(UInt8));
            pdata->handler_state = BCM_SATK_SETUP_CALL_CTR;
            break;
        }

        case BCM_SATK_SETUP_CALL_CTR:
        {
            CAPI2_MS_Element_t data;
            memset((UInt8*)&data, 0x00, sizeof(CAPI2_MS_Element_t));
            data.inElemType = MS_LOCAL_SATK_ELEM_SETUP_CALL_CTR;
#ifdef OEM_RIL_ENABLE
            data.data_u.bData = FALSE;
            pdata->handler_state = BCM_SATK_SEND_SS_CTR;
#else
            data.data_u.bData = TRUE;
            pdata->handler_state = BCM_SS_SET_ENABLE_OLD_SS_MSG;
#endif
            CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
            CAPI2_MsDbApi_SetElement(&clientInfo, &data);
            pdata->handler_state = BCM_SATK_ICON_DISP_SUPPORTED;
            break;
        }

        case BCM_SATK_ICON_DISP_SUPPORTED:
        {
            memset((UInt8*)&data, 0x00, sizeof(CAPI2_MS_Element_t));
            data.inElemType = MS_LOCAL_SATK_ELEM_ICON_DISP_SUPPORTED;
            data.data_u.bData = TRUE;
            CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
            CAPI2_MsDbApi_SetElement(&clientInfo, &data);
#ifdef OEM_RIL_ENABLE
			pdata->handler_state = BCM_SATK_SEND_SS_CTR;  
#else
            pdata->handler_state = BCM_SS_SET_ENABLE_OLD_SS_MSG;            
#endif
            break;
        }

#ifdef OEM_RIL_ENABLE
        case BCM_SATK_SEND_SS_CTR:
        {
            CAPI2_MS_Element_t data;
            memset((UInt8*)&data, 0x00, sizeof(CAPI2_MS_Element_t));
            data.inElemType = MS_LOCAL_SATK_ELEM_SEND_SS_CTR;
            data.data_u.bData = FALSE;
            CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
            CAPI2_MsDbApi_SetElement(&clientInfo, &data);
            pdata->handler_state = BCM_SATK_SEND_USSD_CTR;
            break;
        }
        case BCM_SATK_SEND_USSD_CTR:
        {
            CAPI2_MS_Element_t data;
            memset((UInt8*)&data, 0x00, sizeof(CAPI2_MS_Element_t));
            data.inElemType = MS_LOCAL_SATK_ELEM_SEND_USSD_CTR;
            data.data_u.bData = FALSE;
            CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
            CAPI2_MsDbApi_SetElement(&clientInfo, &data);
            pdata->handler_state = BCM_SATK_SEND_SMS_CTR;
            break;
        }
        case BCM_SATK_SEND_SMS_CTR:
        {
            CAPI2_MS_Element_t data;
            memset((UInt8*)&data, 0x00, sizeof(CAPI2_MS_Element_t));
            data.inElemType = MS_LOCAL_SATK_ELEM_SEND_SMS_CTR;
            data.data_u.bData = FALSE;
            CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
            CAPI2_MsDbApi_SetElement(&clientInfo, &data);
            pdata->handler_state = BCM_SATK_SEND_ENABLE_7BIT_CONVERSIONS;
            break;
        }

        case BCM_SATK_SEND_ENABLE_7BIT_CONVERSIONS:
        {
            CAPI2_MS_Element_t data;
            memset((UInt8*)&data, 0x00, sizeof(CAPI2_MS_Element_t));
            data.inElemType = MS_LOCAL_SATK_ELEM_ENABLE_7BIT_CONVERSIONS;
            data.data_u.bData = FALSE;
            CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
            CAPI2_MsDbApi_SetElement(&clientInfo, &data);
            pdata->handler_state = BCM_SATK_SEND_SETUP_EVENT_LIST_CTR;
            break;
        }
        case BCM_SATK_SEND_SETUP_EVENT_LIST_CTR:
        {
            CAPI2_MS_Element_t data;
            memset((UInt8*)&data, 0x00, sizeof(CAPI2_MS_Element_t));
            data.inElemType = MS_LOCAL_SATK_ELEM_SETUP_EVENT_LIST_CTR;
            data.data_u.bData = FALSE;
            CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
            CAPI2_MsDbApi_SetElement(&clientInfo, &data);
            pdata->handler_state = BCM_CFG_SIM_LOCK_SUPPORTED;
            break;
        }

         case BCM_CFG_SIM_LOCK_SUPPORTED:
        {
            CAPI2_MS_Element_t data;
            memset((UInt8*)&data, 0x00, sizeof(CAPI2_MS_Element_t));
            data.inElemType = MS_CFG_ELEM_SIM_LOCK_SUPPORTED ;
            data.data_u.bData = TRUE;
            CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
            CAPI2_MsDbApi_SetElement(&clientInfo, &data);
            pdata->handler_state = BCM_SS_SET_ENABLE_OLD_SS_MSG;
            break;
        }


#endif


        case BCM_SS_SET_ENABLE_OLD_SS_MSG:
        {
            // enabled sending of "old" supp svcs messages
            // NOTE: this should go away when we move to the new SS apis
            memset((UInt8*)&data, 0x00, sizeof(CAPI2_MS_Element_t));
            data.inElemType = MS_LOCAL_SS_ELEM_ENABLE_OLD_SS_MSG;
            data.data_u.u8Data = 1;
            CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
            CAPI2_MsDbApi_SetElement(&clientInfo, &data);
            pdata->handler_state = BCM_SS_SET_ELEM_FDN_CHECK;
            break;
        }
                
        case BCM_SS_SET_ELEM_FDN_CHECK:
        {
            // enable FDN check for SS dialing
            memset((UInt8*)&data, 0x00, sizeof(CAPI2_MS_Element_t));
            data.inElemType = MS_LOCAL_SS_ELEM_FDN_CHECK;
            data.data_u.u8Data = 1;
            CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
            CAPI2_MsDbApi_SetElement(&clientInfo, &data);
            pdata->handler_state = BCM_SET_SupportedRATandBand;
            break;
        }

        case BCM_SET_SupportedRATandBand:
        {
            KrilInit_t *pInitData = (KrilInit_t *)(pdata->ril_cmd->data);
            KRIL_SetPreferredNetworkType(pInitData->networktype);
            KRIL_SetBandMode(pInitData->band);
            CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
            KRIL_DEBUG(DBG_INFO,"BCM_SET_SupportedRATandBand network type %d\n", pInitData->networktype);
            KRIL_DEBUG(DBG_INFO,"BCM_SET_SupportedRATandBand band %d conv band %d\n", pInitData->band, ConvertBandMode(pInitData->band));
            //TODO jw check this new api last two extra parameter.
            CAPI2_NetRegApi_SetSupportedRATandBand(&clientInfo, ConvertNetworkType(pInitData->networktype), ConvertBandMode(pInitData->band), ConvertNetworkType(pInitData->networktype), ConvertBandMode(pInitData->band) );

            //++ JSHAN Attach for next power on
		vGprsAttachMode = pInitData->gprs_attach_init;
		if (vGprsAttachMode == 1 || vGprsAttachMode == 2)
			pdata->handler_state = BCM_SET_AttachMode;
		else 
			pdata->handler_state = BCM_SET_RADIO_OFF;
		//-- JSHAN Attach for next power on
            break;
        }

	//++ JSHAN Attach for next power on
	case BCM_SET_AttachMode:
	{
		CAPI2_MS_Element_t data;
            memset((UInt8*)&data, 0x00, sizeof(CAPI2_MS_Element_t));
		data.inElemType = MS_LOCAL_PHCTRL_ELEM_ATTACH_MODE;
            data.data_u.u8Data = vGprsAttachMode;
		CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
		CAPI2_MsDbApi_SetElement ( &clientInfo,&data);
            pdata->handler_state = BCM_SET_RADIO_OFF;
            break;
        }
	//-- JSHAN Attach for next power on

        case BCM_SET_RADIO_OFF:
        {
            // For flight mode power up battery ADC & deep sleep issue (MobC00131482), set the initial CP state to RADIO_OFF.
            // If MS is powered up in normal mode, Android framework will send RIL_REQUEST_RADIO_POWER to RIL.
            CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
            CAPI2_PhoneCtrlApi_ProcessNoRfReq(&clientInfo);
            pdata->handler_state = BCM_RESPCAPI2Cmd;
            break;
        }
                
        case BCM_RESPCAPI2Cmd:
        {
            pdata->handler_state = BCM_FinishCAPI2Cmd;
            break;
        }

        default:
        {
            KRIL_DEBUG(DBG_ERROR,"Error handler_state:0x%lX\n", pdata->handler_state);
            pdata->handler_state = BCM_ErrorCAPI2Cmd;
            break;
        }
    }
}