1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
|
#include "wmt_lib.h"
#include "wmt_idc.h"
#if CFG_WMT_LTE_COEX_HANDLING
MTK_WCN_WMT_IDC_INFO gWmtIdcInfo;
static INT32 wmt_idc_msg_from_lte_handing(ipc_ilm_t *ilm);
INT32 wmt_idc_init(VOID)
{
INT32 iRet;
osal_memset(&gWmtIdcInfo, 0, osal_sizeof(gWmtIdcInfo));
gWmtIdcInfo.iit.src_mod_id = AP_MOD_WMT;
gWmtIdcInfo.iit.dest_mod_id = MD_MOD_EL1;
gWmtIdcInfo.iit.sap_id = 0;
gWmtIdcInfo.ops.rx_cb = wmt_idc_msg_from_lte_handing;
iRet = mtk_conn_md_bridge_reg(gWmtIdcInfo.iit.src_mod_id, &gWmtIdcInfo.ops);
if (iRet) {
WMT_ERR_FUNC("mtk_conn_md_bridge_reg fail(%d)\n", iRet);
return -1;
}
/* mtk_wcn_stp_flush_rx_queue(COEX_TASK_INDX); */
return 0;
}
INT32 wmt_idc_deinit(VOID)
{
INT32 iRet;
iRet = mtk_conn_md_bridge_unreg(gWmtIdcInfo.iit.src_mod_id);
if (iRet)
WMT_ERR_FUNC("mtk_conn_md_bridge_unreg fail(%d)\n", iRet);
osal_memset(&gWmtIdcInfo, 0, osal_sizeof(gWmtIdcInfo));
return 0;
}
INT32 wmt_idc_msg_from_lte_handing(ipc_ilm_t *ilm)
{
MTK_WCN_BOOL bRet;
if (NULL == ilm) {
WMT_ERR_FUNC("NULL pointer\n");
return -1;
}
if (mtk_wcn_stp_is_ready()) {
bRet = wmt_lib_handle_idc_msg(ilm);
if (MTK_WCN_BOOL_FALSE == bRet) {
WMT_ERR_FUNC("wmt handing idc msg fail\n");
return -2;
}
wmt_lib_notify_stp_sleep();
} else {
WMT_INFO_FUNC("Received LTE msg,but STP is not ready,drop it!\n");
}
return 0;
}
VOID wmt_idc_dump_debug_msg(PUINT8 str, PUINT8 p_buf, UINT32 buf_len)
{
UINT32 idx = 0;
WMT_DBG_FUNC("%s:, length:%d\n", str, buf_len);
WMT_DBG_FUNC("ASCII output:\n");
for (idx = 0; idx < buf_len;) {
WMT_DBG_FUNC("%c", p_buf[idx]);
idx++;
if (0 == idx % 16)
WMT_DBG_FUNC("\n");
}
WMT_DBG_FUNC("HEX output:\n");
for (idx = 0; idx < buf_len;) {
WMT_DBG_FUNC("%02x ", p_buf[idx]);
idx++;
if (0 == idx % 16)
WMT_DBG_FUNC("\n");
}
}
INT32 wmt_idc_msg_to_lte_handing(VOID)
{
UINT32 readlen = 0;
local_para_struct *p_lps = NULL;
PUINT8 p_data = NULL;
UINT8 opcode = 0;
UINT16 msg_len = 0;
UINT32 handle_len = 0;
#if CFG_WMT_LTE_ENABLE_MSGID_MAPPING
MTK_WCN_BOOL unknown_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:
unknown_msgid = MTK_WCN_BOOL_TRUE;
WMT_ERR_FUNC("unknown opcode(%d) from connsys firmware\n",
opcode);
break;
}
if (MTK_WCN_BOOL_FALSE == unknown_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_DBG_FUNC("wmt_idc_msg_to_lte: 0x%x !\n", 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;
}
UINT32 wmt_idc_msg_to_lte_handing_for_test(PUINT8 p_buf, UINT32 len)
{
UINT32 readlen = len;
local_para_struct *p_lps = NULL;
PUINT8 p_data = NULL;
UINT8 opcode = 0;
UINT16 msg_len = 0;
UINT32 handle_len = 0;
MTK_WCN_BOOL unknown_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_INFO_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:
unknown_msgid = MTK_WCN_BOOL_TRUE;
WMT_ERR_FUNC("unknown opcode(%d) from connsys firmware\n",
opcode);
break;
}
if (MTK_WCN_BOOL_FALSE == unknown_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;
}
#endif
|