/* * @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; }
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)); } }