/*
 * @brief EEMCS exception handshake .
 * @param
 *     skb   [in] SKB from MD exception, call by eemcs_boot_rx_callback
 *                when receive with MAGIC "MD_EX_MAGIC".
 *
 * @return
 *     KAL_SUCCESS  success.
 *     KAL_FAIL     fail.
 */
KAL_INT32 eemcs_expt_handshake(struct sk_buff *skb){
    CCCI_BUFF_T *msg = (CCCI_BUFF_T *)skb->data;
    DEBUG_INFO_T debug_info = {0};
    KAL_INT32 ret = KAL_SUCCESS;

    switch(msg->id){
       case MD_EX :
            if(msg->reserved != MD_EX_CHK_ID){
                DBGLOG(EXPT, ERR, "Invalid MD_EX: %08X, %08X, %08X, %08X",
                	msg->magic, msg->id, msg->channel, msg->reserved);
                ret = KAL_FAIL;
                break;
            }
            DBGLOG(EXPT, DBG, "receive MD_EX");
           
            //change_device_state(EEMCS_EXCEPTION);
            /*move to ccci_df_to_ccci_exception_callback*/
            //eemcs_cdev_msg(CCCI_PORT_CTRL, CCCI_MD_MSG_EXCEPTION, 0);

            msg->channel = CH_CTRL_TX;
            eemcs_ccci_UL_write_skb_to_swq(CH_CTRL_TX, skb);
			
            //2. set up timer for waiting MD_EX_REC_OK msg
            if (eemcs_exception_state != EEMCS_EX_REC_MSG_OK) {
                set_exception_mode(EEMCS_EX_MSG_OK);
                mod_timer(&g_except_inst.md_ex_monitor, jiffies+EE_HS2_TIMER);
            }
			
            return ret;
            
        case MD_EX_REC_OK :
            if(msg->reserved != MD_EX_REC_OK_CHK_ID){
                DBGLOG(EXPT, ERR, "Invalid MD_EX_REC_OK: %08X, %08X, %08X, %08X",
                	msg->magic, msg->id, msg->channel, msg->reserved);
                ret = KAL_FAIL;
                break;
            }
            DBGLOG(EXPT, DBG, "receive MD_EX_REC_OK");

            set_exception_mode(EEMCS_EX_REC_MSG_OK);
            del_timer(&g_except_inst.md_ex_monitor);

            DBGLOG(EXPT, DBG, "eemcs_md_exception_data_parse");
            eemcs_md_exception_data_parse((char*)(msg+1), &debug_info);
            eemcs_ee_info_dump(&debug_info, (char*)(msg+1));
            break;
            
        case MD_EX_RESUME_CHK_ID :
            DBGLOG(EXPT, DBG, "receive MD_EX_RESUME_CHK_ID");
            md_emi_check(msg, &debug_info);
            eemcs_ee_info_dump(&debug_info, (char*)(msg+1));
            break;
            
        case CCCI_DRV_VER_ERROR :
            DBGLOG(EXPT, ERR, "AP EEMCS driver version mis-match to MD!!");
            eemcs_aed(0, 0, "AP/MD driver version mis-match\n");
            break;
            
        default:
            DBGLOG(EXPT, ERR, "[EXPT] Invalid MD_EX_MAGIC: %08X, %08X, %08X, %08X",
            	msg->magic, msg->id, msg->channel, msg->reserved);
            break;
    }
	
    dev_kfree_skb(skb);
    return ret;
}
Beispiel #2
0
void ccci_md_ctrl_cb(CCCI_BUFF_T *buff, void *private_data)
{
	int ret;
	CCCI_BUFF_T sys_msg;

	if (CCCI_MAILBOX_ID(buff) == MD_INIT_START_BOOT &&
		buff->reserved == MD_INIT_CHK_ID && md_boot_stage == MD_BOOT_STAGE_0) 
	{
		del_timer(&md_boot_up_check_timer);
		CCCI_MSG_INF("ctl", "receive MD_INIT_START_BOOT\n");
		md_boot_stage = MD_BOOT_STAGE_1;

		//power on Audsys for DSP boot up
		AudSys_Power_On(TRUE);
		
		CCCI_INIT_MAILBOX(&sys_msg, CCCI_MD_MSG_BOOT_UP);
		ccci_system_message(&sys_msg);
	}
	else if (CCCI_MAILBOX_ID(buff) == NORMAL_BOOT_ID &&
	               md_boot_stage == MD_BOOT_STAGE_1) 
	{
		del_timer(&md_boot_up_check_timer);
		CCCI_MSG_INF("ctl", "receive NORMAL_BOOT_ID\n");
		ccci_after_modem_finish_boot();
		md_boot_stage = MD_BOOT_STAGE_2;
		//if (is_first_boot) 
		//	is_first_boot = 0;
		wakeup_md_is_safe = 1;
		md_call_chain(&md_notifier,CCCI_MD_BOOTUP);
		CCCI_INIT_MAILBOX(&sys_msg, CCCI_MD_MSG_BOOT_READY);
		ccci_system_message(&sys_msg);
		
		//power off Audsys after DSP boot up ready
		AudSys_Power_On(FALSE);

	}
	else if (CCCI_MAILBOX_ID(buff) == MD_EX) 
	{
		del_timer(&md_boot_up_check_timer);
		if (unlikely(buff->reserved != MD_EX_CHK_ID)) 
			CCCI_MSG_INF("ctl", "receive invalid MD_EX\n");
		else 
		{
			md_boot_stage = MD_BOOT_STAGE_EXCEPTION;
			md_ex_flag = 1;
			
			atomic_set(&md_ex, 1);
			mod_timer(&md_ex_monitor,jiffies+5*HZ);
		   	CCCI_MSG_INF("ctl", "receive MD_EX\n");
			ret = ccci_write(CCCI_CONTROL_TX, buff);
			if (ret != 0)
			{ 
				CCCI_MSG_INF("ctl", "fail to write CCCI_CONTROL_TX\n");
			}
			md_call_chain(&md_notifier,CCCI_MD_EXCEPTION);
			CCCI_INIT_MAILBOX(&sys_msg, CCCI_MD_MSG_EXCEPTION);
			ccci_system_message(&sys_msg);
		}
	}
	else if (CCCI_MAILBOX_ID(buff) == MD_EX_REC_OK) 
	{
		if (unlikely(buff->reserved != MD_EX_REC_OK_CHK_ID)) 
			CCCI_MSG_INF("ctl", "receive invalid MD_EX_REC_OK\n");
		else 
		{
			atomic_set(&md_ex_ok, 1);
			mod_timer(&md_ex_monitor,jiffies);		
		}
	} 
	else if (CCCI_MAILBOX_ID(buff) == MD_INIT_START_BOOT &&
		buff->reserved == MD_INIT_CHK_ID && !is_first_boot) 
	{
		/* reset state and notify the user process md_init */
		md_boot_stage = MD_BOOT_STAGE_0;
		CCCI_MSG_INF("ctl", "MD second bootup detected!\n");
		CCCI_INIT_MAILBOX(&sys_msg, CCCI_MD_MSG_RESET);
		ccci_system_message(&sys_msg);
	}
	else if (CCCI_MAILBOX_ID(buff) == MD_EX_RESUME_CHK_ID) 
	{
		md_emi_check(buff);
	}
	else if (CCCI_MAILBOX_ID(buff) == CCCI_DRV_VER_ERROR)
	{
		CCCI_MSG_INF("ctl", "AP CCCI driver version mis-match to MD!!\n");
	}
	else 
	{
		CCCI_MSG_INF("ctl", "receive unknow data from CCCI_CONTROL_RX = %d\n", CCCI_MAILBOX_ID(buff));
	}
}