/*****************************************************************************
 函 数 名  : DRV_MAILBOX_READMAILDATA
 功能描述  : 邮箱用户在数据接收回调函数中调用, 从邮箱中读取一封最先到达的邮件
 输入参数  : MailHandle -- 邮箱句柄, 数据接收回调函数入参
             pData      -- 保存待读出数据的缓存地址
             *pSize     -- 缓存长度, 单位byte, 需要大于待读取邮件长度
 输出参数  : *pSize     -- 实际读取长度, 单位byte
 返 回 值  : 正确:MAILBOX_OK / 错误:MAILBOX_ERRO或者其他错误码
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2012年10月26日
    作    者   : 莫南 00176101
    修改内容   : 新生成函数

*****************************************************************************/
unsigned int DRV_MAILBOX_READMAILDATA(
                void                   *MailHandle,
                unsigned char          *pData,
                unsigned int          *pSize)
{
    return mailbox_read_msg_data(MailHandle, (char *)pData, pSize);
}
Example #2
0
/*****************************************************************************
 函 数 名  : test_hifi_mail_handle
 功能描述  : 邮箱回调函数
 输入参数  : 无
 输出参数  : 无
 返 回 值  : int
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2013年5月25日
    作    者   : 路由切换
    修改内容   : 新生成函数

*****************************************************************************/
void test_hifi_handle_mail( void *usr_para, void *mail_handle, unsigned int mail_len  )
{
    int ret_mail = OK;
    unsigned int *pmail_value;
    unsigned char *mail_buff;       /* 邮箱数据接收的buff */

    printk("test_hifi_handle_mail\n");

    mail_buff = (unsigned char *)kmalloc(mail_len, GFP_ATOMIC);

    /* 将剩余内容copy透传到buff中 */
    ret_mail = mailbox_read_msg_data(mail_handle, (unsigned char*)mail_buff, (unsigned long *)&mail_len);

    pmail_value =(unsigned int *) mail_buff;
    if (NULL != pmail_value)
    {
        printk("mail reture value %x \n",*pmail_value);

    }


    if (NULL != mail_buff)
    {
        kfree(mail_buff);
    }

}
MCA_LOCAL void mca_rsp_isr(void *UserHandle, void *MailHandle, unsigned long MailLen)
{
#if 0
    struct mca_frame frame = {0};
    struct mca_sdata sdata = {0};
    unsigned long frame_size;

    if(mailbox_read_msg_data(MailHandle, (unsigned char*)&frame, &frame_size) != MAILBOX_OK)
        return;

    if(frame.cmd_id != MCA_CMD_RSP)
        return;

    if(mca_read_session(frame.sid, &sdata))
        return;

    if(frame.stype == MCA_SESSION_SYNC)
    {
        // check if session expired.
        if(mca_is_session_locked(frame.sid))
        {
            *sdata.p_rsp = frame.udata;
            mca_unlock_session(frame.sid);
        }
        else
            mca_remove_session(frame.sid);
    }
    else if(frame.stype == MCA_SESSION_ASYN)
    {
        if(sdata.post_cb)
            sdata.post_cb(frame.udata, sdata.private_data);

        mca_remove_session(frame.sid);
    }
#endif
}
/*****************************************************************************
 函 数 名  : hifi_misc_handle_mail
 功能描述  : Hifi MISC 设备双核通信接收中断处理函数
			约定收到HIIF邮箱消息的首4个字节是MSGID
 输入参数  : void *usr_para			: 注册时传递的参数
			 void *mail_handle			: 邮箱数据参数
			 unsigned int mail_len		: 邮箱数据长度
 输出参数  : 无
 返 回 值  : void
 调用函数  :
 被调函数  :

 修改历史	   :
  1.日	  期   : 2012年8月1日
	作	  者   : 夏青 00195127
	修改内容   : 新生成函数

*****************************************************************************/
static void hifi_misc_handle_mail(void *usr_para, void *mail_handle, unsigned int mail_len)
{
	unsigned int ret_mail			= 0;
	struct recv_request *recv = NULL;
	HIFI_CHN_CMD *cmd_para = NULL;

	IN_FUNCTION;

	if (NULL == mail_handle) {
		loge("mail_handle is NULL.\n");
		goto END;
	}

	if (mail_len <= SIZE_CMD_ID) {
		loge("mail_len is less than SIZE_CMD_ID(%d).\n", mail_len);
		goto END;
	}

	recv = (struct recv_request *)kmalloc(sizeof(struct recv_request), GFP_ATOMIC);
	if (NULL == recv)
	{
		loge("recv kmalloc failed.\n");
		goto ERR;
	}
	memset(recv, 0, sizeof(struct recv_request));

	/* 设定SIZE */
	recv->rev_msg.mail_buff_len = mail_len;
	/* 分配总的空间 */
	recv->rev_msg.mail_buff = (unsigned char *)kmalloc(SIZE_LIMIT_PARAM, GFP_ATOMIC);
	if (NULL == recv->rev_msg.mail_buff)
	{
		loge("recv->rev_msg.mail_buff kmalloc failed.\n");
		goto ERR;
	}
	memset(recv->rev_msg.mail_buff, 0, SIZE_LIMIT_PARAM);

	/* 将剩余内容copy透传到buff中 */
#ifdef PLATFORM_HI3XXX
	ret_mail = mailbox_read_msg_data(mail_handle, (char*)(recv->rev_msg.mail_buff), (unsigned int *)(&(recv->rev_msg.mail_buff_len)));
#endif
#ifdef PLATFORM_HI6XXX
	ret_mail = DRV_MAILBOX_READMAILDATA(mail_handle, (char*)recv->rev_msg.mail_buff, (unsigned int *)&recv->rev_msg.mail_buff_len);
#endif
	if ((ret_mail != MAILBOX_OK) || (recv->rev_msg.mail_buff_len <= 0)) {
		loge("Empty point or data length error! ret=0x%x, mail_size: %d.\n", (unsigned int)ret_mail, recv->rev_msg.mail_buff_len);
		goto ERR;
	}

	logd("ret_mail=%d, mail_buff_len=%d, msgID=0x%x.\n", ret_mail, recv->rev_msg.mail_buff_len,
		 *((unsigned int *)(recv->rev_msg.mail_buff + mail_len - SIZE_CMD_ID)));

	if (recv->rev_msg.mail_buff_len > mail_len) {
		loge("ReadMailData mail_size(%d) > mail_len(%d).\n", recv->rev_msg.mail_buff_len, mail_len);
		goto ERR;
	}

	/* 约定,前4个字节是cmd_id */
	cmd_para   = (HIFI_CHN_CMD *)(recv->rev_msg.mail_buff + mail_len - SIZE_CMD_ID);
	/* 赋予不同的接收指针,由接收者释放分配空间 */
	if (HIFI_CHN_SYNC_CMD == cmd_para->cmd_type) {
		if (s_misc_data.sn == cmd_para->sn) {
#ifdef PLATFORM_HI6XXX
			wake_lock_timeout(&s_misc_data.hifi_misc_wakelock, HZ / 2);
#endif
			spin_lock_bh(&s_misc_data.recv_sync_lock);
			list_add_tail(&recv->recv_node, &recv_sync_work_queue_head);
			spin_unlock_bh(&s_misc_data.recv_sync_lock);
			complete(&s_misc_data.completion);
		} else {
			loge("s_misc_data.sn !== cmd_para->sn: %d, %d.\n", s_misc_data.sn, cmd_para->sn);
		}
		goto END;
	} else if ((HIFI_CHN_READNOTICE_CMD == cmd_para->cmd_type) && (ACPU_TO_HIFI_ASYNC_CMD == cmd_para->sn)) {
#ifdef PLATFORM_HI3XXX
		if (HIFI_CHN_READNOTICE_CMD == cmd_para->cmd_type) {
			wake_lock_timeout(&s_misc_data.hifi_misc_wakelock, 5*HZ);
		}
#endif
#ifdef PLATFORM_HI6XXX
		wake_lock_timeout(&s_misc_data.hifi_misc_wakelock, HZ);
#endif
		spin_lock_bh(&s_misc_data.recv_proc_lock);
		list_add_tail(&recv->recv_node, &recv_proc_work_queue_head);
		s_misc_data.wait_flag++;
		spin_unlock_bh(&s_misc_data.recv_proc_lock);
		wake_up(&s_misc_data.proc_waitq);
		goto END;
	} else {
		loge("unknown msg comed from hifi .\n");
	}

ERR:
	if (recv) {
		if (recv->rev_msg.mail_buff) {
			kfree(recv->rev_msg.mail_buff);
		}
		kfree(recv);
	}

END:
	OUT_FUNCTION;
	return;
}