static KAL_INT32 eemcs_ipc_rx_callback(struct sk_buff *skb, KAL_UINT32 private_data) { CCCI_BUFF_T *p_cccih = NULL; KAL_UINT32 node_id; IPC_MSGSVC_TASKMAP_T *id_map; DEBUG_LOG_FUNCTION_ENTRY; if (skb){ p_cccih = (CCCI_BUFF_T *)skb->data; DBGLOG(IPCD,TRA,"%s: CCCI_H(0x%08X, 0x%08X, %02d, 0x%08X)", __FUNCTION__,\ p_cccih->data[0],p_cccih->data[1],p_cccih->channel, p_cccih->reserved); } #ifndef _EEMCS_IPCD_LB_UT_ /* Check IPC task id and extq_id */ if ((id_map=unify_AP_id_2_local_id(p_cccih->reserved))==NULL) { DBGLOG(IPCD,ERR,"Wrong AP Unify id (%#x)@RX.!!! PACKET DROP !!!\n",p_cccih->reserved); dev_kfree_skb(skb); return KAL_SUCCESS ; } node_id = id_map->task_id; #else node_id = 0; #endif if(IPCD_KERNEL == atomic_read(&eemcs_ipc_inst.ipc_node[node_id].dev_state)){ ipc_ilm_t* p_ilm = NULL; skb_pull(skb, sizeof(CCCI_BUFF_T)); p_ilm = (ipc_ilm_t*)(skb->data); p_ilm->dest_mod_id = p_cccih->reserved; p_ilm->local_para_ptr = (local_para_struct *)p_ilm+1; mtk_conn_md_bridge_send_msg((ipc_ilm_t*)(skb->data)); dev_kfree_skb(skb); DBGLOG(IPCD, TRA, "IPC(%d) MT_CONN kernel rx callback", node_id); } else if(IPCD_OPEN == atomic_read(&eemcs_ipc_inst.ipc_node[node_id].dev_state)){ skb_queue_tail(&eemcs_ipc_inst.ipc_node[node_id].rx_skb_list, skb); /* spin_lock_ireqsave inside, refering skbuff.c */ atomic_inc(&eemcs_ipc_inst.ipc_node[node_id].rx_pkt_cnt); /* increase rx_pkt_cnt */ kill_fasync(&eemcs_ipc_inst.ipc_node[node_id].fasync, SIGIO, POLL_IN); wake_up_poll(&eemcs_ipc_inst.ipc_node[node_id].rx_waitq,POLLIN); /* wake up rx_waitq */ }else{ DBGLOG(IPCD,ERR,"PKT DROP while ipc dev(%d) closed", node_id); dev_kfree_skb(skb); eemcs_update_statistics(0, eemcs_ipc_inst.eemcs_port_id, RX, DROP); } DEBUG_LOG_FUNCTION_LEAVE; return KAL_SUCCESS ; }
UINT32 wmt_idc_msg_to_lte_handing_for_test(UINT8 *p_buf, UINT32 len) { UINT32 readlen = len; local_para_struct *p_lps = NULL; UINT8 *p_data = NULL; UINT8 opcode = 0; UINT16 msg_len = 0; UINT32 handle_len = 0; MTK_WCN_BOOL unknow_msgid = MTK_WCN_BOOL_FALSE; osal_memcpy(&gWmtIdcInfo.buffer[0], p_buf, len); if (readlen > 0) { WMT_DBG_FUNC("read data len from fw(%d)\n", readlen); p_data = &gWmtIdcInfo.buffer[0]; while (handle_len < readlen) { p_data += 2; /*omit direction & opcode 2 bytes */ osal_memcpy(&msg_len, p_data, 2); msg_len -= 1; /*flag byte */ WMT_DBG_FUNC("current raw data len(%d) from connsys firmware\n", msg_len); p_data += 2; /*length: 2 bytes */ /*how to handle flag(msg type) need to Scott comment */ /************************************************/ if (*p_data == WMT_IDC_RX_OPCODE_DEBUG_MONITOR) /*do not need transfer to LTE */ { p_data += 1; /*flag : 1 byte */ /*need to handle these debug message */ wmt_idc_dump_debug_msg("WIFI DEBUG MONITOR", p_data, msg_len); } else /*need to transfer to LTE */ { p_lps = (local_para_struct *) osal_malloc(osal_sizeof(local_para_struct) + osal_sizeof(UINT8) * msg_len); if (NULL == p_lps) { WMT_ERR_FUNC("allocate local_para_struct memory fail\n"); return -1; } p_lps->msg_len = msg_len + osal_sizeof(local_para_struct); opcode = *p_data; WMT_DBG_FUNC("current opcode(%d) to LTE\n", opcode); p_data += 1; /*flag : 1 byte */ osal_memcpy(p_lps->data, p_data, msg_len); gWmtIdcInfo.iit.local_para_ptr = p_lps; switch (opcode) { case WMT_IDC_RX_OPCODE_BTWF_DEF_PARA: gWmtIdcInfo.iit.msg_id = IPC_MSG_ID_EL1_WIFIBT_OPER_DEFAULT_PARAM_IND; break; case WMT_IDC_RX_OPCODE_BTWF_CHAN_RAN: gWmtIdcInfo.iit.msg_id = IPC_MSG_ID_EL1_WIFIBT_OPER_FREQ_IND; break; /* case WMT_IDC_RX_OPCODE_TDM_REQ: */ /* gWmtIdcInfo.iit.msg_id = IPC_MSG_ID_EL1_WIFIBT_OPER_FREQ_IND; */ /* break; */ default: unknow_msgid = MTK_WCN_BOOL_TRUE; WMT_ERR_FUNC("unknow opcode(%d) from connsys firmware\n", opcode); break; } if (MTK_WCN_BOOL_FALSE == unknow_msgid) { /*handling flag value in wmt cmd */ mtk_conn_md_bridge_send_msg(&gWmtIdcInfo.iit); } osal_free(p_lps); } p_data += msg_len; /*point to next package header */ handle_len += (msg_len + 5); } } else { WMT_ERR_FUNC("there is no coex data in stp buffer\n"); } osal_memset(&gWmtIdcInfo.buffer[0], 0, LTE_IDC_BUFFER_MAX_SIZE); return handle_len; }
INT32 wmt_idc_msg_to_lte_handing(VOID) { UINT32 readlen = 0; local_para_struct *p_lps = NULL; UINT8 *p_data = NULL; UINT8 opcode = 0; UINT16 msg_len = 0; UINT32 handle_len = 0; #if CFG_WMT_LTE_ENABLE_MSGID_MAPPING MTK_WCN_BOOL unknow_msgid = MTK_WCN_BOOL_FALSE; #endif readlen = mtk_wcn_stp_receive_data(&gWmtIdcInfo.buffer[0], LTE_IDC_BUFFER_MAX_SIZE, COEX_TASK_INDX); if (readlen == 0) { osal_sleep_ms(5); readlen = mtk_wcn_stp_receive_data(&gWmtIdcInfo.buffer[0], LTE_IDC_BUFFER_MAX_SIZE, COEX_TASK_INDX); } if (readlen > 0) { WMT_DBG_FUNC("read data len from fw(%d)\n", readlen); wmt_idc_dump_debug_msg("WMT->LTE from STP buffer", &gWmtIdcInfo.buffer[0], readlen); p_data = &gWmtIdcInfo.buffer[0]; while (handle_len < readlen) { p_data += 2; /*omit direction & opcode 2 bytes */ osal_memcpy(&msg_len, p_data, 2); msg_len -= 1; /*flag byte */ WMT_DBG_FUNC("current raw data len(%d) from connsys firmware\n", msg_len); p_data += 2; /*length: 2 bytes */ /*how to handle flag(msg type) need to Scott comment */ /************************************************/ if (*p_data == WMT_IDC_RX_OPCODE_DEBUG_MONITOR) /*do not need transfer to LTE */ { p_data += 1; /*flag : 1 byte */ /*need to handle these debug message */ wmt_idc_dump_debug_msg("WIFI DEBUG MONITOR", p_data, msg_len); } else /*need to transfer to LTE */ { p_lps = (local_para_struct *) osal_malloc(osal_sizeof(local_para_struct) + osal_sizeof(UINT8) * msg_len); if (NULL == p_lps) { WMT_ERR_FUNC("allocate local_para_struct memory fail\n"); return -1; } p_lps->msg_len = msg_len + osal_sizeof(local_para_struct); opcode = *p_data; WMT_DBG_FUNC("current opcode(%d) to LTE\n", opcode); p_data += 1; /*flag : 1 byte */ osal_memcpy(p_lps->data, p_data, msg_len); gWmtIdcInfo.iit.local_para_ptr = p_lps; #if CFG_WMT_LTE_ENABLE_MSGID_MAPPING switch (opcode) { case WMT_IDC_RX_OPCODE_BTWF_DEF_PARA: gWmtIdcInfo.iit.msg_id = IPC_MSG_ID_EL1_WIFIBT_OPER_DEFAULT_PARAM_IND; break; case WMT_IDC_RX_OPCODE_BTWF_CHAN_RAN: gWmtIdcInfo.iit.msg_id = IPC_MSG_ID_EL1_WIFIBT_OPER_FREQ_IND; break; case WMT_IDC_RX_OPCODE_LTE_FREQ_IDX_TABLE: gWmtIdcInfo.iit.msg_id = IPC_MSG_ID_EL1_WIFIBT_FREQ_IDX_TABLE_IND; break; case WMT_IDC_RX_OPCODE_BTWF_PROFILE_IND: gWmtIdcInfo.iit.msg_id = IPC_MSG_ID_EL1_WIFIBT_PROFILE_IND; break; case WMT_IDC_RX_OPCODE_UART_PIN_SEL: gWmtIdcInfo.iit.msg_id = IPC_MSG_ID_EL1_PIN_TYPE_IND; break; /* case WMT_IDC_RX_OPCODE_TDM_REQ: */ /* gWmtIdcInfo.iit.msg_id = IPC_MSG_ID_EL1_WIFIBT_OPER_FREQ_IND; */ /* break; */ default: unknow_msgid = MTK_WCN_BOOL_TRUE; WMT_ERR_FUNC("unknow opcode(%d) from connsys firmware\n", opcode); break; } if (MTK_WCN_BOOL_FALSE == unknow_msgid) { /*handling flag value in wmt cmd */ mtk_conn_md_bridge_send_msg(&gWmtIdcInfo.iit); } #else if (opcode >= LTE_MSG_ID_OFFSET) { gWmtIdcInfo.iit.msg_id = opcode + IPC_EL1_MSG_ID_BEGIN - LTE_MSG_ID_OFFSET + 1; /*handling flag value in wmt cmd */ mtk_conn_md_bridge_send_msg(&gWmtIdcInfo.iit); WMT_INFO_FUNC("CONN->LTE: (0x%x->0x%x)\n", opcode, gWmtIdcInfo.iit.msg_id); } else { WMT_ERR_FUNC("opcode(%d)from connsys fw is out of range,drop it!\n", opcode); } #endif osal_free(p_lps); } p_data += msg_len; /*point to next package header */ handle_len += (msg_len + 5); } } else { WMT_ERR_FUNC("there is no coex data in stp buffer\n"); } osal_memset(&gWmtIdcInfo.buffer[0], 0, LTE_IDC_BUFFER_MAX_SIZE); return 0; }
int conn_md_test(void) { #define PACKAGE_SIZE 100 ipc_ilm_t ilm; local_para_struct *p_buf_str; int i =0; int msg_len = 0; p_buf_str = kmalloc (sizeof (local_para_struct) + PACKAGE_SIZE, GFP_ATOMIC); if (NULL == p_buf_str) { CONN_MD_ERR_FUNC("kmalloc for local para ptr structure failed.\n"); return -1; } p_buf_str->msg_len = PACKAGE_SIZE; for (i = 0; i < PACKAGE_SIZE; i++) p_buf_str->data[i] = i; ilm.local_para_ptr = p_buf_str; g_ops.rx_cb = conn_md_test_rx_cb; mtk_conn_md_bridge_reg (0x800001, &g_ops); mtk_conn_md_bridge_reg (0x800005, &g_ops); mtk_conn_md_bridge_reg (0x800009, &g_ops); ilm.dest_mod_id = 0x800005; ilm.src_mod_id = 0x800001; ilm.msg_id = 0; mtk_conn_md_bridge_send_msg (&ilm); ilm.dest_mod_id = 0x800005; ilm.src_mod_id = 0x800009; ilm.msg_id++; msg_len += 10; msg_len = msg_len >= PACKAGE_SIZE ? PACKAGE_SIZE : msg_len; ilm.local_para_ptr->msg_len = msg_len; mtk_conn_md_bridge_send_msg (&ilm); ilm.dest_mod_id = 0x800001; ilm.src_mod_id = 0x800009; ilm.msg_id++; msg_len += 10; msg_len = msg_len >= PACKAGE_SIZE ? PACKAGE_SIZE : msg_len; ilm.local_para_ptr->msg_len = msg_len; mtk_conn_md_bridge_send_msg (&ilm); ilm.dest_mod_id = 0x80000a; ilm.src_mod_id = 0x800009; ilm.msg_id++; msg_len += 10; msg_len = msg_len >= PACKAGE_SIZE ? PACKAGE_SIZE : msg_len; ilm.local_para_ptr->msg_len = msg_len; mtk_conn_md_bridge_send_msg (&ilm); ilm.dest_mod_id = 0x800009; ilm.src_mod_id = 0x80000a; ilm.msg_id++; msg_len += 10; msg_len = msg_len >= PACKAGE_SIZE ? PACKAGE_SIZE : msg_len; ilm.local_para_ptr->msg_len = msg_len; mtk_conn_md_bridge_send_msg (&ilm); ilm.dest_mod_id = 0x800005; ilm.src_mod_id = 0x800001; ilm.msg_id++; msg_len += 10; msg_len = msg_len >= PACKAGE_SIZE ? PACKAGE_SIZE : msg_len; ilm.local_para_ptr->msg_len = msg_len; mtk_conn_md_bridge_send_msg (&ilm); ilm.dest_mod_id = 0x800001; ilm.src_mod_id = 0x800005; ilm.msg_id++; msg_len += 10; msg_len = msg_len >= PACKAGE_SIZE ? PACKAGE_SIZE : msg_len; ilm.local_para_ptr->msg_len = msg_len; mtk_conn_md_bridge_send_msg (&ilm); ilm.dest_mod_id = 0x800001; ilm.src_mod_id = 0x80000a; ilm.msg_id++; msg_len += 10; msg_len = msg_len >= PACKAGE_SIZE ? PACKAGE_SIZE : msg_len; ilm.local_para_ptr->msg_len = msg_len; mtk_conn_md_bridge_send_msg (&ilm); kfree(p_buf_str); p_buf_str = NULL; conn_md_dmp_msg_queued(0, 0x80000a); mtk_conn_md_bridge_unreg(0x800001); conn_md_dmp_msg_queued(0, 0); conn_md_dmp_msg_active(0, 0); mtk_conn_md_bridge_unreg(0x800009); mtk_conn_md_bridge_unreg(0x80000a); conn_md_dmp_msg_queued(0, 0); conn_md_dmp_msg_active(0, 0); conn_md_dmp_msg_logged(0x800009, 0x800001); conn_md_dmp_msg_logged(0x800009, 0); conn_md_dmp_msg_logged(0, 0); conn_md_dmp_msg_logged(0x80000a, 0); return 0; }
static KAL_INT32 eemcs_ipc_rx_callback(struct sk_buff *skb, KAL_UINT32 private_data) { CCCI_BUFF_T *p_cccih = NULL; KAL_UINT32 node_id; IPC_MSGSVC_TASKMAP_T *id_map; unsigned int i = 0; char * addr; DEBUG_LOG_FUNCTION_ENTRY; if (skb){ p_cccih = (CCCI_BUFF_T *)skb->data; DBGLOG(IPCD,DBG,"[RX]CCCI_H(0x%08X, 0x%08X, %02d, 0x%08X)", \ p_cccih->data[0],p_cccih->data[1],p_cccih->channel, p_cccih->reserved); } #ifndef _EEMCS_IPCD_LB_UT_ /* Check IPC task id and extq_id */ if ((id_map=unify_AP_id_2_local_id(p_cccih->reserved))==NULL) { DBGLOG(IPCD,ERR,"Wrong AP Unify id (%#x)@RX.!!! PACKET DROP !!!\n",p_cccih->reserved); dev_kfree_skb(skb); return KAL_SUCCESS ; } node_id = id_map->task_id; #else node_id = 0; #endif if(IPCD_KERNEL == atomic_read(&eemcs_ipc_inst.ipc_node[node_id].dev_state)){ ipc_ilm_t* p_ilm = NULL; skb_pull(skb, sizeof(CCCI_BUFF_T)); p_ilm = (ipc_ilm_t*)(skb->data); p_ilm->dest_mod_id = p_cccih->reserved; p_ilm->local_para_ptr = (local_para_struct *)(p_ilm+1); if (p_ilm->local_para_ptr != NULL) { DBGLOG(IPCD, INF, "[RX][KERN]src=%d dest=0x%x sap=0x%x msg=0x%x local_ptr=%p msg_len=%d", \ p_ilm->src_mod_id, p_ilm->dest_mod_id, p_ilm->sap_id, p_ilm->msg_id,\ p_ilm->local_para_ptr, p_ilm->local_para_ptr->msg_len); for (i=0; i<32; i++) { addr = (char *)p_ilm; DBGLOG(IPCD, DBG, "%p=%x", (addr+i), *(addr+i)); } } #ifdef ENABLE_CONN_COEX_MSG mtk_conn_md_bridge_send_msg((ipc_ilm_t*)(skb->data)); #endif dev_kfree_skb(skb); } else if(IPCD_OPEN == atomic_read(&eemcs_ipc_inst.ipc_node[node_id].dev_state)){ skb_queue_tail(&eemcs_ipc_inst.ipc_node[node_id].rx_skb_list, skb); /* spin_lock_ireqsave inside, refering skbuff.c */ atomic_inc(&eemcs_ipc_inst.ipc_node[node_id].rx_pkt_cnt); /* increase rx_pkt_cnt */ kill_fasync(&eemcs_ipc_inst.ipc_node[node_id].fasync, SIGIO, POLL_IN); wake_up_poll(&eemcs_ipc_inst.ipc_node[node_id].rx_waitq,POLLIN); /* wake up rx_waitq */ }else{ DBGLOG(IPCD, ERR, "PKT DROP while ipc dev(%d) closed", node_id); dev_kfree_skb(skb); eemcs_update_statistics(0, eemcs_ipc_inst.eemcs_port_id, RX, DROP); } DEBUG_LOG_FUNCTION_LEAVE; return KAL_SUCCESS ; }