blob: bb5da39891c8101918f8634cc252a34ae6c965fd [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Leo Chang416afe02013-07-01 13:58:13 -07002 * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
3 *
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.
20 */
21/*
22 * Copyright (c) 2012, The Linux Foundation. All rights reserved.
23 *
24 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
25 *
26 *
27 * Permission to use, copy, modify, and/or distribute this software for
28 * any purpose with or without fee is hereby granted, provided that the
29 * above copyright notice and this permission notice appear in all
30 * copies.
31 *
32 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
33 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
34 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
35 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
36 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
37 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
38 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
39 * PERFORMANCE OF THIS SOFTWARE.
40 */
41
Leo Changc286cbf2013-06-18 20:32:42 -070042
Jeff Johnson295189b2012-06-20 16:38:30 -070043/**=========================================================================
44
45 @file wlan_qct_dxe.c
46
47 @brief
48
49 This file contains the external API exposed by the wlan data transfer abstraction layer module.
Leo Changc286cbf2013-06-18 20:32:42 -070050 Copyright (c) 2010-2011 Qualcomm Technologies, Inc.
Jeff Johnson295189b2012-06-20 16:38:30 -070051 All Rights Reserved.
Jeff Johnson295189b2012-06-20 16:38:30 -070052========================================================================*/
53
54/*===========================================================================
55
56 EDIT HISTORY FOR FILE
57
58
59 This section contains comments describing changes made to the module.
60 Notice that changes are listed in reverse chronological order.
61
62
63 $Header:$ $DateTime: $ $Author: $
64
65
66when who what, where, why
67-------- --- ----------------------------------------------------------
6808/03/10 schang Created module.
69
70===========================================================================*/
71
72/*===========================================================================
73
74 INCLUDE FILES FOR MODULE
75
76===========================================================================*/
77
78/*----------------------------------------------------------------------------
79 * Include Files
80 * -------------------------------------------------------------------------*/
81#include "wlan_qct_dxe.h"
82#include "wlan_qct_dxe_i.h"
83#include "wlan_qct_pal_device.h"
84#ifdef FEATURE_R33D
85#include "wlan_qct_pal_bus.h"
86#endif /* FEATURE_R33D */
87
88/*----------------------------------------------------------------------------
89 * Local Definitions
90 * -------------------------------------------------------------------------*/
91//#define WLANDXE_DEBUG_CH_INFO_DUMP
92
93/* Temporary configuration defines
94 * Have to find out permanent solution */
95#define T_WLANDXE_MAX_DESCRIPTOR_COUNT 40
96#define T_WLANDXE_MAX_FRAME_SIZE 2000
97#define T_WLANDXE_TX_INT_ENABLE_FCOUNT 1
98#define T_WLANDXE_MEMDUMP_BYTE_PER_LINE 16
99#define T_WLANDXE_MAX_RX_PACKET_WAIT 6000
Mihir Shetefdc9f532014-01-09 15:03:02 +0530100#define T_WLANDXE_SSR_TIMEOUT 5000
Leo Chang5edb2d32013-04-03 13:32:58 -0700101#define T_WLANDXE_PERIODIC_HEALTH_M_TIME 2500
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -0700102#define T_WLANDXE_MAX_HW_ACCESS_WAIT 2000
Jeff Johnsone7245742012-09-05 17:12:55 -0700103#define WLANDXE_MAX_REAPED_RX_FRAMES 512
Jeff Johnson295189b2012-06-20 16:38:30 -0700104
Leo Chang094ece82013-04-23 17:57:41 -0700105#define WLANPAL_RX_INTERRUPT_PRO_MASK 0x20
106#define WLANDXE_RX_INTERRUPT_PRO_UNMASK 0x5F
Leo Chang00708f62013-12-03 20:21:51 -0800107
108/* 1msec busy wait in case CSR is not valid */
109#define WLANDXE_CSR_NEXT_READ_WAIT 1000
110/* CSR max retry count */
111#define WLANDXE_CSR_MAX_READ_COUNT 30
112
113
Jeff Johnson295189b2012-06-20 16:38:30 -0700114/* This is temporary fot the compile
115 * WDI will release official version
116 * This must be removed */
117#define WDI_GET_PAL_CTX() NULL
118
Madan Mohan Koyyalamudidfd6aa82012-10-18 20:18:43 -0700119
Jeff Johnson295189b2012-06-20 16:38:30 -0700120/*-------------------------------------------------------------------------
121 * Local Varables
122 *-------------------------------------------------------------------------*/
123/* This is temp, someone have to allocate for me, and must be part of global context */
Madan Mohan Koyyalamudidfd6aa82012-10-18 20:18:43 -0700124static WLANDXE_CtrlBlkType *tempDxeCtrlBlk;
Jeff Johnson295189b2012-06-20 16:38:30 -0700125static char *channelType[WDTS_CHANNEL_MAX] =
126 {
127 "TX_LOW_PRI",
128 "TX_HIGH_PRI",
129 "RX_LOW_PRI",
130#ifndef WLANDXE_TEST_CHANNEL_ENABLE
131 "RX_HIGH_PRI",
132#else
133 "H2H_TEST_TX",
134 "H2H_TEST_RX"
135#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
136 };
Jeff Johnsone7245742012-09-05 17:12:55 -0700137static wpt_packet *rx_reaped_buf[WLANDXE_MAX_REAPED_RX_FRAMES];
Jeff Johnson295189b2012-06-20 16:38:30 -0700138
139/*-------------------------------------------------------------------------
140 * External Function Proto Type
141 *-------------------------------------------------------------------------*/
142
143/*-------------------------------------------------------------------------
144 * Local Function Proto Type
145 *-------------------------------------------------------------------------*/
146static wpt_status dxeRXFrameSingleBufferAlloc
147(
148 WLANDXE_CtrlBlkType *dxeCtxt,
149 WLANDXE_ChannelCBType *channelEntry,
150 WLANDXE_DescCtrlBlkType *currentCtrlBlock
151);
152
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700153static wpt_status dxeNotifySmsm
154(
155 wpt_boolean kickDxe,
156 wpt_boolean ringEmpty
157);
158
Mihir Shetefdc9f532014-01-09 15:03:02 +0530159static void dxeStartSSRTimer
160(
161 WLANDXE_CtrlBlkType *dxeCtxt
162);
163
Jeff Johnson295189b2012-06-20 16:38:30 -0700164/*-------------------------------------------------------------------------
165 * Local Function
166 *-------------------------------------------------------------------------*/
Jeff Johnson295189b2012-06-20 16:38:30 -0700167/*==========================================================================
168 @ Function Name
169 dxeChannelMonitor
170
171 @ Description
172
173 @ Parameters
174 WLANDXE_ChannelCBType *channelEntry
175 Channel specific control block
176
177 @ Return
178 wpt_status
179
180===========================================================================*/
181static wpt_status dxeChannelMonitor
182(
183 char *monitorDescription,
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530184 WLANDXE_ChannelCBType *channelEntry,
185 wpt_log_data_stall_channel_type *channelLog
Jeff Johnson295189b2012-06-20 16:38:30 -0700186)
187{
188 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
189
Jeff Johnsone7245742012-09-05 17:12:55 -0700190 if((NULL == monitorDescription) || (NULL == channelEntry))
191 {
192 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
193 "INVALID Input ARG");
194 return eWLAN_PAL_STATUS_E_INVAL;
195 }
196
197 if(channelEntry->channelType > WDTS_CHANNEL_RX_HIGH_PRI)
198 {
199 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
200 "INVALID Channel type");
201 return eWLAN_PAL_STATUS_E_INVAL;
202 }
203
Leo Chang345ef992013-07-12 10:17:29 -0700204 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
205 "%11s : HCBO %d, HCBDP 0x%x, HCBDC 0x%x,",
206 channelType[channelEntry->channelType],
207 channelEntry->headCtrlBlk->ctrlBlkOrder,
208 channelEntry->headCtrlBlk->linkedDescPhyAddr,
209 channelEntry->headCtrlBlk->linkedDesc->descCtrl.ctrl);
210 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
211 "%11s : TCBO %d, TCBDP 0x%x, TCBDC 0x%x",
212 channelType[channelEntry->channelType],
213 channelEntry->tailCtrlBlk->ctrlBlkOrder,
214 channelEntry->tailCtrlBlk->linkedDescPhyAddr,
215 channelEntry->tailCtrlBlk->linkedDesc->descCtrl.ctrl);
216 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
217 "%11s : FDC %d, RDC %d, TFC %d",
218 channelType[channelEntry->channelType],
219 channelEntry->numFreeDesc,
220 channelEntry->numRsvdDesc,
221 channelEntry->numTotalFrame);
Jeff Johnson295189b2012-06-20 16:38:30 -0700222
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700223 if(channelLog)
224 {
225 channelLog->numDesc = channelEntry->numDesc;
226 channelLog->numFreeDesc = channelEntry->numFreeDesc;
227 channelLog->numRsvdDesc = channelEntry->numRsvdDesc;
228 channelLog->headDescOrder = channelEntry->headCtrlBlk->ctrlBlkOrder;
229 channelLog->tailDescOrder = channelEntry->tailCtrlBlk->ctrlBlkOrder;
230 }
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530231
Jeff Johnson295189b2012-06-20 16:38:30 -0700232 return status;
233}
234
Jeff Johnsone7245742012-09-05 17:12:55 -0700235#ifdef WLANDXE_DEBUG_MEMORY_DUMP
Jeff Johnson295189b2012-06-20 16:38:30 -0700236/*==========================================================================
237 @ Function Name
238 dxeMemoryDump
239
240 @ Description
241
242 @ Parameters
243 WLANDXE_ChannelCBType *channelEntry
244 Channel specific control block
245
246 @ Return
247 wpt_status
248
249===========================================================================*/
250static wpt_status dxeMemoryDump
251(
252 wpt_uint8 *dumpPointer,
253 wpt_uint32 dumpSize,
254 char *dumpTarget
255)
256{
257 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
258 wpt_uint32 numBytes = 0;
259 wpt_uint32 idx;
260
Jeff Johnsone7245742012-09-05 17:12:55 -0700261 if((NULL == dumpPointer) ||
262 (NULL == dumpTarget))
263 {
264 return status;
265 }
266
Jeff Johnson295189b2012-06-20 16:38:30 -0700267 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
268 "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
269 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
270 "%s Location 0x%x, Size %d", dumpTarget, dumpPointer, dumpSize);
271
272 numBytes = dumpSize % T_WLANDXE_MEMDUMP_BYTE_PER_LINE;
273 for(idx = 0; idx < dumpSize; idx++)
274 {
275 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
276 "0x%2x ", dumpPointer[idx]);
277 if(0 == ((idx + 1) % T_WLANDXE_MEMDUMP_BYTE_PER_LINE))
278 {
279 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, "\n");
280 }
281 }
282 if(0 != numBytes)
283 {
284 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, "\n");
285 }
286 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
287 "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
288
289 return status;
290}
Jeff Johnsone7245742012-09-05 17:12:55 -0700291#endif /* WLANDXE_DEBUG_MEMORY_DUMP */
Jeff Johnson295189b2012-06-20 16:38:30 -0700292
293/*==========================================================================
294 @ Function Name
295 dxeDescriptorDump
296
297 @ Description
298
299 @ Parameters
300 WLANDXE_ChannelCBType *channelEntry
301 Channel specific control block
302
303 @ Return
304 wpt_status
305
306===========================================================================*/
307wpt_status dxeDescriptorDump
308(
309 WLANDXE_ChannelCBType *channelEntry,
310 WLANDXE_DescType *targetDesc,
311 wpt_uint32 fragmentOrder
312)
313{
314 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
315
316
Jeff Johnsone7245742012-09-05 17:12:55 -0700317 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnson295189b2012-06-20 16:38:30 -0700318 "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
Jeff Johnsone7245742012-09-05 17:12:55 -0700319 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700320 "Descriptor Dump for channel %s, %d / %d fragment",
Jeff Johnson295189b2012-06-20 16:38:30 -0700321 channelType[channelEntry->channelType],
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700322 fragmentOrder + 1,
323 channelEntry->numFragmentCurrentChain);
Jeff Johnson295189b2012-06-20 16:38:30 -0700324
Jeff Johnsone7245742012-09-05 17:12:55 -0700325 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnson295189b2012-06-20 16:38:30 -0700326 "CTRL WORD 0x%x, TransferSize %d",
327 WLANDXE_U32_SWAP_ENDIAN(targetDesc->descCtrl.ctrl),
328 WLANDXE_U32_SWAP_ENDIAN(targetDesc->xfrSize));
Jeff Johnsone7245742012-09-05 17:12:55 -0700329 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnson295189b2012-06-20 16:38:30 -0700330 "SRC ADD 0x%x, DST ADD 0x%x, NEXT DESC 0x%x",
331 WLANDXE_U32_SWAP_ENDIAN(targetDesc->dxedesc.dxe_short_desc.srcMemAddrL),
332 WLANDXE_U32_SWAP_ENDIAN(targetDesc->dxedesc.dxe_short_desc.dstMemAddrL),
333 WLANDXE_U32_SWAP_ENDIAN(targetDesc->dxedesc.dxe_short_desc.phyNextL));
Jeff Johnsone7245742012-09-05 17:12:55 -0700334 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnson295189b2012-06-20 16:38:30 -0700335 "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
336
337 return status;
338}
339
340/*==========================================================================
341 @ Function Name
342 dxeChannelRegisterDump
343
344 @ Description
345
346 @ Parameters
347 WLANDXE_ChannelCBType *channelEntry
348 Channel specific control block
349
350 @ Return
351 wpt_status
352
353===========================================================================*/
354wpt_status dxeChannelRegisterDump
355(
356 WLANDXE_ChannelCBType *channelEntry,
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530357 char *dumpTarget,
358 wpt_log_data_stall_channel_type *channelLog
Jeff Johnson295189b2012-06-20 16:38:30 -0700359)
360{
Leo Chang345ef992013-07-12 10:17:29 -0700361 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
362 wpt_uint32 chStatusReg, chControlReg, chDescReg, chLDescReg;
363
364 /* Whatever RIVA power condition try to wakeup RIVA through SMSM
365 * This will not simply wakeup RIVA
366 * Just incase TX not wanted stuck, Trigger TX again */
367 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
368 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
369 wpalSleep(10);
Jeff Johnson295189b2012-06-20 16:38:30 -0700370
Tushnim Bhattacharyya5dd94562013-03-20 20:15:03 -0700371 if(channelEntry->channelType > WDTS_CHANNEL_RX_HIGH_PRI)
372 {
373 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
374 "INVALID Channel type");
375 return eWLAN_PAL_STATUS_E_INVAL;
376 }
377
Leo Chang345ef992013-07-12 10:17:29 -0700378 wpalReadRegister(channelEntry->channelRegister.chDXEDesclRegAddr, &chDescReg);
379 wpalReadRegister(channelEntry->channelRegister.chDXELstDesclRegAddr, &chLDescReg);
380 wpalReadRegister(channelEntry->channelRegister.chDXECtrlRegAddr, &chControlReg);
381 wpalReadRegister(channelEntry->channelRegister.chDXEStatusRegAddr, &chStatusReg);
Jeff Johnson295189b2012-06-20 16:38:30 -0700382
Leo Chang345ef992013-07-12 10:17:29 -0700383 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
384 "%11s : CCR 0x%x, CSR 0x%x, CDR 0x%x, CLDR 0x%x",
385 channelType[channelEntry->channelType],
386 chControlReg, chStatusReg, chDescReg, chLDescReg);
Jeff Johnson295189b2012-06-20 16:38:30 -0700387
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700388 if(channelLog)
389 {
390 channelLog->ctrlRegVal = chControlReg;
391 channelLog->statRegVal = chStatusReg;
392 }
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700393
Jeff Johnson295189b2012-06-20 16:38:30 -0700394 return status;
395}
Jeff Johnsone7245742012-09-05 17:12:55 -0700396
397/*==========================================================================
398 @ Function Name
399 dxeChannelAllDescDump
400
401 @ Description
402 Dump all DXE descriptors within assigned channe;
403
404 @ Parameters
405 WLANDXE_ChannelCBType *channelEntry
406
407 @ Return
408 NONE
409
410===========================================================================*/
411void dxeChannelAllDescDump
412(
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700413 WLANDXE_ChannelCBType *channelEntry,
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530414 WDTS_ChannelType channel,
415 wpt_log_data_stall_channel_type *channelLog
Jeff Johnsone7245742012-09-05 17:12:55 -0700416)
417{
418 wpt_uint32 channelLoop;
419 WLANDXE_DescCtrlBlkType *targetCtrlBlk;
Madan Mohan Koyyalamudi94d4c192012-09-24 14:06:14 -0700420 wpt_uint32 previousCtrlValue = 0;
Leo Chang345ef992013-07-12 10:17:29 -0700421 wpt_uint32 previousCtrlValid = 0;
422 wpt_uint32 currentCtrlValid = 0;
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700423 wpt_uint32 valDescCount = 0;
424 wpt_uint32 invalDescCount = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -0700425
426 targetCtrlBlk = channelEntry->headCtrlBlk;
427
428 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Leo Chang345ef992013-07-12 10:17:29 -0700429 "%11s : %d descriptor chains, head desc ctrl 0x%x",
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700430 channelType[channelEntry->channelType],
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -0700431 channelEntry->numDesc,
432 targetCtrlBlk->linkedDesc->descCtrl.ctrl);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700433 previousCtrlValue = targetCtrlBlk->linkedDesc->descCtrl.ctrl;
434
435 if((WDTS_CHANNEL_RX_LOW_PRI == channel) ||
436 (WDTS_CHANNEL_RX_HIGH_PRI == channel))
Jeff Johnsone7245742012-09-05 17:12:55 -0700437 {
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700438 for(channelLoop = 0; channelLoop < channelEntry->numDesc; channelLoop++)
Madan Mohan Koyyalamudi94d4c192012-09-24 14:06:14 -0700439 {
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700440 if(previousCtrlValue != targetCtrlBlk->linkedDesc->descCtrl.ctrl)
441 {
442 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
443 "%5d : 0x%x", targetCtrlBlk->ctrlBlkOrder,
444 targetCtrlBlk->linkedDesc->descCtrl.ctrl);
445 }
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700446 if(targetCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID)
447 {
448 valDescCount++;
449 }
450 else
451 {
452 invalDescCount++;
453 }
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700454 previousCtrlValue = targetCtrlBlk->linkedDesc->descCtrl.ctrl;
455 targetCtrlBlk = (WLANDXE_DescCtrlBlkType *)targetCtrlBlk->nextCtrlBlk;
Madan Mohan Koyyalamudi94d4c192012-09-24 14:06:14 -0700456 }
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700457 }
458 else
459 {
Leo Chang345ef992013-07-12 10:17:29 -0700460 /* Head Descriptor is valid or not */
461 previousCtrlValid = targetCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID;
462 targetCtrlBlk = (WLANDXE_DescCtrlBlkType *)targetCtrlBlk->nextCtrlBlk;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700463 for(channelLoop = 0; channelLoop < channelEntry->numDesc; channelLoop++)
464 {
Leo Chang345ef992013-07-12 10:17:29 -0700465 currentCtrlValid = targetCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID;
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700466 if(currentCtrlValid)
467 {
468 valDescCount++;
469 }
470 else
471 {
472 invalDescCount++;
473 }
Leo Chang345ef992013-07-12 10:17:29 -0700474 if(currentCtrlValid != previousCtrlValid)
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700475 {
476 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
477 "%5d : 0x%x", targetCtrlBlk->ctrlBlkOrder,
478 targetCtrlBlk->linkedDesc->descCtrl.ctrl);
479 }
Leo Chang345ef992013-07-12 10:17:29 -0700480 previousCtrlValid = currentCtrlValid;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700481 targetCtrlBlk = (WLANDXE_DescCtrlBlkType *)targetCtrlBlk->nextCtrlBlk;
482 }
483 }
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530484
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700485 if(channelLog)
486 {
487 channelLog->numValDesc = valDescCount;
488 channelLog->numInvalDesc = invalDescCount;
489 }
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530490
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700491 return;
492}
493
494/*==========================================================================
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530495 @ Function Name
496 dxeErrChannelDebug
497
498 @ Description
499 Dump channel information for which Error interrupt has occured
500
501 @ Parameters
502 WLANDXE_ChannelCBType *channelCb
503
504 @ Return
505 NONE
506
507===========================================================================*/
508void dxeErrChannelDebug
509(
510 WLANDXE_ChannelCBType *channelCb
511)
512{
513 wpt_log_data_stall_channel_type channelLog;
514
515 dxeChannelMonitor("INT_ERR", channelCb, &channelLog);
516 dxeDescriptorDump(channelCb, channelCb->headCtrlBlk->linkedDesc, 0);
517 dxeChannelRegisterDump(channelCb, "INT_ERR", &channelLog);
518 dxeChannelAllDescDump(channelCb, channelCb->channelType, &channelLog);
519 wpalMemoryCopy(channelLog.channelName,
520 "INT_ERR",
521 WPT_TRPT_CHANNEL_NAME);
522 wpalPacketStallUpdateInfo(NULL, NULL, &channelLog, channelCb->channelType);
523#ifdef FEATURE_WLAN_DIAG_SUPPORT
524 wpalPacketStallDumpLog();
525#endif /* FEATURE_WLAN_DIAG_SUPPORT */
526
527 wpalFwDumpReq(17, 0, 0, 0, 0);
528}
529/*==========================================================================
530 @ Function Name
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700531 dxeTxThreadChannelDebugHandler
532
533 @ Description
534 Dump TX channel information
535
536 @ Parameters
537 Wwpt_msg *msgPtr
538
539 @ Return
540 NONE
541
542===========================================================================*/
543void dxeTxThreadChannelDebugHandler
544(
545 wpt_msg *msgPtr
546)
547{
548 wpt_uint8 channelLoop;
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700549 wpt_log_data_stall_channel_type channelLog;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700550
551 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700552 "%s Enter", __func__);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700553
554 /* Whatever RIVA power condition try to wakeup RIVA through SMSM
555 * This will not simply wakeup RIVA
556 * Just incase TX not wanted stuck, Trigger TX again */
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700557 for(channelLoop = 0; channelLoop < WDTS_CHANNEL_RX_LOW_PRI; channelLoop++)
558 {
559 dxeChannelMonitor("******** Get Descriptor Snapshot ",
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530560 &tempDxeCtrlBlk->dxeChannel[channelLoop],
561 &channelLog);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700562 dxeChannelRegisterDump(&tempDxeCtrlBlk->dxeChannel[channelLoop],
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530563 "Abnormal successive empty interrupt",
564 &channelLog);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700565 dxeChannelAllDescDump(&tempDxeCtrlBlk->dxeChannel[channelLoop],
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530566 channelLoop,
567 &channelLog);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700568
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700569 wpalMemoryCopy(channelLog.channelName,
570 channelType[channelLoop],
571 WPT_TRPT_CHANNEL_NAME);
572 wpalPacketStallUpdateInfo(NULL, NULL, &channelLog, channelLoop);
Jeff Johnsone7245742012-09-05 17:12:55 -0700573 }
574
Leo Chang345ef992013-07-12 10:17:29 -0700575 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnson9e237fb2013-10-30 18:46:20 -0700576 "================== DXE Dump End ======================");
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -0700577 wpalMemoryFree(msgPtr);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700578
579#ifdef FEATURE_WLAN_DIAG_SUPPORT
580 wpalPacketStallDumpLog();
581#endif /* FEATURE_WLAN_DIAG_SUPPORT */
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700582 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700583 "%s Exit", __func__);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700584 return;
585}
586
587/*==========================================================================
588 @ Function Name
589 dxeRxThreadChannelDebugHandler
590
591 @ Description
592 Dump RX channel information
593
594 @ Parameters
595 Wwpt_msg *msgPtr
596
597 @ Return
598 NONE
599
600===========================================================================*/
601void dxeRxThreadChannelDebugHandler
602(
603 wpt_msg *msgPtr
604)
605{
606 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
607 wpt_uint8 channelLoop;
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700608 wpt_log_data_stall_channel_type channelLog;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700609
610 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700611 "%s Enter", __func__);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700612
613 /* Whatever RIVA power condition try to wakeup RIVA through SMSM
614 * This will not simply wakeup RIVA
615 * Just incase TX not wanted stuck, Trigger TX again */
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700616 for(channelLoop = WDTS_CHANNEL_RX_LOW_PRI; channelLoop < WDTS_CHANNEL_MAX; channelLoop++)
617 {
618 dxeChannelMonitor("******** Get Descriptor Snapshot ",
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530619 &tempDxeCtrlBlk->dxeChannel[channelLoop],
620 &channelLog);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700621 dxeChannelRegisterDump(&tempDxeCtrlBlk->dxeChannel[channelLoop],
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530622 "Abnormal successive empty interrupt",
623 &channelLog);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700624 dxeChannelAllDescDump(&tempDxeCtrlBlk->dxeChannel[channelLoop],
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530625 channelLoop, &channelLog);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700626
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700627 wpalMemoryCopy(channelLog.channelName,
628 channelType[channelLoop],
629 WPT_TRPT_CHANNEL_NAME);
630 wpalPacketStallUpdateInfo(NULL, NULL, &channelLog, channelLoop);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530631
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700632 }
633
634 /* Now serialise the message through Tx thread also to make sure
635 * no register access when RIVA is in powersave */
636 /*Use the same message pointer just change the call back function */
637 msgPtr->callback = dxeTxThreadChannelDebugHandler;
638 status = wpalPostTxMsg(WDI_GET_PAL_CTX(),
639 msgPtr);
640 if ( eWLAN_PAL_STATUS_SUCCESS != status )
641 {
642 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi48139e32012-10-11 14:43:56 -0700643 "Tx thread state dump req serialize fail status=%d",
Jeff Johnson9e237fb2013-10-30 18:46:20 -0700644 status);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700645 }
646
647 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700648 "%s Exit", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700649 return;
650}
Jeff Johnson295189b2012-06-20 16:38:30 -0700651
652/*==========================================================================
653 @ Function Name
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -0700654 dxeRXHealthMonitor
655
656 @ Description
657 Monitoring RX channel healthy stataus
658 If detect any problem, try to recover
659
660 @ Parameters
661 healthMonitorMsg MSG pointer.
662 will have low resource TX channel context
663
664 @ Return
665 NONE
666
667===========================================================================*/
668void dxeRXHealthMonitor
669(
670 wpt_msg *healthMonitorMsg
671)
672{
673 WLANDXE_ChannelCBType *channelCtrlBlk;
674 WLANDXE_ChannelCBType *testCHCtrlBlk;
675 wpt_uint32 regValue;
676 wpt_uint32 chStatusReg, chControlReg, chDescReg, chLDescReg;
677 wpt_uint32 hwWakeLoop, chLoop;
678
679 if(NULL == healthMonitorMsg)
680 {
681 return;
682 }
683
684 /* Make wake up HW */
685 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
686 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
Leo Chang5edb2d32013-04-03 13:32:58 -0700687 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -0700688
689 for(hwWakeLoop = 0; hwWakeLoop < T_WLANDXE_MAX_HW_ACCESS_WAIT; hwWakeLoop++)
690 {
691 wpalReadRegister(WLANDXE_BMU_AVAILABLE_BD_PDU, &regValue);
692 if(0 != regValue)
693 {
694 break;
695 }
696 }
697
698 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
699 "Scheduled RX, num free BD/PDU %d, loop Count %d",
Jeff Johnson9e237fb2013-10-30 18:46:20 -0700700 regValue, hwWakeLoop);
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -0700701
702 for(chLoop = WDTS_CHANNEL_RX_LOW_PRI; chLoop < WDTS_CHANNEL_MAX; chLoop++)
703 {
704 testCHCtrlBlk = &tempDxeCtrlBlk->dxeChannel[chLoop];
705 wpalReadRegister(testCHCtrlBlk->channelRegister.chDXECtrlRegAddr, &chControlReg);
706 wpalReadRegister(testCHCtrlBlk->channelRegister.chDXEStatusRegAddr, &chStatusReg);
707 wpalReadRegister(testCHCtrlBlk->channelRegister.chDXEDesclRegAddr, &chDescReg);
708 wpalReadRegister(testCHCtrlBlk->channelRegister.chDXELstDesclRegAddr, &chLDescReg);
709
710 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
711 "%11s : CCR 0x%x, CSR 0x%x, CDR 0x%x, CLDR 0x%x, HCBO %d, HCBDP 0x%x, HCBDC 0x%x, TCBO %d,TCBDP 0x%x, TCBDC 0x%x",
712 channelType[chLoop],
713 chControlReg, chStatusReg, chDescReg, chLDescReg,
714 testCHCtrlBlk->headCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr,
715 testCHCtrlBlk->headCtrlBlk->linkedDesc->descCtrl.ctrl,
716 testCHCtrlBlk->tailCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr,
717 testCHCtrlBlk->tailCtrlBlk->linkedDesc->descCtrl.ctrl);
718
719 if((chControlReg & WLANDXE_DESC_CTRL_VALID) &&
720 (chLDescReg != testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr))
721 {
722 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
723 "%11s : CCR 0x%x, CSR 0x%x, CDR 0x%x, CLDR 0x%x, "
724 "HCBO %d, HCBDP 0x%x, HCBDC 0x%x, TCBO %d,TCBDP 0x%x, TCBDC 0x%x",
725 channelType[chLoop],
726 chControlReg, chStatusReg, chDescReg, chLDescReg,
727 testCHCtrlBlk->headCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr,
728 testCHCtrlBlk->headCtrlBlk->linkedDesc->descCtrl.ctrl,
729 testCHCtrlBlk->tailCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr,
730 testCHCtrlBlk->tailCtrlBlk->linkedDesc->descCtrl.ctrl);
731 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Jeff Johnson9e237fb2013-10-30 18:46:20 -0700732 "%11s : RX CH EN Descriptor Async, resync it", channelType[chLoop]);
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -0700733 wpalWriteRegister(testCHCtrlBlk->channelRegister.chDXELstDesclRegAddr,
734 testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr);
735 }
736 else if(!(chControlReg & WLANDXE_DESC_CTRL_VALID) &&
737 (chDescReg != testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr))
738 {
739 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
740 "%11s : CCR 0x%x, CSR 0x%x, CDR 0x%x, CLDR 0x%x, "
741 "HCBO %d, HCBDP 0x%x, HCBDC 0x%x, TCBO %d,TCBDP 0x%x, TCBDC 0x%x",
742 channelType[chLoop],
743 chControlReg, chStatusReg, chDescReg, chLDescReg,
744 testCHCtrlBlk->headCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr,
745 testCHCtrlBlk->headCtrlBlk->linkedDesc->descCtrl.ctrl,
746 testCHCtrlBlk->tailCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr,
747 testCHCtrlBlk->tailCtrlBlk->linkedDesc->descCtrl.ctrl);
748 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Jeff Johnson9e237fb2013-10-30 18:46:20 -0700749 "%11s : RX CH DIS Descriptor Async, resync it", channelType[chLoop]);
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -0700750 wpalWriteRegister(testCHCtrlBlk->channelRegister.chDXEDesclRegAddr,
751 testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr);
752 }
753 }
754
755 channelCtrlBlk = (WLANDXE_ChannelCBType *)healthMonitorMsg->pContext;
756 if(channelCtrlBlk->hitLowResource)
757 {
758 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
759 "%11s : Still Low Resource, kick DXE TX and restart timer",
Jeff Johnson9e237fb2013-10-30 18:46:20 -0700760 channelType[channelCtrlBlk->channelType]);
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -0700761 /* Still Low Resource, Kick DXE again and start timer again */
762 wpalTimerStart(&channelCtrlBlk->healthMonitorTimer,
763 T_WLANDXE_PERIODIC_HEALTH_M_TIME);
764 }
765 else
766 {
767 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
768 "%11s : Out from Low resource condition, do nothing",
Jeff Johnson9e237fb2013-10-30 18:46:20 -0700769 channelType[channelCtrlBlk->channelType]);
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -0700770 /* Recovered from low resource condition
771 * Not need to do anything */
772 }
773
774 return;
775}
776
777/*==========================================================================
778 @ Function Name
779 dxeTXHealthMonitor
780
781 @ Description
782 Monitoring TX channel healthy stataus
783 If detect any problem, try to recover
784
785 @ Parameters
786 healthMonitorMsg MSG pointer.
787 will have low resource TX channel context
788
789 @ Return
790 NONE
791
792===========================================================================*/
793void dxeTXHealthMonitor
794(
795 wpt_msg *healthMonitorMsg
796)
797{
798 WLANDXE_ChannelCBType *channelCtrlBlk;
799 WLANDXE_ChannelCBType *testCHCtrlBlk;
800 wpt_uint32 regValue;
801 wpt_uint32 chStatusReg, chControlReg, chDescReg, chLDescReg;
802 wpt_uint32 hwWakeLoop, chLoop;
803 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
804
805 if(NULL == healthMonitorMsg)
806 {
807 return;
808 }
809
810 /* First of all kick TX channel
811 * This will fix if there is any problem with SMSM state */
812 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
813 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
Leo Chang5edb2d32013-04-03 13:32:58 -0700814 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -0700815
816 /* Wait till RIVA up */
817 for(hwWakeLoop = 0; hwWakeLoop < T_WLANDXE_MAX_HW_ACCESS_WAIT; hwWakeLoop++)
818 {
819 wpalReadRegister(WLANDXE_BMU_AVAILABLE_BD_PDU, &regValue);
820 if(0 != regValue)
821 {
822 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
823 "num free BD/PDU %d, loop Count %d",
Jeff Johnson9e237fb2013-10-30 18:46:20 -0700824 regValue, hwWakeLoop);
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -0700825 break;
826 }
827 }
828
829 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
830 "Scheduled TX, num free BD/PDU %d, loop Count %d",
Jeff Johnson9e237fb2013-10-30 18:46:20 -0700831 regValue, hwWakeLoop);
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -0700832
833 for(chLoop = 0; chLoop < WDTS_CHANNEL_RX_LOW_PRI; chLoop++)
834 {
835 testCHCtrlBlk = &tempDxeCtrlBlk->dxeChannel[chLoop];
836 wpalReadRegister(testCHCtrlBlk->channelRegister.chDXECtrlRegAddr, &chControlReg);
837 wpalReadRegister(testCHCtrlBlk->channelRegister.chDXEStatusRegAddr, &chStatusReg);
838 wpalReadRegister(testCHCtrlBlk->channelRegister.chDXEDesclRegAddr, &chDescReg);
839 wpalReadRegister(testCHCtrlBlk->channelRegister.chDXELstDesclRegAddr, &chLDescReg);
840
841 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
842 "%11s : CCR 0x%x, CSR 0x%x, CDR 0x%x, CLDR 0x%x, HCBO %d, HCBDP 0x%x, HCBDC 0x%x, TCBO %d,TCBDP 0x%x, TCBDC 0x%x",
843 channelType[chLoop],
844 chControlReg, chStatusReg, chDescReg, chLDescReg,
845 testCHCtrlBlk->headCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr,
846 testCHCtrlBlk->headCtrlBlk->linkedDesc->descCtrl.ctrl,
847 testCHCtrlBlk->tailCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr,
848 testCHCtrlBlk->tailCtrlBlk->linkedDesc->descCtrl.ctrl);
849
850 if((chControlReg & WLANDXE_DESC_CTRL_VALID) &&
851 (chLDescReg != testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr))
852 {
853 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
854 "%11s : CCR 0x%x, CSR 0x%x, CDR 0x%x, CLDR 0x%x, "
855 "HCBO %d, HCBDP 0x%x, HCBDC 0x%x, TCBO %d,TCBDP 0x%x, TCBDC 0x%x",
856 channelType[chLoop],
857 chControlReg, chStatusReg, chDescReg, chLDescReg,
858 testCHCtrlBlk->headCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr,
859 testCHCtrlBlk->headCtrlBlk->linkedDesc->descCtrl.ctrl,
860 testCHCtrlBlk->tailCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr,
861 testCHCtrlBlk->tailCtrlBlk->linkedDesc->descCtrl.ctrl);
862 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Jeff Johnson9e237fb2013-10-30 18:46:20 -0700863 "%11s : TX CH EN Descriptor Async, resync it", channelType[chLoop]);
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -0700864 wpalWriteRegister(testCHCtrlBlk->channelRegister.chDXELstDesclRegAddr,
865 testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr);
866 }
867 else if(!(chControlReg & WLANDXE_DESC_CTRL_VALID) &&
868 (chDescReg != testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr))
869 {
870 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
871 "%11s : CCR 0x%x, CSR 0x%x, CDR 0x%x, CLDR 0x%x, "
872 "HCBO %d, HCBDP 0x%x, HCBDC 0x%x, TCBO %d,TCBDP 0x%x, TCBDC 0x%x",
873 channelType[chLoop],
874 chControlReg, chStatusReg, chDescReg, chLDescReg,
875 testCHCtrlBlk->headCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr,
876 testCHCtrlBlk->headCtrlBlk->linkedDesc->descCtrl.ctrl,
877 testCHCtrlBlk->tailCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr,
878 testCHCtrlBlk->tailCtrlBlk->linkedDesc->descCtrl.ctrl);
879 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Jeff Johnson9e237fb2013-10-30 18:46:20 -0700880 "%11s : TX CH DIS Descriptor Async, resync it", channelType[chLoop]);
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -0700881 wpalWriteRegister(testCHCtrlBlk->channelRegister.chDXEDesclRegAddr,
882 testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr);
883 }
884 }
885
886 /* TX channel test done, test RX channels */
887 channelCtrlBlk = (WLANDXE_ChannelCBType *)healthMonitorMsg->pContext;
888 channelCtrlBlk->healthMonitorMsg->callback = dxeRXHealthMonitor;
889 status = wpalPostRxMsg(WDI_GET_PAL_CTX(),
890 channelCtrlBlk->healthMonitorMsg);
891 if (eWLAN_PAL_STATUS_SUCCESS != status)
892 {
893 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Jeff Johnson9e237fb2013-10-30 18:46:20 -0700894 "TX Low resource Kick DXE MSG Serialize fail status=%d",
895 status);
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -0700896 }
897
898 return;
899}
900
901/*==========================================================================
902 @ Function Name
903 dxeHealthMonitorTimeout
904
905 @ Description
906 Health Monitor timer started when TX channel low resource condition
907 And if reciovered from low resource condition, timer would not fired
908 Timer fired means during certain time, TX CH could not be recovered
909
910 @ Parameters
911 channelCtxt Low resource condition happen Channel context
912
913 @ Return
914 NONE
915
916===========================================================================*/
917void dxeHealthMonitorTimeout
918(
919 void *channelCtxt
920)
921{
922 WLANDXE_ChannelCBType *channelCtrlBlk;
923 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
924
925 if(NULL == channelCtxt)
926 {
927 return;
928 }
929
930 /* Timeout Fired, DXE TX should kick on TX thread
931 * Serailize to TX Thread */
932 channelCtrlBlk = (WLANDXE_ChannelCBType *)channelCtxt;
933 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
934 "%11s : Health Monitor timer expired",
Jeff Johnson9e237fb2013-10-30 18:46:20 -0700935 channelType[channelCtrlBlk->channelType]);
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -0700936
937 channelCtrlBlk->healthMonitorMsg->callback = dxeTXHealthMonitor;
938 status = wpalPostTxMsg(WDI_GET_PAL_CTX(),
939 channelCtrlBlk->healthMonitorMsg);
940 if (eWLAN_PAL_STATUS_SUCCESS != status)
941 {
942 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Jeff Johnson9e237fb2013-10-30 18:46:20 -0700943 "TX Low resource Kick DXE MSG Serialize fail status=%d",
944 status);
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -0700945 }
946
947 return;
948}
949
950/*==========================================================================
951 @ Function Name
Jeff Johnson295189b2012-06-20 16:38:30 -0700952 dxeCtrlBlkAlloc
953
954 @ Description
955 Allocate DXE Control block
956 DXE control block will used by Host DXE driver only, internal structure
957 Will make ring linked list
958
959 @ Parameters
960 WLANDXE_CtrlBlkType *dxeCtrlBlk,
961 DXE host driver main control block
962 WLANDXE_ChannelCBType *channelEntry
963 Channel specific control block
964
965 @ Return
966 wpt_status
967
968===========================================================================*/
969static wpt_status dxeCtrlBlkAlloc
970(
971 WLANDXE_CtrlBlkType *dxeCtrlBlk,
972 WLANDXE_ChannelCBType *channelEntry
973)
974{
975 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
976 unsigned int idx, fIdx;
977 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
978 WLANDXE_DescCtrlBlkType *freeCtrlBlk = NULL;
979 WLANDXE_DescCtrlBlkType *prevCtrlBlk = NULL;
980 WLANDXE_DescCtrlBlkType *nextCtrlBlk = NULL;
981
982 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700983 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700984
985 /* Sanity check */
986 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
987 {
988 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
989 "dxeCtrlBlkAlloc Channel Entry is not valid");
990 return eWLAN_PAL_STATUS_E_INVAL;
991 }
992
993 /* Allocate pre asigned number of control blocks */
994 for(idx = 0; idx < channelEntry->numDesc; idx++)
995 {
996 currentCtrlBlk = (WLANDXE_DescCtrlBlkType *)wpalMemoryAllocate(sizeof(WLANDXE_DescCtrlBlkType));
997 if(NULL == currentCtrlBlk)
998 {
999 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1000 "dxeCtrlBlkOpen MemAlloc Fail for channel %d",
1001 channelEntry->channelType);
1002 freeCtrlBlk = channelEntry->headCtrlBlk;
1003 for(fIdx = 0; fIdx < idx; fIdx++)
1004 {
1005 if(NULL == freeCtrlBlk)
1006 {
1007 break;
1008 }
1009
1010 nextCtrlBlk = freeCtrlBlk->nextCtrlBlk;
1011 wpalMemoryFree((void *)freeCtrlBlk);
1012 freeCtrlBlk = nextCtrlBlk;
1013 }
1014 return eWLAN_PAL_STATUS_E_FAULT;
1015 }
1016
1017 memset((wpt_uint8 *)currentCtrlBlk, 0, sizeof(WLANDXE_DescCtrlBlkType));
1018 /* Initialize common elements first */
1019 currentCtrlBlk->xfrFrame = NULL;
1020 currentCtrlBlk->linkedDesc = NULL;
1021 currentCtrlBlk->linkedDescPhyAddr = 0;
1022 currentCtrlBlk->ctrlBlkOrder = idx;
1023
1024 /* This is the first control block allocated
1025 * Next Control block is not allocated yet
1026 * head and tail must be first control block */
1027 if(0 == idx)
1028 {
1029 currentCtrlBlk->nextCtrlBlk = NULL;
1030 channelEntry->headCtrlBlk = currentCtrlBlk;
1031 channelEntry->tailCtrlBlk = currentCtrlBlk;
1032 }
1033 /* This is not first, not last control block
1034 * previous control block may has next linked block */
1035 else if((0 < idx) && (idx < (channelEntry->numDesc - 1)))
1036 {
1037 prevCtrlBlk->nextCtrlBlk = currentCtrlBlk;
1038 }
1039 /* This is last control blocl
1040 * next control block for the last control block is head, first control block
1041 * then whole linked list made RING */
1042 else if((channelEntry->numDesc - 1) == idx)
1043 {
1044 prevCtrlBlk->nextCtrlBlk = currentCtrlBlk;
1045 currentCtrlBlk->nextCtrlBlk = channelEntry->headCtrlBlk;
1046 }
1047 else
1048 {
1049 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1050 "dxeCtrlBlkOpen Invalid Ctrl Blk location %d",
1051 channelEntry->channelType);
1052 wpalMemoryFree(currentCtrlBlk);
1053 return eWLAN_PAL_STATUS_E_FAULT;
1054 }
1055
1056 prevCtrlBlk = currentCtrlBlk;
1057 channelEntry->numFreeDesc++;
1058 }
1059
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001060 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,"%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001061 return status;
1062}
1063
1064/*==========================================================================
1065 @ Function Name
1066 dxeDescLinkAlloc
1067
1068 @ Description
1069 Allocate DXE descriptor
1070 DXE descriptor will be shared by DXE host driver and RIVA DXE engine
1071 Will make RING linked list
1072 Will be linked with Descriptor control block one by one
1073
1074 @ Parameters
1075 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1076 DXE host driver main control block
1077 WLANDXE_ChannelCBType *channelEntry
1078 Channel specific control block
1079 @ Return
1080 wpt_status
1081
1082===========================================================================*/
1083static wpt_status dxeDescAllocAndLink
1084(
1085 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1086 WLANDXE_ChannelCBType *channelEntry
1087)
1088{
1089 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1090 WLANDXE_DescType *currentDesc = NULL;
1091 WLANDXE_DescType *prevDesc = NULL;
1092 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
1093 unsigned int idx;
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05301094 void *physAddressAlloc = NULL;
1095 wpt_uint32 physAddress;
Jeff Johnson295189b2012-06-20 16:38:30 -07001096#ifdef WLANDXE_TEST_CHANNEL_ENABLE
1097 WLANDXE_ChannelCBType *testTXChannelCB = &dxeCtrlBlk->dxeChannel[WDTS_CHANNEL_H2H_TEST_TX];
1098 WLANDXE_DescCtrlBlkType *currDescCtrlBlk = testTXChannelCB->headCtrlBlk;
1099#endif /* WLANDXE_TEST_CHANNEL_ENABLE*/
1100
1101 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001102 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001103
1104 /* Sanity Check */
1105 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
1106 {
1107 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1108 "dxeDescLinkAlloc Channel Entry is not valid");
1109 return eWLAN_PAL_STATUS_E_INVAL;
1110 }
1111
1112 currentCtrlBlk = channelEntry->headCtrlBlk;
1113
1114#if !(defined(FEATURE_R33D) || defined(WLANDXE_TEST_CHANNEL_ENABLE))
1115 /* allocate all DXE descriptors for this channel in one chunk */
1116 channelEntry->descriptorAllocation = (WLANDXE_DescType *)
1117 wpalDmaMemoryAllocate(sizeof(WLANDXE_DescType)*channelEntry->numDesc,
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05301118 &physAddressAlloc);
1119 physAddress = (wpt_uint32) (uintptr_t)(physAddressAlloc);
Jeff Johnson295189b2012-06-20 16:38:30 -07001120 if(NULL == channelEntry->descriptorAllocation)
1121 {
1122 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1123 "dxeDescLinkAlloc Descriptor Alloc Fail");
1124 return eWLAN_PAL_STATUS_E_RESOURCES;
1125 }
1126 currentDesc = channelEntry->descriptorAllocation;
1127#endif
1128
1129 /* Allocate pre asigned number of descriptor */
1130 for(idx = 0; idx < channelEntry->numDesc; idx++)
1131 {
1132#ifndef FEATURE_R33D
1133#ifndef WLANDXE_TEST_CHANNEL_ENABLE
1134 // descriptors were allocated in a chunk -- use the current one
1135 memset((wpt_uint8 *)currentDesc, 0, sizeof(WLANDXE_DescType));
1136 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05301137 "Allocated Descriptor VA %p, PA %p", currentDesc, physAddressAlloc);
Jeff Johnson295189b2012-06-20 16:38:30 -07001138#else
1139 if(WDTS_CHANNEL_H2H_TEST_RX != channelEntry->channelType)
1140 {
1141 // allocate a descriptor
1142 currentDesc = (WLANDXE_DescType *)wpalDmaMemoryAllocate(sizeof(WLANDXE_DescType),
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05301143 &physAddressAlloc);
Jeff Johnson295189b2012-06-20 16:38:30 -07001144 memset((wpt_uint8 *)currentDesc, 0, sizeof(WLANDXE_DescType));
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05301145 physAddress = (wpt_uint32) (uintptr_t)(physAddressAlloc);
Jeff Johnson295189b2012-06-20 16:38:30 -07001146 }
1147 else
1148 {
1149 currentDesc = currDescCtrlBlk->linkedDesc;
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05301150 physAddress = currDescCtrlBlk->linkedDescPhyAddr;
Jeff Johnson295189b2012-06-20 16:38:30 -07001151 currDescCtrlBlk = (WLANDXE_DescCtrlBlkType *)currDescCtrlBlk->nextCtrlBlk;
1152 }
1153#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
1154#else
1155#ifndef WLANDXE_TEST_CHANNEL_ENABLE
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05301156 currentDesc = (WLANDXE_DescType *)wpalAcpuDdrDxeDescMemoryAllocate(&physAddressAlloc);
Jeff Johnson295189b2012-06-20 16:38:30 -07001157 memset((wpt_uint8 *)currentDesc, 0, sizeof(WLANDXE_DescType));
1158 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05301159 "Allocated Descriptor VA %p, PA %p", currentDesc, physAddressAlloc);
1160 physAddress = (wpt_uint32) (uintptr_t)(physAddressAlloc);
Jeff Johnson295189b2012-06-20 16:38:30 -07001161#else
1162 if(WDTS_CHANNEL_H2H_TEST_RX != channelEntry->channelType)
1163 {
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05301164 currentDesc = (WLANDXE_DescType *)wpalAcpuDdrDxeDescMemoryAllocate(&physAddressAlloc);
Jeff Johnson295189b2012-06-20 16:38:30 -07001165 memset((wpt_uint8 *)currentDesc, 0, sizeof(WLANDXE_DescType));
1166 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05301167 "Allocated Descriptor VA %p, PA %p", currentDesc, physAddressAlloc);
1168 physAddress = (wpt_uint32) (uintptr_t)(physAddressAlloc);
Jeff Johnson295189b2012-06-20 16:38:30 -07001169 }
1170 else
1171 {
1172 currentDesc = currDescCtrlBlk->linkedDesc;
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05301173 physAddress = currDescCtrlBlk->linkedDescPhyAddr;
Jeff Johnson295189b2012-06-20 16:38:30 -07001174 currDescCtrlBlk = (WLANDXE_DescCtrlBlkType *)currDescCtrlBlk->nextCtrlBlk;
1175 }
1176#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
1177#endif /* FEATURE_R33D */
1178 if(NULL == currentDesc)
1179 {
1180 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1181 "dxeDescLinkAlloc MemAlloc Fail for channel %d",
1182 channelEntry->channelType);
1183 return eWLAN_PAL_STATUS_E_FAULT;
1184 }
1185
Jeff Johnson295189b2012-06-20 16:38:30 -07001186 currentCtrlBlk->linkedDesc = currentDesc;
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05301187 currentCtrlBlk->linkedDescPhyAddr = physAddress;
Jeff Johnson295189b2012-06-20 16:38:30 -07001188 /* First descriptor, next none
1189 * descriptor bottom location is first descriptor address */
1190 if(0 == idx)
1191 {
1192 currentDesc->dxedesc.dxe_short_desc.phyNextL = 0;
1193 channelEntry->DescBottomLoc = currentDesc;
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05301194 channelEntry->descBottomLocPhyAddr = physAddress;
Jeff Johnson295189b2012-06-20 16:38:30 -07001195 }
1196 /* Not first, not last descriptor
1197 * may make link for previous descriptor with current descriptor
1198 * ENDIAN SWAP needed ????? */
1199 else if((0 < idx) && (idx < (channelEntry->numDesc - 1)))
1200 {
1201 prevDesc->dxedesc.dxe_short_desc.phyNextL =
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05301202 WLANDXE_U32_SWAP_ENDIAN(physAddress);
Jeff Johnson295189b2012-06-20 16:38:30 -07001203 }
1204 /* Last descriptor
1205 * make a ring by asign next pointer as first descriptor
1206 * ENDIAN SWAP NEEDED ??? */
1207 else if((channelEntry->numDesc - 1) == idx)
1208 {
1209 prevDesc->dxedesc.dxe_short_desc.phyNextL =
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05301210 WLANDXE_U32_SWAP_ENDIAN(physAddress);
Jeff Johnson295189b2012-06-20 16:38:30 -07001211 currentDesc->dxedesc.dxe_short_desc.phyNextL =
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05301212 WLANDXE_U32_SWAP_ENDIAN(channelEntry->headCtrlBlk->linkedDescPhyAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -07001213 }
1214
1215 /* If Current Channel is RX channel PAL Packet and OS packet buffer should be
1216 * Pre allocated and physical address must be assigned into
1217 * Corresponding DXE Descriptor */
1218#ifdef WLANDXE_TEST_CHANNEL_ENABLE
1219 if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
1220 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType) ||
1221 (WDTS_CHANNEL_H2H_TEST_RX == channelEntry->channelType))
1222#else
1223 if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
1224 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType))
1225#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
1226 {
1227 status = dxeRXFrameSingleBufferAlloc(dxeCtrlBlk,
1228 channelEntry,
1229 currentCtrlBlk);
1230 if( !WLAN_PAL_IS_STATUS_SUCCESS(status) )
1231 {
1232 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1233 "dxeDescLinkAlloc RX Buffer Alloc Fail for channel %d",
1234 channelEntry->channelType);
1235 return status;
1236 }
1237 --channelEntry->numFreeDesc;
1238 }
1239
Leo Chang7e05f212013-07-01 19:54:15 -07001240 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
1241 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
1242 {
1243 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write;
1244 currentDesc->dxedesc.dxe_short_desc.dstMemAddrL = channelEntry->extraConfig.refWQ_swapped;
1245 }
1246 else if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
1247 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType))
1248 {
1249 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_read;
1250 currentDesc->dxedesc.dxe_short_desc.srcMemAddrL = channelEntry->extraConfig.refWQ_swapped;
1251 }
1252 else
1253 {
1254 /* Just in case. H2H Test RX channel, do nothing
1255 * By Definition this must not happen */
1256 }
1257
Jeff Johnson295189b2012-06-20 16:38:30 -07001258 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
1259 prevDesc = currentDesc;
1260
1261#ifndef FEATURE_R33D
1262#ifndef WLANDXE_TEST_CHANNEL_ENABLE
1263 // advance to the next pre-allocated descriptor in the chunk
1264 currentDesc++;
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05301265 physAddress = (physAddress + sizeof(WLANDXE_DescType));
Jeff Johnson295189b2012-06-20 16:38:30 -07001266#endif
1267#endif
1268 }
1269
1270 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001271 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001272 return status;
1273}
1274
1275/*==========================================================================
1276 @ Function Name
1277
1278 @ Description
1279
1280 @ Parameters
1281
1282 @ Return
1283 wpt_status
1284
1285===========================================================================*/
1286static wpt_status dxeSetInterruptPath
1287(
1288 WLANDXE_CtrlBlkType *dxeCtrlBlk
1289)
1290{
1291 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1292 wpt_uint32 interruptPath = 0;
1293 wpt_uint32 idx;
1294 WLANDXE_ChannelCBType *channelEntry = NULL;
1295
1296 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001297 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001298
1299 for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++)
1300 {
1301 channelEntry = &dxeCtrlBlk->dxeChannel[idx];
1302#ifdef WLANDXE_TEST_CHANNEL_ENABLE
1303 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
1304 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType) ||
1305 (WDTS_CHANNEL_H2H_TEST_TX == channelEntry->channelType))
1306#else
1307 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
1308 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
1309#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
1310 {
1311 interruptPath |= (1 << channelEntry->assignedDMAChannel);
1312 }
1313 else if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
1314 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType))
1315 {
1316 interruptPath |= (1 << (channelEntry->assignedDMAChannel + 16));
1317 }
1318 else
1319 {
1320 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1321 "H2H TEST RX???? %d", channelEntry->channelType);
1322 }
1323 }
1324 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
1325 "Interrupt Path Must be 0x%x", interruptPath);
1326 dxeCtrlBlk->interruptPath = interruptPath;
1327 wpalWriteRegister(WLANDXE_CCU_DXE_INT_SELECT, interruptPath);
1328
1329 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001330 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001331 return status;
1332}
1333
1334/*==========================================================================
1335 @ Function Name
1336 dxeEngineCoreStart
1337
1338 @ Description
1339 Trigger to start RIVA DXE Hardware
1340
1341 @ Parameters
1342 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1343 DXE host driver main control block
1344
1345 @ Return
1346 wpt_status
1347
1348===========================================================================*/
1349static wpt_status dxeEngineCoreStart
1350(
1351 WLANDXE_CtrlBlkType *dxeCtrlBlk
1352)
1353{
1354 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1355 wpt_uint32 registerData = 0;
Leo Chang00708f62013-12-03 20:21:51 -08001356 wpt_uint8 readRetry;
Jeff Johnson295189b2012-06-20 16:38:30 -07001357
1358 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001359 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001360
Leo Chang00708f62013-12-03 20:21:51 -08001361#ifdef WCN_PRONTO
1362 /* Read default */
1363 wpalReadRegister(WLANDXE_CCU_SOFT_RESET, &registerData);
1364 registerData |= WLANDXE_DMA_CCU_DXE_RESET_MASK;
1365
1366 /* Make reset */
1367 wpalWriteRegister(WLANDXE_CCU_SOFT_RESET, registerData);
1368
1369 /* Clear reset */
1370 registerData &= ~WLANDXE_DMA_CCU_DXE_RESET_MASK;
1371 wpalWriteRegister(WLANDXE_CCU_SOFT_RESET, registerData);
1372#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001373 /* START This core init is not needed for the integrated system */
1374 /* Reset First */
1375 registerData = WLANDXE_DMA_CSR_RESET_MASK;
1376 wpalWriteRegister(WALNDEX_DMA_CSR_ADDRESS,
1377 registerData);
Leo Chang00708f62013-12-03 20:21:51 -08001378#endif /* WCN_PRONTO */
Jeff Johnson295189b2012-06-20 16:38:30 -07001379
Leo Chang00708f62013-12-03 20:21:51 -08001380 for(readRetry = 0; readRetry < WLANDXE_CSR_MAX_READ_COUNT; readRetry++)
1381 {
1382 wpalWriteRegister(WALNDEX_DMA_CSR_ADDRESS,
1383 WLANDXE_CSR_DEFAULT_ENABLE);
1384 wpalReadRegister(WALNDEX_DMA_CSR_ADDRESS, &registerData);
1385 if(!(registerData & WLANDXE_DMA_CSR_EN_MASK))
1386 {
1387 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1388 "%s CSR 0x%x, count %d",
1389 __func__, registerData, readRetry);
1390 /* CSR is not valid value, re-try to write */
1391 wpalBusyWait(WLANDXE_CSR_NEXT_READ_WAIT);
1392 }
1393 else
1394 {
1395 break;
1396 }
1397 }
1398 if(WLANDXE_CSR_MAX_READ_COUNT == readRetry)
1399 {
1400 /* MAX wait, still cannot write correct value
1401 * Panic device */
1402 wpalDevicePanic();
1403 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001404
1405 /* Is This needed?
1406 * Not sure, revisit with integrated system */
1407 /* END This core init is not needed for the integrated system */
1408
1409 dxeSetInterruptPath(dxeCtrlBlk);
1410 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001411 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001412 return status;
1413}
1414
1415/*==========================================================================
1416 @ Function Name
1417 dxeChannelInitProgram
1418
1419 @ Description
1420 Program RIVA DXE engine register with initial value
1421 What must be programmed
1422 - Source Address (SADRL, chDXESadrlRegAddr)
1423 - Destination address (DADRL, chDXEDadrlRegAddr)
1424 - Next Descriptor address (DESCL, chDXEDesclRegAddr)
1425 - current descriptor address (LST_DESCL, chDXELstDesclRegAddr)
1426
1427 Not need to program now
1428 - Channel Control register (CH_CTRL, chDXECtrlRegAddr)
1429 TX : Have to program to trigger send out frame
1430 RX : programmed by DXE engine
1431
1432 @ Parameters
1433 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1434 DXE host driver main control block
1435 WLANDXE_ChannelCBType *channelEntry
1436 Channel specific control block
1437 @ Return
1438 wpt_status
1439
1440===========================================================================*/
1441static wpt_status dxeChannelInitProgram
1442(
1443 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1444 WLANDXE_ChannelCBType *channelEntry
1445)
1446{
1447 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1448 wpt_uint32 idx;
1449 WLANDXE_DescType *currentDesc = NULL;
1450 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
1451
1452 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001453 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001454
1455 /* Sanity Check */
1456 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
1457 {
1458 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1459 "dxeChannelInitProgram Channel Entry is not valid");
1460 return eWLAN_PAL_STATUS_E_INVAL;
1461 }
1462
1463 /* Program Source address and destination adderss */
1464 if(!channelEntry->channelConfig.useShortDescFmt)
1465 {
1466 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1467 "dxeChannelInitProgram Long Descriptor not support yet");
1468 return eWLAN_PAL_STATUS_E_FAILURE;
1469 }
1470
1471 /* Common register area */
1472 /* Next linked list Descriptor pointer */
1473 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
1474 channelEntry->headCtrlBlk->linkedDescPhyAddr);
1475 if(eWLAN_PAL_STATUS_SUCCESS != status)
1476 {
1477 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1478 "dxeChannelInitProgram Write DESC Address register fail");
1479 return status;
1480 }
1481
1482 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
1483 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
1484 {
1485 /* Program default registers */
1486 /* TX DMA channel, DMA destination address is work Q */
1487 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrlRegAddr,
1488 channelEntry->channelConfig.refWQ);
1489 if(eWLAN_PAL_STATUS_SUCCESS != status)
1490 {
1491 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1492 "dxeChannelInitProgram Write TX DAddress register fail");
1493 return status;
1494 }
1495 }
1496 else if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
1497 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType))
1498 {
1499 /* Initialize Descriptor control Word First */
1500 currentCtrlBlk = channelEntry->headCtrlBlk;
1501 for(idx = 0; idx < channelEntry->channelConfig.nDescs; idx++)
1502 {
1503 currentDesc = currentCtrlBlk->linkedDesc;
1504 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
1505 }
1506
1507 /* RX DMA channel, DMA source address is work Q */
1508 status = wpalWriteRegister(channelEntry->channelRegister.chDXESadrlRegAddr,
1509 channelEntry->channelConfig.refWQ);
1510 if(eWLAN_PAL_STATUS_SUCCESS != status)
1511 {
1512 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1513 "dxeChannelInitProgram Write RX SAddress WQ register fail");
1514 return status;
1515 }
1516
1517 /* RX DMA channel, Program pre allocated destination Address */
1518 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrlRegAddr,
1519 WLANDXE_U32_SWAP_ENDIAN(channelEntry->DescBottomLoc->dxedesc.dxe_short_desc.phyNextL));
1520 if(eWLAN_PAL_STATUS_SUCCESS != status)
1521 {
1522 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1523 "dxeChannelInitProgram Write RX DAddress register fail");
1524 return status;
1525 }
1526
1527 /* RX Channels, default Control registers MUST BE ENABLED */
1528 wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr,
1529 channelEntry->extraConfig.chan_mask);
1530 if(eWLAN_PAL_STATUS_SUCCESS != status)
1531 {
1532 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1533 "dxeChannelInitProgram Write RX Control register fail");
1534 return status;
1535 }
1536 }
1537 else
1538 {
1539 /* H2H test channel, not use work Q */
1540 /* Program pre allocated destination Address */
1541 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrlRegAddr,
1542 WLANDXE_U32_SWAP_ENDIAN(channelEntry->DescBottomLoc->dxedesc.dxe_short_desc.phyNextL));
1543 if(eWLAN_PAL_STATUS_SUCCESS != status)
1544 {
1545 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1546 "dxeChannelInitProgram Write RX DAddress register fail");
1547 return status;
1548 }
1549 }
1550
1551 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001552 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001553 return status;
1554}
1555
1556
1557/*==========================================================================
1558 @ Function Name
1559 dxeChannelStart
1560
1561 @ Description
1562 Start Specific Channel
1563
1564 @ Parameters
1565 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1566 DXE host driver main control block
1567 WLANDXE_ChannelCBType *channelEntry
1568 Channel specific control block
1569
1570 @ Return
1571 wpt_status
1572
1573===========================================================================*/
1574static wpt_status dxeChannelStart
1575(
1576 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1577 WLANDXE_ChannelCBType *channelEntry
1578)
1579{
1580 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1581 wpt_uint32 regValue = 0;
1582 wpt_uint32 intMaskVal = 0;
1583
1584 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001585 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001586
1587 channelEntry->extraConfig.chEnabled = eWLAN_PAL_TRUE;
1588 channelEntry->extraConfig.chConfigured = eWLAN_PAL_TRUE;
1589
1590 /* Enable individual channel
1591 * not to break current channel setup, first read register */
1592 status = wpalReadRegister(WALNDEX_DMA_CH_EN_ADDRESS,
1593 &regValue);
1594 if(eWLAN_PAL_STATUS_SUCCESS != status)
1595 {
1596 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1597 "dxeChannelStart Read Channel Enable register fail");
1598 return status;
1599 }
1600
1601 /* Enable Channel specific Interrupt */
1602 status = wpalReadRegister(WLANDXE_INT_MASK_REG_ADDRESS,
1603 &intMaskVal);
1604 if(eWLAN_PAL_STATUS_SUCCESS != status)
1605 {
1606 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1607 "dxeChannelStart Read INT_MASK register fail");
1608 return status;
1609 }
1610 intMaskVal |= channelEntry->extraConfig.intMask;
1611 status = wpalWriteRegister(WLANDXE_INT_MASK_REG_ADDRESS,
1612 intMaskVal);
1613 if(eWLAN_PAL_STATUS_SUCCESS != status)
1614 {
1615 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1616 "dxeChannelStart Write INT_MASK register fail");
1617 return status;
1618 }
1619
1620 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001621 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001622 return status;
1623}
1624
1625/*==========================================================================
1626 @ Function Name
1627 dxeChannelStop
1628
1629 @ Description
1630 Stop Specific Channel
1631
1632 @ Parameters
1633 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1634 DXE host driver main control block
1635 WLANDXE_ChannelCBType *channelEntry
1636 Channel specific control block
1637
1638 @ Return
1639 wpt_status
1640
1641===========================================================================*/
1642static wpt_status dxeChannelStop
1643(
1644 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1645 WLANDXE_ChannelCBType *channelEntry
1646)
1647{
1648 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1649 wpt_uint32 intMaskVal = 0;
1650
1651 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001652 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001653
1654 /* Sanity */
1655 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
1656 {
1657 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1658 "dxeChannelStop Invalid arg input");
1659 return eWLAN_PAL_STATUS_E_INVAL;
1660 }
1661
Madan Mohan Koyyalamudid57ae632012-11-06 18:42:48 -08001662 if ( (channelEntry->extraConfig.chEnabled != eWLAN_PAL_TRUE) ||
1663 (channelEntry->extraConfig.chConfigured != eWLAN_PAL_TRUE))
1664 {
1665 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1666 "dxeChannelStop channels are not enabled ");
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08001667 return status;
Madan Mohan Koyyalamudid57ae632012-11-06 18:42:48 -08001668 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001669 /* Maskout interrupt */
1670 status = wpalReadRegister(WLANDXE_INT_MASK_REG_ADDRESS,
1671 &intMaskVal);
1672 if(eWLAN_PAL_STATUS_SUCCESS != status)
1673 {
1674 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1675 "dxeChannelStop Read INT_MASK register fail");
1676 return status;
1677 }
1678 intMaskVal ^= channelEntry->extraConfig.intMask;
1679 status = wpalWriteRegister(WLANDXE_INT_MASK_REG_ADDRESS,
1680 intMaskVal);
1681 if(eWLAN_PAL_STATUS_SUCCESS != status)
1682 {
1683 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1684 "dxeChannelStop Write INT_MASK register fail");
1685 return status;
1686 }
1687
1688 channelEntry->extraConfig.chEnabled = eWLAN_PAL_FALSE;
1689
1690 /* Stop Channel ??? */
1691 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001692 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001693 return status;
1694}
1695
1696/*==========================================================================
1697 @ Function Name
1698 dxeChannelClose
1699
1700 @ Description
1701 Close Specific Channel
1702 Free pre allocated RX frame buffer if RX channel
1703 Free DXE descriptor for each channel
1704 Free Descriptor control block for each channel
1705
1706 @ Parameters
1707 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1708 DXE host driver main control block
1709 WLANDXE_ChannelCBType *channelEntry
1710 Channel specific control block
1711
1712 @ Return
1713 wpt_status
1714
1715===========================================================================*/
1716static wpt_status dxeChannelClose
1717(
1718 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1719 WLANDXE_ChannelCBType *channelEntry
1720)
1721{
1722 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1723 wpt_uint32 idx;
1724 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
1725 WLANDXE_DescCtrlBlkType *nextCtrlBlk = NULL;
1726 WLANDXE_DescType *currentDescriptor = NULL;
1727 WLANDXE_DescType *nextDescriptor = NULL;
1728
1729 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001730 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001731
1732 /* Sanity */
1733 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
1734 {
1735 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1736 "dxeChannelStop Invalid arg input");
1737 return eWLAN_PAL_STATUS_E_INVAL;
1738 }
1739
1740 currentCtrlBlk = channelEntry->headCtrlBlk;
1741 if(NULL != currentCtrlBlk)
1742 {
1743 currentDescriptor = currentCtrlBlk->linkedDesc;
1744 for(idx = 0; idx < channelEntry->numDesc; idx++)
1745 {
1746 if (idx + 1 != channelEntry->numDesc)
1747 {
1748 nextCtrlBlk = currentCtrlBlk->nextCtrlBlk;
1749 nextDescriptor = nextCtrlBlk->linkedDesc;
1750 }
1751 else
1752 {
1753 nextCtrlBlk = NULL;
1754 nextDescriptor = NULL;
1755 }
1756 if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
1757 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType))
1758 {
1759 if (NULL != currentCtrlBlk->xfrFrame)
1760 {
1761 wpalUnlockPacket(currentCtrlBlk->xfrFrame);
1762 wpalPacketFree(currentCtrlBlk->xfrFrame);
1763 }
1764 }
1765 /*
1766 * It is the responsibility of DXE to walk through the
1767 * descriptor chain and unlock any pending packets (if
1768 * locked).
1769 */
1770 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
1771 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
1772 {
1773 if((NULL != currentCtrlBlk->xfrFrame) &&
1774 (eWLAN_PAL_STATUS_SUCCESS == wpalIsPacketLocked(currentCtrlBlk->xfrFrame)))
1775 {
1776 wpalUnlockPacket(currentCtrlBlk->xfrFrame);
1777 wpalPacketFree(currentCtrlBlk->xfrFrame);
1778 }
1779 }
1780#if (defined(FEATURE_R33D) || defined(WLANDXE_TEST_CHANNEL_ENABLE))
1781 // descriptors allocated individually so free them individually
1782 wpalDmaMemoryFree(currentDescriptor);
1783#endif
1784 wpalMemoryFree(currentCtrlBlk);
1785
1786 currentCtrlBlk = nextCtrlBlk;
1787 currentDescriptor = nextDescriptor;
Madan Mohan Koyyalamudi74719a12012-10-21 12:09:36 -07001788 if(NULL == currentCtrlBlk)
1789 {
1790 /* Already reach last of the control block
1791 * Not need to process anymore, break */
1792 break;
1793 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001794 }
1795 }
1796
1797#if !(defined(FEATURE_R33D) || defined(WLANDXE_TEST_CHANNEL_ENABLE))
1798 // descriptors were allocated as a single chunk so free the chunk
1799 if(NULL != channelEntry->descriptorAllocation)
1800 {
1801 wpalDmaMemoryFree(channelEntry->descriptorAllocation);
1802 }
1803#endif
1804
1805 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001806 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001807 return status;
1808}
1809
1810/*==========================================================================
1811 @ Function Name
1812 dxeChannelCleanInt
1813
1814 @ Description
1815 Clean up interrupt from RIVA HW
1816 After Host finish to handle interrupt, interrupt signal must be cleaned up
1817 Otherwise next interrupt will not be generated
1818
1819 @ Parameters
1820 WLANDXE_ChannelCBType *channelEntry
1821 Channel specific control block
1822 wpt_uint32 *chStat
1823 Channel Status register value
1824
1825 @ Return
1826 wpt_status
1827
1828===========================================================================*/
1829static wpt_status dxeChannelCleanInt
1830(
1831 WLANDXE_ChannelCBType *channelEntry,
1832 wpt_uint32 *chStat
1833)
1834{
1835 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1836
1837 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001838 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001839
1840 /* Read Channel Status Register to know why INT Happen */
1841 status = wpalReadRegister(channelEntry->channelRegister.chDXEStatusRegAddr,
1842 chStat);
1843 if(eWLAN_PAL_STATUS_SUCCESS != status)
1844 {
1845 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1846 "dxeChannelCleanInt Read CH STAT register fail");
1847 return eWLAN_PAL_STATUS_E_FAULT;
1848 }
1849 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
1850 "%s Channel INT Clean, Status 0x%x",
1851 channelType[channelEntry->channelType], *chStat);
1852
1853 /* Clean up all the INT within this channel */
1854 status = wpalWriteRegister(WLANDXE_INT_CLR_ADDRESS,
1855 (1 << channelEntry->assignedDMAChannel));
1856 if(eWLAN_PAL_STATUS_SUCCESS != status)
1857 {
1858 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1859 "dxeChannelCleanInt Write CH Clean register fail");
1860 return eWLAN_PAL_STATUS_E_FAULT;
1861 }
1862
Jeff Johnsone7245742012-09-05 17:12:55 -07001863 /* Clean up Error INT Bit */
1864 if(WLANDXE_CH_STAT_INT_ERR_MASK & *chStat)
1865 {
1866 status = wpalWriteRegister(WLANDXE_INT_ERR_CLR_ADDRESS,
1867 (1 << channelEntry->assignedDMAChannel));
1868 if(eWLAN_PAL_STATUS_SUCCESS != status)
1869 {
1870 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1871 "dxeChannelCleanInt Read CH STAT register fail");
1872 return eWLAN_PAL_STATUS_E_FAULT;
1873 }
1874 }
1875
1876 /* Clean up DONE INT Bit */
1877 if(WLANDXE_CH_STAT_INT_DONE_MASK & *chStat)
1878 {
1879 status = wpalWriteRegister(WLANDXE_INT_DONE_CLR_ADDRESS,
1880 (1 << channelEntry->assignedDMAChannel));
1881 if(eWLAN_PAL_STATUS_SUCCESS != status)
1882 {
1883 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1884 "dxeChannelCleanInt Read CH STAT register fail");
1885 return eWLAN_PAL_STATUS_E_FAULT;
1886 }
1887 }
1888
1889 /* Clean up ED INT Bit */
1890 if(WLANDXE_CH_STAT_INT_ED_MASK & *chStat)
1891 {
1892 status = wpalWriteRegister(WLANDXE_INT_ED_CLR_ADDRESS,
1893 (1 << channelEntry->assignedDMAChannel));
1894 if(eWLAN_PAL_STATUS_SUCCESS != status)
1895 {
1896 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1897 "dxeChannelCleanInt Read CH STAT register fail");
1898 return eWLAN_PAL_STATUS_E_FAULT;
1899 }
1900 }
1901
Jeff Johnson295189b2012-06-20 16:38:30 -07001902 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001903 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001904 return status;
1905}
1906
1907/*==========================================================================
Leo Chang72cdfd32013-10-17 20:36:30 -07001908 @ Function Name
1909 dxeRXResourceAvailableTimerExpHandler
1910
1911 @ Description
1912 During pre-set timeperiod, if free available RX buffer is not allocated
1913 Trigger Driver re-loading to recover RX dead end
1914
1915 @ Parameters
1916 v_VOID_t *usrData
1917 DXE context
1918
1919 @ Return
1920 NONE
1921
1922===========================================================================*/
1923void dxeRXResourceAvailableTimerExpHandler
1924(
1925 void *usrData
1926)
1927{
1928 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1929 "RX Low resource, Durign wait time period %d, RX resource not allocated",
1930 T_WLANDXE_MAX_RX_PACKET_WAIT);
1931 wpalWlanReload();
1932
Mihir Shetefdc9f532014-01-09 15:03:02 +05301933 if (NULL != usrData)
1934 dxeStartSSRTimer((WLANDXE_CtrlBlkType *)usrData);
1935
1936 return;
1937}
1938
1939/*==========================================================================
1940 @ Function Name
1941 dxeStartSSRTimer
1942
1943 @ Description
1944 Start the dxeSSRTimer after issuing the FIQ to restart the WCN chip,
1945 this makes sure that if the chip does not respond to the FIQ within
1946 the timeout period the dxeSSRTimer expiration handler will take the
1947 appropriate action.
1948
1949 @ Parameters
1950 NONE
1951
1952 @ Return
1953 NONE
1954
1955===========================================================================*/
1956static void dxeStartSSRTimer
1957(
1958 WLANDXE_CtrlBlkType *dxeCtxt
1959)
1960{
1961 if(VOS_TIMER_STATE_RUNNING !=
1962 wpalTimerGetCurStatus(&dxeCtxt->dxeSSRTimer))
1963 {
1964 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
1965 "%s: Starting SSR Timer",__func__);
1966 wpalTimerStart(&dxeCtxt->dxeSSRTimer,
1967 T_WLANDXE_SSR_TIMEOUT);
1968 }
1969}
1970
1971/*==========================================================================
1972 @ Function Name
1973 dxeSSRTimerExpHandler
1974
1975 @ Description
1976 Issue an explicit subsystem restart of the wcnss subsystem if the
1977 WCN chip does not respond to the FIQ within the timeout period
1978
1979 @ Parameters
1980 v_VOID_t *usrData
1981
1982 @ Return
1983 NONE
1984
1985===========================================================================*/
1986void dxeSSRTimerExpHandler
1987(
1988 void *usrData
1989)
1990{
1991 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1992 "DXE not shutdown %d ms after FIQ!! Issue SSR",
1993 T_WLANDXE_SSR_TIMEOUT);
1994 wpalRivaSubystemRestart();
1995
Leo Chang72cdfd32013-10-17 20:36:30 -07001996 return;
1997}
1998
1999/*==========================================================================
Jeff Johnson295189b2012-06-20 16:38:30 -07002000 @ Function Name
2001 dxeRXPacketAvailableCB
2002
2003 @ Description
2004 If RX frame handler encounts RX buffer pool empty condition,
2005 DXE RX handle loop will be blocked till get available RX buffer pool.
2006 When new RX buffer pool available, Packet available CB function will
2007 be called.
2008
2009 @ Parameters
2010 wpt_packet *freePacket
2011 Newly allocated RX buffer
2012 v_VOID_t *usrData
2013 DXE context
2014
2015 @ Return
2016 NONE
2017
2018===========================================================================*/
2019void dxeRXPacketAvailableCB
2020(
2021 wpt_packet *freePacket,
2022 v_VOID_t *usrData
2023)
2024{
2025 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
2026 wpt_status status;
2027
2028 /* Simple Sanity */
2029 if((NULL == freePacket) || (NULL == usrData))
2030 {
2031 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
2032 "Get Free RX Buffer fail, Critical Error");
2033 HDXE_ASSERT(0);
2034 return;
2035 }
2036
2037 dxeCtxt = (WLANDXE_CtrlBlkType *)usrData;
2038
2039 if(WLANDXE_CTXT_COOKIE != dxeCtxt->dxeCookie)
2040 {
2041 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
2042 "DXE Context data corrupted, Critical Error");
2043 HDXE_ASSERT(0);
2044 return;
2045 }
2046
2047 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
2048 "DXE RX packet available, post MSG to RX Thread");
2049
2050 dxeCtxt->freeRXPacket = freePacket;
2051
2052 /* Serialize RX Packet Available message upon RX thread */
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08002053 if (NULL == dxeCtxt->rxPktAvailMsg)
2054 {
2055 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
2056 "DXE NULL pkt");
2057 HDXE_ASSERT(0);
2058 return;
2059 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002060
2061 status = wpalPostRxMsg(WDI_GET_PAL_CTX(),
2062 dxeCtxt->rxPktAvailMsg);
2063 if(eWLAN_PAL_STATUS_SUCCESS != status)
2064 {
Jeff Johnson295189b2012-06-20 16:38:30 -07002065 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
2066 "dxeRXPacketAvailableCB serialize fail");
2067 }
2068
2069 return;
2070}
2071
2072/*==========================================================================
2073 @ Function Name
2074 dxeRXFrameSingleBufferAlloc
2075
2076 @ Description
2077 Allocate Platform packet buffer to prepare RX frame
2078 RX frame memory space must be pre allocted and must be asigned to
2079 descriptor
2080 then whenever DMA engine want to tranfer frame from BMU,
2081 buffer must be ready
2082
2083 @ Parameters
2084 WLANDXE_CtrlBlkType *dxeCtrlBlk,
2085 DXE host driver main control block
2086 WLANDXE_ChannelCBType *channelEntry
2087 Channel specific control block
2088 WLANDXE_DescCtrlBlkType currentCtrlBlock
2089 current control block which have to be asigned
2090 frame buffer
2091
2092 @ Return
2093 wpt_status
2094
2095===========================================================================*/
2096static wpt_status dxeRXFrameSingleBufferAlloc
2097(
2098 WLANDXE_CtrlBlkType *dxeCtxt,
2099 WLANDXE_ChannelCBType *channelEntry,
2100 WLANDXE_DescCtrlBlkType *currentCtrlBlock
2101)
2102{
2103 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
2104 wpt_packet *currentPalPacketBuffer = NULL;
2105 WLANDXE_DescType *currentDesc = NULL;
2106#ifdef FEATURE_R33D
2107 wpt_uint32 virtualAddressPCIe;
2108 wpt_uint32 physicalAddressPCIe;
2109#else
2110 wpt_iterator iterator;
2111 wpt_uint32 allocatedSize = 0;
2112 void *physAddress = NULL;
2113#endif /* FEATURE_R33D */
2114
Jeff Johnson295189b2012-06-20 16:38:30 -07002115
2116 currentDesc = currentCtrlBlock->linkedDesc;
2117
Leo Chang7e05f212013-07-01 19:54:15 -07002118 if(currentDesc->descCtrl.valid)
2119 {
2120 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2121 "This Descriptor is valid, Do not refill");
2122 return eWLAN_PAL_STATUS_E_EXISTS;
2123 }
2124
Jeff Johnson295189b2012-06-20 16:38:30 -07002125 /* First check if a packet pointer has already been provided by a previously
2126 invoked Rx packet available callback. If so use that packet. */
2127 if(dxeCtxt->rxPalPacketUnavailable && (NULL != dxeCtxt->freeRXPacket))
2128 {
2129 currentPalPacketBuffer = dxeCtxt->freeRXPacket;
2130 dxeCtxt->rxPalPacketUnavailable = eWLAN_PAL_FALSE;
2131 dxeCtxt->freeRXPacket = NULL;
2132 }
2133 else if(!dxeCtxt->rxPalPacketUnavailable)
2134 {
Leo Chang72cdfd32013-10-17 20:36:30 -07002135 /* Allocate platform Packet buffer and OS Frame Buffer at here */
2136 currentPalPacketBuffer = wpalPacketAlloc(eWLAN_PAL_PKT_TYPE_RX_RAW,
Jeff Johnson295189b2012-06-20 16:38:30 -07002137 WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE,
2138 dxeRXPacketAvailableCB,
2139 (void *)dxeCtxt);
2140
2141 if(NULL == currentPalPacketBuffer)
2142 {
2143 dxeCtxt->rxPalPacketUnavailable = eWLAN_PAL_TRUE;
Leo Chang72cdfd32013-10-17 20:36:30 -07002144 /* Out of RX free buffer,
2145 * Start timer to recover from RX dead end */
2146 if(VOS_TIMER_STATE_RUNNING !=
2147 wpalTimerGetCurStatus(&dxeCtxt->rxResourceAvailableTimer))
2148 {
2149 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
2150 "RX Low resource, wait available resource");
2151 wpalTimerStart(&dxeCtxt->rxResourceAvailableTimer,
2152 T_WLANDXE_MAX_RX_PACKET_WAIT);
2153 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002154 }
2155 }
2156
2157 if(NULL == currentPalPacketBuffer)
2158 {
Jeff Johnson295189b2012-06-20 16:38:30 -07002159 return eWLAN_PAL_STATUS_E_RESOURCES;
2160 }
2161
2162 currentCtrlBlock->xfrFrame = currentPalPacketBuffer;
2163 currentPalPacketBuffer->pktType = eWLAN_PAL_PKT_TYPE_RX_RAW;
2164 currentPalPacketBuffer->pBD = NULL;
2165 currentPalPacketBuffer->pBDPhys = NULL;
2166 currentPalPacketBuffer->BDLength = 0;
2167#ifdef FEATURE_R33D
2168 status = wpalAllocateShadowRxFrame(currentPalPacketBuffer,
2169 &physicalAddressPCIe,
2170 &virtualAddressPCIe);
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08002171 if((0 == physicalAddressPCIe) || (0 = virtualAddressPCIe))
2172 {
2173 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED,
2174 "RX NULL Shadow Memory");
2175 HDXE_ASSERT(0);
2176 return eWLAN_PAL_STATUS_E_FAULT;
2177 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002178 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED,
2179 "RX Shadow Memory Va 0x%x, Pa 0x%x",
2180 virtualAddressPCIe, physicalAddressPCIe);
2181 if(eWLAN_PAL_STATUS_SUCCESS != status)
2182 {
2183 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2184 "dxeRXFrameBufferAlloc Shadow Mem Alloc fail");
2185 return status;
2186 }
2187 currentCtrlBlock->shadowBufferVa = virtualAddressPCIe;
2188 currentPalPacketBuffer->pBDPhys = (void *)physicalAddressPCIe;
2189 memset((wpt_uint8 *)currentCtrlBlock->shadowBufferVa, 0, WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE);
2190#else
2191 status = wpalLockPacketForTransfer(currentPalPacketBuffer);
2192 if(eWLAN_PAL_STATUS_SUCCESS != status)
2193 {
2194 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2195 "dxeRXFrameBufferAlloc unable to lock packet");
2196 return status;
2197 }
2198
2199 /* Init iterator to get physical os buffer address */
2200 status = wpalIteratorInit(&iterator, currentPalPacketBuffer);
2201 if(eWLAN_PAL_STATUS_SUCCESS != status)
2202 {
2203 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2204 "dxeRXFrameBufferAlloc iterator init fail");
2205 return status;
2206 }
2207 status = wpalIteratorNext(&iterator,
2208 currentPalPacketBuffer,
2209 &physAddress,
2210 &allocatedSize);
2211 if(eWLAN_PAL_STATUS_SUCCESS != status)
2212 {
2213 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2214 "dxeRXFrameBufferAlloc iterator Get Next pointer fail");
2215 return status;
2216 }
2217 currentPalPacketBuffer->pBDPhys = physAddress;
2218#endif /* FEATURE_R33D */
2219
2220 /* DXE descriptor must have SWAPPED addres in it's structure
2221 * !!! SWAPPED !!! */
2222 currentDesc->dxedesc.dxe_short_desc.dstMemAddrL =
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05302223 WLANDXE_U32_SWAP_ENDIAN((wpt_uint32)(uintptr_t)currentPalPacketBuffer->pBDPhys);
Jeff Johnson295189b2012-06-20 16:38:30 -07002224
Jeff Johnson295189b2012-06-20 16:38:30 -07002225 return status;
2226}
2227
2228/*==========================================================================
2229 @ Function Name
2230 dxeRXFrameRefillRing
2231
2232 @ Description
2233 Allocate Platform packet buffers to try to fill up the DXE Rx ring
2234
2235 @ Parameters
2236 WLANDXE_CtrlBlkType *dxeCtrlBlk,
2237 DXE host driver main control block
2238 WLANDXE_ChannelCBType *channelEntry
2239 Channel specific control block
2240
2241 @ Return
2242 wpt_status
2243
2244===========================================================================*/
2245static wpt_status dxeRXFrameRefillRing
2246(
2247 WLANDXE_CtrlBlkType *dxeCtxt,
2248 WLANDXE_ChannelCBType *channelEntry
2249)
2250{
2251 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
2252 WLANDXE_DescCtrlBlkType *currentCtrlBlk = channelEntry->tailCtrlBlk;
2253 WLANDXE_DescType *currentDesc = NULL;
2254
2255 while(channelEntry->numFreeDesc > 0)
2256 {
2257 /* Current Control block is free
2258 * and associated frame buffer is not linked with control block anymore
2259 * allocate new frame buffer for current control block */
2260 status = dxeRXFrameSingleBufferAlloc(dxeCtxt,
2261 channelEntry,
2262 currentCtrlBlk);
2263
Leo Chang7e05f212013-07-01 19:54:15 -07002264 if((eWLAN_PAL_STATUS_SUCCESS != status) &&
2265 (eWLAN_PAL_STATUS_E_EXISTS != status))
Jeff Johnson295189b2012-06-20 16:38:30 -07002266 {
2267 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
2268 "dxeRXFrameRefillRing, out of RX buffer pool, break here");
2269 break;
2270 }
2271
Leo Chang7e05f212013-07-01 19:54:15 -07002272 if(eWLAN_PAL_STATUS_E_EXISTS == status)
2273 {
2274 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2275 "dxeRXFrameRefillRing, Descriptor Non-Empry");
2276 }
2277
Jeff Johnson295189b2012-06-20 16:38:30 -07002278 currentDesc = currentCtrlBlk->linkedDesc;
2279 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_read;
2280
2281 /* Issue a dummy read from the DXE descriptor DDR location to ensure
2282 that any posted writes are reflected in memory before DXE looks at
2283 the descriptor. */
2284 if(channelEntry->extraConfig.cw_ctrl_read != currentDesc->descCtrl.ctrl)
2285 {
2286 //HDXE_ASSERT(0);
2287 }
2288
2289 /* Kick off the DXE ring, if not in any power save mode */
Leo Chang094ece82013-04-23 17:57:41 -07002290 if(WLANDXE_POWER_STATE_FULL == dxeCtxt->hostPowerState)
Jeff Johnson295189b2012-06-20 16:38:30 -07002291 {
2292 wpalWriteRegister(WALNDEX_DMA_ENCH_ADDRESS,
2293 1 << channelEntry->assignedDMAChannel);
2294 }
2295 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
Leo Chang7e05f212013-07-01 19:54:15 -07002296 if(eWLAN_PAL_STATUS_E_EXISTS != status)
2297 {
2298 --channelEntry->numFreeDesc;
2299 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002300 }
2301
2302 channelEntry->tailCtrlBlk = currentCtrlBlk;
2303
2304 return status;
2305}
2306
2307/*==========================================================================
Jeff Johnsone7245742012-09-05 17:12:55 -07002308 @ Function Name
2309 dxeRXFrameRouteUpperLayer
2310
2311 @ Description
2312 Test DXE descriptors and if any RX frame pending within RING,
2313 Route to upper layer
2314
2315 @ Parameters
2316 WLANDXE_CtrlBlkType *dxeCtrlBlk,
2317 DXE host driver main control block
2318 WLANDXE_ChannelCBType *channelEntry
2319 Channel specific control block
2320 @ Return
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002321 < 0 Any error happen
Jeff Johnsone7245742012-09-05 17:12:55 -07002322 0 No frame pulled from RX RING
2323 int number of RX frames pulled from RX ring
2324
2325===========================================================================*/
2326static wpt_int32 dxeRXFrameRouteUpperLayer
2327(
2328 WLANDXE_CtrlBlkType *dxeCtxt,
2329 WLANDXE_ChannelCBType *channelEntry
2330)
2331{
2332 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
2333 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
2334 WLANDXE_DescType *currentDesc = NULL;
2335 wpt_uint32 descCtrl, frameCount = 0, i;
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002336 wpt_int32 ret_val = -1;
Jeff Johnsone7245742012-09-05 17:12:55 -07002337
2338 currentCtrlBlk = channelEntry->headCtrlBlk;
2339 currentDesc = currentCtrlBlk->linkedDesc;
2340
2341 /* Descriptoe should be SWAPPED ???? */
2342 descCtrl = currentDesc->descCtrl.ctrl;
2343
2344 /* Get frames while VALID bit is not set (DMA complete) and a data
2345 * associated with it */
2346 while(!(WLANDXE_U32_SWAP_ENDIAN(descCtrl) & WLANDXE_DESC_CTRL_VALID) &&
2347 (eWLAN_PAL_STATUS_SUCCESS == wpalIsPacketLocked(currentCtrlBlk->xfrFrame)) &&
2348 (currentCtrlBlk->xfrFrame->pInternalData != NULL) &&
2349 (frameCount < WLANDXE_MAX_REAPED_RX_FRAMES) )
2350 {
2351 channelEntry->numTotalFrame++;
2352 channelEntry->numFreeDesc++;
2353#ifdef FEATURE_R33D
2354 /* Transfer Size should be */
2355 currentDesc->xfrSize = WLANDXE_U32_SWAP_ENDIAN(WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE);
2356 status = wpalPrepareRxFrame(&currentCtrlBlk->xfrFrame,
2357 (wpt_uint32)currentCtrlBlk->xfrFrame->pBDPhys,
2358 currentCtrlBlk->shadowBufferVa,
2359 WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE);
2360 if(eWLAN_PAL_STATUS_SUCCESS != status)
2361 {
2362 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2363 "dxeRXFrameReady Prepare RX Frame fail");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002364 return ret_val;
Jeff Johnsone7245742012-09-05 17:12:55 -07002365 }
2366 status = wpalFreeRxFrame(currentCtrlBlk->shadowBufferVa);
2367 if(eWLAN_PAL_STATUS_SUCCESS != status)
2368 {
2369 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2370 "dxeRXFrameReady Free Shadow RX Frame fail");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002371 return ret_val;
Jeff Johnsone7245742012-09-05 17:12:55 -07002372 }
2373
2374#else /* FEATURE_R33D */
2375 status = wpalUnlockPacket(currentCtrlBlk->xfrFrame);
2376 if (eWLAN_PAL_STATUS_SUCCESS != status)
2377 {
2378 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2379 "dxeRXFrameReady unable to unlock packet");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002380 return ret_val;
Jeff Johnsone7245742012-09-05 17:12:55 -07002381 }
2382#endif /* FEATURE_R33D */
2383 /* This Descriptor is valid, so linked Control block is also valid
2384 * Linked Control block has pre allocated packet buffer
2385 * So, just let upper layer knows preallocated frame pointer will be OK */
2386 /* Reap Rx frames */
2387 rx_reaped_buf[frameCount] = currentCtrlBlk->xfrFrame;
2388 frameCount++;
Madan Mohan Koyyalamudi0c325532012-09-24 13:24:42 -07002389 currentCtrlBlk->xfrFrame = NULL;
Jeff Johnsone7245742012-09-05 17:12:55 -07002390
2391 /* Now try to refill the ring with empty Rx buffers to keep DXE busy */
Leo Changd6de1c22013-03-21 15:42:41 -07002392 dxeRXFrameRefillRing(dxeCtxt, channelEntry);
Jeff Johnsone7245742012-09-05 17:12:55 -07002393
2394 /* Test next contorl block
2395 * if valid, this control block also has new RX frame must be handled */
2396 currentCtrlBlk = (WLANDXE_DescCtrlBlkType *)currentCtrlBlk->nextCtrlBlk;
2397 currentDesc = currentCtrlBlk->linkedDesc;
2398 descCtrl = currentDesc->descCtrl.ctrl;
2399 }
2400
2401 /* Update head control block
2402 * current control block's valid bit was 0
2403 * next trial first control block must be current control block */
2404 channelEntry->headCtrlBlk = currentCtrlBlk;
2405
2406 /* Deliver all the reaped RX frames to upper layers */
2407 i = 0;
Leo Changd6de1c22013-03-21 15:42:41 -07002408 while(i < frameCount)
2409 {
Jeff Johnsone7245742012-09-05 17:12:55 -07002410 dxeCtxt->rxReadyCB(dxeCtxt->clientCtxt, rx_reaped_buf[i], channelEntry->channelType);
2411 i++;
2412 }
2413
2414 return frameCount;
2415}
2416
2417/*==========================================================================
Jeff Johnson295189b2012-06-20 16:38:30 -07002418 @ Function Name
2419 dxeRXFrameReady
2420
2421 @ Description
2422 Pop frame from descriptor and route frame to upper transport layer
2423 Assign new platform packet buffer into used descriptor
2424 Actual frame pop and resource realloc
2425
2426 @ Parameters
2427 WLANDXE_CtrlBlkType *dxeCtrlBlk,
2428 DXE host driver main control block
2429 WLANDXE_ChannelCBType *channelEntry
2430 Channel specific control block
2431
2432 @ Return
2433 wpt_status
2434
2435===========================================================================*/
2436static wpt_status dxeRXFrameReady
2437(
2438 WLANDXE_CtrlBlkType *dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002439 WLANDXE_ChannelCBType *channelEntry,
2440 wpt_uint32 chStat
Jeff Johnson295189b2012-06-20 16:38:30 -07002441)
2442{
2443 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
2444 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
2445 WLANDXE_DescType *currentDesc = NULL;
2446 wpt_uint32 descCtrl;
Jeff Johnsone7245742012-09-05 17:12:55 -07002447 wpt_int32 frameCount = 0;
2448
2449 wpt_uint32 descLoop;
2450 wpt_uint32 invalidatedFound = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07002451
2452 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002453 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002454
2455 /* Sanity Check */
2456 if((NULL == dxeCtxt) || (NULL == channelEntry))
2457 {
2458 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2459 "dxeRXFrameReady Channel Entry is not valid");
2460 return eWLAN_PAL_STATUS_E_INVAL;
2461 }
2462
Jeff Johnsone7245742012-09-05 17:12:55 -07002463 frameCount = dxeRXFrameRouteUpperLayer(dxeCtxt, channelEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -07002464
Jeff Johnsone7245742012-09-05 17:12:55 -07002465 if(0 > frameCount)
Leo Changd6de1c22013-03-21 15:42:41 -07002466 {
2467 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Jeff Johnsone7245742012-09-05 17:12:55 -07002468 "dxeRXFrameReady RX frame route fail");
Leo Changd6de1c22013-03-21 15:42:41 -07002469 return eWLAN_PAL_STATUS_E_INVAL;
2470 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002471
Leo Changd6de1c22013-03-21 15:42:41 -07002472 if((0 == frameCount) &&
Jeff Johnsone7245742012-09-05 17:12:55 -07002473 ((WLANDXE_POWER_STATE_BMPS == dxeCtxt->hostPowerState) ||
2474 (WLANDXE_POWER_STATE_FULL == dxeCtxt->hostPowerState)))
2475 {
Leo Changd6de1c22013-03-21 15:42:41 -07002476 /* None of the frame handled and CH is not enabled
2477 * RX CH wrap around happen and No RX free frame
2478 * RX side should wait till new free frame available in the pool
2479 * Do not try reload driver at here*/
2480 if(!(chStat & WLANDXE_CH_CTRL_EN_MASK))
2481 {
Leo Changbbf86b72013-06-19 16:13:00 -07002482 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Leo Changd6de1c22013-03-21 15:42:41 -07002483 "dxeRXFrameReady %s RING Wrapped, RX Free Low 0x%x",
2484 channelType[channelEntry->channelType], chStat);
Leo Chang3714c922013-07-10 20:33:30 -07002485 /* This is not empty interrupt case
2486 * If handle this as empty interrupt, false SSR might be issued
2487 * Frame count '1' is dummy frame count to avoid SSR */
2488 channelEntry->numFragmentCurrentChain = 1;
Leo Changd6de1c22013-03-21 15:42:41 -07002489 return eWLAN_PAL_STATUS_SUCCESS;
2490 }
2491
Jeff Johnsone7245742012-09-05 17:12:55 -07002492 currentCtrlBlk = channelEntry->headCtrlBlk;
Jeff Johnson295189b2012-06-20 16:38:30 -07002493 currentDesc = currentCtrlBlk->linkedDesc;
2494 descCtrl = currentDesc->descCtrl.ctrl;
Jeff Johnsone7245742012-09-05 17:12:55 -07002495
2496 if(WLANDXE_POWER_STATE_BMPS != dxeCtxt->hostPowerState)
2497 {
2498 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
2499 "RX ISR called but no frame handled PWS %d, channel %s",
2500 (int)dxeCtxt->hostPowerState,
2501 channelType[channelEntry->channelType]);
2502 }
2503
2504 /* Current interupt empty and previous interrupt also empty
2505 * detected successive empty interrupt
2506 * or first interrupt empty, this should not happen */
2507 if(0 == channelEntry->numFragmentCurrentChain)
2508 {
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07002509 dxeChannelMonitor("RX Ready", channelEntry, NULL);
2510 dxeDescriptorDump(channelEntry, channelEntry->headCtrlBlk->linkedDesc, 0);
2511 dxeChannelRegisterDump(channelEntry, "RX successive empty interrupt", NULL);
2512 dxeChannelAllDescDump(channelEntry, channelEntry->channelType, NULL);
Jeff Johnsone7245742012-09-05 17:12:55 -07002513 /* Abnormal interrupt detected, try to find not validated descriptor */
2514 for(descLoop = 0; descLoop < channelEntry->numDesc; descLoop++)
2515 {
2516 if(!(WLANDXE_U32_SWAP_ENDIAN(descCtrl) & WLANDXE_DESC_CTRL_VALID))
2517 {
Leo Chang416afe02013-07-01 13:58:13 -07002518 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Jeff Johnsone7245742012-09-05 17:12:55 -07002519 "Found Invalidated Descriptor %d", (int)descLoop);
2520 if(eWLAN_PAL_STATUS_SUCCESS == wpalIsPacketLocked(currentCtrlBlk->xfrFrame))
2521 {
Leo Chang416afe02013-07-01 13:58:13 -07002522 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Jeff Johnsone7245742012-09-05 17:12:55 -07002523 "Packet locked, Resync Host and HW");
2524 channelEntry->headCtrlBlk = currentCtrlBlk;
2525 invalidatedFound = 1;
2526 break;
2527 }
2528 else
2529 {
Leo Chang416afe02013-07-01 13:58:13 -07002530 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Jeff Johnsone7245742012-09-05 17:12:55 -07002531 "Packet Not Locked, cannot transfer frame");
2532 }
2533 }
2534 currentCtrlBlk = (WLANDXE_DescCtrlBlkType *)currentCtrlBlk->nextCtrlBlk;
2535 currentDesc = currentCtrlBlk->linkedDesc;
2536 descCtrl = currentDesc->descCtrl.ctrl;
2537 }
2538
Jeff Johnson32d95a32012-09-10 13:15:23 -07002539 /* Invalidated descriptor found, and that is not head descriptor
2540 * This means HW/SW descriptor miss match happen, and we may recover with just resync
2541 * Try re-sync here */
2542 if((invalidatedFound) && (0 != descLoop))
Jeff Johnsone7245742012-09-05 17:12:55 -07002543 {
2544 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2545 "Found New Sync location with HW, handle frames from there");
2546 frameCount = dxeRXFrameRouteUpperLayer(dxeCtxt, channelEntry);
2547 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2548 "re-sync routed %d frames to upper layer", (int)frameCount);
Madan Mohan Koyyalamudi0c325532012-09-24 13:24:42 -07002549 channelEntry->numFragmentCurrentChain = frameCount;
Jeff Johnsone7245742012-09-05 17:12:55 -07002550 }
Jeff Johnson32d95a32012-09-10 13:15:23 -07002551 /* Successive Empty interrupt
2552 * But this case, first descriptor also invalidated, then it means head descriptor
2553 * is linked with already handled RX frame, then could not unlock RX frame
2554 * This is just Out of RX buffer pool, not need to anything here */
2555 else if((invalidatedFound) && (0 == descLoop))
2556 {
2557 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2558 "Out of RX Low resource, and INT came in, do nothing till get RX resource");
2559 }
2560 /* Critical error, reload driver */
Jeff Johnsone7245742012-09-05 17:12:55 -07002561 else
2562 {
2563 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2564 "Could not found invalidated descriptor");
2565 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2566 "RX successive empty interrupt, Could not find invalidated DESC reload driver");
2567 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
2568 wpalWlanReload();
Mihir Shetefdc9f532014-01-09 15:03:02 +05302569 dxeStartSSRTimer(dxeCtxt);
Jeff Johnsone7245742012-09-05 17:12:55 -07002570 }
2571 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002572 }
Madan Mohan Koyyalamudi6646aad2012-09-24 14:10:39 -07002573 channelEntry->numFragmentCurrentChain = frameCount;
Jeff Johnson295189b2012-06-20 16:38:30 -07002574 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002575 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002576 return status;
2577}
2578
2579/*==========================================================================
2580 @ Function Name
2581 dxeNotifySmsm
2582
2583 @ Description: Notify SMSM to start DXE engine and/or condition of Tx ring
2584 buffer
2585
2586 @ Parameters
2587
2588 @ Return
2589 wpt_status
2590
2591===========================================================================*/
2592static wpt_status dxeNotifySmsm
2593(
2594 wpt_boolean kickDxe,
2595 wpt_boolean ringEmpty
2596)
2597{
2598 wpt_uint32 clrSt = 0;
2599 wpt_uint32 setSt = 0;
2600
2601 if(kickDxe)
2602 {
2603 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, "Kick off DXE");
2604
2605 if(tempDxeCtrlBlk->lastKickOffDxe == 0)
2606 {
2607 setSt |= WPAL_SMSM_WLAN_TX_ENABLE;
2608 tempDxeCtrlBlk->lastKickOffDxe = 1;
2609 }
2610 else if(tempDxeCtrlBlk->lastKickOffDxe == 1)
2611 {
2612 clrSt |= WPAL_SMSM_WLAN_TX_ENABLE;
2613 tempDxeCtrlBlk->lastKickOffDxe = 0;
2614 }
2615 else
2616 {
2617 HDXE_ASSERT(0);
2618 }
2619 }
2620 else
2621 {
2622 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, "no need to kick off DXE");
2623 }
2624
2625 if(ringEmpty)
2626 {
2627 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, "SMSM Tx Ring Empty");
2628 clrSt |= WPAL_SMSM_WLAN_TX_RINGS_EMPTY;
2629 }
2630 else
2631 {
2632 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, "SMSM Tx Ring Not Empty");
2633 setSt |= WPAL_SMSM_WLAN_TX_RINGS_EMPTY;
2634 }
2635
2636 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH, "C%x S%x", clrSt, setSt);
2637
2638 wpalNotifySmsm(clrSt, setSt);
2639
2640 return eWLAN_PAL_STATUS_SUCCESS;
2641}
2642
2643/*==========================================================================
2644 @ Function Name
2645 dxePsComplete
2646
2647 @ Description: Utility function to check the resv desc to deside if we can
2648 get into Power Save mode now
2649
2650 @ Parameters
2651
2652 @ Return
2653 None
2654
2655===========================================================================*/
2656static void dxePsComplete(WLANDXE_CtrlBlkType *dxeCtxt, wpt_boolean intr_based)
2657{
2658 if( dxeCtxt->hostPowerState == WLANDXE_POWER_STATE_FULL )
2659 {
2660 return;
2661 }
2662
2663 //if both HIGH & LOW Tx channels don't have anything on resv desc,all Tx pkts
2664 //must have been consumed by RIVA, OK to get into BMPS
2665 if((0 == dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc) &&
2666 (0 == dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc))
2667 {
2668 tempDxeCtrlBlk->ringNotEmpty = eWLAN_PAL_FALSE;
2669 //if host is in BMPS & no pkt to Tx, RIVA can go to power save
2670 if(WLANDXE_POWER_STATE_BMPS == dxeCtxt->hostPowerState)
2671 {
2672 dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN;
2673 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
2674 }
2675 }
2676 else //still more pkts to be served by RIVA
2677 {
2678 tempDxeCtrlBlk->ringNotEmpty = eWLAN_PAL_TRUE;
2679
2680 switch(dxeCtxt->rivaPowerState)
2681 {
2682 case WLANDXE_RIVA_POWER_STATE_ACTIVE:
2683 //NOP
2684 break;
2685 case WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN:
2686 if(intr_based)
2687 {
2688 dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_ACTIVE;
2689 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
2690 }
2691 break;
2692 default:
2693 //assert
2694 break;
2695 }
2696 }
2697}
2698
2699/*==========================================================================
2700 @ Function Name
2701 dxeRXEventHandler
2702
2703 @ Description
2704 Handle serailized RX frame ready event
2705 First disable interrupt then pick up frame from pre allocated buffer
2706 Since frame handle is doen, clear interrupt bit to ready next interrupt
2707 Finally re enable interrupt
2708
2709 @ Parameters
2710 wpt_msg *rxReadyMsg
2711 RX frame ready MSG pointer
2712 include DXE control context
2713
2714 @ Return
2715 NONE
2716
2717===========================================================================*/
2718void dxeRXEventHandler
2719(
2720 wpt_msg *rxReadyMsg
2721)
2722{
2723 wpt_msg *msgContent = (wpt_msg *)rxReadyMsg;
2724 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
2725 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
2726 wpt_uint32 intSrc = 0;
2727 WLANDXE_ChannelCBType *channelCb = NULL;
Jeff Johnsone7245742012-09-05 17:12:55 -07002728 wpt_uint32 chHighStat = 0;
2729 wpt_uint32 chLowStat = 0;
Leo Chang094ece82013-04-23 17:57:41 -07002730 wpt_uint32 regValue;
Jeff Johnson295189b2012-06-20 16:38:30 -07002731
Jeff Johnsone7245742012-09-05 17:12:55 -07002732 dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07002733
Jeff Johnsone7245742012-09-05 17:12:55 -07002734 if(eWLAN_PAL_TRUE == dxeCtxt->driverReloadInProcessing)
Jeff Johnson295189b2012-06-20 16:38:30 -07002735 {
2736 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Jeff Johnsone7245742012-09-05 17:12:55 -07002737 "RX Ready WLAN Driver re-loading in progress");
Jeff Johnson32d95a32012-09-10 13:15:23 -07002738 return;
Jeff Johnson295189b2012-06-20 16:38:30 -07002739 }
2740
Jeff Johnsone7245742012-09-05 17:12:55 -07002741 /* Now try to refill the ring with empty Rx buffers to keep DXE busy */
2742 dxeRXFrameRefillRing(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI]);
2743 dxeRXFrameRefillRing(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI]);
2744
Jeff Johnson295189b2012-06-20 16:38:30 -07002745 dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
2746
2747 if((!dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].extraConfig.chEnabled) ||
2748 (!dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].extraConfig.chEnabled))
2749 {
2750 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2751 "DXE already stopped in RX event handler. Just return");
2752 return;
2753 }
2754
2755 if((WLANDXE_POWER_STATE_IMPS == dxeCtxt->hostPowerState) ||
2756 (WLANDXE_POWER_STATE_DOWN == dxeCtxt->hostPowerState))
2757 {
2758 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
2759 "%s Riva is in %d, Just Pull frames without any register touch ",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002760 __func__, dxeCtxt->hostPowerState);
Jeff Johnson295189b2012-06-20 16:38:30 -07002761
2762 /* Not to touch any register, just pull frame directly from chain ring
2763 * First high priority */
2764 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI];
2765 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002766 channelCb,
2767 chHighStat);
Jeff Johnson295189b2012-06-20 16:38:30 -07002768 if(eWLAN_PAL_STATUS_SUCCESS != status)
2769 {
2770 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2771 "dxeRXEventHandler Pull from RX high channel fail");
2772 }
2773
2774 /* Second low priority */
2775 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI];
2776 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002777 channelCb,
2778 chLowStat);
Jeff Johnson295189b2012-06-20 16:38:30 -07002779 if(eWLAN_PAL_STATUS_SUCCESS != status)
2780 {
2781 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2782 "dxeRXEventHandler Pull from RX low channel fail");
2783 }
2784
2785 /* Interrupt will not enabled at here, it will be enabled at PS mode change */
2786 tempDxeCtrlBlk->rxIntDisabledByIMPS = eWLAN_PAL_TRUE;
2787
2788 return;
2789 }
2790
2791 /* Disable device interrupt */
2792 /* Read whole interrupt mask register and exclusive only this channel int */
2793 status = wpalReadRegister(WLANDXE_INT_SRC_RAW_ADDRESS,
2794 &intSrc);
2795 if(eWLAN_PAL_STATUS_SUCCESS != status)
2796 {
2797 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2798 "dxeRXEventHandler Read INT_SRC register fail");
2799 return;
2800 }
2801 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED,
2802 "RX Event Handler INT Source 0x%x", intSrc);
2803
2804#ifndef WLANDXE_TEST_CHANNEL_ENABLE
2805 /* Test High Priority Channel interrupt is enabled or not */
2806 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI];
2807 if(intSrc & (1 << channelCb->assignedDMAChannel))
2808 {
2809 status = dxeChannelCleanInt(channelCb, &chHighStat);
2810 if(eWLAN_PAL_STATUS_SUCCESS != status)
2811 {
2812 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2813 "dxeRXEventHandler INT Clean up fail");
2814 return;
2815 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002816 if(WLANDXE_CH_STAT_INT_ERR_MASK & chHighStat)
2817 {
2818 /* Error Happen during transaction, Handle it */
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08002819 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
2820 "%11s : 0x%x Error Reported, Reload Driver",
2821 channelType[channelCb->channelType], chHighStat);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05302822
2823 dxeErrChannelDebug(channelCb);
2824
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08002825 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
2826 wpalWlanReload();
Mihir Shetefdc9f532014-01-09 15:03:02 +05302827 dxeStartSSRTimer(dxeCtxt);
Jeff Johnson295189b2012-06-20 16:38:30 -07002828 }
Jeff Johnson32d95a32012-09-10 13:15:23 -07002829 else if((WLANDXE_CH_STAT_INT_DONE_MASK & chHighStat) ||
2830 (WLANDXE_CH_STAT_INT_ED_MASK & chHighStat))
Jeff Johnson295189b2012-06-20 16:38:30 -07002831 {
2832 /* Handle RX Ready for high priority channel */
2833 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002834 channelCb,
2835 chHighStat);
Jeff Johnson295189b2012-06-20 16:38:30 -07002836 }
2837 else if(WLANDXE_CH_STAT_MASKED_MASK & chHighStat)
2838 {
2839 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002840 channelCb,
2841 chHighStat);
Jeff Johnson295189b2012-06-20 16:38:30 -07002842 }
2843 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
2844 "RX HIGH CH EVNT STAT 0x%x, %d frames handled", chHighStat, channelCb->numFragmentCurrentChain);
Jeff Johnsone7245742012-09-05 17:12:55 -07002845 /* Update the Rx DONE histogram */
2846 channelCb->rxDoneHistogram = (channelCb->rxDoneHistogram << 1);
2847 if(WLANDXE_CH_STAT_INT_DONE_MASK & chHighStat)
2848 {
2849 channelCb->rxDoneHistogram |= 1;
2850 }
2851 else
2852 {
2853 channelCb->rxDoneHistogram &= ~1;
2854 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002855 }
2856#else
2857 /* Test H2H Test interrupt is enabled or not */
2858 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_H2H_TEST_RX];
2859 if(intSrc & (1 << channelCb->assignedDMAChannel))
2860 {
2861 status = dxeChannelCleanInt(channelCb, &chStat);
2862 if(eWLAN_PAL_STATUS_SUCCESS != status)
2863 {
2864 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2865 "dxeRXEventHandler INT Clean up fail");
2866 return;
2867 }
2868
2869 if(WLANDXE_CH_STAT_INT_ERR_MASK & chStat)
2870 {
2871 /* Error Happen during transaction, Handle it */
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08002872 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
2873 "%11s : 0x%x Error Reported, Reload Driver",
2874 channelType[channelCb->channelType], chStat);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05302875
2876 dxeErrChannelDebug(channelCb);
2877
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08002878 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
2879 wpalWlanReload();
Mihir Shetefdc9f532014-01-09 15:03:02 +05302880 dxeStartSSRTimer(dxeCtxt);
Jeff Johnson295189b2012-06-20 16:38:30 -07002881 }
2882 else if(WLANDXE_CH_STAT_INT_ED_MASK & chStat)
2883 {
2884 /* Handle RX Ready for high priority channel */
2885 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002886 channelCb,
2887 chStat);
Jeff Johnson295189b2012-06-20 16:38:30 -07002888 }
2889 /* Update the Rx DONE histogram */
2890 channelCb->rxDoneHistogram = (channelCb->rxDoneHistogram << 1);
2891 if(WLANDXE_CH_STAT_INT_DONE_MASK & chStat)
2892 {
2893 channelCb->rxDoneHistogram |= 1;
2894 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
2895 "DXE Channel Number %d, Rx DONE Histogram 0x%016llx",
2896 channelCb->assignedDMAChannel, channelCb->rxDoneHistogram);
2897 }
2898 else
2899 {
2900 channelCb->rxDoneHistogram &= ~1;
2901 }
2902 }
2903#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
2904
2905 /* Test Low Priority Channel interrupt is enabled or not */
Jeff Johnsone7245742012-09-05 17:12:55 -07002906 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI];
Jeff Johnson295189b2012-06-20 16:38:30 -07002907 if(intSrc & (1 << channelCb->assignedDMAChannel))
2908 {
2909 status = dxeChannelCleanInt(channelCb, &chLowStat);
2910 if(eWLAN_PAL_STATUS_SUCCESS != status)
2911 {
2912 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2913 "dxeRXEventHandler INT Clean up fail");
2914 return;
2915 }
2916
2917 if(WLANDXE_CH_STAT_INT_ERR_MASK & chLowStat)
2918 {
2919 /* Error Happen during transaction, Handle it */
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08002920 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
2921 "%11s : 0x%x Error Reported, Reload Driver",
2922 channelType[channelCb->channelType], chLowStat);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05302923
2924 dxeErrChannelDebug(channelCb);
2925
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08002926 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
2927 wpalWlanReload();
Mihir Shetefdc9f532014-01-09 15:03:02 +05302928 dxeStartSSRTimer(dxeCtxt);
Jeff Johnson295189b2012-06-20 16:38:30 -07002929 }
2930 else if(WLANDXE_CH_STAT_INT_ED_MASK & chLowStat)
2931 {
2932 /* Handle RX Ready for low priority channel */
2933 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002934 channelCb,
2935 chLowStat);
Jeff Johnsone7245742012-09-05 17:12:55 -07002936 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002937
2938 /* Update the Rx DONE histogram */
2939 channelCb->rxDoneHistogram = (channelCb->rxDoneHistogram << 1);
2940 if(WLANDXE_CH_STAT_INT_DONE_MASK & chLowStat)
2941 {
2942 channelCb->rxDoneHistogram |= 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07002943 }
2944 else
2945 {
2946 channelCb->rxDoneHistogram &= ~1;
2947 }
2948 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
2949 "RX LOW CH EVNT STAT 0x%x, %d frames handled", chLowStat, channelCb->numFragmentCurrentChain);
2950 }
2951 if(eWLAN_PAL_STATUS_SUCCESS != status)
2952 {
2953 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2954 "dxeRXEventHandler Handle Frame Ready Fail");
2955 return;
2956 }
2957
Jeff Johnson295189b2012-06-20 16:38:30 -07002958 /* Prepare Control Register EN Channel */
2959 if(!(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].extraConfig.chan_mask & WLANDXE_CH_CTRL_EN_MASK))
2960 {
2961 HDXE_ASSERT(0);
2962 }
Leo Chang094ece82013-04-23 17:57:41 -07002963 wpalWriteRegister(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].channelRegister.chDXECtrlRegAddr,
2964 dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].extraConfig.chan_mask);
Jeff Johnson295189b2012-06-20 16:38:30 -07002965
2966 /* Prepare Control Register EN Channel */
2967 if(!(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].extraConfig.chan_mask & WLANDXE_CH_CTRL_EN_MASK))
2968 {
2969 HDXE_ASSERT(0);
2970 }
Leo Chang094ece82013-04-23 17:57:41 -07002971
2972 wpalWriteRegister(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].channelRegister.chDXECtrlRegAddr,
2973 dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].extraConfig.chan_mask);
2974
2975 /* Clear Interrupt handle processing bit
2976 * RIVA may power down */
2977 wpalReadRegister(WLANDXE_INT_MASK_REG_ADDRESS, &regValue);
2978 regValue &= WLANDXE_RX_INTERRUPT_PRO_UNMASK;
2979 wpalWriteRegister(WLANDXE_INT_MASK_REG_ADDRESS, regValue);
Jeff Johnson295189b2012-06-20 16:38:30 -07002980
Leo Chang416afe02013-07-01 13:58:13 -07002981 /* Enable system level ISR */
2982 /* Enable RX ready Interrupt at here */
2983 status = wpalEnableInterrupt(DXE_INTERRUPT_RX_READY);
2984 if(eWLAN_PAL_STATUS_SUCCESS != status)
2985 {
2986 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2987 "dxeRXEventHandler Enable RX Ready interrupt fail");
2988 return;
2989 }
2990
Jeff Johnson295189b2012-06-20 16:38:30 -07002991 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002992 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002993 return;
2994}
2995
2996/*==========================================================================
2997 @ Function Name
2998 dxeRXPacketAvailableEventHandler
2999
3000 @ Description
3001 Handle serialized RX Packet Available event when the corresponding callback
3002 is invoked by WPAL.
3003 Try to fill up any completed DXE descriptors with available Rx packet buffer
3004 pointers.
3005
3006 @ Parameters
3007 wpt_msg *rxPktAvailMsg
3008 RX frame ready MSG pointer
3009 include DXE control context
3010
3011 @ Return
3012 NONE
3013
3014===========================================================================*/
3015void dxeRXPacketAvailableEventHandler
3016(
3017 wpt_msg *rxPktAvailMsg
3018)
3019{
3020 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
3021 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
3022 WLANDXE_ChannelCBType *channelCb = NULL;
3023
3024 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003025 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003026
3027 /* Sanity Check */
3028 if(NULL == rxPktAvailMsg)
3029 {
3030 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3031 "dxeRXPacketAvailableEventHandler Context is not valid");
3032 return;
3033 }
3034
3035 dxeCtxt = (WLANDXE_CtrlBlkType *)(rxPktAvailMsg->pContext);
Leo Chang72cdfd32013-10-17 20:36:30 -07003036 /* Available resource allocated
3037 * Stop timer not needed */
3038 if(VOS_TIMER_STATE_RUNNING ==
3039 wpalTimerGetCurStatus(&dxeCtxt->rxResourceAvailableTimer))
3040 {
3041 wpalTimerStop(&dxeCtxt->rxResourceAvailableTimer);
3042 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003043
3044 do
3045 {
3046 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
3047 "dxeRXPacketAvailableEventHandler, start refilling ring");
3048
3049 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI];
3050 status = dxeRXFrameRefillRing(dxeCtxt,channelCb);
3051
3052 // Wait for another callback to indicate when Rx resources are available
3053 // again.
3054 if(eWLAN_PAL_STATUS_SUCCESS != status)
3055 {
3056 break;
3057 }
3058
3059 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI];
3060 status = dxeRXFrameRefillRing(dxeCtxt,channelCb);
3061 if(eWLAN_PAL_STATUS_SUCCESS != status)
3062 {
3063 break;
3064 }
3065 } while(0);
3066
3067 if((WLANDXE_POWER_STATE_IMPS == dxeCtxt->hostPowerState) ||
3068 (WLANDXE_POWER_STATE_DOWN == dxeCtxt->hostPowerState))
3069 {
3070 /* Interrupt will not enabled at here, it will be enabled at PS mode change */
3071 tempDxeCtrlBlk->rxIntDisabledByIMPS = eWLAN_PAL_TRUE;
3072 }
3073}
3074
3075/*==========================================================================
3076 @ Function Name
3077 dxeRXISR
3078
3079 @ Description
3080 RX frame ready interrupt service routine
3081 interrupt entry function, this function called based on ISR context
3082 Must be serialized
3083
3084 @ Parameters
3085 void *hostCtxt
3086 DXE host driver control context,
3087 pre registerd during interrupt registration
3088
3089 @ Return
3090 NONE
3091
3092===========================================================================*/
3093static void dxeRXISR
3094(
3095 void *hostCtxt
3096)
3097{
3098 WLANDXE_CtrlBlkType *dxeCtxt = (WLANDXE_CtrlBlkType *)hostCtxt;
3099 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003100 wpt_uint32 regValue;
Jeff Johnson295189b2012-06-20 16:38:30 -07003101
3102#ifdef FEATURE_R33D
3103 status = wpalReadRegister(WLANDXE_INT_SRC_RAW_ADDRESS,
3104 &regValue);
3105 if(eWLAN_PAL_STATUS_SUCCESS != status)
3106 {
3107 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3108 "dxeTXCompISR Read INT_SRC_RAW fail");
3109 return;
3110 }
3111 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
3112 "INT_SRC_RAW 0x%x", regValue);
3113 if(0 == regValue)
3114 {
3115 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
3116 "This is not DXE Interrupt, Reject it 0x%x", regValue);
3117 return;
3118 }
3119#endif /* FEATURE_R33D */
3120
Leo Chang094ece82013-04-23 17:57:41 -07003121 /* Set Interrupt processing bit
3122 * During this bit set, WLAN HW may not power collapse */
3123 wpalReadRegister(WLANDXE_INT_MASK_REG_ADDRESS, &regValue);
3124 regValue |= WLANPAL_RX_INTERRUPT_PRO_MASK;
3125 wpalWriteRegister(WLANDXE_INT_MASK_REG_ADDRESS, regValue);
3126
Jeff Johnson295189b2012-06-20 16:38:30 -07003127 /* Disable interrupt at here
3128 * Disable RX Ready system level Interrupt at here
3129 * Otherwise infinite loop might happen */
3130 status = wpalDisableInterrupt(DXE_INTERRUPT_RX_READY);
3131 if(eWLAN_PAL_STATUS_SUCCESS != status)
3132 {
3133 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3134 "dxeRXFrameReadyISR Disable RX ready interrupt fail");
3135 return;
3136 }
3137
3138 /* Serialize RX Ready interrupt upon RX thread */
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08003139 if(NULL == dxeCtxt->rxIsrMsg)
3140 {
3141 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3142 "dxeRXFrameReadyISR NULL message");
3143 HDXE_ASSERT(0);
3144 return;
3145 }
3146
Jeff Johnson295189b2012-06-20 16:38:30 -07003147 status = wpalPostRxMsg(WDI_GET_PAL_CTX(),
3148 dxeCtxt->rxIsrMsg);
3149 if(eWLAN_PAL_STATUS_SUCCESS != status)
3150 {
Jeff Johnson295189b2012-06-20 16:38:30 -07003151 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
3152 "dxeRXFrameReadyISR interrupt serialize fail");
3153 }
3154
Jeff Johnson295189b2012-06-20 16:38:30 -07003155 return;
3156}
3157
3158/*==========================================================================
3159 @ Function Name
3160 dxeTXPushFrame
3161
3162 @ Description
3163 Push TX frame into DXE descriptor and DXE register
3164 Send notification to DXE register that TX frame is ready to transfer
3165
3166 @ Parameters
3167 WLANDXE_ChannelCBType *channelEntry
3168 Channel specific control block
3169 wpt_packet *palPacket
3170 Packet pointer ready to transfer
3171
3172 @ Return
3173 PAL_STATUS_T
3174===========================================================================*/
3175static wpt_status dxeTXPushFrame
3176(
3177 WLANDXE_ChannelCBType *channelEntry,
3178 wpt_packet *palPacket
3179)
3180{
3181 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
3182 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
3183 WLANDXE_DescType *currentDesc = NULL;
3184 WLANDXE_DescType *firstDesc = NULL;
3185 WLANDXE_DescType *LastDesc = NULL;
3186 void *sourcePhysicalAddress = NULL;
3187 wpt_uint32 xferSize = 0;
3188#ifdef FEATURE_R33D
3189 tx_frm_pcie_vector_t frameVector;
3190 wpt_uint32 Va;
3191 wpt_uint32 fragCount = 0;
3192#else
3193 wpt_iterator iterator;
3194#endif /* FEATURE_R33D */
Leo Changac1d3612013-07-01 15:15:51 -07003195 wpt_uint32 isEmpty = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003196
3197 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003198 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003199
Leo Changac1d3612013-07-01 15:15:51 -07003200 tempDxeCtrlBlk->smsmToggled = eWLAN_PAL_FALSE;
3201 if((0 == tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc) &&
3202 (0 == tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc))
Jeff Johnson295189b2012-06-20 16:38:30 -07003203 {
Leo Changac1d3612013-07-01 15:15:51 -07003204 isEmpty = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07003205 }
3206
3207 channelEntry->numFragmentCurrentChain = 0;
3208 currentCtrlBlk = channelEntry->headCtrlBlk;
3209
3210 /* Initialize interator, TX is fragmented */
3211#ifdef FEATURE_R33D
3212 memset(&frameVector, 0, sizeof(tx_frm_pcie_vector_t));
3213 status = wpalPrepareTxFrame(palPacket,
3214 &frameVector,
3215 &Va);
3216#else
3217 status = wpalLockPacketForTransfer(palPacket);
3218 if(eWLAN_PAL_STATUS_SUCCESS != status)
3219 {
3220 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3221 "dxeTXPushFrame unable to lock packet");
3222 return status;
3223 }
3224
3225 status = wpalIteratorInit(&iterator, palPacket);
3226#endif /* FEATURE_R33D */
3227 if(eWLAN_PAL_STATUS_SUCCESS != status)
3228 {
3229 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3230 "dxeTXPushFrame iterator init fail");
3231 return status;
3232 }
3233
3234 /* !!!! Revisit break condition !!!!!!! */
3235 while(1)
3236 {
3237 /* Get current descriptor pointer from current control block */
3238 currentDesc = currentCtrlBlk->linkedDesc;
3239 if(NULL == firstDesc)
3240 {
3241 firstDesc = currentCtrlBlk->linkedDesc;
3242 }
3243 /* All control block will have same palPacket Pointer
3244 * to make logic simpler */
3245 currentCtrlBlk->xfrFrame = palPacket;
3246
3247 /* Get next fragment physical address and fragment size
3248 * if this is the first trial, will get first physical address
3249 * if no more fragment, Descriptor src address will be set as NULL, OK??? */
3250#ifdef FEATURE_R33D
3251 if(fragCount == frameVector.num_frg)
3252 {
3253 break;
3254 }
3255 currentCtrlBlk->shadowBufferVa = frameVector.frg[0].va;
3256 sourcePhysicalAddress = (void *)frameVector.frg[fragCount].pa;
3257 xferSize = frameVector.frg[fragCount].size;
3258 fragCount++;
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08003259 if(0 == xferSize)
3260 {
3261 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3262 "dxeTXPushFrame invalid transfer size");
3263
3264 HDXE_ASSERT(0);
3265 return eWLAN_PAL_STATUS_E_FAILURE;
3266 }
3267 if(NULL == sourcePhysicalAddress)
3268 {
3269 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3270 "dxeTXPushFrame invalid sourcePhysicalAddress");
3271 HDXE_ASSERT(0);
3272 return eWLAN_PAL_STATUS_E_FAILURE;
3273 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003274#else
3275 status = wpalIteratorNext(&iterator,
3276 palPacket,
3277 &sourcePhysicalAddress,
3278 &xferSize);
3279 if((NULL == sourcePhysicalAddress) ||
3280 (0 == xferSize))
3281 {
3282 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
3283 "dxeTXPushFrame end of current frame");
3284 break;
3285 }
3286 if(eWLAN_PAL_STATUS_SUCCESS != status)
3287 {
3288 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3289 "dxeTXPushFrame Get next frame fail");
3290 return status;
3291 }
3292#endif /* FEATURE_R33D */
3293
3294 /* This is the LAST descriptor valid for this transaction */
3295 LastDesc = currentCtrlBlk->linkedDesc;
3296
3297 /* Program DXE descriptor */
3298 currentDesc->dxedesc.dxe_short_desc.srcMemAddrL =
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05303299 WLANDXE_U32_SWAP_ENDIAN((wpt_uint32)(uintptr_t)sourcePhysicalAddress);
Jeff Johnson295189b2012-06-20 16:38:30 -07003300
3301 /* Just normal data transfer from aCPU Flat Memory to BMU Q */
3302 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
3303 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
3304 {
3305 currentDesc->dxedesc.dxe_short_desc.dstMemAddrL =
3306 WLANDXE_U32_SWAP_ENDIAN(channelEntry->channelConfig.refWQ);
3307 }
3308 else
3309 {
3310 /* Test specific H2H transfer, destination address already set
3311 * Do Nothing */
3312 }
3313 currentDesc->xfrSize = WLANDXE_U32_SWAP_ENDIAN(xferSize);
3314
3315 /* Program channel control register */
3316 /* First frame not set VAL bit, why ??? */
3317 if(0 == channelEntry->numFragmentCurrentChain)
3318 {
3319 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write;
3320 }
3321 else
3322 {
3323 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write_valid;
3324 }
3325
3326 /* Update statistics */
3327 channelEntry->numFragmentCurrentChain++;
3328 channelEntry->numFreeDesc--;
3329 channelEntry->numRsvdDesc++;
3330
3331 /* Get next control block */
3332 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
3333 }
3334 channelEntry->numTotalFrame++;
3335 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
3336 "NUM TX FRAG %d, Total Frame %d",
3337 channelEntry->numFragmentCurrentChain, channelEntry->numTotalFrame);
3338
3339 /* Program Channel control register
3340 * Set as end of packet
3341 * Enable interrupt also for first code lock down
3342 * performace optimization, this will be revisited */
3343 if(NULL == LastDesc)
3344 {
3345 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3346 "dxeTXPushFrame NULL Last Descriptor, broken chain");
3347 return eWLAN_PAL_STATUS_E_FAULT;
3348 }
3349 LastDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write_eop_int;
3350 /* Now First one also Valid ????
3351 * this procedure will prevent over handle descriptor from previous
3352 * TX trigger */
3353 firstDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write_valid;
3354
3355 /* If in BMPS mode no need to notify the DXE Engine, notify SMSM instead */
3356 if(WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN == tempDxeCtrlBlk->rivaPowerState)
3357 {
3358 /* Update channel head as next avaliable linked slot */
3359 channelEntry->headCtrlBlk = currentCtrlBlk;
Leo Changac1d3612013-07-01 15:15:51 -07003360 if(isEmpty)
3361 {
3362 tempDxeCtrlBlk->ringNotEmpty = eWLAN_PAL_TRUE;
3363 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
3364 "SMSM_ret LO=%d HI=%d",
3365 tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc,
3366 tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc );
3367 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
3368 tempDxeCtrlBlk->smsmToggled = eWLAN_PAL_TRUE;
3369 }
Madan Mohan Koyyalamudi2edf6f62012-10-15 15:56:34 -07003370 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07003371 }
3372
3373 /* If DXE use external descriptor, registers are not needed to be programmed
3374 * Just after finish to program descriptor, tirigger to send */
3375 if(channelEntry->extraConfig.chan_mask & WLANDXE_CH_CTRL_EDEN_MASK)
3376 {
3377 /* Issue a dummy read from the DXE descriptor DDR location to
3378 ensure that any previously posted write to the descriptor
3379 completes. */
3380 if(channelEntry->extraConfig.cw_ctrl_write_valid != firstDesc->descCtrl.ctrl)
3381 {
3382 //HDXE_ASSERT(0);
3383 }
3384
3385 /* Everything is ready
3386 * Trigger to start DMA */
3387 status = wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr,
3388 channelEntry->extraConfig.chan_mask);
3389 if(eWLAN_PAL_STATUS_SUCCESS != status)
3390 {
3391 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3392 "dxeTXPushFrame Write Channel Ctrl Register fail");
3393 return status;
3394 }
3395
3396 /* Update channel head as next avaliable linked slot */
3397 channelEntry->headCtrlBlk = currentCtrlBlk;
3398
3399 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003400 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003401 return status;
3402 }
3403
3404 /* If DXE not use external descriptor, program each registers */
3405 /* Circular buffer handle not need to program DESC register???
3406 * GEN5 code not programed RING buffer case
3407 * REVISIT THIS !!!!!! */
3408 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
3409 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
3410 {
3411 /* Destination address, assigned Work Q */
3412 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrlRegAddr,
3413 channelEntry->channelConfig.refWQ);
3414 if(eWLAN_PAL_STATUS_SUCCESS != status)
3415 {
3416 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3417 "dxeTXPushFrame Program dest address register fail");
3418 return status;
3419 }
3420 /* If descriptor format is SHORT */
3421 if(channelEntry->channelConfig.useShortDescFmt)
3422 {
3423 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrhRegAddr,
3424 0);
3425 if(eWLAN_PAL_STATUS_SUCCESS != status)
3426 {
3427 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3428 "dxeTXPushFrame Program dest address register fail");
3429 return status;
3430 }
3431 }
3432 else
3433 {
3434 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3435 "dxeTXPushFrame LONG Descriptor Format!!!");
3436 }
3437 }
3438#ifdef WLANDXE_TEST_CHANNEL_ENABLE
3439 else if(WDTS_CHANNEL_H2H_TEST_TX == channelEntry->channelType)
3440 {
3441 /* Destination address, Physical memory address */
3442 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrlRegAddr,
3443 WLANDXE_U32_SWAP_ENDIAN(firstDesc->dxedesc.dxe_short_desc.dstMemAddrL));
3444 if(eWLAN_PAL_STATUS_SUCCESS != status)
3445 {
3446 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3447 "dxeTXPushFrame Program dest address register fail");
3448 return status;
3449 }
3450 /* If descriptor format is SHORT */
3451 if(channelEntry->channelConfig.useShortDescFmt)
3452 {
3453 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrhRegAddr,
3454 0);
3455 if(eWLAN_PAL_STATUS_SUCCESS != status)
3456 {
3457 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3458 "dxeTXPushFrame Program dest address register fail");
3459 return status;
3460 }
3461 }
3462 else
3463 {
3464 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3465 "dxeTXPushFrame LONG Descriptor Format!!!");
3466 }
3467 }
3468#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
3469
3470 /* Program Source address register
3471 * This address is already programmed into DXE Descriptor
3472 * But register also upadte */
3473 status = wpalWriteRegister(channelEntry->channelRegister.chDXESadrlRegAddr,
3474 WLANDXE_U32_SWAP_ENDIAN(firstDesc->dxedesc.dxe_short_desc.srcMemAddrL));
3475 if(eWLAN_PAL_STATUS_SUCCESS != status)
3476 {
3477 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3478 "dxeTXPushFrame Program src address register fail");
3479 return status;
3480 }
3481 /* If descriptor format is SHORT */
3482 if(channelEntry->channelConfig.useShortDescFmt)
3483 {
3484 status = wpalWriteRegister(channelEntry->channelRegister.chDXESadrhRegAddr,
3485 0);
3486 if(eWLAN_PAL_STATUS_SUCCESS != status)
3487 {
3488 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3489 "dxeTXPushFrame Program dest address register fail");
3490 return status;
3491 }
3492 }
3493 else
3494 {
3495 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3496 "dxeTXPushFrame LONG Descriptor Format!!!");
3497 }
3498
3499 /* Linked list Descriptor pointer */
3500 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
3501 channelEntry->headCtrlBlk->linkedDescPhyAddr);
3502 if(eWLAN_PAL_STATUS_SUCCESS != status)
3503 {
3504 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3505 "dxeTXPushFrame Write DESC Address register fail");
3506 return status;
3507 }
3508 /* If descriptor format is SHORT */
3509 if(channelEntry->channelConfig.useShortDescFmt)
3510 {
3511 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDeschRegAddr,
3512 0);
3513 if(eWLAN_PAL_STATUS_SUCCESS != status)
3514 {
3515 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3516 "dxeTXPushFrame Program dest address register fail");
3517 return status;
3518 }
3519 }
3520 else
3521 {
3522 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3523 "dxeTXPushFrame LONG Descriptor Format!!!");
3524 }
3525
3526 /* Transfer Size */
3527 xferSize = WLANDXE_U32_SWAP_ENDIAN(firstDesc->xfrSize);
3528 status = wpalWriteRegister(channelEntry->channelRegister.chDXESzRegAddr,
3529 xferSize);
3530 if(eWLAN_PAL_STATUS_SUCCESS != status)
3531 {
3532 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3533 "dxeTXPushFrame Write DESC Address register fail");
3534 return status;
3535 }
3536
3537 /* Everything is ready
3538 * Trigger to start DMA */
3539 status = wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr,
3540 channelEntry->extraConfig.chan_mask);
3541 if(eWLAN_PAL_STATUS_SUCCESS != status)
3542 {
3543 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3544 "dxeTXPushFrame Write Channel Ctrl Register fail");
3545 return status;
3546 }
3547
3548 /* Update channel head as next avaliable linked slot */
3549 channelEntry->headCtrlBlk = currentCtrlBlk;
3550
3551 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003552 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003553 return status;
3554}
3555
3556/*==========================================================================
3557 @ Function Name
3558 dxeTXCompFrame
3559
3560 @ Description
3561 TX Frame transfer complete event handler
3562
3563 @ Parameters
3564 WLANDXE_CtrlBlkType *dxeCtrlBlk,
3565 DXE host driver main control block
3566 WLANDXE_ChannelCBType *channelEntry
3567 Channel specific control block
3568
3569 @ Return
3570 PAL_STATUS_T
3571===========================================================================*/
3572static wpt_status dxeTXCompFrame
3573(
3574 WLANDXE_CtrlBlkType *hostCtxt,
3575 WLANDXE_ChannelCBType *channelEntry
3576)
3577{
3578 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
3579 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
3580 WLANDXE_DescType *currentDesc = NULL;
3581 wpt_uint32 descCtrlValue = 0;
3582 unsigned int *lowThreshold = NULL;
3583
3584 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003585 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003586
3587 /* Sanity */
3588 if((NULL == hostCtxt) || (NULL == channelEntry))
3589 {
3590 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3591 "dxeTXCompFrame Invalid ARG");
3592 return eWLAN_PAL_STATUS_E_INVAL;
3593 }
3594
3595 if(NULL == hostCtxt->txCompCB)
3596 {
3597 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3598 "dxeTXCompFrame TXCompCB is not registered");
Jeff Johnsone7245742012-09-05 17:12:55 -07003599 return eWLAN_PAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003600 }
3601
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08003602 status = wpalMutexAcquire(&channelEntry->dxeChannelLock);
3603 if(eWLAN_PAL_STATUS_SUCCESS != status)
3604 {
3605 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3606 "dxeTXCompFrame Mutex Acquire fail");
3607 return status;
3608 }
3609
Jeff Johnson295189b2012-06-20 16:38:30 -07003610 currentCtrlBlk = channelEntry->tailCtrlBlk;
3611 currentDesc = currentCtrlBlk->linkedDesc;
3612
3613 if( currentCtrlBlk == channelEntry->headCtrlBlk )
3614 {
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08003615 status = wpalMutexRelease(&channelEntry->dxeChannelLock);
3616 if(eWLAN_PAL_STATUS_SUCCESS != status)
3617 {
3618 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3619 "dxeTXCompFrame Mutex Release fail");
3620 return status;
3621 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003622 return eWLAN_PAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003623 }
3624
3625 /* */
3626 while(1)
3627 {
3628// HDXE_ASSERT(WLAN_PAL_IS_STATUS_SUCCESS(WLAN_RivaValidateDesc(currentDesc)));
3629 descCtrlValue = currentDesc->descCtrl.ctrl;
3630 if((descCtrlValue & WLANDXE_DESC_CTRL_VALID))
3631 {
3632 /* caught up with head, bail out */
3633 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED,
3634 "dxeTXCompFrame caught up with head - next DESC has VALID set");
3635 break;
3636 }
3637
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08003638 if(currentCtrlBlk->xfrFrame == NULL)
3639 {
3640 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3641 "Invalid transfer frame");
3642 HDXE_ASSERT(0);
3643 break;
3644 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003645 channelEntry->numFreeDesc++;
3646 channelEntry->numRsvdDesc--;
3647
3648 /* Send Frame TX Complete notification with frame start fragment location */
3649 if(WLANDXE_U32_SWAP_ENDIAN(descCtrlValue) & WLANDXE_DESC_CTRL_EOP)
3650 {
3651 hostCtxt->txCompletedFrames--;
3652#ifdef FEATURE_R33D
3653 wpalFreeTxFrame(currentCtrlBlk->shadowBufferVa);
3654#else
3655 status = wpalUnlockPacket(currentCtrlBlk->xfrFrame);
3656 if (eWLAN_PAL_STATUS_SUCCESS != status)
3657 {
3658 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3659 "dxeRXFrameReady unable to unlock packet");
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08003660 status = wpalMutexRelease(&channelEntry->dxeChannelLock);
3661 if(eWLAN_PAL_STATUS_SUCCESS != status)
3662 {
3663 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3664 "dxeTXCompFrame Mutex Release fail");
3665 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003666 return status;
3667 }
3668#endif /* FEATURE_R33D */
3669 hostCtxt->txCompCB(hostCtxt->clientCtxt,
3670 currentCtrlBlk->xfrFrame,
3671 eWLAN_PAL_STATUS_SUCCESS);
3672 channelEntry->numFragmentCurrentChain = 0;
3673 }
3674 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
3675 currentDesc = currentCtrlBlk->linkedDesc;
3676
3677 /* Break condition
3678 * Head control block is the control block must be programed for the next TX
3679 * so, head control block is not programmed control block yet
3680 * if loop encounte head control block, stop to complete
3681 * in theory, COMP CB must be called already ??? */
3682 if(currentCtrlBlk == channelEntry->headCtrlBlk)
3683 {
3684 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED,
3685 "dxeTXCompFrame caught up with head ptr");
3686 break;
3687 }
3688 /* VALID Bit check ???? */
3689 }
3690
3691 /* Tail and Head Control block must be same */
3692 channelEntry->tailCtrlBlk = currentCtrlBlk;
3693
3694 lowThreshold = channelEntry->channelType == WDTS_CHANNEL_TX_LOW_PRI?
3695 &(hostCtxt->txCompInt.txLowResourceThreshold_LoPriCh):
3696 &(hostCtxt->txCompInt.txLowResourceThreshold_HiPriCh);
3697
3698 /* If specific channel hit low resource condition send notification to upper layer */
3699 if((eWLAN_PAL_TRUE == channelEntry->hitLowResource) &&
3700 (channelEntry->numFreeDesc > *lowThreshold))
3701 {
3702 /* Change it back if we raised it for fetching a remaining packet from TL */
3703 if(WLANDXE_TX_LOW_RES_THRESHOLD > *lowThreshold)
3704 {
3705 *lowThreshold = WLANDXE_TX_LOW_RES_THRESHOLD;
3706 }
3707
3708 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
3709 "DXE TX %d channel recovered from low resource", channelEntry->channelType);
3710 hostCtxt->lowResourceCB(hostCtxt->clientCtxt,
3711 channelEntry->channelType,
3712 eWLAN_PAL_TRUE);
3713 channelEntry->hitLowResource = eWLAN_PAL_FALSE;
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -07003714 wpalTimerStop(&channelEntry->healthMonitorTimer);
Jeff Johnson295189b2012-06-20 16:38:30 -07003715 }
3716
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08003717 status = wpalMutexRelease(&channelEntry->dxeChannelLock);
3718 if(eWLAN_PAL_STATUS_SUCCESS != status)
3719 {
3720 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3721 "dxeTXCompFrame Mutex Release fail");
3722 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003723
3724 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003725 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003726 return status;
3727}
3728
3729/*==========================================================================
3730 @ Function Name
3731 dxeTXEventHandler
3732
3733 @ Description
3734 If DXE HW sends TX related interrupt, this event handler will be called
3735 Handle higher priority channel first
3736 Figureout why interrupt happen and call appropriate final even handler
3737 TX complete or error happen
3738
3739 @ Parameters
3740 void *msgPtr
3741 Even MSG
3742
3743 @ Return
3744 PAL_STATUS_T
3745===========================================================================*/
3746void dxeTXEventHandler
3747(
3748 wpt_msg *msgPtr
3749)
3750{
3751 wpt_msg *msgContent = (wpt_msg *)msgPtr;
3752 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
3753 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
3754 wpt_uint32 intSrc = 0;
3755 wpt_uint32 chStat = 0;
3756 WLANDXE_ChannelCBType *channelCb = NULL;
3757
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003758 wpt_uint8 bEnableISR = 0;
Madan Mohan Koyyalamudidfd6aa82012-10-18 20:18:43 -07003759 static wpt_uint8 successiveIntWithIMPS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003760
3761 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003762 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003763
3764 dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
Jeff Johnsone7245742012-09-05 17:12:55 -07003765 dxeCtxt->ucTxMsgCnt = 0;
3766
3767 if(eWLAN_PAL_TRUE == dxeCtxt->driverReloadInProcessing)
3768 {
3769 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3770 "wlan: TX COMP WLAN Driver re-loading in progress");
3771 return;
3772 }
3773
Jeff Johnson295189b2012-06-20 16:38:30 -07003774 /* Return from here if the RIVA is in IMPS, to avoid register access */
3775 if(WLANDXE_POWER_STATE_IMPS == dxeCtxt->hostPowerState)
3776 {
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003777 successiveIntWithIMPS++;
Jeff Johnsone7245742012-09-05 17:12:55 -07003778 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003779 "dxeTXEventHandler IMPS TX COMP INT successiveIntWithIMPS %d", successiveIntWithIMPS);
Jeff Johnsone7245742012-09-05 17:12:55 -07003780 status = dxeTXCompFrame(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI]);
3781 if(eWLAN_PAL_STATUS_SUCCESS != status)
3782 {
3783 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003784 "dxeTXEventHandler IMPS HC COMP interrupt fail");
Jeff Johnsone7245742012-09-05 17:12:55 -07003785 }
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07003786
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003787 status = dxeTXCompFrame(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI]);
3788 if(eWLAN_PAL_STATUS_SUCCESS != status)
3789 {
3790 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3791 "dxeTXEventHandler IMPS LC COMP interrupt fail");
3792 }
3793
3794 if(((dxeCtxt->txCompletedFrames) &&
3795 (eWLAN_PAL_FALSE == dxeCtxt->txIntEnable)) &&
3796 (successiveIntWithIMPS == 1))
Jeff Johnsone7245742012-09-05 17:12:55 -07003797 {
3798 dxeCtxt->txIntEnable = eWLAN_PAL_TRUE;
3799 wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE);
3800 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08003801 "TX COMP INT Enabled, remain TX frame count on ring %d",
3802 dxeCtxt->txCompletedFrames);
Jeff Johnsone7245742012-09-05 17:12:55 -07003803 /*Kicking the DXE after the TX Complete interrupt was enabled - to avoid
3804 the posibility of a race*/
3805 dxePsComplete(dxeCtxt, eWLAN_PAL_TRUE);
3806 }
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003807 else
3808 {
3809 dxeCtxt->txIntEnable = eWLAN_PAL_FALSE;
3810 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3811 "TX COMP INT NOT Enabled, RIVA still wake up? remain TX frame count on ring %d, successiveIntWithIMPS %d",
3812 dxeCtxt->txCompletedFrames, successiveIntWithIMPS);
3813 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003814 return;
3815 }
3816
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003817 successiveIntWithIMPS = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003818 if((!dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].extraConfig.chEnabled) ||
3819 (!dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].extraConfig.chEnabled))
3820 {
3821 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3822 "DXE already stopped in TX event handler. Just return");
3823 return;
3824 }
3825
Jeff Johnson295189b2012-06-20 16:38:30 -07003826 /* Disable device interrupt */
3827 /* Read whole interrupt mask register and exclusive only this channel int */
3828 status = wpalReadRegister(WLANDXE_INT_SRC_RAW_ADDRESS,
3829 &intSrc);
3830 if(eWLAN_PAL_STATUS_SUCCESS != status)
3831 {
3832 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3833 "dxeTXCompleteEventHandler Read INT_DONE_SRC register fail");
3834 return;
3835 }
3836 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED,
3837 "TX Event Handler INT Source 0x%x", intSrc);
3838
3839 /* Test High Priority Channel is the INT source or not */
3840 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI];
3841 if(intSrc & (1 << channelCb->assignedDMAChannel))
3842 {
3843 status = dxeChannelCleanInt(channelCb, &chStat);
3844 if(eWLAN_PAL_STATUS_SUCCESS != status)
3845 {
3846 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3847 "dxeTXEventHandler INT Clean up fail");
3848 return;
3849 }
3850
3851 if(WLANDXE_CH_STAT_INT_ERR_MASK & chStat)
3852 {
3853 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08003854 "%11s : 0x%x Error Reported, Reload Driver",
3855 channelType[channelCb->channelType], chStat);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05303856
3857 dxeErrChannelDebug(channelCb);
3858
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08003859 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
3860 wpalWlanReload();
Mihir Shetefdc9f532014-01-09 15:03:02 +05303861 dxeStartSSRTimer(dxeCtxt);
Jeff Johnson295189b2012-06-20 16:38:30 -07003862 }
3863 else if(WLANDXE_CH_STAT_INT_DONE_MASK & chStat)
3864 {
3865 /* Handle TX complete for high priority channel */
3866 status = dxeTXCompFrame(dxeCtxt,
3867 channelCb);
Jeff Johnsone7245742012-09-05 17:12:55 -07003868 bEnableISR = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07003869 }
3870 else if(WLANDXE_CH_STAT_INT_ED_MASK & chStat)
3871 {
3872 /* Handle TX complete for high priority channel */
3873 status = dxeTXCompFrame(dxeCtxt,
3874 channelCb);
Jeff Johnsone7245742012-09-05 17:12:55 -07003875 bEnableISR = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07003876 }
3877 else
3878 {
3879 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3880 "dxeTXEventHandler TX HI status=%x", chStat);
3881 }
3882
3883 if(WLANDXE_CH_STAT_MASKED_MASK & chStat)
3884 {
3885 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH,
3886 "dxeTXEventHandler TX HIGH Channel Masked Unmask it!!!!");
3887 }
3888
3889 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH,
3890 "TX HIGH STAT 0x%x RESRVD %d", chStat, channelCb->numRsvdDesc);
3891 }
3892
3893 /* Test Low Priority Channel interrupt is enabled or not */
3894 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI];
3895 if(intSrc & (1 << channelCb->assignedDMAChannel))
3896 {
3897 status = dxeChannelCleanInt(channelCb, &chStat);
3898 if(eWLAN_PAL_STATUS_SUCCESS != status)
3899 {
3900 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3901 "dxeTXEventHandler INT Clean up fail");
3902 return;
3903 }
3904
3905 if(WLANDXE_CH_STAT_INT_ERR_MASK & chStat)
3906 {
3907 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08003908 "%11s : 0x%x Error Reported, Reload Driver",
3909 channelType[channelCb->channelType], chStat);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05303910
3911 dxeErrChannelDebug(channelCb);
3912
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08003913 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
3914 wpalWlanReload();
Mihir Shetefdc9f532014-01-09 15:03:02 +05303915 dxeStartSSRTimer(dxeCtxt);
Jeff Johnson295189b2012-06-20 16:38:30 -07003916 }
3917 else if(WLANDXE_CH_STAT_INT_DONE_MASK & chStat)
3918 {
3919 /* Handle TX complete for low priority channel */
3920 status = dxeTXCompFrame(dxeCtxt,
3921 channelCb);
Jeff Johnsone7245742012-09-05 17:12:55 -07003922 bEnableISR = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07003923 }
3924 else if(WLANDXE_CH_STAT_INT_ED_MASK & chStat)
3925 {
3926 /* Handle TX complete for low priority channel */
3927 status = dxeTXCompFrame(dxeCtxt,
3928 channelCb);
Jeff Johnsone7245742012-09-05 17:12:55 -07003929 bEnableISR = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07003930 }
3931 else
3932 {
3933 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3934 "dxeTXEventHandler TX LO status=%x", chStat);
3935 }
3936
3937 if(WLANDXE_CH_STAT_MASKED_MASK & chStat)
3938 {
3939 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH,
3940 "dxeTXEventHandler TX Low Channel Masked Unmask it!!!!");
3941 }
3942 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
3943 "TX LOW STAT 0x%x RESRVD %d", chStat, channelCb->numRsvdDesc);
3944 }
3945
3946
3947#ifdef WLANDXE_TEST_CHANNEL_ENABLE
3948 /* Test H2H TX Channel interrupt is enabled or not */
3949 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_H2H_TEST_TX];
3950 if(intSrc & (1 << channelCb->assignedDMAChannel))
3951 {
3952 status = wpalReadRegister(channelCb->channelRegister.chDXEStatusRegAddr,
3953 &chStat);
3954 if(eWLAN_PAL_STATUS_SUCCESS != status)
3955 {
3956 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3957 "dxeChannelCleanInt Read CH STAT register fail");
3958 return;
3959 }
3960
3961 if(WLANDXE_CH_STAT_INT_ERR_MASK & chStat)
3962 {
3963 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08003964 "%11s : 0x%x Error Reported, Reload Driver",
3965 channelType[channelCb->channelType], chStat);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05303966
3967 dxeErrChannelDebug(channelCb);
3968
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08003969 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
3970 wpalWlanReload();
Mihir Shetefdc9f532014-01-09 15:03:02 +05303971 dxeStartSSRTimer(dxeCtxt);
Jeff Johnson295189b2012-06-20 16:38:30 -07003972 }
3973 else if(WLANDXE_CH_STAT_INT_DONE_MASK & chStat)
3974 {
3975 /* Handle TX complete for high priority channel */
3976 status = dxeTXCompFrame(dxeCtxt,
3977 channelCb);
3978 if(eWLAN_PAL_STATUS_SUCCESS != status)
3979 {
3980 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3981 "dxeTXEventHandler INT Clean up fail");
3982 return;
3983 }
3984 }
3985 else
3986 {
3987 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3988 "unexpected channel state %d", chStat);
3989 }
3990 }
3991#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
3992
3993 if((bEnableISR || (dxeCtxt->txCompletedFrames)) &&
3994 (eWLAN_PAL_FALSE == dxeCtxt->txIntEnable))
3995 {
3996 dxeCtxt->txIntEnable = eWLAN_PAL_TRUE;
3997 wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE);
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08003998 if(0 != dxeCtxt->txCompletedFrames)
3999 {
4000 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4001 "TX COMP INT Enabled, remain TX frame count on ring %d",
4002 dxeCtxt->txCompletedFrames);
4003 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004004 }
4005
4006 /*Kicking the DXE after the TX Complete interrupt was enabled - to avoid
4007 the posibility of a race*/
4008 dxePsComplete(dxeCtxt, eWLAN_PAL_TRUE);
4009
4010 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004011 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004012 return;
4013}
4014
4015
4016/*==========================================================================
4017 @ Function Name
4018 dxeTXCompleteProcessing
4019
4020 @ Description
4021 If DXE HW sends TX related interrupt, this event handler will be called
4022 Handle higher priority channel first
4023 Figureout why interrupt happen and call appropriate final even handler
4024 TX complete or error happen
4025
4026 @ Parameters
4027 dxeCtxt DXE context
4028
4029 @ Return
4030 PAL_STATUS_T
4031===========================================================================*/
4032void dxeTXCompleteProcessing
4033(
4034 WLANDXE_CtrlBlkType *dxeCtxt
4035)
4036{
4037 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4038 WLANDXE_ChannelCBType *channelCb = NULL;
4039
4040 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004041 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004042
4043 /* Test High Priority Channel is the INT source or not */
4044 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI];
4045
4046 /* Handle TX complete for high priority channel */
4047 status = dxeTXCompFrame(dxeCtxt, channelCb);
4048
4049 /* Test Low Priority Channel interrupt is enabled or not */
4050 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI];
4051
4052 /* Handle TX complete for low priority channel */
4053 status = dxeTXCompFrame(dxeCtxt, channelCb);
4054
4055 if((eWLAN_PAL_FALSE == dxeCtxt->txIntEnable) &&
4056 ((dxeCtxt->txCompletedFrames > 0) ||
4057 (WLANDXE_POWER_STATE_FULL == dxeCtxt->hostPowerState)))
4058 {
4059 dxeCtxt->txIntEnable = eWLAN_PAL_TRUE;
4060 wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE);
4061 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004062 "%s %s : %d, %s : %d", __func__,
Jeff Johnson295189b2012-06-20 16:38:30 -07004063 channelType[dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].channelType],
4064 dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc,
4065 channelType[dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].channelType],
4066 dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc);
Leo Changac1d3612013-07-01 15:15:51 -07004067
4068 if((WLANDXE_POWER_STATE_FULL != dxeCtxt->hostPowerState) &&
4069 (eWLAN_PAL_FALSE == tempDxeCtrlBlk->smsmToggled))
4070 {
4071 /* After TX Comp processing, still remaining frame on the DXE TX ring
4072 * And when push frame, RING was not empty marked
4073 * Then when push frame, no SMSM toggle happen
4074 * To avoid permanent TX stall, SMSM toggle is needed at here
4075 * With this toggle, host should gaurantee SMSM state should be changed */
4076 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
4077 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
4078 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004079 }
4080
4081 /*Kicking the DXE after the TX Complete interrupt was enabled - to avoid
4082 the posibility of a race*/
4083 dxePsComplete(dxeCtxt, eWLAN_PAL_FALSE);
4084
4085 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004086 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004087 return;
4088}
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004089
4090/*==========================================================================
4091 @ Function Name
4092 dxeTXReSyncDesc
4093
4094 @ Description
4095 When STA comeout from IMPS, check DXE TX next transfer candidate descriptor
4096 And HW programmed descriptor.
4097 If any async happen between HW/SW TX stall will happen
4098
4099 @ Parameters
4100 void *msgPtr
4101 Message pointer to sync with TX thread
4102
4103 @ Return
4104 NONE
4105===========================================================================*/
4106void dxeTXReSyncDesc
4107(
4108 wpt_msg *msgPtr
4109)
4110{
4111 wpt_msg *msgContent = (wpt_msg *)msgPtr;
4112 WLANDXE_CtrlBlkType *pDxeCtrlBlk;
4113 wpt_uint32 nextDescReg;
4114 WLANDXE_ChannelCBType *channelEntry;
4115 WLANDXE_DescCtrlBlkType *validCtrlBlk;
4116 wpt_uint32 descLoop;
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004117 wpt_uint32 channelLoop;
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004118
4119 if(NULL == msgContent)
4120 {
4121 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4122 "dxeTXReSyncDesc Invalid Control Block");
4123 return;
4124 }
4125
4126 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
4127 "dxeTXReSyncDesc Try to re-sync TX channel if any problem");
4128 pDxeCtrlBlk = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
4129
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004130 for(channelLoop = WDTS_CHANNEL_TX_LOW_PRI; channelLoop < WDTS_CHANNEL_RX_LOW_PRI; channelLoop++)
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004131 {
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004132 channelEntry = &pDxeCtrlBlk->dxeChannel[channelLoop];
4133 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
4134 "%11s : Try to detect TX descriptor async", channelType[channelEntry->channelType]);
4135 wpalReadRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
4136 &nextDescReg);
4137 /* Async detect without TX pending frame */
4138 if(channelEntry->tailCtrlBlk == channelEntry->headCtrlBlk)
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004139 {
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004140 if(nextDescReg != channelEntry->tailCtrlBlk->linkedDescPhyAddr)
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004141 {
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004142 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
4143 "TX Async no Pending frame");
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304144
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07004145 dxeChannelMonitor("!!! TX Async no Pending frame !!!", channelEntry, NULL);
4146 dxeChannelRegisterDump(channelEntry, "!!! TX Async no Pending frame !!!", NULL);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304147
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004148 wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004149 channelEntry->tailCtrlBlk->linkedDescPhyAddr);
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004150 }
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004151 }
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004152 /* Async detect with some TX pending frames
4153 * next descriptor register should sync with first valid descriptor */
4154 else
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004155 {
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004156 validCtrlBlk = channelEntry->tailCtrlBlk;
4157 for(descLoop = 0; descLoop < channelEntry->numDesc; descLoop++)
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004158 {
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004159 if(validCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID)
4160 {
4161 if(nextDescReg != validCtrlBlk->linkedDescPhyAddr)
4162 {
4163 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
4164 "TX Async");
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304165
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07004166 dxeChannelMonitor("!!! TX Async !!!", channelEntry, NULL);
4167 dxeChannelRegisterDump(channelEntry, "!!! TX Async !!!", NULL);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304168
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004169 wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
4170 validCtrlBlk->linkedDescPhyAddr);
4171 }
4172 break;
4173 }
4174 validCtrlBlk = (WLANDXE_DescCtrlBlkType *)validCtrlBlk->nextCtrlBlk;
4175 if(validCtrlBlk == channelEntry->headCtrlBlk->nextCtrlBlk)
4176 {
4177 /* Finished to test till head control blcok, but could not find valid descriptor
4178 * from head to tail all descriptors are invalidated
4179 * host point of view head descriptor is next TX candidate
4180 * So, next descriptor control have to be programmed with head descriptor
4181 * check */
4182 if(nextDescReg != channelEntry->headCtrlBlk->linkedDescPhyAddr)
4183 {
4184 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnsonab79c8d2012-12-10 14:30:13 -08004185 "TX Async with not completed transferred frames, next descriptor must be head");
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304186
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07004187 dxeChannelMonitor("!!! TX Async !!!", channelEntry, NULL);
4188 dxeChannelRegisterDump(channelEntry, "!!! TX Async !!!", NULL);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304189
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004190 wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
4191 validCtrlBlk->linkedDescPhyAddr);
4192 }
4193 break;
4194 }
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004195 }
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004196 }
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004197 }
4198
Madan Mohan Koyyalamudi5f57c102012-10-15 15:52:54 -07004199 /* HW/SW descriptor resync is done.
4200 * Next if there are any valid descriptor in chain, Push to HW again */
4201 for(channelLoop = WDTS_CHANNEL_TX_LOW_PRI; channelLoop < WDTS_CHANNEL_RX_LOW_PRI; channelLoop++)
4202 {
4203 channelEntry = &pDxeCtrlBlk->dxeChannel[channelLoop];
4204 if(channelEntry->tailCtrlBlk == channelEntry->headCtrlBlk)
4205 {
4206 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
4207 "%11s : No TX Pending frame",
4208 channelType[channelEntry->channelType]);
4209 /* No Pending frame, Do nothing */
4210 }
4211 else
4212 {
4213 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
4214 "%11s : TX Pending frame, process it",
4215 channelType[channelEntry->channelType]);
4216 validCtrlBlk = channelEntry->tailCtrlBlk;
4217 for(descLoop = 0; descLoop < channelEntry->numDesc; descLoop++)
4218 {
4219 if(validCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID)
4220 {
4221 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
4222 "%11s : when exit IMPS found valid descriptor",
4223 channelType[channelEntry->channelType]);
4224
4225 /* Found valid descriptor, kick DXE */
4226 wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr,
4227 channelEntry->extraConfig.chan_mask);
4228 break;
4229 }
4230 validCtrlBlk = (WLANDXE_DescCtrlBlkType *)validCtrlBlk->nextCtrlBlk;
4231 if(validCtrlBlk == channelEntry->headCtrlBlk->nextCtrlBlk)
4232 {
4233 /* Finished to test till head control blcok, but could not find valid descriptor
4234 * from head to tail all descriptors are invalidated */
4235 break;
4236 }
4237 }
4238 }
4239 }
4240
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004241 wpalMemoryFree(msgPtr);
4242 return;
4243}
4244
Jeff Johnson295189b2012-06-20 16:38:30 -07004245/*==========================================================================
4246 @ Function Name
4247 dxeTXISR
4248
4249 @ Description
4250 TX interrupt ISR
4251 Platform will call this function if INT is happen
4252 This function must be registered into platform interrupt module
4253
4254 @ Parameters
4255 void *hostCtxt
4256 DXE host driver control context,
4257 pre registerd during interrupt registration
4258
4259 @ Return
4260 PAL_STATUS_T
4261===========================================================================*/
4262static void dxeTXISR
4263(
4264 void *hostCtxt
4265)
4266{
4267 WLANDXE_CtrlBlkType *dxeCtxt = (WLANDXE_CtrlBlkType *)hostCtxt;
4268 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4269#ifdef FEATURE_R33D
4270 wpt_uint32 regValue;
4271#endif /* FEATURE_R33D */
4272
4273 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004274 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004275
4276 /* Return from here if the RIVA is in IMPS, to avoid register access */
Jeff Johnsone7245742012-09-05 17:12:55 -07004277 if(WLANDXE_POWER_STATE_DOWN == dxeCtxt->hostPowerState)
Jeff Johnson295189b2012-06-20 16:38:30 -07004278 {
Jeff Johnsone7245742012-09-05 17:12:55 -07004279 dxeCtxt->txIntEnable = eWLAN_PAL_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004280 /* Disable interrupt at here,
4281 IMPS or IMPS Pending state should not access RIVA register */
4282 status = wpalDisableInterrupt(DXE_INTERRUPT_TX_COMPLE);
4283 if(eWLAN_PAL_STATUS_SUCCESS != status)
4284 {
4285 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4286 "dxeRXFrameReadyISR Disable RX ready interrupt fail");
4287 return;
4288 }
4289 dxeCtxt->txIntDisabledByIMPS = eWLAN_PAL_TRUE;
4290 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004291 "%s Riva is in %d, return from here ", __func__, dxeCtxt->hostPowerState);
Jeff Johnson295189b2012-06-20 16:38:30 -07004292 return;
4293 }
4294
4295#ifdef FEATURE_R33D
4296 status = wpalReadRegister(WLANDXE_INT_SRC_RAW_ADDRESS,
4297 &regValue);
4298 if(eWLAN_PAL_STATUS_SUCCESS != status)
4299 {
4300 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4301 "dxeTXCompISR Read INT_SRC_RAW fail");
4302 return;
4303 }
4304 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
4305 "INT_SRC_RAW 0x%x", regValue);
4306 if(0 == regValue)
4307 {
4308 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4309 "This is not DXE Interrupt, Reject it");
4310 return;
4311 }
4312#endif /* FEATURE_R33D */
4313
4314 /* Disable TX Complete Interrupt at here */
4315 status = wpalDisableInterrupt(DXE_INTERRUPT_TX_COMPLE);
4316 if(eWLAN_PAL_STATUS_SUCCESS != status)
4317 {
4318 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4319 "dxeTXCompISR Disable TX complete interrupt fail");
4320 return;
4321 }
4322 dxeCtxt->txIntEnable = eWLAN_PAL_FALSE;
4323
4324
4325 if( dxeCtxt->ucTxMsgCnt )
4326 {
4327 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
4328 "Avoiding serializing TX Complete event");
4329 return;
4330 }
4331
4332 dxeCtxt->ucTxMsgCnt = 1;
4333
4334 /* Serialize TX complete interrupt upon TX thread */
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08004335 if(NULL == dxeCtxt->txIsrMsg)
4336 {
4337 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
4338 "Invalid message");
4339 HDXE_ASSERT(0);
4340 return;
4341 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004342 status = wpalPostTxMsg(WDI_GET_PAL_CTX(),
4343 dxeCtxt->txIsrMsg);
4344 if(eWLAN_PAL_STATUS_SUCCESS != status)
4345 {
4346 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
4347 "dxeTXCompISR interrupt serialize fail status=%d", status);
4348 }
4349
4350 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004351 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004352 return;
4353}
4354
4355/*-------------------------------------------------------------------------
4356 * Global Function
4357 *-------------------------------------------------------------------------*/
4358/*==========================================================================
4359 @ Function Name
4360 WLANDXE_Open
4361
4362 @ Description
4363 Open host DXE driver, allocate DXE resources
4364 Allocate, DXE local control block, DXE descriptor pool, DXE descriptor control block pool
4365
4366 @ Parameters
Jeff Johnsona8a1a482012-12-12 16:49:33 -08004367 pVoid pAdapter : Driver global control block pointer
Jeff Johnson295189b2012-06-20 16:38:30 -07004368
4369 @ Return
4370 pVoid DXE local module control block pointer
4371===========================================================================*/
4372void *WLANDXE_Open
4373(
4374 void
4375)
4376{
4377 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4378 unsigned int idx;
4379 WLANDXE_ChannelCBType *currentChannel = NULL;
4380 int smsmInitState;
4381#ifdef WLANDXE_TEST_CHANNEL_ENABLE
4382 wpt_uint32 sIdx;
4383 WLANDXE_ChannelCBType *channel = NULL;
4384 WLANDXE_DescCtrlBlkType *crntDescCB = NULL;
4385 WLANDXE_DescCtrlBlkType *nextDescCB = NULL;
4386#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
4387
4388 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004389 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004390
4391 /* This is temporary allocation */
4392 tempDxeCtrlBlk = (WLANDXE_CtrlBlkType *)wpalMemoryAllocate(sizeof(WLANDXE_CtrlBlkType));
4393 if(NULL == tempDxeCtrlBlk)
4394 {
4395 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4396 "WLANDXE_Open Control Block Alloc Fail");
4397 return NULL;
4398 }
4399 wpalMemoryZero(tempDxeCtrlBlk, sizeof(WLANDXE_CtrlBlkType));
4400
4401 status = dxeCommonDefaultConfig(tempDxeCtrlBlk);
4402 if(eWLAN_PAL_STATUS_SUCCESS != status)
4403 {
4404 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4405 "WLANDXE_Open Common Configuration Fail");
4406 WLANDXE_Close(tempDxeCtrlBlk);
4407 return NULL;
4408 }
4409
4410 for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++)
4411 {
4412 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4413 "WLANDXE_Open Channel %s Open Start", channelType[idx]);
4414 currentChannel = &tempDxeCtrlBlk->dxeChannel[idx];
4415 if(idx == WDTS_CHANNEL_TX_LOW_PRI)
4416 {
4417 currentChannel->channelType = WDTS_CHANNEL_TX_LOW_PRI;
4418 }
4419 else if(idx == WDTS_CHANNEL_TX_HIGH_PRI)
4420 {
4421 currentChannel->channelType = WDTS_CHANNEL_TX_HIGH_PRI;
4422 }
4423 else if(idx == WDTS_CHANNEL_RX_LOW_PRI)
4424 {
4425 currentChannel->channelType = WDTS_CHANNEL_RX_LOW_PRI;
4426 }
4427 else if(idx == WDTS_CHANNEL_RX_HIGH_PRI)
4428 {
4429 currentChannel->channelType = WDTS_CHANNEL_RX_HIGH_PRI;
4430 }
4431#ifdef WLANDXE_TEST_CHANNEL_ENABLE
4432 else if(idx == WDTS_CHANNEL_H2H_TEST_TX)
4433 {
4434 currentChannel->channelType = WDTS_CHANNEL_H2H_TEST_TX;
4435 }
4436 else if(idx == WDTS_CHANNEL_H2H_TEST_RX)
4437 {
4438 currentChannel->channelType = WDTS_CHANNEL_H2H_TEST_RX;
4439 }
4440#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
4441
4442 /* Config individual channels from channel default setup table */
4443 status = dxeChannelDefaultConfig(tempDxeCtrlBlk,
4444 currentChannel);
4445 if(eWLAN_PAL_STATUS_SUCCESS != status)
4446 {
4447 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4448 "WLANDXE_Open Channel Basic Configuration Fail for channel %d", idx);
4449 WLANDXE_Close(tempDxeCtrlBlk);
4450 return NULL;
4451 }
4452
4453 /* Allocate DXE Control Block will be used by host DXE driver */
4454 status = dxeCtrlBlkAlloc(tempDxeCtrlBlk, currentChannel);
4455 if(eWLAN_PAL_STATUS_SUCCESS != status)
4456 {
4457 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4458 "WLANDXE_Open Alloc DXE Control Block Fail for channel %d", idx);
4459
4460 WLANDXE_Close(tempDxeCtrlBlk);
4461 return NULL;
4462 }
4463 status = wpalMutexInit(&currentChannel->dxeChannelLock);
4464 if(eWLAN_PAL_STATUS_SUCCESS != status)
4465 {
4466 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4467 "WLANDXE_Open Lock Init Fail for channel %d", idx);
4468 WLANDXE_Close(tempDxeCtrlBlk);
4469 return NULL;
4470 }
4471
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -07004472 status = wpalTimerInit(&currentChannel->healthMonitorTimer,
4473 dxeHealthMonitorTimeout,
4474 (void *)currentChannel);
4475 if(eWLAN_PAL_STATUS_SUCCESS != status)
4476 {
4477 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4478 "WLANDXE_Open Health Monitor timer init fail %d", idx);
4479 WLANDXE_Close(tempDxeCtrlBlk);
4480 return NULL;
4481 }
4482
4483 currentChannel->healthMonitorMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
4484 if(NULL == currentChannel->healthMonitorMsg)
4485 {
4486 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4487 "WLANDXE_Open Health Monitor MSG Alloc fail %d", idx);
4488 WLANDXE_Close(tempDxeCtrlBlk);
4489 return NULL;
4490 }
4491 wpalMemoryZero(currentChannel->healthMonitorMsg, sizeof(wpt_msg));
4492 currentChannel->healthMonitorMsg->callback = dxeTXHealthMonitor;
4493 currentChannel->healthMonitorMsg->pContext = (void *)currentChannel;
4494
Jeff Johnson295189b2012-06-20 16:38:30 -07004495 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4496 "WLANDXE_Open Channel %s Open Success", channelType[idx]);
4497 }
4498
4499 /* Allocate and Init RX READY ISR Serialize Buffer */
4500 tempDxeCtrlBlk->rxIsrMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
4501 if(NULL == tempDxeCtrlBlk->rxIsrMsg)
4502 {
4503 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4504 "WLANDXE_Open Alloc RX ISR Fail");
4505 WLANDXE_Close(tempDxeCtrlBlk);
4506 return NULL;
4507 }
4508 wpalMemoryZero(tempDxeCtrlBlk->rxIsrMsg, sizeof(wpt_msg));
4509 tempDxeCtrlBlk->rxIsrMsg->callback = dxeRXEventHandler;
4510 tempDxeCtrlBlk->rxIsrMsg->pContext = (void *)tempDxeCtrlBlk;
4511
4512 /* Allocate and Init TX COMP ISR Serialize Buffer */
4513 tempDxeCtrlBlk->txIsrMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
4514 if(NULL == tempDxeCtrlBlk->txIsrMsg)
4515 {
4516 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4517 "WLANDXE_Open Alloc TX ISR Fail");
4518 WLANDXE_Close(tempDxeCtrlBlk);
4519 return NULL;
4520 }
4521 wpalMemoryZero(tempDxeCtrlBlk->txIsrMsg, sizeof(wpt_msg));
4522 tempDxeCtrlBlk->txIsrMsg->callback = dxeTXEventHandler;
4523 tempDxeCtrlBlk->txIsrMsg->pContext = (void *)tempDxeCtrlBlk;
4524
4525 /* Allocate and Init RX Packet Available Serialize Message Buffer */
4526 tempDxeCtrlBlk->rxPktAvailMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
4527 if(NULL == tempDxeCtrlBlk->rxPktAvailMsg)
4528 {
4529 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4530 "WLANDXE_Open Alloc RX Packet Available Message Fail");
4531 WLANDXE_Close(tempDxeCtrlBlk);
4532 return NULL;
4533 }
4534 wpalMemoryZero(tempDxeCtrlBlk->rxPktAvailMsg, sizeof(wpt_msg));
4535 tempDxeCtrlBlk->rxPktAvailMsg->callback = dxeRXPacketAvailableEventHandler;
4536 tempDxeCtrlBlk->rxPktAvailMsg->pContext = (void *)tempDxeCtrlBlk;
4537
4538 tempDxeCtrlBlk->freeRXPacket = NULL;
4539 tempDxeCtrlBlk->dxeCookie = WLANDXE_CTXT_COOKIE;
4540 tempDxeCtrlBlk->rxIntDisabledByIMPS = eWLAN_PAL_FALSE;
4541 tempDxeCtrlBlk->txIntDisabledByIMPS = eWLAN_PAL_FALSE;
Jeff Johnsone7245742012-09-05 17:12:55 -07004542 tempDxeCtrlBlk->driverReloadInProcessing = eWLAN_PAL_FALSE;
Leo Changac1d3612013-07-01 15:15:51 -07004543 tempDxeCtrlBlk->smsmToggled = eWLAN_PAL_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004544
4545 /* Initialize SMSM state
4546 * Init State is
4547 * Clear TX Enable
4548 * RING EMPTY STATE */
4549 smsmInitState = wpalNotifySmsm(WPAL_SMSM_WLAN_TX_ENABLE,
4550 WPAL_SMSM_WLAN_TX_RINGS_EMPTY);
4551 if(0 != smsmInitState)
4552 {
4553 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4554 "SMSM Channel init fail %d", smsmInitState);
4555 for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++)
4556 {
4557 dxeChannelClose(tempDxeCtrlBlk, &tempDxeCtrlBlk->dxeChannel[idx]);
4558 }
Madan Mohan Koyyalamudibe3597f2012-11-15 17:33:55 -08004559 wpalMemoryFree(tempDxeCtrlBlk->rxIsrMsg);
4560 wpalMemoryFree(tempDxeCtrlBlk->txIsrMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -07004561 wpalMemoryFree(tempDxeCtrlBlk);
4562 return NULL;
4563 }
4564
Leo Chang72cdfd32013-10-17 20:36:30 -07004565 wpalTimerInit(&tempDxeCtrlBlk->rxResourceAvailableTimer,
4566 dxeRXResourceAvailableTimerExpHandler,
4567 tempDxeCtrlBlk);
4568
Mihir Shetefdc9f532014-01-09 15:03:02 +05304569 wpalTimerInit(&tempDxeCtrlBlk->dxeSSRTimer,
4570 dxeSSRTimerExpHandler, tempDxeCtrlBlk);
4571
Jeff Johnson295189b2012-06-20 16:38:30 -07004572 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4573 "WLANDXE_Open Success");
4574 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004575 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004576 return (void *)tempDxeCtrlBlk;
4577}
4578
4579/*==========================================================================
4580 @ Function Name
4581 WLANDXE_ClientRegistration
4582
4583 @ Description
4584 Make callback functions registration into DXE driver from DXE driver client
4585
4586 @ Parameters
4587 pVoid pDXEContext : DXE module control block
4588 WDTS_RxFrameReadyCbType rxFrameReadyCB : RX Frame ready CB function pointer
4589 WDTS_TxCompleteCbType txCompleteCB : TX complete CB function pointer
4590 WDTS_LowResourceCbType lowResourceCB : Low DXE resource notification CB function pointer
4591 void *userContext : DXE Cliennt control block
4592
4593 @ Return
4594 wpt_status
4595===========================================================================*/
4596wpt_status WLANDXE_ClientRegistration
4597(
4598 void *pDXEContext,
4599 WLANDXE_RxFrameReadyCbType rxFrameReadyCB,
4600 WLANDXE_TxCompleteCbType txCompleteCB,
4601 WLANDXE_LowResourceCbType lowResourceCB,
4602 void *userContext
4603)
4604{
4605 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4606 WLANDXE_CtrlBlkType *dxeCtxt;
4607
4608 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004609 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004610
4611 /* Sanity */
4612 if(NULL == pDXEContext)
4613 {
4614 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4615 "WLANDXE_ClientRegistration Invalid DXE CB");
4616 return eWLAN_PAL_STATUS_E_INVAL;
4617 }
4618
4619 if(NULL == rxFrameReadyCB)
4620 {
4621 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4622 "WLANDXE_ClientRegistration Invalid RX READY CB");
4623 return eWLAN_PAL_STATUS_E_INVAL;
4624 }
4625
4626 if(NULL == txCompleteCB)
4627 {
4628 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4629 "WLANDXE_ClientRegistration Invalid txCompleteCB");
4630 return eWLAN_PAL_STATUS_E_INVAL;
4631 }
4632
4633 if(NULL == lowResourceCB)
4634 {
4635 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4636 "WLANDXE_ClientRegistration Invalid lowResourceCB");
4637 return eWLAN_PAL_STATUS_E_INVAL;
4638 }
4639
4640 if(NULL == userContext)
4641 {
4642 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4643 "WLANDXE_ClientRegistration Invalid userContext");
4644 return eWLAN_PAL_STATUS_E_INVAL;
4645 }
4646
4647 dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
4648
4649 /* Assign */
4650 dxeCtxt->rxReadyCB = rxFrameReadyCB;
4651 dxeCtxt->txCompCB = txCompleteCB;
4652 dxeCtxt->lowResourceCB = lowResourceCB;
4653 dxeCtxt->clientCtxt = userContext;
4654
4655 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004656 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004657 return status;
4658}
4659
4660/*==========================================================================
4661 @ Function Name
4662 WLANDXE_Start
4663
4664 @ Description
4665 Start Host DXE driver
4666 Initialize DXE channels and start channel
4667
4668 @ Parameters
4669 pVoid pDXEContext : DXE module control block
4670
4671 @ Return
4672 wpt_status
4673===========================================================================*/
4674wpt_status WLANDXE_Start
4675(
4676 void *pDXEContext
4677)
4678{
4679 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4680 wpt_uint32 idx;
4681 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
4682
4683 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004684 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004685
4686 /* Sanity */
4687 if(NULL == pDXEContext)
4688 {
4689 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4690 "WLANDXE_Start Invalid DXE CB");
4691 return eWLAN_PAL_STATUS_E_INVAL;
4692 }
4693 dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
4694
4695 /* WLANDXE_Start called means DXE engine already initiates
4696 * And DXE HW is reset and init finished
4697 * But here to make sure HW is initialized, reset again */
4698 status = dxeEngineCoreStart(dxeCtxt);
4699 if(eWLAN_PAL_STATUS_SUCCESS != status)
4700 {
4701 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4702 "WLANDXE_Start DXE HW init Fail");
4703 return status;
4704 }
4705
4706 /* Individual Channel Start */
4707 for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++)
4708 {
4709 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4710 "WLANDXE_Start Channel %s Start", channelType[idx]);
4711
4712 /* Allocate DXE descriptor will be shared by Host driver and DXE engine */
4713 /* Make connection between DXE descriptor and DXE control block */
4714 status = dxeDescAllocAndLink(tempDxeCtrlBlk, &dxeCtxt->dxeChannel[idx]);
4715 if(eWLAN_PAL_STATUS_SUCCESS != status)
4716 {
4717 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4718 "WLANDXE_Start Alloc DXE Descriptor Fail for channel %d", idx);
4719 return status;
4720 }
4721
4722 /* Program each channel register with configuration arguments */
4723 status = dxeChannelInitProgram(dxeCtxt,
4724 &dxeCtxt->dxeChannel[idx]);
4725 if(eWLAN_PAL_STATUS_SUCCESS != status)
4726 {
4727 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4728 "WLANDXE_Start %d Program DMA channel Fail", idx);
4729 return status;
4730 }
4731
4732 /* ??? Trigger to start DMA channel
4733 * This must be seperated from ??? */
4734 status = dxeChannelStart(dxeCtxt,
4735 &dxeCtxt->dxeChannel[idx]);
4736 if(eWLAN_PAL_STATUS_SUCCESS != status)
4737 {
4738 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4739 "WLANDXE_Start %d Channel Start Fail", idx);
4740 return status;
4741 }
4742 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4743 "WLANDXE_Start Channel %s Start Success", channelType[idx]);
4744 }
4745
4746 /* Register ISR to OS */
4747 /* Register TX complete interrupt into platform */
4748 status = wpalRegisterInterrupt(DXE_INTERRUPT_TX_COMPLE,
4749 dxeTXISR,
4750 dxeCtxt);
4751 if(eWLAN_PAL_STATUS_SUCCESS != status)
4752 {
4753 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4754 "WLANDXE_Start TX comp interrupt registration Fail");
4755 return status;
4756 }
4757
4758 /* Register RX ready interrupt into platform */
4759 status = wpalRegisterInterrupt(DXE_INTERRUPT_RX_READY,
4760 dxeRXISR,
4761 dxeCtxt);
4762 if(eWLAN_PAL_STATUS_SUCCESS != status)
4763 {
4764 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4765 "WLANDXE_Start RX Ready interrupt registration Fail");
4766 return status;
4767 }
4768
4769 /* Enable system level ISR */
4770 /* Enable RX ready Interrupt at here */
4771 status = wpalEnableInterrupt(DXE_INTERRUPT_RX_READY);
4772 if(eWLAN_PAL_STATUS_SUCCESS != status)
4773 {
4774 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4775 "dxeTXCompleteEventHandler Enable TX complete interrupt fail");
4776 return status;
4777 }
4778
4779 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004780 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004781 return status;
4782}
4783
4784/*==========================================================================
4785 @ Function Name
4786 WLANDXE_TXFrame
4787
4788 @ Description
4789 Trigger frame transmit from host to RIVA
4790
4791 @ Parameters
4792 pVoid pDXEContext : DXE Control Block
4793 wpt_packet pPacket : transmit packet structure
4794 WDTS_ChannelType channel : TX channel
4795
4796 @ Return
4797 wpt_status
4798===========================================================================*/
4799wpt_status WLANDXE_TxFrame
4800(
4801 void *pDXEContext,
4802 wpt_packet *pPacket,
4803 WDTS_ChannelType channel
4804)
4805{
4806 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4807 WLANDXE_ChannelCBType *currentChannel = NULL;
4808 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
4809 unsigned int *lowThreshold = NULL;
4810
4811 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004812 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004813
4814 /* Sanity */
4815 if(NULL == pDXEContext)
4816 {
4817 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4818 "WLANDXE_Start Invalid DXE CB");
4819 return eWLAN_PAL_STATUS_E_INVAL;
4820 }
4821
4822 if(NULL == pPacket)
4823 {
4824 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4825 "WLANDXE_Start Invalid pPacket");
4826 return eWLAN_PAL_STATUS_E_INVAL;
4827 }
4828
4829 if((WDTS_CHANNEL_MAX < channel) || (WDTS_CHANNEL_MAX == channel))
4830 {
4831 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4832 "WLANDXE_Start Invalid channel");
4833 return eWLAN_PAL_STATUS_E_INVAL;
4834 }
4835
4836 dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
4837
4838 currentChannel = &dxeCtxt->dxeChannel[channel];
4839
4840
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08004841 status = wpalMutexAcquire(&currentChannel->dxeChannelLock);
4842 if(eWLAN_PAL_STATUS_SUCCESS != status)
4843 {
4844 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4845 "WLANDXE_TxFrame Mutex Acquire fail");
4846 return status;
4847 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004848
4849 lowThreshold = currentChannel->channelType == WDTS_CHANNEL_TX_LOW_PRI?
4850 &(dxeCtxt->txCompInt.txLowResourceThreshold_LoPriCh):
4851 &(dxeCtxt->txCompInt.txLowResourceThreshold_HiPriCh);
4852
4853 /* Decide have to activate TX complete event or not */
4854 switch(dxeCtxt->txCompInt.txIntEnable)
4855 {
4856 /* TX complete interrupt will be activated when low DXE resource */
4857 case WLANDXE_TX_COMP_INT_LR_THRESHOLD:
4858 if((currentChannel->numFreeDesc <= *lowThreshold) &&
4859 (eWLAN_PAL_FALSE == dxeCtxt->txIntEnable))
4860 {
4861 dxeCtxt->txIntEnable = eWLAN_PAL_TRUE;
4862 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
4863 channel,
4864 eWLAN_PAL_FALSE);
4865 }
4866 break;
4867
Jeff Johnsonab79c8d2012-12-10 14:30:13 -08004868 /* TX complete interrupt will be activated n number of frames transferred */
Jeff Johnson295189b2012-06-20 16:38:30 -07004869 case WLANDXE_TX_COMP_INT_PER_K_FRAMES:
4870 if(channel == WDTS_CHANNEL_TX_LOW_PRI)
4871 {
4872 currentChannel->numFrameBeforeInt++;
4873 }
4874 break;
4875
4876 /* TX complete interrupt will be activated periodically */
4877 case WLANDXE_TX_COMP_INT_TIMER:
4878 break;
4879 }
4880
4881 dxeCtxt->txCompletedFrames++;
4882
4883 /* Update DXE descriptor, this is frame based
4884 * if a frame consist of N fragments, N Descriptor will be programed */
4885 status = dxeTXPushFrame(currentChannel, pPacket);
4886 if(eWLAN_PAL_STATUS_SUCCESS != status)
4887 {
4888 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4889 "WLANDXE_TxFrame TX Push Frame fail");
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08004890 status = wpalMutexRelease(&currentChannel->dxeChannelLock);
4891 if(eWLAN_PAL_STATUS_SUCCESS != status)
4892 {
4893 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4894 "WLANDXE_TxFrame Mutex Release fail");
4895 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004896 return status;
4897 }
4898
4899 /* If specific channel hit low resource condition, send notification to upper layer */
4900 if(currentChannel->numFreeDesc <= *lowThreshold)
4901 {
4902 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
4903 channel,
4904 eWLAN_PAL_FALSE);
4905 currentChannel->hitLowResource = eWLAN_PAL_TRUE;
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -07004906
4907 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4908 "%11s : Low Resource currentChannel->numRsvdDesc %d",
4909 channelType[currentChannel->channelType],
4910 currentChannel->numRsvdDesc);
4911 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
4912 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
4913 wpalTimerStart(&currentChannel->healthMonitorTimer,
4914 T_WLANDXE_PERIODIC_HEALTH_M_TIME);
Jeff Johnson295189b2012-06-20 16:38:30 -07004915 }
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08004916 status = wpalMutexRelease(&currentChannel->dxeChannelLock);
4917 if(eWLAN_PAL_STATUS_SUCCESS != status)
4918 {
4919 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4920 "WLANDXE_TxFrame Mutex Release fail");
4921 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004922
4923 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004924 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004925 return status;
4926}
4927
4928/*==========================================================================
4929 @ Function Name
4930 WLANDXE_CompleteTX
4931
4932 @ Description
4933 Informs DXE that the current series of Tx packets is complete
4934
4935 @ Parameters
4936 pContext pDXEContext : DXE Control Block
4937 ucTxResReq TX resource number required by TL/WDI
4938
4939 @ Return
4940 wpt_status
4941===========================================================================*/
4942wpt_status
4943WLANDXE_CompleteTX
4944(
4945 void* pContext,
4946 wpt_uint32 ucTxResReq
4947)
4948{
4949 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4950 WLANDXE_CtrlBlkType *dxeCtxt = (WLANDXE_CtrlBlkType *)(pContext);
4951 WLANDXE_ChannelCBType *channelCb = NULL;
4952 wpt_boolean inLowRes;
4953
4954 /* Sanity Check */
4955 if( NULL == pContext )
4956 {
4957 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4958 "WLANDXE_CompleteTX invalid param");
4959 return eWLAN_PAL_STATUS_E_INVAL;
4960 }
4961
4962 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI];
4963 inLowRes = channelCb->hitLowResource;
4964
4965 if(WLANDXE_TX_LOW_RES_THRESHOLD < ucTxResReq)
4966 {
4967 /* Raise threshold temporarily if necessary */
4968 dxeCtxt->txCompInt.txLowResourceThreshold_LoPriCh = ucTxResReq;
4969
4970 if(eWLAN_PAL_FALSE == inLowRes)
4971 {
4972 /* Put the channel to low resource condition */
4973 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
4974 WDTS_CHANNEL_TX_LOW_PRI,
4975 eWLAN_PAL_FALSE);
4976 inLowRes = channelCb->hitLowResource = eWLAN_PAL_TRUE;
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -07004977 wpalTimerStart(&channelCb->healthMonitorTimer,
4978 T_WLANDXE_PERIODIC_HEALTH_M_TIME);
Jeff Johnson295189b2012-06-20 16:38:30 -07004979 }
4980 }
4981
4982 /*Try to reclaim resources*/
4983 dxeTXCompleteProcessing(dxeCtxt);
4984
4985 /* In previous WLANTL_GetFrames call, TL didn't fetch a packet
4986 because its fragment size is larger than DXE free resource. */
4987 if(0 < ucTxResReq)
4988 {
4989 /* DXE successfully claimed enough free DXE resouces for next fetch. */
4990 if(WLANDXE_GetFreeTxDataResNumber(dxeCtxt) >= ucTxResReq)
4991 {
4992 /* DXE has not been in low resource condition. DXE forces to kick off
4993 TX tranmit */
4994 if((eWLAN_PAL_FALSE == inLowRes) &&
4995 (eWLAN_PAL_FALSE == channelCb->hitLowResource))
4996 {
4997 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
4998 WDTS_CHANNEL_TX_LOW_PRI,
4999 eWLAN_PAL_FALSE);
5000 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
5001 WDTS_CHANNEL_TX_LOW_PRI,
5002 eWLAN_PAL_TRUE);
5003 channelCb->hitLowResource = eWLAN_PAL_FALSE;
5004 }
5005 }
5006 else
5007 {
5008 /* DXE doesn't have enough free DXE resources. Put the channel
5009 to low resource condition. */
5010 if(eWLAN_PAL_FALSE == channelCb->hitLowResource)
5011 {
5012 /* Put the channel to low resource condition */
5013 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
5014 WDTS_CHANNEL_TX_LOW_PRI,
5015 eWLAN_PAL_FALSE);
5016 channelCb->hitLowResource = eWLAN_PAL_TRUE;
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -07005017 wpalTimerStart(&channelCb->healthMonitorTimer,
5018 T_WLANDXE_PERIODIC_HEALTH_M_TIME);
Jeff Johnson295189b2012-06-20 16:38:30 -07005019 }
5020 }
5021 }
5022
5023 return status;
5024}
5025
5026/*==========================================================================
5027 @ Function Name
5028 WLANDXE_Stop
5029
5030 @ Description
5031 Stop DXE channels and DXE engine operations
5032 Disable all channel interrupt
5033 Stop all channel operation
5034
5035 @ Parameters
5036 pVoid pDXEContext : DXE Control Block
5037
5038 @ Return
5039 wpt_status
5040===========================================================================*/
5041wpt_status WLANDXE_Stop
5042(
5043 void *pDXEContext
5044)
5045{
5046 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5047 wpt_uint32 idx;
5048 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
5049
5050 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005051 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005052
5053 /* Sanity */
5054 if(NULL == pDXEContext)
5055 {
5056 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5057 "WLANDXE_Stop Invalid DXE CB");
5058 return eWLAN_PAL_STATUS_E_INVAL;
5059 }
5060
5061 dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
5062 for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++)
5063 {
Yue Ma7faf58c2013-04-25 12:04:13 -07005064 if(VOS_TIMER_STATE_RUNNING == wpalTimerGetCurStatus(&dxeCtxt->dxeChannel[idx].healthMonitorTimer))
5065 {
5066 wpalTimerStop(&dxeCtxt->dxeChannel[idx].healthMonitorTimer);
5067 }
5068
Jeff Johnson295189b2012-06-20 16:38:30 -07005069 status = dxeChannelStop(dxeCtxt, &dxeCtxt->dxeChannel[idx]);
5070 if(eWLAN_PAL_STATUS_SUCCESS != status)
5071 {
5072 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5073 "WLANDXE_Stop Channel %d Stop Fail", idx);
Jeff Johnson295189b2012-06-20 16:38:30 -07005074 }
5075 }
5076
5077 /* During Stop unregister interrupt */
5078 wpalUnRegisterInterrupt(DXE_INTERRUPT_TX_COMPLE);
5079 wpalUnRegisterInterrupt(DXE_INTERRUPT_RX_READY);
5080
Leo Chang72cdfd32013-10-17 20:36:30 -07005081 if(VOS_TIMER_STATE_STOPPED !=
5082 wpalTimerGetCurStatus(&dxeCtxt->rxResourceAvailableTimer))
5083 {
5084 wpalTimerStop(&dxeCtxt->rxResourceAvailableTimer);
5085 }
5086
Jeff Johnson295189b2012-06-20 16:38:30 -07005087 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005088 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005089 return status;
5090}
5091
5092/*==========================================================================
5093 @ Function Name
5094 WLANDXE_Close
5095
5096 @ Description
5097 Close DXE channels
5098 Free DXE related resources
5099 DXE descriptor free
5100 Descriptor control block free
5101 Pre allocated RX buffer free
5102
5103 @ Parameters
5104 pVoid pDXEContext : DXE Control Block
5105
5106 @ Return
5107 wpt_status
5108===========================================================================*/
5109wpt_status WLANDXE_Close
5110(
5111 void *pDXEContext
5112)
5113{
5114 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5115 wpt_uint32 idx;
5116 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
5117#ifdef WLANDXE_TEST_CHANNEL_ENABLE
5118 wpt_uint32 sIdx;
5119 WLANDXE_ChannelCBType *channel = NULL;
5120 WLANDXE_DescCtrlBlkType *crntDescCB = NULL;
5121 WLANDXE_DescCtrlBlkType *nextDescCB = NULL;
5122#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
5123
5124 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005125 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005126
5127 /* Sanity */
5128 if(NULL == pDXEContext)
5129 {
5130 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5131 "WLANDXE_Stop Invalid DXE CB");
5132 return eWLAN_PAL_STATUS_E_INVAL;
5133 }
5134
5135 dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
Leo Chang72cdfd32013-10-17 20:36:30 -07005136 wpalTimerDelete(&dxeCtxt->rxResourceAvailableTimer);
Mihir Shetefdc9f532014-01-09 15:03:02 +05305137 wpalTimerDelete(&dxeCtxt->dxeSSRTimer);
Jeff Johnson295189b2012-06-20 16:38:30 -07005138 for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++)
5139 {
5140 wpalMutexDelete(&dxeCtxt->dxeChannel[idx].dxeChannelLock);
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -07005141 wpalTimerDelete(&dxeCtxt->dxeChannel[idx].healthMonitorTimer);
5142 if(NULL != dxeCtxt->dxeChannel[idx].healthMonitorMsg)
5143 {
5144 wpalMemoryFree(dxeCtxt->dxeChannel[idx].healthMonitorMsg);
5145 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005146 dxeChannelClose(dxeCtxt, &dxeCtxt->dxeChannel[idx]);
5147#ifdef WLANDXE_TEST_CHANNEL_ENABLE
5148 channel = &dxeCtxt->dxeChannel[idx];
5149 crntDescCB = channel->headCtrlBlk;
5150 for(sIdx = 0; sIdx < channel->numDesc; sIdx++)
5151 {
5152 nextDescCB = (WLANDXE_DescCtrlBlkType *)crntDescCB->nextCtrlBlk;
5153 wpalMemoryFree((void *)crntDescCB);
5154 crntDescCB = nextDescCB;
5155 if(NULL == crntDescCB)
5156 {
5157 break;
5158 }
5159 }
5160#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
5161 }
5162
5163 if(NULL != dxeCtxt->rxIsrMsg)
5164 {
5165 wpalMemoryFree(dxeCtxt->rxIsrMsg);
5166 }
5167 if(NULL != dxeCtxt->txIsrMsg)
5168 {
5169 wpalMemoryFree(dxeCtxt->txIsrMsg);
5170 }
5171 if(NULL != dxeCtxt->rxPktAvailMsg)
5172 {
5173 wpalMemoryFree(dxeCtxt->rxPktAvailMsg);
5174 }
5175
5176 wpalMemoryFree(pDXEContext);
5177
5178 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005179 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005180 return status;
5181}
5182
5183/*==========================================================================
5184 @ Function Name
5185 WLANDXE_TriggerTX
5186
5187 @ Description
5188 TBD
5189
5190 @ Parameters
5191 pVoid pDXEContext : DXE Control Block
5192
5193 @ Return
5194 wpt_status
5195===========================================================================*/
5196wpt_status WLANDXE_TriggerTX
5197(
5198 void *pDXEContext
5199)
5200{
5201 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5202
5203 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005204 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005205
5206 /* TBD */
5207
5208 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005209 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005210 return status;
5211}
5212
5213/*==========================================================================
5214 @ Function Name
5215 dxeTxThreadSetPowerStateEventHandler
5216
5217 @ Description
5218 If WDI sends set power state req, this event handler will be called in Tx
5219 thread context
5220
5221 @ Parameters
5222 void *msgPtr
5223 Event MSG
5224
5225 @ Return
5226 None
5227===========================================================================*/
5228void dxeTxThreadSetPowerStateEventHandler
5229(
5230 wpt_msg *msgPtr
5231)
5232{
5233 wpt_msg *msgContent = (wpt_msg *)msgPtr;
5234 WLANDXE_CtrlBlkType *dxeCtxt;
5235 wpt_status status = eWLAN_PAL_STATUS_E_FAILURE;
5236 WLANDXE_PowerStateType reqPowerState;
5237
5238 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005239 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005240
Jeff Johnson295189b2012-06-20 16:38:30 -07005241 dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
5242 reqPowerState = (WLANDXE_PowerStateType)msgContent->val;
5243 dxeCtxt->setPowerStateCb = (WLANDXE_SetPowerStateCbType)msgContent->ptr;
5244
5245 switch(reqPowerState)
5246 {
5247 case WLANDXE_POWER_STATE_BMPS:
5248 if(WLANDXE_RIVA_POWER_STATE_ACTIVE == dxeCtxt->rivaPowerState)
5249 {
5250 //don't block MC waiting for num_rsvd to become 0 since it may take a while
5251 //based on amount of TX and RX activity - during this time any received
5252 // management frames will remain un-processed consuming RX buffers
5253 dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN;
5254 dxeCtxt->hostPowerState = reqPowerState;
5255 }
5256 else
5257 {
5258 status = eWLAN_PAL_STATUS_E_INVAL;
5259 }
5260 break;
5261 case WLANDXE_POWER_STATE_IMPS:
5262 if(WLANDXE_RIVA_POWER_STATE_ACTIVE == dxeCtxt->rivaPowerState)
5263 {
5264 dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_IMPS_UNKNOWN;
5265 }
5266 else
5267 {
5268 status = eWLAN_PAL_STATUS_E_INVAL;
5269 }
5270 break;
5271 case WLANDXE_POWER_STATE_FULL:
5272 if(WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN == dxeCtxt->rivaPowerState)
5273 {
5274 dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_ACTIVE;
5275 }
5276 dxeCtxt->hostPowerState = reqPowerState;
5277 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
5278 break;
5279 case WLANDXE_POWER_STATE_DOWN:
5280 WLANDXE_Stop((void *)dxeCtxt);
5281 break;
5282 default:
5283 //assert
5284 break;
5285 }
5286
5287 if(WLANDXE_POWER_STATE_BMPS_PENDING != dxeCtxt->hostPowerState)
5288 {
5289 dxeCtxt->setPowerStateCb(status,
5290 dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].descBottomLocPhyAddr);
5291 }
Ravali85acf6b2012-12-12 14:01:38 -08005292 else
5293 {
5294 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
5295 "%s State of DXE is WLANDXE_POWER_STATE_BMPS_PENDING, so cannot proceed", __func__);
5296 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005297 /* Free MSG buffer */
5298 wpalMemoryFree(msgPtr);
5299 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005300 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005301 return;
5302}
5303
5304
5305/*==========================================================================
5306 @ Function Name
5307 dxeRxThreadSetPowerStateEventHandler
5308
5309 @ Description
5310 If WDI sends set power state req, this event handler will be called in Rx
5311 thread context
5312
5313 @ Parameters
5314 void *msgPtr
5315 Event MSG
5316
5317 @ Return
5318 None
5319===========================================================================*/
5320void dxeRxThreadSetPowerStateEventHandler
5321(
5322 wpt_msg *msgPtr
5323)
5324{
5325 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5326
5327 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005328 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005329
5330 /* Now serialise the message through Tx thread also to make sure
5331 * no register access when RIVA is in powersave */
5332 /*Use the same message pointer just change the call back function */
5333 msgPtr->callback = dxeTxThreadSetPowerStateEventHandler;
5334 status = wpalPostTxMsg(WDI_GET_PAL_CTX(),
5335 msgPtr);
5336 if ( eWLAN_PAL_STATUS_SUCCESS != status )
5337 {
5338 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5339 "Tx thread Set power state req serialize fail status=%d",
Jeff Johnson9e237fb2013-10-30 18:46:20 -07005340 status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005341 }
5342
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}
5346
5347/*==========================================================================
5348 @ Function Name
5349 WLANDXE_SetPowerState
5350
5351 @ Description
5352 From Client let DXE knows what is the WLAN HW(RIVA) power state
5353
5354 @ Parameters
5355 pVoid pDXEContext : DXE Control Block
5356 WLANDXE_PowerStateType powerState
5357
5358 @ Return
5359 wpt_status
5360===========================================================================*/
5361wpt_status WLANDXE_SetPowerState
5362(
5363 void *pDXEContext,
5364 WDTS_PowerStateType powerState,
5365 WDTS_SetPSCbType cBack
5366)
5367{
5368 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5369 WLANDXE_CtrlBlkType *pDxeCtrlBlk;
5370 WLANDXE_PowerStateType hostPowerState;
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07005371 wpt_msg *rxCompMsg;
5372 wpt_msg *txDescReSyncMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -07005373
5374 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005375 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005376 if(NULL == pDXEContext)
5377 {
5378 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Jeff Johnson9e237fb2013-10-30 18:46:20 -07005379 "NULL pDXEContext passed by caller");
Jeff Johnson295189b2012-06-20 16:38:30 -07005380 return eWLAN_PAL_STATUS_E_FAILURE;
5381 }
5382 pDxeCtrlBlk = (WLANDXE_CtrlBlkType *)pDXEContext;
5383
Jeff Johnson295189b2012-06-20 16:38:30 -07005384 switch(powerState)
5385 {
5386 case WDTS_POWER_STATE_FULL:
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07005387 if(WLANDXE_POWER_STATE_IMPS == pDxeCtrlBlk->hostPowerState)
5388 {
5389 txDescReSyncMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
5390 if(NULL == txDescReSyncMsg)
5391 {
5392 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5393 "WLANDXE_SetPowerState, TX Resync MSG MEM alloc Fail");
5394 }
5395 else
5396 {
5397 txDescReSyncMsg->callback = dxeTXReSyncDesc;
5398 txDescReSyncMsg->pContext = pDxeCtrlBlk;
5399 status = wpalPostTxMsg(WDI_GET_PAL_CTX(),
5400 txDescReSyncMsg);
5401 if(eWLAN_PAL_STATUS_SUCCESS != status)
5402 {
5403 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5404 "WLANDXE_SetPowerState, Post TX re-sync MSG fail");
5405 }
5406 }
5407 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005408 hostPowerState = WLANDXE_POWER_STATE_FULL;
5409 break;
5410 case WDTS_POWER_STATE_BMPS:
5411 pDxeCtrlBlk->hostPowerState = WLANDXE_POWER_STATE_BMPS;
5412 hostPowerState = WLANDXE_POWER_STATE_BMPS;
5413 break;
5414 case WDTS_POWER_STATE_IMPS:
5415 pDxeCtrlBlk->hostPowerState = WLANDXE_POWER_STATE_IMPS;
5416 hostPowerState = WLANDXE_POWER_STATE_IMPS;
5417 break;
5418 case WDTS_POWER_STATE_DOWN:
5419 pDxeCtrlBlk->hostPowerState = WLANDXE_POWER_STATE_DOWN;
5420 hostPowerState = WLANDXE_POWER_STATE_DOWN;
5421 break;
5422 default:
5423 hostPowerState = WLANDXE_POWER_STATE_MAX;
5424 }
5425
5426 // A callback i.e. ACK back is needed only when we want to enable BMPS
5427 // and the data/management path is active because we want to ensure
5428 // DXE registers are not accessed when RIVA may be power-collapsed. So
5429 // we need a callback in enter_bmps_req (the request to RIVA is sent
5430 // only after ACK back from TX thread). A callback is not needed in
5431 // finish_scan_req during BMPS since data-path is resumed only in
5432 // finish_scan_rsp and no management frames are sent in between. No
5433 // callback is needed when going from BMPS enabled to BMPS suspended/
5434 // disabled when it is known that RIVA is awake and cannot enter power
5435 // collapse autonomously so no callback is needed in exit_bmps_rsp or
5436 // init_scan_rsp
5437 if ( cBack )
5438 {
5439 //serialize through Rx thread
5440 rxCompMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
5441 if(NULL == rxCompMsg)
5442 {
5443 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5444 "WLANDXE_SetPowerState, MSG MEM alloc Fail");
5445 return eWLAN_PAL_STATUS_E_RESOURCES;
5446 }
5447
5448 /* Event type, where it must be defined???? */
5449 /* THIS MUST BE CLEARED ASAP
5450 txCompMsg->type = TX_COMPLETE; */
5451 rxCompMsg->callback = dxeRxThreadSetPowerStateEventHandler;
5452 rxCompMsg->pContext = pDxeCtrlBlk;
5453 rxCompMsg->val = hostPowerState;
5454 rxCompMsg->ptr = cBack;
5455 status = wpalPostRxMsg(WDI_GET_PAL_CTX(),
5456 rxCompMsg);
5457 if ( eWLAN_PAL_STATUS_SUCCESS != status )
5458 {
5459 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5460 "Rx thread Set power state req serialize fail status=%d",
Jeff Johnson9e237fb2013-10-30 18:46:20 -07005461 status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005462 }
5463 }
5464 else
5465 {
5466 if ( WLANDXE_POWER_STATE_FULL == hostPowerState )
5467 {
5468 if( WLANDXE_POWER_STATE_BMPS == pDxeCtrlBlk->hostPowerState )
5469 {
5470 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
5471 }
5472 else if( WLANDXE_POWER_STATE_IMPS == pDxeCtrlBlk->hostPowerState )
5473 {
5474 /* Requested Full power from exit IMPS, reenable the interrupts*/
5475 if(eWLAN_PAL_TRUE == pDxeCtrlBlk->rxIntDisabledByIMPS)
5476 {
5477 pDxeCtrlBlk->rxIntDisabledByIMPS = eWLAN_PAL_FALSE;
5478 /* Enable RX interrupt at here, if new PS is not IMPS */
5479 status = wpalEnableInterrupt(DXE_INTERRUPT_RX_READY);
5480 if(eWLAN_PAL_STATUS_SUCCESS != status)
5481 {
5482 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005483 "%s Enable RX ready interrupt fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005484 return status;
5485 }
5486 }
5487 if(eWLAN_PAL_TRUE == pDxeCtrlBlk->txIntDisabledByIMPS)
5488 {
5489 pDxeCtrlBlk->txIntDisabledByIMPS = eWLAN_PAL_FALSE;
Jeff Johnsone7245742012-09-05 17:12:55 -07005490 pDxeCtrlBlk->txIntEnable = eWLAN_PAL_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005491 /* Enable RX interrupt at here, if new PS is not IMPS */
5492 status = wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE);
5493 if(eWLAN_PAL_STATUS_SUCCESS != status)
5494 {
5495 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005496 "%s Enable TX comp interrupt fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005497 return status;
5498 }
5499 }
5500 }
5501 pDxeCtrlBlk->hostPowerState = hostPowerState;
5502 pDxeCtrlBlk->rivaPowerState = WLANDXE_RIVA_POWER_STATE_ACTIVE;
5503 }
5504 else if ( hostPowerState == WLANDXE_POWER_STATE_BMPS )
5505 {
5506 pDxeCtrlBlk->hostPowerState = hostPowerState;
5507 pDxeCtrlBlk->rivaPowerState = WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN;
5508 }
5509 else
5510 {
5511 HDXE_ASSERT(0);
5512 }
5513 }
5514
5515 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005516 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005517
5518 return status;
5519}
5520
5521/*==========================================================================
5522 @ Function Name
5523 WLANDXE_GetFreeTxDataResNumber
5524
5525 @ Description
5526 Returns free descriptor numbers for TX data channel (TX high priority)
5527
5528 @ Parameters
5529 pVoid pDXEContext : DXE Control Block
5530
5531 @ Return
5532 wpt_uint32 Free descriptor number of TX high pri ch
5533===========================================================================*/
5534wpt_uint32 WLANDXE_GetFreeTxDataResNumber
5535(
5536 void *pDXEContext
5537)
5538{
5539 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005540 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005541
5542 if(NULL == pDXEContext)
5543 {
5544 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Jeff Johnson9e237fb2013-10-30 18:46:20 -07005545 "NULL parameter passed by caller");
Jeff Johnson295189b2012-06-20 16:38:30 -07005546 return (0);
5547 }
5548
5549 return
5550 ((WLANDXE_CtrlBlkType *)pDXEContext)->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numFreeDesc;
5551}
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005552
5553/*==========================================================================
5554 @ Function Name
5555 WLANDXE_ChannelDebug
5556
5557 @ Description
5558 Display DXE Channel debugging information
5559 User may request to display DXE channel snapshot
5560 Or if host driver detects any abnormal stcuk may display
5561
5562 @ Parameters
Jeff Johnsonb88db982012-12-10 13:34:59 -08005563 displaySnapshot : Display DXE snapshot option
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005564 enableStallDetect : Enable stall detect feature
5565 This feature will take effect to data performance
5566 Not integrate till fully verification
5567
5568 @ Return
5569 NONE
5570
5571===========================================================================*/
5572void WLANDXE_ChannelDebug
5573(
5574 wpt_boolean displaySnapshot,
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005575 wpt_boolean enableStallDetect
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005576)
5577{
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005578 wpt_msg *channelDebugMsg;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005579 wpt_uint32 regValue;
5580 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5581
5582 /* Debug Type 1, Display current snapshot */
5583 if(displaySnapshot)
5584 {
5585 /* Whatever RIVA power condition try to wakeup RIVA through SMSM
5586 * This will not simply wakeup RIVA
5587 * Just incase TX not wanted stuck, Trigger TX again */
Leo Chang345ef992013-07-12 10:17:29 -07005588 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
5589 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005590 /* Get free BD count */
Leo Chang345ef992013-07-12 10:17:29 -07005591 wpalSleep(10);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005592 wpalReadRegister(WLANDXE_BMU_AVAILABLE_BD_PDU, &regValue);
5593 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Leo Chang345ef992013-07-12 10:17:29 -07005594 "===== DXE Dump Start HPS %d, FWS %d, TX PFC %d, ABD %d =====",
5595 tempDxeCtrlBlk->hostPowerState, tempDxeCtrlBlk->rivaPowerState,
5596 tempDxeCtrlBlk->txCompletedFrames, regValue);
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005597
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07005598 wpalPacketStallUpdateInfo((wpt_uint32 *)&tempDxeCtrlBlk->rivaPowerState,
5599 &regValue,
5600 NULL,
5601 0);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07005602
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005603 channelDebugMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
5604 if(NULL == channelDebugMsg)
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005605 {
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005606 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5607 "WLANDXE_ChannelDebug, MSG MEM alloc Fail");
5608 return ;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005609 }
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005610
5611 channelDebugMsg->callback = dxeRxThreadChannelDebugHandler;
5612 status = wpalPostRxMsg(WDI_GET_PAL_CTX(), channelDebugMsg);
5613 if ( eWLAN_PAL_STATUS_SUCCESS != status )
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005614 {
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005615 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5616 "Tx thread Set power state req serialize fail status=%d",
Jeff Johnson9e237fb2013-10-30 18:46:20 -07005617 status);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005618 }
5619 }
5620
5621 /* Debug Type 2, toggling stall detect enable/disable */
5622 if(enableStallDetect)
5623 {
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -07005624 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Jeff Johnson9e237fb2013-10-30 18:46:20 -07005625 "DXE TX Stall detect");
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -07005626 /* Start Stall detect timer and detect stall */
5627 wpalTimerStart(&tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].healthMonitorTimer,
5628 T_WLANDXE_PERIODIC_HEALTH_M_TIME);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005629 }
5630 return;
Madan Mohan Koyyalamudi48139e32012-10-11 14:43:56 -07005631}