blob: 477185b38f505e694fa299c68be69fe47031d647 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Katya Nigama6fbf662015-03-17 18:35:47 +05302 * Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
Kiet Lam842dad02014-02-18 18:44:02 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
Leo Chang416afe02013-07-01 13:58:13 -070020 */
Kiet Lam842dad02014-02-18 18:44:02 -080021
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
Jeff Johnson295189b2012-06-20 16:38:30 -070028/**=========================================================================
29
30 @file wlan_qct_dxe.c
31
32 @brief
33
34 This file contains the external API exposed by the wlan data transfer abstraction layer module.
Jeff Johnson295189b2012-06-20 16:38:30 -070035========================================================================*/
36
37/*===========================================================================
38
39 EDIT HISTORY FOR FILE
40
41
42 This section contains comments describing changes made to the module.
43 Notice that changes are listed in reverse chronological order.
44
45
46 $Header:$ $DateTime: $ $Author: $
47
48
49when who what, where, why
50-------- --- ----------------------------------------------------------
5108/03/10 schang Created module.
52
53===========================================================================*/
54
55/*===========================================================================
56
57 INCLUDE FILES FOR MODULE
58
59===========================================================================*/
60
61/*----------------------------------------------------------------------------
62 * Include Files
63 * -------------------------------------------------------------------------*/
64#include "wlan_qct_dxe.h"
65#include "wlan_qct_dxe_i.h"
66#include "wlan_qct_pal_device.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070067
68/*----------------------------------------------------------------------------
69 * Local Definitions
70 * -------------------------------------------------------------------------*/
71//#define WLANDXE_DEBUG_CH_INFO_DUMP
72
73/* Temporary configuration defines
74 * Have to find out permanent solution */
75#define T_WLANDXE_MAX_DESCRIPTOR_COUNT 40
76#define T_WLANDXE_MAX_FRAME_SIZE 2000
77#define T_WLANDXE_TX_INT_ENABLE_FCOUNT 1
78#define T_WLANDXE_MEMDUMP_BYTE_PER_LINE 16
79#define T_WLANDXE_MAX_RX_PACKET_WAIT 6000
Mihir Shetefdc9f532014-01-09 15:03:02 +053080#define T_WLANDXE_SSR_TIMEOUT 5000
Leo Chang5edb2d32013-04-03 13:32:58 -070081#define T_WLANDXE_PERIODIC_HEALTH_M_TIME 2500
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -070082#define T_WLANDXE_MAX_HW_ACCESS_WAIT 2000
Jeff Johnsone7245742012-09-05 17:12:55 -070083#define WLANDXE_MAX_REAPED_RX_FRAMES 512
Jeff Johnson295189b2012-06-20 16:38:30 -070084
Leo Chang094ece82013-04-23 17:57:41 -070085#define WLANPAL_RX_INTERRUPT_PRO_MASK 0x20
86#define WLANDXE_RX_INTERRUPT_PRO_UNMASK 0x5F
Leo Chang00708f62013-12-03 20:21:51 -080087
88/* 1msec busy wait in case CSR is not valid */
89#define WLANDXE_CSR_NEXT_READ_WAIT 1000
90/* CSR max retry count */
91#define WLANDXE_CSR_MAX_READ_COUNT 30
92
93
Jeff Johnson295189b2012-06-20 16:38:30 -070094/* This is temporary fot the compile
95 * WDI will release official version
96 * This must be removed */
97#define WDI_GET_PAL_CTX() NULL
98
Madan Mohan Koyyalamudidfd6aa82012-10-18 20:18:43 -070099
Jeff Johnson295189b2012-06-20 16:38:30 -0700100/*-------------------------------------------------------------------------
101 * Local Varables
102 *-------------------------------------------------------------------------*/
103/* This is temp, someone have to allocate for me, and must be part of global context */
Madan Mohan Koyyalamudidfd6aa82012-10-18 20:18:43 -0700104static WLANDXE_CtrlBlkType *tempDxeCtrlBlk;
Jeff Johnson295189b2012-06-20 16:38:30 -0700105static char *channelType[WDTS_CHANNEL_MAX] =
106 {
107 "TX_LOW_PRI",
108 "TX_HIGH_PRI",
109 "RX_LOW_PRI",
Jeff Johnson295189b2012-06-20 16:38:30 -0700110 "RX_HIGH_PRI",
Mihir Shetebe94ebb2015-05-26 12:07:14 +0530111 "RX_LOGS",
Mihir Shetee6618162015-03-16 14:48:42 +0530112 "RX_FW_LOGS",
Jeff Johnson295189b2012-06-20 16:38:30 -0700113 };
Jeff Johnsone7245742012-09-05 17:12:55 -0700114static wpt_packet *rx_reaped_buf[WLANDXE_MAX_REAPED_RX_FRAMES];
Jeff Johnson295189b2012-06-20 16:38:30 -0700115
116/*-------------------------------------------------------------------------
117 * External Function Proto Type
118 *-------------------------------------------------------------------------*/
119
120/*-------------------------------------------------------------------------
121 * Local Function Proto Type
122 *-------------------------------------------------------------------------*/
123static wpt_status dxeRXFrameSingleBufferAlloc
124(
125 WLANDXE_CtrlBlkType *dxeCtxt,
126 WLANDXE_ChannelCBType *channelEntry,
127 WLANDXE_DescCtrlBlkType *currentCtrlBlock
128);
129
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700130static wpt_status dxeNotifySmsm
131(
132 wpt_boolean kickDxe,
133 wpt_boolean ringEmpty
134);
135
Mihir Shetefdc9f532014-01-09 15:03:02 +0530136static void dxeStartSSRTimer
137(
138 WLANDXE_CtrlBlkType *dxeCtxt
139);
140
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530141static wpt_status dxeTXCleanup
142(
143 WLANDXE_CtrlBlkType *hostCtxt
144);
145
Jeff Johnson295189b2012-06-20 16:38:30 -0700146/*-------------------------------------------------------------------------
147 * Local Function
148 *-------------------------------------------------------------------------*/
Jeff Johnson295189b2012-06-20 16:38:30 -0700149/*==========================================================================
150 @ Function Name
151 dxeChannelMonitor
152
153 @ Description
154
155 @ Parameters
156 WLANDXE_ChannelCBType *channelEntry
157 Channel specific control block
158
159 @ Return
160 wpt_status
161
162===========================================================================*/
163static wpt_status dxeChannelMonitor
164(
165 char *monitorDescription,
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530166 WLANDXE_ChannelCBType *channelEntry,
167 wpt_log_data_stall_channel_type *channelLog
Jeff Johnson295189b2012-06-20 16:38:30 -0700168)
169{
170 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
171
Jeff Johnsone7245742012-09-05 17:12:55 -0700172 if((NULL == monitorDescription) || (NULL == channelEntry))
173 {
174 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
175 "INVALID Input ARG");
176 return eWLAN_PAL_STATUS_E_INVAL;
177 }
178
Mihir Shetee6618162015-03-16 14:48:42 +0530179 if(channelEntry->channelType >= WDTS_CHANNEL_MAX)
Jeff Johnsone7245742012-09-05 17:12:55 -0700180 {
181 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
182 "INVALID Channel type");
183 return eWLAN_PAL_STATUS_E_INVAL;
184 }
185
Leo Chang345ef992013-07-12 10:17:29 -0700186 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
187 "%11s : HCBO %d, HCBDP 0x%x, HCBDC 0x%x,",
188 channelType[channelEntry->channelType],
189 channelEntry->headCtrlBlk->ctrlBlkOrder,
190 channelEntry->headCtrlBlk->linkedDescPhyAddr,
191 channelEntry->headCtrlBlk->linkedDesc->descCtrl.ctrl);
192 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
193 "%11s : TCBO %d, TCBDP 0x%x, TCBDC 0x%x",
194 channelType[channelEntry->channelType],
195 channelEntry->tailCtrlBlk->ctrlBlkOrder,
196 channelEntry->tailCtrlBlk->linkedDescPhyAddr,
197 channelEntry->tailCtrlBlk->linkedDesc->descCtrl.ctrl);
198 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
199 "%11s : FDC %d, RDC %d, TFC %d",
200 channelType[channelEntry->channelType],
201 channelEntry->numFreeDesc,
202 channelEntry->numRsvdDesc,
203 channelEntry->numTotalFrame);
Jeff Johnson295189b2012-06-20 16:38:30 -0700204
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700205 if(channelLog)
206 {
207 channelLog->numDesc = channelEntry->numDesc;
208 channelLog->numFreeDesc = channelEntry->numFreeDesc;
209 channelLog->numRsvdDesc = channelEntry->numRsvdDesc;
210 channelLog->headDescOrder = channelEntry->headCtrlBlk->ctrlBlkOrder;
211 channelLog->tailDescOrder = channelEntry->tailCtrlBlk->ctrlBlkOrder;
212 }
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530213
Jeff Johnson295189b2012-06-20 16:38:30 -0700214 return status;
215}
216
Jeff Johnsone7245742012-09-05 17:12:55 -0700217#ifdef WLANDXE_DEBUG_MEMORY_DUMP
Jeff Johnson295189b2012-06-20 16:38:30 -0700218/*==========================================================================
219 @ Function Name
220 dxeMemoryDump
221
222 @ Description
223
224 @ Parameters
225 WLANDXE_ChannelCBType *channelEntry
226 Channel specific control block
227
228 @ Return
229 wpt_status
230
231===========================================================================*/
232static wpt_status dxeMemoryDump
233(
234 wpt_uint8 *dumpPointer,
235 wpt_uint32 dumpSize,
236 char *dumpTarget
237)
238{
239 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
240 wpt_uint32 numBytes = 0;
241 wpt_uint32 idx;
242
Jeff Johnsone7245742012-09-05 17:12:55 -0700243 if((NULL == dumpPointer) ||
244 (NULL == dumpTarget))
245 {
246 return status;
247 }
248
Jeff Johnson295189b2012-06-20 16:38:30 -0700249 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
250 "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
251 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
252 "%s Location 0x%x, Size %d", dumpTarget, dumpPointer, dumpSize);
253
254 numBytes = dumpSize % T_WLANDXE_MEMDUMP_BYTE_PER_LINE;
255 for(idx = 0; idx < dumpSize; idx++)
256 {
257 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
258 "0x%2x ", dumpPointer[idx]);
259 if(0 == ((idx + 1) % T_WLANDXE_MEMDUMP_BYTE_PER_LINE))
260 {
261 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, "\n");
262 }
263 }
264 if(0 != numBytes)
265 {
266 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, "\n");
267 }
268 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
269 "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
270
271 return status;
272}
Jeff Johnsone7245742012-09-05 17:12:55 -0700273#endif /* WLANDXE_DEBUG_MEMORY_DUMP */
Jeff Johnson295189b2012-06-20 16:38:30 -0700274
275/*==========================================================================
276 @ Function Name
277 dxeDescriptorDump
278
279 @ Description
280
281 @ Parameters
282 WLANDXE_ChannelCBType *channelEntry
283 Channel specific control block
284
285 @ Return
286 wpt_status
287
288===========================================================================*/
289wpt_status dxeDescriptorDump
290(
291 WLANDXE_ChannelCBType *channelEntry,
292 WLANDXE_DescType *targetDesc,
293 wpt_uint32 fragmentOrder
294)
295{
296 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
297
298
Jeff Johnsone7245742012-09-05 17:12:55 -0700299 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnson295189b2012-06-20 16:38:30 -0700300 "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
Jeff Johnsone7245742012-09-05 17:12:55 -0700301 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700302 "Descriptor Dump for channel %s, %d / %d fragment",
Jeff Johnson295189b2012-06-20 16:38:30 -0700303 channelType[channelEntry->channelType],
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700304 fragmentOrder + 1,
305 channelEntry->numFragmentCurrentChain);
Jeff Johnson295189b2012-06-20 16:38:30 -0700306
Jeff Johnsone7245742012-09-05 17:12:55 -0700307 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnson295189b2012-06-20 16:38:30 -0700308 "CTRL WORD 0x%x, TransferSize %d",
309 WLANDXE_U32_SWAP_ENDIAN(targetDesc->descCtrl.ctrl),
310 WLANDXE_U32_SWAP_ENDIAN(targetDesc->xfrSize));
Jeff Johnsone7245742012-09-05 17:12:55 -0700311 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnson295189b2012-06-20 16:38:30 -0700312 "SRC ADD 0x%x, DST ADD 0x%x, NEXT DESC 0x%x",
313 WLANDXE_U32_SWAP_ENDIAN(targetDesc->dxedesc.dxe_short_desc.srcMemAddrL),
314 WLANDXE_U32_SWAP_ENDIAN(targetDesc->dxedesc.dxe_short_desc.dstMemAddrL),
315 WLANDXE_U32_SWAP_ENDIAN(targetDesc->dxedesc.dxe_short_desc.phyNextL));
Jeff Johnsone7245742012-09-05 17:12:55 -0700316 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnson295189b2012-06-20 16:38:30 -0700317 "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
318
319 return status;
320}
321
322/*==========================================================================
323 @ Function Name
324 dxeChannelRegisterDump
325
326 @ Description
327
328 @ Parameters
329 WLANDXE_ChannelCBType *channelEntry
330 Channel specific control block
331
332 @ Return
333 wpt_status
334
335===========================================================================*/
336wpt_status dxeChannelRegisterDump
337(
338 WLANDXE_ChannelCBType *channelEntry,
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530339 char *dumpTarget,
340 wpt_log_data_stall_channel_type *channelLog
Jeff Johnson295189b2012-06-20 16:38:30 -0700341)
342{
Leo Chang345ef992013-07-12 10:17:29 -0700343 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
344 wpt_uint32 chStatusReg, chControlReg, chDescReg, chLDescReg;
345
346 /* Whatever RIVA power condition try to wakeup RIVA through SMSM
347 * This will not simply wakeup RIVA
348 * Just incase TX not wanted stuck, Trigger TX again */
349 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
350 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
351 wpalSleep(10);
Jeff Johnson295189b2012-06-20 16:38:30 -0700352
Mihir Shetee6618162015-03-16 14:48:42 +0530353 if(channelEntry->channelType >= WDTS_CHANNEL_MAX)
Tushnim Bhattacharyya5dd94562013-03-20 20:15:03 -0700354 {
355 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
356 "INVALID Channel type");
357 return eWLAN_PAL_STATUS_E_INVAL;
358 }
359
Leo Chang345ef992013-07-12 10:17:29 -0700360 wpalReadRegister(channelEntry->channelRegister.chDXEDesclRegAddr, &chDescReg);
361 wpalReadRegister(channelEntry->channelRegister.chDXELstDesclRegAddr, &chLDescReg);
362 wpalReadRegister(channelEntry->channelRegister.chDXECtrlRegAddr, &chControlReg);
363 wpalReadRegister(channelEntry->channelRegister.chDXEStatusRegAddr, &chStatusReg);
Jeff Johnson295189b2012-06-20 16:38:30 -0700364
Leo Chang345ef992013-07-12 10:17:29 -0700365 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
366 "%11s : CCR 0x%x, CSR 0x%x, CDR 0x%x, CLDR 0x%x",
367 channelType[channelEntry->channelType],
368 chControlReg, chStatusReg, chDescReg, chLDescReg);
Jeff Johnson295189b2012-06-20 16:38:30 -0700369
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700370 if(channelLog)
371 {
372 channelLog->ctrlRegVal = chControlReg;
373 channelLog->statRegVal = chStatusReg;
374 }
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700375
Jeff Johnson295189b2012-06-20 16:38:30 -0700376 return status;
377}
Jeff Johnsone7245742012-09-05 17:12:55 -0700378
379/*==========================================================================
380 @ Function Name
381 dxeChannelAllDescDump
382
383 @ Description
384 Dump all DXE descriptors within assigned channe;
385
386 @ Parameters
387 WLANDXE_ChannelCBType *channelEntry
388
389 @ Return
390 NONE
391
392===========================================================================*/
393void dxeChannelAllDescDump
394(
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700395 WLANDXE_ChannelCBType *channelEntry,
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530396 WDTS_ChannelType channel,
397 wpt_log_data_stall_channel_type *channelLog
Jeff Johnsone7245742012-09-05 17:12:55 -0700398)
399{
400 wpt_uint32 channelLoop;
401 WLANDXE_DescCtrlBlkType *targetCtrlBlk;
Madan Mohan Koyyalamudi94d4c192012-09-24 14:06:14 -0700402 wpt_uint32 previousCtrlValue = 0;
Leo Chang345ef992013-07-12 10:17:29 -0700403 wpt_uint32 previousCtrlValid = 0;
404 wpt_uint32 currentCtrlValid = 0;
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700405 wpt_uint32 valDescCount = 0;
406 wpt_uint32 invalDescCount = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -0700407
408 targetCtrlBlk = channelEntry->headCtrlBlk;
409
410 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Leo Chang345ef992013-07-12 10:17:29 -0700411 "%11s : %d descriptor chains, head desc ctrl 0x%x",
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700412 channelType[channelEntry->channelType],
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -0700413 channelEntry->numDesc,
414 targetCtrlBlk->linkedDesc->descCtrl.ctrl);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700415 previousCtrlValue = targetCtrlBlk->linkedDesc->descCtrl.ctrl;
416
417 if((WDTS_CHANNEL_RX_LOW_PRI == channel) ||
Mihir Shetee6618162015-03-16 14:48:42 +0530418 (WDTS_CHANNEL_RX_HIGH_PRI == channel)||
419 (WDTS_CHANNEL_RX_LOG == channel))
Jeff Johnsone7245742012-09-05 17:12:55 -0700420 {
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700421 for(channelLoop = 0; channelLoop < channelEntry->numDesc; channelLoop++)
Madan Mohan Koyyalamudi94d4c192012-09-24 14:06:14 -0700422 {
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700423 if(previousCtrlValue != targetCtrlBlk->linkedDesc->descCtrl.ctrl)
424 {
425 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
426 "%5d : 0x%x", targetCtrlBlk->ctrlBlkOrder,
427 targetCtrlBlk->linkedDesc->descCtrl.ctrl);
428 }
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700429 if(targetCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID)
430 {
431 valDescCount++;
432 }
433 else
434 {
435 invalDescCount++;
436 }
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700437 previousCtrlValue = targetCtrlBlk->linkedDesc->descCtrl.ctrl;
438 targetCtrlBlk = (WLANDXE_DescCtrlBlkType *)targetCtrlBlk->nextCtrlBlk;
Madan Mohan Koyyalamudi94d4c192012-09-24 14:06:14 -0700439 }
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700440 }
441 else
442 {
Leo Chang345ef992013-07-12 10:17:29 -0700443 /* Head Descriptor is valid or not */
444 previousCtrlValid = targetCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID;
445 targetCtrlBlk = (WLANDXE_DescCtrlBlkType *)targetCtrlBlk->nextCtrlBlk;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700446 for(channelLoop = 0; channelLoop < channelEntry->numDesc; channelLoop++)
447 {
Leo Chang345ef992013-07-12 10:17:29 -0700448 currentCtrlValid = targetCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID;
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700449 if(currentCtrlValid)
450 {
451 valDescCount++;
452 }
453 else
454 {
455 invalDescCount++;
456 }
Leo Chang345ef992013-07-12 10:17:29 -0700457 if(currentCtrlValid != previousCtrlValid)
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700458 {
459 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
460 "%5d : 0x%x", targetCtrlBlk->ctrlBlkOrder,
461 targetCtrlBlk->linkedDesc->descCtrl.ctrl);
462 }
Leo Chang345ef992013-07-12 10:17:29 -0700463 previousCtrlValid = currentCtrlValid;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700464 targetCtrlBlk = (WLANDXE_DescCtrlBlkType *)targetCtrlBlk->nextCtrlBlk;
465 }
466 }
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530467
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700468 if(channelLog)
469 {
470 channelLog->numValDesc = valDescCount;
471 channelLog->numInvalDesc = invalDescCount;
472 }
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530473
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700474 return;
475}
476
477/*==========================================================================
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530478 @ Function Name
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530479 dxeErrHandler
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530480
481 @ Description
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530482 Dump channel information for which Error interrupt has occured and
483 try to recover from the Error
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530484
485 @ Parameters
486 WLANDXE_ChannelCBType *channelCb
487
488 @ Return
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530489 wpt_status: eWLAN_PAL_STATUS_SUCCESS if recovery is possible and
490 successful
491 eWLAN_PAL_STATUS_E_FAILURE if recovery is not possible
492 or recovery fails
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530493===========================================================================*/
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530494wpt_status dxeErrHandler
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530495(
Mihir Shete79d6b582014-03-12 17:54:07 +0530496 WLANDXE_ChannelCBType *channelCb,
497 wpt_uint32 chStatusReg
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530498)
499{
500 wpt_log_data_stall_channel_type channelLog;
Mihir Shete79d6b582014-03-12 17:54:07 +0530501 wpt_uint32 chLDescReg, channelLoop;
502 WLANDXE_DescCtrlBlkType *targetCtrlBlk;
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530503
504 dxeChannelMonitor("INT_ERR", channelCb, &channelLog);
505 dxeDescriptorDump(channelCb, channelCb->headCtrlBlk->linkedDesc, 0);
506 dxeChannelRegisterDump(channelCb, "INT_ERR", &channelLog);
507 dxeChannelAllDescDump(channelCb, channelCb->channelType, &channelLog);
508 wpalMemoryCopy(channelLog.channelName,
509 "INT_ERR",
510 WPT_TRPT_CHANNEL_NAME);
511 wpalPacketStallUpdateInfo(NULL, NULL, &channelLog, channelCb->channelType);
512#ifdef FEATURE_WLAN_DIAG_SUPPORT
513 wpalPacketStallDumpLog();
514#endif /* FEATURE_WLAN_DIAG_SUPPORT */
Mihir Shete79d6b582014-03-12 17:54:07 +0530515 switch ((chStatusReg & WLANDXE_CH_STAT_ERR_CODE_MASK) >>
516 WLANDXE_CH_STAT_ERR_CODE_OFFSET)
517 {
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530518
Mihir Shete79d6b582014-03-12 17:54:07 +0530519 case WLANDXE_ERROR_PRG_INV_B2H_SRC_QID:
520 case WLANDXE_ERROR_PRG_INV_B2H_DST_QID:
521 case WLANDXE_ERROR_PRG_INV_B2H_SRC_IDX:
522 case WLANDXE_ERROR_PRG_INV_H2B_SRC_QID:
523 case WLANDXE_ERROR_PRG_INV_H2B_DST_QID:
524 case WLANDXE_ERROR_PRG_INV_H2B_DST_IDX:
525 {
526 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
527 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
528 wpalSleep(10);
529
530 if(channelCb->channelType > WDTS_CHANNEL_RX_HIGH_PRI)
531 {
532 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
533 "%s: Invalid Channel", __func__);
534 break;
535 }
536
537 wpalReadRegister(channelCb->channelRegister.chDXELstDesclRegAddr, &chLDescReg);
538
539 targetCtrlBlk = channelCb->headCtrlBlk;
540
541 for(channelLoop = 0; channelLoop < channelCb->numDesc; channelLoop++)
542 {
543 if (targetCtrlBlk->linkedDescPhyAddr == chLDescReg)
544 {
545 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
546 "%11s :CHx_DESCL: desc ctrl 0x%x, src 0x%x, dst 0x%x, next 0x%x",
547 channelType[channelCb->channelType],
548 targetCtrlBlk->linkedDesc->descCtrl.ctrl,
549 targetCtrlBlk->linkedDesc->dxedesc.dxe_short_desc.srcMemAddrL,
550 targetCtrlBlk->linkedDesc->dxedesc.dxe_short_desc.dstMemAddrL,
551 targetCtrlBlk->linkedDesc->dxedesc.dxe_short_desc.phyNextL);
552
553 targetCtrlBlk = (WLANDXE_DescCtrlBlkType *)targetCtrlBlk->nextCtrlBlk;
554
555 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
556 "%11s :Next Desc: desc ctrl 0x%x, src 0x%x, dst 0x%x, next 0x%x",
557 channelType[channelCb->channelType],
558 targetCtrlBlk->linkedDesc->descCtrl.ctrl,
559 targetCtrlBlk->linkedDesc->dxedesc.dxe_short_desc.srcMemAddrL,
560 targetCtrlBlk->linkedDesc->dxedesc.dxe_short_desc.dstMemAddrL,
561 targetCtrlBlk->linkedDesc->dxedesc.dxe_short_desc.phyNextL);
562 break;
563 }
564 targetCtrlBlk = (WLANDXE_DescCtrlBlkType *)targetCtrlBlk->nextCtrlBlk;
565 }
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530566 wpalFwDumpReq(17, 0, 0, 0, 0, 1);
Mihir Shete79d6b582014-03-12 17:54:07 +0530567 break;
568 }
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530569 case WLANDXE_ERROR_ABORT:
570 {
571 wpt_uint32 regValue, regValueLocal;
572 wpt_uint32 count = 0;
573 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
574 "%s: DXE Abort Error from S/W", __func__);
575
576 wpalReadRegister(WALNDEX_DMA_CSR_ADDRESS, &regValue);
577 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
578 "%s: DXE CSR Value: %08x", __func__,regValue);
579
580 //Execute the BMU recovery only if firmware triggered the ABORT
581 if (regValue & WLANDXE_DMA_CSR_FW_BMU_RECOVERY)
582 {
583 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
584 "%s: Firmware BMU recovery On %08x", __func__,regValue);
585
586 // Clean up the descriptors
587 if (eWLAN_PAL_STATUS_SUCCESS !=
588 dxeTXCleanup(tempDxeCtrlBlk))
589 {
590 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
591 "%s: Host DXE Cleanup Failed!!!!", __func__);
592 }
593
594 // Debug DXE channel after cleanup
595 dxeChannelMonitor("INT_ERR", channelCb, &channelLog);
596 dxeDescriptorDump(channelCb, channelCb->headCtrlBlk->linkedDesc, 0);
597 dxeChannelRegisterDump(channelCb, "INT_ERR", &channelLog);
598 dxeChannelAllDescDump(channelCb, channelCb->channelType, &channelLog);
599
600 // Unblock the firmware
601 regValue |= WLANDXE_DMA_CSR_HOST_RECOVERY_DONE;
602 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
603 "%s: Host DXE Cleanup done %08x", __func__,regValue);
604 wpalWriteRegister(WALNDEX_DMA_CSR_ADDRESS, regValue);
605
606 // Wait for firmware to complete the cleanup
607 do
608 {
609 wpalReadRegister(WALNDEX_DMA_CSR_ADDRESS, &regValue);
610 wpalBusyWait(5000);
611 count++;
612 //count is 60 because wait is for 5 ms and 60*5=300ms
613 //which is the time WD bark happens in firmware
614 } while(count < 60 && !(regValue & WLANDXE_DMA_CSR_RECOVERY_DONE));
615 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
616 "%s: FW Cleanup done %08x", __func__,regValue);
617
618 //clear all spare bits in CSR
619 wpalWriteRegister(WALNDEX_DMA_CSR_ADDRESS,regValue &
620 ~(WLANDXE_DMA_CSR_RECOVERY_DONE |
621 WLANDXE_DMA_CSR_FW_BMU_RECOVERY |
622 WLANDXE_DMA_CSR_HOST_RECOVERY_DONE));
623
624 //check if the h/w resources have recovered
625 wpalReadRegister(WLANDXE_BMU_AVAILABLE_BD_PDU, &regValue);
626 wpalReadRegister(WLANDXE_BMU_AVAILABLE_BD_PDU_LOCAL, &regValueLocal);
627 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
628 "===== count %d ABD %d, ABD LOCAL %d =====", count,
629 regValue, regValueLocal);
630 if(regValue == 0 || regValueLocal == 0)
631 {
632 return eWLAN_PAL_STATUS_E_FAILURE;
633 }
634
635 return eWLAN_PAL_STATUS_SUCCESS;
636 }
637 break;
638 }
Mihir Shete79d6b582014-03-12 17:54:07 +0530639 default:
640 {
641 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
642 "%s: No Debug Inormation", __func__);
643 break;
644 }
645
646 }
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530647 return eWLAN_PAL_STATUS_E_FAILURE;
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530648}
649/*==========================================================================
650 @ Function Name
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700651 dxeTxThreadChannelDebugHandler
652
653 @ Description
654 Dump TX channel information
655
656 @ Parameters
657 Wwpt_msg *msgPtr
658
659 @ Return
660 NONE
661
662===========================================================================*/
663void dxeTxThreadChannelDebugHandler
664(
665 wpt_msg *msgPtr
666)
667{
668 wpt_uint8 channelLoop;
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700669 wpt_log_data_stall_channel_type channelLog;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700670
671 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700672 "%s Enter", __func__);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700673
674 /* Whatever RIVA power condition try to wakeup RIVA through SMSM
675 * This will not simply wakeup RIVA
676 * Just incase TX not wanted stuck, Trigger TX again */
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700677 for(channelLoop = 0; channelLoop < WDTS_CHANNEL_RX_LOW_PRI; channelLoop++)
678 {
679 dxeChannelMonitor("******** Get Descriptor Snapshot ",
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530680 &tempDxeCtrlBlk->dxeChannel[channelLoop],
681 &channelLog);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700682 dxeChannelRegisterDump(&tempDxeCtrlBlk->dxeChannel[channelLoop],
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530683 "Abnormal successive empty interrupt",
684 &channelLog);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700685 dxeChannelAllDescDump(&tempDxeCtrlBlk->dxeChannel[channelLoop],
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530686 channelLoop,
687 &channelLog);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700688
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700689 wpalMemoryCopy(channelLog.channelName,
690 channelType[channelLoop],
691 WPT_TRPT_CHANNEL_NAME);
692 wpalPacketStallUpdateInfo(NULL, NULL, &channelLog, channelLoop);
Jeff Johnsone7245742012-09-05 17:12:55 -0700693 }
694
Leo Chang345ef992013-07-12 10:17:29 -0700695 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnson9e237fb2013-10-30 18:46:20 -0700696 "================== DXE Dump End ======================");
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -0700697 wpalMemoryFree(msgPtr);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700698
699#ifdef FEATURE_WLAN_DIAG_SUPPORT
700 wpalPacketStallDumpLog();
701#endif /* FEATURE_WLAN_DIAG_SUPPORT */
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700702 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700703 "%s Exit", __func__);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700704 return;
705}
706
707/*==========================================================================
708 @ Function Name
709 dxeRxThreadChannelDebugHandler
710
711 @ Description
712 Dump RX channel information
713
714 @ Parameters
715 Wwpt_msg *msgPtr
716
717 @ Return
718 NONE
719
720===========================================================================*/
721void dxeRxThreadChannelDebugHandler
722(
723 wpt_msg *msgPtr
724)
725{
726 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
727 wpt_uint8 channelLoop;
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700728 wpt_log_data_stall_channel_type channelLog;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700729
730 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700731 "%s Enter", __func__);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700732
733 /* Whatever RIVA power condition try to wakeup RIVA through SMSM
734 * This will not simply wakeup RIVA
735 * Just incase TX not wanted stuck, Trigger TX again */
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700736 for(channelLoop = WDTS_CHANNEL_RX_LOW_PRI; channelLoop < WDTS_CHANNEL_MAX; channelLoop++)
737 {
Mihir Shetee6618162015-03-16 14:48:42 +0530738 if (!WLANDXE_IS_VALID_CHANNEL(channelLoop))
739 continue;
740
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700741 dxeChannelMonitor("******** Get Descriptor Snapshot ",
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530742 &tempDxeCtrlBlk->dxeChannel[channelLoop],
743 &channelLog);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700744 dxeChannelRegisterDump(&tempDxeCtrlBlk->dxeChannel[channelLoop],
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530745 "Abnormal successive empty interrupt",
746 &channelLog);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700747 dxeChannelAllDescDump(&tempDxeCtrlBlk->dxeChannel[channelLoop],
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530748 channelLoop, &channelLog);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700749
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700750 wpalMemoryCopy(channelLog.channelName,
751 channelType[channelLoop],
752 WPT_TRPT_CHANNEL_NAME);
753 wpalPacketStallUpdateInfo(NULL, NULL, &channelLog, channelLoop);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530754
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700755 }
756
757 /* Now serialise the message through Tx thread also to make sure
758 * no register access when RIVA is in powersave */
759 /*Use the same message pointer just change the call back function */
760 msgPtr->callback = dxeTxThreadChannelDebugHandler;
761 status = wpalPostTxMsg(WDI_GET_PAL_CTX(),
762 msgPtr);
763 if ( eWLAN_PAL_STATUS_SUCCESS != status )
764 {
765 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi48139e32012-10-11 14:43:56 -0700766 "Tx thread state dump req serialize fail status=%d",
Jeff Johnson9e237fb2013-10-30 18:46:20 -0700767 status);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700768 }
769
770 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700771 "%s Exit", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700772 return;
773}
Jeff Johnson295189b2012-06-20 16:38:30 -0700774
775/*==========================================================================
776 @ Function Name
777 dxeCtrlBlkAlloc
778
779 @ Description
780 Allocate DXE Control block
781 DXE control block will used by Host DXE driver only, internal structure
782 Will make ring linked list
783
784 @ Parameters
785 WLANDXE_CtrlBlkType *dxeCtrlBlk,
786 DXE host driver main control block
787 WLANDXE_ChannelCBType *channelEntry
788 Channel specific control block
789
790 @ Return
791 wpt_status
792
793===========================================================================*/
794static wpt_status dxeCtrlBlkAlloc
795(
796 WLANDXE_CtrlBlkType *dxeCtrlBlk,
797 WLANDXE_ChannelCBType *channelEntry
798)
799{
800 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
801 unsigned int idx, fIdx;
802 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
803 WLANDXE_DescCtrlBlkType *freeCtrlBlk = NULL;
804 WLANDXE_DescCtrlBlkType *prevCtrlBlk = NULL;
805 WLANDXE_DescCtrlBlkType *nextCtrlBlk = NULL;
806
807 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700808 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700809
810 /* Sanity check */
811 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
812 {
813 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
814 "dxeCtrlBlkAlloc Channel Entry is not valid");
815 return eWLAN_PAL_STATUS_E_INVAL;
816 }
817
818 /* Allocate pre asigned number of control blocks */
819 for(idx = 0; idx < channelEntry->numDesc; idx++)
820 {
821 currentCtrlBlk = (WLANDXE_DescCtrlBlkType *)wpalMemoryAllocate(sizeof(WLANDXE_DescCtrlBlkType));
822 if(NULL == currentCtrlBlk)
823 {
824 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
825 "dxeCtrlBlkOpen MemAlloc Fail for channel %d",
826 channelEntry->channelType);
827 freeCtrlBlk = channelEntry->headCtrlBlk;
828 for(fIdx = 0; fIdx < idx; fIdx++)
829 {
830 if(NULL == freeCtrlBlk)
831 {
832 break;
833 }
834
835 nextCtrlBlk = freeCtrlBlk->nextCtrlBlk;
836 wpalMemoryFree((void *)freeCtrlBlk);
837 freeCtrlBlk = nextCtrlBlk;
838 }
839 return eWLAN_PAL_STATUS_E_FAULT;
840 }
841
842 memset((wpt_uint8 *)currentCtrlBlk, 0, sizeof(WLANDXE_DescCtrlBlkType));
843 /* Initialize common elements first */
844 currentCtrlBlk->xfrFrame = NULL;
845 currentCtrlBlk->linkedDesc = NULL;
846 currentCtrlBlk->linkedDescPhyAddr = 0;
847 currentCtrlBlk->ctrlBlkOrder = idx;
848
849 /* This is the first control block allocated
850 * Next Control block is not allocated yet
851 * head and tail must be first control block */
852 if(0 == idx)
853 {
854 currentCtrlBlk->nextCtrlBlk = NULL;
855 channelEntry->headCtrlBlk = currentCtrlBlk;
856 channelEntry->tailCtrlBlk = currentCtrlBlk;
857 }
858 /* This is not first, not last control block
859 * previous control block may has next linked block */
860 else if((0 < idx) && (idx < (channelEntry->numDesc - 1)))
861 {
862 prevCtrlBlk->nextCtrlBlk = currentCtrlBlk;
863 }
864 /* This is last control blocl
865 * next control block for the last control block is head, first control block
866 * then whole linked list made RING */
867 else if((channelEntry->numDesc - 1) == idx)
868 {
869 prevCtrlBlk->nextCtrlBlk = currentCtrlBlk;
870 currentCtrlBlk->nextCtrlBlk = channelEntry->headCtrlBlk;
871 }
872 else
873 {
874 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
875 "dxeCtrlBlkOpen Invalid Ctrl Blk location %d",
876 channelEntry->channelType);
877 wpalMemoryFree(currentCtrlBlk);
878 return eWLAN_PAL_STATUS_E_FAULT;
879 }
880
881 prevCtrlBlk = currentCtrlBlk;
882 channelEntry->numFreeDesc++;
883 }
884
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700885 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,"%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700886 return status;
887}
888
889/*==========================================================================
890 @ Function Name
891 dxeDescLinkAlloc
892
893 @ Description
894 Allocate DXE descriptor
895 DXE descriptor will be shared by DXE host driver and RIVA DXE engine
896 Will make RING linked list
897 Will be linked with Descriptor control block one by one
898
899 @ Parameters
900 WLANDXE_CtrlBlkType *dxeCtrlBlk,
901 DXE host driver main control block
902 WLANDXE_ChannelCBType *channelEntry
903 Channel specific control block
904 @ Return
905 wpt_status
906
907===========================================================================*/
908static wpt_status dxeDescAllocAndLink
909(
910 WLANDXE_CtrlBlkType *dxeCtrlBlk,
911 WLANDXE_ChannelCBType *channelEntry
912)
913{
914 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
915 WLANDXE_DescType *currentDesc = NULL;
916 WLANDXE_DescType *prevDesc = NULL;
917 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
918 unsigned int idx;
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +0530919 void *physAddressAlloc = NULL;
920 wpt_uint32 physAddress;
Jeff Johnson295189b2012-06-20 16:38:30 -0700921
922 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700923 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700924
925 /* Sanity Check */
926 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
927 {
928 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
929 "dxeDescLinkAlloc Channel Entry is not valid");
930 return eWLAN_PAL_STATUS_E_INVAL;
931 }
932
933 currentCtrlBlk = channelEntry->headCtrlBlk;
934
Jeff Johnson295189b2012-06-20 16:38:30 -0700935 /* allocate all DXE descriptors for this channel in one chunk */
936 channelEntry->descriptorAllocation = (WLANDXE_DescType *)
937 wpalDmaMemoryAllocate(sizeof(WLANDXE_DescType)*channelEntry->numDesc,
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +0530938 &physAddressAlloc);
939 physAddress = (wpt_uint32) (uintptr_t)(physAddressAlloc);
Jeff Johnson295189b2012-06-20 16:38:30 -0700940 if(NULL == channelEntry->descriptorAllocation)
941 {
942 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
943 "dxeDescLinkAlloc Descriptor Alloc Fail");
944 return eWLAN_PAL_STATUS_E_RESOURCES;
945 }
946 currentDesc = channelEntry->descriptorAllocation;
Jeff Johnson295189b2012-06-20 16:38:30 -0700947
948 /* Allocate pre asigned number of descriptor */
949 for(idx = 0; idx < channelEntry->numDesc; idx++)
950 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700951 // descriptors were allocated in a chunk -- use the current one
Jeff Johnson295189b2012-06-20 16:38:30 -0700952 if(NULL == currentDesc)
953 {
954 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
955 "dxeDescLinkAlloc MemAlloc Fail for channel %d",
956 channelEntry->channelType);
957 return eWLAN_PAL_STATUS_E_FAULT;
958 }
Mihir Shete96cd1902015-03-04 15:47:31 +0530959 memset((wpt_uint8 *)currentDesc, 0, sizeof(WLANDXE_DescType));
960 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
961 "Allocated Descriptor VA %p, PA %p", currentDesc, physAddressAlloc);
Jeff Johnson295189b2012-06-20 16:38:30 -0700962
Jeff Johnson295189b2012-06-20 16:38:30 -0700963 currentCtrlBlk->linkedDesc = currentDesc;
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +0530964 currentCtrlBlk->linkedDescPhyAddr = physAddress;
Jeff Johnson295189b2012-06-20 16:38:30 -0700965 /* First descriptor, next none
966 * descriptor bottom location is first descriptor address */
967 if(0 == idx)
968 {
969 currentDesc->dxedesc.dxe_short_desc.phyNextL = 0;
970 channelEntry->DescBottomLoc = currentDesc;
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +0530971 channelEntry->descBottomLocPhyAddr = physAddress;
Jeff Johnson295189b2012-06-20 16:38:30 -0700972 }
973 /* Not first, not last descriptor
974 * may make link for previous descriptor with current descriptor
975 * ENDIAN SWAP needed ????? */
976 else if((0 < idx) && (idx < (channelEntry->numDesc - 1)))
977 {
978 prevDesc->dxedesc.dxe_short_desc.phyNextL =
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +0530979 WLANDXE_U32_SWAP_ENDIAN(physAddress);
Jeff Johnson295189b2012-06-20 16:38:30 -0700980 }
981 /* Last descriptor
982 * make a ring by asign next pointer as first descriptor
983 * ENDIAN SWAP NEEDED ??? */
984 else if((channelEntry->numDesc - 1) == idx)
985 {
986 prevDesc->dxedesc.dxe_short_desc.phyNextL =
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +0530987 WLANDXE_U32_SWAP_ENDIAN(physAddress);
Jeff Johnson295189b2012-06-20 16:38:30 -0700988 currentDesc->dxedesc.dxe_short_desc.phyNextL =
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +0530989 WLANDXE_U32_SWAP_ENDIAN(channelEntry->headCtrlBlk->linkedDescPhyAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -0700990 }
991
992 /* If Current Channel is RX channel PAL Packet and OS packet buffer should be
993 * Pre allocated and physical address must be assigned into
994 * Corresponding DXE Descriptor */
Jeff Johnson295189b2012-06-20 16:38:30 -0700995 if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
Mihir Shetee6618162015-03-16 14:48:42 +0530996 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType) ||
997 (WDTS_CHANNEL_RX_LOG == channelEntry->channelType))
Jeff Johnson295189b2012-06-20 16:38:30 -0700998 {
999 status = dxeRXFrameSingleBufferAlloc(dxeCtrlBlk,
1000 channelEntry,
1001 currentCtrlBlk);
1002 if( !WLAN_PAL_IS_STATUS_SUCCESS(status) )
1003 {
1004 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1005 "dxeDescLinkAlloc RX Buffer Alloc Fail for channel %d",
1006 channelEntry->channelType);
1007 return status;
1008 }
1009 --channelEntry->numFreeDesc;
1010 }
1011
Leo Chang7e05f212013-07-01 19:54:15 -07001012 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
1013 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
1014 {
1015 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write;
1016 currentDesc->dxedesc.dxe_short_desc.dstMemAddrL = channelEntry->extraConfig.refWQ_swapped;
1017 }
1018 else if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
Mihir Shetee6618162015-03-16 14:48:42 +05301019 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType)||
1020 (WDTS_CHANNEL_RX_LOG == channelEntry->channelType))
Leo Chang7e05f212013-07-01 19:54:15 -07001021 {
1022 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_read;
1023 currentDesc->dxedesc.dxe_short_desc.srcMemAddrL = channelEntry->extraConfig.refWQ_swapped;
1024 }
1025 else
1026 {
Mihir Shetebe94ebb2015-05-26 12:07:14 +05301027 /* Just in case. H2H RX channel, do nothing
Leo Chang7e05f212013-07-01 19:54:15 -07001028 * By Definition this must not happen */
1029 }
1030
Jeff Johnson295189b2012-06-20 16:38:30 -07001031 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
1032 prevDesc = currentDesc;
1033
Jeff Johnson295189b2012-06-20 16:38:30 -07001034 // advance to the next pre-allocated descriptor in the chunk
1035 currentDesc++;
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05301036 physAddress = (physAddress + sizeof(WLANDXE_DescType));
Jeff Johnson295189b2012-06-20 16:38:30 -07001037 }
1038
1039 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001040 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001041 return status;
1042}
1043
1044/*==========================================================================
1045 @ Function Name
1046
1047 @ Description
1048
1049 @ Parameters
1050
1051 @ Return
1052 wpt_status
1053
1054===========================================================================*/
1055static wpt_status dxeSetInterruptPath
1056(
1057 WLANDXE_CtrlBlkType *dxeCtrlBlk
1058)
1059{
1060 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1061 wpt_uint32 interruptPath = 0;
1062 wpt_uint32 idx;
1063 WLANDXE_ChannelCBType *channelEntry = NULL;
1064
1065 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001066 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001067
Mihir Shetee6618162015-03-16 14:48:42 +05301068 foreach_valid_channel(idx)
Jeff Johnson295189b2012-06-20 16:38:30 -07001069 {
1070 channelEntry = &dxeCtrlBlk->dxeChannel[idx];
Jeff Johnson295189b2012-06-20 16:38:30 -07001071 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
1072 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
Jeff Johnson295189b2012-06-20 16:38:30 -07001073 {
1074 interruptPath |= (1 << channelEntry->assignedDMAChannel);
1075 }
1076 else if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
Mihir Shetee6618162015-03-16 14:48:42 +05301077 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType)||
Mihir Shetec4093f92015-05-28 15:21:11 +05301078 (WDTS_CHANNEL_RX_FW_LOG == channelEntry->channelType) ||
Mihir Shetee6618162015-03-16 14:48:42 +05301079 (WDTS_CHANNEL_RX_LOG == channelEntry->channelType))
Jeff Johnson295189b2012-06-20 16:38:30 -07001080 {
1081 interruptPath |= (1 << (channelEntry->assignedDMAChannel + 16));
1082 }
1083 else
1084 {
1085 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1086 "H2H TEST RX???? %d", channelEntry->channelType);
1087 }
1088 }
1089 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
1090 "Interrupt Path Must be 0x%x", interruptPath);
1091 dxeCtrlBlk->interruptPath = interruptPath;
1092 wpalWriteRegister(WLANDXE_CCU_DXE_INT_SELECT, interruptPath);
1093
1094 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001095 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001096 return status;
1097}
1098
1099/*==========================================================================
1100 @ Function Name
1101 dxeEngineCoreStart
1102
1103 @ Description
1104 Trigger to start RIVA DXE Hardware
1105
1106 @ Parameters
1107 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1108 DXE host driver main control block
1109
1110 @ Return
jagadeeshf869bba2015-04-07 20:06:21 +05301111 void
Jeff Johnson295189b2012-06-20 16:38:30 -07001112
1113===========================================================================*/
jagadeeshf869bba2015-04-07 20:06:21 +05301114static void dxeEngineCoreStart
Jeff Johnson295189b2012-06-20 16:38:30 -07001115(
1116 WLANDXE_CtrlBlkType *dxeCtrlBlk
1117)
1118{
Jeff Johnson295189b2012-06-20 16:38:30 -07001119 wpt_uint32 registerData = 0;
Leo Chang00708f62013-12-03 20:21:51 -08001120 wpt_uint8 readRetry;
Jeff Johnson295189b2012-06-20 16:38:30 -07001121
1122 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001123 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001124
Leo Chang00708f62013-12-03 20:21:51 -08001125#ifdef WCN_PRONTO
1126 /* Read default */
1127 wpalReadRegister(WLANDXE_CCU_SOFT_RESET, &registerData);
1128 registerData |= WLANDXE_DMA_CCU_DXE_RESET_MASK;
1129
1130 /* Make reset */
1131 wpalWriteRegister(WLANDXE_CCU_SOFT_RESET, registerData);
1132
1133 /* Clear reset */
1134 registerData &= ~WLANDXE_DMA_CCU_DXE_RESET_MASK;
1135 wpalWriteRegister(WLANDXE_CCU_SOFT_RESET, registerData);
1136#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001137 /* START This core init is not needed for the integrated system */
1138 /* Reset First */
1139 registerData = WLANDXE_DMA_CSR_RESET_MASK;
1140 wpalWriteRegister(WALNDEX_DMA_CSR_ADDRESS,
1141 registerData);
Leo Chang00708f62013-12-03 20:21:51 -08001142#endif /* WCN_PRONTO */
Jeff Johnson295189b2012-06-20 16:38:30 -07001143
Leo Chang00708f62013-12-03 20:21:51 -08001144 for(readRetry = 0; readRetry < WLANDXE_CSR_MAX_READ_COUNT; readRetry++)
1145 {
1146 wpalWriteRegister(WALNDEX_DMA_CSR_ADDRESS,
1147 WLANDXE_CSR_DEFAULT_ENABLE);
1148 wpalReadRegister(WALNDEX_DMA_CSR_ADDRESS, &registerData);
1149 if(!(registerData & WLANDXE_DMA_CSR_EN_MASK))
1150 {
1151 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1152 "%s CSR 0x%x, count %d",
1153 __func__, registerData, readRetry);
1154 /* CSR is not valid value, re-try to write */
1155 wpalBusyWait(WLANDXE_CSR_NEXT_READ_WAIT);
1156 }
1157 else
1158 {
1159 break;
1160 }
1161 }
1162 if(WLANDXE_CSR_MAX_READ_COUNT == readRetry)
1163 {
1164 /* MAX wait, still cannot write correct value
1165 * Panic device */
1166 wpalDevicePanic();
1167 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001168
1169 /* Is This needed?
1170 * Not sure, revisit with integrated system */
1171 /* END This core init is not needed for the integrated system */
1172
1173 dxeSetInterruptPath(dxeCtrlBlk);
1174 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001175 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001176}
1177
1178/*==========================================================================
1179 @ Function Name
1180 dxeChannelInitProgram
1181
1182 @ Description
1183 Program RIVA DXE engine register with initial value
1184 What must be programmed
1185 - Source Address (SADRL, chDXESadrlRegAddr)
1186 - Destination address (DADRL, chDXEDadrlRegAddr)
1187 - Next Descriptor address (DESCL, chDXEDesclRegAddr)
1188 - current descriptor address (LST_DESCL, chDXELstDesclRegAddr)
1189
1190 Not need to program now
1191 - Channel Control register (CH_CTRL, chDXECtrlRegAddr)
1192 TX : Have to program to trigger send out frame
1193 RX : programmed by DXE engine
1194
1195 @ Parameters
1196 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1197 DXE host driver main control block
1198 WLANDXE_ChannelCBType *channelEntry
1199 Channel specific control block
1200 @ Return
1201 wpt_status
1202
1203===========================================================================*/
1204static wpt_status dxeChannelInitProgram
1205(
1206 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1207 WLANDXE_ChannelCBType *channelEntry
1208)
1209{
1210 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1211 wpt_uint32 idx;
1212 WLANDXE_DescType *currentDesc = NULL;
1213 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
1214
1215 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001216 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001217
1218 /* Sanity Check */
1219 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
1220 {
1221 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1222 "dxeChannelInitProgram Channel Entry is not valid");
1223 return eWLAN_PAL_STATUS_E_INVAL;
1224 }
1225
1226 /* Program Source address and destination adderss */
1227 if(!channelEntry->channelConfig.useShortDescFmt)
1228 {
1229 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1230 "dxeChannelInitProgram Long Descriptor not support yet");
1231 return eWLAN_PAL_STATUS_E_FAILURE;
1232 }
1233
1234 /* Common register area */
1235 /* Next linked list Descriptor pointer */
1236 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
1237 channelEntry->headCtrlBlk->linkedDescPhyAddr);
1238 if(eWLAN_PAL_STATUS_SUCCESS != status)
1239 {
1240 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1241 "dxeChannelInitProgram Write DESC Address register fail");
1242 return status;
1243 }
1244
1245 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
1246 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
1247 {
1248 /* Program default registers */
1249 /* TX DMA channel, DMA destination address is work Q */
1250 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrlRegAddr,
1251 channelEntry->channelConfig.refWQ);
1252 if(eWLAN_PAL_STATUS_SUCCESS != status)
1253 {
1254 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1255 "dxeChannelInitProgram Write TX DAddress register fail");
1256 return status;
1257 }
1258 }
1259 else if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
Mihir Shetee6618162015-03-16 14:48:42 +05301260 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType) ||
1261 (WDTS_CHANNEL_RX_LOG == channelEntry->channelType))
Jeff Johnson295189b2012-06-20 16:38:30 -07001262 {
1263 /* Initialize Descriptor control Word First */
1264 currentCtrlBlk = channelEntry->headCtrlBlk;
1265 for(idx = 0; idx < channelEntry->channelConfig.nDescs; idx++)
1266 {
1267 currentDesc = currentCtrlBlk->linkedDesc;
1268 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
1269 }
1270
1271 /* RX DMA channel, DMA source address is work Q */
1272 status = wpalWriteRegister(channelEntry->channelRegister.chDXESadrlRegAddr,
1273 channelEntry->channelConfig.refWQ);
1274 if(eWLAN_PAL_STATUS_SUCCESS != status)
1275 {
1276 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1277 "dxeChannelInitProgram Write RX SAddress WQ register fail");
1278 return status;
1279 }
1280
1281 /* RX DMA channel, Program pre allocated destination Address */
1282 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrlRegAddr,
1283 WLANDXE_U32_SWAP_ENDIAN(channelEntry->DescBottomLoc->dxedesc.dxe_short_desc.phyNextL));
1284 if(eWLAN_PAL_STATUS_SUCCESS != status)
1285 {
1286 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1287 "dxeChannelInitProgram Write RX DAddress register fail");
1288 return status;
1289 }
1290
1291 /* RX Channels, default Control registers MUST BE ENABLED */
jagadeeshf869bba2015-04-07 20:06:21 +05301292 status = wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07001293 channelEntry->extraConfig.chan_mask);
1294 if(eWLAN_PAL_STATUS_SUCCESS != status)
1295 {
1296 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1297 "dxeChannelInitProgram Write RX Control register fail");
1298 return status;
1299 }
1300 }
1301 else
1302 {
1303 /* H2H test channel, not use work Q */
Jeff Johnson295189b2012-06-20 16:38:30 -07001304 }
1305
1306 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001307 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001308 return status;
1309}
1310
1311
1312/*==========================================================================
1313 @ Function Name
1314 dxeChannelStart
1315
1316 @ Description
1317 Start Specific Channel
1318
1319 @ Parameters
1320 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1321 DXE host driver main control block
1322 WLANDXE_ChannelCBType *channelEntry
1323 Channel specific control block
1324
1325 @ Return
1326 wpt_status
1327
1328===========================================================================*/
1329static wpt_status dxeChannelStart
1330(
1331 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1332 WLANDXE_ChannelCBType *channelEntry
1333)
1334{
1335 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1336 wpt_uint32 regValue = 0;
1337 wpt_uint32 intMaskVal = 0;
1338
1339 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001340 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001341
1342 channelEntry->extraConfig.chEnabled = eWLAN_PAL_TRUE;
1343 channelEntry->extraConfig.chConfigured = eWLAN_PAL_TRUE;
1344
1345 /* Enable individual channel
1346 * not to break current channel setup, first read register */
1347 status = wpalReadRegister(WALNDEX_DMA_CH_EN_ADDRESS,
1348 &regValue);
1349 if(eWLAN_PAL_STATUS_SUCCESS != status)
1350 {
1351 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1352 "dxeChannelStart Read Channel Enable register fail");
1353 return status;
1354 }
1355
1356 /* Enable Channel specific Interrupt */
1357 status = wpalReadRegister(WLANDXE_INT_MASK_REG_ADDRESS,
1358 &intMaskVal);
1359 if(eWLAN_PAL_STATUS_SUCCESS != status)
1360 {
1361 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1362 "dxeChannelStart Read INT_MASK register fail");
1363 return status;
1364 }
1365 intMaskVal |= channelEntry->extraConfig.intMask;
1366 status = wpalWriteRegister(WLANDXE_INT_MASK_REG_ADDRESS,
1367 intMaskVal);
1368 if(eWLAN_PAL_STATUS_SUCCESS != status)
1369 {
1370 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1371 "dxeChannelStart Write INT_MASK register fail");
1372 return status;
1373 }
1374
1375 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001376 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001377 return status;
1378}
1379
1380/*==========================================================================
1381 @ Function Name
1382 dxeChannelStop
1383
1384 @ Description
1385 Stop Specific Channel
1386
1387 @ Parameters
1388 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1389 DXE host driver main control block
1390 WLANDXE_ChannelCBType *channelEntry
1391 Channel specific control block
1392
1393 @ Return
1394 wpt_status
1395
1396===========================================================================*/
1397static wpt_status dxeChannelStop
1398(
1399 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1400 WLANDXE_ChannelCBType *channelEntry
1401)
1402{
1403 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1404 wpt_uint32 intMaskVal = 0;
1405
1406 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001407 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001408
1409 /* Sanity */
1410 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
1411 {
1412 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1413 "dxeChannelStop Invalid arg input");
1414 return eWLAN_PAL_STATUS_E_INVAL;
1415 }
1416
Madan Mohan Koyyalamudid57ae632012-11-06 18:42:48 -08001417 if ( (channelEntry->extraConfig.chEnabled != eWLAN_PAL_TRUE) ||
1418 (channelEntry->extraConfig.chConfigured != eWLAN_PAL_TRUE))
1419 {
1420 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1421 "dxeChannelStop channels are not enabled ");
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08001422 return status;
Madan Mohan Koyyalamudid57ae632012-11-06 18:42:48 -08001423 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001424 /* Maskout interrupt */
1425 status = wpalReadRegister(WLANDXE_INT_MASK_REG_ADDRESS,
1426 &intMaskVal);
1427 if(eWLAN_PAL_STATUS_SUCCESS != status)
1428 {
1429 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1430 "dxeChannelStop Read INT_MASK register fail");
1431 return status;
1432 }
1433 intMaskVal ^= channelEntry->extraConfig.intMask;
1434 status = wpalWriteRegister(WLANDXE_INT_MASK_REG_ADDRESS,
1435 intMaskVal);
1436 if(eWLAN_PAL_STATUS_SUCCESS != status)
1437 {
1438 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1439 "dxeChannelStop Write INT_MASK register fail");
1440 return status;
1441 }
1442
1443 channelEntry->extraConfig.chEnabled = eWLAN_PAL_FALSE;
1444
1445 /* Stop Channel ??? */
1446 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001447 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001448 return status;
1449}
1450
1451/*==========================================================================
1452 @ Function Name
1453 dxeChannelClose
1454
1455 @ Description
1456 Close Specific Channel
1457 Free pre allocated RX frame buffer if RX channel
1458 Free DXE descriptor for each channel
1459 Free Descriptor control block for each channel
1460
1461 @ Parameters
1462 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1463 DXE host driver main control block
1464 WLANDXE_ChannelCBType *channelEntry
1465 Channel specific control block
1466
1467 @ Return
1468 wpt_status
1469
1470===========================================================================*/
1471static wpt_status dxeChannelClose
1472(
1473 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1474 WLANDXE_ChannelCBType *channelEntry
1475)
1476{
1477 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1478 wpt_uint32 idx;
1479 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
1480 WLANDXE_DescCtrlBlkType *nextCtrlBlk = NULL;
1481 WLANDXE_DescType *currentDescriptor = NULL;
1482 WLANDXE_DescType *nextDescriptor = NULL;
1483
1484 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001485 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001486
1487 /* Sanity */
1488 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
1489 {
1490 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1491 "dxeChannelStop Invalid arg input");
1492 return eWLAN_PAL_STATUS_E_INVAL;
1493 }
1494
1495 currentCtrlBlk = channelEntry->headCtrlBlk;
1496 if(NULL != currentCtrlBlk)
1497 {
1498 currentDescriptor = currentCtrlBlk->linkedDesc;
1499 for(idx = 0; idx < channelEntry->numDesc; idx++)
1500 {
1501 if (idx + 1 != channelEntry->numDesc)
1502 {
1503 nextCtrlBlk = currentCtrlBlk->nextCtrlBlk;
1504 nextDescriptor = nextCtrlBlk->linkedDesc;
1505 }
1506 else
1507 {
1508 nextCtrlBlk = NULL;
1509 nextDescriptor = NULL;
1510 }
1511 if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
Mihir Shetee6618162015-03-16 14:48:42 +05301512 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType) ||
1513 (WDTS_CHANNEL_RX_LOG == channelEntry->channelType))
Jeff Johnson295189b2012-06-20 16:38:30 -07001514 {
1515 if (NULL != currentCtrlBlk->xfrFrame)
1516 {
1517 wpalUnlockPacket(currentCtrlBlk->xfrFrame);
1518 wpalPacketFree(currentCtrlBlk->xfrFrame);
1519 }
1520 }
1521 /*
1522 * It is the responsibility of DXE to walk through the
1523 * descriptor chain and unlock any pending packets (if
1524 * locked).
1525 */
1526 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
1527 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
1528 {
1529 if((NULL != currentCtrlBlk->xfrFrame) &&
1530 (eWLAN_PAL_STATUS_SUCCESS == wpalIsPacketLocked(currentCtrlBlk->xfrFrame)))
1531 {
1532 wpalUnlockPacket(currentCtrlBlk->xfrFrame);
1533 wpalPacketFree(currentCtrlBlk->xfrFrame);
1534 }
1535 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001536 wpalMemoryFree(currentCtrlBlk);
1537
1538 currentCtrlBlk = nextCtrlBlk;
1539 currentDescriptor = nextDescriptor;
Madan Mohan Koyyalamudi74719a12012-10-21 12:09:36 -07001540 if(NULL == currentCtrlBlk)
1541 {
1542 /* Already reach last of the control block
1543 * Not need to process anymore, break */
1544 break;
1545 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001546 }
1547 }
1548
Jeff Johnson295189b2012-06-20 16:38:30 -07001549 // descriptors were allocated as a single chunk so free the chunk
1550 if(NULL != channelEntry->descriptorAllocation)
1551 {
1552 wpalDmaMemoryFree(channelEntry->descriptorAllocation);
1553 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001554
1555 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001556 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001557 return status;
1558}
1559
1560/*==========================================================================
1561 @ Function Name
1562 dxeChannelCleanInt
1563
1564 @ Description
1565 Clean up interrupt from RIVA HW
1566 After Host finish to handle interrupt, interrupt signal must be cleaned up
1567 Otherwise next interrupt will not be generated
1568
1569 @ Parameters
1570 WLANDXE_ChannelCBType *channelEntry
1571 Channel specific control block
1572 wpt_uint32 *chStat
1573 Channel Status register value
1574
1575 @ Return
1576 wpt_status
1577
1578===========================================================================*/
1579static wpt_status dxeChannelCleanInt
1580(
1581 WLANDXE_ChannelCBType *channelEntry,
1582 wpt_uint32 *chStat
1583)
1584{
1585 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1586
1587 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001588 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001589
1590 /* Read Channel Status Register to know why INT Happen */
1591 status = wpalReadRegister(channelEntry->channelRegister.chDXEStatusRegAddr,
1592 chStat);
1593 if(eWLAN_PAL_STATUS_SUCCESS != status)
1594 {
1595 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1596 "dxeChannelCleanInt Read CH STAT register fail");
1597 return eWLAN_PAL_STATUS_E_FAULT;
1598 }
1599 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
1600 "%s Channel INT Clean, Status 0x%x",
1601 channelType[channelEntry->channelType], *chStat);
1602
1603 /* Clean up all the INT within this channel */
1604 status = wpalWriteRegister(WLANDXE_INT_CLR_ADDRESS,
1605 (1 << channelEntry->assignedDMAChannel));
1606 if(eWLAN_PAL_STATUS_SUCCESS != status)
1607 {
1608 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1609 "dxeChannelCleanInt Write CH Clean register fail");
1610 return eWLAN_PAL_STATUS_E_FAULT;
1611 }
1612
Jeff Johnsone7245742012-09-05 17:12:55 -07001613 /* Clean up Error INT Bit */
1614 if(WLANDXE_CH_STAT_INT_ERR_MASK & *chStat)
1615 {
1616 status = wpalWriteRegister(WLANDXE_INT_ERR_CLR_ADDRESS,
1617 (1 << channelEntry->assignedDMAChannel));
1618 if(eWLAN_PAL_STATUS_SUCCESS != status)
1619 {
1620 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1621 "dxeChannelCleanInt Read CH STAT register fail");
1622 return eWLAN_PAL_STATUS_E_FAULT;
1623 }
1624 }
1625
1626 /* Clean up DONE INT Bit */
1627 if(WLANDXE_CH_STAT_INT_DONE_MASK & *chStat)
1628 {
1629 status = wpalWriteRegister(WLANDXE_INT_DONE_CLR_ADDRESS,
1630 (1 << channelEntry->assignedDMAChannel));
1631 if(eWLAN_PAL_STATUS_SUCCESS != status)
1632 {
1633 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1634 "dxeChannelCleanInt Read CH STAT register fail");
1635 return eWLAN_PAL_STATUS_E_FAULT;
1636 }
1637 }
1638
1639 /* Clean up ED INT Bit */
1640 if(WLANDXE_CH_STAT_INT_ED_MASK & *chStat)
1641 {
1642 status = wpalWriteRegister(WLANDXE_INT_ED_CLR_ADDRESS,
1643 (1 << channelEntry->assignedDMAChannel));
1644 if(eWLAN_PAL_STATUS_SUCCESS != status)
1645 {
1646 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1647 "dxeChannelCleanInt Read CH STAT register fail");
1648 return eWLAN_PAL_STATUS_E_FAULT;
1649 }
1650 }
1651
Jeff Johnson295189b2012-06-20 16:38:30 -07001652 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001653 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001654 return status;
1655}
1656
Mihir Shete44547fb2014-03-10 14:15:42 +05301657#ifdef WLAN_DXE_LOW_RESOURCE_TIMER
Jeff Johnson295189b2012-06-20 16:38:30 -07001658/*==========================================================================
Leo Chang72cdfd32013-10-17 20:36:30 -07001659 @ Function Name
1660 dxeRXResourceAvailableTimerExpHandler
1661
1662 @ Description
1663 During pre-set timeperiod, if free available RX buffer is not allocated
1664 Trigger Driver re-loading to recover RX dead end
1665
1666 @ Parameters
1667 v_VOID_t *usrData
1668 DXE context
1669
1670 @ Return
1671 NONE
1672
1673===========================================================================*/
1674void dxeRXResourceAvailableTimerExpHandler
1675(
1676 void *usrData
1677)
1678{
Katya Nigam93888ff2014-02-10 17:58:11 +05301679 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
Mihir Shete058fcff2014-06-26 18:54:06 +05301680 wpt_uint32 numRxFreePackets;
Mihir Sheted183cef2014-09-26 19:17:56 +05301681 wpt_uint32 numAllocFailures;
Katya Nigam93888ff2014-02-10 17:58:11 +05301682
1683 dxeCtxt = (WLANDXE_CtrlBlkType *)usrData;
1684
Leo Chang72cdfd32013-10-17 20:36:30 -07001685 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1686 "RX Low resource, Durign wait time period %d, RX resource not allocated",
Katya Nigama6fbf662015-03-17 18:35:47 +05301687 wpalGetDxeReplenishRXTimerVal());
Katya Nigam93888ff2014-02-10 17:58:11 +05301688
Mihir Shete058fcff2014-06-26 18:54:06 +05301689 //This API wil also try to replenish packets
1690 wpalGetNumRxFreePacket(&numRxFreePackets);
Mihir Sheted183cef2014-09-26 19:17:56 +05301691 wpalGetNumRxPacketAllocFailures(&numAllocFailures);
Mihir Shete058fcff2014-06-26 18:54:06 +05301692
Mihir Sheted183cef2014-09-26 19:17:56 +05301693 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1694 "Free Packets: %u, Alloc Failures: %u",
1695 numRxFreePackets, numAllocFailures);
Mihir Shete058fcff2014-06-26 18:54:06 +05301696 if (numRxFreePackets > 0)
1697 {
1698 /* If no. of free packets is greater than 0, it means
1699 * that some packets were replenished and can be used
1700 * by DXE to receive frames. So try to restart the
1701 * resourceAvailable timer here, it will be stopped
1702 * by the DXE's low resource callback if atleast one
1703 * free packet reaches DXE.
1704 */
1705 if (NULL != dxeCtxt)
1706 {
1707 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1708 "%s: Replenish successful. Restart the Rx Low resource timer",
1709 __func__);
1710 wpalTimerStart(&dxeCtxt->rxResourceAvailableTimer,
Katya Nigama6fbf662015-03-17 18:35:47 +05301711 wpalGetDxeReplenishRXTimerVal());
Mihir Shete058fcff2014-06-26 18:54:06 +05301712 return;
1713 }
1714 }
Katya Nigama6fbf662015-03-17 18:35:47 +05301715 if(wpalIsDxeSSREnable())
1716 {
1717 if (NULL != dxeCtxt)
1718 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
Mihir Shete058fcff2014-06-26 18:54:06 +05301719
Katya Nigama6fbf662015-03-17 18:35:47 +05301720 wpalWlanReload();
Katya Nigam93888ff2014-02-10 17:58:11 +05301721
Katya Nigama6fbf662015-03-17 18:35:47 +05301722 if (NULL != usrData)
1723 dxeStartSSRTimer((WLANDXE_CtrlBlkType *)usrData);
1724 }
1725 else
1726 {
1727 wpalTimerStart(&dxeCtxt->rxResourceAvailableTimer,
1728 wpalGetDxeReplenishRXTimerVal());
1729 }
Mihir Shetefdc9f532014-01-09 15:03:02 +05301730 return;
1731}
Mihir Shete44547fb2014-03-10 14:15:42 +05301732#endif
Mihir Shetefdc9f532014-01-09 15:03:02 +05301733
1734/*==========================================================================
1735 @ Function Name
1736 dxeStartSSRTimer
1737
1738 @ Description
1739 Start the dxeSSRTimer after issuing the FIQ to restart the WCN chip,
1740 this makes sure that if the chip does not respond to the FIQ within
1741 the timeout period the dxeSSRTimer expiration handler will take the
1742 appropriate action.
1743
1744 @ Parameters
1745 NONE
1746
1747 @ Return
1748 NONE
1749
1750===========================================================================*/
1751static void dxeStartSSRTimer
1752(
1753 WLANDXE_CtrlBlkType *dxeCtxt
1754)
1755{
1756 if(VOS_TIMER_STATE_RUNNING !=
1757 wpalTimerGetCurStatus(&dxeCtxt->dxeSSRTimer))
1758 {
1759 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
1760 "%s: Starting SSR Timer",__func__);
1761 wpalTimerStart(&dxeCtxt->dxeSSRTimer,
1762 T_WLANDXE_SSR_TIMEOUT);
1763 }
1764}
1765
1766/*==========================================================================
1767 @ Function Name
1768 dxeSSRTimerExpHandler
1769
1770 @ Description
1771 Issue an explicit subsystem restart of the wcnss subsystem if the
1772 WCN chip does not respond to the FIQ within the timeout period
1773
1774 @ Parameters
1775 v_VOID_t *usrData
1776
1777 @ Return
1778 NONE
1779
1780===========================================================================*/
1781void dxeSSRTimerExpHandler
1782(
1783 void *usrData
1784)
1785{
1786 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1787 "DXE not shutdown %d ms after FIQ!! Issue SSR",
1788 T_WLANDXE_SSR_TIMEOUT);
1789 wpalRivaSubystemRestart();
1790
Leo Chang72cdfd32013-10-17 20:36:30 -07001791 return;
1792}
1793
1794/*==========================================================================
Jeff Johnson295189b2012-06-20 16:38:30 -07001795 @ Function Name
1796 dxeRXPacketAvailableCB
1797
1798 @ Description
1799 If RX frame handler encounts RX buffer pool empty condition,
1800 DXE RX handle loop will be blocked till get available RX buffer pool.
1801 When new RX buffer pool available, Packet available CB function will
1802 be called.
1803
1804 @ Parameters
1805 wpt_packet *freePacket
1806 Newly allocated RX buffer
1807 v_VOID_t *usrData
1808 DXE context
1809
1810 @ Return
1811 NONE
1812
1813===========================================================================*/
1814void dxeRXPacketAvailableCB
1815(
1816 wpt_packet *freePacket,
1817 v_VOID_t *usrData
1818)
1819{
1820 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
1821 wpt_status status;
1822
1823 /* Simple Sanity */
1824 if((NULL == freePacket) || (NULL == usrData))
1825 {
1826 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1827 "Get Free RX Buffer fail, Critical Error");
1828 HDXE_ASSERT(0);
1829 return;
1830 }
1831
1832 dxeCtxt = (WLANDXE_CtrlBlkType *)usrData;
1833
1834 if(WLANDXE_CTXT_COOKIE != dxeCtxt->dxeCookie)
1835 {
1836 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1837 "DXE Context data corrupted, Critical Error");
1838 HDXE_ASSERT(0);
1839 return;
1840 }
1841
1842 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
1843 "DXE RX packet available, post MSG to RX Thread");
1844
1845 dxeCtxt->freeRXPacket = freePacket;
1846
1847 /* Serialize RX Packet Available message upon RX thread */
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08001848 if (NULL == dxeCtxt->rxPktAvailMsg)
1849 {
1850 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1851 "DXE NULL pkt");
1852 HDXE_ASSERT(0);
1853 return;
1854 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001855
1856 status = wpalPostRxMsg(WDI_GET_PAL_CTX(),
1857 dxeCtxt->rxPktAvailMsg);
1858 if(eWLAN_PAL_STATUS_SUCCESS != status)
1859 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001860 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1861 "dxeRXPacketAvailableCB serialize fail");
1862 }
1863
1864 return;
1865}
1866
1867/*==========================================================================
1868 @ Function Name
1869 dxeRXFrameSingleBufferAlloc
1870
1871 @ Description
1872 Allocate Platform packet buffer to prepare RX frame
1873 RX frame memory space must be pre allocted and must be asigned to
1874 descriptor
1875 then whenever DMA engine want to tranfer frame from BMU,
1876 buffer must be ready
1877
1878 @ Parameters
1879 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1880 DXE host driver main control block
1881 WLANDXE_ChannelCBType *channelEntry
1882 Channel specific control block
1883 WLANDXE_DescCtrlBlkType currentCtrlBlock
1884 current control block which have to be asigned
1885 frame buffer
1886
1887 @ Return
1888 wpt_status
1889
1890===========================================================================*/
1891static wpt_status dxeRXFrameSingleBufferAlloc
1892(
1893 WLANDXE_CtrlBlkType *dxeCtxt,
1894 WLANDXE_ChannelCBType *channelEntry,
1895 WLANDXE_DescCtrlBlkType *currentCtrlBlock
1896)
1897{
1898 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1899 wpt_packet *currentPalPacketBuffer = NULL;
1900 WLANDXE_DescType *currentDesc = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001901 wpt_iterator iterator;
1902 wpt_uint32 allocatedSize = 0;
1903 void *physAddress = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001904
1905 currentDesc = currentCtrlBlock->linkedDesc;
1906
Leo Chang7e05f212013-07-01 19:54:15 -07001907 if(currentDesc->descCtrl.valid)
1908 {
1909 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1910 "This Descriptor is valid, Do not refill");
1911 return eWLAN_PAL_STATUS_E_EXISTS;
1912 }
1913
Jeff Johnson295189b2012-06-20 16:38:30 -07001914 /* First check if a packet pointer has already been provided by a previously
1915 invoked Rx packet available callback. If so use that packet. */
1916 if(dxeCtxt->rxPalPacketUnavailable && (NULL != dxeCtxt->freeRXPacket))
1917 {
1918 currentPalPacketBuffer = dxeCtxt->freeRXPacket;
1919 dxeCtxt->rxPalPacketUnavailable = eWLAN_PAL_FALSE;
1920 dxeCtxt->freeRXPacket = NULL;
Mihir Sheted183cef2014-09-26 19:17:56 +05301921
1922 if (channelEntry->doneIntDisabled)
1923 {
1924 wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr,
1925 channelEntry->extraConfig.chan_mask);
1926 channelEntry->doneIntDisabled = 0;
1927 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001928 }
1929 else if(!dxeCtxt->rxPalPacketUnavailable)
1930 {
Leo Chang72cdfd32013-10-17 20:36:30 -07001931 /* Allocate platform Packet buffer and OS Frame Buffer at here */
1932 currentPalPacketBuffer = wpalPacketAlloc(eWLAN_PAL_PKT_TYPE_RX_RAW,
Jeff Johnson295189b2012-06-20 16:38:30 -07001933 WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE,
1934 dxeRXPacketAvailableCB,
1935 (void *)dxeCtxt);
1936
1937 if(NULL == currentPalPacketBuffer)
1938 {
1939 dxeCtxt->rxPalPacketUnavailable = eWLAN_PAL_TRUE;
Mihir Shete44547fb2014-03-10 14:15:42 +05301940#ifdef WLAN_DXE_LOW_RESOURCE_TIMER
Leo Chang72cdfd32013-10-17 20:36:30 -07001941 /* Out of RX free buffer,
1942 * Start timer to recover from RX dead end */
1943 if(VOS_TIMER_STATE_RUNNING !=
1944 wpalTimerGetCurStatus(&dxeCtxt->rxResourceAvailableTimer))
1945 {
1946 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
1947 "RX Low resource, wait available resource");
1948 wpalTimerStart(&dxeCtxt->rxResourceAvailableTimer,
Katya Nigama6fbf662015-03-17 18:35:47 +05301949 wpalGetDxeReplenishRXTimerVal());
Leo Chang72cdfd32013-10-17 20:36:30 -07001950 }
Mihir Shete44547fb2014-03-10 14:15:42 +05301951#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001952 }
1953 }
1954
1955 if(NULL == currentPalPacketBuffer)
1956 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001957 return eWLAN_PAL_STATUS_E_RESOURCES;
1958 }
1959
1960 currentCtrlBlock->xfrFrame = currentPalPacketBuffer;
1961 currentPalPacketBuffer->pktType = eWLAN_PAL_PKT_TYPE_RX_RAW;
1962 currentPalPacketBuffer->pBD = NULL;
1963 currentPalPacketBuffer->pBDPhys = NULL;
1964 currentPalPacketBuffer->BDLength = 0;
Mihir Shete5affadc2015-05-29 20:54:57 +05301965
1966 if (channelEntry->channelType == WDTS_CHANNEL_RX_FW_LOG)
1967 wpalPacketRawTrimHead(currentCtrlBlock->xfrFrame, WLANDXE_H2H_HEADER_OFFSET);
1968
Jeff Johnson295189b2012-06-20 16:38:30 -07001969 status = wpalLockPacketForTransfer(currentPalPacketBuffer);
Mihir Shetebc338242015-03-04 15:34:19 +05301970
Jeff Johnson295189b2012-06-20 16:38:30 -07001971 if(eWLAN_PAL_STATUS_SUCCESS != status)
1972 {
1973 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1974 "dxeRXFrameBufferAlloc unable to lock packet");
1975 return status;
1976 }
1977
1978 /* Init iterator to get physical os buffer address */
1979 status = wpalIteratorInit(&iterator, currentPalPacketBuffer);
1980 if(eWLAN_PAL_STATUS_SUCCESS != status)
1981 {
1982 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1983 "dxeRXFrameBufferAlloc iterator init fail");
1984 return status;
1985 }
1986 status = wpalIteratorNext(&iterator,
1987 currentPalPacketBuffer,
1988 &physAddress,
1989 &allocatedSize);
1990 if(eWLAN_PAL_STATUS_SUCCESS != status)
1991 {
1992 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1993 "dxeRXFrameBufferAlloc iterator Get Next pointer fail");
1994 return status;
1995 }
1996 currentPalPacketBuffer->pBDPhys = physAddress;
Jeff Johnson295189b2012-06-20 16:38:30 -07001997
1998 /* DXE descriptor must have SWAPPED addres in it's structure
1999 * !!! SWAPPED !!! */
2000 currentDesc->dxedesc.dxe_short_desc.dstMemAddrL =
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05302001 WLANDXE_U32_SWAP_ENDIAN((wpt_uint32)(uintptr_t)currentPalPacketBuffer->pBDPhys);
Jeff Johnson295189b2012-06-20 16:38:30 -07002002
Jeff Johnson295189b2012-06-20 16:38:30 -07002003 return status;
2004}
2005
2006/*==========================================================================
2007 @ Function Name
2008 dxeRXFrameRefillRing
2009
2010 @ Description
2011 Allocate Platform packet buffers to try to fill up the DXE Rx ring
2012
2013 @ Parameters
2014 WLANDXE_CtrlBlkType *dxeCtrlBlk,
2015 DXE host driver main control block
2016 WLANDXE_ChannelCBType *channelEntry
2017 Channel specific control block
2018
2019 @ Return
2020 wpt_status
2021
2022===========================================================================*/
2023static wpt_status dxeRXFrameRefillRing
2024(
2025 WLANDXE_CtrlBlkType *dxeCtxt,
2026 WLANDXE_ChannelCBType *channelEntry
2027)
2028{
2029 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
2030 WLANDXE_DescCtrlBlkType *currentCtrlBlk = channelEntry->tailCtrlBlk;
2031 WLANDXE_DescType *currentDesc = NULL;
2032
2033 while(channelEntry->numFreeDesc > 0)
2034 {
2035 /* Current Control block is free
2036 * and associated frame buffer is not linked with control block anymore
2037 * allocate new frame buffer for current control block */
2038 status = dxeRXFrameSingleBufferAlloc(dxeCtxt,
2039 channelEntry,
2040 currentCtrlBlk);
2041
Leo Chang7e05f212013-07-01 19:54:15 -07002042 if((eWLAN_PAL_STATUS_SUCCESS != status) &&
2043 (eWLAN_PAL_STATUS_E_EXISTS != status))
Jeff Johnson295189b2012-06-20 16:38:30 -07002044 {
2045 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
2046 "dxeRXFrameRefillRing, out of RX buffer pool, break here");
2047 break;
2048 }
2049
Leo Chang7e05f212013-07-01 19:54:15 -07002050 if(eWLAN_PAL_STATUS_E_EXISTS == status)
2051 {
2052 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2053 "dxeRXFrameRefillRing, Descriptor Non-Empry");
2054 }
2055
Jeff Johnson295189b2012-06-20 16:38:30 -07002056 currentDesc = currentCtrlBlk->linkedDesc;
2057 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_read;
2058
2059 /* Issue a dummy read from the DXE descriptor DDR location to ensure
2060 that any posted writes are reflected in memory before DXE looks at
2061 the descriptor. */
2062 if(channelEntry->extraConfig.cw_ctrl_read != currentDesc->descCtrl.ctrl)
2063 {
Karthick S3254c5d2015-04-28 15:06:17 +05302064 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2065 "dxeRXFrameRefillRing, Descriptor write failed");
2066 ++channelEntry->desc_write_fail_count;
Jeff Johnson295189b2012-06-20 16:38:30 -07002067 //HDXE_ASSERT(0);
2068 }
2069
2070 /* Kick off the DXE ring, if not in any power save mode */
Leo Chang094ece82013-04-23 17:57:41 -07002071 if(WLANDXE_POWER_STATE_FULL == dxeCtxt->hostPowerState)
Jeff Johnson295189b2012-06-20 16:38:30 -07002072 {
2073 wpalWriteRegister(WALNDEX_DMA_ENCH_ADDRESS,
2074 1 << channelEntry->assignedDMAChannel);
2075 }
2076 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
Leo Chang7e05f212013-07-01 19:54:15 -07002077 if(eWLAN_PAL_STATUS_E_EXISTS != status)
2078 {
2079 --channelEntry->numFreeDesc;
2080 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002081 }
2082
2083 channelEntry->tailCtrlBlk = currentCtrlBlk;
2084
2085 return status;
2086}
2087
Mihir Shete5affadc2015-05-29 20:54:57 +05302088static wpt_uint32 dxeRXLogRefillRing
2089(
2090 WLANDXE_CtrlBlkType *dxeCtxt,
2091 WLANDXE_ChannelCBType *channelEntry,
2092 wpt_uint64 bufferAddr,
2093 wpt_uint32 bufferLen
2094)
2095{
2096 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
2097 WLANDXE_DescCtrlBlkType *currentCtrlBlk = channelEntry->tailCtrlBlk;
2098 WLANDXE_DescType *currentDesc = NULL;
2099 wpt_uint32 xfrSize, allocatedLen = 0;
2100
2101 while(bufferLen > 0)
2102 {
2103 /* Current Control block is free
2104 * and associated frame buffer is not linked with control block anymore
2105 * allocate new frame buffer for current control block */
2106 status = dxeRXFrameSingleBufferAlloc(dxeCtxt,
2107 channelEntry,
2108 currentCtrlBlk);
2109
2110 if((eWLAN_PAL_STATUS_SUCCESS != status))
2111 {
2112 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
2113 "%s, out of RX buffer pool, break here",__func__);
2114 break;
2115 }
2116
2117 if(eWLAN_PAL_STATUS_E_EXISTS == status)
2118 {
2119 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2120 "%s, Descriptor Non-Empty",__func__);
2121 }
2122
2123 currentDesc = currentCtrlBlk->linkedDesc;
2124 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_read;
2125 xfrSize = WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE > bufferLen ?
2126 bufferLen : WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE;
2127 currentDesc->xfrSize = xfrSize;
2128 allocatedLen += xfrSize;
2129 bufferLen -= xfrSize;
2130 wpalPacketSetRxLength(currentCtrlBlk->xfrFrame,
2131 xfrSize);
2132
2133 currentDesc->dxedesc.dxe_short_desc.srcMemAddrL =
2134 WLANDXE_U32_SWAP_ENDIAN((wpt_uint32)(uintptr_t)bufferAddr);
2135
2136 /* Issue a dummy read from the DXE descriptor DDR location to ensure
2137 that any posted writes are reflected in memory before DXE looks at
2138 the descriptor. */
2139 if(channelEntry->extraConfig.cw_ctrl_read != currentDesc->descCtrl.ctrl)
2140 {
2141 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2142 "%s, Descriptor write failed",__func__);
2143 ++channelEntry->desc_write_fail_count;
2144 }
2145
2146 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
2147 --channelEntry->numFreeDesc;
2148 bufferAddr += xfrSize;
2149 }
2150
2151 channelEntry->tailCtrlBlk = currentCtrlBlk;
2152
2153 return allocatedLen;
2154}
Jeff Johnson295189b2012-06-20 16:38:30 -07002155/*==========================================================================
Jeff Johnsone7245742012-09-05 17:12:55 -07002156 @ Function Name
2157 dxeRXFrameRouteUpperLayer
2158
2159 @ Description
2160 Test DXE descriptors and if any RX frame pending within RING,
2161 Route to upper layer
2162
2163 @ Parameters
2164 WLANDXE_CtrlBlkType *dxeCtrlBlk,
2165 DXE host driver main control block
2166 WLANDXE_ChannelCBType *channelEntry
2167 Channel specific control block
2168 @ Return
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002169 < 0 Any error happen
Jeff Johnsone7245742012-09-05 17:12:55 -07002170 0 No frame pulled from RX RING
2171 int number of RX frames pulled from RX ring
2172
2173===========================================================================*/
2174static wpt_int32 dxeRXFrameRouteUpperLayer
2175(
2176 WLANDXE_CtrlBlkType *dxeCtxt,
2177 WLANDXE_ChannelCBType *channelEntry
2178)
2179{
2180 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
2181 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
2182 WLANDXE_DescType *currentDesc = NULL;
2183 wpt_uint32 descCtrl, frameCount = 0, i;
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002184 wpt_int32 ret_val = -1;
Jeff Johnsone7245742012-09-05 17:12:55 -07002185
2186 currentCtrlBlk = channelEntry->headCtrlBlk;
2187 currentDesc = currentCtrlBlk->linkedDesc;
2188
2189 /* Descriptoe should be SWAPPED ???? */
2190 descCtrl = currentDesc->descCtrl.ctrl;
2191
2192 /* Get frames while VALID bit is not set (DMA complete) and a data
2193 * associated with it */
2194 while(!(WLANDXE_U32_SWAP_ENDIAN(descCtrl) & WLANDXE_DESC_CTRL_VALID) &&
2195 (eWLAN_PAL_STATUS_SUCCESS == wpalIsPacketLocked(currentCtrlBlk->xfrFrame)) &&
2196 (currentCtrlBlk->xfrFrame->pInternalData != NULL) &&
2197 (frameCount < WLANDXE_MAX_REAPED_RX_FRAMES) )
2198 {
2199 channelEntry->numTotalFrame++;
2200 channelEntry->numFreeDesc++;
Jeff Johnsone7245742012-09-05 17:12:55 -07002201 status = wpalUnlockPacket(currentCtrlBlk->xfrFrame);
Mihir Shetebc338242015-03-04 15:34:19 +05302202
Jeff Johnsone7245742012-09-05 17:12:55 -07002203 if (eWLAN_PAL_STATUS_SUCCESS != status)
2204 {
2205 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2206 "dxeRXFrameReady unable to unlock packet");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002207 return ret_val;
Jeff Johnsone7245742012-09-05 17:12:55 -07002208 }
Mihir Shetebc338242015-03-04 15:34:19 +05302209
Jeff Johnsone7245742012-09-05 17:12:55 -07002210 /* This Descriptor is valid, so linked Control block is also valid
2211 * Linked Control block has pre allocated packet buffer
2212 * So, just let upper layer knows preallocated frame pointer will be OK */
2213 /* Reap Rx frames */
2214 rx_reaped_buf[frameCount] = currentCtrlBlk->xfrFrame;
2215 frameCount++;
Madan Mohan Koyyalamudi0c325532012-09-24 13:24:42 -07002216 currentCtrlBlk->xfrFrame = NULL;
Jeff Johnsone7245742012-09-05 17:12:55 -07002217
2218 /* Now try to refill the ring with empty Rx buffers to keep DXE busy */
Mihir Shete5affadc2015-05-29 20:54:57 +05302219 if (WDTS_CHANNEL_RX_FW_LOG != channelEntry->channelType)
2220 dxeRXFrameRefillRing(dxeCtxt, channelEntry);
Jeff Johnsone7245742012-09-05 17:12:55 -07002221
2222 /* Test next contorl block
2223 * if valid, this control block also has new RX frame must be handled */
2224 currentCtrlBlk = (WLANDXE_DescCtrlBlkType *)currentCtrlBlk->nextCtrlBlk;
2225 currentDesc = currentCtrlBlk->linkedDesc;
2226 descCtrl = currentDesc->descCtrl.ctrl;
2227 }
2228
2229 /* Update head control block
2230 * current control block's valid bit was 0
2231 * next trial first control block must be current control block */
2232 channelEntry->headCtrlBlk = currentCtrlBlk;
2233
2234 /* Deliver all the reaped RX frames to upper layers */
2235 i = 0;
Leo Changd6de1c22013-03-21 15:42:41 -07002236 while(i < frameCount)
2237 {
Jeff Johnsone7245742012-09-05 17:12:55 -07002238 dxeCtxt->rxReadyCB(dxeCtxt->clientCtxt, rx_reaped_buf[i], channelEntry->channelType);
2239 i++;
2240 }
2241
2242 return frameCount;
2243}
2244
2245/*==========================================================================
Jeff Johnson295189b2012-06-20 16:38:30 -07002246 @ Function Name
2247 dxeRXFrameReady
2248
2249 @ Description
2250 Pop frame from descriptor and route frame to upper transport layer
2251 Assign new platform packet buffer into used descriptor
2252 Actual frame pop and resource realloc
2253
2254 @ Parameters
2255 WLANDXE_CtrlBlkType *dxeCtrlBlk,
2256 DXE host driver main control block
2257 WLANDXE_ChannelCBType *channelEntry
2258 Channel specific control block
2259
2260 @ Return
2261 wpt_status
2262
2263===========================================================================*/
2264static wpt_status dxeRXFrameReady
2265(
2266 WLANDXE_CtrlBlkType *dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002267 WLANDXE_ChannelCBType *channelEntry,
2268 wpt_uint32 chStat
Jeff Johnson295189b2012-06-20 16:38:30 -07002269)
2270{
2271 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
2272 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
2273 WLANDXE_DescType *currentDesc = NULL;
2274 wpt_uint32 descCtrl;
Jeff Johnsone7245742012-09-05 17:12:55 -07002275 wpt_int32 frameCount = 0;
2276
2277 wpt_uint32 descLoop;
2278 wpt_uint32 invalidatedFound = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07002279
2280 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002281 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002282
2283 /* Sanity Check */
2284 if((NULL == dxeCtxt) || (NULL == channelEntry))
2285 {
2286 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2287 "dxeRXFrameReady Channel Entry is not valid");
2288 return eWLAN_PAL_STATUS_E_INVAL;
2289 }
2290
Jeff Johnsone7245742012-09-05 17:12:55 -07002291 frameCount = dxeRXFrameRouteUpperLayer(dxeCtxt, channelEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -07002292
Jeff Johnsone7245742012-09-05 17:12:55 -07002293 if(0 > frameCount)
Leo Changd6de1c22013-03-21 15:42:41 -07002294 {
2295 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Jeff Johnsone7245742012-09-05 17:12:55 -07002296 "dxeRXFrameReady RX frame route fail");
Leo Changd6de1c22013-03-21 15:42:41 -07002297 return eWLAN_PAL_STATUS_E_INVAL;
2298 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002299
Leo Changd6de1c22013-03-21 15:42:41 -07002300 if((0 == frameCount) &&
Jeff Johnsone7245742012-09-05 17:12:55 -07002301 ((WLANDXE_POWER_STATE_BMPS == dxeCtxt->hostPowerState) ||
2302 (WLANDXE_POWER_STATE_FULL == dxeCtxt->hostPowerState)))
2303 {
Leo Changd6de1c22013-03-21 15:42:41 -07002304 /* None of the frame handled and CH is not enabled
2305 * RX CH wrap around happen and No RX free frame
2306 * RX side should wait till new free frame available in the pool
2307 * Do not try reload driver at here*/
2308 if(!(chStat & WLANDXE_CH_CTRL_EN_MASK))
2309 {
Leo Changbbf86b72013-06-19 16:13:00 -07002310 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Leo Changd6de1c22013-03-21 15:42:41 -07002311 "dxeRXFrameReady %s RING Wrapped, RX Free Low 0x%x",
2312 channelType[channelEntry->channelType], chStat);
Leo Chang3714c922013-07-10 20:33:30 -07002313 /* This is not empty interrupt case
2314 * If handle this as empty interrupt, false SSR might be issued
2315 * Frame count '1' is dummy frame count to avoid SSR */
2316 channelEntry->numFragmentCurrentChain = 1;
Leo Changd6de1c22013-03-21 15:42:41 -07002317 return eWLAN_PAL_STATUS_SUCCESS;
2318 }
2319
Jeff Johnsone7245742012-09-05 17:12:55 -07002320 currentCtrlBlk = channelEntry->headCtrlBlk;
Jeff Johnson295189b2012-06-20 16:38:30 -07002321 currentDesc = currentCtrlBlk->linkedDesc;
2322 descCtrl = currentDesc->descCtrl.ctrl;
Jeff Johnsone7245742012-09-05 17:12:55 -07002323
2324 if(WLANDXE_POWER_STATE_BMPS != dxeCtxt->hostPowerState)
2325 {
2326 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
2327 "RX ISR called but no frame handled PWS %d, channel %s",
2328 (int)dxeCtxt->hostPowerState,
2329 channelType[channelEntry->channelType]);
2330 }
2331
2332 /* Current interupt empty and previous interrupt also empty
2333 * detected successive empty interrupt
2334 * or first interrupt empty, this should not happen */
2335 if(0 == channelEntry->numFragmentCurrentChain)
2336 {
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07002337 dxeChannelMonitor("RX Ready", channelEntry, NULL);
2338 dxeDescriptorDump(channelEntry, channelEntry->headCtrlBlk->linkedDesc, 0);
2339 dxeChannelRegisterDump(channelEntry, "RX successive empty interrupt", NULL);
2340 dxeChannelAllDescDump(channelEntry, channelEntry->channelType, NULL);
Jeff Johnsone7245742012-09-05 17:12:55 -07002341 /* Abnormal interrupt detected, try to find not validated descriptor */
2342 for(descLoop = 0; descLoop < channelEntry->numDesc; descLoop++)
2343 {
2344 if(!(WLANDXE_U32_SWAP_ENDIAN(descCtrl) & WLANDXE_DESC_CTRL_VALID))
2345 {
Leo Chang416afe02013-07-01 13:58:13 -07002346 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Jeff Johnsone7245742012-09-05 17:12:55 -07002347 "Found Invalidated Descriptor %d", (int)descLoop);
2348 if(eWLAN_PAL_STATUS_SUCCESS == wpalIsPacketLocked(currentCtrlBlk->xfrFrame))
2349 {
Leo Chang416afe02013-07-01 13:58:13 -07002350 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Jeff Johnsone7245742012-09-05 17:12:55 -07002351 "Packet locked, Resync Host and HW");
2352 channelEntry->headCtrlBlk = currentCtrlBlk;
2353 invalidatedFound = 1;
2354 break;
2355 }
2356 else
2357 {
Leo Chang416afe02013-07-01 13:58:13 -07002358 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Jeff Johnsone7245742012-09-05 17:12:55 -07002359 "Packet Not Locked, cannot transfer frame");
2360 }
2361 }
2362 currentCtrlBlk = (WLANDXE_DescCtrlBlkType *)currentCtrlBlk->nextCtrlBlk;
2363 currentDesc = currentCtrlBlk->linkedDesc;
2364 descCtrl = currentDesc->descCtrl.ctrl;
2365 }
2366
Jeff Johnson32d95a32012-09-10 13:15:23 -07002367 /* Invalidated descriptor found, and that is not head descriptor
2368 * This means HW/SW descriptor miss match happen, and we may recover with just resync
2369 * Try re-sync here */
2370 if((invalidatedFound) && (0 != descLoop))
Jeff Johnsone7245742012-09-05 17:12:55 -07002371 {
2372 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2373 "Found New Sync location with HW, handle frames from there");
2374 frameCount = dxeRXFrameRouteUpperLayer(dxeCtxt, channelEntry);
2375 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2376 "re-sync routed %d frames to upper layer", (int)frameCount);
Madan Mohan Koyyalamudi0c325532012-09-24 13:24:42 -07002377 channelEntry->numFragmentCurrentChain = frameCount;
Jeff Johnsone7245742012-09-05 17:12:55 -07002378 }
Jeff Johnson32d95a32012-09-10 13:15:23 -07002379 /* Successive Empty interrupt
2380 * But this case, first descriptor also invalidated, then it means head descriptor
2381 * is linked with already handled RX frame, then could not unlock RX frame
2382 * This is just Out of RX buffer pool, not need to anything here */
2383 else if((invalidatedFound) && (0 == descLoop))
2384 {
2385 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2386 "Out of RX Low resource, and INT came in, do nothing till get RX resource");
2387 }
2388 /* Critical error, reload driver */
Jeff Johnsone7245742012-09-05 17:12:55 -07002389 else
2390 {
2391 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2392 "Could not found invalidated descriptor");
2393 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2394 "RX successive empty interrupt, Could not find invalidated DESC reload driver");
2395 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
2396 wpalWlanReload();
Mihir Shetefdc9f532014-01-09 15:03:02 +05302397 dxeStartSSRTimer(dxeCtxt);
Jeff Johnsone7245742012-09-05 17:12:55 -07002398 }
2399 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002400 }
Madan Mohan Koyyalamudi6646aad2012-09-24 14:10:39 -07002401 channelEntry->numFragmentCurrentChain = frameCount;
Jeff Johnson295189b2012-06-20 16:38:30 -07002402 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002403 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002404 return status;
2405}
2406
2407/*==========================================================================
2408 @ Function Name
2409 dxeNotifySmsm
2410
2411 @ Description: Notify SMSM to start DXE engine and/or condition of Tx ring
2412 buffer
2413
2414 @ Parameters
2415
2416 @ Return
2417 wpt_status
2418
2419===========================================================================*/
2420static wpt_status dxeNotifySmsm
2421(
2422 wpt_boolean kickDxe,
2423 wpt_boolean ringEmpty
2424)
2425{
2426 wpt_uint32 clrSt = 0;
2427 wpt_uint32 setSt = 0;
2428
2429 if(kickDxe)
2430 {
2431 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, "Kick off DXE");
2432
2433 if(tempDxeCtrlBlk->lastKickOffDxe == 0)
2434 {
2435 setSt |= WPAL_SMSM_WLAN_TX_ENABLE;
2436 tempDxeCtrlBlk->lastKickOffDxe = 1;
2437 }
2438 else if(tempDxeCtrlBlk->lastKickOffDxe == 1)
2439 {
2440 clrSt |= WPAL_SMSM_WLAN_TX_ENABLE;
2441 tempDxeCtrlBlk->lastKickOffDxe = 0;
2442 }
2443 else
2444 {
2445 HDXE_ASSERT(0);
2446 }
2447 }
2448 else
2449 {
2450 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, "no need to kick off DXE");
2451 }
2452
Mihir Shete68ed77a2014-10-10 10:47:12 +05302453 tempDxeCtrlBlk->txRingsEmpty = ringEmpty;
Jeff Johnson295189b2012-06-20 16:38:30 -07002454 if(ringEmpty)
2455 {
2456 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, "SMSM Tx Ring Empty");
2457 clrSt |= WPAL_SMSM_WLAN_TX_RINGS_EMPTY;
2458 }
2459 else
2460 {
2461 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, "SMSM Tx Ring Not Empty");
2462 setSt |= WPAL_SMSM_WLAN_TX_RINGS_EMPTY;
2463 }
2464
2465 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH, "C%x S%x", clrSt, setSt);
2466
2467 wpalNotifySmsm(clrSt, setSt);
2468
2469 return eWLAN_PAL_STATUS_SUCCESS;
2470}
2471
2472/*==========================================================================
2473 @ Function Name
2474 dxePsComplete
2475
2476 @ Description: Utility function to check the resv desc to deside if we can
2477 get into Power Save mode now
2478
2479 @ Parameters
2480
2481 @ Return
2482 None
2483
2484===========================================================================*/
2485static void dxePsComplete(WLANDXE_CtrlBlkType *dxeCtxt, wpt_boolean intr_based)
2486{
2487 if( dxeCtxt->hostPowerState == WLANDXE_POWER_STATE_FULL )
2488 {
2489 return;
2490 }
2491
2492 //if both HIGH & LOW Tx channels don't have anything on resv desc,all Tx pkts
2493 //must have been consumed by RIVA, OK to get into BMPS
2494 if((0 == dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc) &&
2495 (0 == dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc))
2496 {
2497 tempDxeCtrlBlk->ringNotEmpty = eWLAN_PAL_FALSE;
2498 //if host is in BMPS & no pkt to Tx, RIVA can go to power save
2499 if(WLANDXE_POWER_STATE_BMPS == dxeCtxt->hostPowerState)
2500 {
2501 dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN;
2502 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
2503 }
2504 }
2505 else //still more pkts to be served by RIVA
2506 {
2507 tempDxeCtrlBlk->ringNotEmpty = eWLAN_PAL_TRUE;
2508
2509 switch(dxeCtxt->rivaPowerState)
2510 {
2511 case WLANDXE_RIVA_POWER_STATE_ACTIVE:
2512 //NOP
2513 break;
2514 case WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN:
2515 if(intr_based)
2516 {
2517 dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_ACTIVE;
2518 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
2519 }
2520 break;
2521 default:
2522 //assert
2523 break;
2524 }
2525 }
2526}
2527
2528/*==========================================================================
2529 @ Function Name
2530 dxeRXEventHandler
2531
2532 @ Description
2533 Handle serailized RX frame ready event
2534 First disable interrupt then pick up frame from pre allocated buffer
2535 Since frame handle is doen, clear interrupt bit to ready next interrupt
2536 Finally re enable interrupt
2537
2538 @ Parameters
2539 wpt_msg *rxReadyMsg
2540 RX frame ready MSG pointer
2541 include DXE control context
2542
2543 @ Return
2544 NONE
2545
2546===========================================================================*/
2547void dxeRXEventHandler
2548(
2549 wpt_msg *rxReadyMsg
2550)
2551{
2552 wpt_msg *msgContent = (wpt_msg *)rxReadyMsg;
2553 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
2554 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
2555 wpt_uint32 intSrc = 0;
2556 WLANDXE_ChannelCBType *channelCb = NULL;
Jeff Johnsone7245742012-09-05 17:12:55 -07002557 wpt_uint32 chHighStat = 0;
2558 wpt_uint32 chLowStat = 0;
Mihir Shetee6618162015-03-16 14:48:42 +05302559 wpt_uint32 chLogRxStat = 0;
Mihir Shetec4093f92015-05-28 15:21:11 +05302560 wpt_uint32 chLogRxFwStat = 0;
Mihir Shetef2000552014-05-12 16:21:34 +05302561 wpt_uint32 regValue, chanMask;
Jeff Johnson295189b2012-06-20 16:38:30 -07002562
Jeff Johnsone7245742012-09-05 17:12:55 -07002563 dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07002564
Jeff Johnsone7245742012-09-05 17:12:55 -07002565 if(eWLAN_PAL_TRUE == dxeCtxt->driverReloadInProcessing)
Jeff Johnson295189b2012-06-20 16:38:30 -07002566 {
2567 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Jeff Johnsone7245742012-09-05 17:12:55 -07002568 "RX Ready WLAN Driver re-loading in progress");
Jeff Johnson32d95a32012-09-10 13:15:23 -07002569 return;
Jeff Johnson295189b2012-06-20 16:38:30 -07002570 }
2571
Jeff Johnsone7245742012-09-05 17:12:55 -07002572 /* Now try to refill the ring with empty Rx buffers to keep DXE busy */
2573 dxeRXFrameRefillRing(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI]);
2574 dxeRXFrameRefillRing(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI]);
Mihir Shetee6618162015-03-16 14:48:42 +05302575 if (WLANDXE_IS_VALID_CHANNEL(WDTS_CHANNEL_RX_LOG))
2576 dxeRXFrameRefillRing(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG]);
Jeff Johnsone7245742012-09-05 17:12:55 -07002577
Jeff Johnson295189b2012-06-20 16:38:30 -07002578 dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
2579
2580 if((!dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].extraConfig.chEnabled) ||
Mihir Shetee6618162015-03-16 14:48:42 +05302581 (!dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].extraConfig.chEnabled) ||
2582 (WLANDXE_IS_VALID_CHANNEL(WDTS_CHANNEL_RX_LOG) &&
2583 !dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG].extraConfig.chEnabled))
Jeff Johnson295189b2012-06-20 16:38:30 -07002584 {
2585 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2586 "DXE already stopped in RX event handler. Just return");
2587 return;
2588 }
2589
2590 if((WLANDXE_POWER_STATE_IMPS == dxeCtxt->hostPowerState) ||
2591 (WLANDXE_POWER_STATE_DOWN == dxeCtxt->hostPowerState))
2592 {
Mihir Shetec4093f92015-05-28 15:21:11 +05302593 if (WLANDXE_POWER_STATE_IMPS == dxeCtxt->hostPowerState)
2594 {
2595 status = wpalReadRegister(WLANDXE_INT_SRC_RAW_ADDRESS,
2596 &intSrc);
2597 if(eWLAN_PAL_STATUS_SUCCESS != status || 0 == intSrc)
2598 {
2599 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2600 "%s: Read status: %d, regVal: %d",
2601 __func__, status, intSrc);
2602 }
2603 else
2604 {
2605 /* Register Read was succesful and we have a valid interrupt
2606 * source, so WCN is not power collapsed yet and it should
2607 * not power collapse till we set the synchronization bit
2608 * at the end of this function, safe to pull frames...
2609 */
2610 goto pull_frames;
2611 }
2612 }
2613
Jeff Johnson295189b2012-06-20 16:38:30 -07002614 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
2615 "%s Riva is in %d, Just Pull frames without any register touch ",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002616 __func__, dxeCtxt->hostPowerState);
Jeff Johnson295189b2012-06-20 16:38:30 -07002617
2618 /* Not to touch any register, just pull frame directly from chain ring
2619 * First high priority */
2620 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI];
2621 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002622 channelCb,
2623 chHighStat);
Jeff Johnson295189b2012-06-20 16:38:30 -07002624 if(eWLAN_PAL_STATUS_SUCCESS != status)
2625 {
2626 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2627 "dxeRXEventHandler Pull from RX high channel fail");
2628 }
Leo Chang46f36162014-01-14 21:47:24 -08002629 /* In case FW could not power collapse in IMPS mode
2630 * Next power restore might have empty interrupt
2631 * If IMPS mode has empty interrupt since RX thread race,
2632 * Invalid re-load driver might happen
2633 * To prevent invalid re-load driver,
2634 * IMPS event handler set dummpy frame count */
2635 channelCb->numFragmentCurrentChain = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07002636
2637 /* Second low priority */
2638 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI];
2639 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002640 channelCb,
2641 chLowStat);
Jeff Johnson295189b2012-06-20 16:38:30 -07002642 if(eWLAN_PAL_STATUS_SUCCESS != status)
2643 {
2644 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Mihir Shetee6618162015-03-16 14:48:42 +05302645 "dxeRXEventHandler Pull from RX low channel fail");
Jeff Johnson295189b2012-06-20 16:38:30 -07002646 }
Leo Chang46f36162014-01-14 21:47:24 -08002647 /* LOW Priority CH same above */
2648 channelCb->numFragmentCurrentChain = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07002649
Mihir Shetee6618162015-03-16 14:48:42 +05302650 if (WLANDXE_IS_VALID_CHANNEL(WDTS_CHANNEL_RX_LOG))
2651 {
2652 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG];
2653 status = dxeRXFrameReady(dxeCtxt,
2654 channelCb,
2655 chLogRxStat);
2656 if(eWLAN_PAL_STATUS_SUCCESS != status)
2657 {
2658 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2659 "dxeRXEventHandler Pull from RX log channel fail");
2660 }
2661 channelCb->numFragmentCurrentChain = 1;
2662 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002663 /* Interrupt will not enabled at here, it will be enabled at PS mode change */
2664 tempDxeCtrlBlk->rxIntDisabledByIMPS = eWLAN_PAL_TRUE;
2665
2666 return;
2667 }
2668
2669 /* Disable device interrupt */
2670 /* Read whole interrupt mask register and exclusive only this channel int */
2671 status = wpalReadRegister(WLANDXE_INT_SRC_RAW_ADDRESS,
2672 &intSrc);
2673 if(eWLAN_PAL_STATUS_SUCCESS != status)
2674 {
2675 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2676 "dxeRXEventHandler Read INT_SRC register fail");
2677 return;
2678 }
2679 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED,
2680 "RX Event Handler INT Source 0x%x", intSrc);
2681
Mihir Shetec4093f92015-05-28 15:21:11 +05302682pull_frames:
Jeff Johnson295189b2012-06-20 16:38:30 -07002683 /* Test High Priority Channel interrupt is enabled or not */
2684 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI];
2685 if(intSrc & (1 << channelCb->assignedDMAChannel))
2686 {
2687 status = dxeChannelCleanInt(channelCb, &chHighStat);
2688 if(eWLAN_PAL_STATUS_SUCCESS != status)
2689 {
2690 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2691 "dxeRXEventHandler INT Clean up fail");
2692 return;
2693 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002694 if(WLANDXE_CH_STAT_INT_ERR_MASK & chHighStat)
2695 {
2696 /* Error Happen during transaction, Handle it */
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08002697 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
2698 "%11s : 0x%x Error Reported, Reload Driver",
2699 channelType[channelCb->channelType], chHighStat);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05302700
Mihir Shetedfc33ec2014-10-15 13:14:38 +05302701 if (eWLAN_PAL_STATUS_SUCCESS != dxeErrHandler(channelCb, chHighStat))
2702 {
2703 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
2704 wpalWlanReload();
2705 dxeStartSSRTimer(dxeCtxt);
2706 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002707 }
Jeff Johnson32d95a32012-09-10 13:15:23 -07002708 else if((WLANDXE_CH_STAT_INT_DONE_MASK & chHighStat) ||
2709 (WLANDXE_CH_STAT_INT_ED_MASK & chHighStat))
Jeff Johnson295189b2012-06-20 16:38:30 -07002710 {
2711 /* Handle RX Ready for high priority channel */
2712 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002713 channelCb,
2714 chHighStat);
Jeff Johnson295189b2012-06-20 16:38:30 -07002715 }
2716 else if(WLANDXE_CH_STAT_MASKED_MASK & chHighStat)
2717 {
2718 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002719 channelCb,
2720 chHighStat);
Jeff Johnson295189b2012-06-20 16:38:30 -07002721 }
2722 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
2723 "RX HIGH CH EVNT STAT 0x%x, %d frames handled", chHighStat, channelCb->numFragmentCurrentChain);
Jeff Johnsone7245742012-09-05 17:12:55 -07002724 /* Update the Rx DONE histogram */
2725 channelCb->rxDoneHistogram = (channelCb->rxDoneHistogram << 1);
2726 if(WLANDXE_CH_STAT_INT_DONE_MASK & chHighStat)
2727 {
2728 channelCb->rxDoneHistogram |= 1;
2729 }
2730 else
2731 {
jagadeeshf869bba2015-04-07 20:06:21 +05302732 channelCb->rxDoneHistogram &= ~((wpt_uint64)1);
Jeff Johnsone7245742012-09-05 17:12:55 -07002733 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002734 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002735
2736 /* Test Low Priority Channel interrupt is enabled or not */
Jeff Johnsone7245742012-09-05 17:12:55 -07002737 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI];
Jeff Johnson295189b2012-06-20 16:38:30 -07002738 if(intSrc & (1 << channelCb->assignedDMAChannel))
2739 {
2740 status = dxeChannelCleanInt(channelCb, &chLowStat);
2741 if(eWLAN_PAL_STATUS_SUCCESS != status)
2742 {
2743 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2744 "dxeRXEventHandler INT Clean up fail");
2745 return;
2746 }
2747
2748 if(WLANDXE_CH_STAT_INT_ERR_MASK & chLowStat)
2749 {
2750 /* Error Happen during transaction, Handle it */
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08002751 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
2752 "%11s : 0x%x Error Reported, Reload Driver",
2753 channelType[channelCb->channelType], chLowStat);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05302754
Mihir Shetedfc33ec2014-10-15 13:14:38 +05302755 if (eWLAN_PAL_STATUS_SUCCESS !=
2756 dxeErrHandler(channelCb, chLowStat))
2757 {
2758 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
2759 wpalWlanReload();
2760 dxeStartSSRTimer(dxeCtxt);
2761 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002762 }
Mihir Shetef2000552014-05-12 16:21:34 +05302763 else if((WLANDXE_CH_STAT_INT_ED_MASK & chLowStat) ||
2764 (WLANDXE_CH_STAT_INT_DONE_MASK & chLowStat))
Jeff Johnson295189b2012-06-20 16:38:30 -07002765 {
2766 /* Handle RX Ready for low priority channel */
2767 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002768 channelCb,
2769 chLowStat);
Jeff Johnsone7245742012-09-05 17:12:55 -07002770 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002771
2772 /* Update the Rx DONE histogram */
2773 channelCb->rxDoneHistogram = (channelCb->rxDoneHistogram << 1);
2774 if(WLANDXE_CH_STAT_INT_DONE_MASK & chLowStat)
2775 {
2776 channelCb->rxDoneHistogram |= 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07002777 }
2778 else
2779 {
jagadeeshf869bba2015-04-07 20:06:21 +05302780 channelCb->rxDoneHistogram &= ~((wpt_uint64)1);
Jeff Johnson295189b2012-06-20 16:38:30 -07002781 }
2782 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
2783 "RX LOW CH EVNT STAT 0x%x, %d frames handled", chLowStat, channelCb->numFragmentCurrentChain);
2784 }
Mihir Shetee6618162015-03-16 14:48:42 +05302785
2786 if (WLANDXE_IS_VALID_CHANNEL(WDTS_CHANNEL_RX_LOG))
2787 {
2788 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG];
2789
2790 if(intSrc & (1 << channelCb->assignedDMAChannel))
2791 {
2792 status = dxeChannelCleanInt(channelCb,&chLogRxStat);
2793 if(eWLAN_PAL_STATUS_SUCCESS != status)
2794 {
2795 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2796 "dxeRXEventHandler INT Clean up fail");
2797 return;
2798 }
2799
2800 if(WLANDXE_CH_STAT_INT_ERR_MASK & chLogRxStat)
2801 {
2802 /* Error Happen during transaction, Handle it */
2803 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
2804 "%11s : 0x%x Error Reported, Reload Driver",
2805 channelType[channelCb->channelType], chLogRxStat);
2806
Mihir Shetedfc33ec2014-10-15 13:14:38 +05302807 if (eWLAN_PAL_STATUS_SUCCESS !=
2808 dxeErrHandler(channelCb, chLogRxStat))
2809 {
2810 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
2811 wpalWlanReload();
2812 dxeStartSSRTimer(dxeCtxt);
2813 }
Mihir Shetee6618162015-03-16 14:48:42 +05302814
Mihir Shetee6618162015-03-16 14:48:42 +05302815 }
2816 else if((WLANDXE_CH_STAT_INT_ED_MASK & chLogRxStat) ||
2817 (WLANDXE_CH_STAT_INT_DONE_MASK & chLogRxStat))
2818 {
2819 /* Handle RX Ready for low priority channel */
2820 status = dxeRXFrameReady(dxeCtxt,
2821 channelCb,
2822 chLogRxStat);
2823 }
2824
2825 /* Update the Rx DONE histogram */
2826 channelCb->rxDoneHistogram = (channelCb->rxDoneHistogram << 1);
2827 if(WLANDXE_CH_STAT_INT_DONE_MASK & chLogRxStat)
2828 {
2829 channelCb->rxDoneHistogram |= 1;
2830 }
2831 else
2832 {
2833 channelCb->rxDoneHistogram &= ~1;
2834 }
2835 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
2836 "RX LOG CH EVNT STAT 0x%x, %d frames handled", chLogRxStat, channelCb->numFragmentCurrentChain);
2837 }
2838 }
2839
Mihir Shetec4093f92015-05-28 15:21:11 +05302840 if (WLANDXE_IS_VALID_CHANNEL(WDTS_CHANNEL_RX_FW_LOG))
2841 {
2842 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_FW_LOG];
2843
2844 if(intSrc & (1 << channelCb->assignedDMAChannel))
2845 {
2846 status = dxeChannelCleanInt(channelCb,&chLogRxFwStat);
2847 if(eWLAN_PAL_STATUS_SUCCESS != status)
2848 {
2849 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2850 "dxeRXEventHandler INT Clean up fail");
2851 return;
2852 }
2853
2854 if(WLANDXE_CH_STAT_INT_ERR_MASK & chLogRxFwStat)
2855 {
2856 /* Error Happen during transaction, Handle it */
2857 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
2858 "%11s : 0x%x Error Reported, Reload Driver",
2859 channelType[channelCb->channelType], chLogRxFwStat);
2860
Mihir Shetedfc33ec2014-10-15 13:14:38 +05302861 if (eWLAN_PAL_STATUS_SUCCESS !=
2862 dxeErrHandler(channelCb, chLogRxFwStat))
2863 {
2864 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
2865 wpalWlanReload();
2866 dxeStartSSRTimer(dxeCtxt);
2867 }
Mihir Shetec4093f92015-05-28 15:21:11 +05302868
Mihir Shetec4093f92015-05-28 15:21:11 +05302869 }
2870 else if((WLANDXE_CH_STAT_INT_ED_MASK & chLogRxFwStat) ||
2871 (WLANDXE_CH_STAT_INT_DONE_MASK & chLogRxFwStat))
2872 {
2873 if (!dxeCtxt->hostInitiatedH2H)
2874 {
2875 dxeCtxt->receiveMbMsgCB(dxeCtxt->clientCtxt);
2876 }
2877 else
2878 {
2879 status = dxeRXFrameReady(dxeCtxt,
2880 channelCb,
2881 chLogRxFwStat);
Mihir Shete5affadc2015-05-29 20:54:57 +05302882 if (channelCb->numFreeDesc == channelCb->numDesc)
2883 {
Mihir Shete0b090bf2015-06-09 14:00:44 +05302884 /*
2885 * We have already cleared the interrupts before coming here,
2886 * but it can happen that DXE will copy some new packets after
2887 * that and raise interrupts for those. The packets will be
2888 * processed above but the interrupts will still be pending.
2889 * Its safe to clear those interrupts here because we have
2890 * pulled data from all the allocated descriptors.
2891 */
2892 dxeChannelCleanInt(channelCb,&chLogRxFwStat);
Mihir Shete5affadc2015-05-29 20:54:57 +05302893 dxeCtxt->hostInitiatedH2H = 0;
2894 dxeCtxt->receiveLogCompleteCB(dxeCtxt->clientCtxt);
2895 }
Mihir Shetec4093f92015-05-28 15:21:11 +05302896 }
2897 }
2898
2899 /* Update the Rx DONE histogram */
2900 channelCb->rxDoneHistogram = (channelCb->rxDoneHistogram << 1);
2901 if(WLANDXE_CH_STAT_INT_DONE_MASK & chLogRxFwStat)
2902 {
2903 channelCb->rxDoneHistogram |= 1;
2904 }
2905 else
2906 {
2907 channelCb->rxDoneHistogram &= ~1;
2908 }
2909 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
2910 "RX LOG CH EVNT STAT 0x%x, %d frames handled", chLogRxFwStat, channelCb->numFragmentCurrentChain);
2911 }
2912 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002913 if(eWLAN_PAL_STATUS_SUCCESS != status)
2914 {
2915 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2916 "dxeRXEventHandler Handle Frame Ready Fail");
2917 return;
2918 }
2919
Jeff Johnson295189b2012-06-20 16:38:30 -07002920 /* Prepare Control Register EN Channel */
2921 if(!(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].extraConfig.chan_mask & WLANDXE_CH_CTRL_EN_MASK))
2922 {
2923 HDXE_ASSERT(0);
2924 }
Mihir Shetef2000552014-05-12 16:21:34 +05302925
2926 if (dxeCtxt->rxPalPacketUnavailable &&
2927 (WLANDXE_CH_STAT_INT_DONE_MASK & chHighStat))
2928 {
2929 chanMask = dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].extraConfig.chan_mask &
2930 (~WLANDXE_CH_CTRL_INE_DONE_MASK);
Mihir Sheted183cef2014-09-26 19:17:56 +05302931 dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].doneIntDisabled = 1;
Mihir Shetef2000552014-05-12 16:21:34 +05302932 }
2933 else
2934 {
2935 chanMask = dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].extraConfig.chan_mask;
Mihir Sheted183cef2014-09-26 19:17:56 +05302936 dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].doneIntDisabled = 0;
Mihir Shetef2000552014-05-12 16:21:34 +05302937 }
Leo Chang094ece82013-04-23 17:57:41 -07002938 wpalWriteRegister(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].channelRegister.chDXECtrlRegAddr,
Mihir Shetef2000552014-05-12 16:21:34 +05302939 chanMask);
Jeff Johnson295189b2012-06-20 16:38:30 -07002940
2941 /* Prepare Control Register EN Channel */
2942 if(!(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].extraConfig.chan_mask & WLANDXE_CH_CTRL_EN_MASK))
2943 {
2944 HDXE_ASSERT(0);
2945 }
Leo Chang094ece82013-04-23 17:57:41 -07002946
Mihir Shetef2000552014-05-12 16:21:34 +05302947 if (dxeCtxt->rxPalPacketUnavailable &&
2948 (WLANDXE_CH_STAT_INT_DONE_MASK & chLowStat))
2949 {
2950 chanMask = dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].extraConfig.chan_mask &
2951 (~WLANDXE_CH_CTRL_INE_DONE_MASK);
Mihir Sheted183cef2014-09-26 19:17:56 +05302952 dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].doneIntDisabled = 1;
Mihir Shetef2000552014-05-12 16:21:34 +05302953 }
2954 else
2955 {
2956 chanMask = dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].extraConfig.chan_mask;
Mihir Sheted183cef2014-09-26 19:17:56 +05302957 dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].doneIntDisabled = 0;
Mihir Shetef2000552014-05-12 16:21:34 +05302958 }
Leo Chang094ece82013-04-23 17:57:41 -07002959 wpalWriteRegister(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].channelRegister.chDXECtrlRegAddr,
Mihir Shetef2000552014-05-12 16:21:34 +05302960 chanMask);
2961
Mihir Shetec01157f2015-06-18 14:13:34 +05302962 /* We do not have knowledge of firmare capabilities when the
2963 * RX_LOG channel is enabled. But when we get the first interrupt
2964 * we have all the required information. So if MGMT Logging is not
2965 * supported by the firmware, do not re-enable RX_LOG channel
2966 */
2967 if (WLANDXE_IS_VALID_CHANNEL(WDTS_CHANNEL_RX_LOG) && wpalIsFwLoggingSupported())
Mihir Shetee6618162015-03-16 14:48:42 +05302968 {
2969 if(!(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG].extraConfig.chan_mask & WLANDXE_CH_CTRL_EN_MASK))
2970 {
2971 HDXE_ASSERT(0);
2972 }
2973
2974 if (dxeCtxt->rxPalPacketUnavailable &&
2975 (WLANDXE_CH_STAT_INT_DONE_MASK & chLogRxStat))
2976 {
2977 chanMask = dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG].extraConfig.chan_mask &
2978 (~WLANDXE_CH_CTRL_INE_DONE_MASK);
2979 dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG].doneIntDisabled = 1;
2980 }
2981 else
2982 {
2983 chanMask = dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG].extraConfig.chan_mask;
2984 dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG].doneIntDisabled = 0;
2985 }
2986 wpalWriteRegister(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG].channelRegister.chDXECtrlRegAddr,
2987 chanMask);
2988 }
Leo Chang094ece82013-04-23 17:57:41 -07002989
2990 /* Clear Interrupt handle processing bit
2991 * RIVA may power down */
Mihir Shete0670b402015-05-13 17:51:41 +05302992 if (!(wpalIsFwLoggingSupported() && wpalIsFwLoggingEnabled()))
Mihir Sheted6274602015-04-28 16:13:21 +05302993 {
2994 wpalReadRegister(WLANDXE_INT_MASK_REG_ADDRESS, &regValue);
2995 regValue &= WLANDXE_RX_INTERRUPT_PRO_UNMASK;
2996 wpalWriteRegister(WLANDXE_INT_MASK_REG_ADDRESS, regValue);
2997 }
2998 else
2999 {
Karthick S09d5dd02015-05-27 16:58:32 +05303000 wpalReadRegister(WLAN_PMU_SPARE_OUT_ADDRESS, &regValue);
3001 regValue &= (~WLAN_PMU_POWER_DOWN_MASK);
3002 wpalWriteRegister(WLAN_PMU_SPARE_OUT_ADDRESS, regValue);
Mihir Sheted6274602015-04-28 16:13:21 +05303003 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003004
Leo Chang416afe02013-07-01 13:58:13 -07003005 /* Enable system level ISR */
3006 /* Enable RX ready Interrupt at here */
3007 status = wpalEnableInterrupt(DXE_INTERRUPT_RX_READY);
3008 if(eWLAN_PAL_STATUS_SUCCESS != status)
3009 {
3010 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3011 "dxeRXEventHandler Enable RX Ready interrupt fail");
3012 return;
3013 }
3014
Jeff Johnson295189b2012-06-20 16:38:30 -07003015 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003016 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003017 return;
3018}
3019
3020/*==========================================================================
3021 @ Function Name
3022 dxeRXPacketAvailableEventHandler
3023
3024 @ Description
3025 Handle serialized RX Packet Available event when the corresponding callback
3026 is invoked by WPAL.
3027 Try to fill up any completed DXE descriptors with available Rx packet buffer
3028 pointers.
3029
3030 @ Parameters
3031 wpt_msg *rxPktAvailMsg
3032 RX frame ready MSG pointer
3033 include DXE control context
3034
3035 @ Return
3036 NONE
3037
3038===========================================================================*/
3039void dxeRXPacketAvailableEventHandler
3040(
3041 wpt_msg *rxPktAvailMsg
3042)
3043{
3044 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
3045 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
3046 WLANDXE_ChannelCBType *channelCb = NULL;
3047
3048 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003049 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003050
3051 /* Sanity Check */
3052 if(NULL == rxPktAvailMsg)
3053 {
3054 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3055 "dxeRXPacketAvailableEventHandler Context is not valid");
3056 return;
3057 }
3058
3059 dxeCtxt = (WLANDXE_CtrlBlkType *)(rxPktAvailMsg->pContext);
Mihir Shete44547fb2014-03-10 14:15:42 +05303060
3061#ifdef WLAN_DXE_LOW_RESOURCE_TIMER
Leo Chang72cdfd32013-10-17 20:36:30 -07003062 /* Available resource allocated
3063 * Stop timer not needed */
3064 if(VOS_TIMER_STATE_RUNNING ==
3065 wpalTimerGetCurStatus(&dxeCtxt->rxResourceAvailableTimer))
3066 {
3067 wpalTimerStop(&dxeCtxt->rxResourceAvailableTimer);
3068 }
Mihir Shete44547fb2014-03-10 14:15:42 +05303069#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003070
3071 do
3072 {
3073 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
3074 "dxeRXPacketAvailableEventHandler, start refilling ring");
3075
3076 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI];
3077 status = dxeRXFrameRefillRing(dxeCtxt,channelCb);
3078
3079 // Wait for another callback to indicate when Rx resources are available
3080 // again.
3081 if(eWLAN_PAL_STATUS_SUCCESS != status)
3082 {
3083 break;
3084 }
3085
3086 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI];
3087 status = dxeRXFrameRefillRing(dxeCtxt,channelCb);
3088 if(eWLAN_PAL_STATUS_SUCCESS != status)
3089 {
3090 break;
3091 }
Mihir Shetee6618162015-03-16 14:48:42 +05303092
3093 if (WLANDXE_IS_VALID_CHANNEL(WDTS_CHANNEL_RX_LOG))
3094 {
3095 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG];
3096 status = dxeRXFrameRefillRing(dxeCtxt,channelCb);
3097 if(eWLAN_PAL_STATUS_SUCCESS != status)
3098 {
3099 break;
3100 }
3101 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003102 } while(0);
3103
3104 if((WLANDXE_POWER_STATE_IMPS == dxeCtxt->hostPowerState) ||
3105 (WLANDXE_POWER_STATE_DOWN == dxeCtxt->hostPowerState))
3106 {
3107 /* Interrupt will not enabled at here, it will be enabled at PS mode change */
3108 tempDxeCtrlBlk->rxIntDisabledByIMPS = eWLAN_PAL_TRUE;
3109 }
3110}
3111
3112/*==========================================================================
3113 @ Function Name
3114 dxeRXISR
3115
3116 @ Description
3117 RX frame ready interrupt service routine
3118 interrupt entry function, this function called based on ISR context
3119 Must be serialized
3120
3121 @ Parameters
3122 void *hostCtxt
3123 DXE host driver control context,
3124 pre registerd during interrupt registration
3125
3126 @ Return
3127 NONE
3128
3129===========================================================================*/
3130static void dxeRXISR
3131(
3132 void *hostCtxt
3133)
3134{
3135 WLANDXE_CtrlBlkType *dxeCtxt = (WLANDXE_CtrlBlkType *)hostCtxt;
3136 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003137 wpt_uint32 regValue;
Jeff Johnson295189b2012-06-20 16:38:30 -07003138
Leo Chang094ece82013-04-23 17:57:41 -07003139 /* Set Interrupt processing bit
3140 * During this bit set, WLAN HW may not power collapse */
Mihir Shete0670b402015-05-13 17:51:41 +05303141 if (!(wpalIsFwLoggingSupported() && wpalIsFwLoggingEnabled()))
Mihir Sheted6274602015-04-28 16:13:21 +05303142 {
3143 wpalReadRegister(WLANDXE_INT_MASK_REG_ADDRESS, &regValue);
3144 regValue |= WLANPAL_RX_INTERRUPT_PRO_MASK;
3145 wpalWriteRegister(WLANDXE_INT_MASK_REG_ADDRESS, regValue);
3146 }
3147 else
3148 {
Karthick S09d5dd02015-05-27 16:58:32 +05303149 wpalReadRegister(WLAN_PMU_SPARE_OUT_ADDRESS, &regValue);
3150 regValue |= WLAN_PMU_POWER_DOWN_MASK;
3151 wpalWriteRegister(WLAN_PMU_SPARE_OUT_ADDRESS, regValue);
Mihir Sheted6274602015-04-28 16:13:21 +05303152 }
Leo Chang094ece82013-04-23 17:57:41 -07003153
Jeff Johnson295189b2012-06-20 16:38:30 -07003154 /* Disable interrupt at here
3155 * Disable RX Ready system level Interrupt at here
3156 * Otherwise infinite loop might happen */
3157 status = wpalDisableInterrupt(DXE_INTERRUPT_RX_READY);
3158 if(eWLAN_PAL_STATUS_SUCCESS != status)
3159 {
3160 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3161 "dxeRXFrameReadyISR Disable RX ready interrupt fail");
3162 return;
3163 }
3164
3165 /* Serialize RX Ready interrupt upon RX thread */
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08003166 if(NULL == dxeCtxt->rxIsrMsg)
3167 {
3168 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3169 "dxeRXFrameReadyISR NULL message");
3170 HDXE_ASSERT(0);
3171 return;
3172 }
3173
Jeff Johnson295189b2012-06-20 16:38:30 -07003174 status = wpalPostRxMsg(WDI_GET_PAL_CTX(),
3175 dxeCtxt->rxIsrMsg);
3176 if(eWLAN_PAL_STATUS_SUCCESS != status)
3177 {
Jeff Johnson295189b2012-06-20 16:38:30 -07003178 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
3179 "dxeRXFrameReadyISR interrupt serialize fail");
3180 }
3181
Jeff Johnson295189b2012-06-20 16:38:30 -07003182 return;
3183}
3184
3185/*==========================================================================
3186 @ Function Name
3187 dxeTXPushFrame
3188
3189 @ Description
3190 Push TX frame into DXE descriptor and DXE register
3191 Send notification to DXE register that TX frame is ready to transfer
3192
3193 @ Parameters
3194 WLANDXE_ChannelCBType *channelEntry
3195 Channel specific control block
3196 wpt_packet *palPacket
3197 Packet pointer ready to transfer
3198
3199 @ Return
3200 PAL_STATUS_T
3201===========================================================================*/
3202static wpt_status dxeTXPushFrame
3203(
3204 WLANDXE_ChannelCBType *channelEntry,
3205 wpt_packet *palPacket
3206)
3207{
3208 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
3209 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
3210 WLANDXE_DescType *currentDesc = NULL;
3211 WLANDXE_DescType *firstDesc = NULL;
3212 WLANDXE_DescType *LastDesc = NULL;
3213 void *sourcePhysicalAddress = NULL;
3214 wpt_uint32 xferSize = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003215 wpt_iterator iterator;
Leo Changac1d3612013-07-01 15:15:51 -07003216 wpt_uint32 isEmpty = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003217
3218 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003219 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003220
Leo Changac1d3612013-07-01 15:15:51 -07003221 tempDxeCtrlBlk->smsmToggled = eWLAN_PAL_FALSE;
3222 if((0 == tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc) &&
3223 (0 == tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc))
Jeff Johnson295189b2012-06-20 16:38:30 -07003224 {
Leo Changac1d3612013-07-01 15:15:51 -07003225 isEmpty = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07003226 }
3227
3228 channelEntry->numFragmentCurrentChain = 0;
3229 currentCtrlBlk = channelEntry->headCtrlBlk;
3230
3231 /* Initialize interator, TX is fragmented */
Jeff Johnson295189b2012-06-20 16:38:30 -07003232 status = wpalLockPacketForTransfer(palPacket);
3233 if(eWLAN_PAL_STATUS_SUCCESS != status)
3234 {
3235 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3236 "dxeTXPushFrame unable to lock packet");
3237 return status;
3238 }
3239
3240 status = wpalIteratorInit(&iterator, palPacket);
Jeff Johnson295189b2012-06-20 16:38:30 -07003241 if(eWLAN_PAL_STATUS_SUCCESS != status)
3242 {
3243 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3244 "dxeTXPushFrame iterator init fail");
3245 return status;
3246 }
3247
3248 /* !!!! Revisit break condition !!!!!!! */
3249 while(1)
3250 {
3251 /* Get current descriptor pointer from current control block */
3252 currentDesc = currentCtrlBlk->linkedDesc;
3253 if(NULL == firstDesc)
3254 {
3255 firstDesc = currentCtrlBlk->linkedDesc;
3256 }
3257 /* All control block will have same palPacket Pointer
3258 * to make logic simpler */
3259 currentCtrlBlk->xfrFrame = palPacket;
3260
3261 /* Get next fragment physical address and fragment size
3262 * if this is the first trial, will get first physical address
3263 * if no more fragment, Descriptor src address will be set as NULL, OK??? */
Jeff Johnson295189b2012-06-20 16:38:30 -07003264 status = wpalIteratorNext(&iterator,
3265 palPacket,
3266 &sourcePhysicalAddress,
3267 &xferSize);
jagadeeshf869bba2015-04-07 20:06:21 +05303268 if(eWLAN_PAL_STATUS_SUCCESS != status)
3269 {
3270 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3271 "dxeTXPushFrame Get next frame fail");
3272 return status;
3273 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003274 if((NULL == sourcePhysicalAddress) ||
3275 (0 == xferSize))
3276 {
3277 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
3278 "dxeTXPushFrame end of current frame");
3279 break;
3280 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003281
3282 /* This is the LAST descriptor valid for this transaction */
3283 LastDesc = currentCtrlBlk->linkedDesc;
3284
3285 /* Program DXE descriptor */
3286 currentDesc->dxedesc.dxe_short_desc.srcMemAddrL =
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05303287 WLANDXE_U32_SWAP_ENDIAN((wpt_uint32)(uintptr_t)sourcePhysicalAddress);
Jeff Johnson295189b2012-06-20 16:38:30 -07003288
3289 /* Just normal data transfer from aCPU Flat Memory to BMU Q */
3290 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
3291 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
3292 {
3293 currentDesc->dxedesc.dxe_short_desc.dstMemAddrL =
3294 WLANDXE_U32_SWAP_ENDIAN(channelEntry->channelConfig.refWQ);
3295 }
3296 else
3297 {
3298 /* Test specific H2H transfer, destination address already set
3299 * Do Nothing */
3300 }
3301 currentDesc->xfrSize = WLANDXE_U32_SWAP_ENDIAN(xferSize);
3302
3303 /* Program channel control register */
3304 /* First frame not set VAL bit, why ??? */
3305 if(0 == channelEntry->numFragmentCurrentChain)
3306 {
3307 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write;
3308 }
3309 else
3310 {
3311 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write_valid;
3312 }
3313
3314 /* Update statistics */
3315 channelEntry->numFragmentCurrentChain++;
3316 channelEntry->numFreeDesc--;
3317 channelEntry->numRsvdDesc++;
3318
3319 /* Get next control block */
3320 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
3321 }
3322 channelEntry->numTotalFrame++;
3323 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
3324 "NUM TX FRAG %d, Total Frame %d",
3325 channelEntry->numFragmentCurrentChain, channelEntry->numTotalFrame);
3326
3327 /* Program Channel control register
3328 * Set as end of packet
3329 * Enable interrupt also for first code lock down
3330 * performace optimization, this will be revisited */
3331 if(NULL == LastDesc)
3332 {
3333 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3334 "dxeTXPushFrame NULL Last Descriptor, broken chain");
3335 return eWLAN_PAL_STATUS_E_FAULT;
3336 }
3337 LastDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write_eop_int;
3338 /* Now First one also Valid ????
3339 * this procedure will prevent over handle descriptor from previous
3340 * TX trigger */
3341 firstDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write_valid;
3342
3343 /* If in BMPS mode no need to notify the DXE Engine, notify SMSM instead */
3344 if(WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN == tempDxeCtrlBlk->rivaPowerState)
3345 {
3346 /* Update channel head as next avaliable linked slot */
3347 channelEntry->headCtrlBlk = currentCtrlBlk;
Leo Changac1d3612013-07-01 15:15:51 -07003348 if(isEmpty)
3349 {
3350 tempDxeCtrlBlk->ringNotEmpty = eWLAN_PAL_TRUE;
3351 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
3352 "SMSM_ret LO=%d HI=%d",
3353 tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc,
3354 tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc );
3355 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
3356 tempDxeCtrlBlk->smsmToggled = eWLAN_PAL_TRUE;
3357 }
Madan Mohan Koyyalamudi2edf6f62012-10-15 15:56:34 -07003358 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07003359 }
3360
3361 /* If DXE use external descriptor, registers are not needed to be programmed
3362 * Just after finish to program descriptor, tirigger to send */
3363 if(channelEntry->extraConfig.chan_mask & WLANDXE_CH_CTRL_EDEN_MASK)
3364 {
3365 /* Issue a dummy read from the DXE descriptor DDR location to
3366 ensure that any previously posted write to the descriptor
3367 completes. */
3368 if(channelEntry->extraConfig.cw_ctrl_write_valid != firstDesc->descCtrl.ctrl)
3369 {
3370 //HDXE_ASSERT(0);
3371 }
3372
3373 /* Everything is ready
3374 * Trigger to start DMA */
3375 status = wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr,
3376 channelEntry->extraConfig.chan_mask);
3377 if(eWLAN_PAL_STATUS_SUCCESS != status)
3378 {
3379 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3380 "dxeTXPushFrame Write Channel Ctrl Register fail");
3381 return status;
3382 }
3383
3384 /* Update channel head as next avaliable linked slot */
3385 channelEntry->headCtrlBlk = currentCtrlBlk;
3386
3387 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003388 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003389 return status;
3390 }
3391
3392 /* If DXE not use external descriptor, program each registers */
3393 /* Circular buffer handle not need to program DESC register???
3394 * GEN5 code not programed RING buffer case
3395 * REVISIT THIS !!!!!! */
3396 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
3397 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
3398 {
3399 /* Destination address, assigned Work Q */
3400 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrlRegAddr,
3401 channelEntry->channelConfig.refWQ);
3402 if(eWLAN_PAL_STATUS_SUCCESS != status)
3403 {
3404 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3405 "dxeTXPushFrame Program dest address register fail");
3406 return status;
3407 }
3408 /* If descriptor format is SHORT */
3409 if(channelEntry->channelConfig.useShortDescFmt)
3410 {
3411 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrhRegAddr,
3412 0);
3413 if(eWLAN_PAL_STATUS_SUCCESS != status)
3414 {
3415 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3416 "dxeTXPushFrame Program dest address register fail");
3417 return status;
3418 }
3419 }
3420 else
3421 {
3422 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3423 "dxeTXPushFrame LONG Descriptor Format!!!");
3424 }
3425 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003426
3427 /* Program Source address register
3428 * This address is already programmed into DXE Descriptor
3429 * But register also upadte */
3430 status = wpalWriteRegister(channelEntry->channelRegister.chDXESadrlRegAddr,
3431 WLANDXE_U32_SWAP_ENDIAN(firstDesc->dxedesc.dxe_short_desc.srcMemAddrL));
3432 if(eWLAN_PAL_STATUS_SUCCESS != status)
3433 {
3434 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3435 "dxeTXPushFrame Program src address register fail");
3436 return status;
3437 }
3438 /* If descriptor format is SHORT */
3439 if(channelEntry->channelConfig.useShortDescFmt)
3440 {
3441 status = wpalWriteRegister(channelEntry->channelRegister.chDXESadrhRegAddr,
3442 0);
3443 if(eWLAN_PAL_STATUS_SUCCESS != status)
3444 {
3445 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3446 "dxeTXPushFrame Program dest address register fail");
3447 return status;
3448 }
3449 }
3450 else
3451 {
3452 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3453 "dxeTXPushFrame LONG Descriptor Format!!!");
3454 }
3455
3456 /* Linked list Descriptor pointer */
3457 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
3458 channelEntry->headCtrlBlk->linkedDescPhyAddr);
3459 if(eWLAN_PAL_STATUS_SUCCESS != status)
3460 {
3461 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3462 "dxeTXPushFrame Write DESC Address register fail");
3463 return status;
3464 }
3465 /* If descriptor format is SHORT */
3466 if(channelEntry->channelConfig.useShortDescFmt)
3467 {
3468 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDeschRegAddr,
3469 0);
3470 if(eWLAN_PAL_STATUS_SUCCESS != status)
3471 {
3472 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3473 "dxeTXPushFrame Program dest address register fail");
3474 return status;
3475 }
3476 }
3477 else
3478 {
3479 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3480 "dxeTXPushFrame LONG Descriptor Format!!!");
3481 }
3482
3483 /* Transfer Size */
3484 xferSize = WLANDXE_U32_SWAP_ENDIAN(firstDesc->xfrSize);
3485 status = wpalWriteRegister(channelEntry->channelRegister.chDXESzRegAddr,
3486 xferSize);
3487 if(eWLAN_PAL_STATUS_SUCCESS != status)
3488 {
3489 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3490 "dxeTXPushFrame Write DESC Address register fail");
3491 return status;
3492 }
3493
3494 /* Everything is ready
3495 * Trigger to start DMA */
3496 status = wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr,
3497 channelEntry->extraConfig.chan_mask);
3498 if(eWLAN_PAL_STATUS_SUCCESS != status)
3499 {
3500 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3501 "dxeTXPushFrame Write Channel Ctrl Register fail");
3502 return status;
3503 }
3504
3505 /* Update channel head as next avaliable linked slot */
3506 channelEntry->headCtrlBlk = currentCtrlBlk;
3507
3508 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003509 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003510 return status;
3511}
3512
3513/*==========================================================================
3514 @ Function Name
3515 dxeTXCompFrame
3516
3517 @ Description
3518 TX Frame transfer complete event handler
3519
3520 @ Parameters
3521 WLANDXE_CtrlBlkType *dxeCtrlBlk,
3522 DXE host driver main control block
3523 WLANDXE_ChannelCBType *channelEntry
3524 Channel specific control block
3525
3526 @ Return
3527 PAL_STATUS_T
3528===========================================================================*/
3529static wpt_status dxeTXCompFrame
3530(
3531 WLANDXE_CtrlBlkType *hostCtxt,
3532 WLANDXE_ChannelCBType *channelEntry
3533)
3534{
3535 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
3536 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
3537 WLANDXE_DescType *currentDesc = NULL;
3538 wpt_uint32 descCtrlValue = 0;
3539 unsigned int *lowThreshold = NULL;
3540
3541 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003542 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003543
3544 /* Sanity */
3545 if((NULL == hostCtxt) || (NULL == channelEntry))
3546 {
3547 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3548 "dxeTXCompFrame Invalid ARG");
3549 return eWLAN_PAL_STATUS_E_INVAL;
3550 }
3551
3552 if(NULL == hostCtxt->txCompCB)
3553 {
3554 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3555 "dxeTXCompFrame TXCompCB is not registered");
Jeff Johnsone7245742012-09-05 17:12:55 -07003556 return eWLAN_PAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003557 }
3558
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08003559 status = wpalMutexAcquire(&channelEntry->dxeChannelLock);
3560 if(eWLAN_PAL_STATUS_SUCCESS != status)
3561 {
3562 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3563 "dxeTXCompFrame Mutex Acquire fail");
3564 return status;
3565 }
3566
Jeff Johnson295189b2012-06-20 16:38:30 -07003567 currentCtrlBlk = channelEntry->tailCtrlBlk;
3568 currentDesc = currentCtrlBlk->linkedDesc;
3569
3570 if( currentCtrlBlk == channelEntry->headCtrlBlk )
3571 {
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08003572 status = wpalMutexRelease(&channelEntry->dxeChannelLock);
3573 if(eWLAN_PAL_STATUS_SUCCESS != status)
3574 {
3575 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3576 "dxeTXCompFrame Mutex Release fail");
3577 return status;
3578 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003579 return eWLAN_PAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003580 }
3581
Kiet Lam842dad02014-02-18 18:44:02 -08003582
Jeff Johnson295189b2012-06-20 16:38:30 -07003583 while(1)
3584 {
3585// HDXE_ASSERT(WLAN_PAL_IS_STATUS_SUCCESS(WLAN_RivaValidateDesc(currentDesc)));
3586 descCtrlValue = currentDesc->descCtrl.ctrl;
3587 if((descCtrlValue & WLANDXE_DESC_CTRL_VALID))
3588 {
3589 /* caught up with head, bail out */
3590 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED,
3591 "dxeTXCompFrame caught up with head - next DESC has VALID set");
3592 break;
3593 }
3594
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08003595 if(currentCtrlBlk->xfrFrame == NULL)
3596 {
3597 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3598 "Invalid transfer frame");
3599 HDXE_ASSERT(0);
3600 break;
3601 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003602 channelEntry->numFreeDesc++;
3603 channelEntry->numRsvdDesc--;
3604
3605 /* Send Frame TX Complete notification with frame start fragment location */
3606 if(WLANDXE_U32_SWAP_ENDIAN(descCtrlValue) & WLANDXE_DESC_CTRL_EOP)
3607 {
3608 hostCtxt->txCompletedFrames--;
Jeff Johnson295189b2012-06-20 16:38:30 -07003609 status = wpalUnlockPacket(currentCtrlBlk->xfrFrame);
3610 if (eWLAN_PAL_STATUS_SUCCESS != status)
3611 {
3612 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3613 "dxeRXFrameReady unable to unlock packet");
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08003614 status = wpalMutexRelease(&channelEntry->dxeChannelLock);
3615 if(eWLAN_PAL_STATUS_SUCCESS != status)
3616 {
3617 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3618 "dxeTXCompFrame Mutex Release fail");
3619 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003620 return status;
3621 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003622 hostCtxt->txCompCB(hostCtxt->clientCtxt,
3623 currentCtrlBlk->xfrFrame,
3624 eWLAN_PAL_STATUS_SUCCESS);
3625 channelEntry->numFragmentCurrentChain = 0;
3626 }
3627 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
3628 currentDesc = currentCtrlBlk->linkedDesc;
3629
3630 /* Break condition
3631 * Head control block is the control block must be programed for the next TX
3632 * so, head control block is not programmed control block yet
3633 * if loop encounte head control block, stop to complete
3634 * in theory, COMP CB must be called already ??? */
3635 if(currentCtrlBlk == channelEntry->headCtrlBlk)
3636 {
3637 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED,
3638 "dxeTXCompFrame caught up with head ptr");
3639 break;
3640 }
3641 /* VALID Bit check ???? */
3642 }
3643
3644 /* Tail and Head Control block must be same */
3645 channelEntry->tailCtrlBlk = currentCtrlBlk;
3646
3647 lowThreshold = channelEntry->channelType == WDTS_CHANNEL_TX_LOW_PRI?
3648 &(hostCtxt->txCompInt.txLowResourceThreshold_LoPriCh):
3649 &(hostCtxt->txCompInt.txLowResourceThreshold_HiPriCh);
3650
3651 /* If specific channel hit low resource condition send notification to upper layer */
3652 if((eWLAN_PAL_TRUE == channelEntry->hitLowResource) &&
3653 (channelEntry->numFreeDesc > *lowThreshold))
3654 {
3655 /* Change it back if we raised it for fetching a remaining packet from TL */
3656 if(WLANDXE_TX_LOW_RES_THRESHOLD > *lowThreshold)
3657 {
3658 *lowThreshold = WLANDXE_TX_LOW_RES_THRESHOLD;
3659 }
3660
3661 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
3662 "DXE TX %d channel recovered from low resource", channelEntry->channelType);
3663 hostCtxt->lowResourceCB(hostCtxt->clientCtxt,
3664 channelEntry->channelType,
3665 eWLAN_PAL_TRUE);
3666 channelEntry->hitLowResource = eWLAN_PAL_FALSE;
3667 }
3668
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08003669 status = wpalMutexRelease(&channelEntry->dxeChannelLock);
3670 if(eWLAN_PAL_STATUS_SUCCESS != status)
3671 {
3672 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3673 "dxeTXCompFrame Mutex Release fail");
3674 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003675
3676 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003677 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003678 return status;
3679}
3680
3681/*==========================================================================
Mihir Shetedfc33ec2014-10-15 13:14:38 +05303682 @ Function Name
3683 dxeTXCleanup
3684
3685 @ Description
3686 Cleanup the TX channels after DXE Error
3687
3688 @ Parameters
3689 WLANDXE_CtrlBlkType *dxeCtrlBlk,
3690 DXE host driver main control block
3691
3692 @ Return
3693 PAL_STATUS_T
3694===========================================================================*/
3695static wpt_status dxeTXCleanup
3696(
3697 WLANDXE_CtrlBlkType *hostCtxt
3698)
3699{
3700 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
3701 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
3702 WLANDXE_DescType *currentDesc = NULL;
3703 wpt_uint32 descCtrlValue = 0;
3704 unsigned int *lowThreshold = NULL;
3705 unsigned int idx;
3706 WLANDXE_ChannelCBType *channelEntry;
3707
3708 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
3709 "%s Enter", __func__);
3710
3711 /* Sanity */
3712 if((NULL == hostCtxt))
3713 {
3714 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
3715 "%s: Invalid ARG", __func__);
3716 return eWLAN_PAL_STATUS_E_INVAL;
3717 }
3718
3719 if(NULL == hostCtxt->txCompCB)
3720 {
3721 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
3722 "%s: TXCompCB is not registered",__func__);
3723 return eWLAN_PAL_STATUS_SUCCESS;
3724 }
3725
3726 for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++)
3727 {
3728 channelEntry = &tempDxeCtrlBlk->dxeChannel[idx];
3729 if(idx != WDTS_CHANNEL_TX_LOW_PRI && idx != WDTS_CHANNEL_TX_HIGH_PRI)
3730 {
3731 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
3732 "%s: %11s continue",__func__,
3733 channelType[channelEntry->channelType]);
3734 continue;
3735 }
3736
3737 status = wpalMutexAcquire(&channelEntry->dxeChannelLock);
3738 if(eWLAN_PAL_STATUS_SUCCESS != status)
3739 {
3740 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3741 "%s: %11s Mutex Acquire fail",__func__,
3742 channelType[channelEntry->channelType]);
3743 return status;
3744 }
3745
3746 currentCtrlBlk = channelEntry->tailCtrlBlk;
3747 currentDesc = currentCtrlBlk->linkedDesc;
3748
3749 if( currentCtrlBlk == channelEntry->headCtrlBlk )
3750 {
3751 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
3752 "%s: %11s Head and Tail are Same",__func__,
3753 channelType[channelEntry->channelType]);
3754
3755 status = wpalMutexRelease(&channelEntry->dxeChannelLock);
3756 if(eWLAN_PAL_STATUS_SUCCESS != status)
3757 {
3758 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3759 "%s: %11s Mutex Release fail",__func__,
3760 channelType[channelEntry->channelType]);
3761 return status;
3762 }
3763 continue;
3764 }
3765
3766 while(1)
3767 {
3768 descCtrlValue = currentDesc->descCtrl.ctrl;
3769 if((descCtrlValue & WLANDXE_DESC_CTRL_VALID))
3770 {
3771 /* invalidate... */
3772 currentDesc->descCtrl.ctrl &= ~WLANDXE_DESC_CTRL_VALID;
3773 }
3774
3775 if(currentCtrlBlk->xfrFrame == NULL)
3776 {
3777 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
3778 "%s: %11s Invalid transfer frame",__func__,
3779 channelType[channelEntry->channelType]);
3780 HDXE_ASSERT(0);
3781 break;
3782 }
3783 channelEntry->numFreeDesc++;
3784 channelEntry->numRsvdDesc--;
3785
3786 /* Send Frame TX Complete notification with frame start fragment location */
3787 if(WLANDXE_U32_SWAP_ENDIAN(descCtrlValue) & WLANDXE_DESC_CTRL_EOP)
3788 {
3789 hostCtxt->txCompletedFrames--;
3790 status = wpalUnlockPacket(currentCtrlBlk->xfrFrame);
3791 if (eWLAN_PAL_STATUS_SUCCESS != status)
3792 {
3793 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3794 "%s: unable to unlock packet",__func__);
3795 status = wpalMutexRelease(&channelEntry->dxeChannelLock);
3796 if(eWLAN_PAL_STATUS_SUCCESS != status)
3797 {
3798 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3799 "%s: Mutex Release fail",__func__);
3800 }
3801 return status;
3802 }
3803 hostCtxt->txCompCB(hostCtxt->clientCtxt,
3804 currentCtrlBlk->xfrFrame,
3805 eWLAN_PAL_STATUS_SUCCESS); //mir: SUCCESS or FAILURE?
3806 channelEntry->numFragmentCurrentChain = 0;
3807 }
3808 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
3809 currentDesc = currentCtrlBlk->linkedDesc;
3810
3811 /* Break condition
3812 * Head control block is the control block must be programed for the next TX
3813 * so, head control block is not programmed control block yet
3814 * if loop encounte head control block, stop to complete
3815 * in theory, COMP CB must be called already ??? */
3816 if(currentCtrlBlk == channelEntry->headCtrlBlk)
3817 {
3818 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
3819 "%s: %11s caught up with head ptr",__func__,
3820 channelType[channelEntry->channelType]);
3821 break;
3822 }
3823 /* VALID Bit check ???? */
3824 }
3825
3826 /* Tail and Head Control block must be same */
3827 channelEntry->tailCtrlBlk = currentCtrlBlk;
3828 /* Re-Sync Head and CDR */
3829 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
3830 channelEntry->headCtrlBlk->linkedDescPhyAddr);
3831 if(eWLAN_PAL_STATUS_SUCCESS != status)
3832 {
3833 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3834 "dxeChannelInitProgram Write DESC Address register fail");
3835 status = wpalMutexRelease(&channelEntry->dxeChannelLock);
3836 if(eWLAN_PAL_STATUS_SUCCESS != status)
3837 {
3838 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3839 "%s: %11s Mutex Release fail", __func__,
3840 channelType[channelEntry->channelType]);
3841 }
3842 return status;
3843 }
3844
3845 lowThreshold = channelEntry->channelType == WDTS_CHANNEL_TX_LOW_PRI?
3846 &(hostCtxt->txCompInt.txLowResourceThreshold_LoPriCh):
3847 &(hostCtxt->txCompInt.txLowResourceThreshold_HiPriCh);
3848
3849 /* If specific channel hit low resource condition send notification to upper layer */
3850 if((eWLAN_PAL_TRUE == channelEntry->hitLowResource) &&
3851 (channelEntry->numFreeDesc > *lowThreshold))
3852 {
3853 /* Change it back if we raised it for fetching a remaining packet from TL */
3854 if(WLANDXE_TX_LOW_RES_THRESHOLD > *lowThreshold)
3855 {
3856 *lowThreshold = WLANDXE_TX_LOW_RES_THRESHOLD;
3857 }
3858
3859 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
3860 "DXE TX %d channel recovered from low resource", channelEntry->channelType);
3861 hostCtxt->lowResourceCB(hostCtxt->clientCtxt,
3862 channelEntry->channelType,
3863 eWLAN_PAL_TRUE);
3864 channelEntry->hitLowResource = eWLAN_PAL_FALSE;
3865 }
3866 status = wpalMutexRelease(&channelEntry->dxeChannelLock);
3867 if(eWLAN_PAL_STATUS_SUCCESS != status)
3868 {
3869 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3870 "%s: %11s Mutex Release fail", __func__,
3871 channelType[channelEntry->channelType]);
3872 }
3873 }
3874
3875 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
3876 "%s Exit", __func__);
3877 return status;
3878}
3879/*==========================================================================
Jeff Johnson295189b2012-06-20 16:38:30 -07003880 @ Function Name
3881 dxeTXEventHandler
3882
3883 @ Description
3884 If DXE HW sends TX related interrupt, this event handler will be called
3885 Handle higher priority channel first
3886 Figureout why interrupt happen and call appropriate final even handler
3887 TX complete or error happen
3888
3889 @ Parameters
3890 void *msgPtr
3891 Even MSG
3892
3893 @ Return
3894 PAL_STATUS_T
3895===========================================================================*/
3896void dxeTXEventHandler
3897(
3898 wpt_msg *msgPtr
3899)
3900{
3901 wpt_msg *msgContent = (wpt_msg *)msgPtr;
3902 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
3903 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
3904 wpt_uint32 intSrc = 0;
3905 wpt_uint32 chStat = 0;
3906 WLANDXE_ChannelCBType *channelCb = NULL;
3907
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003908 wpt_uint8 bEnableISR = 0;
Madan Mohan Koyyalamudidfd6aa82012-10-18 20:18:43 -07003909 static wpt_uint8 successiveIntWithIMPS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003910
3911 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003912 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003913
3914 dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
Jeff Johnsone7245742012-09-05 17:12:55 -07003915 dxeCtxt->ucTxMsgCnt = 0;
3916
3917 if(eWLAN_PAL_TRUE == dxeCtxt->driverReloadInProcessing)
3918 {
3919 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3920 "wlan: TX COMP WLAN Driver re-loading in progress");
3921 return;
3922 }
3923
Jeff Johnson295189b2012-06-20 16:38:30 -07003924 /* Return from here if the RIVA is in IMPS, to avoid register access */
3925 if(WLANDXE_POWER_STATE_IMPS == dxeCtxt->hostPowerState)
3926 {
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003927 successiveIntWithIMPS++;
Jeff Johnsone7245742012-09-05 17:12:55 -07003928 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003929 "dxeTXEventHandler IMPS TX COMP INT successiveIntWithIMPS %d", successiveIntWithIMPS);
Jeff Johnsone7245742012-09-05 17:12:55 -07003930 status = dxeTXCompFrame(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI]);
3931 if(eWLAN_PAL_STATUS_SUCCESS != status)
3932 {
3933 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003934 "dxeTXEventHandler IMPS HC COMP interrupt fail");
Jeff Johnsone7245742012-09-05 17:12:55 -07003935 }
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07003936
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003937 status = dxeTXCompFrame(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI]);
3938 if(eWLAN_PAL_STATUS_SUCCESS != status)
3939 {
3940 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3941 "dxeTXEventHandler IMPS LC COMP interrupt fail");
3942 }
3943
3944 if(((dxeCtxt->txCompletedFrames) &&
3945 (eWLAN_PAL_FALSE == dxeCtxt->txIntEnable)) &&
3946 (successiveIntWithIMPS == 1))
Jeff Johnsone7245742012-09-05 17:12:55 -07003947 {
3948 dxeCtxt->txIntEnable = eWLAN_PAL_TRUE;
3949 wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE);
3950 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08003951 "TX COMP INT Enabled, remain TX frame count on ring %d",
3952 dxeCtxt->txCompletedFrames);
Jeff Johnsone7245742012-09-05 17:12:55 -07003953 /*Kicking the DXE after the TX Complete interrupt was enabled - to avoid
3954 the posibility of a race*/
3955 dxePsComplete(dxeCtxt, eWLAN_PAL_TRUE);
3956 }
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003957 else
3958 {
3959 dxeCtxt->txIntEnable = eWLAN_PAL_FALSE;
3960 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3961 "TX COMP INT NOT Enabled, RIVA still wake up? remain TX frame count on ring %d, successiveIntWithIMPS %d",
3962 dxeCtxt->txCompletedFrames, successiveIntWithIMPS);
3963 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003964 return;
3965 }
3966
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003967 successiveIntWithIMPS = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003968 if((!dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].extraConfig.chEnabled) ||
3969 (!dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].extraConfig.chEnabled))
3970 {
3971 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3972 "DXE already stopped in TX event handler. Just return");
3973 return;
3974 }
3975
Jeff Johnson295189b2012-06-20 16:38:30 -07003976 /* Disable device interrupt */
3977 /* Read whole interrupt mask register and exclusive only this channel int */
3978 status = wpalReadRegister(WLANDXE_INT_SRC_RAW_ADDRESS,
3979 &intSrc);
3980 if(eWLAN_PAL_STATUS_SUCCESS != status)
3981 {
3982 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3983 "dxeTXCompleteEventHandler Read INT_DONE_SRC register fail");
3984 return;
3985 }
3986 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED,
3987 "TX Event Handler INT Source 0x%x", intSrc);
3988
3989 /* Test High Priority Channel is the INT source or not */
3990 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI];
3991 if(intSrc & (1 << channelCb->assignedDMAChannel))
3992 {
3993 status = dxeChannelCleanInt(channelCb, &chStat);
3994 if(eWLAN_PAL_STATUS_SUCCESS != status)
3995 {
3996 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3997 "dxeTXEventHandler INT Clean up fail");
3998 return;
3999 }
4000
4001 if(WLANDXE_CH_STAT_INT_ERR_MASK & chStat)
4002 {
4003 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08004004 "%11s : 0x%x Error Reported, Reload Driver",
4005 channelType[channelCb->channelType], chStat);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304006
Mihir Shetedfc33ec2014-10-15 13:14:38 +05304007 if (eWLAN_PAL_STATUS_SUCCESS !=
4008 dxeErrHandler(channelCb, chStat))
4009 {
4010 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
4011 wpalWlanReload();
4012 dxeStartSSRTimer(dxeCtxt);
4013 }
4014 bEnableISR = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07004015 }
4016 else if(WLANDXE_CH_STAT_INT_DONE_MASK & chStat)
4017 {
4018 /* Handle TX complete for high priority channel */
4019 status = dxeTXCompFrame(dxeCtxt,
4020 channelCb);
Jeff Johnsone7245742012-09-05 17:12:55 -07004021 bEnableISR = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07004022 }
4023 else if(WLANDXE_CH_STAT_INT_ED_MASK & chStat)
4024 {
4025 /* Handle TX complete for high priority channel */
4026 status = dxeTXCompFrame(dxeCtxt,
4027 channelCb);
Jeff Johnsone7245742012-09-05 17:12:55 -07004028 bEnableISR = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07004029 }
4030 else
4031 {
4032 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4033 "dxeTXEventHandler TX HI status=%x", chStat);
4034 }
4035
4036 if(WLANDXE_CH_STAT_MASKED_MASK & chStat)
4037 {
4038 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH,
4039 "dxeTXEventHandler TX HIGH Channel Masked Unmask it!!!!");
4040 }
4041
4042 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH,
4043 "TX HIGH STAT 0x%x RESRVD %d", chStat, channelCb->numRsvdDesc);
4044 }
4045
4046 /* Test Low Priority Channel interrupt is enabled or not */
4047 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI];
4048 if(intSrc & (1 << channelCb->assignedDMAChannel))
4049 {
4050 status = dxeChannelCleanInt(channelCb, &chStat);
4051 if(eWLAN_PAL_STATUS_SUCCESS != status)
4052 {
4053 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4054 "dxeTXEventHandler INT Clean up fail");
4055 return;
4056 }
4057
4058 if(WLANDXE_CH_STAT_INT_ERR_MASK & chStat)
4059 {
4060 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08004061 "%11s : 0x%x Error Reported, Reload Driver",
4062 channelType[channelCb->channelType], chStat);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304063
Mihir Shetedfc33ec2014-10-15 13:14:38 +05304064 if (eWLAN_PAL_STATUS_SUCCESS !=
4065 dxeErrHandler(channelCb, chStat))
4066 {
4067 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
4068 wpalWlanReload();
4069 dxeStartSSRTimer(dxeCtxt);
4070 }
4071 bEnableISR = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07004072 }
4073 else if(WLANDXE_CH_STAT_INT_DONE_MASK & chStat)
4074 {
4075 /* Handle TX complete for low priority channel */
4076 status = dxeTXCompFrame(dxeCtxt,
4077 channelCb);
Jeff Johnsone7245742012-09-05 17:12:55 -07004078 bEnableISR = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07004079 }
4080 else if(WLANDXE_CH_STAT_INT_ED_MASK & chStat)
4081 {
4082 /* Handle TX complete for low priority channel */
4083 status = dxeTXCompFrame(dxeCtxt,
4084 channelCb);
Jeff Johnsone7245742012-09-05 17:12:55 -07004085 bEnableISR = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07004086 }
4087 else
4088 {
4089 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4090 "dxeTXEventHandler TX LO status=%x", chStat);
4091 }
4092
4093 if(WLANDXE_CH_STAT_MASKED_MASK & chStat)
4094 {
4095 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH,
4096 "dxeTXEventHandler TX Low Channel Masked Unmask it!!!!");
4097 }
4098 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
4099 "TX LOW STAT 0x%x RESRVD %d", chStat, channelCb->numRsvdDesc);
4100 }
4101
4102
Jeff Johnson295189b2012-06-20 16:38:30 -07004103 if((bEnableISR || (dxeCtxt->txCompletedFrames)) &&
4104 (eWLAN_PAL_FALSE == dxeCtxt->txIntEnable))
4105 {
4106 dxeCtxt->txIntEnable = eWLAN_PAL_TRUE;
4107 wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE);
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08004108 if(0 != dxeCtxt->txCompletedFrames)
4109 {
4110 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4111 "TX COMP INT Enabled, remain TX frame count on ring %d",
4112 dxeCtxt->txCompletedFrames);
4113 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004114 }
4115
4116 /*Kicking the DXE after the TX Complete interrupt was enabled - to avoid
4117 the posibility of a race*/
4118 dxePsComplete(dxeCtxt, eWLAN_PAL_TRUE);
4119
4120 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004121 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004122 return;
4123}
4124
4125
4126/*==========================================================================
4127 @ Function Name
4128 dxeTXCompleteProcessing
4129
4130 @ Description
4131 If DXE HW sends TX related interrupt, this event handler will be called
4132 Handle higher priority channel first
4133 Figureout why interrupt happen and call appropriate final even handler
4134 TX complete or error happen
4135
4136 @ Parameters
4137 dxeCtxt DXE context
4138
4139 @ Return
4140 PAL_STATUS_T
4141===========================================================================*/
4142void dxeTXCompleteProcessing
4143(
4144 WLANDXE_CtrlBlkType *dxeCtxt
4145)
4146{
4147 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4148 WLANDXE_ChannelCBType *channelCb = NULL;
4149
4150 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004151 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004152
4153 /* Test High Priority Channel is the INT source or not */
4154 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI];
4155
4156 /* Handle TX complete for high priority channel */
4157 status = dxeTXCompFrame(dxeCtxt, channelCb);
4158
4159 /* Test Low Priority Channel interrupt is enabled or not */
4160 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI];
4161
4162 /* Handle TX complete for low priority channel */
4163 status = dxeTXCompFrame(dxeCtxt, channelCb);
4164
4165 if((eWLAN_PAL_FALSE == dxeCtxt->txIntEnable) &&
4166 ((dxeCtxt->txCompletedFrames > 0) ||
4167 (WLANDXE_POWER_STATE_FULL == dxeCtxt->hostPowerState)))
4168 {
4169 dxeCtxt->txIntEnable = eWLAN_PAL_TRUE;
4170 wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE);
4171 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004172 "%s %s : %d, %s : %d", __func__,
Jeff Johnson295189b2012-06-20 16:38:30 -07004173 channelType[dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].channelType],
4174 dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc,
4175 channelType[dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].channelType],
4176 dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc);
Leo Changac1d3612013-07-01 15:15:51 -07004177
4178 if((WLANDXE_POWER_STATE_FULL != dxeCtxt->hostPowerState) &&
4179 (eWLAN_PAL_FALSE == tempDxeCtrlBlk->smsmToggled))
4180 {
4181 /* After TX Comp processing, still remaining frame on the DXE TX ring
4182 * And when push frame, RING was not empty marked
4183 * Then when push frame, no SMSM toggle happen
4184 * To avoid permanent TX stall, SMSM toggle is needed at here
4185 * With this toggle, host should gaurantee SMSM state should be changed */
Mihir Shete68ed77a2014-10-10 10:47:12 +05304186 dxeNotifySmsm(eWLAN_PAL_TRUE, dxeCtxt->txRingsEmpty);
Leo Changac1d3612013-07-01 15:15:51 -07004187 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004188 }
4189
4190 /*Kicking the DXE after the TX Complete interrupt was enabled - to avoid
4191 the posibility of a race*/
4192 dxePsComplete(dxeCtxt, eWLAN_PAL_FALSE);
4193
4194 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004195 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004196 return;
4197}
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004198
4199/*==========================================================================
4200 @ Function Name
4201 dxeTXReSyncDesc
4202
4203 @ Description
4204 When STA comeout from IMPS, check DXE TX next transfer candidate descriptor
4205 And HW programmed descriptor.
4206 If any async happen between HW/SW TX stall will happen
4207
4208 @ Parameters
4209 void *msgPtr
4210 Message pointer to sync with TX thread
4211
4212 @ Return
4213 NONE
4214===========================================================================*/
4215void dxeTXReSyncDesc
4216(
4217 wpt_msg *msgPtr
4218)
4219{
4220 wpt_msg *msgContent = (wpt_msg *)msgPtr;
4221 WLANDXE_CtrlBlkType *pDxeCtrlBlk;
4222 wpt_uint32 nextDescReg;
4223 WLANDXE_ChannelCBType *channelEntry;
4224 WLANDXE_DescCtrlBlkType *validCtrlBlk;
4225 wpt_uint32 descLoop;
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004226 wpt_uint32 channelLoop;
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004227
4228 if(NULL == msgContent)
4229 {
4230 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4231 "dxeTXReSyncDesc Invalid Control Block");
4232 return;
4233 }
4234
4235 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
4236 "dxeTXReSyncDesc Try to re-sync TX channel if any problem");
4237 pDxeCtrlBlk = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
4238
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004239 for(channelLoop = WDTS_CHANNEL_TX_LOW_PRI; channelLoop < WDTS_CHANNEL_RX_LOW_PRI; channelLoop++)
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004240 {
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004241 channelEntry = &pDxeCtrlBlk->dxeChannel[channelLoop];
4242 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
4243 "%11s : Try to detect TX descriptor async", channelType[channelEntry->channelType]);
4244 wpalReadRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
4245 &nextDescReg);
4246 /* Async detect without TX pending frame */
4247 if(channelEntry->tailCtrlBlk == channelEntry->headCtrlBlk)
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004248 {
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004249 if(nextDescReg != channelEntry->tailCtrlBlk->linkedDescPhyAddr)
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004250 {
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004251 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
4252 "TX Async no Pending frame");
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304253
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07004254 dxeChannelMonitor("!!! TX Async no Pending frame !!!", channelEntry, NULL);
4255 dxeChannelRegisterDump(channelEntry, "!!! TX Async no Pending frame !!!", NULL);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304256
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004257 wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004258 channelEntry->tailCtrlBlk->linkedDescPhyAddr);
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004259 }
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004260 }
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004261 /* Async detect with some TX pending frames
4262 * next descriptor register should sync with first valid descriptor */
4263 else
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004264 {
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004265 validCtrlBlk = channelEntry->tailCtrlBlk;
4266 for(descLoop = 0; descLoop < channelEntry->numDesc; descLoop++)
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004267 {
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004268 if(validCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID)
4269 {
4270 if(nextDescReg != validCtrlBlk->linkedDescPhyAddr)
4271 {
4272 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
4273 "TX Async");
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304274
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07004275 dxeChannelMonitor("!!! TX Async !!!", channelEntry, NULL);
4276 dxeChannelRegisterDump(channelEntry, "!!! TX Async !!!", NULL);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304277
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004278 wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
4279 validCtrlBlk->linkedDescPhyAddr);
4280 }
4281 break;
4282 }
4283 validCtrlBlk = (WLANDXE_DescCtrlBlkType *)validCtrlBlk->nextCtrlBlk;
4284 if(validCtrlBlk == channelEntry->headCtrlBlk->nextCtrlBlk)
4285 {
4286 /* Finished to test till head control blcok, but could not find valid descriptor
4287 * from head to tail all descriptors are invalidated
4288 * host point of view head descriptor is next TX candidate
4289 * So, next descriptor control have to be programmed with head descriptor
4290 * check */
4291 if(nextDescReg != channelEntry->headCtrlBlk->linkedDescPhyAddr)
4292 {
4293 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnsonab79c8d2012-12-10 14:30:13 -08004294 "TX Async with not completed transferred frames, next descriptor must be head");
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304295
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07004296 dxeChannelMonitor("!!! TX Async !!!", channelEntry, NULL);
4297 dxeChannelRegisterDump(channelEntry, "!!! TX Async !!!", NULL);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304298
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004299 wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
4300 validCtrlBlk->linkedDescPhyAddr);
4301 }
4302 break;
4303 }
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004304 }
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004305 }
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004306 }
4307
Madan Mohan Koyyalamudi5f57c102012-10-15 15:52:54 -07004308 /* HW/SW descriptor resync is done.
4309 * Next if there are any valid descriptor in chain, Push to HW again */
4310 for(channelLoop = WDTS_CHANNEL_TX_LOW_PRI; channelLoop < WDTS_CHANNEL_RX_LOW_PRI; channelLoop++)
4311 {
4312 channelEntry = &pDxeCtrlBlk->dxeChannel[channelLoop];
4313 if(channelEntry->tailCtrlBlk == channelEntry->headCtrlBlk)
4314 {
4315 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
4316 "%11s : No TX Pending frame",
4317 channelType[channelEntry->channelType]);
4318 /* No Pending frame, Do nothing */
4319 }
4320 else
4321 {
4322 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
4323 "%11s : TX Pending frame, process it",
4324 channelType[channelEntry->channelType]);
4325 validCtrlBlk = channelEntry->tailCtrlBlk;
4326 for(descLoop = 0; descLoop < channelEntry->numDesc; descLoop++)
4327 {
4328 if(validCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID)
4329 {
4330 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
4331 "%11s : when exit IMPS found valid descriptor",
4332 channelType[channelEntry->channelType]);
4333
4334 /* Found valid descriptor, kick DXE */
4335 wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr,
4336 channelEntry->extraConfig.chan_mask);
4337 break;
4338 }
4339 validCtrlBlk = (WLANDXE_DescCtrlBlkType *)validCtrlBlk->nextCtrlBlk;
4340 if(validCtrlBlk == channelEntry->headCtrlBlk->nextCtrlBlk)
4341 {
4342 /* Finished to test till head control blcok, but could not find valid descriptor
4343 * from head to tail all descriptors are invalidated */
4344 break;
4345 }
4346 }
4347 }
4348 }
4349
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004350 wpalMemoryFree(msgPtr);
4351 return;
4352}
4353
Jeff Johnson295189b2012-06-20 16:38:30 -07004354/*==========================================================================
Mihir Shete40a55652014-03-02 14:14:47 +05304355 @ Function Name
4356 dxeDebugTxDescReSync
4357
4358 @ Description
4359 Check DXE Tx channel state and correct it in
4360 case Tx Data stall is detected by calling
4361 %dxeTXReSyncDesc. Also ensure that WCN SS
4362 is not power collapsed before calling
4363 %dxeTXReSyncDesc
4364
4365 @ Parameters
4366 void *msgPtr
4367 Message pointer to sync with TX thread
4368
4369 @ Return
4370 NONE
4371===========================================================================*/
4372void dxeDebugTxDescReSync
4373(
4374 wpt_msg *msgPtr
4375)
4376{
4377 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4378 "%s: Check for DXE TX Async",__func__);
4379 /* Make wake up HW */
4380 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
4381 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
4382
4383 wpalSleep(10);
4384
4385 dxeTXReSyncDesc(msgPtr);
4386}
4387/*==========================================================================
Jeff Johnson295189b2012-06-20 16:38:30 -07004388 @ Function Name
4389 dxeTXISR
4390
4391 @ Description
4392 TX interrupt ISR
4393 Platform will call this function if INT is happen
4394 This function must be registered into platform interrupt module
4395
4396 @ Parameters
4397 void *hostCtxt
4398 DXE host driver control context,
4399 pre registerd during interrupt registration
4400
4401 @ Return
4402 PAL_STATUS_T
4403===========================================================================*/
4404static void dxeTXISR
4405(
4406 void *hostCtxt
4407)
4408{
4409 WLANDXE_CtrlBlkType *dxeCtxt = (WLANDXE_CtrlBlkType *)hostCtxt;
4410 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07004411
4412 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004413 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004414
4415 /* Return from here if the RIVA is in IMPS, to avoid register access */
Jeff Johnsone7245742012-09-05 17:12:55 -07004416 if(WLANDXE_POWER_STATE_DOWN == dxeCtxt->hostPowerState)
Jeff Johnson295189b2012-06-20 16:38:30 -07004417 {
Jeff Johnsone7245742012-09-05 17:12:55 -07004418 dxeCtxt->txIntEnable = eWLAN_PAL_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004419 /* Disable interrupt at here,
4420 IMPS or IMPS Pending state should not access RIVA register */
4421 status = wpalDisableInterrupt(DXE_INTERRUPT_TX_COMPLE);
4422 if(eWLAN_PAL_STATUS_SUCCESS != status)
4423 {
4424 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4425 "dxeRXFrameReadyISR Disable RX ready interrupt fail");
4426 return;
4427 }
4428 dxeCtxt->txIntDisabledByIMPS = eWLAN_PAL_TRUE;
4429 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004430 "%s Riva is in %d, return from here ", __func__, dxeCtxt->hostPowerState);
Jeff Johnson295189b2012-06-20 16:38:30 -07004431 return;
4432 }
4433
Jeff Johnson295189b2012-06-20 16:38:30 -07004434 /* Disable TX Complete Interrupt at here */
4435 status = wpalDisableInterrupt(DXE_INTERRUPT_TX_COMPLE);
4436 if(eWLAN_PAL_STATUS_SUCCESS != status)
4437 {
4438 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4439 "dxeTXCompISR Disable TX complete interrupt fail");
4440 return;
4441 }
4442 dxeCtxt->txIntEnable = eWLAN_PAL_FALSE;
4443
4444
4445 if( dxeCtxt->ucTxMsgCnt )
4446 {
4447 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
4448 "Avoiding serializing TX Complete event");
4449 return;
4450 }
4451
4452 dxeCtxt->ucTxMsgCnt = 1;
4453
4454 /* Serialize TX complete interrupt upon TX thread */
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08004455 if(NULL == dxeCtxt->txIsrMsg)
4456 {
4457 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
4458 "Invalid message");
4459 HDXE_ASSERT(0);
4460 return;
4461 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004462 status = wpalPostTxMsg(WDI_GET_PAL_CTX(),
4463 dxeCtxt->txIsrMsg);
4464 if(eWLAN_PAL_STATUS_SUCCESS != status)
4465 {
4466 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
4467 "dxeTXCompISR interrupt serialize fail status=%d", status);
4468 }
4469
4470 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004471 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004472 return;
4473}
4474
4475/*-------------------------------------------------------------------------
4476 * Global Function
4477 *-------------------------------------------------------------------------*/
4478/*==========================================================================
4479 @ Function Name
4480 WLANDXE_Open
4481
4482 @ Description
4483 Open host DXE driver, allocate DXE resources
4484 Allocate, DXE local control block, DXE descriptor pool, DXE descriptor control block pool
4485
4486 @ Parameters
Jeff Johnsona8a1a482012-12-12 16:49:33 -08004487 pVoid pAdapter : Driver global control block pointer
Jeff Johnson295189b2012-06-20 16:38:30 -07004488
4489 @ Return
4490 pVoid DXE local module control block pointer
4491===========================================================================*/
4492void *WLANDXE_Open
4493(
4494 void
4495)
4496{
4497 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4498 unsigned int idx;
4499 WLANDXE_ChannelCBType *currentChannel = NULL;
4500 int smsmInitState;
Mihir Shetebe94ebb2015-05-26 12:07:14 +05304501 wpt_uint8 chanMask = WDTS_TRANSPORT_CHANNELS_MASK;
Jeff Johnson295189b2012-06-20 16:38:30 -07004502
4503 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004504 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004505
Mihir Shetee6618162015-03-16 14:48:42 +05304506 if (wpalIsFwLoggingEnabled())
4507 {
Mihir Shetebe94ebb2015-05-26 12:07:14 +05304508 chanMask |= WDTS_RX_LOG_CHANNEL_MASK;
Mihir Shetee6618162015-03-16 14:48:42 +05304509 }
Mihir Shetebe94ebb2015-05-26 12:07:14 +05304510
4511 if (wpalIsFwEvLoggingEnabled())
Mihir Shetee6618162015-03-16 14:48:42 +05304512 {
Mihir Shetebe94ebb2015-05-26 12:07:14 +05304513 chanMask |= WDTS_RX_FW_LOG_CHANNEL_MASK;
Mihir Shetee6618162015-03-16 14:48:42 +05304514 }
Mihir Shetebe94ebb2015-05-26 12:07:14 +05304515 dxeSetEnabledChannels(chanMask);
Mihir Shetee6618162015-03-16 14:48:42 +05304516
Jeff Johnson295189b2012-06-20 16:38:30 -07004517 /* This is temporary allocation */
4518 tempDxeCtrlBlk = (WLANDXE_CtrlBlkType *)wpalMemoryAllocate(sizeof(WLANDXE_CtrlBlkType));
4519 if(NULL == tempDxeCtrlBlk)
4520 {
4521 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4522 "WLANDXE_Open Control Block Alloc Fail");
4523 return NULL;
4524 }
4525 wpalMemoryZero(tempDxeCtrlBlk, sizeof(WLANDXE_CtrlBlkType));
4526
jagadeeshf869bba2015-04-07 20:06:21 +05304527 dxeCommonDefaultConfig(tempDxeCtrlBlk);
Jeff Johnson295189b2012-06-20 16:38:30 -07004528
Mihir Shetee6618162015-03-16 14:48:42 +05304529 foreach_valid_channel(idx)
Jeff Johnson295189b2012-06-20 16:38:30 -07004530 {
4531 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4532 "WLANDXE_Open Channel %s Open Start", channelType[idx]);
4533 currentChannel = &tempDxeCtrlBlk->dxeChannel[idx];
Mihir Shetebe94ebb2015-05-26 12:07:14 +05304534 currentChannel->channelType = idx;
Jeff Johnson295189b2012-06-20 16:38:30 -07004535
4536 /* Config individual channels from channel default setup table */
4537 status = dxeChannelDefaultConfig(tempDxeCtrlBlk,
4538 currentChannel);
4539 if(eWLAN_PAL_STATUS_SUCCESS != status)
4540 {
4541 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4542 "WLANDXE_Open Channel Basic Configuration Fail for channel %d", idx);
4543 WLANDXE_Close(tempDxeCtrlBlk);
4544 return NULL;
4545 }
4546
4547 /* Allocate DXE Control Block will be used by host DXE driver */
4548 status = dxeCtrlBlkAlloc(tempDxeCtrlBlk, currentChannel);
4549 if(eWLAN_PAL_STATUS_SUCCESS != status)
4550 {
4551 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4552 "WLANDXE_Open Alloc DXE Control Block Fail for channel %d", idx);
4553
4554 WLANDXE_Close(tempDxeCtrlBlk);
4555 return NULL;
4556 }
4557 status = wpalMutexInit(&currentChannel->dxeChannelLock);
4558 if(eWLAN_PAL_STATUS_SUCCESS != status)
4559 {
4560 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4561 "WLANDXE_Open Lock Init Fail for channel %d", idx);
4562 WLANDXE_Close(tempDxeCtrlBlk);
4563 return NULL;
4564 }
4565
4566 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4567 "WLANDXE_Open Channel %s Open Success", channelType[idx]);
4568 }
4569
4570 /* Allocate and Init RX READY ISR Serialize Buffer */
4571 tempDxeCtrlBlk->rxIsrMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
4572 if(NULL == tempDxeCtrlBlk->rxIsrMsg)
4573 {
4574 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4575 "WLANDXE_Open Alloc RX ISR Fail");
4576 WLANDXE_Close(tempDxeCtrlBlk);
4577 return NULL;
4578 }
4579 wpalMemoryZero(tempDxeCtrlBlk->rxIsrMsg, sizeof(wpt_msg));
4580 tempDxeCtrlBlk->rxIsrMsg->callback = dxeRXEventHandler;
4581 tempDxeCtrlBlk->rxIsrMsg->pContext = (void *)tempDxeCtrlBlk;
4582
4583 /* Allocate and Init TX COMP ISR Serialize Buffer */
4584 tempDxeCtrlBlk->txIsrMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
4585 if(NULL == tempDxeCtrlBlk->txIsrMsg)
4586 {
4587 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4588 "WLANDXE_Open Alloc TX ISR Fail");
4589 WLANDXE_Close(tempDxeCtrlBlk);
4590 return NULL;
4591 }
4592 wpalMemoryZero(tempDxeCtrlBlk->txIsrMsg, sizeof(wpt_msg));
4593 tempDxeCtrlBlk->txIsrMsg->callback = dxeTXEventHandler;
4594 tempDxeCtrlBlk->txIsrMsg->pContext = (void *)tempDxeCtrlBlk;
4595
4596 /* Allocate and Init RX Packet Available Serialize Message Buffer */
4597 tempDxeCtrlBlk->rxPktAvailMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
4598 if(NULL == tempDxeCtrlBlk->rxPktAvailMsg)
4599 {
4600 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4601 "WLANDXE_Open Alloc RX Packet Available Message Fail");
4602 WLANDXE_Close(tempDxeCtrlBlk);
4603 return NULL;
4604 }
4605 wpalMemoryZero(tempDxeCtrlBlk->rxPktAvailMsg, sizeof(wpt_msg));
4606 tempDxeCtrlBlk->rxPktAvailMsg->callback = dxeRXPacketAvailableEventHandler;
4607 tempDxeCtrlBlk->rxPktAvailMsg->pContext = (void *)tempDxeCtrlBlk;
4608
4609 tempDxeCtrlBlk->freeRXPacket = NULL;
4610 tempDxeCtrlBlk->dxeCookie = WLANDXE_CTXT_COOKIE;
4611 tempDxeCtrlBlk->rxIntDisabledByIMPS = eWLAN_PAL_FALSE;
4612 tempDxeCtrlBlk->txIntDisabledByIMPS = eWLAN_PAL_FALSE;
Jeff Johnsone7245742012-09-05 17:12:55 -07004613 tempDxeCtrlBlk->driverReloadInProcessing = eWLAN_PAL_FALSE;
Leo Changac1d3612013-07-01 15:15:51 -07004614 tempDxeCtrlBlk->smsmToggled = eWLAN_PAL_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004615
4616 /* Initialize SMSM state
4617 * Init State is
4618 * Clear TX Enable
4619 * RING EMPTY STATE */
4620 smsmInitState = wpalNotifySmsm(WPAL_SMSM_WLAN_TX_ENABLE,
4621 WPAL_SMSM_WLAN_TX_RINGS_EMPTY);
4622 if(0 != smsmInitState)
4623 {
4624 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4625 "SMSM Channel init fail %d", smsmInitState);
Mihir Shetee6618162015-03-16 14:48:42 +05304626 foreach_valid_channel(idx)
Jeff Johnson295189b2012-06-20 16:38:30 -07004627 {
4628 dxeChannelClose(tempDxeCtrlBlk, &tempDxeCtrlBlk->dxeChannel[idx]);
4629 }
Madan Mohan Koyyalamudibe3597f2012-11-15 17:33:55 -08004630 wpalMemoryFree(tempDxeCtrlBlk->rxIsrMsg);
4631 wpalMemoryFree(tempDxeCtrlBlk->txIsrMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -07004632 wpalMemoryFree(tempDxeCtrlBlk);
4633 return NULL;
4634 }
4635
Mihir Shete44547fb2014-03-10 14:15:42 +05304636#ifdef WLAN_DXE_LOW_RESOURCE_TIMER
Leo Chang72cdfd32013-10-17 20:36:30 -07004637 wpalTimerInit(&tempDxeCtrlBlk->rxResourceAvailableTimer,
4638 dxeRXResourceAvailableTimerExpHandler,
4639 tempDxeCtrlBlk);
Mihir Shete44547fb2014-03-10 14:15:42 +05304640#endif
Leo Chang72cdfd32013-10-17 20:36:30 -07004641
Mihir Shetefdc9f532014-01-09 15:03:02 +05304642 wpalTimerInit(&tempDxeCtrlBlk->dxeSSRTimer,
4643 dxeSSRTimerExpHandler, tempDxeCtrlBlk);
4644
Jeff Johnson295189b2012-06-20 16:38:30 -07004645 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4646 "WLANDXE_Open Success");
4647 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004648 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004649 return (void *)tempDxeCtrlBlk;
4650}
4651
4652/*==========================================================================
4653 @ Function Name
4654 WLANDXE_ClientRegistration
4655
4656 @ Description
4657 Make callback functions registration into DXE driver from DXE driver client
4658
4659 @ Parameters
4660 pVoid pDXEContext : DXE module control block
Mihir Shetec4093f92015-05-28 15:21:11 +05304661 WDTS_ClientCallbacks WDTSCb : Callbacks to WDTS to indicate various events
Jeff Johnson295189b2012-06-20 16:38:30 -07004662 void *userContext : DXE Cliennt control block
4663
4664 @ Return
4665 wpt_status
4666===========================================================================*/
4667wpt_status WLANDXE_ClientRegistration
4668(
4669 void *pDXEContext,
Mihir Shetec4093f92015-05-28 15:21:11 +05304670 WDTS_ClientCallbacks WDTSCb,
Jeff Johnson295189b2012-06-20 16:38:30 -07004671 void *userContext
4672)
4673{
4674 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4675 WLANDXE_CtrlBlkType *dxeCtxt;
4676
4677 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004678 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004679
4680 /* Sanity */
4681 if(NULL == pDXEContext)
4682 {
4683 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4684 "WLANDXE_ClientRegistration Invalid DXE CB");
4685 return eWLAN_PAL_STATUS_E_INVAL;
4686 }
4687
Jeff Johnson295189b2012-06-20 16:38:30 -07004688 if(NULL == userContext)
4689 {
4690 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4691 "WLANDXE_ClientRegistration Invalid userContext");
4692 return eWLAN_PAL_STATUS_E_INVAL;
4693 }
4694
4695 dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
4696
4697 /* Assign */
Mihir Shetec4093f92015-05-28 15:21:11 +05304698 dxeCtxt->rxReadyCB = WDTSCb.rxFrameReadyCB;
4699 dxeCtxt->txCompCB = WDTSCb.txCompleteCB;
4700 dxeCtxt->lowResourceCB = WDTSCb.lowResourceCB;
4701 dxeCtxt->receiveMbMsgCB = WDTSCb.receiveMbMsgCB;
Mihir Shete5affadc2015-05-29 20:54:57 +05304702 dxeCtxt->receiveLogCompleteCB = WDTSCb.receiveLogCompleteCB;
Jeff Johnson295189b2012-06-20 16:38:30 -07004703 dxeCtxt->clientCtxt = userContext;
4704
4705 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004706 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004707 return status;
4708}
4709
4710/*==========================================================================
4711 @ Function Name
4712 WLANDXE_Start
4713
4714 @ Description
4715 Start Host DXE driver
4716 Initialize DXE channels and start channel
4717
4718 @ Parameters
4719 pVoid pDXEContext : DXE module control block
4720
4721 @ Return
4722 wpt_status
4723===========================================================================*/
4724wpt_status WLANDXE_Start
4725(
4726 void *pDXEContext
4727)
4728{
4729 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4730 wpt_uint32 idx;
4731 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
4732
4733 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004734 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004735
4736 /* Sanity */
4737 if(NULL == pDXEContext)
4738 {
4739 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4740 "WLANDXE_Start Invalid DXE CB");
4741 return eWLAN_PAL_STATUS_E_INVAL;
4742 }
4743 dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
4744
4745 /* WLANDXE_Start called means DXE engine already initiates
4746 * And DXE HW is reset and init finished
4747 * But here to make sure HW is initialized, reset again */
jagadeeshf869bba2015-04-07 20:06:21 +05304748 dxeEngineCoreStart(dxeCtxt);
Jeff Johnson295189b2012-06-20 16:38:30 -07004749
4750 /* Individual Channel Start */
Mihir Shetee6618162015-03-16 14:48:42 +05304751 foreach_valid_channel(idx)
Jeff Johnson295189b2012-06-20 16:38:30 -07004752 {
4753 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4754 "WLANDXE_Start Channel %s Start", channelType[idx]);
4755
4756 /* Allocate DXE descriptor will be shared by Host driver and DXE engine */
4757 /* Make connection between DXE descriptor and DXE control block */
4758 status = dxeDescAllocAndLink(tempDxeCtrlBlk, &dxeCtxt->dxeChannel[idx]);
4759 if(eWLAN_PAL_STATUS_SUCCESS != status)
4760 {
4761 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4762 "WLANDXE_Start Alloc DXE Descriptor Fail for channel %d", idx);
4763 return status;
4764 }
4765
4766 /* Program each channel register with configuration arguments */
4767 status = dxeChannelInitProgram(dxeCtxt,
4768 &dxeCtxt->dxeChannel[idx]);
4769 if(eWLAN_PAL_STATUS_SUCCESS != status)
4770 {
4771 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4772 "WLANDXE_Start %d Program DMA channel Fail", idx);
4773 return status;
4774 }
4775
4776 /* ??? Trigger to start DMA channel
4777 * This must be seperated from ??? */
4778 status = dxeChannelStart(dxeCtxt,
4779 &dxeCtxt->dxeChannel[idx]);
4780 if(eWLAN_PAL_STATUS_SUCCESS != status)
4781 {
4782 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4783 "WLANDXE_Start %d Channel Start Fail", idx);
4784 return status;
4785 }
4786 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4787 "WLANDXE_Start Channel %s Start Success", channelType[idx]);
4788 }
4789
4790 /* Register ISR to OS */
4791 /* Register TX complete interrupt into platform */
4792 status = wpalRegisterInterrupt(DXE_INTERRUPT_TX_COMPLE,
4793 dxeTXISR,
4794 dxeCtxt);
4795 if(eWLAN_PAL_STATUS_SUCCESS != status)
4796 {
4797 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4798 "WLANDXE_Start TX comp interrupt registration Fail");
4799 return status;
4800 }
4801
4802 /* Register RX ready interrupt into platform */
4803 status = wpalRegisterInterrupt(DXE_INTERRUPT_RX_READY,
4804 dxeRXISR,
4805 dxeCtxt);
4806 if(eWLAN_PAL_STATUS_SUCCESS != status)
4807 {
4808 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4809 "WLANDXE_Start RX Ready interrupt registration Fail");
4810 return status;
4811 }
4812
4813 /* Enable system level ISR */
4814 /* Enable RX ready Interrupt at here */
4815 status = wpalEnableInterrupt(DXE_INTERRUPT_RX_READY);
4816 if(eWLAN_PAL_STATUS_SUCCESS != status)
4817 {
4818 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4819 "dxeTXCompleteEventHandler Enable TX complete interrupt fail");
4820 return status;
4821 }
4822
4823 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004824 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004825 return status;
4826}
4827
4828/*==========================================================================
4829 @ Function Name
4830 WLANDXE_TXFrame
4831
4832 @ Description
4833 Trigger frame transmit from host to RIVA
4834
4835 @ Parameters
4836 pVoid pDXEContext : DXE Control Block
4837 wpt_packet pPacket : transmit packet structure
4838 WDTS_ChannelType channel : TX channel
4839
4840 @ Return
4841 wpt_status
4842===========================================================================*/
4843wpt_status WLANDXE_TxFrame
4844(
4845 void *pDXEContext,
4846 wpt_packet *pPacket,
4847 WDTS_ChannelType channel
4848)
4849{
4850 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4851 WLANDXE_ChannelCBType *currentChannel = NULL;
4852 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
4853 unsigned int *lowThreshold = NULL;
4854
4855 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004856 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004857
4858 /* Sanity */
4859 if(NULL == pDXEContext)
4860 {
4861 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4862 "WLANDXE_Start Invalid DXE CB");
4863 return eWLAN_PAL_STATUS_E_INVAL;
4864 }
4865
4866 if(NULL == pPacket)
4867 {
4868 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4869 "WLANDXE_Start Invalid pPacket");
4870 return eWLAN_PAL_STATUS_E_INVAL;
4871 }
4872
Mihir Shetee6618162015-03-16 14:48:42 +05304873 if(WDTS_CHANNEL_MAX <= channel)
Jeff Johnson295189b2012-06-20 16:38:30 -07004874 {
4875 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4876 "WLANDXE_Start Invalid channel");
4877 return eWLAN_PAL_STATUS_E_INVAL;
4878 }
4879
4880 dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
4881
4882 currentChannel = &dxeCtxt->dxeChannel[channel];
4883
4884
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08004885 status = wpalMutexAcquire(&currentChannel->dxeChannelLock);
4886 if(eWLAN_PAL_STATUS_SUCCESS != status)
4887 {
4888 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4889 "WLANDXE_TxFrame Mutex Acquire fail");
4890 return status;
4891 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004892
4893 lowThreshold = currentChannel->channelType == WDTS_CHANNEL_TX_LOW_PRI?
4894 &(dxeCtxt->txCompInt.txLowResourceThreshold_LoPriCh):
4895 &(dxeCtxt->txCompInt.txLowResourceThreshold_HiPriCh);
4896
4897 /* Decide have to activate TX complete event or not */
4898 switch(dxeCtxt->txCompInt.txIntEnable)
4899 {
4900 /* TX complete interrupt will be activated when low DXE resource */
4901 case WLANDXE_TX_COMP_INT_LR_THRESHOLD:
4902 if((currentChannel->numFreeDesc <= *lowThreshold) &&
4903 (eWLAN_PAL_FALSE == dxeCtxt->txIntEnable))
4904 {
4905 dxeCtxt->txIntEnable = eWLAN_PAL_TRUE;
4906 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
4907 channel,
4908 eWLAN_PAL_FALSE);
4909 }
4910 break;
4911
Jeff Johnsonab79c8d2012-12-10 14:30:13 -08004912 /* TX complete interrupt will be activated n number of frames transferred */
Jeff Johnson295189b2012-06-20 16:38:30 -07004913 case WLANDXE_TX_COMP_INT_PER_K_FRAMES:
4914 if(channel == WDTS_CHANNEL_TX_LOW_PRI)
4915 {
4916 currentChannel->numFrameBeforeInt++;
4917 }
4918 break;
4919
4920 /* TX complete interrupt will be activated periodically */
4921 case WLANDXE_TX_COMP_INT_TIMER:
4922 break;
4923 }
4924
4925 dxeCtxt->txCompletedFrames++;
4926
4927 /* Update DXE descriptor, this is frame based
4928 * if a frame consist of N fragments, N Descriptor will be programed */
4929 status = dxeTXPushFrame(currentChannel, pPacket);
4930 if(eWLAN_PAL_STATUS_SUCCESS != status)
4931 {
4932 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4933 "WLANDXE_TxFrame TX Push Frame fail");
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08004934 status = wpalMutexRelease(&currentChannel->dxeChannelLock);
4935 if(eWLAN_PAL_STATUS_SUCCESS != status)
4936 {
4937 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4938 "WLANDXE_TxFrame Mutex Release fail");
4939 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004940 return status;
4941 }
4942
4943 /* If specific channel hit low resource condition, send notification to upper layer */
4944 if(currentChannel->numFreeDesc <= *lowThreshold)
4945 {
4946 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
4947 channel,
4948 eWLAN_PAL_FALSE);
4949 currentChannel->hitLowResource = eWLAN_PAL_TRUE;
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -07004950
4951 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4952 "%11s : Low Resource currentChannel->numRsvdDesc %d",
4953 channelType[currentChannel->channelType],
4954 currentChannel->numRsvdDesc);
Mihir Shete68ed77a2014-10-10 10:47:12 +05304955 if (WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN == dxeCtxt->rivaPowerState)
4956 {
4957 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
4958 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
4959 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004960 }
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08004961 status = wpalMutexRelease(&currentChannel->dxeChannelLock);
4962 if(eWLAN_PAL_STATUS_SUCCESS != status)
4963 {
4964 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4965 "WLANDXE_TxFrame Mutex Release fail");
4966 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004967
4968 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004969 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004970 return status;
4971}
4972
4973/*==========================================================================
4974 @ Function Name
4975 WLANDXE_CompleteTX
4976
4977 @ Description
4978 Informs DXE that the current series of Tx packets is complete
4979
4980 @ Parameters
4981 pContext pDXEContext : DXE Control Block
4982 ucTxResReq TX resource number required by TL/WDI
4983
4984 @ Return
4985 wpt_status
4986===========================================================================*/
4987wpt_status
4988WLANDXE_CompleteTX
4989(
4990 void* pContext,
4991 wpt_uint32 ucTxResReq
4992)
4993{
4994 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4995 WLANDXE_CtrlBlkType *dxeCtxt = (WLANDXE_CtrlBlkType *)(pContext);
4996 WLANDXE_ChannelCBType *channelCb = NULL;
4997 wpt_boolean inLowRes;
4998
4999 /* Sanity Check */
5000 if( NULL == pContext )
5001 {
5002 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5003 "WLANDXE_CompleteTX invalid param");
5004 return eWLAN_PAL_STATUS_E_INVAL;
5005 }
5006
5007 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI];
5008 inLowRes = channelCb->hitLowResource;
5009
5010 if(WLANDXE_TX_LOW_RES_THRESHOLD < ucTxResReq)
5011 {
5012 /* Raise threshold temporarily if necessary */
5013 dxeCtxt->txCompInt.txLowResourceThreshold_LoPriCh = ucTxResReq;
5014
5015 if(eWLAN_PAL_FALSE == inLowRes)
5016 {
5017 /* Put the channel to low resource condition */
5018 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
5019 WDTS_CHANNEL_TX_LOW_PRI,
5020 eWLAN_PAL_FALSE);
5021 inLowRes = channelCb->hitLowResource = eWLAN_PAL_TRUE;
5022 }
5023 }
5024
5025 /*Try to reclaim resources*/
5026 dxeTXCompleteProcessing(dxeCtxt);
5027
5028 /* In previous WLANTL_GetFrames call, TL didn't fetch a packet
5029 because its fragment size is larger than DXE free resource. */
5030 if(0 < ucTxResReq)
5031 {
5032 /* DXE successfully claimed enough free DXE resouces for next fetch. */
5033 if(WLANDXE_GetFreeTxDataResNumber(dxeCtxt) >= ucTxResReq)
5034 {
5035 /* DXE has not been in low resource condition. DXE forces to kick off
5036 TX tranmit */
5037 if((eWLAN_PAL_FALSE == inLowRes) &&
5038 (eWLAN_PAL_FALSE == channelCb->hitLowResource))
5039 {
5040 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
5041 WDTS_CHANNEL_TX_LOW_PRI,
5042 eWLAN_PAL_FALSE);
5043 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
5044 WDTS_CHANNEL_TX_LOW_PRI,
5045 eWLAN_PAL_TRUE);
5046 channelCb->hitLowResource = eWLAN_PAL_FALSE;
5047 }
5048 }
5049 else
5050 {
5051 /* DXE doesn't have enough free DXE resources. Put the channel
5052 to low resource condition. */
5053 if(eWLAN_PAL_FALSE == channelCb->hitLowResource)
5054 {
5055 /* Put the channel to low resource condition */
5056 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
5057 WDTS_CHANNEL_TX_LOW_PRI,
5058 eWLAN_PAL_FALSE);
5059 channelCb->hitLowResource = eWLAN_PAL_TRUE;
5060 }
5061 }
5062 }
5063
5064 return status;
5065}
5066
5067/*==========================================================================
5068 @ Function Name
5069 WLANDXE_Stop
5070
5071 @ Description
5072 Stop DXE channels and DXE engine operations
5073 Disable all channel interrupt
5074 Stop all channel operation
5075
5076 @ Parameters
5077 pVoid pDXEContext : DXE Control Block
5078
5079 @ Return
5080 wpt_status
5081===========================================================================*/
5082wpt_status WLANDXE_Stop
5083(
5084 void *pDXEContext
5085)
5086{
5087 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5088 wpt_uint32 idx;
5089 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
5090
5091 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005092 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005093
5094 /* Sanity */
5095 if(NULL == pDXEContext)
5096 {
5097 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5098 "WLANDXE_Stop Invalid DXE CB");
5099 return eWLAN_PAL_STATUS_E_INVAL;
5100 }
5101
5102 dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
Mihir Shetee6618162015-03-16 14:48:42 +05305103 foreach_valid_channel(idx)
Jeff Johnson295189b2012-06-20 16:38:30 -07005104 {
5105 status = dxeChannelStop(dxeCtxt, &dxeCtxt->dxeChannel[idx]);
5106 if(eWLAN_PAL_STATUS_SUCCESS != status)
5107 {
5108 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5109 "WLANDXE_Stop Channel %d Stop Fail", idx);
Jeff Johnson295189b2012-06-20 16:38:30 -07005110 }
5111 }
5112
5113 /* During Stop unregister interrupt */
5114 wpalUnRegisterInterrupt(DXE_INTERRUPT_TX_COMPLE);
5115 wpalUnRegisterInterrupt(DXE_INTERRUPT_RX_READY);
5116
Mihir Shete44547fb2014-03-10 14:15:42 +05305117#ifdef WLAN_DXE_LOW_RESOURCE_TIMER
Leo Chang72cdfd32013-10-17 20:36:30 -07005118 if(VOS_TIMER_STATE_STOPPED !=
5119 wpalTimerGetCurStatus(&dxeCtxt->rxResourceAvailableTimer))
5120 {
5121 wpalTimerStop(&dxeCtxt->rxResourceAvailableTimer);
5122 }
Mihir Shete44547fb2014-03-10 14:15:42 +05305123#endif
Leo Chang72cdfd32013-10-17 20:36:30 -07005124
Jeff Johnson295189b2012-06-20 16:38:30 -07005125 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005126 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005127 return status;
5128}
5129
5130/*==========================================================================
5131 @ Function Name
5132 WLANDXE_Close
5133
5134 @ Description
5135 Close DXE channels
5136 Free DXE related resources
5137 DXE descriptor free
5138 Descriptor control block free
5139 Pre allocated RX buffer free
5140
5141 @ Parameters
5142 pVoid pDXEContext : DXE Control Block
5143
5144 @ Return
5145 wpt_status
5146===========================================================================*/
5147wpt_status WLANDXE_Close
5148(
5149 void *pDXEContext
5150)
5151{
5152 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5153 wpt_uint32 idx;
5154 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005155
5156 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005157 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005158
5159 /* Sanity */
5160 if(NULL == pDXEContext)
5161 {
5162 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5163 "WLANDXE_Stop Invalid DXE CB");
5164 return eWLAN_PAL_STATUS_E_INVAL;
5165 }
5166
5167 dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
Mihir Shete44547fb2014-03-10 14:15:42 +05305168#ifdef WLAN_DXE_LOW_RESOURCE_TIMER
Leo Chang72cdfd32013-10-17 20:36:30 -07005169 wpalTimerDelete(&dxeCtxt->rxResourceAvailableTimer);
Mihir Shete44547fb2014-03-10 14:15:42 +05305170#endif
Mihir Shetefdc9f532014-01-09 15:03:02 +05305171 wpalTimerDelete(&dxeCtxt->dxeSSRTimer);
Mihir Shetee6618162015-03-16 14:48:42 +05305172 foreach_valid_channel(idx)
Jeff Johnson295189b2012-06-20 16:38:30 -07005173 {
5174 wpalMutexDelete(&dxeCtxt->dxeChannel[idx].dxeChannelLock);
5175 dxeChannelClose(dxeCtxt, &dxeCtxt->dxeChannel[idx]);
Jeff Johnson295189b2012-06-20 16:38:30 -07005176 }
5177
5178 if(NULL != dxeCtxt->rxIsrMsg)
5179 {
5180 wpalMemoryFree(dxeCtxt->rxIsrMsg);
5181 }
5182 if(NULL != dxeCtxt->txIsrMsg)
5183 {
5184 wpalMemoryFree(dxeCtxt->txIsrMsg);
5185 }
5186 if(NULL != dxeCtxt->rxPktAvailMsg)
5187 {
5188 wpalMemoryFree(dxeCtxt->rxPktAvailMsg);
5189 }
5190
5191 wpalMemoryFree(pDXEContext);
5192
5193 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005194 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005195 return status;
5196}
5197
5198/*==========================================================================
5199 @ Function Name
5200 WLANDXE_TriggerTX
5201
5202 @ Description
5203 TBD
5204
5205 @ Parameters
5206 pVoid pDXEContext : DXE Control Block
5207
5208 @ Return
5209 wpt_status
5210===========================================================================*/
5211wpt_status WLANDXE_TriggerTX
5212(
5213 void *pDXEContext
5214)
5215{
5216 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5217
5218 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005219 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005220
5221 /* TBD */
5222
5223 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005224 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005225 return status;
5226}
5227
5228/*==========================================================================
5229 @ Function Name
5230 dxeTxThreadSetPowerStateEventHandler
5231
5232 @ Description
5233 If WDI sends set power state req, this event handler will be called in Tx
5234 thread context
5235
5236 @ Parameters
5237 void *msgPtr
5238 Event MSG
5239
5240 @ Return
5241 None
5242===========================================================================*/
5243void dxeTxThreadSetPowerStateEventHandler
5244(
5245 wpt_msg *msgPtr
5246)
5247{
5248 wpt_msg *msgContent = (wpt_msg *)msgPtr;
5249 WLANDXE_CtrlBlkType *dxeCtxt;
Mihir Shetea4306052014-03-25 00:02:54 +05305250 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07005251 WLANDXE_PowerStateType reqPowerState;
Mihir Shetea4306052014-03-25 00:02:54 +05305252 wpt_int8 i;
5253 WLANDXE_ChannelCBType *channelEntry;
5254 wpt_log_data_stall_channel_type channelLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07005255
5256 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005257 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005258
Jeff Johnson295189b2012-06-20 16:38:30 -07005259 dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
5260 reqPowerState = (WLANDXE_PowerStateType)msgContent->val;
5261 dxeCtxt->setPowerStateCb = (WLANDXE_SetPowerStateCbType)msgContent->ptr;
5262
5263 switch(reqPowerState)
5264 {
5265 case WLANDXE_POWER_STATE_BMPS:
5266 if(WLANDXE_RIVA_POWER_STATE_ACTIVE == dxeCtxt->rivaPowerState)
5267 {
5268 //don't block MC waiting for num_rsvd to become 0 since it may take a while
5269 //based on amount of TX and RX activity - during this time any received
5270 // management frames will remain un-processed consuming RX buffers
5271 dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN;
5272 dxeCtxt->hostPowerState = reqPowerState;
5273 }
5274 else
5275 {
5276 status = eWLAN_PAL_STATUS_E_INVAL;
5277 }
5278 break;
5279 case WLANDXE_POWER_STATE_IMPS:
5280 if(WLANDXE_RIVA_POWER_STATE_ACTIVE == dxeCtxt->rivaPowerState)
5281 {
Mihir Shetea4306052014-03-25 00:02:54 +05305282
5283 for(i = WDTS_CHANNEL_TX_LOW_PRI; i < WDTS_CHANNEL_RX_LOW_PRI; i++)
5284 {
5285 channelEntry = &dxeCtxt->dxeChannel[i];
5286 if(channelEntry->tailCtrlBlk != channelEntry->headCtrlBlk)
5287 {
5288 status = eWLAN_PAL_STATUS_E_FAILURE;
5289 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
5290 "%11s : %s :TX Pending frame",
5291 channelType[channelEntry->channelType], __func__);
5292
5293 dxeChannelMonitor("DXE_IMP_ERR", channelEntry, &channelLog);
5294 dxeDescriptorDump(channelEntry,
5295 channelEntry->headCtrlBlk->linkedDesc, 0);
5296 dxeChannelRegisterDump(channelEntry, "DXE_IMPS_ERR",
5297 &channelLog);
5298 dxeChannelAllDescDump(channelEntry,
5299 channelEntry->channelType,
5300 &channelLog);
5301 }
5302 }
5303
5304 if (eWLAN_PAL_STATUS_SUCCESS == status)
5305 {
5306 dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_IMPS_UNKNOWN;
5307 dxeCtxt->hostPowerState = WLANDXE_POWER_STATE_IMPS;
5308 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005309 }
5310 else
5311 {
5312 status = eWLAN_PAL_STATUS_E_INVAL;
5313 }
5314 break;
5315 case WLANDXE_POWER_STATE_FULL:
5316 if(WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN == dxeCtxt->rivaPowerState)
5317 {
5318 dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_ACTIVE;
5319 }
5320 dxeCtxt->hostPowerState = reqPowerState;
5321 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
5322 break;
5323 case WLANDXE_POWER_STATE_DOWN:
5324 WLANDXE_Stop((void *)dxeCtxt);
5325 break;
5326 default:
5327 //assert
5328 break;
5329 }
5330
5331 if(WLANDXE_POWER_STATE_BMPS_PENDING != dxeCtxt->hostPowerState)
5332 {
5333 dxeCtxt->setPowerStateCb(status,
5334 dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].descBottomLocPhyAddr);
5335 }
Ravali85acf6b2012-12-12 14:01:38 -08005336 else
5337 {
5338 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
5339 "%s State of DXE is WLANDXE_POWER_STATE_BMPS_PENDING, so cannot proceed", __func__);
5340 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005341 /* Free MSG buffer */
5342 wpalMemoryFree(msgPtr);
5343 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005344 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005345 return;
5346}
5347
5348
5349/*==========================================================================
5350 @ Function Name
5351 dxeRxThreadSetPowerStateEventHandler
5352
5353 @ Description
5354 If WDI sends set power state req, this event handler will be called in Rx
5355 thread context
5356
5357 @ Parameters
5358 void *msgPtr
5359 Event MSG
5360
5361 @ Return
5362 None
5363===========================================================================*/
5364void dxeRxThreadSetPowerStateEventHandler
5365(
5366 wpt_msg *msgPtr
5367)
5368{
5369 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5370
5371 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005372 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005373
5374 /* Now serialise the message through Tx thread also to make sure
5375 * no register access when RIVA is in powersave */
5376 /*Use the same message pointer just change the call back function */
5377 msgPtr->callback = dxeTxThreadSetPowerStateEventHandler;
5378 status = wpalPostTxMsg(WDI_GET_PAL_CTX(),
5379 msgPtr);
5380 if ( eWLAN_PAL_STATUS_SUCCESS != status )
5381 {
5382 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5383 "Tx thread Set power state req serialize fail status=%d",
Jeff Johnson9e237fb2013-10-30 18:46:20 -07005384 status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005385 }
5386
5387 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005388 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005389}
5390
5391/*==========================================================================
5392 @ Function Name
5393 WLANDXE_SetPowerState
5394
5395 @ Description
5396 From Client let DXE knows what is the WLAN HW(RIVA) power state
5397
5398 @ Parameters
5399 pVoid pDXEContext : DXE Control Block
5400 WLANDXE_PowerStateType powerState
5401
5402 @ Return
5403 wpt_status
5404===========================================================================*/
5405wpt_status WLANDXE_SetPowerState
5406(
5407 void *pDXEContext,
5408 WDTS_PowerStateType powerState,
5409 WDTS_SetPSCbType cBack
5410)
5411{
5412 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5413 WLANDXE_CtrlBlkType *pDxeCtrlBlk;
5414 WLANDXE_PowerStateType hostPowerState;
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07005415 wpt_msg *rxCompMsg;
5416 wpt_msg *txDescReSyncMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -07005417
5418 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005419 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005420 if(NULL == pDXEContext)
5421 {
5422 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Jeff Johnson9e237fb2013-10-30 18:46:20 -07005423 "NULL pDXEContext passed by caller");
Jeff Johnson295189b2012-06-20 16:38:30 -07005424 return eWLAN_PAL_STATUS_E_FAILURE;
5425 }
5426 pDxeCtrlBlk = (WLANDXE_CtrlBlkType *)pDXEContext;
5427
Jeff Johnson295189b2012-06-20 16:38:30 -07005428 switch(powerState)
5429 {
5430 case WDTS_POWER_STATE_FULL:
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07005431 if(WLANDXE_POWER_STATE_IMPS == pDxeCtrlBlk->hostPowerState)
5432 {
5433 txDescReSyncMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
5434 if(NULL == txDescReSyncMsg)
5435 {
5436 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5437 "WLANDXE_SetPowerState, TX Resync MSG MEM alloc Fail");
5438 }
5439 else
5440 {
5441 txDescReSyncMsg->callback = dxeTXReSyncDesc;
5442 txDescReSyncMsg->pContext = pDxeCtrlBlk;
5443 status = wpalPostTxMsg(WDI_GET_PAL_CTX(),
5444 txDescReSyncMsg);
5445 if(eWLAN_PAL_STATUS_SUCCESS != status)
5446 {
5447 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5448 "WLANDXE_SetPowerState, Post TX re-sync MSG fail");
5449 }
5450 }
5451 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005452 hostPowerState = WLANDXE_POWER_STATE_FULL;
5453 break;
5454 case WDTS_POWER_STATE_BMPS:
5455 pDxeCtrlBlk->hostPowerState = WLANDXE_POWER_STATE_BMPS;
5456 hostPowerState = WLANDXE_POWER_STATE_BMPS;
5457 break;
5458 case WDTS_POWER_STATE_IMPS:
Jeff Johnson295189b2012-06-20 16:38:30 -07005459 hostPowerState = WLANDXE_POWER_STATE_IMPS;
5460 break;
5461 case WDTS_POWER_STATE_DOWN:
5462 pDxeCtrlBlk->hostPowerState = WLANDXE_POWER_STATE_DOWN;
5463 hostPowerState = WLANDXE_POWER_STATE_DOWN;
5464 break;
5465 default:
5466 hostPowerState = WLANDXE_POWER_STATE_MAX;
5467 }
5468
5469 // A callback i.e. ACK back is needed only when we want to enable BMPS
5470 // and the data/management path is active because we want to ensure
5471 // DXE registers are not accessed when RIVA may be power-collapsed. So
5472 // we need a callback in enter_bmps_req (the request to RIVA is sent
5473 // only after ACK back from TX thread). A callback is not needed in
5474 // finish_scan_req during BMPS since data-path is resumed only in
5475 // finish_scan_rsp and no management frames are sent in between. No
5476 // callback is needed when going from BMPS enabled to BMPS suspended/
5477 // disabled when it is known that RIVA is awake and cannot enter power
5478 // collapse autonomously so no callback is needed in exit_bmps_rsp or
5479 // init_scan_rsp
5480 if ( cBack )
5481 {
5482 //serialize through Rx thread
5483 rxCompMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
5484 if(NULL == rxCompMsg)
5485 {
5486 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5487 "WLANDXE_SetPowerState, MSG MEM alloc Fail");
5488 return eWLAN_PAL_STATUS_E_RESOURCES;
5489 }
5490
5491 /* Event type, where it must be defined???? */
5492 /* THIS MUST BE CLEARED ASAP
5493 txCompMsg->type = TX_COMPLETE; */
5494 rxCompMsg->callback = dxeRxThreadSetPowerStateEventHandler;
5495 rxCompMsg->pContext = pDxeCtrlBlk;
5496 rxCompMsg->val = hostPowerState;
5497 rxCompMsg->ptr = cBack;
5498 status = wpalPostRxMsg(WDI_GET_PAL_CTX(),
5499 rxCompMsg);
5500 if ( eWLAN_PAL_STATUS_SUCCESS != status )
5501 {
5502 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5503 "Rx thread Set power state req serialize fail status=%d",
Jeff Johnson9e237fb2013-10-30 18:46:20 -07005504 status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005505 }
5506 }
5507 else
5508 {
5509 if ( WLANDXE_POWER_STATE_FULL == hostPowerState )
5510 {
5511 if( WLANDXE_POWER_STATE_BMPS == pDxeCtrlBlk->hostPowerState )
5512 {
5513 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
5514 }
5515 else if( WLANDXE_POWER_STATE_IMPS == pDxeCtrlBlk->hostPowerState )
5516 {
5517 /* Requested Full power from exit IMPS, reenable the interrupts*/
5518 if(eWLAN_PAL_TRUE == pDxeCtrlBlk->rxIntDisabledByIMPS)
5519 {
5520 pDxeCtrlBlk->rxIntDisabledByIMPS = eWLAN_PAL_FALSE;
5521 /* Enable RX interrupt at here, if new PS is not IMPS */
5522 status = wpalEnableInterrupt(DXE_INTERRUPT_RX_READY);
5523 if(eWLAN_PAL_STATUS_SUCCESS != status)
5524 {
5525 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005526 "%s Enable RX ready interrupt fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005527 return status;
5528 }
5529 }
5530 if(eWLAN_PAL_TRUE == pDxeCtrlBlk->txIntDisabledByIMPS)
5531 {
5532 pDxeCtrlBlk->txIntDisabledByIMPS = eWLAN_PAL_FALSE;
Jeff Johnsone7245742012-09-05 17:12:55 -07005533 pDxeCtrlBlk->txIntEnable = eWLAN_PAL_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005534 /* Enable RX interrupt at here, if new PS is not IMPS */
5535 status = wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE);
5536 if(eWLAN_PAL_STATUS_SUCCESS != status)
5537 {
5538 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005539 "%s Enable TX comp interrupt fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005540 return status;
5541 }
5542 }
5543 }
5544 pDxeCtrlBlk->hostPowerState = hostPowerState;
5545 pDxeCtrlBlk->rivaPowerState = WLANDXE_RIVA_POWER_STATE_ACTIVE;
5546 }
5547 else if ( hostPowerState == WLANDXE_POWER_STATE_BMPS )
5548 {
5549 pDxeCtrlBlk->hostPowerState = hostPowerState;
5550 pDxeCtrlBlk->rivaPowerState = WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN;
5551 }
Mihir Shetea4306052014-03-25 00:02:54 +05305552 else if ( hostPowerState == WLANDXE_POWER_STATE_IMPS )
5553 {
5554 pDxeCtrlBlk->hostPowerState = WLANDXE_POWER_STATE_IMPS;
5555 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005556 else
5557 {
5558 HDXE_ASSERT(0);
5559 }
5560 }
5561
5562 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005563 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005564
5565 return status;
5566}
5567
5568/*==========================================================================
5569 @ Function Name
5570 WLANDXE_GetFreeTxDataResNumber
5571
5572 @ Description
5573 Returns free descriptor numbers for TX data channel (TX high priority)
5574
5575 @ Parameters
5576 pVoid pDXEContext : DXE Control Block
5577
5578 @ Return
5579 wpt_uint32 Free descriptor number of TX high pri ch
5580===========================================================================*/
5581wpt_uint32 WLANDXE_GetFreeTxDataResNumber
5582(
5583 void *pDXEContext
5584)
5585{
5586 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005587 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005588
5589 if(NULL == pDXEContext)
5590 {
5591 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Jeff Johnson9e237fb2013-10-30 18:46:20 -07005592 "NULL parameter passed by caller");
Jeff Johnson295189b2012-06-20 16:38:30 -07005593 return (0);
5594 }
5595
Mihir Shetee6618162015-03-16 14:48:42 +05305596 return ((WLANDXE_CtrlBlkType *)pDXEContext)->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numFreeDesc;
Jeff Johnson295189b2012-06-20 16:38:30 -07005597}
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005598
5599/*==========================================================================
5600 @ Function Name
5601 WLANDXE_ChannelDebug
5602
5603 @ Description
5604 Display DXE Channel debugging information
5605 User may request to display DXE channel snapshot
5606 Or if host driver detects any abnormal stcuk may display
5607
5608 @ Parameters
Jeff Johnsonb88db982012-12-10 13:34:59 -08005609 displaySnapshot : Display DXE snapshot option
Mihir Shete40a55652014-03-02 14:14:47 +05305610 debugFlags : Enable stall detect features
5611 defined by WPAL_DeviceDebugFlags
5612 These features may effect
5613 data performance.
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005614
5615 @ Return
5616 NONE
5617
5618===========================================================================*/
5619void WLANDXE_ChannelDebug
5620(
Mihir Shete40a55652014-03-02 14:14:47 +05305621 wpt_boolean displaySnapshot,
5622 wpt_uint8 debugFlags
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005623)
5624{
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005625 wpt_msg *channelDebugMsg;
Mihir Shete40a55652014-03-02 14:14:47 +05305626 wpt_msg *txDescReSyncMsg ;
Mihir Shete41c41bb2014-08-18 17:37:12 +05305627 wpt_uint32 regValue, regValueLocal = 0;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005628 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5629
5630 /* Debug Type 1, Display current snapshot */
5631 if(displaySnapshot)
5632 {
5633 /* Whatever RIVA power condition try to wakeup RIVA through SMSM
5634 * This will not simply wakeup RIVA
5635 * Just incase TX not wanted stuck, Trigger TX again */
Leo Chang345ef992013-07-12 10:17:29 -07005636 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
5637 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005638 /* Get free BD count */
Leo Chang345ef992013-07-12 10:17:29 -07005639 wpalSleep(10);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005640 wpalReadRegister(WLANDXE_BMU_AVAILABLE_BD_PDU, &regValue);
Mihir Shete41c41bb2014-08-18 17:37:12 +05305641#ifdef WCN_PRONTO
5642 wpalReadRegister(WLANDXE_BMU_AVAILABLE_BD_PDU_LOCAL, &regValueLocal);
5643#endif
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005644 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Mihir Shete41c41bb2014-08-18 17:37:12 +05305645 "===== DXE Dump Start HPS %d, FWS %d, TX PFC %d, ABD %d, ABD LOCAL %d =====",
Leo Chang345ef992013-07-12 10:17:29 -07005646 tempDxeCtrlBlk->hostPowerState, tempDxeCtrlBlk->rivaPowerState,
Mihir Shete41c41bb2014-08-18 17:37:12 +05305647 tempDxeCtrlBlk->txCompletedFrames, regValue, regValueLocal);
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005648
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07005649 wpalPacketStallUpdateInfo((wpt_uint32 *)&tempDxeCtrlBlk->rivaPowerState,
5650 &regValue,
5651 NULL,
5652 0);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07005653
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005654 channelDebugMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
5655 if(NULL == channelDebugMsg)
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005656 {
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005657 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5658 "WLANDXE_ChannelDebug, MSG MEM alloc Fail");
5659 return ;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005660 }
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005661
5662 channelDebugMsg->callback = dxeRxThreadChannelDebugHandler;
5663 status = wpalPostRxMsg(WDI_GET_PAL_CTX(), channelDebugMsg);
5664 if ( eWLAN_PAL_STATUS_SUCCESS != status )
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005665 {
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005666 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5667 "Tx thread Set power state req serialize fail status=%d",
Jeff Johnson9e237fb2013-10-30 18:46:20 -07005668 status);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005669 }
5670 }
5671
Mihir Shete40a55652014-03-02 14:14:47 +05305672 if(debugFlags & WPAL_DEBUG_TX_DESC_RESYNC)
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005673 {
Mihir Shete40a55652014-03-02 14:14:47 +05305674 txDescReSyncMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
5675 if(NULL == txDescReSyncMsg)
5676 {
5677 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5678 "%s: Resync MSG MEM alloc Fail",__func__);
5679 }
5680 else
5681 {
5682 txDescReSyncMsg->callback = dxeDebugTxDescReSync;
5683 txDescReSyncMsg->pContext = tempDxeCtrlBlk;
5684 status = wpalPostTxMsg(WDI_GET_PAL_CTX(),
5685 txDescReSyncMsg);
5686 if(eWLAN_PAL_STATUS_SUCCESS != status)
5687 {
5688 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5689 "%s: Post TX re-sync MSG fail",__func__);
5690 }
5691 }
5692 }
5693
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005694 return;
Madan Mohan Koyyalamudi48139e32012-10-11 14:43:56 -07005695}
Mihir Shete5affadc2015-05-29 20:54:57 +05305696
5697wpt_uint32 WLANDXE_SetupLogTransfer(wpt_uint64 bufferAddr, wpt_uint32 bufferLen)
5698{
5699 WLANDXE_ChannelCBType *channelEntry;
5700
5701 channelEntry = &tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_RX_FW_LOG];
5702
5703
5704 return dxeRXLogRefillRing(tempDxeCtrlBlk, channelEntry, bufferAddr,
5705 bufferLen);
5706}
5707
5708wpt_status WLANDXE_StartLogTransfer(void)
5709{
5710 WLANDXE_ChannelCBType *channelEntry;
5711 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5712
5713 channelEntry = &tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_RX_FW_LOG];
5714
5715 tempDxeCtrlBlk->hostInitiatedH2H = 1;
5716 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
5717 channelEntry->headCtrlBlk->linkedDescPhyAddr);
5718 if(eWLAN_PAL_STATUS_SUCCESS != status)
5719 {
5720 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5721 "%s Write DESC Address register fail", __func__);
5722 return status;
5723 }
5724
5725 wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr,
5726 channelEntry->extraConfig.chan_mask);
5727 if(eWLAN_PAL_STATUS_SUCCESS != status)
5728 {
5729 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5730 "dxeChannelInitProgram Write RX Control register fail");
5731 return status;
5732 }
5733 return status;
5734}