Ejemplo n.º 1
0
int reset_md(void)
{
    CCCI_BUFF_T sys_msg;
	char buf = 1;
	
    CCCI_MSG_INF("ctl", "send reset modem request message\n");

    /* prevent another reset modem action from wdt timeout IRQ during modem reset */
	atomic_inc(&md_reset_on_going);
	if(atomic_read(&md_reset_on_going)>1){
		CCCI_MSG_INF("ctl", "One reset flow is on-going \n");
		return CCCI_MD_IN_RESET;
	}

	if(md_boot_stage == MD_BOOT_STAGE_2){
		lock_md_sleep(&buf, sizeof(char));
	}
	
	/* v1.3 20120601: mask CCIF IRQ to prevent md_boot_stage from updating by CCIF ISR */
    md_boot_stage = MD_BOOT_STAGE_0;
    //ccci_disable();
    ccci_mask();
    //CCCI_INIT_MAILBOX(&sys_msg, CCCI_SYS_MSG_RESET_MD);
    wake_lock_timeout(&trm_wake_lock, 10*HZ);
    CCCI_INIT_MAILBOX(&sys_msg, CCCI_MD_MSG_RESET);
    ccci_system_message(&sys_msg);

  //  CCCI_DEBUG("wait.....\n");
 //   schedule_timeout_interruptible(5*HZ);
 //  boot_md();
    return CCCI_SUCCESS;
}
Ejemplo n.º 2
0
static void md_boot_up_timeout_func(unsigned long data  __always_unused)
{
	CCCI_BUFF_T sys_msg;
	CCCI_MSG_INF("ctl", "Time out! Notify Deamon\n");
	CCCI_INIT_MAILBOX(&sys_msg, CCCI_MD_MSG_BOOT_TIMEOUT);
	ccci_system_message(&sys_msg);
}
Ejemplo n.º 3
0
int ccci_send_run_time_data(void)
{
	int ret=0;
	CCCI_BUFF_T buff;

	/* Set runtime data and echo start-boot command */
	CCCI_MSG_INF("ctl", "set modem runtime\n");
	ret = set_md_runtime();
	if (ret != 0) {
		CCCI_MSG_INF("ctl", "fail to set MODEM runtime data\n");
		return ret;
	}

	//printk("echo MD_INIT_START_BOOT\n");
	CCCI_INIT_MAILBOX(&buff, MD_INIT_START_BOOT);
	buff.reserved = MD_INIT_CHK_ID;
	ccci_before_modem_start_boot();
	ret = ccci_write(CCCI_CONTROL_TX, &buff);
	if (ret != 0) {
		CCCI_MSG_INF("ctl", "fail to write CCCI_CONTROL_TX\n");
		return ret;
	}
	CCCI_MSG_INF("ctl", "wait for NORMAL_BOOT_ID\n");
	//if (end)   end();
	//Notes:after load dsp_rom, dsp will write data back to dsp region, so set protect region at last
	//start_emi_mpu_protect();
	enable_emi_mpu_protection(ccci_smem_phy, ccci_smem_size);
	//mod_timer(&md_boot_up_check_timer, jiffies+5*HZ);
	mod_timer(&md_boot_up_check_timer, jiffies+10*HZ);
	return ret;
}
Ejemplo n.º 4
0
int send_stop_md_request(void)
{
	CCCI_BUFF_T sys_msg;
    char buf = 1;

	CCCI_MSG_INF("ctl", "send stop modem request message\n");
	/* prevent another reset modem action from wdt timeout IRQ during modem reset */
	atomic_inc(&md_reset_on_going);
	if(atomic_read(&md_reset_on_going)>1){
		CCCI_MSG_INF("ctl", "One stop flow is on-going \n");
		return CCCI_MD_IN_RESET;
	}

	if(md_boot_stage == MD_BOOT_STAGE_2){
		lock_md_sleep(&buf, sizeof(char));
	}
	
	/* mask CCIF IRQ to prevent md_boot_stage from updating by CCIF LISR */
	md_boot_stage = MD_BOOT_STAGE_0;
	/* v1.4 20120618: mask CCIF IRQ to prevent md_boot_stage from updating by CCIF ISR */
	//CCCI_MSG_INF("ctl", "stop request: mask ccci irq\n");
	ccci_mask();
	CCCI_INIT_MAILBOX(&sys_msg, CCCI_MD_MSG_STOP_MD_REQUEST);
	ccci_system_message(&sys_msg);

	return CCCI_SUCCESS;
}
Ejemplo n.º 5
0
int send_start_md_request(void)
{
	CCCI_BUFF_T sys_msg;

	CCCI_MSG_INF("ctl", "send start modem request message\n");
	CCCI_INIT_MAILBOX(&sys_msg, CCCI_MD_MSG_START_MD_REQUEST);
	ccci_system_message(&sys_msg);
	return CCCI_SUCCESS;
}
Ejemplo n.º 6
0
void ccci_exception_info_passed(void)
{
#if defined(__MODEM_CCCI_EXIST__)&& !defined(__MODEM_CARD__)  
    CCCI_BUFF_T *buff;
    qbm_gpd *p_first_gpd, *p_last_gpd;
    kal_uint32 gpd_num;

    // ensure in the exception state
    if(INT_QueryExceptionStatus() == KAL_FALSE) return;


    //- Already init in ccci_exception_handshake
    //- ccci_init(CCCI_CONTROL_CHANNEL, ccci_except_ack);
    //- ccci_init(CCCI_CONTROL_CHANNEL_ACK, ccci_except_ack);

    buff = CCCIDEV_GET_QBM_DATAPTR(ccci_except_polling_gpd_tx);
    CCCI_INIT_MAILBOX(buff, CCMSG_ID_EXCEPTION_PASS);
	ccci_debug_add_seq(buff, CCCI_DEBUG_ASSERT_BIT); // add ccci seq
    QBM_DES_SET_DATALEN(ccci_except_polling_gpd_tx, sizeof(CCCI_BUFF_T));
    QBM_DES_SET_DATALEN(ccci_except_polling_gpd_tx->p_data_tbd,  sizeof(CCCI_BUFF_T));
    qbm_cal_set_checksum((kal_uint8 *)ccci_except_polling_gpd_tx);
    qbm_cal_set_checksum((kal_uint8 *)ccci_except_polling_gpd_tx->p_data_tbd);
    QBM_CACHE_FLUSH(ccci_except_polling_gpd_tx, sizeof(qbm_gpd));
    QBM_CACHE_FLUSH(ccci_except_polling_gpd_tx->p_data_tbd, sizeof(qbm_gpd));
    QBM_CACHE_FLUSH(buff, sizeof(CCCI_BUFF_T));

    // TODO:Need to revise the API, shall use exception API (after channle reset flow is done)
#ifdef SWITCH_TO_EXCEPTION_IO
    p_first_gpd = p_last_gpd = ccci_except_polling_gpd_tx;
    ccci_except_set_gpd(CCCI_CONTROL_CHANNEL, p_first_gpd, p_last_gpd);
    gpd_num = 0;
    do{
        ccci_except_hif_st(CCCI_CONTROL_CHANNEL);
        ccci_except_poll_gpd(CCCI_CONTROL_CHANNEL, (void **)&p_first_gpd, (void **)&p_last_gpd, &gpd_num);
    }while(0 == gpd_num);
    ex_set_step_logging(EX_AUTO_STEP); //0x46
    CCCIDEV_RST_CCCI_COMM_GPD_LIST(p_first_gpd, p_last_gpd);
#else
    ccci_exception_info_write_result = ccci_polling_io(CCCI_CONTROL_CHANNEL, ccci_except_polling_gpd_tx, KAL_TRUE);
    CCCIDEV_RST_CCCI_COMM_GPD_LIST(ccci_except_polling_gpd_tx, ccci_except_polling_gpd_tx);
#endif

    ccci_exception_state = CCCI_EXPT_INFO_PASS_ST;
#endif    

#if defined (__CCCI_FS_IT__)
    cccifs_it_case();
#endif
}
Ejemplo n.º 7
0
static int boot_md(void)
{
    int ret=0;
    //struct image_info *pImg_info=NULL;
	
    if (md_boot_stage != MD_BOOT_STAGE_0)
    {
	CCCI_MSG_INF("ctl", "MD has boot up!\n");
	return 0;
    }
   
    CCCI_MSG("booting up MODEM: start to load firmware...\n");

    if(is_first_boot) {
        //if((ret = ccci_load_firmware(pImg_info)) <0) {
        if((ret = ccci_load_firmware(LOAD_MD_DSP)) <0) {
	    CCCI_MSG_INF("ctl", "load firmware fail, so modem boot fail!\n");
	    return ret;
        }
        else {
	    //when load firmware successfully, no need to load it again when reset modem
	    is_first_boot = 0;
	    CCCI_MSG_INF("ctl", "load firmware successful!\n");
        }
    }
    else {
	CCCI_MSG_INF("ctl", "modem&dsp firmware already exist, not load again!\n");
    }

    ret = ccci_register(CCCI_CONTROL_TX, NULL, NULL);
    if (ret != 0 && ret != CCCI_IN_USE) {
        CCCI_MSG_INF("ctl", "fail to register CCCI_CONTROL_TX\n");
        return ret;
    }
	
    ret = ccci_register(CCCI_CONTROL_RX, ccci_md_ctrl_cb, NULL);
    if (ret != 0 && ret != CCCI_IN_USE) {
        CCCI_MSG_INF("ctl", "fail to register CCCI_CONTROL_RX\n");
        ccci_unregister(CCCI_CONTROL_TX);
        return ret;
    }

    ret = ccci_register(CCCI_SYSTEM_TX, NULL, NULL);
    if (ret != 0 && ret != CCCI_IN_USE) {
        CCCI_MSG_INF("ctl", "fail to register CCCI_SYSTEM_TX\n");
    }

    /* step 1: ungate modem */
    ungate_md();

    /* step 2: get start-boot command from control channel */
    CCCI_MSG_INF("ctl", "wait MD_INIT_START_BOOT\n");

    #if 0
    time_out = jiffies + 6*HZ;
    do {
        if (md_boot_stage == MD_BOOT_STAGE_1) {
            CCCI_MSG_INF("ctl", "received MD_INIT_START_BOOT\n");
            break;
        }
	yield();
	if(time_after(jiffies, time_out)){
            CCCI_MSG_INF("ctl", "wait MD_INIT_START_BOOT time out, try to reboot MD again\n");
            CCCI_INIT_MAILBOX(&sys_msg, CCCI_MD_MSG_RESET_RETRY);
            ccci_system_message(&sys_msg);
            return ret;
        }
    } while (1);

    /* step 3: set runtime data and echo start-boot command */
    CCCI_MSG_INF("ctl", "set modem runtime\n");
    ret = set_md_runtime();
    if (ret != 0) {
        CCCI_MSG("fail to set MODEM runtime data\n");
        return ret;
    }
	
    //printk("echo MD_INIT_START_BOOT\n");
    CCCI_BUFF_T buff;
    CCCI_INIT_MAILBOX(&buff, MD_INIT_START_BOOT);
    buff.reserved = MD_INIT_CHK_ID;
    ccci_before_modem_start_boot();
    ret = ccci_write(CCCI_CONTROL_TX, &buff);
    if (ret != 0) {
        CCCI_MSG("fail to write CCCI_CONTROL_TX\n");
        return ret;
    }
    CCCI_MSG_INF("ctl", "wait for NORMAL_BOOT_ID\n");
    //if (end)   end();
    //Notes:after load dsp_rom, dsp will write data back to dsp region, so set protect region at last
    start_emi_mpu_protect();
    #endif

    return ret;
}
Ejemplo n.º 8
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));
	}
}
Ejemplo n.º 9
0
int ccci_reset_request(int handle)
{
    int i;
    CCCI_BUFF_T sys_msg;
	bool reset_ready = true;
    
    if (handle >= NR_CCCI_RESET_USER) {
		CCCI_MSG_INF("ctl", "reset_request: invalid handle:%d \n", handle);
        return CCCI_INVALID_PARAM;
    }
	
    if (reset_sta[handle].is_allocate == 0) {
		CCCI_MSG_INF("ctl", "reset_request: handle(%d) not alloc: alloc=%d \n", 
			handle, reset_sta[handle].is_allocate);
        return CCCI_INVALID_PARAM;
    } 

	CCCI_MSG_INF("ctl", "%s (%d) call reset request \n",current->comm,handle);

 
    down(&ccci_reset_mutex);	
	
    reset_sta[handle].is_allocate = 0;
    reset_sta[handle].is_reset = 1;

    CCCI_MSG_INF("ctl", "Dump not ready list++++\n");
    for (i = 0; i < NR_CCCI_RESET_USER; i++) {
        if (reset_sta[i].is_allocate && (reset_sta[i].is_reset == 0)) {
			reset_ready = false;
            CCCI_MSG_INF("ctl", " ==> %s\n", reset_sta[i].name);
        }
    }
    CCCI_MSG_INF("ctl", "Dump not ready list----\n");

    up(&ccci_reset_mutex);
   
    if (reset_ready == false) 
            return CCCI_RESET_NOT_READY;
 
    #if 0
    atomic_inc(&md_reset_on_going);
    if(atomic_read(&md_reset_on_going)>1){
        CCCI_MSG_INF("ctl", "One reset flow is on-going.\n");
        return;
    }

    /* if all register users are ready to reset, reset modem */
    CCCI_MSG_INF("ctl", "Reset by %s(%d).\n",current->comm,handle);
    md_call_chain(&md_notifier,CCCI_MD_RESET);
    ccci_disable();
    gate_md();
    ccci_reset();
    ccci_enable();
    /* reset state and notify the user process md_init */
   // md_boot_stage = MD_BOOT_STAGE_0;
    boot_md();
    for (i = 0; i < NR_CCCI_RESET_USER; i++) {
        reset_sta[i].is_reset = 0;
    }
    atomic_set(&md_reset_on_going, 0);
    #endif
	
    CCCI_MSG_INF("ctl", "Reset MD by %s(%d) \n", current->comm, handle);
    CCCI_INIT_MAILBOX(&sys_msg, CCCI_MD_MSG_RESET_REQUEST);
    ccci_system_message(&sys_msg);

    return CCCI_SUCCESS;
}