blob: ff2b5eda6fcfd16914e263d1c8f5b925536915cc [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
Leo Chang5edb2d32013-04-03 13:32:58 -0700100#define T_WLANDXE_PERIODIC_HEALTH_M_TIME 2500
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -0700101#define T_WLANDXE_MAX_HW_ACCESS_WAIT 2000
Jeff Johnsone7245742012-09-05 17:12:55 -0700102#define WLANDXE_MAX_REAPED_RX_FRAMES 512
Jeff Johnson295189b2012-06-20 16:38:30 -0700103
Leo Chang094ece82013-04-23 17:57:41 -0700104#define WLANPAL_RX_INTERRUPT_PRO_MASK 0x20
105#define WLANDXE_RX_INTERRUPT_PRO_UNMASK 0x5F
Jeff Johnson295189b2012-06-20 16:38:30 -0700106/* This is temporary fot the compile
107 * WDI will release official version
108 * This must be removed */
109#define WDI_GET_PAL_CTX() NULL
110
Madan Mohan Koyyalamudidfd6aa82012-10-18 20:18:43 -0700111
Jeff Johnson295189b2012-06-20 16:38:30 -0700112/*-------------------------------------------------------------------------
113 * Local Varables
114 *-------------------------------------------------------------------------*/
115/* This is temp, someone have to allocate for me, and must be part of global context */
Madan Mohan Koyyalamudidfd6aa82012-10-18 20:18:43 -0700116static WLANDXE_CtrlBlkType *tempDxeCtrlBlk;
Jeff Johnson295189b2012-06-20 16:38:30 -0700117static char *channelType[WDTS_CHANNEL_MAX] =
118 {
119 "TX_LOW_PRI",
120 "TX_HIGH_PRI",
121 "RX_LOW_PRI",
122#ifndef WLANDXE_TEST_CHANNEL_ENABLE
123 "RX_HIGH_PRI",
124#else
125 "H2H_TEST_TX",
126 "H2H_TEST_RX"
127#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
128 };
Jeff Johnsone7245742012-09-05 17:12:55 -0700129static wpt_packet *rx_reaped_buf[WLANDXE_MAX_REAPED_RX_FRAMES];
Jeff Johnson295189b2012-06-20 16:38:30 -0700130
131/*-------------------------------------------------------------------------
132 * External Function Proto Type
133 *-------------------------------------------------------------------------*/
134
135/*-------------------------------------------------------------------------
136 * Local Function Proto Type
137 *-------------------------------------------------------------------------*/
138static wpt_status dxeRXFrameSingleBufferAlloc
139(
140 WLANDXE_CtrlBlkType *dxeCtxt,
141 WLANDXE_ChannelCBType *channelEntry,
142 WLANDXE_DescCtrlBlkType *currentCtrlBlock
143);
144
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700145static wpt_status dxeNotifySmsm
146(
147 wpt_boolean kickDxe,
148 wpt_boolean ringEmpty
149);
150
Jeff Johnson295189b2012-06-20 16:38:30 -0700151/*-------------------------------------------------------------------------
152 * Local Function
153 *-------------------------------------------------------------------------*/
Jeff Johnson295189b2012-06-20 16:38:30 -0700154/*==========================================================================
155 @ Function Name
156 dxeChannelMonitor
157
158 @ Description
159
160 @ Parameters
161 WLANDXE_ChannelCBType *channelEntry
162 Channel specific control block
163
164 @ Return
165 wpt_status
166
167===========================================================================*/
168static wpt_status dxeChannelMonitor
169(
170 char *monitorDescription,
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530171 WLANDXE_ChannelCBType *channelEntry,
172 wpt_log_data_stall_channel_type *channelLog
Jeff Johnson295189b2012-06-20 16:38:30 -0700173)
174{
175 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
176
Jeff Johnsone7245742012-09-05 17:12:55 -0700177 if((NULL == monitorDescription) || (NULL == channelEntry))
178 {
179 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
180 "INVALID Input ARG");
181 return eWLAN_PAL_STATUS_E_INVAL;
182 }
183
184 if(channelEntry->channelType > WDTS_CHANNEL_RX_HIGH_PRI)
185 {
186 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
187 "INVALID Channel type");
188 return eWLAN_PAL_STATUS_E_INVAL;
189 }
190
Leo Chang345ef992013-07-12 10:17:29 -0700191 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
192 "%11s : HCBO %d, HCBDP 0x%x, HCBDC 0x%x,",
193 channelType[channelEntry->channelType],
194 channelEntry->headCtrlBlk->ctrlBlkOrder,
195 channelEntry->headCtrlBlk->linkedDescPhyAddr,
196 channelEntry->headCtrlBlk->linkedDesc->descCtrl.ctrl);
197 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
198 "%11s : TCBO %d, TCBDP 0x%x, TCBDC 0x%x",
199 channelType[channelEntry->channelType],
200 channelEntry->tailCtrlBlk->ctrlBlkOrder,
201 channelEntry->tailCtrlBlk->linkedDescPhyAddr,
202 channelEntry->tailCtrlBlk->linkedDesc->descCtrl.ctrl);
203 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
204 "%11s : FDC %d, RDC %d, TFC %d",
205 channelType[channelEntry->channelType],
206 channelEntry->numFreeDesc,
207 channelEntry->numRsvdDesc,
208 channelEntry->numTotalFrame);
Jeff Johnson295189b2012-06-20 16:38:30 -0700209
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700210 if(channelLog)
211 {
212 channelLog->numDesc = channelEntry->numDesc;
213 channelLog->numFreeDesc = channelEntry->numFreeDesc;
214 channelLog->numRsvdDesc = channelEntry->numRsvdDesc;
215 channelLog->headDescOrder = channelEntry->headCtrlBlk->ctrlBlkOrder;
216 channelLog->tailDescOrder = channelEntry->tailCtrlBlk->ctrlBlkOrder;
217 }
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530218
Jeff Johnson295189b2012-06-20 16:38:30 -0700219 return status;
220}
221
Jeff Johnsone7245742012-09-05 17:12:55 -0700222#ifdef WLANDXE_DEBUG_MEMORY_DUMP
Jeff Johnson295189b2012-06-20 16:38:30 -0700223/*==========================================================================
224 @ Function Name
225 dxeMemoryDump
226
227 @ Description
228
229 @ Parameters
230 WLANDXE_ChannelCBType *channelEntry
231 Channel specific control block
232
233 @ Return
234 wpt_status
235
236===========================================================================*/
237static wpt_status dxeMemoryDump
238(
239 wpt_uint8 *dumpPointer,
240 wpt_uint32 dumpSize,
241 char *dumpTarget
242)
243{
244 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
245 wpt_uint32 numBytes = 0;
246 wpt_uint32 idx;
247
Jeff Johnsone7245742012-09-05 17:12:55 -0700248 if((NULL == dumpPointer) ||
249 (NULL == dumpTarget))
250 {
251 return status;
252 }
253
Jeff Johnson295189b2012-06-20 16:38:30 -0700254 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
255 "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
256 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
257 "%s Location 0x%x, Size %d", dumpTarget, dumpPointer, dumpSize);
258
259 numBytes = dumpSize % T_WLANDXE_MEMDUMP_BYTE_PER_LINE;
260 for(idx = 0; idx < dumpSize; idx++)
261 {
262 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
263 "0x%2x ", dumpPointer[idx]);
264 if(0 == ((idx + 1) % T_WLANDXE_MEMDUMP_BYTE_PER_LINE))
265 {
266 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, "\n");
267 }
268 }
269 if(0 != numBytes)
270 {
271 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, "\n");
272 }
273 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
274 "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
275
276 return status;
277}
Jeff Johnsone7245742012-09-05 17:12:55 -0700278#endif /* WLANDXE_DEBUG_MEMORY_DUMP */
Jeff Johnson295189b2012-06-20 16:38:30 -0700279
280/*==========================================================================
281 @ Function Name
282 dxeDescriptorDump
283
284 @ Description
285
286 @ Parameters
287 WLANDXE_ChannelCBType *channelEntry
288 Channel specific control block
289
290 @ Return
291 wpt_status
292
293===========================================================================*/
294wpt_status dxeDescriptorDump
295(
296 WLANDXE_ChannelCBType *channelEntry,
297 WLANDXE_DescType *targetDesc,
298 wpt_uint32 fragmentOrder
299)
300{
301 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
302
303
Jeff Johnsone7245742012-09-05 17:12:55 -0700304 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnson295189b2012-06-20 16:38:30 -0700305 "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
Jeff Johnsone7245742012-09-05 17:12:55 -0700306 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700307 "Descriptor Dump for channel %s, %d / %d fragment",
Jeff Johnson295189b2012-06-20 16:38:30 -0700308 channelType[channelEntry->channelType],
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700309 fragmentOrder + 1,
310 channelEntry->numFragmentCurrentChain);
Jeff Johnson295189b2012-06-20 16:38:30 -0700311
Jeff Johnsone7245742012-09-05 17:12:55 -0700312 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnson295189b2012-06-20 16:38:30 -0700313 "CTRL WORD 0x%x, TransferSize %d",
314 WLANDXE_U32_SWAP_ENDIAN(targetDesc->descCtrl.ctrl),
315 WLANDXE_U32_SWAP_ENDIAN(targetDesc->xfrSize));
Jeff Johnsone7245742012-09-05 17:12:55 -0700316 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnson295189b2012-06-20 16:38:30 -0700317 "SRC ADD 0x%x, DST ADD 0x%x, NEXT DESC 0x%x",
318 WLANDXE_U32_SWAP_ENDIAN(targetDesc->dxedesc.dxe_short_desc.srcMemAddrL),
319 WLANDXE_U32_SWAP_ENDIAN(targetDesc->dxedesc.dxe_short_desc.dstMemAddrL),
320 WLANDXE_U32_SWAP_ENDIAN(targetDesc->dxedesc.dxe_short_desc.phyNextL));
Jeff Johnsone7245742012-09-05 17:12:55 -0700321 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnson295189b2012-06-20 16:38:30 -0700322 "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
323
324 return status;
325}
326
327/*==========================================================================
328 @ Function Name
329 dxeChannelRegisterDump
330
331 @ Description
332
333 @ Parameters
334 WLANDXE_ChannelCBType *channelEntry
335 Channel specific control block
336
337 @ Return
338 wpt_status
339
340===========================================================================*/
341wpt_status dxeChannelRegisterDump
342(
343 WLANDXE_ChannelCBType *channelEntry,
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530344 char *dumpTarget,
345 wpt_log_data_stall_channel_type *channelLog
Jeff Johnson295189b2012-06-20 16:38:30 -0700346)
347{
Leo Chang345ef992013-07-12 10:17:29 -0700348 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
349 wpt_uint32 chStatusReg, chControlReg, chDescReg, chLDescReg;
350
351 /* Whatever RIVA power condition try to wakeup RIVA through SMSM
352 * This will not simply wakeup RIVA
353 * Just incase TX not wanted stuck, Trigger TX again */
354 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
355 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
356 wpalSleep(10);
Jeff Johnson295189b2012-06-20 16:38:30 -0700357
Tushnim Bhattacharyya5dd94562013-03-20 20:15:03 -0700358 if(channelEntry->channelType > WDTS_CHANNEL_RX_HIGH_PRI)
359 {
360 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
361 "INVALID Channel type");
362 return eWLAN_PAL_STATUS_E_INVAL;
363 }
364
Leo Chang345ef992013-07-12 10:17:29 -0700365 wpalReadRegister(channelEntry->channelRegister.chDXEDesclRegAddr, &chDescReg);
366 wpalReadRegister(channelEntry->channelRegister.chDXELstDesclRegAddr, &chLDescReg);
367 wpalReadRegister(channelEntry->channelRegister.chDXECtrlRegAddr, &chControlReg);
368 wpalReadRegister(channelEntry->channelRegister.chDXEStatusRegAddr, &chStatusReg);
Jeff Johnson295189b2012-06-20 16:38:30 -0700369
Leo Chang345ef992013-07-12 10:17:29 -0700370 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
371 "%11s : CCR 0x%x, CSR 0x%x, CDR 0x%x, CLDR 0x%x",
372 channelType[channelEntry->channelType],
373 chControlReg, chStatusReg, chDescReg, chLDescReg);
Jeff Johnson295189b2012-06-20 16:38:30 -0700374
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700375 if(channelLog)
376 {
377 channelLog->ctrlRegVal = chControlReg;
378 channelLog->statRegVal = chStatusReg;
379 }
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700380
Jeff Johnson295189b2012-06-20 16:38:30 -0700381 return status;
382}
Jeff Johnsone7245742012-09-05 17:12:55 -0700383
384/*==========================================================================
385 @ Function Name
386 dxeChannelAllDescDump
387
388 @ Description
389 Dump all DXE descriptors within assigned channe;
390
391 @ Parameters
392 WLANDXE_ChannelCBType *channelEntry
393
394 @ Return
395 NONE
396
397===========================================================================*/
398void dxeChannelAllDescDump
399(
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700400 WLANDXE_ChannelCBType *channelEntry,
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530401 WDTS_ChannelType channel,
402 wpt_log_data_stall_channel_type *channelLog
Jeff Johnsone7245742012-09-05 17:12:55 -0700403)
404{
405 wpt_uint32 channelLoop;
406 WLANDXE_DescCtrlBlkType *targetCtrlBlk;
Madan Mohan Koyyalamudi94d4c192012-09-24 14:06:14 -0700407 wpt_uint32 previousCtrlValue = 0;
Leo Chang345ef992013-07-12 10:17:29 -0700408 wpt_uint32 previousCtrlValid = 0;
409 wpt_uint32 currentCtrlValid = 0;
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700410 wpt_uint32 valDescCount = 0;
411 wpt_uint32 invalDescCount = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -0700412
413 targetCtrlBlk = channelEntry->headCtrlBlk;
414
415 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Leo Chang345ef992013-07-12 10:17:29 -0700416 "%11s : %d descriptor chains, head desc ctrl 0x%x",
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700417 channelType[channelEntry->channelType],
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -0700418 channelEntry->numDesc,
419 targetCtrlBlk->linkedDesc->descCtrl.ctrl);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700420 previousCtrlValue = targetCtrlBlk->linkedDesc->descCtrl.ctrl;
421
422 if((WDTS_CHANNEL_RX_LOW_PRI == channel) ||
423 (WDTS_CHANNEL_RX_HIGH_PRI == channel))
Jeff Johnsone7245742012-09-05 17:12:55 -0700424 {
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700425 for(channelLoop = 0; channelLoop < channelEntry->numDesc; channelLoop++)
Madan Mohan Koyyalamudi94d4c192012-09-24 14:06:14 -0700426 {
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700427 if(previousCtrlValue != targetCtrlBlk->linkedDesc->descCtrl.ctrl)
428 {
429 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
430 "%5d : 0x%x", targetCtrlBlk->ctrlBlkOrder,
431 targetCtrlBlk->linkedDesc->descCtrl.ctrl);
432 }
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700433 if(targetCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID)
434 {
435 valDescCount++;
436 }
437 else
438 {
439 invalDescCount++;
440 }
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700441 previousCtrlValue = targetCtrlBlk->linkedDesc->descCtrl.ctrl;
442 targetCtrlBlk = (WLANDXE_DescCtrlBlkType *)targetCtrlBlk->nextCtrlBlk;
Madan Mohan Koyyalamudi94d4c192012-09-24 14:06:14 -0700443 }
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700444 }
445 else
446 {
Leo Chang345ef992013-07-12 10:17:29 -0700447 /* Head Descriptor is valid or not */
448 previousCtrlValid = targetCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID;
449 targetCtrlBlk = (WLANDXE_DescCtrlBlkType *)targetCtrlBlk->nextCtrlBlk;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700450 for(channelLoop = 0; channelLoop < channelEntry->numDesc; channelLoop++)
451 {
Leo Chang345ef992013-07-12 10:17:29 -0700452 currentCtrlValid = targetCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID;
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700453 if(currentCtrlValid)
454 {
455 valDescCount++;
456 }
457 else
458 {
459 invalDescCount++;
460 }
Leo Chang345ef992013-07-12 10:17:29 -0700461 if(currentCtrlValid != previousCtrlValid)
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700462 {
463 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
464 "%5d : 0x%x", targetCtrlBlk->ctrlBlkOrder,
465 targetCtrlBlk->linkedDesc->descCtrl.ctrl);
466 }
Leo Chang345ef992013-07-12 10:17:29 -0700467 previousCtrlValid = currentCtrlValid;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700468 targetCtrlBlk = (WLANDXE_DescCtrlBlkType *)targetCtrlBlk->nextCtrlBlk;
469 }
470 }
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530471
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700472 if(channelLog)
473 {
474 channelLog->numValDesc = valDescCount;
475 channelLog->numInvalDesc = invalDescCount;
476 }
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530477
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700478 return;
479}
480
481/*==========================================================================
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530482 @ Function Name
483 dxeErrChannelDebug
484
485 @ Description
486 Dump channel information for which Error interrupt has occured
487
488 @ Parameters
489 WLANDXE_ChannelCBType *channelCb
490
491 @ Return
492 NONE
493
494===========================================================================*/
495void dxeErrChannelDebug
496(
497 WLANDXE_ChannelCBType *channelCb
498)
499{
500 wpt_log_data_stall_channel_type channelLog;
501
502 dxeChannelMonitor("INT_ERR", channelCb, &channelLog);
503 dxeDescriptorDump(channelCb, channelCb->headCtrlBlk->linkedDesc, 0);
504 dxeChannelRegisterDump(channelCb, "INT_ERR", &channelLog);
505 dxeChannelAllDescDump(channelCb, channelCb->channelType, &channelLog);
506 wpalMemoryCopy(channelLog.channelName,
507 "INT_ERR",
508 WPT_TRPT_CHANNEL_NAME);
509 wpalPacketStallUpdateInfo(NULL, NULL, &channelLog, channelCb->channelType);
510#ifdef FEATURE_WLAN_DIAG_SUPPORT
511 wpalPacketStallDumpLog();
512#endif /* FEATURE_WLAN_DIAG_SUPPORT */
513
514 wpalFwDumpReq(17, 0, 0, 0, 0);
515}
516/*==========================================================================
517 @ Function Name
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700518 dxeTxThreadChannelDebugHandler
519
520 @ Description
521 Dump TX channel information
522
523 @ Parameters
524 Wwpt_msg *msgPtr
525
526 @ Return
527 NONE
528
529===========================================================================*/
530void dxeTxThreadChannelDebugHandler
531(
532 wpt_msg *msgPtr
533)
534{
535 wpt_uint8 channelLoop;
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700536 wpt_log_data_stall_channel_type channelLog;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700537
538 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700539 "%s Enter", __func__);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700540
541 /* Whatever RIVA power condition try to wakeup RIVA through SMSM
542 * This will not simply wakeup RIVA
543 * Just incase TX not wanted stuck, Trigger TX again */
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700544 for(channelLoop = 0; channelLoop < WDTS_CHANNEL_RX_LOW_PRI; channelLoop++)
545 {
546 dxeChannelMonitor("******** Get Descriptor Snapshot ",
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530547 &tempDxeCtrlBlk->dxeChannel[channelLoop],
548 &channelLog);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700549 dxeChannelRegisterDump(&tempDxeCtrlBlk->dxeChannel[channelLoop],
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530550 "Abnormal successive empty interrupt",
551 &channelLog);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700552 dxeChannelAllDescDump(&tempDxeCtrlBlk->dxeChannel[channelLoop],
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530553 channelLoop,
554 &channelLog);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700555
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700556 wpalMemoryCopy(channelLog.channelName,
557 channelType[channelLoop],
558 WPT_TRPT_CHANNEL_NAME);
559 wpalPacketStallUpdateInfo(NULL, NULL, &channelLog, channelLoop);
Jeff Johnsone7245742012-09-05 17:12:55 -0700560 }
561
Leo Chang345ef992013-07-12 10:17:29 -0700562 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
563 "================== DXE Dump End ======================",
564 tempDxeCtrlBlk->hostPowerState, tempDxeCtrlBlk->rivaPowerState);
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -0700565 wpalMemoryFree(msgPtr);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700566
567#ifdef FEATURE_WLAN_DIAG_SUPPORT
568 wpalPacketStallDumpLog();
569#endif /* FEATURE_WLAN_DIAG_SUPPORT */
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700570 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700571 "%s Exit", __func__);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700572 return;
573}
574
575/*==========================================================================
576 @ Function Name
577 dxeRxThreadChannelDebugHandler
578
579 @ Description
580 Dump RX channel information
581
582 @ Parameters
583 Wwpt_msg *msgPtr
584
585 @ Return
586 NONE
587
588===========================================================================*/
589void dxeRxThreadChannelDebugHandler
590(
591 wpt_msg *msgPtr
592)
593{
594 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
595 wpt_uint8 channelLoop;
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700596 wpt_log_data_stall_channel_type channelLog;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700597
598 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700599 "%s Enter", __func__);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700600
601 /* Whatever RIVA power condition try to wakeup RIVA through SMSM
602 * This will not simply wakeup RIVA
603 * Just incase TX not wanted stuck, Trigger TX again */
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700604 for(channelLoop = WDTS_CHANNEL_RX_LOW_PRI; channelLoop < WDTS_CHANNEL_MAX; channelLoop++)
605 {
606 dxeChannelMonitor("******** Get Descriptor Snapshot ",
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530607 &tempDxeCtrlBlk->dxeChannel[channelLoop],
608 &channelLog);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700609 dxeChannelRegisterDump(&tempDxeCtrlBlk->dxeChannel[channelLoop],
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530610 "Abnormal successive empty interrupt",
611 &channelLog);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700612 dxeChannelAllDescDump(&tempDxeCtrlBlk->dxeChannel[channelLoop],
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530613 channelLoop, &channelLog);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700614
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700615 wpalMemoryCopy(channelLog.channelName,
616 channelType[channelLoop],
617 WPT_TRPT_CHANNEL_NAME);
618 wpalPacketStallUpdateInfo(NULL, NULL, &channelLog, channelLoop);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530619
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700620 }
621
622 /* Now serialise the message through Tx thread also to make sure
623 * no register access when RIVA is in powersave */
624 /*Use the same message pointer just change the call back function */
625 msgPtr->callback = dxeTxThreadChannelDebugHandler;
626 status = wpalPostTxMsg(WDI_GET_PAL_CTX(),
627 msgPtr);
628 if ( eWLAN_PAL_STATUS_SUCCESS != status )
629 {
630 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi48139e32012-10-11 14:43:56 -0700631 "Tx thread state dump req serialize fail status=%d",
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700632 status, 0, 0);
633 }
634
635 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700636 "%s Exit", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700637 return;
638}
Jeff Johnson295189b2012-06-20 16:38:30 -0700639
640/*==========================================================================
641 @ Function Name
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -0700642 dxeRXHealthMonitor
643
644 @ Description
645 Monitoring RX channel healthy stataus
646 If detect any problem, try to recover
647
648 @ Parameters
649 healthMonitorMsg MSG pointer.
650 will have low resource TX channel context
651
652 @ Return
653 NONE
654
655===========================================================================*/
656void dxeRXHealthMonitor
657(
658 wpt_msg *healthMonitorMsg
659)
660{
661 WLANDXE_ChannelCBType *channelCtrlBlk;
662 WLANDXE_ChannelCBType *testCHCtrlBlk;
663 wpt_uint32 regValue;
664 wpt_uint32 chStatusReg, chControlReg, chDescReg, chLDescReg;
665 wpt_uint32 hwWakeLoop, chLoop;
666
667 if(NULL == healthMonitorMsg)
668 {
669 return;
670 }
671
672 /* Make wake up HW */
673 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
674 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
Leo Chang5edb2d32013-04-03 13:32:58 -0700675 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -0700676
677 for(hwWakeLoop = 0; hwWakeLoop < T_WLANDXE_MAX_HW_ACCESS_WAIT; hwWakeLoop++)
678 {
679 wpalReadRegister(WLANDXE_BMU_AVAILABLE_BD_PDU, &regValue);
680 if(0 != regValue)
681 {
682 break;
683 }
684 }
685
686 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
687 "Scheduled RX, num free BD/PDU %d, loop Count %d",
688 regValue, hwWakeLoop, 0);
689
690 for(chLoop = WDTS_CHANNEL_RX_LOW_PRI; chLoop < WDTS_CHANNEL_MAX; chLoop++)
691 {
692 testCHCtrlBlk = &tempDxeCtrlBlk->dxeChannel[chLoop];
693 wpalReadRegister(testCHCtrlBlk->channelRegister.chDXECtrlRegAddr, &chControlReg);
694 wpalReadRegister(testCHCtrlBlk->channelRegister.chDXEStatusRegAddr, &chStatusReg);
695 wpalReadRegister(testCHCtrlBlk->channelRegister.chDXEDesclRegAddr, &chDescReg);
696 wpalReadRegister(testCHCtrlBlk->channelRegister.chDXELstDesclRegAddr, &chLDescReg);
697
698 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
699 "%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",
700 channelType[chLoop],
701 chControlReg, chStatusReg, chDescReg, chLDescReg,
702 testCHCtrlBlk->headCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr,
703 testCHCtrlBlk->headCtrlBlk->linkedDesc->descCtrl.ctrl,
704 testCHCtrlBlk->tailCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr,
705 testCHCtrlBlk->tailCtrlBlk->linkedDesc->descCtrl.ctrl);
706
707 if((chControlReg & WLANDXE_DESC_CTRL_VALID) &&
708 (chLDescReg != testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr))
709 {
710 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
711 "%11s : CCR 0x%x, CSR 0x%x, CDR 0x%x, CLDR 0x%x, "
712 "HCBO %d, HCBDP 0x%x, HCBDC 0x%x, TCBO %d,TCBDP 0x%x, TCBDC 0x%x",
713 channelType[chLoop],
714 chControlReg, chStatusReg, chDescReg, chLDescReg,
715 testCHCtrlBlk->headCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr,
716 testCHCtrlBlk->headCtrlBlk->linkedDesc->descCtrl.ctrl,
717 testCHCtrlBlk->tailCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr,
718 testCHCtrlBlk->tailCtrlBlk->linkedDesc->descCtrl.ctrl);
719 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
720 "%11s : RX CH EN Descriptor Async, resync it", channelType[chLoop], 0, 0);
721 wpalWriteRegister(testCHCtrlBlk->channelRegister.chDXELstDesclRegAddr,
722 testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr);
723 }
724 else if(!(chControlReg & WLANDXE_DESC_CTRL_VALID) &&
725 (chDescReg != testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr))
726 {
727 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
728 "%11s : CCR 0x%x, CSR 0x%x, CDR 0x%x, CLDR 0x%x, "
729 "HCBO %d, HCBDP 0x%x, HCBDC 0x%x, TCBO %d,TCBDP 0x%x, TCBDC 0x%x",
730 channelType[chLoop],
731 chControlReg, chStatusReg, chDescReg, chLDescReg,
732 testCHCtrlBlk->headCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr,
733 testCHCtrlBlk->headCtrlBlk->linkedDesc->descCtrl.ctrl,
734 testCHCtrlBlk->tailCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr,
735 testCHCtrlBlk->tailCtrlBlk->linkedDesc->descCtrl.ctrl);
736 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
737 "%11s : RX CH DIS Descriptor Async, resync it", channelType[chLoop], 0, 0);
738 wpalWriteRegister(testCHCtrlBlk->channelRegister.chDXEDesclRegAddr,
739 testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr);
740 }
741 }
742
743 channelCtrlBlk = (WLANDXE_ChannelCBType *)healthMonitorMsg->pContext;
744 if(channelCtrlBlk->hitLowResource)
745 {
746 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
747 "%11s : Still Low Resource, kick DXE TX and restart timer",
748 channelType[channelCtrlBlk->channelType], 0, 0);
749 /* Still Low Resource, Kick DXE again and start timer again */
750 wpalTimerStart(&channelCtrlBlk->healthMonitorTimer,
751 T_WLANDXE_PERIODIC_HEALTH_M_TIME);
752 }
753 else
754 {
755 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
756 "%11s : Out from Low resource condition, do nothing",
757 channelType[channelCtrlBlk->channelType], 0, 0);
758 /* Recovered from low resource condition
759 * Not need to do anything */
760 }
761
762 return;
763}
764
765/*==========================================================================
766 @ Function Name
767 dxeTXHealthMonitor
768
769 @ Description
770 Monitoring TX channel healthy stataus
771 If detect any problem, try to recover
772
773 @ Parameters
774 healthMonitorMsg MSG pointer.
775 will have low resource TX channel context
776
777 @ Return
778 NONE
779
780===========================================================================*/
781void dxeTXHealthMonitor
782(
783 wpt_msg *healthMonitorMsg
784)
785{
786 WLANDXE_ChannelCBType *channelCtrlBlk;
787 WLANDXE_ChannelCBType *testCHCtrlBlk;
788 wpt_uint32 regValue;
789 wpt_uint32 chStatusReg, chControlReg, chDescReg, chLDescReg;
790 wpt_uint32 hwWakeLoop, chLoop;
791 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
792
793 if(NULL == healthMonitorMsg)
794 {
795 return;
796 }
797
798 /* First of all kick TX channel
799 * This will fix if there is any problem with SMSM state */
800 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
801 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
Leo Chang5edb2d32013-04-03 13:32:58 -0700802 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -0700803
804 /* Wait till RIVA up */
805 for(hwWakeLoop = 0; hwWakeLoop < T_WLANDXE_MAX_HW_ACCESS_WAIT; hwWakeLoop++)
806 {
807 wpalReadRegister(WLANDXE_BMU_AVAILABLE_BD_PDU, &regValue);
808 if(0 != regValue)
809 {
810 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
811 "num free BD/PDU %d, loop Count %d",
812 regValue, hwWakeLoop, 0);
813 break;
814 }
815 }
816
817 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
818 "Scheduled TX, num free BD/PDU %d, loop Count %d",
819 regValue, hwWakeLoop, 0);
820
821 for(chLoop = 0; chLoop < WDTS_CHANNEL_RX_LOW_PRI; chLoop++)
822 {
823 testCHCtrlBlk = &tempDxeCtrlBlk->dxeChannel[chLoop];
824 wpalReadRegister(testCHCtrlBlk->channelRegister.chDXECtrlRegAddr, &chControlReg);
825 wpalReadRegister(testCHCtrlBlk->channelRegister.chDXEStatusRegAddr, &chStatusReg);
826 wpalReadRegister(testCHCtrlBlk->channelRegister.chDXEDesclRegAddr, &chDescReg);
827 wpalReadRegister(testCHCtrlBlk->channelRegister.chDXELstDesclRegAddr, &chLDescReg);
828
829 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
830 "%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",
831 channelType[chLoop],
832 chControlReg, chStatusReg, chDescReg, chLDescReg,
833 testCHCtrlBlk->headCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr,
834 testCHCtrlBlk->headCtrlBlk->linkedDesc->descCtrl.ctrl,
835 testCHCtrlBlk->tailCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr,
836 testCHCtrlBlk->tailCtrlBlk->linkedDesc->descCtrl.ctrl);
837
838 if((chControlReg & WLANDXE_DESC_CTRL_VALID) &&
839 (chLDescReg != testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr))
840 {
841 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
842 "%11s : CCR 0x%x, CSR 0x%x, CDR 0x%x, CLDR 0x%x, "
843 "HCBO %d, HCBDP 0x%x, HCBDC 0x%x, TCBO %d,TCBDP 0x%x, TCBDC 0x%x",
844 channelType[chLoop],
845 chControlReg, chStatusReg, chDescReg, chLDescReg,
846 testCHCtrlBlk->headCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr,
847 testCHCtrlBlk->headCtrlBlk->linkedDesc->descCtrl.ctrl,
848 testCHCtrlBlk->tailCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr,
849 testCHCtrlBlk->tailCtrlBlk->linkedDesc->descCtrl.ctrl);
850 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
851 "%11s : TX CH EN Descriptor Async, resync it", channelType[chLoop], 0, 0);
852 wpalWriteRegister(testCHCtrlBlk->channelRegister.chDXELstDesclRegAddr,
853 testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr);
854 }
855 else if(!(chControlReg & WLANDXE_DESC_CTRL_VALID) &&
856 (chDescReg != testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr))
857 {
858 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
859 "%11s : CCR 0x%x, CSR 0x%x, CDR 0x%x, CLDR 0x%x, "
860 "HCBO %d, HCBDP 0x%x, HCBDC 0x%x, TCBO %d,TCBDP 0x%x, TCBDC 0x%x",
861 channelType[chLoop],
862 chControlReg, chStatusReg, chDescReg, chLDescReg,
863 testCHCtrlBlk->headCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr,
864 testCHCtrlBlk->headCtrlBlk->linkedDesc->descCtrl.ctrl,
865 testCHCtrlBlk->tailCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr,
866 testCHCtrlBlk->tailCtrlBlk->linkedDesc->descCtrl.ctrl);
867 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
868 "%11s : TX CH DIS Descriptor Async, resync it", channelType[chLoop], 0, 0);
869 wpalWriteRegister(testCHCtrlBlk->channelRegister.chDXEDesclRegAddr,
870 testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr);
871 }
872 }
873
874 /* TX channel test done, test RX channels */
875 channelCtrlBlk = (WLANDXE_ChannelCBType *)healthMonitorMsg->pContext;
876 channelCtrlBlk->healthMonitorMsg->callback = dxeRXHealthMonitor;
877 status = wpalPostRxMsg(WDI_GET_PAL_CTX(),
878 channelCtrlBlk->healthMonitorMsg);
879 if (eWLAN_PAL_STATUS_SUCCESS != status)
880 {
881 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
882 "TX Low resource Kick DXE MSG Serialize fail",
883 status, 0, 0);
884 }
885
886 return;
887}
888
889/*==========================================================================
890 @ Function Name
891 dxeHealthMonitorTimeout
892
893 @ Description
894 Health Monitor timer started when TX channel low resource condition
895 And if reciovered from low resource condition, timer would not fired
896 Timer fired means during certain time, TX CH could not be recovered
897
898 @ Parameters
899 channelCtxt Low resource condition happen Channel context
900
901 @ Return
902 NONE
903
904===========================================================================*/
905void dxeHealthMonitorTimeout
906(
907 void *channelCtxt
908)
909{
910 WLANDXE_ChannelCBType *channelCtrlBlk;
911 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
912
913 if(NULL == channelCtxt)
914 {
915 return;
916 }
917
918 /* Timeout Fired, DXE TX should kick on TX thread
919 * Serailize to TX Thread */
920 channelCtrlBlk = (WLANDXE_ChannelCBType *)channelCtxt;
921 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
922 "%11s : Health Monitor timer expired",
923 channelType[channelCtrlBlk->channelType], 0, 0);
924
925 channelCtrlBlk->healthMonitorMsg->callback = dxeTXHealthMonitor;
926 status = wpalPostTxMsg(WDI_GET_PAL_CTX(),
927 channelCtrlBlk->healthMonitorMsg);
928 if (eWLAN_PAL_STATUS_SUCCESS != status)
929 {
930 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
931 "TX Low resource Kick DXE MSG Serialize fail",
932 status, 0, 0);
933 }
934
935 return;
936}
937
938/*==========================================================================
939 @ Function Name
Jeff Johnson295189b2012-06-20 16:38:30 -0700940 dxeCtrlBlkAlloc
941
942 @ Description
943 Allocate DXE Control block
944 DXE control block will used by Host DXE driver only, internal structure
945 Will make ring linked list
946
947 @ Parameters
948 WLANDXE_CtrlBlkType *dxeCtrlBlk,
949 DXE host driver main control block
950 WLANDXE_ChannelCBType *channelEntry
951 Channel specific control block
952
953 @ Return
954 wpt_status
955
956===========================================================================*/
957static wpt_status dxeCtrlBlkAlloc
958(
959 WLANDXE_CtrlBlkType *dxeCtrlBlk,
960 WLANDXE_ChannelCBType *channelEntry
961)
962{
963 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
964 unsigned int idx, fIdx;
965 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
966 WLANDXE_DescCtrlBlkType *freeCtrlBlk = NULL;
967 WLANDXE_DescCtrlBlkType *prevCtrlBlk = NULL;
968 WLANDXE_DescCtrlBlkType *nextCtrlBlk = NULL;
969
970 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700971 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700972
973 /* Sanity check */
974 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
975 {
976 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
977 "dxeCtrlBlkAlloc Channel Entry is not valid");
978 return eWLAN_PAL_STATUS_E_INVAL;
979 }
980
981 /* Allocate pre asigned number of control blocks */
982 for(idx = 0; idx < channelEntry->numDesc; idx++)
983 {
984 currentCtrlBlk = (WLANDXE_DescCtrlBlkType *)wpalMemoryAllocate(sizeof(WLANDXE_DescCtrlBlkType));
985 if(NULL == currentCtrlBlk)
986 {
987 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
988 "dxeCtrlBlkOpen MemAlloc Fail for channel %d",
989 channelEntry->channelType);
990 freeCtrlBlk = channelEntry->headCtrlBlk;
991 for(fIdx = 0; fIdx < idx; fIdx++)
992 {
993 if(NULL == freeCtrlBlk)
994 {
995 break;
996 }
997
998 nextCtrlBlk = freeCtrlBlk->nextCtrlBlk;
999 wpalMemoryFree((void *)freeCtrlBlk);
1000 freeCtrlBlk = nextCtrlBlk;
1001 }
1002 return eWLAN_PAL_STATUS_E_FAULT;
1003 }
1004
1005 memset((wpt_uint8 *)currentCtrlBlk, 0, sizeof(WLANDXE_DescCtrlBlkType));
1006 /* Initialize common elements first */
1007 currentCtrlBlk->xfrFrame = NULL;
1008 currentCtrlBlk->linkedDesc = NULL;
1009 currentCtrlBlk->linkedDescPhyAddr = 0;
1010 currentCtrlBlk->ctrlBlkOrder = idx;
1011
1012 /* This is the first control block allocated
1013 * Next Control block is not allocated yet
1014 * head and tail must be first control block */
1015 if(0 == idx)
1016 {
1017 currentCtrlBlk->nextCtrlBlk = NULL;
1018 channelEntry->headCtrlBlk = currentCtrlBlk;
1019 channelEntry->tailCtrlBlk = currentCtrlBlk;
1020 }
1021 /* This is not first, not last control block
1022 * previous control block may has next linked block */
1023 else if((0 < idx) && (idx < (channelEntry->numDesc - 1)))
1024 {
1025 prevCtrlBlk->nextCtrlBlk = currentCtrlBlk;
1026 }
1027 /* This is last control blocl
1028 * next control block for the last control block is head, first control block
1029 * then whole linked list made RING */
1030 else if((channelEntry->numDesc - 1) == idx)
1031 {
1032 prevCtrlBlk->nextCtrlBlk = currentCtrlBlk;
1033 currentCtrlBlk->nextCtrlBlk = channelEntry->headCtrlBlk;
1034 }
1035 else
1036 {
1037 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1038 "dxeCtrlBlkOpen Invalid Ctrl Blk location %d",
1039 channelEntry->channelType);
1040 wpalMemoryFree(currentCtrlBlk);
1041 return eWLAN_PAL_STATUS_E_FAULT;
1042 }
1043
1044 prevCtrlBlk = currentCtrlBlk;
1045 channelEntry->numFreeDesc++;
1046 }
1047
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001048 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,"%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001049 return status;
1050}
1051
1052/*==========================================================================
1053 @ Function Name
1054 dxeDescLinkAlloc
1055
1056 @ Description
1057 Allocate DXE descriptor
1058 DXE descriptor will be shared by DXE host driver and RIVA DXE engine
1059 Will make RING linked list
1060 Will be linked with Descriptor control block one by one
1061
1062 @ Parameters
1063 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1064 DXE host driver main control block
1065 WLANDXE_ChannelCBType *channelEntry
1066 Channel specific control block
1067 @ Return
1068 wpt_status
1069
1070===========================================================================*/
1071static wpt_status dxeDescAllocAndLink
1072(
1073 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1074 WLANDXE_ChannelCBType *channelEntry
1075)
1076{
1077 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1078 WLANDXE_DescType *currentDesc = NULL;
1079 WLANDXE_DescType *prevDesc = NULL;
1080 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
1081 unsigned int idx;
1082 void *physAddress = NULL;
1083#ifdef WLANDXE_TEST_CHANNEL_ENABLE
1084 WLANDXE_ChannelCBType *testTXChannelCB = &dxeCtrlBlk->dxeChannel[WDTS_CHANNEL_H2H_TEST_TX];
1085 WLANDXE_DescCtrlBlkType *currDescCtrlBlk = testTXChannelCB->headCtrlBlk;
1086#endif /* WLANDXE_TEST_CHANNEL_ENABLE*/
1087
1088 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001089 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001090
1091 /* Sanity Check */
1092 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
1093 {
1094 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1095 "dxeDescLinkAlloc Channel Entry is not valid");
1096 return eWLAN_PAL_STATUS_E_INVAL;
1097 }
1098
1099 currentCtrlBlk = channelEntry->headCtrlBlk;
1100
1101#if !(defined(FEATURE_R33D) || defined(WLANDXE_TEST_CHANNEL_ENABLE))
1102 /* allocate all DXE descriptors for this channel in one chunk */
1103 channelEntry->descriptorAllocation = (WLANDXE_DescType *)
1104 wpalDmaMemoryAllocate(sizeof(WLANDXE_DescType)*channelEntry->numDesc,
1105 &physAddress);
1106 if(NULL == channelEntry->descriptorAllocation)
1107 {
1108 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1109 "dxeDescLinkAlloc Descriptor Alloc Fail");
1110 return eWLAN_PAL_STATUS_E_RESOURCES;
1111 }
1112 currentDesc = channelEntry->descriptorAllocation;
1113#endif
1114
1115 /* Allocate pre asigned number of descriptor */
1116 for(idx = 0; idx < channelEntry->numDesc; idx++)
1117 {
1118#ifndef FEATURE_R33D
1119#ifndef WLANDXE_TEST_CHANNEL_ENABLE
1120 // descriptors were allocated in a chunk -- use the current one
1121 memset((wpt_uint8 *)currentDesc, 0, sizeof(WLANDXE_DescType));
1122 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
1123 "Allocated Descriptor VA 0x%x, PA 0x%x", currentDesc, physAddress);
1124#else
1125 if(WDTS_CHANNEL_H2H_TEST_RX != channelEntry->channelType)
1126 {
1127 // allocate a descriptor
1128 currentDesc = (WLANDXE_DescType *)wpalDmaMemoryAllocate(sizeof(WLANDXE_DescType),
1129 &physAddress);
1130 memset((wpt_uint8 *)currentDesc, 0, sizeof(WLANDXE_DescType));
1131 }
1132 else
1133 {
1134 currentDesc = currDescCtrlBlk->linkedDesc;
1135 physAddress = (void *)currDescCtrlBlk->linkedDescPhyAddr;
1136 currDescCtrlBlk = (WLANDXE_DescCtrlBlkType *)currDescCtrlBlk->nextCtrlBlk;
1137 }
1138#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
1139#else
1140#ifndef WLANDXE_TEST_CHANNEL_ENABLE
1141 currentDesc = (WLANDXE_DescType *)wpalAcpuDdrDxeDescMemoryAllocate(&physAddress);
1142 memset((wpt_uint8 *)currentDesc, 0, sizeof(WLANDXE_DescType));
1143 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
1144 "Allocated Descriptor VA 0x%x, PA 0x%x", currentDesc, physAddress);
1145#else
1146 if(WDTS_CHANNEL_H2H_TEST_RX != channelEntry->channelType)
1147 {
1148 currentDesc = (WLANDXE_DescType *)wpalAcpuDdrDxeDescMemoryAllocate(&physAddress);
1149 memset((wpt_uint8 *)currentDesc, 0, sizeof(WLANDXE_DescType));
1150 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
1151 "Allocated Descriptor VA 0x%x, PA 0x%x", currentDesc, physAddress);
1152 }
1153 else
1154 {
1155 currentDesc = currDescCtrlBlk->linkedDesc;
1156 physAddress = (void *)currDescCtrlBlk->linkedDescPhyAddr;
1157 currDescCtrlBlk = (WLANDXE_DescCtrlBlkType *)currDescCtrlBlk->nextCtrlBlk;
1158 }
1159#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
1160#endif /* FEATURE_R33D */
1161 if(NULL == currentDesc)
1162 {
1163 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1164 "dxeDescLinkAlloc MemAlloc Fail for channel %d",
1165 channelEntry->channelType);
1166 return eWLAN_PAL_STATUS_E_FAULT;
1167 }
1168
Jeff Johnson295189b2012-06-20 16:38:30 -07001169 currentCtrlBlk->linkedDesc = currentDesc;
1170 currentCtrlBlk->linkedDescPhyAddr = (unsigned int)physAddress;
1171 /* First descriptor, next none
1172 * descriptor bottom location is first descriptor address */
1173 if(0 == idx)
1174 {
1175 currentDesc->dxedesc.dxe_short_desc.phyNextL = 0;
1176 channelEntry->DescBottomLoc = currentDesc;
1177 channelEntry->descBottomLocPhyAddr = (unsigned int)physAddress;
1178 }
1179 /* Not first, not last descriptor
1180 * may make link for previous descriptor with current descriptor
1181 * ENDIAN SWAP needed ????? */
1182 else if((0 < idx) && (idx < (channelEntry->numDesc - 1)))
1183 {
1184 prevDesc->dxedesc.dxe_short_desc.phyNextL =
1185 WLANDXE_U32_SWAP_ENDIAN((wpt_uint32)physAddress);
1186 }
1187 /* Last descriptor
1188 * make a ring by asign next pointer as first descriptor
1189 * ENDIAN SWAP NEEDED ??? */
1190 else if((channelEntry->numDesc - 1) == idx)
1191 {
1192 prevDesc->dxedesc.dxe_short_desc.phyNextL =
1193 WLANDXE_U32_SWAP_ENDIAN((wpt_uint32)physAddress);
1194 currentDesc->dxedesc.dxe_short_desc.phyNextL =
1195 WLANDXE_U32_SWAP_ENDIAN((wpt_uint32)channelEntry->headCtrlBlk->linkedDescPhyAddr);
1196 }
1197
1198 /* If Current Channel is RX channel PAL Packet and OS packet buffer should be
1199 * Pre allocated and physical address must be assigned into
1200 * Corresponding DXE Descriptor */
1201#ifdef WLANDXE_TEST_CHANNEL_ENABLE
1202 if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
1203 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType) ||
1204 (WDTS_CHANNEL_H2H_TEST_RX == channelEntry->channelType))
1205#else
1206 if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
1207 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType))
1208#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
1209 {
1210 status = dxeRXFrameSingleBufferAlloc(dxeCtrlBlk,
1211 channelEntry,
1212 currentCtrlBlk);
1213 if( !WLAN_PAL_IS_STATUS_SUCCESS(status) )
1214 {
1215 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1216 "dxeDescLinkAlloc RX Buffer Alloc Fail for channel %d",
1217 channelEntry->channelType);
1218 return status;
1219 }
1220 --channelEntry->numFreeDesc;
1221 }
1222
Leo Chang7e05f212013-07-01 19:54:15 -07001223 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
1224 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
1225 {
1226 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write;
1227 currentDesc->dxedesc.dxe_short_desc.dstMemAddrL = channelEntry->extraConfig.refWQ_swapped;
1228 }
1229 else if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
1230 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType))
1231 {
1232 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_read;
1233 currentDesc->dxedesc.dxe_short_desc.srcMemAddrL = channelEntry->extraConfig.refWQ_swapped;
1234 }
1235 else
1236 {
1237 /* Just in case. H2H Test RX channel, do nothing
1238 * By Definition this must not happen */
1239 }
1240
Jeff Johnson295189b2012-06-20 16:38:30 -07001241 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
1242 prevDesc = currentDesc;
1243
1244#ifndef FEATURE_R33D
1245#ifndef WLANDXE_TEST_CHANNEL_ENABLE
1246 // advance to the next pre-allocated descriptor in the chunk
1247 currentDesc++;
1248 physAddress = ((wpt_int8 *)physAddress) + sizeof(WLANDXE_DescType);
1249#endif
1250#endif
1251 }
1252
1253 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001254 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001255 return status;
1256}
1257
1258/*==========================================================================
1259 @ Function Name
1260
1261 @ Description
1262
1263 @ Parameters
1264
1265 @ Return
1266 wpt_status
1267
1268===========================================================================*/
1269static wpt_status dxeSetInterruptPath
1270(
1271 WLANDXE_CtrlBlkType *dxeCtrlBlk
1272)
1273{
1274 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1275 wpt_uint32 interruptPath = 0;
1276 wpt_uint32 idx;
1277 WLANDXE_ChannelCBType *channelEntry = NULL;
1278
1279 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001280 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001281
1282 for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++)
1283 {
1284 channelEntry = &dxeCtrlBlk->dxeChannel[idx];
1285#ifdef WLANDXE_TEST_CHANNEL_ENABLE
1286 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
1287 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType) ||
1288 (WDTS_CHANNEL_H2H_TEST_TX == channelEntry->channelType))
1289#else
1290 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
1291 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
1292#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
1293 {
1294 interruptPath |= (1 << channelEntry->assignedDMAChannel);
1295 }
1296 else if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
1297 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType))
1298 {
1299 interruptPath |= (1 << (channelEntry->assignedDMAChannel + 16));
1300 }
1301 else
1302 {
1303 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1304 "H2H TEST RX???? %d", channelEntry->channelType);
1305 }
1306 }
1307 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
1308 "Interrupt Path Must be 0x%x", interruptPath);
1309 dxeCtrlBlk->interruptPath = interruptPath;
1310 wpalWriteRegister(WLANDXE_CCU_DXE_INT_SELECT, interruptPath);
1311
1312 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001313 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001314 return status;
1315}
1316
1317/*==========================================================================
1318 @ Function Name
1319 dxeEngineCoreStart
1320
1321 @ Description
1322 Trigger to start RIVA DXE Hardware
1323
1324 @ Parameters
1325 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1326 DXE host driver main control block
1327
1328 @ Return
1329 wpt_status
1330
1331===========================================================================*/
1332static wpt_status dxeEngineCoreStart
1333(
1334 WLANDXE_CtrlBlkType *dxeCtrlBlk
1335)
1336{
1337 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1338 wpt_uint32 registerData = 0;
1339
1340 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001341 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001342
1343 /* START This core init is not needed for the integrated system */
1344 /* Reset First */
1345 registerData = WLANDXE_DMA_CSR_RESET_MASK;
1346 wpalWriteRegister(WALNDEX_DMA_CSR_ADDRESS,
1347 registerData);
1348
1349 registerData = WLANDXE_DMA_CSR_EN_MASK;
1350 registerData |= WLANDXE_DMA_CSR_ECTR_EN_MASK;
1351 registerData |= WLANDXE_DMA_CSR_TSTMP_EN_MASK;
1352 registerData |= WLANDXE_DMA_CSR_H2H_SYNC_EN_MASK;
1353
1354 registerData = 0x00005c89;
1355 wpalWriteRegister(WALNDEX_DMA_CSR_ADDRESS,
1356 registerData);
1357
1358 /* Is This needed?
1359 * Not sure, revisit with integrated system */
1360 /* END This core init is not needed for the integrated system */
1361
1362 dxeSetInterruptPath(dxeCtrlBlk);
1363 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001364 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001365 return status;
1366}
1367
1368/*==========================================================================
1369 @ Function Name
1370 dxeChannelInitProgram
1371
1372 @ Description
1373 Program RIVA DXE engine register with initial value
1374 What must be programmed
1375 - Source Address (SADRL, chDXESadrlRegAddr)
1376 - Destination address (DADRL, chDXEDadrlRegAddr)
1377 - Next Descriptor address (DESCL, chDXEDesclRegAddr)
1378 - current descriptor address (LST_DESCL, chDXELstDesclRegAddr)
1379
1380 Not need to program now
1381 - Channel Control register (CH_CTRL, chDXECtrlRegAddr)
1382 TX : Have to program to trigger send out frame
1383 RX : programmed by DXE engine
1384
1385 @ Parameters
1386 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1387 DXE host driver main control block
1388 WLANDXE_ChannelCBType *channelEntry
1389 Channel specific control block
1390 @ Return
1391 wpt_status
1392
1393===========================================================================*/
1394static wpt_status dxeChannelInitProgram
1395(
1396 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1397 WLANDXE_ChannelCBType *channelEntry
1398)
1399{
1400 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1401 wpt_uint32 idx;
1402 WLANDXE_DescType *currentDesc = NULL;
1403 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
1404
1405 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001406 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001407
1408 /* Sanity Check */
1409 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
1410 {
1411 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1412 "dxeChannelInitProgram Channel Entry is not valid");
1413 return eWLAN_PAL_STATUS_E_INVAL;
1414 }
1415
1416 /* Program Source address and destination adderss */
1417 if(!channelEntry->channelConfig.useShortDescFmt)
1418 {
1419 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1420 "dxeChannelInitProgram Long Descriptor not support yet");
1421 return eWLAN_PAL_STATUS_E_FAILURE;
1422 }
1423
1424 /* Common register area */
1425 /* Next linked list Descriptor pointer */
1426 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
1427 channelEntry->headCtrlBlk->linkedDescPhyAddr);
1428 if(eWLAN_PAL_STATUS_SUCCESS != status)
1429 {
1430 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1431 "dxeChannelInitProgram Write DESC Address register fail");
1432 return status;
1433 }
1434
1435 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
1436 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
1437 {
1438 /* Program default registers */
1439 /* TX DMA channel, DMA destination address is work Q */
1440 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrlRegAddr,
1441 channelEntry->channelConfig.refWQ);
1442 if(eWLAN_PAL_STATUS_SUCCESS != status)
1443 {
1444 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1445 "dxeChannelInitProgram Write TX DAddress register fail");
1446 return status;
1447 }
1448 }
1449 else if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
1450 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType))
1451 {
1452 /* Initialize Descriptor control Word First */
1453 currentCtrlBlk = channelEntry->headCtrlBlk;
1454 for(idx = 0; idx < channelEntry->channelConfig.nDescs; idx++)
1455 {
1456 currentDesc = currentCtrlBlk->linkedDesc;
1457 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
1458 }
1459
1460 /* RX DMA channel, DMA source address is work Q */
1461 status = wpalWriteRegister(channelEntry->channelRegister.chDXESadrlRegAddr,
1462 channelEntry->channelConfig.refWQ);
1463 if(eWLAN_PAL_STATUS_SUCCESS != status)
1464 {
1465 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1466 "dxeChannelInitProgram Write RX SAddress WQ register fail");
1467 return status;
1468 }
1469
1470 /* RX DMA channel, Program pre allocated destination Address */
1471 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrlRegAddr,
1472 WLANDXE_U32_SWAP_ENDIAN(channelEntry->DescBottomLoc->dxedesc.dxe_short_desc.phyNextL));
1473 if(eWLAN_PAL_STATUS_SUCCESS != status)
1474 {
1475 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1476 "dxeChannelInitProgram Write RX DAddress register fail");
1477 return status;
1478 }
1479
1480 /* RX Channels, default Control registers MUST BE ENABLED */
1481 wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr,
1482 channelEntry->extraConfig.chan_mask);
1483 if(eWLAN_PAL_STATUS_SUCCESS != status)
1484 {
1485 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1486 "dxeChannelInitProgram Write RX Control register fail");
1487 return status;
1488 }
1489 }
1490 else
1491 {
1492 /* H2H test channel, not use work Q */
1493 /* Program pre allocated destination Address */
1494 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrlRegAddr,
1495 WLANDXE_U32_SWAP_ENDIAN(channelEntry->DescBottomLoc->dxedesc.dxe_short_desc.phyNextL));
1496 if(eWLAN_PAL_STATUS_SUCCESS != status)
1497 {
1498 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1499 "dxeChannelInitProgram Write RX DAddress register fail");
1500 return status;
1501 }
1502 }
1503
1504 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001505 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001506 return status;
1507}
1508
1509
1510/*==========================================================================
1511 @ Function Name
1512 dxeChannelStart
1513
1514 @ Description
1515 Start Specific Channel
1516
1517 @ Parameters
1518 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1519 DXE host driver main control block
1520 WLANDXE_ChannelCBType *channelEntry
1521 Channel specific control block
1522
1523 @ Return
1524 wpt_status
1525
1526===========================================================================*/
1527static wpt_status dxeChannelStart
1528(
1529 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1530 WLANDXE_ChannelCBType *channelEntry
1531)
1532{
1533 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1534 wpt_uint32 regValue = 0;
1535 wpt_uint32 intMaskVal = 0;
1536
1537 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001538 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001539
1540 channelEntry->extraConfig.chEnabled = eWLAN_PAL_TRUE;
1541 channelEntry->extraConfig.chConfigured = eWLAN_PAL_TRUE;
1542
1543 /* Enable individual channel
1544 * not to break current channel setup, first read register */
1545 status = wpalReadRegister(WALNDEX_DMA_CH_EN_ADDRESS,
1546 &regValue);
1547 if(eWLAN_PAL_STATUS_SUCCESS != status)
1548 {
1549 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1550 "dxeChannelStart Read Channel Enable register fail");
1551 return status;
1552 }
1553
1554 /* Enable Channel specific Interrupt */
1555 status = wpalReadRegister(WLANDXE_INT_MASK_REG_ADDRESS,
1556 &intMaskVal);
1557 if(eWLAN_PAL_STATUS_SUCCESS != status)
1558 {
1559 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1560 "dxeChannelStart Read INT_MASK register fail");
1561 return status;
1562 }
1563 intMaskVal |= channelEntry->extraConfig.intMask;
1564 status = wpalWriteRegister(WLANDXE_INT_MASK_REG_ADDRESS,
1565 intMaskVal);
1566 if(eWLAN_PAL_STATUS_SUCCESS != status)
1567 {
1568 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1569 "dxeChannelStart Write INT_MASK register fail");
1570 return status;
1571 }
1572
1573 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001574 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001575 return status;
1576}
1577
1578/*==========================================================================
1579 @ Function Name
1580 dxeChannelStop
1581
1582 @ Description
1583 Stop Specific Channel
1584
1585 @ Parameters
1586 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1587 DXE host driver main control block
1588 WLANDXE_ChannelCBType *channelEntry
1589 Channel specific control block
1590
1591 @ Return
1592 wpt_status
1593
1594===========================================================================*/
1595static wpt_status dxeChannelStop
1596(
1597 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1598 WLANDXE_ChannelCBType *channelEntry
1599)
1600{
1601 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1602 wpt_uint32 intMaskVal = 0;
1603
1604 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001605 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001606
1607 /* Sanity */
1608 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
1609 {
1610 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1611 "dxeChannelStop Invalid arg input");
1612 return eWLAN_PAL_STATUS_E_INVAL;
1613 }
1614
Madan Mohan Koyyalamudid57ae632012-11-06 18:42:48 -08001615 if ( (channelEntry->extraConfig.chEnabled != eWLAN_PAL_TRUE) ||
1616 (channelEntry->extraConfig.chConfigured != eWLAN_PAL_TRUE))
1617 {
1618 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1619 "dxeChannelStop channels are not enabled ");
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08001620 return status;
Madan Mohan Koyyalamudid57ae632012-11-06 18:42:48 -08001621 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001622 /* Maskout interrupt */
1623 status = wpalReadRegister(WLANDXE_INT_MASK_REG_ADDRESS,
1624 &intMaskVal);
1625 if(eWLAN_PAL_STATUS_SUCCESS != status)
1626 {
1627 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1628 "dxeChannelStop Read INT_MASK register fail");
1629 return status;
1630 }
1631 intMaskVal ^= channelEntry->extraConfig.intMask;
1632 status = wpalWriteRegister(WLANDXE_INT_MASK_REG_ADDRESS,
1633 intMaskVal);
1634 if(eWLAN_PAL_STATUS_SUCCESS != status)
1635 {
1636 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1637 "dxeChannelStop Write INT_MASK register fail");
1638 return status;
1639 }
1640
1641 channelEntry->extraConfig.chEnabled = eWLAN_PAL_FALSE;
1642
1643 /* Stop Channel ??? */
1644 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001645 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001646 return status;
1647}
1648
1649/*==========================================================================
1650 @ Function Name
1651 dxeChannelClose
1652
1653 @ Description
1654 Close Specific Channel
1655 Free pre allocated RX frame buffer if RX channel
1656 Free DXE descriptor for each channel
1657 Free Descriptor control block for each channel
1658
1659 @ Parameters
1660 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1661 DXE host driver main control block
1662 WLANDXE_ChannelCBType *channelEntry
1663 Channel specific control block
1664
1665 @ Return
1666 wpt_status
1667
1668===========================================================================*/
1669static wpt_status dxeChannelClose
1670(
1671 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1672 WLANDXE_ChannelCBType *channelEntry
1673)
1674{
1675 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1676 wpt_uint32 idx;
1677 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
1678 WLANDXE_DescCtrlBlkType *nextCtrlBlk = NULL;
1679 WLANDXE_DescType *currentDescriptor = NULL;
1680 WLANDXE_DescType *nextDescriptor = NULL;
1681
1682 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001683 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001684
1685 /* Sanity */
1686 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
1687 {
1688 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1689 "dxeChannelStop Invalid arg input");
1690 return eWLAN_PAL_STATUS_E_INVAL;
1691 }
1692
1693 currentCtrlBlk = channelEntry->headCtrlBlk;
1694 if(NULL != currentCtrlBlk)
1695 {
1696 currentDescriptor = currentCtrlBlk->linkedDesc;
1697 for(idx = 0; idx < channelEntry->numDesc; idx++)
1698 {
1699 if (idx + 1 != channelEntry->numDesc)
1700 {
1701 nextCtrlBlk = currentCtrlBlk->nextCtrlBlk;
1702 nextDescriptor = nextCtrlBlk->linkedDesc;
1703 }
1704 else
1705 {
1706 nextCtrlBlk = NULL;
1707 nextDescriptor = NULL;
1708 }
1709 if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
1710 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType))
1711 {
1712 if (NULL != currentCtrlBlk->xfrFrame)
1713 {
1714 wpalUnlockPacket(currentCtrlBlk->xfrFrame);
1715 wpalPacketFree(currentCtrlBlk->xfrFrame);
1716 }
1717 }
1718 /*
1719 * It is the responsibility of DXE to walk through the
1720 * descriptor chain and unlock any pending packets (if
1721 * locked).
1722 */
1723 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
1724 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
1725 {
1726 if((NULL != currentCtrlBlk->xfrFrame) &&
1727 (eWLAN_PAL_STATUS_SUCCESS == wpalIsPacketLocked(currentCtrlBlk->xfrFrame)))
1728 {
1729 wpalUnlockPacket(currentCtrlBlk->xfrFrame);
1730 wpalPacketFree(currentCtrlBlk->xfrFrame);
1731 }
1732 }
1733#if (defined(FEATURE_R33D) || defined(WLANDXE_TEST_CHANNEL_ENABLE))
1734 // descriptors allocated individually so free them individually
1735 wpalDmaMemoryFree(currentDescriptor);
1736#endif
1737 wpalMemoryFree(currentCtrlBlk);
1738
1739 currentCtrlBlk = nextCtrlBlk;
1740 currentDescriptor = nextDescriptor;
Madan Mohan Koyyalamudi74719a12012-10-21 12:09:36 -07001741 if(NULL == currentCtrlBlk)
1742 {
1743 /* Already reach last of the control block
1744 * Not need to process anymore, break */
1745 break;
1746 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001747 }
1748 }
1749
1750#if !(defined(FEATURE_R33D) || defined(WLANDXE_TEST_CHANNEL_ENABLE))
1751 // descriptors were allocated as a single chunk so free the chunk
1752 if(NULL != channelEntry->descriptorAllocation)
1753 {
1754 wpalDmaMemoryFree(channelEntry->descriptorAllocation);
1755 }
1756#endif
1757
1758 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001759 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001760 return status;
1761}
1762
1763/*==========================================================================
1764 @ Function Name
1765 dxeChannelCleanInt
1766
1767 @ Description
1768 Clean up interrupt from RIVA HW
1769 After Host finish to handle interrupt, interrupt signal must be cleaned up
1770 Otherwise next interrupt will not be generated
1771
1772 @ Parameters
1773 WLANDXE_ChannelCBType *channelEntry
1774 Channel specific control block
1775 wpt_uint32 *chStat
1776 Channel Status register value
1777
1778 @ Return
1779 wpt_status
1780
1781===========================================================================*/
1782static wpt_status dxeChannelCleanInt
1783(
1784 WLANDXE_ChannelCBType *channelEntry,
1785 wpt_uint32 *chStat
1786)
1787{
1788 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1789
1790 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001791 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001792
1793 /* Read Channel Status Register to know why INT Happen */
1794 status = wpalReadRegister(channelEntry->channelRegister.chDXEStatusRegAddr,
1795 chStat);
1796 if(eWLAN_PAL_STATUS_SUCCESS != status)
1797 {
1798 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1799 "dxeChannelCleanInt Read CH STAT register fail");
1800 return eWLAN_PAL_STATUS_E_FAULT;
1801 }
1802 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
1803 "%s Channel INT Clean, Status 0x%x",
1804 channelType[channelEntry->channelType], *chStat);
1805
1806 /* Clean up all the INT within this channel */
1807 status = wpalWriteRegister(WLANDXE_INT_CLR_ADDRESS,
1808 (1 << channelEntry->assignedDMAChannel));
1809 if(eWLAN_PAL_STATUS_SUCCESS != status)
1810 {
1811 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1812 "dxeChannelCleanInt Write CH Clean register fail");
1813 return eWLAN_PAL_STATUS_E_FAULT;
1814 }
1815
Jeff Johnsone7245742012-09-05 17:12:55 -07001816 /* Clean up Error INT Bit */
1817 if(WLANDXE_CH_STAT_INT_ERR_MASK & *chStat)
1818 {
1819 status = wpalWriteRegister(WLANDXE_INT_ERR_CLR_ADDRESS,
1820 (1 << channelEntry->assignedDMAChannel));
1821 if(eWLAN_PAL_STATUS_SUCCESS != status)
1822 {
1823 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1824 "dxeChannelCleanInt Read CH STAT register fail");
1825 return eWLAN_PAL_STATUS_E_FAULT;
1826 }
1827 }
1828
1829 /* Clean up DONE INT Bit */
1830 if(WLANDXE_CH_STAT_INT_DONE_MASK & *chStat)
1831 {
1832 status = wpalWriteRegister(WLANDXE_INT_DONE_CLR_ADDRESS,
1833 (1 << channelEntry->assignedDMAChannel));
1834 if(eWLAN_PAL_STATUS_SUCCESS != status)
1835 {
1836 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1837 "dxeChannelCleanInt Read CH STAT register fail");
1838 return eWLAN_PAL_STATUS_E_FAULT;
1839 }
1840 }
1841
1842 /* Clean up ED INT Bit */
1843 if(WLANDXE_CH_STAT_INT_ED_MASK & *chStat)
1844 {
1845 status = wpalWriteRegister(WLANDXE_INT_ED_CLR_ADDRESS,
1846 (1 << channelEntry->assignedDMAChannel));
1847 if(eWLAN_PAL_STATUS_SUCCESS != status)
1848 {
1849 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1850 "dxeChannelCleanInt Read CH STAT register fail");
1851 return eWLAN_PAL_STATUS_E_FAULT;
1852 }
1853 }
1854
Jeff Johnson295189b2012-06-20 16:38:30 -07001855 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001856 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001857 return status;
1858}
1859
1860/*==========================================================================
1861 @ Function Name
1862 dxeRXPacketAvailableCB
1863
1864 @ Description
1865 If RX frame handler encounts RX buffer pool empty condition,
1866 DXE RX handle loop will be blocked till get available RX buffer pool.
1867 When new RX buffer pool available, Packet available CB function will
1868 be called.
1869
1870 @ Parameters
1871 wpt_packet *freePacket
1872 Newly allocated RX buffer
1873 v_VOID_t *usrData
1874 DXE context
1875
1876 @ Return
1877 NONE
1878
1879===========================================================================*/
1880void dxeRXPacketAvailableCB
1881(
1882 wpt_packet *freePacket,
1883 v_VOID_t *usrData
1884)
1885{
1886 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
1887 wpt_status status;
1888
1889 /* Simple Sanity */
1890 if((NULL == freePacket) || (NULL == usrData))
1891 {
1892 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1893 "Get Free RX Buffer fail, Critical Error");
1894 HDXE_ASSERT(0);
1895 return;
1896 }
1897
1898 dxeCtxt = (WLANDXE_CtrlBlkType *)usrData;
1899
1900 if(WLANDXE_CTXT_COOKIE != dxeCtxt->dxeCookie)
1901 {
1902 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1903 "DXE Context data corrupted, Critical Error");
1904 HDXE_ASSERT(0);
1905 return;
1906 }
1907
1908 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
1909 "DXE RX packet available, post MSG to RX Thread");
1910
1911 dxeCtxt->freeRXPacket = freePacket;
1912
1913 /* Serialize RX Packet Available message upon RX thread */
1914 HDXE_ASSERT(NULL != dxeCtxt->rxPktAvailMsg);
1915
1916 status = wpalPostRxMsg(WDI_GET_PAL_CTX(),
1917 dxeCtxt->rxPktAvailMsg);
1918 if(eWLAN_PAL_STATUS_SUCCESS != status)
1919 {
1920 HDXE_ASSERT(eWLAN_PAL_STATUS_SUCCESS == status);
1921 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1922 "dxeRXPacketAvailableCB serialize fail");
1923 }
1924
1925 return;
1926}
1927
1928/*==========================================================================
1929 @ Function Name
1930 dxeRXFrameSingleBufferAlloc
1931
1932 @ Description
1933 Allocate Platform packet buffer to prepare RX frame
1934 RX frame memory space must be pre allocted and must be asigned to
1935 descriptor
1936 then whenever DMA engine want to tranfer frame from BMU,
1937 buffer must be ready
1938
1939 @ Parameters
1940 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1941 DXE host driver main control block
1942 WLANDXE_ChannelCBType *channelEntry
1943 Channel specific control block
1944 WLANDXE_DescCtrlBlkType currentCtrlBlock
1945 current control block which have to be asigned
1946 frame buffer
1947
1948 @ Return
1949 wpt_status
1950
1951===========================================================================*/
1952static wpt_status dxeRXFrameSingleBufferAlloc
1953(
1954 WLANDXE_CtrlBlkType *dxeCtxt,
1955 WLANDXE_ChannelCBType *channelEntry,
1956 WLANDXE_DescCtrlBlkType *currentCtrlBlock
1957)
1958{
1959 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1960 wpt_packet *currentPalPacketBuffer = NULL;
1961 WLANDXE_DescType *currentDesc = NULL;
1962#ifdef FEATURE_R33D
1963 wpt_uint32 virtualAddressPCIe;
1964 wpt_uint32 physicalAddressPCIe;
1965#else
1966 wpt_iterator iterator;
1967 wpt_uint32 allocatedSize = 0;
1968 void *physAddress = NULL;
1969#endif /* FEATURE_R33D */
1970
Jeff Johnson295189b2012-06-20 16:38:30 -07001971
1972 currentDesc = currentCtrlBlock->linkedDesc;
1973
Leo Chang7e05f212013-07-01 19:54:15 -07001974 if(currentDesc->descCtrl.valid)
1975 {
1976 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1977 "This Descriptor is valid, Do not refill");
1978 return eWLAN_PAL_STATUS_E_EXISTS;
1979 }
1980
Jeff Johnson295189b2012-06-20 16:38:30 -07001981 /* First check if a packet pointer has already been provided by a previously
1982 invoked Rx packet available callback. If so use that packet. */
1983 if(dxeCtxt->rxPalPacketUnavailable && (NULL != dxeCtxt->freeRXPacket))
1984 {
1985 currentPalPacketBuffer = dxeCtxt->freeRXPacket;
1986 dxeCtxt->rxPalPacketUnavailable = eWLAN_PAL_FALSE;
1987 dxeCtxt->freeRXPacket = NULL;
1988 }
1989 else if(!dxeCtxt->rxPalPacketUnavailable)
1990 {
1991 /* Allocate platform Packet buffer and OS Frame Buffer at here */
1992 currentPalPacketBuffer = wpalPacketAlloc(eWLAN_PAL_PKT_TYPE_RX_RAW,
1993 WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE,
1994 dxeRXPacketAvailableCB,
1995 (void *)dxeCtxt);
1996
1997 if(NULL == currentPalPacketBuffer)
1998 {
1999 dxeCtxt->rxPalPacketUnavailable = eWLAN_PAL_TRUE;
2000 }
2001 }
2002
2003 if(NULL == currentPalPacketBuffer)
2004 {
Jeff Johnson295189b2012-06-20 16:38:30 -07002005 return eWLAN_PAL_STATUS_E_RESOURCES;
2006 }
2007
2008 currentCtrlBlock->xfrFrame = currentPalPacketBuffer;
2009 currentPalPacketBuffer->pktType = eWLAN_PAL_PKT_TYPE_RX_RAW;
2010 currentPalPacketBuffer->pBD = NULL;
2011 currentPalPacketBuffer->pBDPhys = NULL;
2012 currentPalPacketBuffer->BDLength = 0;
2013#ifdef FEATURE_R33D
2014 status = wpalAllocateShadowRxFrame(currentPalPacketBuffer,
2015 &physicalAddressPCIe,
2016 &virtualAddressPCIe);
2017 HDXE_ASSERT(0 != physicalAddressPCIe);
2018 HDXE_ASSERT(0 != virtualAddressPCIe);
2019 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED,
2020 "RX Shadow Memory Va 0x%x, Pa 0x%x",
2021 virtualAddressPCIe, physicalAddressPCIe);
2022 if(eWLAN_PAL_STATUS_SUCCESS != status)
2023 {
2024 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2025 "dxeRXFrameBufferAlloc Shadow Mem Alloc fail");
2026 return status;
2027 }
2028 currentCtrlBlock->shadowBufferVa = virtualAddressPCIe;
2029 currentPalPacketBuffer->pBDPhys = (void *)physicalAddressPCIe;
2030 memset((wpt_uint8 *)currentCtrlBlock->shadowBufferVa, 0, WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE);
2031#else
2032 status = wpalLockPacketForTransfer(currentPalPacketBuffer);
2033 if(eWLAN_PAL_STATUS_SUCCESS != status)
2034 {
2035 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2036 "dxeRXFrameBufferAlloc unable to lock packet");
2037 return status;
2038 }
2039
2040 /* Init iterator to get physical os buffer address */
2041 status = wpalIteratorInit(&iterator, currentPalPacketBuffer);
2042 if(eWLAN_PAL_STATUS_SUCCESS != status)
2043 {
2044 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2045 "dxeRXFrameBufferAlloc iterator init fail");
2046 return status;
2047 }
2048 status = wpalIteratorNext(&iterator,
2049 currentPalPacketBuffer,
2050 &physAddress,
2051 &allocatedSize);
2052 if(eWLAN_PAL_STATUS_SUCCESS != status)
2053 {
2054 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2055 "dxeRXFrameBufferAlloc iterator Get Next pointer fail");
2056 return status;
2057 }
2058 currentPalPacketBuffer->pBDPhys = physAddress;
2059#endif /* FEATURE_R33D */
2060
2061 /* DXE descriptor must have SWAPPED addres in it's structure
2062 * !!! SWAPPED !!! */
2063 currentDesc->dxedesc.dxe_short_desc.dstMemAddrL =
2064 WLANDXE_U32_SWAP_ENDIAN((wpt_uint32)currentPalPacketBuffer->pBDPhys);
2065
Jeff Johnson295189b2012-06-20 16:38:30 -07002066 return status;
2067}
2068
2069/*==========================================================================
2070 @ Function Name
2071 dxeRXFrameRefillRing
2072
2073 @ Description
2074 Allocate Platform packet buffers to try to fill up the DXE Rx ring
2075
2076 @ Parameters
2077 WLANDXE_CtrlBlkType *dxeCtrlBlk,
2078 DXE host driver main control block
2079 WLANDXE_ChannelCBType *channelEntry
2080 Channel specific control block
2081
2082 @ Return
2083 wpt_status
2084
2085===========================================================================*/
2086static wpt_status dxeRXFrameRefillRing
2087(
2088 WLANDXE_CtrlBlkType *dxeCtxt,
2089 WLANDXE_ChannelCBType *channelEntry
2090)
2091{
2092 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
2093 WLANDXE_DescCtrlBlkType *currentCtrlBlk = channelEntry->tailCtrlBlk;
2094 WLANDXE_DescType *currentDesc = NULL;
2095
2096 while(channelEntry->numFreeDesc > 0)
2097 {
2098 /* Current Control block is free
2099 * and associated frame buffer is not linked with control block anymore
2100 * allocate new frame buffer for current control block */
2101 status = dxeRXFrameSingleBufferAlloc(dxeCtxt,
2102 channelEntry,
2103 currentCtrlBlk);
2104
Leo Chang7e05f212013-07-01 19:54:15 -07002105 if((eWLAN_PAL_STATUS_SUCCESS != status) &&
2106 (eWLAN_PAL_STATUS_E_EXISTS != status))
Jeff Johnson295189b2012-06-20 16:38:30 -07002107 {
2108 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
2109 "dxeRXFrameRefillRing, out of RX buffer pool, break here");
2110 break;
2111 }
2112
Leo Chang7e05f212013-07-01 19:54:15 -07002113 if(eWLAN_PAL_STATUS_E_EXISTS == status)
2114 {
2115 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2116 "dxeRXFrameRefillRing, Descriptor Non-Empry");
2117 }
2118
Jeff Johnson295189b2012-06-20 16:38:30 -07002119 currentDesc = currentCtrlBlk->linkedDesc;
2120 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_read;
2121
2122 /* Issue a dummy read from the DXE descriptor DDR location to ensure
2123 that any posted writes are reflected in memory before DXE looks at
2124 the descriptor. */
2125 if(channelEntry->extraConfig.cw_ctrl_read != currentDesc->descCtrl.ctrl)
2126 {
2127 //HDXE_ASSERT(0);
2128 }
2129
2130 /* Kick off the DXE ring, if not in any power save mode */
Leo Chang094ece82013-04-23 17:57:41 -07002131 if(WLANDXE_POWER_STATE_FULL == dxeCtxt->hostPowerState)
Jeff Johnson295189b2012-06-20 16:38:30 -07002132 {
2133 wpalWriteRegister(WALNDEX_DMA_ENCH_ADDRESS,
2134 1 << channelEntry->assignedDMAChannel);
2135 }
2136 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
Leo Chang7e05f212013-07-01 19:54:15 -07002137 if(eWLAN_PAL_STATUS_E_EXISTS != status)
2138 {
2139 --channelEntry->numFreeDesc;
2140 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002141 }
2142
2143 channelEntry->tailCtrlBlk = currentCtrlBlk;
2144
2145 return status;
2146}
2147
2148/*==========================================================================
Jeff Johnsone7245742012-09-05 17:12:55 -07002149 @ Function Name
2150 dxeRXFrameRouteUpperLayer
2151
2152 @ Description
2153 Test DXE descriptors and if any RX frame pending within RING,
2154 Route to upper layer
2155
2156 @ Parameters
2157 WLANDXE_CtrlBlkType *dxeCtrlBlk,
2158 DXE host driver main control block
2159 WLANDXE_ChannelCBType *channelEntry
2160 Channel specific control block
2161 @ Return
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002162 < 0 Any error happen
Jeff Johnsone7245742012-09-05 17:12:55 -07002163 0 No frame pulled from RX RING
2164 int number of RX frames pulled from RX ring
2165
2166===========================================================================*/
2167static wpt_int32 dxeRXFrameRouteUpperLayer
2168(
2169 WLANDXE_CtrlBlkType *dxeCtxt,
2170 WLANDXE_ChannelCBType *channelEntry
2171)
2172{
2173 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
2174 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
2175 WLANDXE_DescType *currentDesc = NULL;
2176 wpt_uint32 descCtrl, frameCount = 0, i;
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002177 wpt_int32 ret_val = -1;
Jeff Johnsone7245742012-09-05 17:12:55 -07002178
2179 currentCtrlBlk = channelEntry->headCtrlBlk;
2180 currentDesc = currentCtrlBlk->linkedDesc;
2181
2182 /* Descriptoe should be SWAPPED ???? */
2183 descCtrl = currentDesc->descCtrl.ctrl;
2184
2185 /* Get frames while VALID bit is not set (DMA complete) and a data
2186 * associated with it */
2187 while(!(WLANDXE_U32_SWAP_ENDIAN(descCtrl) & WLANDXE_DESC_CTRL_VALID) &&
2188 (eWLAN_PAL_STATUS_SUCCESS == wpalIsPacketLocked(currentCtrlBlk->xfrFrame)) &&
2189 (currentCtrlBlk->xfrFrame->pInternalData != NULL) &&
2190 (frameCount < WLANDXE_MAX_REAPED_RX_FRAMES) )
2191 {
2192 channelEntry->numTotalFrame++;
2193 channelEntry->numFreeDesc++;
2194#ifdef FEATURE_R33D
2195 /* Transfer Size should be */
2196 currentDesc->xfrSize = WLANDXE_U32_SWAP_ENDIAN(WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE);
2197 status = wpalPrepareRxFrame(&currentCtrlBlk->xfrFrame,
2198 (wpt_uint32)currentCtrlBlk->xfrFrame->pBDPhys,
2199 currentCtrlBlk->shadowBufferVa,
2200 WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE);
2201 if(eWLAN_PAL_STATUS_SUCCESS != status)
2202 {
2203 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2204 "dxeRXFrameReady Prepare RX Frame fail");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002205 return ret_val;
Jeff Johnsone7245742012-09-05 17:12:55 -07002206 }
2207 status = wpalFreeRxFrame(currentCtrlBlk->shadowBufferVa);
2208 if(eWLAN_PAL_STATUS_SUCCESS != status)
2209 {
2210 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2211 "dxeRXFrameReady Free Shadow RX Frame fail");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002212 return ret_val;
Jeff Johnsone7245742012-09-05 17:12:55 -07002213 }
2214
2215#else /* FEATURE_R33D */
2216 status = wpalUnlockPacket(currentCtrlBlk->xfrFrame);
2217 if (eWLAN_PAL_STATUS_SUCCESS != status)
2218 {
2219 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2220 "dxeRXFrameReady unable to unlock packet");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002221 return ret_val;
Jeff Johnsone7245742012-09-05 17:12:55 -07002222 }
2223#endif /* FEATURE_R33D */
2224 /* This Descriptor is valid, so linked Control block is also valid
2225 * Linked Control block has pre allocated packet buffer
2226 * So, just let upper layer knows preallocated frame pointer will be OK */
2227 /* Reap Rx frames */
2228 rx_reaped_buf[frameCount] = currentCtrlBlk->xfrFrame;
2229 frameCount++;
Madan Mohan Koyyalamudi0c325532012-09-24 13:24:42 -07002230 currentCtrlBlk->xfrFrame = NULL;
Jeff Johnsone7245742012-09-05 17:12:55 -07002231
2232 /* Now try to refill the ring with empty Rx buffers to keep DXE busy */
Leo Changd6de1c22013-03-21 15:42:41 -07002233 dxeRXFrameRefillRing(dxeCtxt, channelEntry);
Jeff Johnsone7245742012-09-05 17:12:55 -07002234
2235 /* Test next contorl block
2236 * if valid, this control block also has new RX frame must be handled */
2237 currentCtrlBlk = (WLANDXE_DescCtrlBlkType *)currentCtrlBlk->nextCtrlBlk;
2238 currentDesc = currentCtrlBlk->linkedDesc;
2239 descCtrl = currentDesc->descCtrl.ctrl;
2240 }
2241
2242 /* Update head control block
2243 * current control block's valid bit was 0
2244 * next trial first control block must be current control block */
2245 channelEntry->headCtrlBlk = currentCtrlBlk;
2246
2247 /* Deliver all the reaped RX frames to upper layers */
2248 i = 0;
Leo Changd6de1c22013-03-21 15:42:41 -07002249 while(i < frameCount)
2250 {
Jeff Johnsone7245742012-09-05 17:12:55 -07002251 dxeCtxt->rxReadyCB(dxeCtxt->clientCtxt, rx_reaped_buf[i], channelEntry->channelType);
2252 i++;
2253 }
2254
2255 return frameCount;
2256}
2257
2258/*==========================================================================
Jeff Johnson295189b2012-06-20 16:38:30 -07002259 @ Function Name
2260 dxeRXFrameReady
2261
2262 @ Description
2263 Pop frame from descriptor and route frame to upper transport layer
2264 Assign new platform packet buffer into used descriptor
2265 Actual frame pop and resource realloc
2266
2267 @ Parameters
2268 WLANDXE_CtrlBlkType *dxeCtrlBlk,
2269 DXE host driver main control block
2270 WLANDXE_ChannelCBType *channelEntry
2271 Channel specific control block
2272
2273 @ Return
2274 wpt_status
2275
2276===========================================================================*/
2277static wpt_status dxeRXFrameReady
2278(
2279 WLANDXE_CtrlBlkType *dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002280 WLANDXE_ChannelCBType *channelEntry,
2281 wpt_uint32 chStat
Jeff Johnson295189b2012-06-20 16:38:30 -07002282)
2283{
2284 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
2285 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
2286 WLANDXE_DescType *currentDesc = NULL;
2287 wpt_uint32 descCtrl;
Jeff Johnsone7245742012-09-05 17:12:55 -07002288 wpt_int32 frameCount = 0;
2289
2290 wpt_uint32 descLoop;
2291 wpt_uint32 invalidatedFound = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07002292
2293 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002294 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002295
2296 /* Sanity Check */
2297 if((NULL == dxeCtxt) || (NULL == channelEntry))
2298 {
2299 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2300 "dxeRXFrameReady Channel Entry is not valid");
2301 return eWLAN_PAL_STATUS_E_INVAL;
2302 }
2303
Jeff Johnsone7245742012-09-05 17:12:55 -07002304 frameCount = dxeRXFrameRouteUpperLayer(dxeCtxt, channelEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -07002305
Jeff Johnsone7245742012-09-05 17:12:55 -07002306 if(0 > frameCount)
Leo Changd6de1c22013-03-21 15:42:41 -07002307 {
2308 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Jeff Johnsone7245742012-09-05 17:12:55 -07002309 "dxeRXFrameReady RX frame route fail");
Leo Changd6de1c22013-03-21 15:42:41 -07002310 return eWLAN_PAL_STATUS_E_INVAL;
2311 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002312
Leo Changd6de1c22013-03-21 15:42:41 -07002313 if((0 == frameCount) &&
Jeff Johnsone7245742012-09-05 17:12:55 -07002314 ((WLANDXE_POWER_STATE_BMPS == dxeCtxt->hostPowerState) ||
2315 (WLANDXE_POWER_STATE_FULL == dxeCtxt->hostPowerState)))
2316 {
Leo Changd6de1c22013-03-21 15:42:41 -07002317 /* None of the frame handled and CH is not enabled
2318 * RX CH wrap around happen and No RX free frame
2319 * RX side should wait till new free frame available in the pool
2320 * Do not try reload driver at here*/
2321 if(!(chStat & WLANDXE_CH_CTRL_EN_MASK))
2322 {
Leo Changbbf86b72013-06-19 16:13:00 -07002323 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Leo Changd6de1c22013-03-21 15:42:41 -07002324 "dxeRXFrameReady %s RING Wrapped, RX Free Low 0x%x",
2325 channelType[channelEntry->channelType], chStat);
Leo Chang3714c922013-07-10 20:33:30 -07002326 /* This is not empty interrupt case
2327 * If handle this as empty interrupt, false SSR might be issued
2328 * Frame count '1' is dummy frame count to avoid SSR */
2329 channelEntry->numFragmentCurrentChain = 1;
Leo Changd6de1c22013-03-21 15:42:41 -07002330 return eWLAN_PAL_STATUS_SUCCESS;
2331 }
2332
Jeff Johnsone7245742012-09-05 17:12:55 -07002333 currentCtrlBlk = channelEntry->headCtrlBlk;
Jeff Johnson295189b2012-06-20 16:38:30 -07002334 currentDesc = currentCtrlBlk->linkedDesc;
2335 descCtrl = currentDesc->descCtrl.ctrl;
Jeff Johnsone7245742012-09-05 17:12:55 -07002336
2337 if(WLANDXE_POWER_STATE_BMPS != dxeCtxt->hostPowerState)
2338 {
2339 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
2340 "RX ISR called but no frame handled PWS %d, channel %s",
2341 (int)dxeCtxt->hostPowerState,
2342 channelType[channelEntry->channelType]);
2343 }
2344
2345 /* Current interupt empty and previous interrupt also empty
2346 * detected successive empty interrupt
2347 * or first interrupt empty, this should not happen */
2348 if(0 == channelEntry->numFragmentCurrentChain)
2349 {
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07002350 dxeChannelMonitor("RX Ready", channelEntry, NULL);
2351 dxeDescriptorDump(channelEntry, channelEntry->headCtrlBlk->linkedDesc, 0);
2352 dxeChannelRegisterDump(channelEntry, "RX successive empty interrupt", NULL);
2353 dxeChannelAllDescDump(channelEntry, channelEntry->channelType, NULL);
Jeff Johnsone7245742012-09-05 17:12:55 -07002354 /* Abnormal interrupt detected, try to find not validated descriptor */
2355 for(descLoop = 0; descLoop < channelEntry->numDesc; descLoop++)
2356 {
2357 if(!(WLANDXE_U32_SWAP_ENDIAN(descCtrl) & WLANDXE_DESC_CTRL_VALID))
2358 {
Leo Chang416afe02013-07-01 13:58:13 -07002359 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Jeff Johnsone7245742012-09-05 17:12:55 -07002360 "Found Invalidated Descriptor %d", (int)descLoop);
2361 if(eWLAN_PAL_STATUS_SUCCESS == wpalIsPacketLocked(currentCtrlBlk->xfrFrame))
2362 {
Leo Chang416afe02013-07-01 13:58:13 -07002363 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Jeff Johnsone7245742012-09-05 17:12:55 -07002364 "Packet locked, Resync Host and HW");
2365 channelEntry->headCtrlBlk = currentCtrlBlk;
2366 invalidatedFound = 1;
2367 break;
2368 }
2369 else
2370 {
Leo Chang416afe02013-07-01 13:58:13 -07002371 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Jeff Johnsone7245742012-09-05 17:12:55 -07002372 "Packet Not Locked, cannot transfer frame");
2373 }
2374 }
2375 currentCtrlBlk = (WLANDXE_DescCtrlBlkType *)currentCtrlBlk->nextCtrlBlk;
2376 currentDesc = currentCtrlBlk->linkedDesc;
2377 descCtrl = currentDesc->descCtrl.ctrl;
2378 }
2379
Jeff Johnson32d95a32012-09-10 13:15:23 -07002380 /* Invalidated descriptor found, and that is not head descriptor
2381 * This means HW/SW descriptor miss match happen, and we may recover with just resync
2382 * Try re-sync here */
2383 if((invalidatedFound) && (0 != descLoop))
Jeff Johnsone7245742012-09-05 17:12:55 -07002384 {
2385 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2386 "Found New Sync location with HW, handle frames from there");
2387 frameCount = dxeRXFrameRouteUpperLayer(dxeCtxt, channelEntry);
2388 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2389 "re-sync routed %d frames to upper layer", (int)frameCount);
Madan Mohan Koyyalamudi0c325532012-09-24 13:24:42 -07002390 channelEntry->numFragmentCurrentChain = frameCount;
Jeff Johnsone7245742012-09-05 17:12:55 -07002391 }
Jeff Johnson32d95a32012-09-10 13:15:23 -07002392 /* Successive Empty interrupt
2393 * But this case, first descriptor also invalidated, then it means head descriptor
2394 * is linked with already handled RX frame, then could not unlock RX frame
2395 * This is just Out of RX buffer pool, not need to anything here */
2396 else if((invalidatedFound) && (0 == descLoop))
2397 {
2398 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2399 "Out of RX Low resource, and INT came in, do nothing till get RX resource");
2400 }
2401 /* Critical error, reload driver */
Jeff Johnsone7245742012-09-05 17:12:55 -07002402 else
2403 {
2404 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2405 "Could not found invalidated descriptor");
2406 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2407 "RX successive empty interrupt, Could not find invalidated DESC reload driver");
2408 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
2409 wpalWlanReload();
2410 }
2411 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002412 }
Madan Mohan Koyyalamudi6646aad2012-09-24 14:10:39 -07002413 channelEntry->numFragmentCurrentChain = frameCount;
Jeff Johnson295189b2012-06-20 16:38:30 -07002414 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002415 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002416 return status;
2417}
2418
2419/*==========================================================================
2420 @ Function Name
2421 dxeNotifySmsm
2422
2423 @ Description: Notify SMSM to start DXE engine and/or condition of Tx ring
2424 buffer
2425
2426 @ Parameters
2427
2428 @ Return
2429 wpt_status
2430
2431===========================================================================*/
2432static wpt_status dxeNotifySmsm
2433(
2434 wpt_boolean kickDxe,
2435 wpt_boolean ringEmpty
2436)
2437{
2438 wpt_uint32 clrSt = 0;
2439 wpt_uint32 setSt = 0;
2440
2441 if(kickDxe)
2442 {
2443 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, "Kick off DXE");
2444
2445 if(tempDxeCtrlBlk->lastKickOffDxe == 0)
2446 {
2447 setSt |= WPAL_SMSM_WLAN_TX_ENABLE;
2448 tempDxeCtrlBlk->lastKickOffDxe = 1;
2449 }
2450 else if(tempDxeCtrlBlk->lastKickOffDxe == 1)
2451 {
2452 clrSt |= WPAL_SMSM_WLAN_TX_ENABLE;
2453 tempDxeCtrlBlk->lastKickOffDxe = 0;
2454 }
2455 else
2456 {
2457 HDXE_ASSERT(0);
2458 }
2459 }
2460 else
2461 {
2462 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, "no need to kick off DXE");
2463 }
2464
2465 if(ringEmpty)
2466 {
2467 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, "SMSM Tx Ring Empty");
2468 clrSt |= WPAL_SMSM_WLAN_TX_RINGS_EMPTY;
2469 }
2470 else
2471 {
2472 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, "SMSM Tx Ring Not Empty");
2473 setSt |= WPAL_SMSM_WLAN_TX_RINGS_EMPTY;
2474 }
2475
2476 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH, "C%x S%x", clrSt, setSt);
2477
2478 wpalNotifySmsm(clrSt, setSt);
2479
2480 return eWLAN_PAL_STATUS_SUCCESS;
2481}
2482
2483/*==========================================================================
2484 @ Function Name
2485 dxePsComplete
2486
2487 @ Description: Utility function to check the resv desc to deside if we can
2488 get into Power Save mode now
2489
2490 @ Parameters
2491
2492 @ Return
2493 None
2494
2495===========================================================================*/
2496static void dxePsComplete(WLANDXE_CtrlBlkType *dxeCtxt, wpt_boolean intr_based)
2497{
2498 if( dxeCtxt->hostPowerState == WLANDXE_POWER_STATE_FULL )
2499 {
2500 return;
2501 }
2502
2503 //if both HIGH & LOW Tx channels don't have anything on resv desc,all Tx pkts
2504 //must have been consumed by RIVA, OK to get into BMPS
2505 if((0 == dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc) &&
2506 (0 == dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc))
2507 {
2508 tempDxeCtrlBlk->ringNotEmpty = eWLAN_PAL_FALSE;
2509 //if host is in BMPS & no pkt to Tx, RIVA can go to power save
2510 if(WLANDXE_POWER_STATE_BMPS == dxeCtxt->hostPowerState)
2511 {
2512 dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN;
2513 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
2514 }
2515 }
2516 else //still more pkts to be served by RIVA
2517 {
2518 tempDxeCtrlBlk->ringNotEmpty = eWLAN_PAL_TRUE;
2519
2520 switch(dxeCtxt->rivaPowerState)
2521 {
2522 case WLANDXE_RIVA_POWER_STATE_ACTIVE:
2523 //NOP
2524 break;
2525 case WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN:
2526 if(intr_based)
2527 {
2528 dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_ACTIVE;
2529 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
2530 }
2531 break;
2532 default:
2533 //assert
2534 break;
2535 }
2536 }
2537}
2538
2539/*==========================================================================
2540 @ Function Name
2541 dxeRXEventHandler
2542
2543 @ Description
2544 Handle serailized RX frame ready event
2545 First disable interrupt then pick up frame from pre allocated buffer
2546 Since frame handle is doen, clear interrupt bit to ready next interrupt
2547 Finally re enable interrupt
2548
2549 @ Parameters
2550 wpt_msg *rxReadyMsg
2551 RX frame ready MSG pointer
2552 include DXE control context
2553
2554 @ Return
2555 NONE
2556
2557===========================================================================*/
2558void dxeRXEventHandler
2559(
2560 wpt_msg *rxReadyMsg
2561)
2562{
2563 wpt_msg *msgContent = (wpt_msg *)rxReadyMsg;
2564 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
2565 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
2566 wpt_uint32 intSrc = 0;
2567 WLANDXE_ChannelCBType *channelCb = NULL;
Jeff Johnsone7245742012-09-05 17:12:55 -07002568 wpt_uint32 chHighStat = 0;
2569 wpt_uint32 chLowStat = 0;
Leo Chang094ece82013-04-23 17:57:41 -07002570 wpt_uint32 regValue;
Jeff Johnson295189b2012-06-20 16:38:30 -07002571
Jeff Johnsone7245742012-09-05 17:12:55 -07002572 dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07002573
Jeff Johnsone7245742012-09-05 17:12:55 -07002574 if(eWLAN_PAL_TRUE == dxeCtxt->driverReloadInProcessing)
Jeff Johnson295189b2012-06-20 16:38:30 -07002575 {
2576 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Jeff Johnsone7245742012-09-05 17:12:55 -07002577 "RX Ready WLAN Driver re-loading in progress");
Jeff Johnson32d95a32012-09-10 13:15:23 -07002578 return;
Jeff Johnson295189b2012-06-20 16:38:30 -07002579 }
2580
Jeff Johnsone7245742012-09-05 17:12:55 -07002581 /* Now try to refill the ring with empty Rx buffers to keep DXE busy */
2582 dxeRXFrameRefillRing(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI]);
2583 dxeRXFrameRefillRing(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI]);
2584
Jeff Johnson295189b2012-06-20 16:38:30 -07002585 dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
2586
2587 if((!dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].extraConfig.chEnabled) ||
2588 (!dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].extraConfig.chEnabled))
2589 {
2590 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2591 "DXE already stopped in RX event handler. Just return");
2592 return;
2593 }
2594
2595 if((WLANDXE_POWER_STATE_IMPS == dxeCtxt->hostPowerState) ||
2596 (WLANDXE_POWER_STATE_DOWN == dxeCtxt->hostPowerState))
2597 {
2598 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
2599 "%s Riva is in %d, Just Pull frames without any register touch ",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002600 __func__, dxeCtxt->hostPowerState);
Jeff Johnson295189b2012-06-20 16:38:30 -07002601
2602 /* Not to touch any register, just pull frame directly from chain ring
2603 * First high priority */
2604 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI];
2605 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002606 channelCb,
2607 chHighStat);
Jeff Johnson295189b2012-06-20 16:38:30 -07002608 if(eWLAN_PAL_STATUS_SUCCESS != status)
2609 {
2610 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2611 "dxeRXEventHandler Pull from RX high channel fail");
2612 }
2613
2614 /* Second low priority */
2615 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI];
2616 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002617 channelCb,
2618 chLowStat);
Jeff Johnson295189b2012-06-20 16:38:30 -07002619 if(eWLAN_PAL_STATUS_SUCCESS != status)
2620 {
2621 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2622 "dxeRXEventHandler Pull from RX low channel fail");
2623 }
2624
2625 /* Interrupt will not enabled at here, it will be enabled at PS mode change */
2626 tempDxeCtrlBlk->rxIntDisabledByIMPS = eWLAN_PAL_TRUE;
2627
2628 return;
2629 }
2630
2631 /* Disable device interrupt */
2632 /* Read whole interrupt mask register and exclusive only this channel int */
2633 status = wpalReadRegister(WLANDXE_INT_SRC_RAW_ADDRESS,
2634 &intSrc);
2635 if(eWLAN_PAL_STATUS_SUCCESS != status)
2636 {
2637 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2638 "dxeRXEventHandler Read INT_SRC register fail");
2639 return;
2640 }
2641 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED,
2642 "RX Event Handler INT Source 0x%x", intSrc);
2643
2644#ifndef WLANDXE_TEST_CHANNEL_ENABLE
2645 /* Test High Priority Channel interrupt is enabled or not */
2646 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI];
2647 if(intSrc & (1 << channelCb->assignedDMAChannel))
2648 {
2649 status = dxeChannelCleanInt(channelCb, &chHighStat);
2650 if(eWLAN_PAL_STATUS_SUCCESS != status)
2651 {
2652 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2653 "dxeRXEventHandler INT Clean up fail");
2654 return;
2655 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002656 if(WLANDXE_CH_STAT_INT_ERR_MASK & chHighStat)
2657 {
2658 /* Error Happen during transaction, Handle it */
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08002659 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
2660 "%11s : 0x%x Error Reported, Reload Driver",
2661 channelType[channelCb->channelType], chHighStat);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05302662
2663 dxeErrChannelDebug(channelCb);
2664
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08002665 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
2666 wpalWlanReload();
Jeff Johnson295189b2012-06-20 16:38:30 -07002667 }
Jeff Johnson32d95a32012-09-10 13:15:23 -07002668 else if((WLANDXE_CH_STAT_INT_DONE_MASK & chHighStat) ||
2669 (WLANDXE_CH_STAT_INT_ED_MASK & chHighStat))
Jeff Johnson295189b2012-06-20 16:38:30 -07002670 {
2671 /* Handle RX Ready for high priority channel */
2672 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002673 channelCb,
2674 chHighStat);
Jeff Johnson295189b2012-06-20 16:38:30 -07002675 }
2676 else if(WLANDXE_CH_STAT_MASKED_MASK & chHighStat)
2677 {
2678 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002679 channelCb,
2680 chHighStat);
Jeff Johnson295189b2012-06-20 16:38:30 -07002681 }
2682 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
2683 "RX HIGH CH EVNT STAT 0x%x, %d frames handled", chHighStat, channelCb->numFragmentCurrentChain);
Jeff Johnsone7245742012-09-05 17:12:55 -07002684 /* Update the Rx DONE histogram */
2685 channelCb->rxDoneHistogram = (channelCb->rxDoneHistogram << 1);
2686 if(WLANDXE_CH_STAT_INT_DONE_MASK & chHighStat)
2687 {
2688 channelCb->rxDoneHistogram |= 1;
2689 }
2690 else
2691 {
2692 channelCb->rxDoneHistogram &= ~1;
2693 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002694 }
2695#else
2696 /* Test H2H Test interrupt is enabled or not */
2697 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_H2H_TEST_RX];
2698 if(intSrc & (1 << channelCb->assignedDMAChannel))
2699 {
2700 status = dxeChannelCleanInt(channelCb, &chStat);
2701 if(eWLAN_PAL_STATUS_SUCCESS != status)
2702 {
2703 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2704 "dxeRXEventHandler INT Clean up fail");
2705 return;
2706 }
2707
2708 if(WLANDXE_CH_STAT_INT_ERR_MASK & chStat)
2709 {
2710 /* Error Happen during transaction, Handle it */
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08002711 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
2712 "%11s : 0x%x Error Reported, Reload Driver",
2713 channelType[channelCb->channelType], chStat);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05302714
2715 dxeErrChannelDebug(channelCb);
2716
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08002717 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
2718 wpalWlanReload();
Jeff Johnson295189b2012-06-20 16:38:30 -07002719 }
2720 else if(WLANDXE_CH_STAT_INT_ED_MASK & chStat)
2721 {
2722 /* Handle RX Ready for high priority channel */
2723 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002724 channelCb,
2725 chStat);
Jeff Johnson295189b2012-06-20 16:38:30 -07002726 }
2727 /* Update the Rx DONE histogram */
2728 channelCb->rxDoneHistogram = (channelCb->rxDoneHistogram << 1);
2729 if(WLANDXE_CH_STAT_INT_DONE_MASK & chStat)
2730 {
2731 channelCb->rxDoneHistogram |= 1;
2732 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
2733 "DXE Channel Number %d, Rx DONE Histogram 0x%016llx",
2734 channelCb->assignedDMAChannel, channelCb->rxDoneHistogram);
2735 }
2736 else
2737 {
2738 channelCb->rxDoneHistogram &= ~1;
2739 }
2740 }
2741#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
2742
2743 /* Test Low Priority Channel interrupt is enabled or not */
Jeff Johnsone7245742012-09-05 17:12:55 -07002744 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI];
Jeff Johnson295189b2012-06-20 16:38:30 -07002745 if(intSrc & (1 << channelCb->assignedDMAChannel))
2746 {
2747 status = dxeChannelCleanInt(channelCb, &chLowStat);
2748 if(eWLAN_PAL_STATUS_SUCCESS != status)
2749 {
2750 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2751 "dxeRXEventHandler INT Clean up fail");
2752 return;
2753 }
2754
2755 if(WLANDXE_CH_STAT_INT_ERR_MASK & chLowStat)
2756 {
2757 /* Error Happen during transaction, Handle it */
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08002758 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
2759 "%11s : 0x%x Error Reported, Reload Driver",
2760 channelType[channelCb->channelType], chLowStat);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05302761
2762 dxeErrChannelDebug(channelCb);
2763
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08002764 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
2765 wpalWlanReload();
Jeff Johnson295189b2012-06-20 16:38:30 -07002766 }
2767 else if(WLANDXE_CH_STAT_INT_ED_MASK & chLowStat)
2768 {
2769 /* Handle RX Ready for low priority channel */
2770 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002771 channelCb,
2772 chLowStat);
Jeff Johnsone7245742012-09-05 17:12:55 -07002773 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002774
2775 /* Update the Rx DONE histogram */
2776 channelCb->rxDoneHistogram = (channelCb->rxDoneHistogram << 1);
2777 if(WLANDXE_CH_STAT_INT_DONE_MASK & chLowStat)
2778 {
2779 channelCb->rxDoneHistogram |= 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07002780 }
2781 else
2782 {
2783 channelCb->rxDoneHistogram &= ~1;
2784 }
2785 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
2786 "RX LOW CH EVNT STAT 0x%x, %d frames handled", chLowStat, channelCb->numFragmentCurrentChain);
2787 }
2788 if(eWLAN_PAL_STATUS_SUCCESS != status)
2789 {
2790 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2791 "dxeRXEventHandler Handle Frame Ready Fail");
2792 return;
2793 }
2794
Jeff Johnson295189b2012-06-20 16:38:30 -07002795 /* Prepare Control Register EN Channel */
2796 if(!(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].extraConfig.chan_mask & WLANDXE_CH_CTRL_EN_MASK))
2797 {
2798 HDXE_ASSERT(0);
2799 }
Leo Chang094ece82013-04-23 17:57:41 -07002800 wpalWriteRegister(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].channelRegister.chDXECtrlRegAddr,
2801 dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].extraConfig.chan_mask);
Jeff Johnson295189b2012-06-20 16:38:30 -07002802
2803 /* Prepare Control Register EN Channel */
2804 if(!(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].extraConfig.chan_mask & WLANDXE_CH_CTRL_EN_MASK))
2805 {
2806 HDXE_ASSERT(0);
2807 }
Leo Chang094ece82013-04-23 17:57:41 -07002808
2809 wpalWriteRegister(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].channelRegister.chDXECtrlRegAddr,
2810 dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].extraConfig.chan_mask);
2811
2812 /* Clear Interrupt handle processing bit
2813 * RIVA may power down */
2814 wpalReadRegister(WLANDXE_INT_MASK_REG_ADDRESS, &regValue);
2815 regValue &= WLANDXE_RX_INTERRUPT_PRO_UNMASK;
2816 wpalWriteRegister(WLANDXE_INT_MASK_REG_ADDRESS, regValue);
Jeff Johnson295189b2012-06-20 16:38:30 -07002817
Leo Chang416afe02013-07-01 13:58:13 -07002818 /* Enable system level ISR */
2819 /* Enable RX ready Interrupt at here */
2820 status = wpalEnableInterrupt(DXE_INTERRUPT_RX_READY);
2821 if(eWLAN_PAL_STATUS_SUCCESS != status)
2822 {
2823 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2824 "dxeRXEventHandler Enable RX Ready interrupt fail");
2825 return;
2826 }
2827
Jeff Johnson295189b2012-06-20 16:38:30 -07002828 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002829 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002830 return;
2831}
2832
2833/*==========================================================================
2834 @ Function Name
2835 dxeRXPacketAvailableEventHandler
2836
2837 @ Description
2838 Handle serialized RX Packet Available event when the corresponding callback
2839 is invoked by WPAL.
2840 Try to fill up any completed DXE descriptors with available Rx packet buffer
2841 pointers.
2842
2843 @ Parameters
2844 wpt_msg *rxPktAvailMsg
2845 RX frame ready MSG pointer
2846 include DXE control context
2847
2848 @ Return
2849 NONE
2850
2851===========================================================================*/
2852void dxeRXPacketAvailableEventHandler
2853(
2854 wpt_msg *rxPktAvailMsg
2855)
2856{
2857 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
2858 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
2859 WLANDXE_ChannelCBType *channelCb = NULL;
2860
2861 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002862 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002863
2864 /* Sanity Check */
2865 if(NULL == rxPktAvailMsg)
2866 {
2867 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2868 "dxeRXPacketAvailableEventHandler Context is not valid");
2869 return;
2870 }
2871
2872 dxeCtxt = (WLANDXE_CtrlBlkType *)(rxPktAvailMsg->pContext);
2873
2874 do
2875 {
2876 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
2877 "dxeRXPacketAvailableEventHandler, start refilling ring");
2878
2879 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI];
2880 status = dxeRXFrameRefillRing(dxeCtxt,channelCb);
2881
2882 // Wait for another callback to indicate when Rx resources are available
2883 // again.
2884 if(eWLAN_PAL_STATUS_SUCCESS != status)
2885 {
2886 break;
2887 }
2888
2889 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI];
2890 status = dxeRXFrameRefillRing(dxeCtxt,channelCb);
2891 if(eWLAN_PAL_STATUS_SUCCESS != status)
2892 {
2893 break;
2894 }
2895 } while(0);
2896
2897 if((WLANDXE_POWER_STATE_IMPS == dxeCtxt->hostPowerState) ||
2898 (WLANDXE_POWER_STATE_DOWN == dxeCtxt->hostPowerState))
2899 {
2900 /* Interrupt will not enabled at here, it will be enabled at PS mode change */
2901 tempDxeCtrlBlk->rxIntDisabledByIMPS = eWLAN_PAL_TRUE;
2902 }
2903}
2904
2905/*==========================================================================
2906 @ Function Name
2907 dxeRXISR
2908
2909 @ Description
2910 RX frame ready interrupt service routine
2911 interrupt entry function, this function called based on ISR context
2912 Must be serialized
2913
2914 @ Parameters
2915 void *hostCtxt
2916 DXE host driver control context,
2917 pre registerd during interrupt registration
2918
2919 @ Return
2920 NONE
2921
2922===========================================================================*/
2923static void dxeRXISR
2924(
2925 void *hostCtxt
2926)
2927{
2928 WLANDXE_CtrlBlkType *dxeCtxt = (WLANDXE_CtrlBlkType *)hostCtxt;
2929 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002930 wpt_uint32 regValue;
Jeff Johnson295189b2012-06-20 16:38:30 -07002931
2932#ifdef FEATURE_R33D
2933 status = wpalReadRegister(WLANDXE_INT_SRC_RAW_ADDRESS,
2934 &regValue);
2935 if(eWLAN_PAL_STATUS_SUCCESS != status)
2936 {
2937 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2938 "dxeTXCompISR Read INT_SRC_RAW fail");
2939 return;
2940 }
2941 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
2942 "INT_SRC_RAW 0x%x", regValue);
2943 if(0 == regValue)
2944 {
2945 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
2946 "This is not DXE Interrupt, Reject it 0x%x", regValue);
2947 return;
2948 }
2949#endif /* FEATURE_R33D */
2950
Leo Chang094ece82013-04-23 17:57:41 -07002951 /* Set Interrupt processing bit
2952 * During this bit set, WLAN HW may not power collapse */
2953 wpalReadRegister(WLANDXE_INT_MASK_REG_ADDRESS, &regValue);
2954 regValue |= WLANPAL_RX_INTERRUPT_PRO_MASK;
2955 wpalWriteRegister(WLANDXE_INT_MASK_REG_ADDRESS, regValue);
2956
Jeff Johnson295189b2012-06-20 16:38:30 -07002957 /* Disable interrupt at here
2958 * Disable RX Ready system level Interrupt at here
2959 * Otherwise infinite loop might happen */
2960 status = wpalDisableInterrupt(DXE_INTERRUPT_RX_READY);
2961 if(eWLAN_PAL_STATUS_SUCCESS != status)
2962 {
2963 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2964 "dxeRXFrameReadyISR Disable RX ready interrupt fail");
2965 return;
2966 }
2967
2968 /* Serialize RX Ready interrupt upon RX thread */
2969 HDXE_ASSERT(NULL != dxeCtxt->rxIsrMsg);
2970 status = wpalPostRxMsg(WDI_GET_PAL_CTX(),
2971 dxeCtxt->rxIsrMsg);
2972 if(eWLAN_PAL_STATUS_SUCCESS != status)
2973 {
2974 HDXE_ASSERT(eWLAN_PAL_STATUS_SUCCESS == status);
2975 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
2976 "dxeRXFrameReadyISR interrupt serialize fail");
2977 }
2978
Jeff Johnson295189b2012-06-20 16:38:30 -07002979 return;
2980}
2981
2982/*==========================================================================
2983 @ Function Name
2984 dxeTXPushFrame
2985
2986 @ Description
2987 Push TX frame into DXE descriptor and DXE register
2988 Send notification to DXE register that TX frame is ready to transfer
2989
2990 @ Parameters
2991 WLANDXE_ChannelCBType *channelEntry
2992 Channel specific control block
2993 wpt_packet *palPacket
2994 Packet pointer ready to transfer
2995
2996 @ Return
2997 PAL_STATUS_T
2998===========================================================================*/
2999static wpt_status dxeTXPushFrame
3000(
3001 WLANDXE_ChannelCBType *channelEntry,
3002 wpt_packet *palPacket
3003)
3004{
3005 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
3006 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
3007 WLANDXE_DescType *currentDesc = NULL;
3008 WLANDXE_DescType *firstDesc = NULL;
3009 WLANDXE_DescType *LastDesc = NULL;
3010 void *sourcePhysicalAddress = NULL;
3011 wpt_uint32 xferSize = 0;
3012#ifdef FEATURE_R33D
3013 tx_frm_pcie_vector_t frameVector;
3014 wpt_uint32 Va;
3015 wpt_uint32 fragCount = 0;
3016#else
3017 wpt_iterator iterator;
3018#endif /* FEATURE_R33D */
Leo Changac1d3612013-07-01 15:15:51 -07003019 wpt_uint32 isEmpty = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003020
3021 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003022 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003023
Leo Changac1d3612013-07-01 15:15:51 -07003024 tempDxeCtrlBlk->smsmToggled = eWLAN_PAL_FALSE;
3025 if((0 == tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc) &&
3026 (0 == tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc))
Jeff Johnson295189b2012-06-20 16:38:30 -07003027 {
Leo Changac1d3612013-07-01 15:15:51 -07003028 isEmpty = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07003029 }
3030
3031 channelEntry->numFragmentCurrentChain = 0;
3032 currentCtrlBlk = channelEntry->headCtrlBlk;
3033
3034 /* Initialize interator, TX is fragmented */
3035#ifdef FEATURE_R33D
3036 memset(&frameVector, 0, sizeof(tx_frm_pcie_vector_t));
3037 status = wpalPrepareTxFrame(palPacket,
3038 &frameVector,
3039 &Va);
3040#else
3041 status = wpalLockPacketForTransfer(palPacket);
3042 if(eWLAN_PAL_STATUS_SUCCESS != status)
3043 {
3044 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3045 "dxeTXPushFrame unable to lock packet");
3046 return status;
3047 }
3048
3049 status = wpalIteratorInit(&iterator, palPacket);
3050#endif /* FEATURE_R33D */
3051 if(eWLAN_PAL_STATUS_SUCCESS != status)
3052 {
3053 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3054 "dxeTXPushFrame iterator init fail");
3055 return status;
3056 }
3057
3058 /* !!!! Revisit break condition !!!!!!! */
3059 while(1)
3060 {
3061 /* Get current descriptor pointer from current control block */
3062 currentDesc = currentCtrlBlk->linkedDesc;
3063 if(NULL == firstDesc)
3064 {
3065 firstDesc = currentCtrlBlk->linkedDesc;
3066 }
3067 /* All control block will have same palPacket Pointer
3068 * to make logic simpler */
3069 currentCtrlBlk->xfrFrame = palPacket;
3070
3071 /* Get next fragment physical address and fragment size
3072 * if this is the first trial, will get first physical address
3073 * if no more fragment, Descriptor src address will be set as NULL, OK??? */
3074#ifdef FEATURE_R33D
3075 if(fragCount == frameVector.num_frg)
3076 {
3077 break;
3078 }
3079 currentCtrlBlk->shadowBufferVa = frameVector.frg[0].va;
3080 sourcePhysicalAddress = (void *)frameVector.frg[fragCount].pa;
3081 xferSize = frameVector.frg[fragCount].size;
3082 fragCount++;
3083 HDXE_ASSERT(0 != xferSize);
3084 HDXE_ASSERT(NULL != sourcePhysicalAddress);
3085#else
3086 status = wpalIteratorNext(&iterator,
3087 palPacket,
3088 &sourcePhysicalAddress,
3089 &xferSize);
3090 if((NULL == sourcePhysicalAddress) ||
3091 (0 == xferSize))
3092 {
3093 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
3094 "dxeTXPushFrame end of current frame");
3095 break;
3096 }
3097 if(eWLAN_PAL_STATUS_SUCCESS != status)
3098 {
3099 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3100 "dxeTXPushFrame Get next frame fail");
3101 return status;
3102 }
3103#endif /* FEATURE_R33D */
3104
3105 /* This is the LAST descriptor valid for this transaction */
3106 LastDesc = currentCtrlBlk->linkedDesc;
3107
3108 /* Program DXE descriptor */
3109 currentDesc->dxedesc.dxe_short_desc.srcMemAddrL =
3110 WLANDXE_U32_SWAP_ENDIAN((wpt_uint32)sourcePhysicalAddress);
3111
3112 /* Just normal data transfer from aCPU Flat Memory to BMU Q */
3113 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
3114 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
3115 {
3116 currentDesc->dxedesc.dxe_short_desc.dstMemAddrL =
3117 WLANDXE_U32_SWAP_ENDIAN(channelEntry->channelConfig.refWQ);
3118 }
3119 else
3120 {
3121 /* Test specific H2H transfer, destination address already set
3122 * Do Nothing */
3123 }
3124 currentDesc->xfrSize = WLANDXE_U32_SWAP_ENDIAN(xferSize);
3125
3126 /* Program channel control register */
3127 /* First frame not set VAL bit, why ??? */
3128 if(0 == channelEntry->numFragmentCurrentChain)
3129 {
3130 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write;
3131 }
3132 else
3133 {
3134 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write_valid;
3135 }
3136
3137 /* Update statistics */
3138 channelEntry->numFragmentCurrentChain++;
3139 channelEntry->numFreeDesc--;
3140 channelEntry->numRsvdDesc++;
3141
3142 /* Get next control block */
3143 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
3144 }
3145 channelEntry->numTotalFrame++;
3146 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
3147 "NUM TX FRAG %d, Total Frame %d",
3148 channelEntry->numFragmentCurrentChain, channelEntry->numTotalFrame);
3149
3150 /* Program Channel control register
3151 * Set as end of packet
3152 * Enable interrupt also for first code lock down
3153 * performace optimization, this will be revisited */
3154 if(NULL == LastDesc)
3155 {
3156 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3157 "dxeTXPushFrame NULL Last Descriptor, broken chain");
3158 return eWLAN_PAL_STATUS_E_FAULT;
3159 }
3160 LastDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write_eop_int;
3161 /* Now First one also Valid ????
3162 * this procedure will prevent over handle descriptor from previous
3163 * TX trigger */
3164 firstDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write_valid;
3165
3166 /* If in BMPS mode no need to notify the DXE Engine, notify SMSM instead */
3167 if(WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN == tempDxeCtrlBlk->rivaPowerState)
3168 {
3169 /* Update channel head as next avaliable linked slot */
3170 channelEntry->headCtrlBlk = currentCtrlBlk;
Leo Changac1d3612013-07-01 15:15:51 -07003171 if(isEmpty)
3172 {
3173 tempDxeCtrlBlk->ringNotEmpty = eWLAN_PAL_TRUE;
3174 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
3175 "SMSM_ret LO=%d HI=%d",
3176 tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc,
3177 tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc );
3178 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
3179 tempDxeCtrlBlk->smsmToggled = eWLAN_PAL_TRUE;
3180 }
Madan Mohan Koyyalamudi2edf6f62012-10-15 15:56:34 -07003181 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07003182 }
3183
3184 /* If DXE use external descriptor, registers are not needed to be programmed
3185 * Just after finish to program descriptor, tirigger to send */
3186 if(channelEntry->extraConfig.chan_mask & WLANDXE_CH_CTRL_EDEN_MASK)
3187 {
3188 /* Issue a dummy read from the DXE descriptor DDR location to
3189 ensure that any previously posted write to the descriptor
3190 completes. */
3191 if(channelEntry->extraConfig.cw_ctrl_write_valid != firstDesc->descCtrl.ctrl)
3192 {
3193 //HDXE_ASSERT(0);
3194 }
3195
3196 /* Everything is ready
3197 * Trigger to start DMA */
3198 status = wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr,
3199 channelEntry->extraConfig.chan_mask);
3200 if(eWLAN_PAL_STATUS_SUCCESS != status)
3201 {
3202 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3203 "dxeTXPushFrame Write Channel Ctrl Register fail");
3204 return status;
3205 }
3206
3207 /* Update channel head as next avaliable linked slot */
3208 channelEntry->headCtrlBlk = currentCtrlBlk;
3209
3210 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003211 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003212 return status;
3213 }
3214
3215 /* If DXE not use external descriptor, program each registers */
3216 /* Circular buffer handle not need to program DESC register???
3217 * GEN5 code not programed RING buffer case
3218 * REVISIT THIS !!!!!! */
3219 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
3220 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
3221 {
3222 /* Destination address, assigned Work Q */
3223 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrlRegAddr,
3224 channelEntry->channelConfig.refWQ);
3225 if(eWLAN_PAL_STATUS_SUCCESS != status)
3226 {
3227 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3228 "dxeTXPushFrame Program dest address register fail");
3229 return status;
3230 }
3231 /* If descriptor format is SHORT */
3232 if(channelEntry->channelConfig.useShortDescFmt)
3233 {
3234 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrhRegAddr,
3235 0);
3236 if(eWLAN_PAL_STATUS_SUCCESS != status)
3237 {
3238 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3239 "dxeTXPushFrame Program dest address register fail");
3240 return status;
3241 }
3242 }
3243 else
3244 {
3245 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3246 "dxeTXPushFrame LONG Descriptor Format!!!");
3247 }
3248 }
3249#ifdef WLANDXE_TEST_CHANNEL_ENABLE
3250 else if(WDTS_CHANNEL_H2H_TEST_TX == channelEntry->channelType)
3251 {
3252 /* Destination address, Physical memory address */
3253 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrlRegAddr,
3254 WLANDXE_U32_SWAP_ENDIAN(firstDesc->dxedesc.dxe_short_desc.dstMemAddrL));
3255 if(eWLAN_PAL_STATUS_SUCCESS != status)
3256 {
3257 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3258 "dxeTXPushFrame Program dest address register fail");
3259 return status;
3260 }
3261 /* If descriptor format is SHORT */
3262 if(channelEntry->channelConfig.useShortDescFmt)
3263 {
3264 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrhRegAddr,
3265 0);
3266 if(eWLAN_PAL_STATUS_SUCCESS != status)
3267 {
3268 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3269 "dxeTXPushFrame Program dest address register fail");
3270 return status;
3271 }
3272 }
3273 else
3274 {
3275 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3276 "dxeTXPushFrame LONG Descriptor Format!!!");
3277 }
3278 }
3279#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
3280
3281 /* Program Source address register
3282 * This address is already programmed into DXE Descriptor
3283 * But register also upadte */
3284 status = wpalWriteRegister(channelEntry->channelRegister.chDXESadrlRegAddr,
3285 WLANDXE_U32_SWAP_ENDIAN(firstDesc->dxedesc.dxe_short_desc.srcMemAddrL));
3286 if(eWLAN_PAL_STATUS_SUCCESS != status)
3287 {
3288 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3289 "dxeTXPushFrame Program src address register fail");
3290 return status;
3291 }
3292 /* If descriptor format is SHORT */
3293 if(channelEntry->channelConfig.useShortDescFmt)
3294 {
3295 status = wpalWriteRegister(channelEntry->channelRegister.chDXESadrhRegAddr,
3296 0);
3297 if(eWLAN_PAL_STATUS_SUCCESS != status)
3298 {
3299 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3300 "dxeTXPushFrame Program dest address register fail");
3301 return status;
3302 }
3303 }
3304 else
3305 {
3306 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3307 "dxeTXPushFrame LONG Descriptor Format!!!");
3308 }
3309
3310 /* Linked list Descriptor pointer */
3311 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
3312 channelEntry->headCtrlBlk->linkedDescPhyAddr);
3313 if(eWLAN_PAL_STATUS_SUCCESS != status)
3314 {
3315 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3316 "dxeTXPushFrame Write DESC Address register fail");
3317 return status;
3318 }
3319 /* If descriptor format is SHORT */
3320 if(channelEntry->channelConfig.useShortDescFmt)
3321 {
3322 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDeschRegAddr,
3323 0);
3324 if(eWLAN_PAL_STATUS_SUCCESS != status)
3325 {
3326 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3327 "dxeTXPushFrame Program dest address register fail");
3328 return status;
3329 }
3330 }
3331 else
3332 {
3333 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3334 "dxeTXPushFrame LONG Descriptor Format!!!");
3335 }
3336
3337 /* Transfer Size */
3338 xferSize = WLANDXE_U32_SWAP_ENDIAN(firstDesc->xfrSize);
3339 status = wpalWriteRegister(channelEntry->channelRegister.chDXESzRegAddr,
3340 xferSize);
3341 if(eWLAN_PAL_STATUS_SUCCESS != status)
3342 {
3343 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3344 "dxeTXPushFrame Write DESC Address register fail");
3345 return status;
3346 }
3347
3348 /* Everything is ready
3349 * Trigger to start DMA */
3350 status = wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr,
3351 channelEntry->extraConfig.chan_mask);
3352 if(eWLAN_PAL_STATUS_SUCCESS != status)
3353 {
3354 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3355 "dxeTXPushFrame Write Channel Ctrl Register fail");
3356 return status;
3357 }
3358
3359 /* Update channel head as next avaliable linked slot */
3360 channelEntry->headCtrlBlk = currentCtrlBlk;
3361
3362 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003363 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003364 return status;
3365}
3366
3367/*==========================================================================
3368 @ Function Name
3369 dxeTXCompFrame
3370
3371 @ Description
3372 TX Frame transfer complete event handler
3373
3374 @ Parameters
3375 WLANDXE_CtrlBlkType *dxeCtrlBlk,
3376 DXE host driver main control block
3377 WLANDXE_ChannelCBType *channelEntry
3378 Channel specific control block
3379
3380 @ Return
3381 PAL_STATUS_T
3382===========================================================================*/
3383static wpt_status dxeTXCompFrame
3384(
3385 WLANDXE_CtrlBlkType *hostCtxt,
3386 WLANDXE_ChannelCBType *channelEntry
3387)
3388{
3389 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
3390 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
3391 WLANDXE_DescType *currentDesc = NULL;
3392 wpt_uint32 descCtrlValue = 0;
3393 unsigned int *lowThreshold = NULL;
3394
3395 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003396 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003397
3398 /* Sanity */
3399 if((NULL == hostCtxt) || (NULL == channelEntry))
3400 {
3401 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3402 "dxeTXCompFrame Invalid ARG");
3403 return eWLAN_PAL_STATUS_E_INVAL;
3404 }
3405
3406 if(NULL == hostCtxt->txCompCB)
3407 {
3408 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3409 "dxeTXCompFrame TXCompCB is not registered");
Jeff Johnsone7245742012-09-05 17:12:55 -07003410 return eWLAN_PAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003411 }
3412
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08003413 status = wpalMutexAcquire(&channelEntry->dxeChannelLock);
3414 if(eWLAN_PAL_STATUS_SUCCESS != status)
3415 {
3416 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3417 "dxeTXCompFrame Mutex Acquire fail");
3418 return status;
3419 }
3420
Jeff Johnson295189b2012-06-20 16:38:30 -07003421 currentCtrlBlk = channelEntry->tailCtrlBlk;
3422 currentDesc = currentCtrlBlk->linkedDesc;
3423
3424 if( currentCtrlBlk == channelEntry->headCtrlBlk )
3425 {
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08003426 status = wpalMutexRelease(&channelEntry->dxeChannelLock);
3427 if(eWLAN_PAL_STATUS_SUCCESS != status)
3428 {
3429 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3430 "dxeTXCompFrame Mutex Release fail");
3431 return status;
3432 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003433 return eWLAN_PAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003434 }
3435
3436 /* */
3437 while(1)
3438 {
3439// HDXE_ASSERT(WLAN_PAL_IS_STATUS_SUCCESS(WLAN_RivaValidateDesc(currentDesc)));
3440 descCtrlValue = currentDesc->descCtrl.ctrl;
3441 if((descCtrlValue & WLANDXE_DESC_CTRL_VALID))
3442 {
3443 /* caught up with head, bail out */
3444 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED,
3445 "dxeTXCompFrame caught up with head - next DESC has VALID set");
3446 break;
3447 }
3448
3449 HDXE_ASSERT(currentCtrlBlk->xfrFrame != NULL);
3450 channelEntry->numFreeDesc++;
3451 channelEntry->numRsvdDesc--;
3452
3453 /* Send Frame TX Complete notification with frame start fragment location */
3454 if(WLANDXE_U32_SWAP_ENDIAN(descCtrlValue) & WLANDXE_DESC_CTRL_EOP)
3455 {
3456 hostCtxt->txCompletedFrames--;
3457#ifdef FEATURE_R33D
3458 wpalFreeTxFrame(currentCtrlBlk->shadowBufferVa);
3459#else
3460 status = wpalUnlockPacket(currentCtrlBlk->xfrFrame);
3461 if (eWLAN_PAL_STATUS_SUCCESS != status)
3462 {
3463 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3464 "dxeRXFrameReady unable to unlock packet");
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08003465 status = wpalMutexRelease(&channelEntry->dxeChannelLock);
3466 if(eWLAN_PAL_STATUS_SUCCESS != status)
3467 {
3468 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3469 "dxeTXCompFrame Mutex Release fail");
3470 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003471 return status;
3472 }
3473#endif /* FEATURE_R33D */
3474 hostCtxt->txCompCB(hostCtxt->clientCtxt,
3475 currentCtrlBlk->xfrFrame,
3476 eWLAN_PAL_STATUS_SUCCESS);
3477 channelEntry->numFragmentCurrentChain = 0;
3478 }
3479 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
3480 currentDesc = currentCtrlBlk->linkedDesc;
3481
3482 /* Break condition
3483 * Head control block is the control block must be programed for the next TX
3484 * so, head control block is not programmed control block yet
3485 * if loop encounte head control block, stop to complete
3486 * in theory, COMP CB must be called already ??? */
3487 if(currentCtrlBlk == channelEntry->headCtrlBlk)
3488 {
3489 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED,
3490 "dxeTXCompFrame caught up with head ptr");
3491 break;
3492 }
3493 /* VALID Bit check ???? */
3494 }
3495
3496 /* Tail and Head Control block must be same */
3497 channelEntry->tailCtrlBlk = currentCtrlBlk;
3498
3499 lowThreshold = channelEntry->channelType == WDTS_CHANNEL_TX_LOW_PRI?
3500 &(hostCtxt->txCompInt.txLowResourceThreshold_LoPriCh):
3501 &(hostCtxt->txCompInt.txLowResourceThreshold_HiPriCh);
3502
3503 /* If specific channel hit low resource condition send notification to upper layer */
3504 if((eWLAN_PAL_TRUE == channelEntry->hitLowResource) &&
3505 (channelEntry->numFreeDesc > *lowThreshold))
3506 {
3507 /* Change it back if we raised it for fetching a remaining packet from TL */
3508 if(WLANDXE_TX_LOW_RES_THRESHOLD > *lowThreshold)
3509 {
3510 *lowThreshold = WLANDXE_TX_LOW_RES_THRESHOLD;
3511 }
3512
3513 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
3514 "DXE TX %d channel recovered from low resource", channelEntry->channelType);
3515 hostCtxt->lowResourceCB(hostCtxt->clientCtxt,
3516 channelEntry->channelType,
3517 eWLAN_PAL_TRUE);
3518 channelEntry->hitLowResource = eWLAN_PAL_FALSE;
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -07003519 wpalTimerStop(&channelEntry->healthMonitorTimer);
Jeff Johnson295189b2012-06-20 16:38:30 -07003520 }
3521
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08003522 status = wpalMutexRelease(&channelEntry->dxeChannelLock);
3523 if(eWLAN_PAL_STATUS_SUCCESS != status)
3524 {
3525 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3526 "dxeTXCompFrame Mutex Release fail");
3527 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003528
3529 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003530 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003531 return status;
3532}
3533
3534/*==========================================================================
3535 @ Function Name
3536 dxeTXEventHandler
3537
3538 @ Description
3539 If DXE HW sends TX related interrupt, this event handler will be called
3540 Handle higher priority channel first
3541 Figureout why interrupt happen and call appropriate final even handler
3542 TX complete or error happen
3543
3544 @ Parameters
3545 void *msgPtr
3546 Even MSG
3547
3548 @ Return
3549 PAL_STATUS_T
3550===========================================================================*/
3551void dxeTXEventHandler
3552(
3553 wpt_msg *msgPtr
3554)
3555{
3556 wpt_msg *msgContent = (wpt_msg *)msgPtr;
3557 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
3558 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
3559 wpt_uint32 intSrc = 0;
3560 wpt_uint32 chStat = 0;
3561 WLANDXE_ChannelCBType *channelCb = NULL;
3562
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003563 wpt_uint8 bEnableISR = 0;
Madan Mohan Koyyalamudidfd6aa82012-10-18 20:18:43 -07003564 static wpt_uint8 successiveIntWithIMPS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003565
3566 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003567 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003568
3569 dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
Jeff Johnsone7245742012-09-05 17:12:55 -07003570 dxeCtxt->ucTxMsgCnt = 0;
3571
3572 if(eWLAN_PAL_TRUE == dxeCtxt->driverReloadInProcessing)
3573 {
3574 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3575 "wlan: TX COMP WLAN Driver re-loading in progress");
3576 return;
3577 }
3578
Jeff Johnson295189b2012-06-20 16:38:30 -07003579 /* Return from here if the RIVA is in IMPS, to avoid register access */
3580 if(WLANDXE_POWER_STATE_IMPS == dxeCtxt->hostPowerState)
3581 {
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003582 successiveIntWithIMPS++;
Jeff Johnsone7245742012-09-05 17:12:55 -07003583 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003584 "dxeTXEventHandler IMPS TX COMP INT successiveIntWithIMPS %d", successiveIntWithIMPS);
Jeff Johnsone7245742012-09-05 17:12:55 -07003585 status = dxeTXCompFrame(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI]);
3586 if(eWLAN_PAL_STATUS_SUCCESS != status)
3587 {
3588 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003589 "dxeTXEventHandler IMPS HC COMP interrupt fail");
Jeff Johnsone7245742012-09-05 17:12:55 -07003590 }
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07003591
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003592 status = dxeTXCompFrame(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI]);
3593 if(eWLAN_PAL_STATUS_SUCCESS != status)
3594 {
3595 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3596 "dxeTXEventHandler IMPS LC COMP interrupt fail");
3597 }
3598
3599 if(((dxeCtxt->txCompletedFrames) &&
3600 (eWLAN_PAL_FALSE == dxeCtxt->txIntEnable)) &&
3601 (successiveIntWithIMPS == 1))
Jeff Johnsone7245742012-09-05 17:12:55 -07003602 {
3603 dxeCtxt->txIntEnable = eWLAN_PAL_TRUE;
3604 wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE);
3605 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08003606 "TX COMP INT Enabled, remain TX frame count on ring %d",
3607 dxeCtxt->txCompletedFrames);
Jeff Johnsone7245742012-09-05 17:12:55 -07003608 /*Kicking the DXE after the TX Complete interrupt was enabled - to avoid
3609 the posibility of a race*/
3610 dxePsComplete(dxeCtxt, eWLAN_PAL_TRUE);
3611 }
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003612 else
3613 {
3614 dxeCtxt->txIntEnable = eWLAN_PAL_FALSE;
3615 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3616 "TX COMP INT NOT Enabled, RIVA still wake up? remain TX frame count on ring %d, successiveIntWithIMPS %d",
3617 dxeCtxt->txCompletedFrames, successiveIntWithIMPS);
3618 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003619 return;
3620 }
3621
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003622 successiveIntWithIMPS = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003623 if((!dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].extraConfig.chEnabled) ||
3624 (!dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].extraConfig.chEnabled))
3625 {
3626 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3627 "DXE already stopped in TX event handler. Just return");
3628 return;
3629 }
3630
Jeff Johnson295189b2012-06-20 16:38:30 -07003631 /* Disable device interrupt */
3632 /* Read whole interrupt mask register and exclusive only this channel int */
3633 status = wpalReadRegister(WLANDXE_INT_SRC_RAW_ADDRESS,
3634 &intSrc);
3635 if(eWLAN_PAL_STATUS_SUCCESS != status)
3636 {
3637 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3638 "dxeTXCompleteEventHandler Read INT_DONE_SRC register fail");
3639 return;
3640 }
3641 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED,
3642 "TX Event Handler INT Source 0x%x", intSrc);
3643
3644 /* Test High Priority Channel is the INT source or not */
3645 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI];
3646 if(intSrc & (1 << channelCb->assignedDMAChannel))
3647 {
3648 status = dxeChannelCleanInt(channelCb, &chStat);
3649 if(eWLAN_PAL_STATUS_SUCCESS != status)
3650 {
3651 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3652 "dxeTXEventHandler INT Clean up fail");
3653 return;
3654 }
3655
3656 if(WLANDXE_CH_STAT_INT_ERR_MASK & chStat)
3657 {
3658 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08003659 "%11s : 0x%x Error Reported, Reload Driver",
3660 channelType[channelCb->channelType], chStat);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05303661
3662 dxeErrChannelDebug(channelCb);
3663
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08003664 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
3665 wpalWlanReload();
Jeff Johnson295189b2012-06-20 16:38:30 -07003666 }
3667 else if(WLANDXE_CH_STAT_INT_DONE_MASK & chStat)
3668 {
3669 /* Handle TX complete for high priority channel */
3670 status = dxeTXCompFrame(dxeCtxt,
3671 channelCb);
Jeff Johnsone7245742012-09-05 17:12:55 -07003672 bEnableISR = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07003673 }
3674 else if(WLANDXE_CH_STAT_INT_ED_MASK & chStat)
3675 {
3676 /* Handle TX complete for high priority channel */
3677 status = dxeTXCompFrame(dxeCtxt,
3678 channelCb);
Jeff Johnsone7245742012-09-05 17:12:55 -07003679 bEnableISR = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07003680 }
3681 else
3682 {
3683 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3684 "dxeTXEventHandler TX HI status=%x", chStat);
3685 }
3686
3687 if(WLANDXE_CH_STAT_MASKED_MASK & chStat)
3688 {
3689 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH,
3690 "dxeTXEventHandler TX HIGH Channel Masked Unmask it!!!!");
3691 }
3692
3693 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH,
3694 "TX HIGH STAT 0x%x RESRVD %d", chStat, channelCb->numRsvdDesc);
3695 }
3696
3697 /* Test Low Priority Channel interrupt is enabled or not */
3698 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI];
3699 if(intSrc & (1 << channelCb->assignedDMAChannel))
3700 {
3701 status = dxeChannelCleanInt(channelCb, &chStat);
3702 if(eWLAN_PAL_STATUS_SUCCESS != status)
3703 {
3704 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3705 "dxeTXEventHandler INT Clean up fail");
3706 return;
3707 }
3708
3709 if(WLANDXE_CH_STAT_INT_ERR_MASK & chStat)
3710 {
3711 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08003712 "%11s : 0x%x Error Reported, Reload Driver",
3713 channelType[channelCb->channelType], chStat);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05303714
3715 dxeErrChannelDebug(channelCb);
3716
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08003717 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
3718 wpalWlanReload();
Jeff Johnson295189b2012-06-20 16:38:30 -07003719 }
3720 else if(WLANDXE_CH_STAT_INT_DONE_MASK & chStat)
3721 {
3722 /* Handle TX complete for low priority channel */
3723 status = dxeTXCompFrame(dxeCtxt,
3724 channelCb);
Jeff Johnsone7245742012-09-05 17:12:55 -07003725 bEnableISR = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07003726 }
3727 else if(WLANDXE_CH_STAT_INT_ED_MASK & chStat)
3728 {
3729 /* Handle TX complete for low priority channel */
3730 status = dxeTXCompFrame(dxeCtxt,
3731 channelCb);
Jeff Johnsone7245742012-09-05 17:12:55 -07003732 bEnableISR = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07003733 }
3734 else
3735 {
3736 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3737 "dxeTXEventHandler TX LO status=%x", chStat);
3738 }
3739
3740 if(WLANDXE_CH_STAT_MASKED_MASK & chStat)
3741 {
3742 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH,
3743 "dxeTXEventHandler TX Low Channel Masked Unmask it!!!!");
3744 }
3745 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
3746 "TX LOW STAT 0x%x RESRVD %d", chStat, channelCb->numRsvdDesc);
3747 }
3748
3749
3750#ifdef WLANDXE_TEST_CHANNEL_ENABLE
3751 /* Test H2H TX Channel interrupt is enabled or not */
3752 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_H2H_TEST_TX];
3753 if(intSrc & (1 << channelCb->assignedDMAChannel))
3754 {
3755 status = wpalReadRegister(channelCb->channelRegister.chDXEStatusRegAddr,
3756 &chStat);
3757 if(eWLAN_PAL_STATUS_SUCCESS != status)
3758 {
3759 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3760 "dxeChannelCleanInt Read CH STAT register fail");
3761 return;
3762 }
3763
3764 if(WLANDXE_CH_STAT_INT_ERR_MASK & chStat)
3765 {
3766 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08003767 "%11s : 0x%x Error Reported, Reload Driver",
3768 channelType[channelCb->channelType], chStat);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05303769
3770 dxeErrChannelDebug(channelCb);
3771
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08003772 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
3773 wpalWlanReload();
Jeff Johnson295189b2012-06-20 16:38:30 -07003774 }
3775 else if(WLANDXE_CH_STAT_INT_DONE_MASK & chStat)
3776 {
3777 /* Handle TX complete for high priority channel */
3778 status = dxeTXCompFrame(dxeCtxt,
3779 channelCb);
3780 if(eWLAN_PAL_STATUS_SUCCESS != status)
3781 {
3782 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3783 "dxeTXEventHandler INT Clean up fail");
3784 return;
3785 }
3786 }
3787 else
3788 {
3789 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3790 "unexpected channel state %d", chStat);
3791 }
3792 }
3793#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
3794
3795 if((bEnableISR || (dxeCtxt->txCompletedFrames)) &&
3796 (eWLAN_PAL_FALSE == dxeCtxt->txIntEnable))
3797 {
3798 dxeCtxt->txIntEnable = eWLAN_PAL_TRUE;
3799 wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE);
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08003800 if(0 != dxeCtxt->txCompletedFrames)
3801 {
3802 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
3803 "TX COMP INT Enabled, remain TX frame count on ring %d",
3804 dxeCtxt->txCompletedFrames);
3805 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003806 }
3807
3808 /*Kicking the DXE after the TX Complete interrupt was enabled - to avoid
3809 the posibility of a race*/
3810 dxePsComplete(dxeCtxt, eWLAN_PAL_TRUE);
3811
3812 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003813 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003814 return;
3815}
3816
3817
3818/*==========================================================================
3819 @ Function Name
3820 dxeTXCompleteProcessing
3821
3822 @ Description
3823 If DXE HW sends TX related interrupt, this event handler will be called
3824 Handle higher priority channel first
3825 Figureout why interrupt happen and call appropriate final even handler
3826 TX complete or error happen
3827
3828 @ Parameters
3829 dxeCtxt DXE context
3830
3831 @ Return
3832 PAL_STATUS_T
3833===========================================================================*/
3834void dxeTXCompleteProcessing
3835(
3836 WLANDXE_CtrlBlkType *dxeCtxt
3837)
3838{
3839 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
3840 WLANDXE_ChannelCBType *channelCb = NULL;
3841
3842 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003843 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003844
3845 /* Test High Priority Channel is the INT source or not */
3846 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI];
3847
3848 /* Handle TX complete for high priority channel */
3849 status = dxeTXCompFrame(dxeCtxt, channelCb);
3850
3851 /* Test Low Priority Channel interrupt is enabled or not */
3852 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI];
3853
3854 /* Handle TX complete for low priority channel */
3855 status = dxeTXCompFrame(dxeCtxt, channelCb);
3856
3857 if((eWLAN_PAL_FALSE == dxeCtxt->txIntEnable) &&
3858 ((dxeCtxt->txCompletedFrames > 0) ||
3859 (WLANDXE_POWER_STATE_FULL == dxeCtxt->hostPowerState)))
3860 {
3861 dxeCtxt->txIntEnable = eWLAN_PAL_TRUE;
3862 wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE);
3863 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003864 "%s %s : %d, %s : %d", __func__,
Jeff Johnson295189b2012-06-20 16:38:30 -07003865 channelType[dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].channelType],
3866 dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc,
3867 channelType[dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].channelType],
3868 dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc);
Leo Changac1d3612013-07-01 15:15:51 -07003869
3870 if((WLANDXE_POWER_STATE_FULL != dxeCtxt->hostPowerState) &&
3871 (eWLAN_PAL_FALSE == tempDxeCtrlBlk->smsmToggled))
3872 {
3873 /* After TX Comp processing, still remaining frame on the DXE TX ring
3874 * And when push frame, RING was not empty marked
3875 * Then when push frame, no SMSM toggle happen
3876 * To avoid permanent TX stall, SMSM toggle is needed at here
3877 * With this toggle, host should gaurantee SMSM state should be changed */
3878 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
3879 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
3880 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003881 }
3882
3883 /*Kicking the DXE after the TX Complete interrupt was enabled - to avoid
3884 the posibility of a race*/
3885 dxePsComplete(dxeCtxt, eWLAN_PAL_FALSE);
3886
3887 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003888 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003889 return;
3890}
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07003891
3892/*==========================================================================
3893 @ Function Name
3894 dxeTXReSyncDesc
3895
3896 @ Description
3897 When STA comeout from IMPS, check DXE TX next transfer candidate descriptor
3898 And HW programmed descriptor.
3899 If any async happen between HW/SW TX stall will happen
3900
3901 @ Parameters
3902 void *msgPtr
3903 Message pointer to sync with TX thread
3904
3905 @ Return
3906 NONE
3907===========================================================================*/
3908void dxeTXReSyncDesc
3909(
3910 wpt_msg *msgPtr
3911)
3912{
3913 wpt_msg *msgContent = (wpt_msg *)msgPtr;
3914 WLANDXE_CtrlBlkType *pDxeCtrlBlk;
3915 wpt_uint32 nextDescReg;
3916 WLANDXE_ChannelCBType *channelEntry;
3917 WLANDXE_DescCtrlBlkType *validCtrlBlk;
3918 wpt_uint32 descLoop;
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07003919 wpt_uint32 channelLoop;
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07003920
3921 if(NULL == msgContent)
3922 {
3923 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3924 "dxeTXReSyncDesc Invalid Control Block");
3925 return;
3926 }
3927
3928 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
3929 "dxeTXReSyncDesc Try to re-sync TX channel if any problem");
3930 pDxeCtrlBlk = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
3931
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07003932 for(channelLoop = WDTS_CHANNEL_TX_LOW_PRI; channelLoop < WDTS_CHANNEL_RX_LOW_PRI; channelLoop++)
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07003933 {
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07003934 channelEntry = &pDxeCtrlBlk->dxeChannel[channelLoop];
3935 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
3936 "%11s : Try to detect TX descriptor async", channelType[channelEntry->channelType]);
3937 wpalReadRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
3938 &nextDescReg);
3939 /* Async detect without TX pending frame */
3940 if(channelEntry->tailCtrlBlk == channelEntry->headCtrlBlk)
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07003941 {
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07003942 if(nextDescReg != channelEntry->tailCtrlBlk->linkedDescPhyAddr)
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07003943 {
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07003944 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
3945 "TX Async no Pending frame");
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05303946
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07003947 dxeChannelMonitor("!!! TX Async no Pending frame !!!", channelEntry, NULL);
3948 dxeChannelRegisterDump(channelEntry, "!!! TX Async no Pending frame !!!", NULL);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05303949
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07003950 wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07003951 channelEntry->tailCtrlBlk->linkedDescPhyAddr);
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07003952 }
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07003953 }
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07003954 /* Async detect with some TX pending frames
3955 * next descriptor register should sync with first valid descriptor */
3956 else
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07003957 {
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07003958 validCtrlBlk = channelEntry->tailCtrlBlk;
3959 for(descLoop = 0; descLoop < channelEntry->numDesc; descLoop++)
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07003960 {
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07003961 if(validCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID)
3962 {
3963 if(nextDescReg != validCtrlBlk->linkedDescPhyAddr)
3964 {
3965 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
3966 "TX Async");
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05303967
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07003968 dxeChannelMonitor("!!! TX Async !!!", channelEntry, NULL);
3969 dxeChannelRegisterDump(channelEntry, "!!! TX Async !!!", NULL);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05303970
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07003971 wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
3972 validCtrlBlk->linkedDescPhyAddr);
3973 }
3974 break;
3975 }
3976 validCtrlBlk = (WLANDXE_DescCtrlBlkType *)validCtrlBlk->nextCtrlBlk;
3977 if(validCtrlBlk == channelEntry->headCtrlBlk->nextCtrlBlk)
3978 {
3979 /* Finished to test till head control blcok, but could not find valid descriptor
3980 * from head to tail all descriptors are invalidated
3981 * host point of view head descriptor is next TX candidate
3982 * So, next descriptor control have to be programmed with head descriptor
3983 * check */
3984 if(nextDescReg != channelEntry->headCtrlBlk->linkedDescPhyAddr)
3985 {
3986 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnsonab79c8d2012-12-10 14:30:13 -08003987 "TX Async with not completed transferred frames, next descriptor must be head");
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05303988
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07003989 dxeChannelMonitor("!!! TX Async !!!", channelEntry, NULL);
3990 dxeChannelRegisterDump(channelEntry, "!!! TX Async !!!", NULL);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05303991
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07003992 wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
3993 validCtrlBlk->linkedDescPhyAddr);
3994 }
3995 break;
3996 }
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07003997 }
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07003998 }
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07003999 }
4000
Madan Mohan Koyyalamudi5f57c102012-10-15 15:52:54 -07004001 /* HW/SW descriptor resync is done.
4002 * Next if there are any valid descriptor in chain, Push to HW again */
4003 for(channelLoop = WDTS_CHANNEL_TX_LOW_PRI; channelLoop < WDTS_CHANNEL_RX_LOW_PRI; channelLoop++)
4004 {
4005 channelEntry = &pDxeCtrlBlk->dxeChannel[channelLoop];
4006 if(channelEntry->tailCtrlBlk == channelEntry->headCtrlBlk)
4007 {
4008 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
4009 "%11s : No TX Pending frame",
4010 channelType[channelEntry->channelType]);
4011 /* No Pending frame, Do nothing */
4012 }
4013 else
4014 {
4015 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
4016 "%11s : TX Pending frame, process it",
4017 channelType[channelEntry->channelType]);
4018 validCtrlBlk = channelEntry->tailCtrlBlk;
4019 for(descLoop = 0; descLoop < channelEntry->numDesc; descLoop++)
4020 {
4021 if(validCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID)
4022 {
4023 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
4024 "%11s : when exit IMPS found valid descriptor",
4025 channelType[channelEntry->channelType]);
4026
4027 /* Found valid descriptor, kick DXE */
4028 wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr,
4029 channelEntry->extraConfig.chan_mask);
4030 break;
4031 }
4032 validCtrlBlk = (WLANDXE_DescCtrlBlkType *)validCtrlBlk->nextCtrlBlk;
4033 if(validCtrlBlk == channelEntry->headCtrlBlk->nextCtrlBlk)
4034 {
4035 /* Finished to test till head control blcok, but could not find valid descriptor
4036 * from head to tail all descriptors are invalidated */
4037 break;
4038 }
4039 }
4040 }
4041 }
4042
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004043 wpalMemoryFree(msgPtr);
4044 return;
4045}
4046
Jeff Johnson295189b2012-06-20 16:38:30 -07004047/*==========================================================================
4048 @ Function Name
4049 dxeTXISR
4050
4051 @ Description
4052 TX interrupt ISR
4053 Platform will call this function if INT is happen
4054 This function must be registered into platform interrupt module
4055
4056 @ Parameters
4057 void *hostCtxt
4058 DXE host driver control context,
4059 pre registerd during interrupt registration
4060
4061 @ Return
4062 PAL_STATUS_T
4063===========================================================================*/
4064static void dxeTXISR
4065(
4066 void *hostCtxt
4067)
4068{
4069 WLANDXE_CtrlBlkType *dxeCtxt = (WLANDXE_CtrlBlkType *)hostCtxt;
4070 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4071#ifdef FEATURE_R33D
4072 wpt_uint32 regValue;
4073#endif /* FEATURE_R33D */
4074
4075 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004076 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004077
4078 /* Return from here if the RIVA is in IMPS, to avoid register access */
Jeff Johnsone7245742012-09-05 17:12:55 -07004079 if(WLANDXE_POWER_STATE_DOWN == dxeCtxt->hostPowerState)
Jeff Johnson295189b2012-06-20 16:38:30 -07004080 {
Jeff Johnsone7245742012-09-05 17:12:55 -07004081 dxeCtxt->txIntEnable = eWLAN_PAL_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004082 /* Disable interrupt at here,
4083 IMPS or IMPS Pending state should not access RIVA register */
4084 status = wpalDisableInterrupt(DXE_INTERRUPT_TX_COMPLE);
4085 if(eWLAN_PAL_STATUS_SUCCESS != status)
4086 {
4087 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4088 "dxeRXFrameReadyISR Disable RX ready interrupt fail");
4089 return;
4090 }
4091 dxeCtxt->txIntDisabledByIMPS = eWLAN_PAL_TRUE;
4092 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004093 "%s Riva is in %d, return from here ", __func__, dxeCtxt->hostPowerState);
Jeff Johnson295189b2012-06-20 16:38:30 -07004094 return;
4095 }
4096
4097#ifdef FEATURE_R33D
4098 status = wpalReadRegister(WLANDXE_INT_SRC_RAW_ADDRESS,
4099 &regValue);
4100 if(eWLAN_PAL_STATUS_SUCCESS != status)
4101 {
4102 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4103 "dxeTXCompISR Read INT_SRC_RAW fail");
4104 return;
4105 }
4106 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
4107 "INT_SRC_RAW 0x%x", regValue);
4108 if(0 == regValue)
4109 {
4110 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4111 "This is not DXE Interrupt, Reject it");
4112 return;
4113 }
4114#endif /* FEATURE_R33D */
4115
4116 /* Disable TX Complete Interrupt at here */
4117 status = wpalDisableInterrupt(DXE_INTERRUPT_TX_COMPLE);
4118 if(eWLAN_PAL_STATUS_SUCCESS != status)
4119 {
4120 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4121 "dxeTXCompISR Disable TX complete interrupt fail");
4122 return;
4123 }
4124 dxeCtxt->txIntEnable = eWLAN_PAL_FALSE;
4125
4126
4127 if( dxeCtxt->ucTxMsgCnt )
4128 {
4129 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
4130 "Avoiding serializing TX Complete event");
4131 return;
4132 }
4133
4134 dxeCtxt->ucTxMsgCnt = 1;
4135
4136 /* Serialize TX complete interrupt upon TX thread */
4137 HDXE_ASSERT(NULL != dxeCtxt->txIsrMsg);
4138 status = wpalPostTxMsg(WDI_GET_PAL_CTX(),
4139 dxeCtxt->txIsrMsg);
4140 if(eWLAN_PAL_STATUS_SUCCESS != status)
4141 {
4142 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
4143 "dxeTXCompISR interrupt serialize fail status=%d", status);
4144 }
4145
4146 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004147 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004148 return;
4149}
4150
4151/*-------------------------------------------------------------------------
4152 * Global Function
4153 *-------------------------------------------------------------------------*/
4154/*==========================================================================
4155 @ Function Name
4156 WLANDXE_Open
4157
4158 @ Description
4159 Open host DXE driver, allocate DXE resources
4160 Allocate, DXE local control block, DXE descriptor pool, DXE descriptor control block pool
4161
4162 @ Parameters
Jeff Johnsona8a1a482012-12-12 16:49:33 -08004163 pVoid pAdapter : Driver global control block pointer
Jeff Johnson295189b2012-06-20 16:38:30 -07004164
4165 @ Return
4166 pVoid DXE local module control block pointer
4167===========================================================================*/
4168void *WLANDXE_Open
4169(
4170 void
4171)
4172{
4173 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4174 unsigned int idx;
4175 WLANDXE_ChannelCBType *currentChannel = NULL;
4176 int smsmInitState;
4177#ifdef WLANDXE_TEST_CHANNEL_ENABLE
4178 wpt_uint32 sIdx;
4179 WLANDXE_ChannelCBType *channel = NULL;
4180 WLANDXE_DescCtrlBlkType *crntDescCB = NULL;
4181 WLANDXE_DescCtrlBlkType *nextDescCB = NULL;
4182#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
4183
4184 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004185 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004186
4187 /* This is temporary allocation */
4188 tempDxeCtrlBlk = (WLANDXE_CtrlBlkType *)wpalMemoryAllocate(sizeof(WLANDXE_CtrlBlkType));
4189 if(NULL == tempDxeCtrlBlk)
4190 {
4191 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4192 "WLANDXE_Open Control Block Alloc Fail");
4193 return NULL;
4194 }
4195 wpalMemoryZero(tempDxeCtrlBlk, sizeof(WLANDXE_CtrlBlkType));
4196
4197 status = dxeCommonDefaultConfig(tempDxeCtrlBlk);
4198 if(eWLAN_PAL_STATUS_SUCCESS != status)
4199 {
4200 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4201 "WLANDXE_Open Common Configuration Fail");
4202 WLANDXE_Close(tempDxeCtrlBlk);
4203 return NULL;
4204 }
4205
4206 for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++)
4207 {
4208 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4209 "WLANDXE_Open Channel %s Open Start", channelType[idx]);
4210 currentChannel = &tempDxeCtrlBlk->dxeChannel[idx];
4211 if(idx == WDTS_CHANNEL_TX_LOW_PRI)
4212 {
4213 currentChannel->channelType = WDTS_CHANNEL_TX_LOW_PRI;
4214 }
4215 else if(idx == WDTS_CHANNEL_TX_HIGH_PRI)
4216 {
4217 currentChannel->channelType = WDTS_CHANNEL_TX_HIGH_PRI;
4218 }
4219 else if(idx == WDTS_CHANNEL_RX_LOW_PRI)
4220 {
4221 currentChannel->channelType = WDTS_CHANNEL_RX_LOW_PRI;
4222 }
4223 else if(idx == WDTS_CHANNEL_RX_HIGH_PRI)
4224 {
4225 currentChannel->channelType = WDTS_CHANNEL_RX_HIGH_PRI;
4226 }
4227#ifdef WLANDXE_TEST_CHANNEL_ENABLE
4228 else if(idx == WDTS_CHANNEL_H2H_TEST_TX)
4229 {
4230 currentChannel->channelType = WDTS_CHANNEL_H2H_TEST_TX;
4231 }
4232 else if(idx == WDTS_CHANNEL_H2H_TEST_RX)
4233 {
4234 currentChannel->channelType = WDTS_CHANNEL_H2H_TEST_RX;
4235 }
4236#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
4237
4238 /* Config individual channels from channel default setup table */
4239 status = dxeChannelDefaultConfig(tempDxeCtrlBlk,
4240 currentChannel);
4241 if(eWLAN_PAL_STATUS_SUCCESS != status)
4242 {
4243 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4244 "WLANDXE_Open Channel Basic Configuration Fail for channel %d", idx);
4245 WLANDXE_Close(tempDxeCtrlBlk);
4246 return NULL;
4247 }
4248
4249 /* Allocate DXE Control Block will be used by host DXE driver */
4250 status = dxeCtrlBlkAlloc(tempDxeCtrlBlk, currentChannel);
4251 if(eWLAN_PAL_STATUS_SUCCESS != status)
4252 {
4253 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4254 "WLANDXE_Open Alloc DXE Control Block Fail for channel %d", idx);
4255
4256 WLANDXE_Close(tempDxeCtrlBlk);
4257 return NULL;
4258 }
4259 status = wpalMutexInit(&currentChannel->dxeChannelLock);
4260 if(eWLAN_PAL_STATUS_SUCCESS != status)
4261 {
4262 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4263 "WLANDXE_Open Lock Init Fail for channel %d", idx);
4264 WLANDXE_Close(tempDxeCtrlBlk);
4265 return NULL;
4266 }
4267
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -07004268 status = wpalTimerInit(&currentChannel->healthMonitorTimer,
4269 dxeHealthMonitorTimeout,
4270 (void *)currentChannel);
4271 if(eWLAN_PAL_STATUS_SUCCESS != status)
4272 {
4273 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4274 "WLANDXE_Open Health Monitor timer init fail %d", idx);
4275 WLANDXE_Close(tempDxeCtrlBlk);
4276 return NULL;
4277 }
4278
4279 currentChannel->healthMonitorMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
4280 if(NULL == currentChannel->healthMonitorMsg)
4281 {
4282 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4283 "WLANDXE_Open Health Monitor MSG Alloc fail %d", idx);
4284 WLANDXE_Close(tempDxeCtrlBlk);
4285 return NULL;
4286 }
4287 wpalMemoryZero(currentChannel->healthMonitorMsg, sizeof(wpt_msg));
4288 currentChannel->healthMonitorMsg->callback = dxeTXHealthMonitor;
4289 currentChannel->healthMonitorMsg->pContext = (void *)currentChannel;
4290
Jeff Johnson295189b2012-06-20 16:38:30 -07004291 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4292 "WLANDXE_Open Channel %s Open Success", channelType[idx]);
4293 }
4294
4295 /* Allocate and Init RX READY ISR Serialize Buffer */
4296 tempDxeCtrlBlk->rxIsrMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
4297 if(NULL == tempDxeCtrlBlk->rxIsrMsg)
4298 {
4299 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4300 "WLANDXE_Open Alloc RX ISR Fail");
4301 WLANDXE_Close(tempDxeCtrlBlk);
4302 return NULL;
4303 }
4304 wpalMemoryZero(tempDxeCtrlBlk->rxIsrMsg, sizeof(wpt_msg));
4305 tempDxeCtrlBlk->rxIsrMsg->callback = dxeRXEventHandler;
4306 tempDxeCtrlBlk->rxIsrMsg->pContext = (void *)tempDxeCtrlBlk;
4307
4308 /* Allocate and Init TX COMP ISR Serialize Buffer */
4309 tempDxeCtrlBlk->txIsrMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
4310 if(NULL == tempDxeCtrlBlk->txIsrMsg)
4311 {
4312 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4313 "WLANDXE_Open Alloc TX ISR Fail");
4314 WLANDXE_Close(tempDxeCtrlBlk);
4315 return NULL;
4316 }
4317 wpalMemoryZero(tempDxeCtrlBlk->txIsrMsg, sizeof(wpt_msg));
4318 tempDxeCtrlBlk->txIsrMsg->callback = dxeTXEventHandler;
4319 tempDxeCtrlBlk->txIsrMsg->pContext = (void *)tempDxeCtrlBlk;
4320
4321 /* Allocate and Init RX Packet Available Serialize Message Buffer */
4322 tempDxeCtrlBlk->rxPktAvailMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
4323 if(NULL == tempDxeCtrlBlk->rxPktAvailMsg)
4324 {
4325 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4326 "WLANDXE_Open Alloc RX Packet Available Message Fail");
4327 WLANDXE_Close(tempDxeCtrlBlk);
4328 return NULL;
4329 }
4330 wpalMemoryZero(tempDxeCtrlBlk->rxPktAvailMsg, sizeof(wpt_msg));
4331 tempDxeCtrlBlk->rxPktAvailMsg->callback = dxeRXPacketAvailableEventHandler;
4332 tempDxeCtrlBlk->rxPktAvailMsg->pContext = (void *)tempDxeCtrlBlk;
4333
4334 tempDxeCtrlBlk->freeRXPacket = NULL;
4335 tempDxeCtrlBlk->dxeCookie = WLANDXE_CTXT_COOKIE;
4336 tempDxeCtrlBlk->rxIntDisabledByIMPS = eWLAN_PAL_FALSE;
4337 tempDxeCtrlBlk->txIntDisabledByIMPS = eWLAN_PAL_FALSE;
Jeff Johnsone7245742012-09-05 17:12:55 -07004338 tempDxeCtrlBlk->driverReloadInProcessing = eWLAN_PAL_FALSE;
Leo Changac1d3612013-07-01 15:15:51 -07004339 tempDxeCtrlBlk->smsmToggled = eWLAN_PAL_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004340
4341 /* Initialize SMSM state
4342 * Init State is
4343 * Clear TX Enable
4344 * RING EMPTY STATE */
4345 smsmInitState = wpalNotifySmsm(WPAL_SMSM_WLAN_TX_ENABLE,
4346 WPAL_SMSM_WLAN_TX_RINGS_EMPTY);
4347 if(0 != smsmInitState)
4348 {
4349 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4350 "SMSM Channel init fail %d", smsmInitState);
4351 for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++)
4352 {
4353 dxeChannelClose(tempDxeCtrlBlk, &tempDxeCtrlBlk->dxeChannel[idx]);
4354 }
Madan Mohan Koyyalamudibe3597f2012-11-15 17:33:55 -08004355 wpalMemoryFree(tempDxeCtrlBlk->rxIsrMsg);
4356 wpalMemoryFree(tempDxeCtrlBlk->txIsrMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -07004357 wpalMemoryFree(tempDxeCtrlBlk);
4358 return NULL;
4359 }
4360
4361 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4362 "WLANDXE_Open Success");
4363 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004364 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004365 return (void *)tempDxeCtrlBlk;
4366}
4367
4368/*==========================================================================
4369 @ Function Name
4370 WLANDXE_ClientRegistration
4371
4372 @ Description
4373 Make callback functions registration into DXE driver from DXE driver client
4374
4375 @ Parameters
4376 pVoid pDXEContext : DXE module control block
4377 WDTS_RxFrameReadyCbType rxFrameReadyCB : RX Frame ready CB function pointer
4378 WDTS_TxCompleteCbType txCompleteCB : TX complete CB function pointer
4379 WDTS_LowResourceCbType lowResourceCB : Low DXE resource notification CB function pointer
4380 void *userContext : DXE Cliennt control block
4381
4382 @ Return
4383 wpt_status
4384===========================================================================*/
4385wpt_status WLANDXE_ClientRegistration
4386(
4387 void *pDXEContext,
4388 WLANDXE_RxFrameReadyCbType rxFrameReadyCB,
4389 WLANDXE_TxCompleteCbType txCompleteCB,
4390 WLANDXE_LowResourceCbType lowResourceCB,
4391 void *userContext
4392)
4393{
4394 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4395 WLANDXE_CtrlBlkType *dxeCtxt;
4396
4397 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004398 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004399
4400 /* Sanity */
4401 if(NULL == pDXEContext)
4402 {
4403 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4404 "WLANDXE_ClientRegistration Invalid DXE CB");
4405 return eWLAN_PAL_STATUS_E_INVAL;
4406 }
4407
4408 if(NULL == rxFrameReadyCB)
4409 {
4410 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4411 "WLANDXE_ClientRegistration Invalid RX READY CB");
4412 return eWLAN_PAL_STATUS_E_INVAL;
4413 }
4414
4415 if(NULL == txCompleteCB)
4416 {
4417 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4418 "WLANDXE_ClientRegistration Invalid txCompleteCB");
4419 return eWLAN_PAL_STATUS_E_INVAL;
4420 }
4421
4422 if(NULL == lowResourceCB)
4423 {
4424 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4425 "WLANDXE_ClientRegistration Invalid lowResourceCB");
4426 return eWLAN_PAL_STATUS_E_INVAL;
4427 }
4428
4429 if(NULL == userContext)
4430 {
4431 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4432 "WLANDXE_ClientRegistration Invalid userContext");
4433 return eWLAN_PAL_STATUS_E_INVAL;
4434 }
4435
4436 dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
4437
4438 /* Assign */
4439 dxeCtxt->rxReadyCB = rxFrameReadyCB;
4440 dxeCtxt->txCompCB = txCompleteCB;
4441 dxeCtxt->lowResourceCB = lowResourceCB;
4442 dxeCtxt->clientCtxt = userContext;
4443
4444 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004445 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004446 return status;
4447}
4448
4449/*==========================================================================
4450 @ Function Name
4451 WLANDXE_Start
4452
4453 @ Description
4454 Start Host DXE driver
4455 Initialize DXE channels and start channel
4456
4457 @ Parameters
4458 pVoid pDXEContext : DXE module control block
4459
4460 @ Return
4461 wpt_status
4462===========================================================================*/
4463wpt_status WLANDXE_Start
4464(
4465 void *pDXEContext
4466)
4467{
4468 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4469 wpt_uint32 idx;
4470 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
4471
4472 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004473 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004474
4475 /* Sanity */
4476 if(NULL == pDXEContext)
4477 {
4478 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4479 "WLANDXE_Start Invalid DXE CB");
4480 return eWLAN_PAL_STATUS_E_INVAL;
4481 }
4482 dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
4483
4484 /* WLANDXE_Start called means DXE engine already initiates
4485 * And DXE HW is reset and init finished
4486 * But here to make sure HW is initialized, reset again */
4487 status = dxeEngineCoreStart(dxeCtxt);
4488 if(eWLAN_PAL_STATUS_SUCCESS != status)
4489 {
4490 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4491 "WLANDXE_Start DXE HW init Fail");
4492 return status;
4493 }
4494
4495 /* Individual Channel Start */
4496 for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++)
4497 {
4498 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4499 "WLANDXE_Start Channel %s Start", channelType[idx]);
4500
4501 /* Allocate DXE descriptor will be shared by Host driver and DXE engine */
4502 /* Make connection between DXE descriptor and DXE control block */
4503 status = dxeDescAllocAndLink(tempDxeCtrlBlk, &dxeCtxt->dxeChannel[idx]);
4504 if(eWLAN_PAL_STATUS_SUCCESS != status)
4505 {
4506 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4507 "WLANDXE_Start Alloc DXE Descriptor Fail for channel %d", idx);
4508 return status;
4509 }
4510
4511 /* Program each channel register with configuration arguments */
4512 status = dxeChannelInitProgram(dxeCtxt,
4513 &dxeCtxt->dxeChannel[idx]);
4514 if(eWLAN_PAL_STATUS_SUCCESS != status)
4515 {
4516 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4517 "WLANDXE_Start %d Program DMA channel Fail", idx);
4518 return status;
4519 }
4520
4521 /* ??? Trigger to start DMA channel
4522 * This must be seperated from ??? */
4523 status = dxeChannelStart(dxeCtxt,
4524 &dxeCtxt->dxeChannel[idx]);
4525 if(eWLAN_PAL_STATUS_SUCCESS != status)
4526 {
4527 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4528 "WLANDXE_Start %d Channel Start Fail", idx);
4529 return status;
4530 }
4531 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4532 "WLANDXE_Start Channel %s Start Success", channelType[idx]);
4533 }
4534
4535 /* Register ISR to OS */
4536 /* Register TX complete interrupt into platform */
4537 status = wpalRegisterInterrupt(DXE_INTERRUPT_TX_COMPLE,
4538 dxeTXISR,
4539 dxeCtxt);
4540 if(eWLAN_PAL_STATUS_SUCCESS != status)
4541 {
4542 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4543 "WLANDXE_Start TX comp interrupt registration Fail");
4544 return status;
4545 }
4546
4547 /* Register RX ready interrupt into platform */
4548 status = wpalRegisterInterrupt(DXE_INTERRUPT_RX_READY,
4549 dxeRXISR,
4550 dxeCtxt);
4551 if(eWLAN_PAL_STATUS_SUCCESS != status)
4552 {
4553 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4554 "WLANDXE_Start RX Ready interrupt registration Fail");
4555 return status;
4556 }
4557
4558 /* Enable system level ISR */
4559 /* Enable RX ready Interrupt at here */
4560 status = wpalEnableInterrupt(DXE_INTERRUPT_RX_READY);
4561 if(eWLAN_PAL_STATUS_SUCCESS != status)
4562 {
4563 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4564 "dxeTXCompleteEventHandler Enable TX complete interrupt fail");
4565 return status;
4566 }
4567
4568 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004569 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004570 return status;
4571}
4572
4573/*==========================================================================
4574 @ Function Name
4575 WLANDXE_TXFrame
4576
4577 @ Description
4578 Trigger frame transmit from host to RIVA
4579
4580 @ Parameters
4581 pVoid pDXEContext : DXE Control Block
4582 wpt_packet pPacket : transmit packet structure
4583 WDTS_ChannelType channel : TX channel
4584
4585 @ Return
4586 wpt_status
4587===========================================================================*/
4588wpt_status WLANDXE_TxFrame
4589(
4590 void *pDXEContext,
4591 wpt_packet *pPacket,
4592 WDTS_ChannelType channel
4593)
4594{
4595 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4596 WLANDXE_ChannelCBType *currentChannel = NULL;
4597 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
4598 unsigned int *lowThreshold = NULL;
4599
4600 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004601 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004602
4603 /* Sanity */
4604 if(NULL == pDXEContext)
4605 {
4606 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4607 "WLANDXE_Start Invalid DXE CB");
4608 return eWLAN_PAL_STATUS_E_INVAL;
4609 }
4610
4611 if(NULL == pPacket)
4612 {
4613 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4614 "WLANDXE_Start Invalid pPacket");
4615 return eWLAN_PAL_STATUS_E_INVAL;
4616 }
4617
4618 if((WDTS_CHANNEL_MAX < channel) || (WDTS_CHANNEL_MAX == channel))
4619 {
4620 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4621 "WLANDXE_Start Invalid channel");
4622 return eWLAN_PAL_STATUS_E_INVAL;
4623 }
4624
4625 dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
4626
4627 currentChannel = &dxeCtxt->dxeChannel[channel];
4628
4629
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08004630 status = wpalMutexAcquire(&currentChannel->dxeChannelLock);
4631 if(eWLAN_PAL_STATUS_SUCCESS != status)
4632 {
4633 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4634 "WLANDXE_TxFrame Mutex Acquire fail");
4635 return status;
4636 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004637
4638 lowThreshold = currentChannel->channelType == WDTS_CHANNEL_TX_LOW_PRI?
4639 &(dxeCtxt->txCompInt.txLowResourceThreshold_LoPriCh):
4640 &(dxeCtxt->txCompInt.txLowResourceThreshold_HiPriCh);
4641
4642 /* Decide have to activate TX complete event or not */
4643 switch(dxeCtxt->txCompInt.txIntEnable)
4644 {
4645 /* TX complete interrupt will be activated when low DXE resource */
4646 case WLANDXE_TX_COMP_INT_LR_THRESHOLD:
4647 if((currentChannel->numFreeDesc <= *lowThreshold) &&
4648 (eWLAN_PAL_FALSE == dxeCtxt->txIntEnable))
4649 {
4650 dxeCtxt->txIntEnable = eWLAN_PAL_TRUE;
4651 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
4652 channel,
4653 eWLAN_PAL_FALSE);
4654 }
4655 break;
4656
Jeff Johnsonab79c8d2012-12-10 14:30:13 -08004657 /* TX complete interrupt will be activated n number of frames transferred */
Jeff Johnson295189b2012-06-20 16:38:30 -07004658 case WLANDXE_TX_COMP_INT_PER_K_FRAMES:
4659 if(channel == WDTS_CHANNEL_TX_LOW_PRI)
4660 {
4661 currentChannel->numFrameBeforeInt++;
4662 }
4663 break;
4664
4665 /* TX complete interrupt will be activated periodically */
4666 case WLANDXE_TX_COMP_INT_TIMER:
4667 break;
4668 }
4669
4670 dxeCtxt->txCompletedFrames++;
4671
4672 /* Update DXE descriptor, this is frame based
4673 * if a frame consist of N fragments, N Descriptor will be programed */
4674 status = dxeTXPushFrame(currentChannel, pPacket);
4675 if(eWLAN_PAL_STATUS_SUCCESS != status)
4676 {
4677 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4678 "WLANDXE_TxFrame TX Push Frame fail");
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08004679 status = wpalMutexRelease(&currentChannel->dxeChannelLock);
4680 if(eWLAN_PAL_STATUS_SUCCESS != status)
4681 {
4682 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4683 "WLANDXE_TxFrame Mutex Release fail");
4684 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004685 return status;
4686 }
4687
4688 /* If specific channel hit low resource condition, send notification to upper layer */
4689 if(currentChannel->numFreeDesc <= *lowThreshold)
4690 {
4691 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
4692 channel,
4693 eWLAN_PAL_FALSE);
4694 currentChannel->hitLowResource = eWLAN_PAL_TRUE;
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -07004695
4696 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4697 "%11s : Low Resource currentChannel->numRsvdDesc %d",
4698 channelType[currentChannel->channelType],
4699 currentChannel->numRsvdDesc);
4700 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
4701 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
4702 wpalTimerStart(&currentChannel->healthMonitorTimer,
4703 T_WLANDXE_PERIODIC_HEALTH_M_TIME);
Jeff Johnson295189b2012-06-20 16:38:30 -07004704 }
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08004705 status = wpalMutexRelease(&currentChannel->dxeChannelLock);
4706 if(eWLAN_PAL_STATUS_SUCCESS != status)
4707 {
4708 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4709 "WLANDXE_TxFrame Mutex Release fail");
4710 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004711
4712 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004713 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004714 return status;
4715}
4716
4717/*==========================================================================
4718 @ Function Name
4719 WLANDXE_CompleteTX
4720
4721 @ Description
4722 Informs DXE that the current series of Tx packets is complete
4723
4724 @ Parameters
4725 pContext pDXEContext : DXE Control Block
4726 ucTxResReq TX resource number required by TL/WDI
4727
4728 @ Return
4729 wpt_status
4730===========================================================================*/
4731wpt_status
4732WLANDXE_CompleteTX
4733(
4734 void* pContext,
4735 wpt_uint32 ucTxResReq
4736)
4737{
4738 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4739 WLANDXE_CtrlBlkType *dxeCtxt = (WLANDXE_CtrlBlkType *)(pContext);
4740 WLANDXE_ChannelCBType *channelCb = NULL;
4741 wpt_boolean inLowRes;
4742
4743 /* Sanity Check */
4744 if( NULL == pContext )
4745 {
4746 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4747 "WLANDXE_CompleteTX invalid param");
4748 return eWLAN_PAL_STATUS_E_INVAL;
4749 }
4750
4751 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI];
4752 inLowRes = channelCb->hitLowResource;
4753
4754 if(WLANDXE_TX_LOW_RES_THRESHOLD < ucTxResReq)
4755 {
4756 /* Raise threshold temporarily if necessary */
4757 dxeCtxt->txCompInt.txLowResourceThreshold_LoPriCh = ucTxResReq;
4758
4759 if(eWLAN_PAL_FALSE == inLowRes)
4760 {
4761 /* Put the channel to low resource condition */
4762 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
4763 WDTS_CHANNEL_TX_LOW_PRI,
4764 eWLAN_PAL_FALSE);
4765 inLowRes = channelCb->hitLowResource = eWLAN_PAL_TRUE;
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -07004766 wpalTimerStart(&channelCb->healthMonitorTimer,
4767 T_WLANDXE_PERIODIC_HEALTH_M_TIME);
Jeff Johnson295189b2012-06-20 16:38:30 -07004768 }
4769 }
4770
4771 /*Try to reclaim resources*/
4772 dxeTXCompleteProcessing(dxeCtxt);
4773
4774 /* In previous WLANTL_GetFrames call, TL didn't fetch a packet
4775 because its fragment size is larger than DXE free resource. */
4776 if(0 < ucTxResReq)
4777 {
4778 /* DXE successfully claimed enough free DXE resouces for next fetch. */
4779 if(WLANDXE_GetFreeTxDataResNumber(dxeCtxt) >= ucTxResReq)
4780 {
4781 /* DXE has not been in low resource condition. DXE forces to kick off
4782 TX tranmit */
4783 if((eWLAN_PAL_FALSE == inLowRes) &&
4784 (eWLAN_PAL_FALSE == channelCb->hitLowResource))
4785 {
4786 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
4787 WDTS_CHANNEL_TX_LOW_PRI,
4788 eWLAN_PAL_FALSE);
4789 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
4790 WDTS_CHANNEL_TX_LOW_PRI,
4791 eWLAN_PAL_TRUE);
4792 channelCb->hitLowResource = eWLAN_PAL_FALSE;
4793 }
4794 }
4795 else
4796 {
4797 /* DXE doesn't have enough free DXE resources. Put the channel
4798 to low resource condition. */
4799 if(eWLAN_PAL_FALSE == channelCb->hitLowResource)
4800 {
4801 /* Put the channel to low resource condition */
4802 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
4803 WDTS_CHANNEL_TX_LOW_PRI,
4804 eWLAN_PAL_FALSE);
4805 channelCb->hitLowResource = eWLAN_PAL_TRUE;
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -07004806 wpalTimerStart(&channelCb->healthMonitorTimer,
4807 T_WLANDXE_PERIODIC_HEALTH_M_TIME);
Jeff Johnson295189b2012-06-20 16:38:30 -07004808 }
4809 }
4810 }
4811
4812 return status;
4813}
4814
4815/*==========================================================================
4816 @ Function Name
4817 WLANDXE_Stop
4818
4819 @ Description
4820 Stop DXE channels and DXE engine operations
4821 Disable all channel interrupt
4822 Stop all channel operation
4823
4824 @ Parameters
4825 pVoid pDXEContext : DXE Control Block
4826
4827 @ Return
4828 wpt_status
4829===========================================================================*/
4830wpt_status WLANDXE_Stop
4831(
4832 void *pDXEContext
4833)
4834{
4835 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4836 wpt_uint32 idx;
4837 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
4838
4839 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004840 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004841
4842 /* Sanity */
4843 if(NULL == pDXEContext)
4844 {
4845 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4846 "WLANDXE_Stop Invalid DXE CB");
4847 return eWLAN_PAL_STATUS_E_INVAL;
4848 }
4849
4850 dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
4851 for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++)
4852 {
Yue Ma7faf58c2013-04-25 12:04:13 -07004853 if(VOS_TIMER_STATE_RUNNING == wpalTimerGetCurStatus(&dxeCtxt->dxeChannel[idx].healthMonitorTimer))
4854 {
4855 wpalTimerStop(&dxeCtxt->dxeChannel[idx].healthMonitorTimer);
4856 }
4857
Jeff Johnson295189b2012-06-20 16:38:30 -07004858 status = dxeChannelStop(dxeCtxt, &dxeCtxt->dxeChannel[idx]);
4859 if(eWLAN_PAL_STATUS_SUCCESS != status)
4860 {
4861 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4862 "WLANDXE_Stop Channel %d Stop Fail", idx);
4863 return status;
4864 }
4865 }
4866
4867 /* During Stop unregister interrupt */
4868 wpalUnRegisterInterrupt(DXE_INTERRUPT_TX_COMPLE);
4869 wpalUnRegisterInterrupt(DXE_INTERRUPT_RX_READY);
4870
4871 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004872 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004873 return status;
4874}
4875
4876/*==========================================================================
4877 @ Function Name
4878 WLANDXE_Close
4879
4880 @ Description
4881 Close DXE channels
4882 Free DXE related resources
4883 DXE descriptor free
4884 Descriptor control block free
4885 Pre allocated RX buffer free
4886
4887 @ Parameters
4888 pVoid pDXEContext : DXE Control Block
4889
4890 @ Return
4891 wpt_status
4892===========================================================================*/
4893wpt_status WLANDXE_Close
4894(
4895 void *pDXEContext
4896)
4897{
4898 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4899 wpt_uint32 idx;
4900 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
4901#ifdef WLANDXE_TEST_CHANNEL_ENABLE
4902 wpt_uint32 sIdx;
4903 WLANDXE_ChannelCBType *channel = NULL;
4904 WLANDXE_DescCtrlBlkType *crntDescCB = NULL;
4905 WLANDXE_DescCtrlBlkType *nextDescCB = NULL;
4906#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
4907
4908 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004909 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004910
4911 /* Sanity */
4912 if(NULL == pDXEContext)
4913 {
4914 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4915 "WLANDXE_Stop Invalid DXE CB");
4916 return eWLAN_PAL_STATUS_E_INVAL;
4917 }
4918
4919 dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
4920 for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++)
4921 {
4922 wpalMutexDelete(&dxeCtxt->dxeChannel[idx].dxeChannelLock);
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -07004923 wpalTimerDelete(&dxeCtxt->dxeChannel[idx].healthMonitorTimer);
4924 if(NULL != dxeCtxt->dxeChannel[idx].healthMonitorMsg)
4925 {
4926 wpalMemoryFree(dxeCtxt->dxeChannel[idx].healthMonitorMsg);
4927 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004928 dxeChannelClose(dxeCtxt, &dxeCtxt->dxeChannel[idx]);
4929#ifdef WLANDXE_TEST_CHANNEL_ENABLE
4930 channel = &dxeCtxt->dxeChannel[idx];
4931 crntDescCB = channel->headCtrlBlk;
4932 for(sIdx = 0; sIdx < channel->numDesc; sIdx++)
4933 {
4934 nextDescCB = (WLANDXE_DescCtrlBlkType *)crntDescCB->nextCtrlBlk;
4935 wpalMemoryFree((void *)crntDescCB);
4936 crntDescCB = nextDescCB;
4937 if(NULL == crntDescCB)
4938 {
4939 break;
4940 }
4941 }
4942#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
4943 }
4944
4945 if(NULL != dxeCtxt->rxIsrMsg)
4946 {
4947 wpalMemoryFree(dxeCtxt->rxIsrMsg);
4948 }
4949 if(NULL != dxeCtxt->txIsrMsg)
4950 {
4951 wpalMemoryFree(dxeCtxt->txIsrMsg);
4952 }
4953 if(NULL != dxeCtxt->rxPktAvailMsg)
4954 {
4955 wpalMemoryFree(dxeCtxt->rxPktAvailMsg);
4956 }
4957
4958 wpalMemoryFree(pDXEContext);
4959
4960 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004961 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004962 return status;
4963}
4964
4965/*==========================================================================
4966 @ Function Name
4967 WLANDXE_TriggerTX
4968
4969 @ Description
4970 TBD
4971
4972 @ Parameters
4973 pVoid pDXEContext : DXE Control Block
4974
4975 @ Return
4976 wpt_status
4977===========================================================================*/
4978wpt_status WLANDXE_TriggerTX
4979(
4980 void *pDXEContext
4981)
4982{
4983 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4984
4985 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004986 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004987
4988 /* TBD */
4989
4990 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004991 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004992 return status;
4993}
4994
4995/*==========================================================================
4996 @ Function Name
4997 dxeTxThreadSetPowerStateEventHandler
4998
4999 @ Description
5000 If WDI sends set power state req, this event handler will be called in Tx
5001 thread context
5002
5003 @ Parameters
5004 void *msgPtr
5005 Event MSG
5006
5007 @ Return
5008 None
5009===========================================================================*/
5010void dxeTxThreadSetPowerStateEventHandler
5011(
5012 wpt_msg *msgPtr
5013)
5014{
5015 wpt_msg *msgContent = (wpt_msg *)msgPtr;
5016 WLANDXE_CtrlBlkType *dxeCtxt;
5017 wpt_status status = eWLAN_PAL_STATUS_E_FAILURE;
5018 WLANDXE_PowerStateType reqPowerState;
5019
5020 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005021 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005022
Jeff Johnson295189b2012-06-20 16:38:30 -07005023 dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
5024 reqPowerState = (WLANDXE_PowerStateType)msgContent->val;
5025 dxeCtxt->setPowerStateCb = (WLANDXE_SetPowerStateCbType)msgContent->ptr;
5026
5027 switch(reqPowerState)
5028 {
5029 case WLANDXE_POWER_STATE_BMPS:
5030 if(WLANDXE_RIVA_POWER_STATE_ACTIVE == dxeCtxt->rivaPowerState)
5031 {
5032 //don't block MC waiting for num_rsvd to become 0 since it may take a while
5033 //based on amount of TX and RX activity - during this time any received
5034 // management frames will remain un-processed consuming RX buffers
5035 dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN;
5036 dxeCtxt->hostPowerState = reqPowerState;
5037 }
5038 else
5039 {
5040 status = eWLAN_PAL_STATUS_E_INVAL;
5041 }
5042 break;
5043 case WLANDXE_POWER_STATE_IMPS:
5044 if(WLANDXE_RIVA_POWER_STATE_ACTIVE == dxeCtxt->rivaPowerState)
5045 {
5046 dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_IMPS_UNKNOWN;
5047 }
5048 else
5049 {
5050 status = eWLAN_PAL_STATUS_E_INVAL;
5051 }
5052 break;
5053 case WLANDXE_POWER_STATE_FULL:
5054 if(WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN == dxeCtxt->rivaPowerState)
5055 {
5056 dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_ACTIVE;
5057 }
5058 dxeCtxt->hostPowerState = reqPowerState;
5059 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
5060 break;
5061 case WLANDXE_POWER_STATE_DOWN:
5062 WLANDXE_Stop((void *)dxeCtxt);
5063 break;
5064 default:
5065 //assert
5066 break;
5067 }
5068
5069 if(WLANDXE_POWER_STATE_BMPS_PENDING != dxeCtxt->hostPowerState)
5070 {
5071 dxeCtxt->setPowerStateCb(status,
5072 dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].descBottomLocPhyAddr);
5073 }
Ravali85acf6b2012-12-12 14:01:38 -08005074 else
5075 {
5076 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
5077 "%s State of DXE is WLANDXE_POWER_STATE_BMPS_PENDING, so cannot proceed", __func__);
5078 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005079 /* Free MSG buffer */
5080 wpalMemoryFree(msgPtr);
5081 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005082 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005083 return;
5084}
5085
5086
5087/*==========================================================================
5088 @ Function Name
5089 dxeRxThreadSetPowerStateEventHandler
5090
5091 @ Description
5092 If WDI sends set power state req, this event handler will be called in Rx
5093 thread context
5094
5095 @ Parameters
5096 void *msgPtr
5097 Event MSG
5098
5099 @ Return
5100 None
5101===========================================================================*/
5102void dxeRxThreadSetPowerStateEventHandler
5103(
5104 wpt_msg *msgPtr
5105)
5106{
5107 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5108
5109 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005110 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005111
5112 /* Now serialise the message through Tx thread also to make sure
5113 * no register access when RIVA is in powersave */
5114 /*Use the same message pointer just change the call back function */
5115 msgPtr->callback = dxeTxThreadSetPowerStateEventHandler;
5116 status = wpalPostTxMsg(WDI_GET_PAL_CTX(),
5117 msgPtr);
5118 if ( eWLAN_PAL_STATUS_SUCCESS != status )
5119 {
5120 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5121 "Tx thread Set power state req serialize fail status=%d",
5122 status, 0, 0);
5123 }
5124
5125 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005126 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005127}
5128
5129/*==========================================================================
5130 @ Function Name
5131 WLANDXE_SetPowerState
5132
5133 @ Description
5134 From Client let DXE knows what is the WLAN HW(RIVA) power state
5135
5136 @ Parameters
5137 pVoid pDXEContext : DXE Control Block
5138 WLANDXE_PowerStateType powerState
5139
5140 @ Return
5141 wpt_status
5142===========================================================================*/
5143wpt_status WLANDXE_SetPowerState
5144(
5145 void *pDXEContext,
5146 WDTS_PowerStateType powerState,
5147 WDTS_SetPSCbType cBack
5148)
5149{
5150 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5151 WLANDXE_CtrlBlkType *pDxeCtrlBlk;
5152 WLANDXE_PowerStateType hostPowerState;
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07005153 wpt_msg *rxCompMsg;
5154 wpt_msg *txDescReSyncMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -07005155
5156 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005157 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005158 if(NULL == pDXEContext)
5159 {
5160 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5161 "NULL pDXEContext passed by caller", 0, 0, 0);
5162 return eWLAN_PAL_STATUS_E_FAILURE;
5163 }
5164 pDxeCtrlBlk = (WLANDXE_CtrlBlkType *)pDXEContext;
5165
Jeff Johnson295189b2012-06-20 16:38:30 -07005166 switch(powerState)
5167 {
5168 case WDTS_POWER_STATE_FULL:
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07005169 if(WLANDXE_POWER_STATE_IMPS == pDxeCtrlBlk->hostPowerState)
5170 {
5171 txDescReSyncMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
5172 if(NULL == txDescReSyncMsg)
5173 {
5174 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5175 "WLANDXE_SetPowerState, TX Resync MSG MEM alloc Fail");
5176 }
5177 else
5178 {
5179 txDescReSyncMsg->callback = dxeTXReSyncDesc;
5180 txDescReSyncMsg->pContext = pDxeCtrlBlk;
5181 status = wpalPostTxMsg(WDI_GET_PAL_CTX(),
5182 txDescReSyncMsg);
5183 if(eWLAN_PAL_STATUS_SUCCESS != status)
5184 {
5185 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5186 "WLANDXE_SetPowerState, Post TX re-sync MSG fail");
5187 }
5188 }
5189 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005190 hostPowerState = WLANDXE_POWER_STATE_FULL;
5191 break;
5192 case WDTS_POWER_STATE_BMPS:
5193 pDxeCtrlBlk->hostPowerState = WLANDXE_POWER_STATE_BMPS;
5194 hostPowerState = WLANDXE_POWER_STATE_BMPS;
5195 break;
5196 case WDTS_POWER_STATE_IMPS:
5197 pDxeCtrlBlk->hostPowerState = WLANDXE_POWER_STATE_IMPS;
5198 hostPowerState = WLANDXE_POWER_STATE_IMPS;
5199 break;
5200 case WDTS_POWER_STATE_DOWN:
5201 pDxeCtrlBlk->hostPowerState = WLANDXE_POWER_STATE_DOWN;
5202 hostPowerState = WLANDXE_POWER_STATE_DOWN;
5203 break;
5204 default:
5205 hostPowerState = WLANDXE_POWER_STATE_MAX;
5206 }
5207
5208 // A callback i.e. ACK back is needed only when we want to enable BMPS
5209 // and the data/management path is active because we want to ensure
5210 // DXE registers are not accessed when RIVA may be power-collapsed. So
5211 // we need a callback in enter_bmps_req (the request to RIVA is sent
5212 // only after ACK back from TX thread). A callback is not needed in
5213 // finish_scan_req during BMPS since data-path is resumed only in
5214 // finish_scan_rsp and no management frames are sent in between. No
5215 // callback is needed when going from BMPS enabled to BMPS suspended/
5216 // disabled when it is known that RIVA is awake and cannot enter power
5217 // collapse autonomously so no callback is needed in exit_bmps_rsp or
5218 // init_scan_rsp
5219 if ( cBack )
5220 {
5221 //serialize through Rx thread
5222 rxCompMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
5223 if(NULL == rxCompMsg)
5224 {
5225 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5226 "WLANDXE_SetPowerState, MSG MEM alloc Fail");
5227 return eWLAN_PAL_STATUS_E_RESOURCES;
5228 }
5229
5230 /* Event type, where it must be defined???? */
5231 /* THIS MUST BE CLEARED ASAP
5232 txCompMsg->type = TX_COMPLETE; */
5233 rxCompMsg->callback = dxeRxThreadSetPowerStateEventHandler;
5234 rxCompMsg->pContext = pDxeCtrlBlk;
5235 rxCompMsg->val = hostPowerState;
5236 rxCompMsg->ptr = cBack;
5237 status = wpalPostRxMsg(WDI_GET_PAL_CTX(),
5238 rxCompMsg);
5239 if ( eWLAN_PAL_STATUS_SUCCESS != status )
5240 {
5241 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5242 "Rx thread Set power state req serialize fail status=%d",
5243 status, 0, 0);
5244 }
5245 }
5246 else
5247 {
5248 if ( WLANDXE_POWER_STATE_FULL == hostPowerState )
5249 {
5250 if( WLANDXE_POWER_STATE_BMPS == pDxeCtrlBlk->hostPowerState )
5251 {
5252 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
5253 }
5254 else if( WLANDXE_POWER_STATE_IMPS == pDxeCtrlBlk->hostPowerState )
5255 {
5256 /* Requested Full power from exit IMPS, reenable the interrupts*/
5257 if(eWLAN_PAL_TRUE == pDxeCtrlBlk->rxIntDisabledByIMPS)
5258 {
5259 pDxeCtrlBlk->rxIntDisabledByIMPS = eWLAN_PAL_FALSE;
5260 /* Enable RX interrupt at here, if new PS is not IMPS */
5261 status = wpalEnableInterrupt(DXE_INTERRUPT_RX_READY);
5262 if(eWLAN_PAL_STATUS_SUCCESS != status)
5263 {
5264 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005265 "%s Enable RX ready interrupt fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005266 return status;
5267 }
5268 }
5269 if(eWLAN_PAL_TRUE == pDxeCtrlBlk->txIntDisabledByIMPS)
5270 {
5271 pDxeCtrlBlk->txIntDisabledByIMPS = eWLAN_PAL_FALSE;
Jeff Johnsone7245742012-09-05 17:12:55 -07005272 pDxeCtrlBlk->txIntEnable = eWLAN_PAL_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005273 /* Enable RX interrupt at here, if new PS is not IMPS */
5274 status = wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE);
5275 if(eWLAN_PAL_STATUS_SUCCESS != status)
5276 {
5277 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005278 "%s Enable TX comp interrupt fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005279 return status;
5280 }
5281 }
5282 }
5283 pDxeCtrlBlk->hostPowerState = hostPowerState;
5284 pDxeCtrlBlk->rivaPowerState = WLANDXE_RIVA_POWER_STATE_ACTIVE;
5285 }
5286 else if ( hostPowerState == WLANDXE_POWER_STATE_BMPS )
5287 {
5288 pDxeCtrlBlk->hostPowerState = hostPowerState;
5289 pDxeCtrlBlk->rivaPowerState = WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN;
5290 }
5291 else
5292 {
5293 HDXE_ASSERT(0);
5294 }
5295 }
5296
5297 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005298 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005299
5300 return status;
5301}
5302
5303/*==========================================================================
5304 @ Function Name
5305 WLANDXE_GetFreeTxDataResNumber
5306
5307 @ Description
5308 Returns free descriptor numbers for TX data channel (TX high priority)
5309
5310 @ Parameters
5311 pVoid pDXEContext : DXE Control Block
5312
5313 @ Return
5314 wpt_uint32 Free descriptor number of TX high pri ch
5315===========================================================================*/
5316wpt_uint32 WLANDXE_GetFreeTxDataResNumber
5317(
5318 void *pDXEContext
5319)
5320{
5321 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005322 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005323
5324 if(NULL == pDXEContext)
5325 {
5326 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5327 "NULL parameter passed by caller", 0, 0, 0);
5328 return (0);
5329 }
5330
5331 return
5332 ((WLANDXE_CtrlBlkType *)pDXEContext)->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numFreeDesc;
5333}
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005334
5335/*==========================================================================
5336 @ Function Name
5337 WLANDXE_ChannelDebug
5338
5339 @ Description
5340 Display DXE Channel debugging information
5341 User may request to display DXE channel snapshot
5342 Or if host driver detects any abnormal stcuk may display
5343
5344 @ Parameters
Jeff Johnsonb88db982012-12-10 13:34:59 -08005345 displaySnapshot : Display DXE snapshot option
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005346 enableStallDetect : Enable stall detect feature
5347 This feature will take effect to data performance
5348 Not integrate till fully verification
5349
5350 @ Return
5351 NONE
5352
5353===========================================================================*/
5354void WLANDXE_ChannelDebug
5355(
5356 wpt_boolean displaySnapshot,
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005357 wpt_boolean enableStallDetect
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005358)
5359{
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005360 wpt_msg *channelDebugMsg;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005361 wpt_uint32 regValue;
5362 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5363
5364 /* Debug Type 1, Display current snapshot */
5365 if(displaySnapshot)
5366 {
5367 /* Whatever RIVA power condition try to wakeup RIVA through SMSM
5368 * This will not simply wakeup RIVA
5369 * Just incase TX not wanted stuck, Trigger TX again */
Leo Chang345ef992013-07-12 10:17:29 -07005370 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
5371 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005372 /* Get free BD count */
Leo Chang345ef992013-07-12 10:17:29 -07005373 wpalSleep(10);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005374 wpalReadRegister(WLANDXE_BMU_AVAILABLE_BD_PDU, &regValue);
5375 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Leo Chang345ef992013-07-12 10:17:29 -07005376 "===== DXE Dump Start HPS %d, FWS %d, TX PFC %d, ABD %d =====",
5377 tempDxeCtrlBlk->hostPowerState, tempDxeCtrlBlk->rivaPowerState,
5378 tempDxeCtrlBlk->txCompletedFrames, regValue);
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005379
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07005380 wpalPacketStallUpdateInfo((wpt_uint32 *)&tempDxeCtrlBlk->rivaPowerState,
5381 &regValue,
5382 NULL,
5383 0);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07005384
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005385 channelDebugMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
5386 if(NULL == channelDebugMsg)
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005387 {
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005388 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5389 "WLANDXE_ChannelDebug, MSG MEM alloc Fail");
5390 return ;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005391 }
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005392
5393 channelDebugMsg->callback = dxeRxThreadChannelDebugHandler;
5394 status = wpalPostRxMsg(WDI_GET_PAL_CTX(), channelDebugMsg);
5395 if ( eWLAN_PAL_STATUS_SUCCESS != status )
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005396 {
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005397 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5398 "Tx thread Set power state req serialize fail status=%d",
5399 status, 0, 0);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005400 }
5401 }
5402
5403 /* Debug Type 2, toggling stall detect enable/disable */
5404 if(enableStallDetect)
5405 {
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -07005406 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
5407 "DXE TX Stall detect",
5408 0, 0, 0);
5409 /* Start Stall detect timer and detect stall */
5410 wpalTimerStart(&tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].healthMonitorTimer,
5411 T_WLANDXE_PERIODIC_HEALTH_M_TIME);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005412 }
5413 return;
Madan Mohan Koyyalamudi48139e32012-10-11 14:43:56 -07005414}