blob: 968ef91c692be665440761e029f3f1d486697a63 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Anurag Chouhanf0d0ba12018-02-09 15:13:43 +05302 * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
Kiet Lam842dad02014-02-18 18:44:02 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
Leo Chang416afe02013-07-01 13:58:13 -070020 */
Kiet Lam842dad02014-02-18 18:44:02 -080021
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
Jeff Johnson295189b2012-06-20 16:38:30 -070028/**=========================================================================
29
30 @file wlan_qct_dxe.c
31
32 @brief
33
34 This file contains the external API exposed by the wlan data transfer abstraction layer module.
Jeff Johnson295189b2012-06-20 16:38:30 -070035========================================================================*/
36
37/*===========================================================================
38
39 EDIT HISTORY FOR FILE
40
41
42 This section contains comments describing changes made to the module.
43 Notice that changes are listed in reverse chronological order.
44
45
46 $Header:$ $DateTime: $ $Author: $
47
48
49when who what, where, why
50-------- --- ----------------------------------------------------------
5108/03/10 schang Created module.
52
53===========================================================================*/
54
55/*===========================================================================
56
57 INCLUDE FILES FOR MODULE
58
59===========================================================================*/
60
61/*----------------------------------------------------------------------------
62 * Include Files
63 * -------------------------------------------------------------------------*/
64#include "wlan_qct_dxe.h"
65#include "wlan_qct_dxe_i.h"
66#include "wlan_qct_pal_device.h"
Anurag Chouhanf0d0ba12018-02-09 15:13:43 +053067#include "vos_api.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070068
69/*----------------------------------------------------------------------------
70 * Local Definitions
71 * -------------------------------------------------------------------------*/
72//#define WLANDXE_DEBUG_CH_INFO_DUMP
73
74/* Temporary configuration defines
75 * Have to find out permanent solution */
76#define T_WLANDXE_MAX_DESCRIPTOR_COUNT 40
77#define T_WLANDXE_MAX_FRAME_SIZE 2000
78#define T_WLANDXE_TX_INT_ENABLE_FCOUNT 1
79#define T_WLANDXE_MEMDUMP_BYTE_PER_LINE 16
80#define T_WLANDXE_MAX_RX_PACKET_WAIT 6000
Mihir Shetefdc9f532014-01-09 15:03:02 +053081#define T_WLANDXE_SSR_TIMEOUT 5000
Leo Chang5edb2d32013-04-03 13:32:58 -070082#define T_WLANDXE_PERIODIC_HEALTH_M_TIME 2500
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -070083#define T_WLANDXE_MAX_HW_ACCESS_WAIT 2000
Jeff Johnsone7245742012-09-05 17:12:55 -070084#define WLANDXE_MAX_REAPED_RX_FRAMES 512
Jeff Johnson295189b2012-06-20 16:38:30 -070085
Leo Chang094ece82013-04-23 17:57:41 -070086#define WLANPAL_RX_INTERRUPT_PRO_MASK 0x20
87#define WLANDXE_RX_INTERRUPT_PRO_UNMASK 0x5F
Leo Chang00708f62013-12-03 20:21:51 -080088
89/* 1msec busy wait in case CSR is not valid */
90#define WLANDXE_CSR_NEXT_READ_WAIT 1000
91/* CSR max retry count */
92#define WLANDXE_CSR_MAX_READ_COUNT 30
93
Sravan Kumar Kairama8269e72015-11-06 12:13:24 +053094/* DXETRACE max records count */
95#define MAX_DXE_TRACE_RECORDS 512
96#define INVALID_TRACE_ADDR 0xffffffff
Leo Chang00708f62013-12-03 20:21:51 -080097
Jeff Johnson295189b2012-06-20 16:38:30 -070098/* This is temporary fot the compile
99 * WDI will release official version
100 * This must be removed */
101#define WDI_GET_PAL_CTX() NULL
102
Sravan Kumar Kairama8269e72015-11-06 12:13:24 +0530103#define TRACE_WLANDXE_VAR_ENABLE 1
104#define TRACE_WLANDXE_VAR_DISABLE 0
Jeff Johnson295189b2012-06-20 16:38:30 -0700105/*-------------------------------------------------------------------------
106 * Local Varables
107 *-------------------------------------------------------------------------*/
108/* This is temp, someone have to allocate for me, and must be part of global context */
Madan Mohan Koyyalamudidfd6aa82012-10-18 20:18:43 -0700109static WLANDXE_CtrlBlkType *tempDxeCtrlBlk;
Jeff Johnson295189b2012-06-20 16:38:30 -0700110static char *channelType[WDTS_CHANNEL_MAX] =
111 {
112 "TX_LOW_PRI",
113 "TX_HIGH_PRI",
114 "RX_LOW_PRI",
Jeff Johnson295189b2012-06-20 16:38:30 -0700115 "RX_HIGH_PRI",
Mihir Shetebe94ebb2015-05-26 12:07:14 +0530116 "RX_LOGS",
Mihir Shetee6618162015-03-16 14:48:42 +0530117 "RX_FW_LOGS",
Jeff Johnson295189b2012-06-20 16:38:30 -0700118 };
Jeff Johnsone7245742012-09-05 17:12:55 -0700119static wpt_packet *rx_reaped_buf[WLANDXE_MAX_REAPED_RX_FRAMES];
Sravan Kumar Kairam8bbda362015-10-06 11:51:14 +0530120static WLANDXE_EnvInformation dxeEnvBlk;
Sravan Kumar Kairama8269e72015-11-06 12:13:24 +0530121static dxeTraceData gdxeTraceData;
122static dxeTraceRecord gdxeTraceTbl[MAX_DXE_TRACE_RECORDS];
123static spinlock_t dtraceLock;
Jeff Johnson295189b2012-06-20 16:38:30 -0700124
125/*-------------------------------------------------------------------------
126 * External Function Proto Type
127 *-------------------------------------------------------------------------*/
128
129/*-------------------------------------------------------------------------
130 * Local Function Proto Type
131 *-------------------------------------------------------------------------*/
132static wpt_status dxeRXFrameSingleBufferAlloc
133(
134 WLANDXE_CtrlBlkType *dxeCtxt,
135 WLANDXE_ChannelCBType *channelEntry,
136 WLANDXE_DescCtrlBlkType *currentCtrlBlock
137);
138
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700139static wpt_status dxeNotifySmsm
140(
141 wpt_boolean kickDxe,
142 wpt_boolean ringEmpty
143);
144
Mihir Shetefdc9f532014-01-09 15:03:02 +0530145static void dxeStartSSRTimer
146(
147 WLANDXE_CtrlBlkType *dxeCtxt
148);
149
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530150static wpt_status dxeTXCleanup
151(
152 WLANDXE_CtrlBlkType *hostCtxt
153);
154
Sravan Kumar Kairama8269e72015-11-06 12:13:24 +0530155static void dxeTrace
156(
157 v_U8_t chan, v_U8_t code, v_U32_t data
158);
159
Jeff Johnson295189b2012-06-20 16:38:30 -0700160/*-------------------------------------------------------------------------
161 * Local Function
162 *-------------------------------------------------------------------------*/
Jeff Johnson295189b2012-06-20 16:38:30 -0700163/*==========================================================================
164 @ Function Name
165 dxeChannelMonitor
166
167 @ Description
168
169 @ Parameters
170 WLANDXE_ChannelCBType *channelEntry
171 Channel specific control block
172
173 @ Return
174 wpt_status
175
176===========================================================================*/
177static wpt_status dxeChannelMonitor
178(
179 char *monitorDescription,
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530180 WLANDXE_ChannelCBType *channelEntry,
181 wpt_log_data_stall_channel_type *channelLog
Jeff Johnson295189b2012-06-20 16:38:30 -0700182)
183{
184 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
185
Jeff Johnsone7245742012-09-05 17:12:55 -0700186 if((NULL == monitorDescription) || (NULL == channelEntry))
187 {
188 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
189 "INVALID Input ARG");
190 return eWLAN_PAL_STATUS_E_INVAL;
191 }
192
Mihir Shetee6618162015-03-16 14:48:42 +0530193 if(channelEntry->channelType >= WDTS_CHANNEL_MAX)
Jeff Johnsone7245742012-09-05 17:12:55 -0700194 {
195 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
196 "INVALID Channel type");
197 return eWLAN_PAL_STATUS_E_INVAL;
198 }
199
Leo Chang345ef992013-07-12 10:17:29 -0700200 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
201 "%11s : HCBO %d, HCBDP 0x%x, HCBDC 0x%x,",
202 channelType[channelEntry->channelType],
203 channelEntry->headCtrlBlk->ctrlBlkOrder,
204 channelEntry->headCtrlBlk->linkedDescPhyAddr,
205 channelEntry->headCtrlBlk->linkedDesc->descCtrl.ctrl);
206 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
207 "%11s : TCBO %d, TCBDP 0x%x, TCBDC 0x%x",
208 channelType[channelEntry->channelType],
209 channelEntry->tailCtrlBlk->ctrlBlkOrder,
210 channelEntry->tailCtrlBlk->linkedDescPhyAddr,
211 channelEntry->tailCtrlBlk->linkedDesc->descCtrl.ctrl);
212 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
213 "%11s : FDC %d, RDC %d, TFC %d",
214 channelType[channelEntry->channelType],
215 channelEntry->numFreeDesc,
216 channelEntry->numRsvdDesc,
217 channelEntry->numTotalFrame);
Jeff Johnson295189b2012-06-20 16:38:30 -0700218
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700219 if(channelLog)
220 {
221 channelLog->numDesc = channelEntry->numDesc;
222 channelLog->numFreeDesc = channelEntry->numFreeDesc;
223 channelLog->numRsvdDesc = channelEntry->numRsvdDesc;
224 channelLog->headDescOrder = channelEntry->headCtrlBlk->ctrlBlkOrder;
225 channelLog->tailDescOrder = channelEntry->tailCtrlBlk->ctrlBlkOrder;
226 }
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530227
Jeff Johnson295189b2012-06-20 16:38:30 -0700228 return status;
229}
230
Jeff Johnsone7245742012-09-05 17:12:55 -0700231#ifdef WLANDXE_DEBUG_MEMORY_DUMP
Jeff Johnson295189b2012-06-20 16:38:30 -0700232/*==========================================================================
233 @ Function Name
234 dxeMemoryDump
235
236 @ Description
237
238 @ Parameters
239 WLANDXE_ChannelCBType *channelEntry
240 Channel specific control block
241
242 @ Return
243 wpt_status
244
245===========================================================================*/
246static wpt_status dxeMemoryDump
247(
248 wpt_uint8 *dumpPointer,
249 wpt_uint32 dumpSize,
250 char *dumpTarget
251)
252{
253 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
254 wpt_uint32 numBytes = 0;
255 wpt_uint32 idx;
256
Jeff Johnsone7245742012-09-05 17:12:55 -0700257 if((NULL == dumpPointer) ||
258 (NULL == dumpTarget))
259 {
260 return status;
261 }
262
Jeff Johnson295189b2012-06-20 16:38:30 -0700263 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
264 "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
265 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
266 "%s Location 0x%x, Size %d", dumpTarget, dumpPointer, dumpSize);
267
268 numBytes = dumpSize % T_WLANDXE_MEMDUMP_BYTE_PER_LINE;
269 for(idx = 0; idx < dumpSize; idx++)
270 {
271 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
272 "0x%2x ", dumpPointer[idx]);
273 if(0 == ((idx + 1) % T_WLANDXE_MEMDUMP_BYTE_PER_LINE))
274 {
275 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, "\n");
276 }
277 }
278 if(0 != numBytes)
279 {
280 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, "\n");
281 }
282 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
283 "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
284
285 return status;
286}
Jeff Johnsone7245742012-09-05 17:12:55 -0700287#endif /* WLANDXE_DEBUG_MEMORY_DUMP */
Jeff Johnson295189b2012-06-20 16:38:30 -0700288
289/*==========================================================================
290 @ Function Name
291 dxeDescriptorDump
292
293 @ Description
294
295 @ Parameters
296 WLANDXE_ChannelCBType *channelEntry
297 Channel specific control block
298
299 @ Return
300 wpt_status
301
302===========================================================================*/
303wpt_status dxeDescriptorDump
304(
305 WLANDXE_ChannelCBType *channelEntry,
306 WLANDXE_DescType *targetDesc,
307 wpt_uint32 fragmentOrder
308)
309{
310 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
311
312
Jeff Johnsone7245742012-09-05 17:12:55 -0700313 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnson295189b2012-06-20 16:38:30 -0700314 "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
Jeff Johnsone7245742012-09-05 17:12:55 -0700315 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700316 "Descriptor Dump for channel %s, %d / %d fragment",
Jeff Johnson295189b2012-06-20 16:38:30 -0700317 channelType[channelEntry->channelType],
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700318 fragmentOrder + 1,
319 channelEntry->numFragmentCurrentChain);
Jeff Johnson295189b2012-06-20 16:38:30 -0700320
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 "CTRL WORD 0x%x, TransferSize %d",
323 WLANDXE_U32_SWAP_ENDIAN(targetDesc->descCtrl.ctrl),
324 WLANDXE_U32_SWAP_ENDIAN(targetDesc->xfrSize));
Jeff Johnsone7245742012-09-05 17:12:55 -0700325 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnson295189b2012-06-20 16:38:30 -0700326 "SRC ADD 0x%x, DST ADD 0x%x, NEXT DESC 0x%x",
327 WLANDXE_U32_SWAP_ENDIAN(targetDesc->dxedesc.dxe_short_desc.srcMemAddrL),
328 WLANDXE_U32_SWAP_ENDIAN(targetDesc->dxedesc.dxe_short_desc.dstMemAddrL),
329 WLANDXE_U32_SWAP_ENDIAN(targetDesc->dxedesc.dxe_short_desc.phyNextL));
Jeff Johnsone7245742012-09-05 17:12:55 -0700330 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnson295189b2012-06-20 16:38:30 -0700331 "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
332
333 return status;
334}
335
336/*==========================================================================
337 @ Function Name
338 dxeChannelRegisterDump
339
340 @ Description
341
342 @ Parameters
343 WLANDXE_ChannelCBType *channelEntry
344 Channel specific control block
345
346 @ Return
347 wpt_status
348
349===========================================================================*/
350wpt_status dxeChannelRegisterDump
351(
352 WLANDXE_ChannelCBType *channelEntry,
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530353 char *dumpTarget,
354 wpt_log_data_stall_channel_type *channelLog
Jeff Johnson295189b2012-06-20 16:38:30 -0700355)
356{
Leo Chang345ef992013-07-12 10:17:29 -0700357 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
358 wpt_uint32 chStatusReg, chControlReg, chDescReg, chLDescReg;
359
360 /* Whatever RIVA power condition try to wakeup RIVA through SMSM
361 * This will not simply wakeup RIVA
362 * Just incase TX not wanted stuck, Trigger TX again */
363 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
364 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
365 wpalSleep(10);
Jeff Johnson295189b2012-06-20 16:38:30 -0700366
Mihir Shetee6618162015-03-16 14:48:42 +0530367 if(channelEntry->channelType >= WDTS_CHANNEL_MAX)
Tushnim Bhattacharyya5dd94562013-03-20 20:15:03 -0700368 {
369 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
370 "INVALID Channel type");
371 return eWLAN_PAL_STATUS_E_INVAL;
372 }
373
Leo Chang345ef992013-07-12 10:17:29 -0700374 wpalReadRegister(channelEntry->channelRegister.chDXEDesclRegAddr, &chDescReg);
375 wpalReadRegister(channelEntry->channelRegister.chDXELstDesclRegAddr, &chLDescReg);
376 wpalReadRegister(channelEntry->channelRegister.chDXECtrlRegAddr, &chControlReg);
377 wpalReadRegister(channelEntry->channelRegister.chDXEStatusRegAddr, &chStatusReg);
Jeff Johnson295189b2012-06-20 16:38:30 -0700378
Leo Chang345ef992013-07-12 10:17:29 -0700379 wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
380 "%11s : CCR 0x%x, CSR 0x%x, CDR 0x%x, CLDR 0x%x",
381 channelType[channelEntry->channelType],
382 chControlReg, chStatusReg, chDescReg, chLDescReg);
Jeff Johnson295189b2012-06-20 16:38:30 -0700383
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700384 if(channelLog)
385 {
386 channelLog->ctrlRegVal = chControlReg;
387 channelLog->statRegVal = chStatusReg;
388 }
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700389
Jeff Johnson295189b2012-06-20 16:38:30 -0700390 return status;
391}
Jeff Johnsone7245742012-09-05 17:12:55 -0700392
393/*==========================================================================
394 @ Function Name
395 dxeChannelAllDescDump
396
397 @ Description
398 Dump all DXE descriptors within assigned channe;
399
400 @ Parameters
401 WLANDXE_ChannelCBType *channelEntry
402
403 @ Return
404 NONE
405
406===========================================================================*/
407void dxeChannelAllDescDump
408(
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700409 WLANDXE_ChannelCBType *channelEntry,
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530410 WDTS_ChannelType channel,
411 wpt_log_data_stall_channel_type *channelLog
Jeff Johnsone7245742012-09-05 17:12:55 -0700412)
413{
414 wpt_uint32 channelLoop;
415 WLANDXE_DescCtrlBlkType *targetCtrlBlk;
Madan Mohan Koyyalamudi94d4c192012-09-24 14:06:14 -0700416 wpt_uint32 previousCtrlValue = 0;
Leo Chang345ef992013-07-12 10:17:29 -0700417 wpt_uint32 previousCtrlValid = 0;
418 wpt_uint32 currentCtrlValid = 0;
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700419 wpt_uint32 valDescCount = 0;
420 wpt_uint32 invalDescCount = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -0700421
422 targetCtrlBlk = channelEntry->headCtrlBlk;
423
424 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Leo Chang345ef992013-07-12 10:17:29 -0700425 "%11s : %d descriptor chains, head desc ctrl 0x%x",
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700426 channelType[channelEntry->channelType],
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -0700427 channelEntry->numDesc,
428 targetCtrlBlk->linkedDesc->descCtrl.ctrl);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700429 previousCtrlValue = targetCtrlBlk->linkedDesc->descCtrl.ctrl;
430
431 if((WDTS_CHANNEL_RX_LOW_PRI == channel) ||
Mihir Shetee6618162015-03-16 14:48:42 +0530432 (WDTS_CHANNEL_RX_HIGH_PRI == channel)||
433 (WDTS_CHANNEL_RX_LOG == channel))
Jeff Johnsone7245742012-09-05 17:12:55 -0700434 {
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700435 for(channelLoop = 0; channelLoop < channelEntry->numDesc; channelLoop++)
Madan Mohan Koyyalamudi94d4c192012-09-24 14:06:14 -0700436 {
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700437 if(previousCtrlValue != targetCtrlBlk->linkedDesc->descCtrl.ctrl)
438 {
439 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
440 "%5d : 0x%x", targetCtrlBlk->ctrlBlkOrder,
441 targetCtrlBlk->linkedDesc->descCtrl.ctrl);
442 }
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700443 if(targetCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID)
444 {
445 valDescCount++;
446 }
447 else
448 {
449 invalDescCount++;
450 }
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700451 previousCtrlValue = targetCtrlBlk->linkedDesc->descCtrl.ctrl;
452 targetCtrlBlk = (WLANDXE_DescCtrlBlkType *)targetCtrlBlk->nextCtrlBlk;
Madan Mohan Koyyalamudi94d4c192012-09-24 14:06:14 -0700453 }
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700454 }
455 else
456 {
Leo Chang345ef992013-07-12 10:17:29 -0700457 /* Head Descriptor is valid or not */
458 previousCtrlValid = targetCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID;
459 targetCtrlBlk = (WLANDXE_DescCtrlBlkType *)targetCtrlBlk->nextCtrlBlk;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700460 for(channelLoop = 0; channelLoop < channelEntry->numDesc; channelLoop++)
461 {
Leo Chang345ef992013-07-12 10:17:29 -0700462 currentCtrlValid = targetCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID;
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700463 if(currentCtrlValid)
464 {
465 valDescCount++;
466 }
467 else
468 {
469 invalDescCount++;
470 }
Leo Chang345ef992013-07-12 10:17:29 -0700471 if(currentCtrlValid != previousCtrlValid)
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700472 {
473 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
474 "%5d : 0x%x", targetCtrlBlk->ctrlBlkOrder,
475 targetCtrlBlk->linkedDesc->descCtrl.ctrl);
476 }
Leo Chang345ef992013-07-12 10:17:29 -0700477 previousCtrlValid = currentCtrlValid;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700478 targetCtrlBlk = (WLANDXE_DescCtrlBlkType *)targetCtrlBlk->nextCtrlBlk;
479 }
480 }
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530481
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700482 if(channelLog)
483 {
484 channelLog->numValDesc = valDescCount;
485 channelLog->numInvalDesc = invalDescCount;
486 }
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530487
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700488 return;
489}
490
491/*==========================================================================
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530492 @ Function Name
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530493 dxeErrHandler
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530494
495 @ Description
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530496 Dump channel information for which Error interrupt has occured and
497 try to recover from the Error
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530498
499 @ Parameters
500 WLANDXE_ChannelCBType *channelCb
501
502 @ Return
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530503 wpt_status: eWLAN_PAL_STATUS_SUCCESS if recovery is possible and
504 successful
505 eWLAN_PAL_STATUS_E_FAILURE if recovery is not possible
506 or recovery fails
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530507===========================================================================*/
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530508wpt_status dxeErrHandler
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530509(
Mihir Shete79d6b582014-03-12 17:54:07 +0530510 WLANDXE_ChannelCBType *channelCb,
511 wpt_uint32 chStatusReg
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530512)
513{
Mihir Shete79d6b582014-03-12 17:54:07 +0530514 wpt_uint32 chLDescReg, channelLoop;
515 WLANDXE_DescCtrlBlkType *targetCtrlBlk;
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530516
Mihir Shete79d6b582014-03-12 17:54:07 +0530517 switch ((chStatusReg & WLANDXE_CH_STAT_ERR_CODE_MASK) >>
518 WLANDXE_CH_STAT_ERR_CODE_OFFSET)
519 {
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530520
Mihir Shete79d6b582014-03-12 17:54:07 +0530521 case WLANDXE_ERROR_PRG_INV_B2H_SRC_QID:
522 case WLANDXE_ERROR_PRG_INV_B2H_DST_QID:
523 case WLANDXE_ERROR_PRG_INV_B2H_SRC_IDX:
524 case WLANDXE_ERROR_PRG_INV_H2B_SRC_QID:
525 case WLANDXE_ERROR_PRG_INV_H2B_DST_QID:
526 case WLANDXE_ERROR_PRG_INV_H2B_DST_IDX:
527 {
528 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
529 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
530 wpalSleep(10);
531
532 if(channelCb->channelType > WDTS_CHANNEL_RX_HIGH_PRI)
533 {
534 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
535 "%s: Invalid Channel", __func__);
536 break;
537 }
538
539 wpalReadRegister(channelCb->channelRegister.chDXELstDesclRegAddr, &chLDescReg);
540
541 targetCtrlBlk = channelCb->headCtrlBlk;
542
543 for(channelLoop = 0; channelLoop < channelCb->numDesc; channelLoop++)
544 {
545 if (targetCtrlBlk->linkedDescPhyAddr == chLDescReg)
546 {
547 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
548 "%11s :CHx_DESCL: desc ctrl 0x%x, src 0x%x, dst 0x%x, next 0x%x",
549 channelType[channelCb->channelType],
550 targetCtrlBlk->linkedDesc->descCtrl.ctrl,
551 targetCtrlBlk->linkedDesc->dxedesc.dxe_short_desc.srcMemAddrL,
552 targetCtrlBlk->linkedDesc->dxedesc.dxe_short_desc.dstMemAddrL,
553 targetCtrlBlk->linkedDesc->dxedesc.dxe_short_desc.phyNextL);
554
555 targetCtrlBlk = (WLANDXE_DescCtrlBlkType *)targetCtrlBlk->nextCtrlBlk;
556
557 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
558 "%11s :Next Desc: desc ctrl 0x%x, src 0x%x, dst 0x%x, next 0x%x",
559 channelType[channelCb->channelType],
560 targetCtrlBlk->linkedDesc->descCtrl.ctrl,
561 targetCtrlBlk->linkedDesc->dxedesc.dxe_short_desc.srcMemAddrL,
562 targetCtrlBlk->linkedDesc->dxedesc.dxe_short_desc.dstMemAddrL,
563 targetCtrlBlk->linkedDesc->dxedesc.dxe_short_desc.phyNextL);
564 break;
565 }
566 targetCtrlBlk = (WLANDXE_DescCtrlBlkType *)targetCtrlBlk->nextCtrlBlk;
567 }
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530568 wpalFwDumpReq(17, 0, 0, 0, 0, 1);
Mihir Shete79d6b582014-03-12 17:54:07 +0530569 break;
570 }
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530571 case WLANDXE_ERROR_ABORT:
572 {
573 wpt_uint32 regValue, regValueLocal;
574 wpt_uint32 count = 0;
Sravan Kumar Kairam49d5c4b2016-03-29 15:26:44 +0530575 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530576 "%s: DXE Abort Error from S/W", __func__);
577
578 wpalReadRegister(WALNDEX_DMA_CSR_ADDRESS, &regValue);
Sravan Kumar Kairam49d5c4b2016-03-29 15:26:44 +0530579 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530580 "%s: DXE CSR Value: %08x", __func__,regValue);
581
582 //Execute the BMU recovery only if firmware triggered the ABORT
583 if (regValue & WLANDXE_DMA_CSR_FW_BMU_RECOVERY)
584 {
585 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
586 "%s: Firmware BMU recovery On %08x", __func__,regValue);
587
588 // Clean up the descriptors
589 if (eWLAN_PAL_STATUS_SUCCESS !=
590 dxeTXCleanup(tempDxeCtrlBlk))
591 {
592 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
593 "%s: Host DXE Cleanup Failed!!!!", __func__);
594 }
595
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530596 // Unblock the firmware
597 regValue |= WLANDXE_DMA_CSR_HOST_RECOVERY_DONE;
Sravan Kumar Kairam49d5c4b2016-03-29 15:26:44 +0530598 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530599 "%s: Host DXE Cleanup done %08x", __func__,regValue);
600 wpalWriteRegister(WALNDEX_DMA_CSR_ADDRESS, regValue);
601
602 // Wait for firmware to complete the cleanup
603 do
604 {
605 wpalReadRegister(WALNDEX_DMA_CSR_ADDRESS, &regValue);
606 wpalBusyWait(5000);
607 count++;
608 //count is 60 because wait is for 5 ms and 60*5=300ms
609 //which is the time WD bark happens in firmware
610 } while(count < 60 && !(regValue & WLANDXE_DMA_CSR_RECOVERY_DONE));
611 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
612 "%s: FW Cleanup done %08x", __func__,regValue);
613
614 //clear all spare bits in CSR
615 wpalWriteRegister(WALNDEX_DMA_CSR_ADDRESS,regValue &
616 ~(WLANDXE_DMA_CSR_RECOVERY_DONE |
617 WLANDXE_DMA_CSR_FW_BMU_RECOVERY |
618 WLANDXE_DMA_CSR_HOST_RECOVERY_DONE));
619
620 //check if the h/w resources have recovered
621 wpalReadRegister(WLANDXE_BMU_AVAILABLE_BD_PDU, &regValue);
622 wpalReadRegister(WLANDXE_BMU_AVAILABLE_BD_PDU_LOCAL, &regValueLocal);
Sravan Kumar Kairam49d5c4b2016-03-29 15:26:44 +0530623 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530624 "===== count %d ABD %d, ABD LOCAL %d =====", count,
625 regValue, regValueLocal);
626 if(regValue == 0 || regValueLocal == 0)
627 {
Sravan Kumar Kairam49d5c4b2016-03-29 15:26:44 +0530628 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
629 "%s: HW resources have not recovered", __func__);
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530630 return eWLAN_PAL_STATUS_E_FAILURE;
631 }
632
633 return eWLAN_PAL_STATUS_SUCCESS;
634 }
635 break;
636 }
Mihir Shete79d6b582014-03-12 17:54:07 +0530637 default:
638 {
639 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
640 "%s: No Debug Inormation", __func__);
641 break;
642 }
643
644 }
Mihir Shetedfc33ec2014-10-15 13:14:38 +0530645 return eWLAN_PAL_STATUS_E_FAILURE;
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530646}
647/*==========================================================================
648 @ Function Name
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700649 dxeTxThreadChannelDebugHandler
650
651 @ Description
652 Dump TX channel information
653
654 @ Parameters
655 Wwpt_msg *msgPtr
656
657 @ Return
658 NONE
659
660===========================================================================*/
661void dxeTxThreadChannelDebugHandler
662(
663 wpt_msg *msgPtr
664)
665{
666 wpt_uint8 channelLoop;
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700667 wpt_log_data_stall_channel_type channelLog;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700668
669 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700670 "%s Enter", __func__);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700671
672 /* Whatever RIVA power condition try to wakeup RIVA through SMSM
673 * This will not simply wakeup RIVA
674 * Just incase TX not wanted stuck, Trigger TX again */
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700675 for(channelLoop = 0; channelLoop < WDTS_CHANNEL_RX_LOW_PRI; channelLoop++)
676 {
677 dxeChannelMonitor("******** Get Descriptor Snapshot ",
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530678 &tempDxeCtrlBlk->dxeChannel[channelLoop],
679 &channelLog);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700680 dxeChannelRegisterDump(&tempDxeCtrlBlk->dxeChannel[channelLoop],
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530681 "Abnormal successive empty interrupt",
682 &channelLog);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700683 dxeChannelAllDescDump(&tempDxeCtrlBlk->dxeChannel[channelLoop],
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530684 channelLoop,
685 &channelLog);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700686
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700687 wpalMemoryCopy(channelLog.channelName,
688 channelType[channelLoop],
689 WPT_TRPT_CHANNEL_NAME);
690 wpalPacketStallUpdateInfo(NULL, NULL, &channelLog, channelLoop);
Jeff Johnsone7245742012-09-05 17:12:55 -0700691 }
692
Leo Chang345ef992013-07-12 10:17:29 -0700693 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnson9e237fb2013-10-30 18:46:20 -0700694 "================== DXE Dump End ======================");
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -0700695 wpalMemoryFree(msgPtr);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700696
697#ifdef FEATURE_WLAN_DIAG_SUPPORT
698 wpalPacketStallDumpLog();
699#endif /* FEATURE_WLAN_DIAG_SUPPORT */
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700700 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700701 "%s Exit", __func__);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700702 return;
703}
704
705/*==========================================================================
706 @ Function Name
707 dxeRxThreadChannelDebugHandler
708
709 @ Description
710 Dump RX channel information
711
712 @ Parameters
713 Wwpt_msg *msgPtr
714
715 @ Return
716 NONE
717
718===========================================================================*/
719void dxeRxThreadChannelDebugHandler
720(
721 wpt_msg *msgPtr
722)
723{
724 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
725 wpt_uint8 channelLoop;
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700726 wpt_log_data_stall_channel_type channelLog;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700727
728 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700729 "%s Enter", __func__);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700730
731 /* Whatever RIVA power condition try to wakeup RIVA through SMSM
732 * This will not simply wakeup RIVA
733 * Just incase TX not wanted stuck, Trigger TX again */
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700734 for(channelLoop = WDTS_CHANNEL_RX_LOW_PRI; channelLoop < WDTS_CHANNEL_MAX; channelLoop++)
735 {
Mihir Shetee6618162015-03-16 14:48:42 +0530736 if (!WLANDXE_IS_VALID_CHANNEL(channelLoop))
737 continue;
738
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700739 dxeChannelMonitor("******** Get Descriptor Snapshot ",
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530740 &tempDxeCtrlBlk->dxeChannel[channelLoop],
741 &channelLog);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700742 dxeChannelRegisterDump(&tempDxeCtrlBlk->dxeChannel[channelLoop],
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530743 "Abnormal successive empty interrupt",
744 &channelLog);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700745 dxeChannelAllDescDump(&tempDxeCtrlBlk->dxeChannel[channelLoop],
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530746 channelLoop, &channelLog);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700747
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -0700748 wpalMemoryCopy(channelLog.channelName,
749 channelType[channelLoop],
750 WPT_TRPT_CHANNEL_NAME);
751 wpalPacketStallUpdateInfo(NULL, NULL, &channelLog, channelLoop);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +0530752
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700753 }
754
755 /* Now serialise the message through Tx thread also to make sure
756 * no register access when RIVA is in powersave */
757 /*Use the same message pointer just change the call back function */
758 msgPtr->callback = dxeTxThreadChannelDebugHandler;
759 status = wpalPostTxMsg(WDI_GET_PAL_CTX(),
760 msgPtr);
761 if ( eWLAN_PAL_STATUS_SUCCESS != status )
762 {
763 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi48139e32012-10-11 14:43:56 -0700764 "Tx thread state dump req serialize fail status=%d",
Jeff Johnson9e237fb2013-10-30 18:46:20 -0700765 status);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -0700766 }
767
768 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700769 "%s Exit", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700770 return;
771}
Jeff Johnson295189b2012-06-20 16:38:30 -0700772
773/*==========================================================================
774 @ Function Name
775 dxeCtrlBlkAlloc
776
777 @ Description
778 Allocate DXE Control block
779 DXE control block will used by Host DXE driver only, internal structure
780 Will make ring linked list
781
782 @ Parameters
783 WLANDXE_CtrlBlkType *dxeCtrlBlk,
784 DXE host driver main control block
785 WLANDXE_ChannelCBType *channelEntry
786 Channel specific control block
787
788 @ Return
789 wpt_status
790
791===========================================================================*/
792static wpt_status dxeCtrlBlkAlloc
793(
794 WLANDXE_CtrlBlkType *dxeCtrlBlk,
795 WLANDXE_ChannelCBType *channelEntry
796)
797{
798 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
799 unsigned int idx, fIdx;
800 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
801 WLANDXE_DescCtrlBlkType *freeCtrlBlk = NULL;
802 WLANDXE_DescCtrlBlkType *prevCtrlBlk = NULL;
803 WLANDXE_DescCtrlBlkType *nextCtrlBlk = NULL;
804
805 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700806 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700807
808 /* Sanity check */
809 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
810 {
811 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
812 "dxeCtrlBlkAlloc Channel Entry is not valid");
813 return eWLAN_PAL_STATUS_E_INVAL;
814 }
815
816 /* Allocate pre asigned number of control blocks */
817 for(idx = 0; idx < channelEntry->numDesc; idx++)
818 {
819 currentCtrlBlk = (WLANDXE_DescCtrlBlkType *)wpalMemoryAllocate(sizeof(WLANDXE_DescCtrlBlkType));
820 if(NULL == currentCtrlBlk)
821 {
822 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
823 "dxeCtrlBlkOpen MemAlloc Fail for channel %d",
824 channelEntry->channelType);
825 freeCtrlBlk = channelEntry->headCtrlBlk;
826 for(fIdx = 0; fIdx < idx; fIdx++)
827 {
828 if(NULL == freeCtrlBlk)
829 {
830 break;
831 }
832
833 nextCtrlBlk = freeCtrlBlk->nextCtrlBlk;
834 wpalMemoryFree((void *)freeCtrlBlk);
835 freeCtrlBlk = nextCtrlBlk;
836 }
837 return eWLAN_PAL_STATUS_E_FAULT;
838 }
839
840 memset((wpt_uint8 *)currentCtrlBlk, 0, sizeof(WLANDXE_DescCtrlBlkType));
841 /* Initialize common elements first */
842 currentCtrlBlk->xfrFrame = NULL;
843 currentCtrlBlk->linkedDesc = NULL;
844 currentCtrlBlk->linkedDescPhyAddr = 0;
845 currentCtrlBlk->ctrlBlkOrder = idx;
846
847 /* This is the first control block allocated
848 * Next Control block is not allocated yet
849 * head and tail must be first control block */
850 if(0 == idx)
851 {
852 currentCtrlBlk->nextCtrlBlk = NULL;
853 channelEntry->headCtrlBlk = currentCtrlBlk;
854 channelEntry->tailCtrlBlk = currentCtrlBlk;
855 }
856 /* This is not first, not last control block
857 * previous control block may has next linked block */
858 else if((0 < idx) && (idx < (channelEntry->numDesc - 1)))
859 {
860 prevCtrlBlk->nextCtrlBlk = currentCtrlBlk;
861 }
862 /* This is last control blocl
863 * next control block for the last control block is head, first control block
864 * then whole linked list made RING */
865 else if((channelEntry->numDesc - 1) == idx)
866 {
867 prevCtrlBlk->nextCtrlBlk = currentCtrlBlk;
868 currentCtrlBlk->nextCtrlBlk = channelEntry->headCtrlBlk;
869 }
870 else
871 {
872 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
873 "dxeCtrlBlkOpen Invalid Ctrl Blk location %d",
874 channelEntry->channelType);
875 wpalMemoryFree(currentCtrlBlk);
876 return eWLAN_PAL_STATUS_E_FAULT;
877 }
878
879 prevCtrlBlk = currentCtrlBlk;
880 channelEntry->numFreeDesc++;
881 }
882
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700883 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,"%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700884 return status;
885}
886
887/*==========================================================================
888 @ Function Name
889 dxeDescLinkAlloc
890
891 @ Description
892 Allocate DXE descriptor
893 DXE descriptor will be shared by DXE host driver and RIVA DXE engine
894 Will make RING linked list
895 Will be linked with Descriptor control block one by one
896
897 @ Parameters
898 WLANDXE_CtrlBlkType *dxeCtrlBlk,
899 DXE host driver main control block
900 WLANDXE_ChannelCBType *channelEntry
901 Channel specific control block
902 @ Return
903 wpt_status
904
905===========================================================================*/
906static wpt_status dxeDescAllocAndLink
907(
908 WLANDXE_CtrlBlkType *dxeCtrlBlk,
909 WLANDXE_ChannelCBType *channelEntry
910)
911{
912 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
913 WLANDXE_DescType *currentDesc = NULL;
914 WLANDXE_DescType *prevDesc = NULL;
915 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
916 unsigned int idx;
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +0530917 void *physAddressAlloc = NULL;
918 wpt_uint32 physAddress;
Jeff Johnson295189b2012-06-20 16:38:30 -0700919
920 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700921 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700922
923 /* Sanity Check */
924 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
925 {
926 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
927 "dxeDescLinkAlloc Channel Entry is not valid");
928 return eWLAN_PAL_STATUS_E_INVAL;
929 }
930
931 currentCtrlBlk = channelEntry->headCtrlBlk;
932
Jeff Johnson295189b2012-06-20 16:38:30 -0700933 /* allocate all DXE descriptors for this channel in one chunk */
934 channelEntry->descriptorAllocation = (WLANDXE_DescType *)
935 wpalDmaMemoryAllocate(sizeof(WLANDXE_DescType)*channelEntry->numDesc,
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +0530936 &physAddressAlloc);
937 physAddress = (wpt_uint32) (uintptr_t)(physAddressAlloc);
Jeff Johnson295189b2012-06-20 16:38:30 -0700938 if(NULL == channelEntry->descriptorAllocation)
939 {
940 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
941 "dxeDescLinkAlloc Descriptor Alloc Fail");
942 return eWLAN_PAL_STATUS_E_RESOURCES;
943 }
944 currentDesc = channelEntry->descriptorAllocation;
Jeff Johnson295189b2012-06-20 16:38:30 -0700945
946 /* Allocate pre asigned number of descriptor */
947 for(idx = 0; idx < channelEntry->numDesc; idx++)
948 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700949 // descriptors were allocated in a chunk -- use the current one
Jeff Johnson295189b2012-06-20 16:38:30 -0700950 if(NULL == currentDesc)
951 {
952 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
953 "dxeDescLinkAlloc MemAlloc Fail for channel %d",
954 channelEntry->channelType);
955 return eWLAN_PAL_STATUS_E_FAULT;
956 }
Mihir Shete96cd1902015-03-04 15:47:31 +0530957 memset((wpt_uint8 *)currentDesc, 0, sizeof(WLANDXE_DescType));
958 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Jeff Johnsona7d9f742017-09-19 08:37:59 -0700959 "Allocated Descriptor VA %pK, PA %pK", currentDesc, physAddressAlloc);
Jeff Johnson295189b2012-06-20 16:38:30 -0700960
Jeff Johnson295189b2012-06-20 16:38:30 -0700961 currentCtrlBlk->linkedDesc = currentDesc;
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +0530962 currentCtrlBlk->linkedDescPhyAddr = physAddress;
Jeff Johnson295189b2012-06-20 16:38:30 -0700963 /* First descriptor, next none
964 * descriptor bottom location is first descriptor address */
965 if(0 == idx)
966 {
967 currentDesc->dxedesc.dxe_short_desc.phyNextL = 0;
968 channelEntry->DescBottomLoc = currentDesc;
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +0530969 channelEntry->descBottomLocPhyAddr = physAddress;
Jeff Johnson295189b2012-06-20 16:38:30 -0700970 }
971 /* Not first, not last descriptor
972 * may make link for previous descriptor with current descriptor
973 * ENDIAN SWAP needed ????? */
974 else if((0 < idx) && (idx < (channelEntry->numDesc - 1)))
975 {
976 prevDesc->dxedesc.dxe_short_desc.phyNextL =
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +0530977 WLANDXE_U32_SWAP_ENDIAN(physAddress);
Jeff Johnson295189b2012-06-20 16:38:30 -0700978 }
979 /* Last descriptor
980 * make a ring by asign next pointer as first descriptor
981 * ENDIAN SWAP NEEDED ??? */
982 else if((channelEntry->numDesc - 1) == idx)
983 {
984 prevDesc->dxedesc.dxe_short_desc.phyNextL =
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +0530985 WLANDXE_U32_SWAP_ENDIAN(physAddress);
Jeff Johnson295189b2012-06-20 16:38:30 -0700986 currentDesc->dxedesc.dxe_short_desc.phyNextL =
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +0530987 WLANDXE_U32_SWAP_ENDIAN(channelEntry->headCtrlBlk->linkedDescPhyAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -0700988 }
989
990 /* If Current Channel is RX channel PAL Packet and OS packet buffer should be
991 * Pre allocated and physical address must be assigned into
992 * Corresponding DXE Descriptor */
Jeff Johnson295189b2012-06-20 16:38:30 -0700993 if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
Mihir Shetee6618162015-03-16 14:48:42 +0530994 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType) ||
995 (WDTS_CHANNEL_RX_LOG == channelEntry->channelType))
Jeff Johnson295189b2012-06-20 16:38:30 -0700996 {
997 status = dxeRXFrameSingleBufferAlloc(dxeCtrlBlk,
998 channelEntry,
999 currentCtrlBlk);
1000 if( !WLAN_PAL_IS_STATUS_SUCCESS(status) )
1001 {
1002 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1003 "dxeDescLinkAlloc RX Buffer Alloc Fail for channel %d",
1004 channelEntry->channelType);
1005 return status;
1006 }
1007 --channelEntry->numFreeDesc;
1008 }
1009
Leo Chang7e05f212013-07-01 19:54:15 -07001010 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
1011 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
1012 {
1013 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write;
1014 currentDesc->dxedesc.dxe_short_desc.dstMemAddrL = channelEntry->extraConfig.refWQ_swapped;
1015 }
1016 else if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
Mihir Shetee6618162015-03-16 14:48:42 +05301017 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType)||
1018 (WDTS_CHANNEL_RX_LOG == channelEntry->channelType))
Leo Chang7e05f212013-07-01 19:54:15 -07001019 {
1020 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_read;
1021 currentDesc->dxedesc.dxe_short_desc.srcMemAddrL = channelEntry->extraConfig.refWQ_swapped;
1022 }
1023 else
1024 {
Mihir Shetebe94ebb2015-05-26 12:07:14 +05301025 /* Just in case. H2H RX channel, do nothing
Leo Chang7e05f212013-07-01 19:54:15 -07001026 * By Definition this must not happen */
1027 }
1028
Jeff Johnson295189b2012-06-20 16:38:30 -07001029 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
1030 prevDesc = currentDesc;
1031
Jeff Johnson295189b2012-06-20 16:38:30 -07001032 // advance to the next pre-allocated descriptor in the chunk
1033 currentDesc++;
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05301034 physAddress = (physAddress + sizeof(WLANDXE_DescType));
Jeff Johnson295189b2012-06-20 16:38:30 -07001035 }
1036
1037 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001038 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001039 return status;
1040}
1041
1042/*==========================================================================
1043 @ Function Name
1044
1045 @ Description
1046
1047 @ Parameters
1048
1049 @ Return
1050 wpt_status
1051
1052===========================================================================*/
1053static wpt_status dxeSetInterruptPath
1054(
1055 WLANDXE_CtrlBlkType *dxeCtrlBlk
1056)
1057{
1058 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1059 wpt_uint32 interruptPath = 0;
1060 wpt_uint32 idx;
1061 WLANDXE_ChannelCBType *channelEntry = NULL;
1062
1063 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001064 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001065
Mihir Shetee6618162015-03-16 14:48:42 +05301066 foreach_valid_channel(idx)
Jeff Johnson295189b2012-06-20 16:38:30 -07001067 {
1068 channelEntry = &dxeCtrlBlk->dxeChannel[idx];
Jeff Johnson295189b2012-06-20 16:38:30 -07001069 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
1070 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
Jeff Johnson295189b2012-06-20 16:38:30 -07001071 {
1072 interruptPath |= (1 << channelEntry->assignedDMAChannel);
1073 }
1074 else if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
Mihir Shetee6618162015-03-16 14:48:42 +05301075 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType)||
Mihir Shetec4093f92015-05-28 15:21:11 +05301076 (WDTS_CHANNEL_RX_FW_LOG == channelEntry->channelType) ||
Mihir Shetee6618162015-03-16 14:48:42 +05301077 (WDTS_CHANNEL_RX_LOG == channelEntry->channelType))
Jeff Johnson295189b2012-06-20 16:38:30 -07001078 {
1079 interruptPath |= (1 << (channelEntry->assignedDMAChannel + 16));
1080 }
1081 else
1082 {
1083 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1084 "H2H TEST RX???? %d", channelEntry->channelType);
1085 }
1086 }
1087 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
1088 "Interrupt Path Must be 0x%x", interruptPath);
1089 dxeCtrlBlk->interruptPath = interruptPath;
1090 wpalWriteRegister(WLANDXE_CCU_DXE_INT_SELECT, interruptPath);
1091
1092 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001093 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001094 return status;
1095}
1096
1097/*==========================================================================
1098 @ Function Name
1099 dxeEngineCoreStart
1100
1101 @ Description
1102 Trigger to start RIVA DXE Hardware
1103
1104 @ Parameters
1105 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1106 DXE host driver main control block
1107
1108 @ Return
jagadeeshf869bba2015-04-07 20:06:21 +05301109 void
Jeff Johnson295189b2012-06-20 16:38:30 -07001110
1111===========================================================================*/
jagadeeshf869bba2015-04-07 20:06:21 +05301112static void dxeEngineCoreStart
Jeff Johnson295189b2012-06-20 16:38:30 -07001113(
1114 WLANDXE_CtrlBlkType *dxeCtrlBlk
1115)
1116{
Jeff Johnson295189b2012-06-20 16:38:30 -07001117 wpt_uint32 registerData = 0;
Leo Chang00708f62013-12-03 20:21:51 -08001118 wpt_uint8 readRetry;
Jeff Johnson295189b2012-06-20 16:38:30 -07001119
1120 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001121 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001122
Leo Chang00708f62013-12-03 20:21:51 -08001123#ifdef WCN_PRONTO
1124 /* Read default */
1125 wpalReadRegister(WLANDXE_CCU_SOFT_RESET, &registerData);
1126 registerData |= WLANDXE_DMA_CCU_DXE_RESET_MASK;
1127
1128 /* Make reset */
1129 wpalWriteRegister(WLANDXE_CCU_SOFT_RESET, registerData);
1130
1131 /* Clear reset */
1132 registerData &= ~WLANDXE_DMA_CCU_DXE_RESET_MASK;
1133 wpalWriteRegister(WLANDXE_CCU_SOFT_RESET, registerData);
1134#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001135 /* START This core init is not needed for the integrated system */
1136 /* Reset First */
1137 registerData = WLANDXE_DMA_CSR_RESET_MASK;
1138 wpalWriteRegister(WALNDEX_DMA_CSR_ADDRESS,
1139 registerData);
Leo Chang00708f62013-12-03 20:21:51 -08001140#endif /* WCN_PRONTO */
Jeff Johnson295189b2012-06-20 16:38:30 -07001141
Leo Chang00708f62013-12-03 20:21:51 -08001142 for(readRetry = 0; readRetry < WLANDXE_CSR_MAX_READ_COUNT; readRetry++)
1143 {
1144 wpalWriteRegister(WALNDEX_DMA_CSR_ADDRESS,
1145 WLANDXE_CSR_DEFAULT_ENABLE);
1146 wpalReadRegister(WALNDEX_DMA_CSR_ADDRESS, &registerData);
1147 if(!(registerData & WLANDXE_DMA_CSR_EN_MASK))
1148 {
1149 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1150 "%s CSR 0x%x, count %d",
1151 __func__, registerData, readRetry);
1152 /* CSR is not valid value, re-try to write */
1153 wpalBusyWait(WLANDXE_CSR_NEXT_READ_WAIT);
1154 }
1155 else
1156 {
1157 break;
1158 }
1159 }
1160 if(WLANDXE_CSR_MAX_READ_COUNT == readRetry)
1161 {
1162 /* MAX wait, still cannot write correct value
1163 * Panic device */
1164 wpalDevicePanic();
1165 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001166
1167 /* Is This needed?
1168 * Not sure, revisit with integrated system */
1169 /* END This core init is not needed for the integrated system */
1170
1171 dxeSetInterruptPath(dxeCtrlBlk);
1172 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001173 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001174}
1175
1176/*==========================================================================
1177 @ Function Name
1178 dxeChannelInitProgram
1179
1180 @ Description
1181 Program RIVA DXE engine register with initial value
1182 What must be programmed
1183 - Source Address (SADRL, chDXESadrlRegAddr)
1184 - Destination address (DADRL, chDXEDadrlRegAddr)
1185 - Next Descriptor address (DESCL, chDXEDesclRegAddr)
1186 - current descriptor address (LST_DESCL, chDXELstDesclRegAddr)
1187
1188 Not need to program now
1189 - Channel Control register (CH_CTRL, chDXECtrlRegAddr)
1190 TX : Have to program to trigger send out frame
1191 RX : programmed by DXE engine
1192
1193 @ Parameters
1194 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1195 DXE host driver main control block
1196 WLANDXE_ChannelCBType *channelEntry
1197 Channel specific control block
1198 @ Return
1199 wpt_status
1200
1201===========================================================================*/
1202static wpt_status dxeChannelInitProgram
1203(
1204 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1205 WLANDXE_ChannelCBType *channelEntry
1206)
1207{
1208 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1209 wpt_uint32 idx;
1210 WLANDXE_DescType *currentDesc = NULL;
1211 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
1212
1213 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001214 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001215
1216 /* Sanity Check */
1217 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
1218 {
1219 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1220 "dxeChannelInitProgram Channel Entry is not valid");
1221 return eWLAN_PAL_STATUS_E_INVAL;
1222 }
1223
1224 /* Program Source address and destination adderss */
1225 if(!channelEntry->channelConfig.useShortDescFmt)
1226 {
1227 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1228 "dxeChannelInitProgram Long Descriptor not support yet");
1229 return eWLAN_PAL_STATUS_E_FAILURE;
1230 }
1231
1232 /* Common register area */
1233 /* Next linked list Descriptor pointer */
1234 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
1235 channelEntry->headCtrlBlk->linkedDescPhyAddr);
1236 if(eWLAN_PAL_STATUS_SUCCESS != status)
1237 {
1238 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1239 "dxeChannelInitProgram Write DESC Address register fail");
1240 return status;
1241 }
1242
1243 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
1244 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
1245 {
1246 /* Program default registers */
1247 /* TX DMA channel, DMA destination address is work Q */
1248 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrlRegAddr,
1249 channelEntry->channelConfig.refWQ);
1250 if(eWLAN_PAL_STATUS_SUCCESS != status)
1251 {
1252 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1253 "dxeChannelInitProgram Write TX DAddress register fail");
1254 return status;
1255 }
1256 }
1257 else if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
Mihir Shetee6618162015-03-16 14:48:42 +05301258 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType) ||
1259 (WDTS_CHANNEL_RX_LOG == channelEntry->channelType))
Jeff Johnson295189b2012-06-20 16:38:30 -07001260 {
1261 /* Initialize Descriptor control Word First */
1262 currentCtrlBlk = channelEntry->headCtrlBlk;
1263 for(idx = 0; idx < channelEntry->channelConfig.nDescs; idx++)
1264 {
1265 currentDesc = currentCtrlBlk->linkedDesc;
1266 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
1267 }
1268
1269 /* RX DMA channel, DMA source address is work Q */
1270 status = wpalWriteRegister(channelEntry->channelRegister.chDXESadrlRegAddr,
1271 channelEntry->channelConfig.refWQ);
1272 if(eWLAN_PAL_STATUS_SUCCESS != status)
1273 {
1274 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1275 "dxeChannelInitProgram Write RX SAddress WQ register fail");
1276 return status;
1277 }
1278
1279 /* RX DMA channel, Program pre allocated destination Address */
1280 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrlRegAddr,
1281 WLANDXE_U32_SWAP_ENDIAN(channelEntry->DescBottomLoc->dxedesc.dxe_short_desc.phyNextL));
1282 if(eWLAN_PAL_STATUS_SUCCESS != status)
1283 {
1284 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1285 "dxeChannelInitProgram Write RX DAddress register fail");
1286 return status;
1287 }
1288
1289 /* RX Channels, default Control registers MUST BE ENABLED */
jagadeeshf869bba2015-04-07 20:06:21 +05301290 status = wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07001291 channelEntry->extraConfig.chan_mask);
1292 if(eWLAN_PAL_STATUS_SUCCESS != status)
1293 {
1294 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1295 "dxeChannelInitProgram Write RX Control register fail");
1296 return status;
1297 }
1298 }
1299 else
1300 {
1301 /* H2H test channel, not use work Q */
Jeff Johnson295189b2012-06-20 16:38:30 -07001302 }
1303
1304 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001305 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001306 return status;
1307}
1308
1309
1310/*==========================================================================
1311 @ Function Name
1312 dxeChannelStart
1313
1314 @ Description
1315 Start Specific Channel
1316
1317 @ Parameters
1318 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1319 DXE host driver main control block
1320 WLANDXE_ChannelCBType *channelEntry
1321 Channel specific control block
1322
1323 @ Return
1324 wpt_status
1325
1326===========================================================================*/
1327static wpt_status dxeChannelStart
1328(
1329 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1330 WLANDXE_ChannelCBType *channelEntry
1331)
1332{
1333 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1334 wpt_uint32 regValue = 0;
1335 wpt_uint32 intMaskVal = 0;
1336
1337 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001338 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001339
1340 channelEntry->extraConfig.chEnabled = eWLAN_PAL_TRUE;
1341 channelEntry->extraConfig.chConfigured = eWLAN_PAL_TRUE;
1342
1343 /* Enable individual channel
1344 * not to break current channel setup, first read register */
1345 status = wpalReadRegister(WALNDEX_DMA_CH_EN_ADDRESS,
1346 &regValue);
1347 if(eWLAN_PAL_STATUS_SUCCESS != status)
1348 {
1349 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1350 "dxeChannelStart Read Channel Enable register fail");
1351 return status;
1352 }
1353
1354 /* Enable Channel specific Interrupt */
1355 status = wpalReadRegister(WLANDXE_INT_MASK_REG_ADDRESS,
1356 &intMaskVal);
1357 if(eWLAN_PAL_STATUS_SUCCESS != status)
1358 {
1359 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1360 "dxeChannelStart Read INT_MASK register fail");
1361 return status;
1362 }
1363 intMaskVal |= channelEntry->extraConfig.intMask;
1364 status = wpalWriteRegister(WLANDXE_INT_MASK_REG_ADDRESS,
1365 intMaskVal);
1366 if(eWLAN_PAL_STATUS_SUCCESS != status)
1367 {
1368 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1369 "dxeChannelStart Write INT_MASK register fail");
1370 return status;
1371 }
1372
1373 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001374 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001375 return status;
1376}
1377
1378/*==========================================================================
1379 @ Function Name
1380 dxeChannelStop
1381
1382 @ Description
1383 Stop Specific Channel
1384
1385 @ Parameters
1386 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1387 DXE host driver main control block
1388 WLANDXE_ChannelCBType *channelEntry
1389 Channel specific control block
1390
1391 @ Return
1392 wpt_status
1393
1394===========================================================================*/
1395static wpt_status dxeChannelStop
1396(
1397 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1398 WLANDXE_ChannelCBType *channelEntry
1399)
1400{
1401 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1402 wpt_uint32 intMaskVal = 0;
1403
1404 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001405 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001406
1407 /* Sanity */
1408 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
1409 {
1410 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1411 "dxeChannelStop Invalid arg input");
1412 return eWLAN_PAL_STATUS_E_INVAL;
1413 }
1414
Madan Mohan Koyyalamudid57ae632012-11-06 18:42:48 -08001415 if ( (channelEntry->extraConfig.chEnabled != eWLAN_PAL_TRUE) ||
1416 (channelEntry->extraConfig.chConfigured != eWLAN_PAL_TRUE))
1417 {
1418 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1419 "dxeChannelStop channels are not enabled ");
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08001420 return status;
Madan Mohan Koyyalamudid57ae632012-11-06 18:42:48 -08001421 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001422 /* Maskout interrupt */
1423 status = wpalReadRegister(WLANDXE_INT_MASK_REG_ADDRESS,
1424 &intMaskVal);
1425 if(eWLAN_PAL_STATUS_SUCCESS != status)
1426 {
1427 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1428 "dxeChannelStop Read INT_MASK register fail");
1429 return status;
1430 }
1431 intMaskVal ^= channelEntry->extraConfig.intMask;
1432 status = wpalWriteRegister(WLANDXE_INT_MASK_REG_ADDRESS,
1433 intMaskVal);
1434 if(eWLAN_PAL_STATUS_SUCCESS != status)
1435 {
1436 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1437 "dxeChannelStop Write INT_MASK register fail");
1438 return status;
1439 }
1440
1441 channelEntry->extraConfig.chEnabled = eWLAN_PAL_FALSE;
1442
1443 /* Stop Channel ??? */
1444 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001445 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001446 return status;
1447}
1448
1449/*==========================================================================
1450 @ Function Name
1451 dxeChannelClose
1452
1453 @ Description
1454 Close Specific Channel
1455 Free pre allocated RX frame buffer if RX channel
1456 Free DXE descriptor for each channel
1457 Free Descriptor control block for each channel
1458
1459 @ Parameters
1460 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1461 DXE host driver main control block
1462 WLANDXE_ChannelCBType *channelEntry
1463 Channel specific control block
1464
1465 @ Return
1466 wpt_status
1467
1468===========================================================================*/
1469static wpt_status dxeChannelClose
1470(
1471 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1472 WLANDXE_ChannelCBType *channelEntry
1473)
1474{
1475 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1476 wpt_uint32 idx;
1477 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
1478 WLANDXE_DescCtrlBlkType *nextCtrlBlk = NULL;
1479 WLANDXE_DescType *currentDescriptor = NULL;
1480 WLANDXE_DescType *nextDescriptor = NULL;
1481
1482 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001483 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001484
1485 /* Sanity */
1486 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
1487 {
1488 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1489 "dxeChannelStop Invalid arg input");
1490 return eWLAN_PAL_STATUS_E_INVAL;
1491 }
1492
1493 currentCtrlBlk = channelEntry->headCtrlBlk;
1494 if(NULL != currentCtrlBlk)
1495 {
1496 currentDescriptor = currentCtrlBlk->linkedDesc;
1497 for(idx = 0; idx < channelEntry->numDesc; idx++)
1498 {
1499 if (idx + 1 != channelEntry->numDesc)
1500 {
1501 nextCtrlBlk = currentCtrlBlk->nextCtrlBlk;
1502 nextDescriptor = nextCtrlBlk->linkedDesc;
1503 }
1504 else
1505 {
1506 nextCtrlBlk = NULL;
1507 nextDescriptor = NULL;
1508 }
1509 if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
Mihir Shetee6618162015-03-16 14:48:42 +05301510 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType) ||
1511 (WDTS_CHANNEL_RX_LOG == channelEntry->channelType))
Jeff Johnson295189b2012-06-20 16:38:30 -07001512 {
1513 if (NULL != currentCtrlBlk->xfrFrame)
1514 {
1515 wpalUnlockPacket(currentCtrlBlk->xfrFrame);
1516 wpalPacketFree(currentCtrlBlk->xfrFrame);
1517 }
1518 }
1519 /*
1520 * It is the responsibility of DXE to walk through the
1521 * descriptor chain and unlock any pending packets (if
1522 * locked).
1523 */
1524 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
1525 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
1526 {
1527 if((NULL != currentCtrlBlk->xfrFrame) &&
1528 (eWLAN_PAL_STATUS_SUCCESS == wpalIsPacketLocked(currentCtrlBlk->xfrFrame)))
1529 {
1530 wpalUnlockPacket(currentCtrlBlk->xfrFrame);
1531 wpalPacketFree(currentCtrlBlk->xfrFrame);
1532 }
1533 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001534 wpalMemoryFree(currentCtrlBlk);
1535
1536 currentCtrlBlk = nextCtrlBlk;
1537 currentDescriptor = nextDescriptor;
Madan Mohan Koyyalamudi74719a12012-10-21 12:09:36 -07001538 if(NULL == currentCtrlBlk)
1539 {
1540 /* Already reach last of the control block
1541 * Not need to process anymore, break */
1542 break;
1543 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001544 }
1545 }
1546
Jeff Johnson295189b2012-06-20 16:38:30 -07001547 // descriptors were allocated as a single chunk so free the chunk
1548 if(NULL != channelEntry->descriptorAllocation)
1549 {
1550 wpalDmaMemoryFree(channelEntry->descriptorAllocation);
1551 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001552
1553 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001554 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001555 return status;
1556}
1557
1558/*==========================================================================
1559 @ Function Name
1560 dxeChannelCleanInt
1561
1562 @ Description
1563 Clean up interrupt from RIVA HW
1564 After Host finish to handle interrupt, interrupt signal must be cleaned up
1565 Otherwise next interrupt will not be generated
1566
1567 @ Parameters
1568 WLANDXE_ChannelCBType *channelEntry
1569 Channel specific control block
1570 wpt_uint32 *chStat
1571 Channel Status register value
1572
1573 @ Return
1574 wpt_status
1575
1576===========================================================================*/
1577static wpt_status dxeChannelCleanInt
1578(
1579 WLANDXE_ChannelCBType *channelEntry,
1580 wpt_uint32 *chStat
1581)
1582{
1583 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1584
1585 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001586 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001587
1588 /* Read Channel Status Register to know why INT Happen */
1589 status = wpalReadRegister(channelEntry->channelRegister.chDXEStatusRegAddr,
1590 chStat);
1591 if(eWLAN_PAL_STATUS_SUCCESS != status)
1592 {
1593 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1594 "dxeChannelCleanInt Read CH STAT register fail");
1595 return eWLAN_PAL_STATUS_E_FAULT;
1596 }
1597 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
1598 "%s Channel INT Clean, Status 0x%x",
1599 channelType[channelEntry->channelType], *chStat);
1600
1601 /* Clean up all the INT within this channel */
1602 status = wpalWriteRegister(WLANDXE_INT_CLR_ADDRESS,
1603 (1 << channelEntry->assignedDMAChannel));
1604 if(eWLAN_PAL_STATUS_SUCCESS != status)
1605 {
1606 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1607 "dxeChannelCleanInt Write CH Clean register fail");
1608 return eWLAN_PAL_STATUS_E_FAULT;
1609 }
1610
Jeff Johnsone7245742012-09-05 17:12:55 -07001611 /* Clean up Error INT Bit */
1612 if(WLANDXE_CH_STAT_INT_ERR_MASK & *chStat)
1613 {
1614 status = wpalWriteRegister(WLANDXE_INT_ERR_CLR_ADDRESS,
1615 (1 << channelEntry->assignedDMAChannel));
1616 if(eWLAN_PAL_STATUS_SUCCESS != status)
1617 {
1618 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1619 "dxeChannelCleanInt Read CH STAT register fail");
1620 return eWLAN_PAL_STATUS_E_FAULT;
1621 }
1622 }
1623
1624 /* Clean up DONE INT Bit */
1625 if(WLANDXE_CH_STAT_INT_DONE_MASK & *chStat)
1626 {
1627 status = wpalWriteRegister(WLANDXE_INT_DONE_CLR_ADDRESS,
1628 (1 << channelEntry->assignedDMAChannel));
1629 if(eWLAN_PAL_STATUS_SUCCESS != status)
1630 {
1631 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1632 "dxeChannelCleanInt Read CH STAT register fail");
1633 return eWLAN_PAL_STATUS_E_FAULT;
1634 }
1635 }
1636
1637 /* Clean up ED INT Bit */
1638 if(WLANDXE_CH_STAT_INT_ED_MASK & *chStat)
1639 {
1640 status = wpalWriteRegister(WLANDXE_INT_ED_CLR_ADDRESS,
1641 (1 << channelEntry->assignedDMAChannel));
1642 if(eWLAN_PAL_STATUS_SUCCESS != status)
1643 {
1644 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1645 "dxeChannelCleanInt Read CH STAT register fail");
1646 return eWLAN_PAL_STATUS_E_FAULT;
1647 }
1648 }
1649
Jeff Johnson295189b2012-06-20 16:38:30 -07001650 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001651 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001652 return status;
1653}
1654
Mihir Shete44547fb2014-03-10 14:15:42 +05301655#ifdef WLAN_DXE_LOW_RESOURCE_TIMER
Jeff Johnson295189b2012-06-20 16:38:30 -07001656/*==========================================================================
Leo Chang72cdfd32013-10-17 20:36:30 -07001657 @ Function Name
1658 dxeRXResourceAvailableTimerExpHandler
1659
1660 @ Description
1661 During pre-set timeperiod, if free available RX buffer is not allocated
1662 Trigger Driver re-loading to recover RX dead end
1663
1664 @ Parameters
1665 v_VOID_t *usrData
1666 DXE context
1667
1668 @ Return
1669 NONE
1670
1671===========================================================================*/
1672void dxeRXResourceAvailableTimerExpHandler
1673(
1674 void *usrData
1675)
1676{
Katya Nigam93888ff2014-02-10 17:58:11 +05301677 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
Mihir Shete058fcff2014-06-26 18:54:06 +05301678 wpt_uint32 numRxFreePackets;
Mihir Sheted183cef2014-09-26 19:17:56 +05301679 wpt_uint32 numAllocFailures;
Katya Nigam93888ff2014-02-10 17:58:11 +05301680
1681 dxeCtxt = (WLANDXE_CtrlBlkType *)usrData;
1682
Leo Chang72cdfd32013-10-17 20:36:30 -07001683 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1684 "RX Low resource, Durign wait time period %d, RX resource not allocated",
Katya Nigama6fbf662015-03-17 18:35:47 +05301685 wpalGetDxeReplenishRXTimerVal());
Katya Nigam93888ff2014-02-10 17:58:11 +05301686
Mihir Shete058fcff2014-06-26 18:54:06 +05301687 //This API wil also try to replenish packets
1688 wpalGetNumRxFreePacket(&numRxFreePackets);
Mihir Sheted183cef2014-09-26 19:17:56 +05301689 wpalGetNumRxPacketAllocFailures(&numAllocFailures);
Mihir Shete058fcff2014-06-26 18:54:06 +05301690
Mihir Sheted183cef2014-09-26 19:17:56 +05301691 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1692 "Free Packets: %u, Alloc Failures: %u",
1693 numRxFreePackets, numAllocFailures);
Mihir Shete058fcff2014-06-26 18:54:06 +05301694 if (numRxFreePackets > 0)
1695 {
1696 /* If no. of free packets is greater than 0, it means
1697 * that some packets were replenished and can be used
1698 * by DXE to receive frames. So try to restart the
1699 * resourceAvailable timer here, it will be stopped
1700 * by the DXE's low resource callback if atleast one
1701 * free packet reaches DXE.
1702 */
1703 if (NULL != dxeCtxt)
1704 {
1705 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1706 "%s: Replenish successful. Restart the Rx Low resource timer",
1707 __func__);
1708 wpalTimerStart(&dxeCtxt->rxResourceAvailableTimer,
Katya Nigama6fbf662015-03-17 18:35:47 +05301709 wpalGetDxeReplenishRXTimerVal());
Mihir Shete058fcff2014-06-26 18:54:06 +05301710 return;
1711 }
1712 }
Katya Nigama6fbf662015-03-17 18:35:47 +05301713 if(wpalIsDxeSSREnable())
1714 {
1715 if (NULL != dxeCtxt)
1716 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
Mihir Shete058fcff2014-06-26 18:54:06 +05301717
Anurag Chouhanf0d0ba12018-02-09 15:13:43 +05301718 wpalWlanReload(VOS_DXE_FAILURE);
Katya Nigam93888ff2014-02-10 17:58:11 +05301719
Katya Nigama6fbf662015-03-17 18:35:47 +05301720 if (NULL != usrData)
1721 dxeStartSSRTimer((WLANDXE_CtrlBlkType *)usrData);
1722 }
1723 else
1724 {
1725 wpalTimerStart(&dxeCtxt->rxResourceAvailableTimer,
1726 wpalGetDxeReplenishRXTimerVal());
1727 }
Mihir Shetefdc9f532014-01-09 15:03:02 +05301728 return;
1729}
Mihir Shete44547fb2014-03-10 14:15:42 +05301730#endif
Mihir Shetefdc9f532014-01-09 15:03:02 +05301731
1732/*==========================================================================
1733 @ Function Name
1734 dxeStartSSRTimer
1735
1736 @ Description
1737 Start the dxeSSRTimer after issuing the FIQ to restart the WCN chip,
1738 this makes sure that if the chip does not respond to the FIQ within
1739 the timeout period the dxeSSRTimer expiration handler will take the
1740 appropriate action.
1741
1742 @ Parameters
1743 NONE
1744
1745 @ Return
1746 NONE
1747
1748===========================================================================*/
1749static void dxeStartSSRTimer
1750(
1751 WLANDXE_CtrlBlkType *dxeCtxt
1752)
1753{
1754 if(VOS_TIMER_STATE_RUNNING !=
1755 wpalTimerGetCurStatus(&dxeCtxt->dxeSSRTimer))
1756 {
1757 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
1758 "%s: Starting SSR Timer",__func__);
1759 wpalTimerStart(&dxeCtxt->dxeSSRTimer,
1760 T_WLANDXE_SSR_TIMEOUT);
1761 }
1762}
1763
1764/*==========================================================================
1765 @ Function Name
1766 dxeSSRTimerExpHandler
1767
1768 @ Description
1769 Issue an explicit subsystem restart of the wcnss subsystem if the
1770 WCN chip does not respond to the FIQ within the timeout period
1771
1772 @ Parameters
1773 v_VOID_t *usrData
1774
1775 @ Return
1776 NONE
1777
1778===========================================================================*/
1779void dxeSSRTimerExpHandler
1780(
1781 void *usrData
1782)
1783{
1784 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1785 "DXE not shutdown %d ms after FIQ!! Issue SSR",
1786 T_WLANDXE_SSR_TIMEOUT);
1787 wpalRivaSubystemRestart();
1788
Leo Chang72cdfd32013-10-17 20:36:30 -07001789 return;
1790}
1791
1792/*==========================================================================
Jeff Johnson295189b2012-06-20 16:38:30 -07001793 @ Function Name
1794 dxeRXPacketAvailableCB
1795
1796 @ Description
1797 If RX frame handler encounts RX buffer pool empty condition,
1798 DXE RX handle loop will be blocked till get available RX buffer pool.
1799 When new RX buffer pool available, Packet available CB function will
1800 be called.
1801
1802 @ Parameters
1803 wpt_packet *freePacket
1804 Newly allocated RX buffer
1805 v_VOID_t *usrData
1806 DXE context
1807
1808 @ Return
1809 NONE
1810
1811===========================================================================*/
1812void dxeRXPacketAvailableCB
1813(
1814 wpt_packet *freePacket,
1815 v_VOID_t *usrData
1816)
1817{
1818 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
1819 wpt_status status;
1820
1821 /* Simple Sanity */
1822 if((NULL == freePacket) || (NULL == usrData))
1823 {
1824 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1825 "Get Free RX Buffer fail, Critical Error");
1826 HDXE_ASSERT(0);
1827 return;
1828 }
1829
1830 dxeCtxt = (WLANDXE_CtrlBlkType *)usrData;
1831
1832 if(WLANDXE_CTXT_COOKIE != dxeCtxt->dxeCookie)
1833 {
1834 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1835 "DXE Context data corrupted, Critical Error");
1836 HDXE_ASSERT(0);
1837 return;
1838 }
1839
1840 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
1841 "DXE RX packet available, post MSG to RX Thread");
1842
1843 dxeCtxt->freeRXPacket = freePacket;
1844
1845 /* Serialize RX Packet Available message upon RX thread */
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08001846 if (NULL == dxeCtxt->rxPktAvailMsg)
1847 {
1848 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1849 "DXE NULL pkt");
1850 HDXE_ASSERT(0);
1851 return;
1852 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001853
1854 status = wpalPostRxMsg(WDI_GET_PAL_CTX(),
1855 dxeCtxt->rxPktAvailMsg);
1856 if(eWLAN_PAL_STATUS_SUCCESS != status)
1857 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001858 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1859 "dxeRXPacketAvailableCB serialize fail");
1860 }
1861
1862 return;
1863}
1864
1865/*==========================================================================
1866 @ Function Name
1867 dxeRXFrameSingleBufferAlloc
1868
1869 @ Description
1870 Allocate Platform packet buffer to prepare RX frame
1871 RX frame memory space must be pre allocted and must be asigned to
1872 descriptor
1873 then whenever DMA engine want to tranfer frame from BMU,
1874 buffer must be ready
1875
1876 @ Parameters
1877 WLANDXE_CtrlBlkType *dxeCtrlBlk,
1878 DXE host driver main control block
1879 WLANDXE_ChannelCBType *channelEntry
1880 Channel specific control block
1881 WLANDXE_DescCtrlBlkType currentCtrlBlock
1882 current control block which have to be asigned
1883 frame buffer
1884
1885 @ Return
1886 wpt_status
1887
1888===========================================================================*/
1889static wpt_status dxeRXFrameSingleBufferAlloc
1890(
1891 WLANDXE_CtrlBlkType *dxeCtxt,
1892 WLANDXE_ChannelCBType *channelEntry,
1893 WLANDXE_DescCtrlBlkType *currentCtrlBlock
1894)
1895{
1896 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
1897 wpt_packet *currentPalPacketBuffer = NULL;
1898 WLANDXE_DescType *currentDesc = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001899 wpt_iterator iterator;
1900 wpt_uint32 allocatedSize = 0;
1901 void *physAddress = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001902
1903 currentDesc = currentCtrlBlock->linkedDesc;
1904
Leo Chang7e05f212013-07-01 19:54:15 -07001905 if(currentDesc->descCtrl.valid)
1906 {
1907 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1908 "This Descriptor is valid, Do not refill");
1909 return eWLAN_PAL_STATUS_E_EXISTS;
1910 }
1911
Jeff Johnson295189b2012-06-20 16:38:30 -07001912 /* First check if a packet pointer has already been provided by a previously
1913 invoked Rx packet available callback. If so use that packet. */
Sravan Kumar Kairam7b8c3852016-03-28 15:54:05 +05301914 if (dxeCtxt->rxPalPacketUnavailable)
Jeff Johnson295189b2012-06-20 16:38:30 -07001915 {
Sravan Kumar Kairam7b8c3852016-03-28 15:54:05 +05301916 if (NULL != dxeCtxt->freeRXPacket)
Mihir Sheted183cef2014-09-26 19:17:56 +05301917 {
Sravan Kumar Kairam7b8c3852016-03-28 15:54:05 +05301918 currentPalPacketBuffer = dxeCtxt->freeRXPacket;
1919 dxeCtxt->rxPalPacketUnavailable = eWLAN_PAL_FALSE;
1920 dxeCtxt->freeRXPacket = NULL;
1921
1922 if (channelEntry->doneIntDisabled)
1923 {
1924 wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr,
1925 channelEntry->extraConfig.chan_mask);
1926 channelEntry->doneIntDisabled = 0;
1927 }
1928 }
1929 else if (VOS_TIMER_STATE_RUNNING !=
1930 wpalTimerGetCurStatus(&dxeCtxt->rxResourceAvailableTimer))
1931 {
1932 if (eWLAN_PAL_STATUS_SUCCESS !=
1933 wpalTimerStart(&dxeCtxt->rxResourceAvailableTimer,
1934 wpalGetDxeReplenishRXTimerVal()))
1935 {
1936 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1937 "RX resource available timer not started");
1938 }
1939 else
1940 dxeEnvBlk.rx_low_resource_timer = 1;
Mihir Sheted183cef2014-09-26 19:17:56 +05301941 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001942 }
1943 else if(!dxeCtxt->rxPalPacketUnavailable)
1944 {
Leo Chang72cdfd32013-10-17 20:36:30 -07001945 /* Allocate platform Packet buffer and OS Frame Buffer at here */
1946 currentPalPacketBuffer = wpalPacketAlloc(eWLAN_PAL_PKT_TYPE_RX_RAW,
Jeff Johnson295189b2012-06-20 16:38:30 -07001947 WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE,
1948 dxeRXPacketAvailableCB,
1949 (void *)dxeCtxt);
1950
1951 if(NULL == currentPalPacketBuffer)
1952 {
1953 dxeCtxt->rxPalPacketUnavailable = eWLAN_PAL_TRUE;
Mihir Shete44547fb2014-03-10 14:15:42 +05301954#ifdef WLAN_DXE_LOW_RESOURCE_TIMER
Leo Chang72cdfd32013-10-17 20:36:30 -07001955 /* Out of RX free buffer,
1956 * Start timer to recover from RX dead end */
1957 if(VOS_TIMER_STATE_RUNNING !=
1958 wpalTimerGetCurStatus(&dxeCtxt->rxResourceAvailableTimer))
1959 {
1960 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
1961 "RX Low resource, wait available resource");
Sravan Kumar Kairam7b8c3852016-03-28 15:54:05 +05301962 if (eWLAN_PAL_STATUS_SUCCESS !=
1963 wpalTimerStart(&dxeCtxt->rxResourceAvailableTimer,
1964 wpalGetDxeReplenishRXTimerVal()))
1965 {
1966 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
1967 "RX resource available timer not started");
1968 }
1969 else
1970 dxeEnvBlk.rx_low_resource_timer = 1;
Leo Chang72cdfd32013-10-17 20:36:30 -07001971 }
Mihir Shete44547fb2014-03-10 14:15:42 +05301972#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001973 }
1974 }
1975
1976 if(NULL == currentPalPacketBuffer)
1977 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001978 return eWLAN_PAL_STATUS_E_RESOURCES;
1979 }
1980
1981 currentCtrlBlock->xfrFrame = currentPalPacketBuffer;
1982 currentPalPacketBuffer->pktType = eWLAN_PAL_PKT_TYPE_RX_RAW;
1983 currentPalPacketBuffer->pBD = NULL;
1984 currentPalPacketBuffer->pBDPhys = NULL;
1985 currentPalPacketBuffer->BDLength = 0;
Mihir Shete5affadc2015-05-29 20:54:57 +05301986
1987 if (channelEntry->channelType == WDTS_CHANNEL_RX_FW_LOG)
Hanumantha Reddy Pothulabd3303c2015-07-15 17:22:00 +05301988 wpalPacketRawTrimHead(currentCtrlBlock->xfrFrame, WLANDXE_NL_HEADER_SZ);
Mihir Shete5affadc2015-05-29 20:54:57 +05301989
Jeff Johnson295189b2012-06-20 16:38:30 -07001990 status = wpalLockPacketForTransfer(currentPalPacketBuffer);
Mihir Shetebc338242015-03-04 15:34:19 +05301991
Jeff Johnson295189b2012-06-20 16:38:30 -07001992 if(eWLAN_PAL_STATUS_SUCCESS != status)
1993 {
1994 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
1995 "dxeRXFrameBufferAlloc unable to lock packet");
1996 return status;
1997 }
1998
1999 /* Init iterator to get physical os buffer address */
2000 status = wpalIteratorInit(&iterator, currentPalPacketBuffer);
2001 if(eWLAN_PAL_STATUS_SUCCESS != status)
2002 {
2003 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2004 "dxeRXFrameBufferAlloc iterator init fail");
2005 return status;
2006 }
2007 status = wpalIteratorNext(&iterator,
2008 currentPalPacketBuffer,
2009 &physAddress,
2010 &allocatedSize);
2011 if(eWLAN_PAL_STATUS_SUCCESS != status)
2012 {
2013 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2014 "dxeRXFrameBufferAlloc iterator Get Next pointer fail");
2015 return status;
2016 }
2017 currentPalPacketBuffer->pBDPhys = physAddress;
Jeff Johnson295189b2012-06-20 16:38:30 -07002018
2019 /* DXE descriptor must have SWAPPED addres in it's structure
2020 * !!! SWAPPED !!! */
2021 currentDesc->dxedesc.dxe_short_desc.dstMemAddrL =
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05302022 WLANDXE_U32_SWAP_ENDIAN((wpt_uint32)(uintptr_t)currentPalPacketBuffer->pBDPhys);
Jeff Johnson295189b2012-06-20 16:38:30 -07002023
Jeff Johnson295189b2012-06-20 16:38:30 -07002024 return status;
2025}
2026
2027/*==========================================================================
2028 @ Function Name
2029 dxeRXFrameRefillRing
2030
2031 @ Description
2032 Allocate Platform packet buffers to try to fill up the DXE Rx ring
2033
2034 @ Parameters
2035 WLANDXE_CtrlBlkType *dxeCtrlBlk,
2036 DXE host driver main control block
2037 WLANDXE_ChannelCBType *channelEntry
2038 Channel specific control block
2039
2040 @ Return
2041 wpt_status
2042
2043===========================================================================*/
2044static wpt_status dxeRXFrameRefillRing
2045(
2046 WLANDXE_CtrlBlkType *dxeCtxt,
2047 WLANDXE_ChannelCBType *channelEntry
2048)
2049{
2050 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
2051 WLANDXE_DescCtrlBlkType *currentCtrlBlk = channelEntry->tailCtrlBlk;
2052 WLANDXE_DescType *currentDesc = NULL;
2053
2054 while(channelEntry->numFreeDesc > 0)
2055 {
2056 /* Current Control block is free
2057 * and associated frame buffer is not linked with control block anymore
2058 * allocate new frame buffer for current control block */
2059 status = dxeRXFrameSingleBufferAlloc(dxeCtxt,
2060 channelEntry,
2061 currentCtrlBlk);
2062
Leo Chang7e05f212013-07-01 19:54:15 -07002063 if((eWLAN_PAL_STATUS_SUCCESS != status) &&
2064 (eWLAN_PAL_STATUS_E_EXISTS != status))
Jeff Johnson295189b2012-06-20 16:38:30 -07002065 {
2066 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
2067 "dxeRXFrameRefillRing, out of RX buffer pool, break here");
2068 break;
2069 }
2070
Leo Chang7e05f212013-07-01 19:54:15 -07002071 if(eWLAN_PAL_STATUS_E_EXISTS == status)
2072 {
2073 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2074 "dxeRXFrameRefillRing, Descriptor Non-Empry");
2075 }
2076
Jeff Johnson295189b2012-06-20 16:38:30 -07002077 currentDesc = currentCtrlBlk->linkedDesc;
2078 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_read;
2079
2080 /* Issue a dummy read from the DXE descriptor DDR location to ensure
2081 that any posted writes are reflected in memory before DXE looks at
2082 the descriptor. */
2083 if(channelEntry->extraConfig.cw_ctrl_read != currentDesc->descCtrl.ctrl)
2084 {
Karthick S3254c5d2015-04-28 15:06:17 +05302085 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2086 "dxeRXFrameRefillRing, Descriptor write failed");
2087 ++channelEntry->desc_write_fail_count;
Jeff Johnson295189b2012-06-20 16:38:30 -07002088 //HDXE_ASSERT(0);
2089 }
2090
2091 /* Kick off the DXE ring, if not in any power save mode */
Leo Chang094ece82013-04-23 17:57:41 -07002092 if(WLANDXE_POWER_STATE_FULL == dxeCtxt->hostPowerState)
Jeff Johnson295189b2012-06-20 16:38:30 -07002093 {
2094 wpalWriteRegister(WALNDEX_DMA_ENCH_ADDRESS,
2095 1 << channelEntry->assignedDMAChannel);
2096 }
2097 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
Leo Chang7e05f212013-07-01 19:54:15 -07002098 if(eWLAN_PAL_STATUS_E_EXISTS != status)
2099 {
2100 --channelEntry->numFreeDesc;
2101 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002102 }
2103
2104 channelEntry->tailCtrlBlk = currentCtrlBlk;
2105
2106 return status;
2107}
2108
Mihir Shete5affadc2015-05-29 20:54:57 +05302109static wpt_uint32 dxeRXLogRefillRing
2110(
2111 WLANDXE_CtrlBlkType *dxeCtxt,
2112 WLANDXE_ChannelCBType *channelEntry,
2113 wpt_uint64 bufferAddr,
2114 wpt_uint32 bufferLen
2115)
2116{
2117 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
2118 WLANDXE_DescCtrlBlkType *currentCtrlBlk = channelEntry->tailCtrlBlk;
2119 WLANDXE_DescType *currentDesc = NULL;
2120 wpt_uint32 xfrSize, allocatedLen = 0;
2121
Karthick Sed59a282015-08-10 14:52:16 +05302122 while(bufferLen > 0 && channelEntry->numFreeDesc > 0)
Mihir Shete5affadc2015-05-29 20:54:57 +05302123 {
2124 /* Current Control block is free
2125 * and associated frame buffer is not linked with control block anymore
2126 * allocate new frame buffer for current control block */
2127 status = dxeRXFrameSingleBufferAlloc(dxeCtxt,
2128 channelEntry,
2129 currentCtrlBlk);
2130
Karthick S122fa9e2015-07-24 17:20:03 +05302131 if((eWLAN_PAL_STATUS_SUCCESS != status) &&
2132 (eWLAN_PAL_STATUS_E_EXISTS != status))
Mihir Shete5affadc2015-05-29 20:54:57 +05302133 {
2134 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Karthick S122fa9e2015-07-24 17:20:03 +05302135 "dxeRXFrameRefillRing, out of RX buffer pool, break here");
Mihir Shete5affadc2015-05-29 20:54:57 +05302136 break;
2137 }
2138
2139 if(eWLAN_PAL_STATUS_E_EXISTS == status)
2140 {
2141 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2142 "%s, Descriptor Non-Empty",__func__);
2143 }
2144
2145 currentDesc = currentCtrlBlk->linkedDesc;
2146 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_read;
Hanumantha Reddy Pothulabd3303c2015-07-15 17:22:00 +05302147 xfrSize = WLANDXE_FW_LOGGING_XFSIZE > bufferLen ?
2148 bufferLen : WLANDXE_FW_LOGGING_XFSIZE;
Mihir Shete5affadc2015-05-29 20:54:57 +05302149 currentDesc->xfrSize = xfrSize;
2150 allocatedLen += xfrSize;
2151 bufferLen -= xfrSize;
2152 wpalPacketSetRxLength(currentCtrlBlk->xfrFrame,
2153 xfrSize);
2154
2155 currentDesc->dxedesc.dxe_short_desc.srcMemAddrL =
2156 WLANDXE_U32_SWAP_ENDIAN((wpt_uint32)(uintptr_t)bufferAddr);
2157
2158 /* Issue a dummy read from the DXE descriptor DDR location to ensure
2159 that any posted writes are reflected in memory before DXE looks at
2160 the descriptor. */
2161 if(channelEntry->extraConfig.cw_ctrl_read != currentDesc->descCtrl.ctrl)
2162 {
2163 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2164 "%s, Descriptor write failed",__func__);
2165 ++channelEntry->desc_write_fail_count;
2166 }
2167
2168 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
2169 --channelEntry->numFreeDesc;
2170 bufferAddr += xfrSize;
2171 }
2172
2173 channelEntry->tailCtrlBlk = currentCtrlBlk;
2174
2175 return allocatedLen;
2176}
Jeff Johnson295189b2012-06-20 16:38:30 -07002177/*==========================================================================
Jeff Johnsone7245742012-09-05 17:12:55 -07002178 @ Function Name
2179 dxeRXFrameRouteUpperLayer
2180
2181 @ Description
2182 Test DXE descriptors and if any RX frame pending within RING,
2183 Route to upper layer
2184
2185 @ Parameters
2186 WLANDXE_CtrlBlkType *dxeCtrlBlk,
2187 DXE host driver main control block
2188 WLANDXE_ChannelCBType *channelEntry
2189 Channel specific control block
2190 @ Return
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002191 < 0 Any error happen
Jeff Johnsone7245742012-09-05 17:12:55 -07002192 0 No frame pulled from RX RING
2193 int number of RX frames pulled from RX ring
2194
2195===========================================================================*/
2196static wpt_int32 dxeRXFrameRouteUpperLayer
2197(
2198 WLANDXE_CtrlBlkType *dxeCtxt,
2199 WLANDXE_ChannelCBType *channelEntry
2200)
2201{
2202 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
2203 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
2204 WLANDXE_DescType *currentDesc = NULL;
2205 wpt_uint32 descCtrl, frameCount = 0, i;
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002206 wpt_int32 ret_val = -1;
Jeff Johnsone7245742012-09-05 17:12:55 -07002207
2208 currentCtrlBlk = channelEntry->headCtrlBlk;
2209 currentDesc = currentCtrlBlk->linkedDesc;
2210
2211 /* Descriptoe should be SWAPPED ???? */
2212 descCtrl = currentDesc->descCtrl.ctrl;
2213
2214 /* Get frames while VALID bit is not set (DMA complete) and a data
2215 * associated with it */
2216 while(!(WLANDXE_U32_SWAP_ENDIAN(descCtrl) & WLANDXE_DESC_CTRL_VALID) &&
2217 (eWLAN_PAL_STATUS_SUCCESS == wpalIsPacketLocked(currentCtrlBlk->xfrFrame)) &&
2218 (currentCtrlBlk->xfrFrame->pInternalData != NULL) &&
2219 (frameCount < WLANDXE_MAX_REAPED_RX_FRAMES) )
2220 {
2221 channelEntry->numTotalFrame++;
2222 channelEntry->numFreeDesc++;
Jeff Johnsone7245742012-09-05 17:12:55 -07002223 status = wpalUnlockPacket(currentCtrlBlk->xfrFrame);
Mihir Shetebc338242015-03-04 15:34:19 +05302224
Jeff Johnsone7245742012-09-05 17:12:55 -07002225 if (eWLAN_PAL_STATUS_SUCCESS != status)
2226 {
2227 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2228 "dxeRXFrameReady unable to unlock packet");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002229 return ret_val;
Jeff Johnsone7245742012-09-05 17:12:55 -07002230 }
Mihir Shetebc338242015-03-04 15:34:19 +05302231
Jeff Johnsone7245742012-09-05 17:12:55 -07002232 /* This Descriptor is valid, so linked Control block is also valid
2233 * Linked Control block has pre allocated packet buffer
2234 * So, just let upper layer knows preallocated frame pointer will be OK */
2235 /* Reap Rx frames */
2236 rx_reaped_buf[frameCount] = currentCtrlBlk->xfrFrame;
2237 frameCount++;
Madan Mohan Koyyalamudi0c325532012-09-24 13:24:42 -07002238 currentCtrlBlk->xfrFrame = NULL;
Jeff Johnsone7245742012-09-05 17:12:55 -07002239
2240 /* Now try to refill the ring with empty Rx buffers to keep DXE busy */
Mihir Shete5affadc2015-05-29 20:54:57 +05302241 if (WDTS_CHANNEL_RX_FW_LOG != channelEntry->channelType)
2242 dxeRXFrameRefillRing(dxeCtxt, channelEntry);
Jeff Johnsone7245742012-09-05 17:12:55 -07002243
2244 /* Test next contorl block
2245 * if valid, this control block also has new RX frame must be handled */
2246 currentCtrlBlk = (WLANDXE_DescCtrlBlkType *)currentCtrlBlk->nextCtrlBlk;
2247 currentDesc = currentCtrlBlk->linkedDesc;
2248 descCtrl = currentDesc->descCtrl.ctrl;
2249 }
2250
2251 /* Update head control block
2252 * current control block's valid bit was 0
2253 * next trial first control block must be current control block */
2254 channelEntry->headCtrlBlk = currentCtrlBlk;
2255
2256 /* Deliver all the reaped RX frames to upper layers */
2257 i = 0;
Leo Changd6de1c22013-03-21 15:42:41 -07002258 while(i < frameCount)
2259 {
Jeff Johnsone7245742012-09-05 17:12:55 -07002260 dxeCtxt->rxReadyCB(dxeCtxt->clientCtxt, rx_reaped_buf[i], channelEntry->channelType);
2261 i++;
2262 }
2263
2264 return frameCount;
2265}
2266
2267/*==========================================================================
Jeff Johnson295189b2012-06-20 16:38:30 -07002268 @ Function Name
2269 dxeRXFrameReady
2270
2271 @ Description
2272 Pop frame from descriptor and route frame to upper transport layer
2273 Assign new platform packet buffer into used descriptor
2274 Actual frame pop and resource realloc
2275
2276 @ Parameters
2277 WLANDXE_CtrlBlkType *dxeCtrlBlk,
2278 DXE host driver main control block
2279 WLANDXE_ChannelCBType *channelEntry
2280 Channel specific control block
2281
2282 @ Return
2283 wpt_status
2284
2285===========================================================================*/
2286static wpt_status dxeRXFrameReady
2287(
2288 WLANDXE_CtrlBlkType *dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002289 WLANDXE_ChannelCBType *channelEntry,
2290 wpt_uint32 chStat
Jeff Johnson295189b2012-06-20 16:38:30 -07002291)
2292{
2293 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
2294 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
2295 WLANDXE_DescType *currentDesc = NULL;
2296 wpt_uint32 descCtrl;
Jeff Johnsone7245742012-09-05 17:12:55 -07002297 wpt_int32 frameCount = 0;
2298
2299 wpt_uint32 descLoop;
2300 wpt_uint32 invalidatedFound = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07002301
2302 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002303 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002304
2305 /* Sanity Check */
2306 if((NULL == dxeCtxt) || (NULL == channelEntry))
2307 {
2308 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2309 "dxeRXFrameReady Channel Entry is not valid");
2310 return eWLAN_PAL_STATUS_E_INVAL;
2311 }
2312
Jeff Johnsone7245742012-09-05 17:12:55 -07002313 frameCount = dxeRXFrameRouteUpperLayer(dxeCtxt, channelEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -07002314
Jeff Johnsone7245742012-09-05 17:12:55 -07002315 if(0 > frameCount)
Leo Changd6de1c22013-03-21 15:42:41 -07002316 {
2317 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Jeff Johnsone7245742012-09-05 17:12:55 -07002318 "dxeRXFrameReady RX frame route fail");
Leo Changd6de1c22013-03-21 15:42:41 -07002319 return eWLAN_PAL_STATUS_E_INVAL;
2320 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002321
Leo Changd6de1c22013-03-21 15:42:41 -07002322 if((0 == frameCount) &&
Jeff Johnsone7245742012-09-05 17:12:55 -07002323 ((WLANDXE_POWER_STATE_BMPS == dxeCtxt->hostPowerState) ||
2324 (WLANDXE_POWER_STATE_FULL == dxeCtxt->hostPowerState)))
2325 {
Leo Changd6de1c22013-03-21 15:42:41 -07002326 /* None of the frame handled and CH is not enabled
2327 * RX CH wrap around happen and No RX free frame
2328 * RX side should wait till new free frame available in the pool
2329 * Do not try reload driver at here*/
2330 if(!(chStat & WLANDXE_CH_CTRL_EN_MASK))
2331 {
Leo Changbbf86b72013-06-19 16:13:00 -07002332 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Leo Changd6de1c22013-03-21 15:42:41 -07002333 "dxeRXFrameReady %s RING Wrapped, RX Free Low 0x%x",
2334 channelType[channelEntry->channelType], chStat);
Leo Chang3714c922013-07-10 20:33:30 -07002335 /* This is not empty interrupt case
2336 * If handle this as empty interrupt, false SSR might be issued
2337 * Frame count '1' is dummy frame count to avoid SSR */
2338 channelEntry->numFragmentCurrentChain = 1;
Leo Changd6de1c22013-03-21 15:42:41 -07002339 return eWLAN_PAL_STATUS_SUCCESS;
2340 }
2341
Jeff Johnsone7245742012-09-05 17:12:55 -07002342 currentCtrlBlk = channelEntry->headCtrlBlk;
Jeff Johnson295189b2012-06-20 16:38:30 -07002343 currentDesc = currentCtrlBlk->linkedDesc;
2344 descCtrl = currentDesc->descCtrl.ctrl;
Jeff Johnsone7245742012-09-05 17:12:55 -07002345
2346 if(WLANDXE_POWER_STATE_BMPS != dxeCtxt->hostPowerState)
2347 {
2348 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
2349 "RX ISR called but no frame handled PWS %d, channel %s",
2350 (int)dxeCtxt->hostPowerState,
2351 channelType[channelEntry->channelType]);
2352 }
2353
2354 /* Current interupt empty and previous interrupt also empty
2355 * detected successive empty interrupt
2356 * or first interrupt empty, this should not happen */
2357 if(0 == channelEntry->numFragmentCurrentChain)
2358 {
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07002359 dxeChannelMonitor("RX Ready", channelEntry, NULL);
2360 dxeDescriptorDump(channelEntry, channelEntry->headCtrlBlk->linkedDesc, 0);
2361 dxeChannelRegisterDump(channelEntry, "RX successive empty interrupt", NULL);
2362 dxeChannelAllDescDump(channelEntry, channelEntry->channelType, NULL);
Jeff Johnsone7245742012-09-05 17:12:55 -07002363 /* Abnormal interrupt detected, try to find not validated descriptor */
2364 for(descLoop = 0; descLoop < channelEntry->numDesc; descLoop++)
2365 {
2366 if(!(WLANDXE_U32_SWAP_ENDIAN(descCtrl) & WLANDXE_DESC_CTRL_VALID))
2367 {
Leo Chang416afe02013-07-01 13:58:13 -07002368 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Jeff Johnsone7245742012-09-05 17:12:55 -07002369 "Found Invalidated Descriptor %d", (int)descLoop);
2370 if(eWLAN_PAL_STATUS_SUCCESS == wpalIsPacketLocked(currentCtrlBlk->xfrFrame))
2371 {
Leo Chang416afe02013-07-01 13:58:13 -07002372 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Jeff Johnsone7245742012-09-05 17:12:55 -07002373 "Packet locked, Resync Host and HW");
2374 channelEntry->headCtrlBlk = currentCtrlBlk;
2375 invalidatedFound = 1;
2376 break;
2377 }
2378 else
2379 {
Leo Chang416afe02013-07-01 13:58:13 -07002380 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Jeff Johnsone7245742012-09-05 17:12:55 -07002381 "Packet Not Locked, cannot transfer frame");
2382 }
2383 }
2384 currentCtrlBlk = (WLANDXE_DescCtrlBlkType *)currentCtrlBlk->nextCtrlBlk;
2385 currentDesc = currentCtrlBlk->linkedDesc;
2386 descCtrl = currentDesc->descCtrl.ctrl;
2387 }
2388
Jeff Johnson32d95a32012-09-10 13:15:23 -07002389 /* Invalidated descriptor found, and that is not head descriptor
2390 * This means HW/SW descriptor miss match happen, and we may recover with just resync
2391 * Try re-sync here */
2392 if((invalidatedFound) && (0 != descLoop))
Jeff Johnsone7245742012-09-05 17:12:55 -07002393 {
2394 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2395 "Found New Sync location with HW, handle frames from there");
2396 frameCount = dxeRXFrameRouteUpperLayer(dxeCtxt, channelEntry);
2397 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2398 "re-sync routed %d frames to upper layer", (int)frameCount);
Madan Mohan Koyyalamudi0c325532012-09-24 13:24:42 -07002399 channelEntry->numFragmentCurrentChain = frameCount;
Jeff Johnsone7245742012-09-05 17:12:55 -07002400 }
Jeff Johnson32d95a32012-09-10 13:15:23 -07002401 /* Successive Empty interrupt
2402 * But this case, first descriptor also invalidated, then it means head descriptor
2403 * is linked with already handled RX frame, then could not unlock RX frame
2404 * This is just Out of RX buffer pool, not need to anything here */
2405 else if((invalidatedFound) && (0 == descLoop))
2406 {
2407 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2408 "Out of RX Low resource, and INT came in, do nothing till get RX resource");
2409 }
2410 /* Critical error, reload driver */
Jeff Johnsone7245742012-09-05 17:12:55 -07002411 else
2412 {
2413 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2414 "Could not found invalidated descriptor");
2415 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2416 "RX successive empty interrupt, Could not find invalidated DESC reload driver");
2417 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
Anurag Chouhanf0d0ba12018-02-09 15:13:43 +05302418 wpalWlanReload(VOS_DXE_FAILURE);
Mihir Shetefdc9f532014-01-09 15:03:02 +05302419 dxeStartSSRTimer(dxeCtxt);
Jeff Johnsone7245742012-09-05 17:12:55 -07002420 }
2421 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002422 }
Madan Mohan Koyyalamudi6646aad2012-09-24 14:10:39 -07002423 channelEntry->numFragmentCurrentChain = frameCount;
Jeff Johnson295189b2012-06-20 16:38:30 -07002424 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002425 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002426 return status;
2427}
2428
2429/*==========================================================================
2430 @ Function Name
2431 dxeNotifySmsm
2432
2433 @ Description: Notify SMSM to start DXE engine and/or condition of Tx ring
2434 buffer
2435
2436 @ Parameters
2437
2438 @ Return
2439 wpt_status
2440
2441===========================================================================*/
2442static wpt_status dxeNotifySmsm
2443(
2444 wpt_boolean kickDxe,
2445 wpt_boolean ringEmpty
2446)
2447{
2448 wpt_uint32 clrSt = 0;
2449 wpt_uint32 setSt = 0;
2450
2451 if(kickDxe)
2452 {
2453 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, "Kick off DXE");
2454
2455 if(tempDxeCtrlBlk->lastKickOffDxe == 0)
2456 {
2457 setSt |= WPAL_SMSM_WLAN_TX_ENABLE;
2458 tempDxeCtrlBlk->lastKickOffDxe = 1;
2459 }
2460 else if(tempDxeCtrlBlk->lastKickOffDxe == 1)
2461 {
2462 clrSt |= WPAL_SMSM_WLAN_TX_ENABLE;
2463 tempDxeCtrlBlk->lastKickOffDxe = 0;
2464 }
2465 else
2466 {
2467 HDXE_ASSERT(0);
2468 }
2469 }
2470 else
2471 {
2472 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, "no need to kick off DXE");
2473 }
2474
Mihir Shete68ed77a2014-10-10 10:47:12 +05302475 tempDxeCtrlBlk->txRingsEmpty = ringEmpty;
Jeff Johnson295189b2012-06-20 16:38:30 -07002476 if(ringEmpty)
2477 {
2478 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, "SMSM Tx Ring Empty");
2479 clrSt |= WPAL_SMSM_WLAN_TX_RINGS_EMPTY;
2480 }
2481 else
2482 {
2483 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, "SMSM Tx Ring Not Empty");
2484 setSt |= WPAL_SMSM_WLAN_TX_RINGS_EMPTY;
2485 }
2486
2487 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH, "C%x S%x", clrSt, setSt);
2488
Karthick Sc6ec8362015-08-12 18:18:47 +05302489 /* Store the smsm notification sent to firmware */
2490 tempDxeCtrlBlk->smsmDxeHistogram = (tempDxeCtrlBlk->smsmDxeHistogram << 1);
2491 if(setSt & WPAL_SMSM_WLAN_TX_ENABLE)
2492 {
2493 tempDxeCtrlBlk->smsmDxeHistogram |= 1;
2494 }
2495 else
2496 {
2497 tempDxeCtrlBlk->smsmDxeHistogram &= ~((wpt_uint32)1);
2498 }
2499 tempDxeCtrlBlk->smsmRingsEmptyHistogram = (tempDxeCtrlBlk->smsmRingsEmptyHistogram << 1);
2500 if(setSt & WPAL_SMSM_WLAN_TX_RINGS_EMPTY)
2501 {
2502 tempDxeCtrlBlk->smsmRingsEmptyHistogram |= 1;
2503 }
2504 else
2505 {
2506 tempDxeCtrlBlk->smsmRingsEmptyHistogram &= ~((wpt_uint32)1);
2507 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002508 wpalNotifySmsm(clrSt, setSt);
2509
2510 return eWLAN_PAL_STATUS_SUCCESS;
2511}
2512
2513/*==========================================================================
2514 @ Function Name
2515 dxePsComplete
2516
2517 @ Description: Utility function to check the resv desc to deside if we can
2518 get into Power Save mode now
2519
2520 @ Parameters
2521
2522 @ Return
2523 None
2524
2525===========================================================================*/
2526static void dxePsComplete(WLANDXE_CtrlBlkType *dxeCtxt, wpt_boolean intr_based)
2527{
2528 if( dxeCtxt->hostPowerState == WLANDXE_POWER_STATE_FULL )
2529 {
2530 return;
2531 }
2532
2533 //if both HIGH & LOW Tx channels don't have anything on resv desc,all Tx pkts
2534 //must have been consumed by RIVA, OK to get into BMPS
2535 if((0 == dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc) &&
2536 (0 == dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc))
2537 {
2538 tempDxeCtrlBlk->ringNotEmpty = eWLAN_PAL_FALSE;
2539 //if host is in BMPS & no pkt to Tx, RIVA can go to power save
2540 if(WLANDXE_POWER_STATE_BMPS == dxeCtxt->hostPowerState)
2541 {
2542 dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN;
2543 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
2544 }
2545 }
2546 else //still more pkts to be served by RIVA
2547 {
2548 tempDxeCtrlBlk->ringNotEmpty = eWLAN_PAL_TRUE;
2549
2550 switch(dxeCtxt->rivaPowerState)
2551 {
2552 case WLANDXE_RIVA_POWER_STATE_ACTIVE:
2553 //NOP
2554 break;
2555 case WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN:
2556 if(intr_based)
2557 {
2558 dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_ACTIVE;
2559 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
2560 }
2561 break;
2562 default:
2563 //assert
2564 break;
2565 }
2566 }
2567}
2568
2569/*==========================================================================
2570 @ Function Name
2571 dxeRXEventHandler
2572
2573 @ Description
2574 Handle serailized RX frame ready event
2575 First disable interrupt then pick up frame from pre allocated buffer
2576 Since frame handle is doen, clear interrupt bit to ready next interrupt
2577 Finally re enable interrupt
2578
2579 @ Parameters
2580 wpt_msg *rxReadyMsg
2581 RX frame ready MSG pointer
2582 include DXE control context
2583
2584 @ Return
2585 NONE
2586
2587===========================================================================*/
2588void dxeRXEventHandler
2589(
2590 wpt_msg *rxReadyMsg
2591)
2592{
2593 wpt_msg *msgContent = (wpt_msg *)rxReadyMsg;
2594 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
2595 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
2596 wpt_uint32 intSrc = 0;
2597 WLANDXE_ChannelCBType *channelCb = NULL;
Jeff Johnsone7245742012-09-05 17:12:55 -07002598 wpt_uint32 chHighStat = 0;
2599 wpt_uint32 chLowStat = 0;
Mihir Shetee6618162015-03-16 14:48:42 +05302600 wpt_uint32 chLogRxStat = 0;
Mihir Shetec4093f92015-05-28 15:21:11 +05302601 wpt_uint32 chLogRxFwStat = 0;
Mihir Shetef2000552014-05-12 16:21:34 +05302602 wpt_uint32 regValue, chanMask;
Jeff Johnson295189b2012-06-20 16:38:30 -07002603
Jeff Johnsone7245742012-09-05 17:12:55 -07002604 dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07002605
Jeff Johnsone7245742012-09-05 17:12:55 -07002606 if(eWLAN_PAL_TRUE == dxeCtxt->driverReloadInProcessing)
Jeff Johnson295189b2012-06-20 16:38:30 -07002607 {
2608 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Jeff Johnsone7245742012-09-05 17:12:55 -07002609 "RX Ready WLAN Driver re-loading in progress");
Jeff Johnson32d95a32012-09-10 13:15:23 -07002610 return;
Jeff Johnson295189b2012-06-20 16:38:30 -07002611 }
2612
Jeff Johnsone7245742012-09-05 17:12:55 -07002613 /* Now try to refill the ring with empty Rx buffers to keep DXE busy */
2614 dxeRXFrameRefillRing(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI]);
2615 dxeRXFrameRefillRing(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI]);
Mihir Shetee6618162015-03-16 14:48:42 +05302616 if (WLANDXE_IS_VALID_CHANNEL(WDTS_CHANNEL_RX_LOG))
2617 dxeRXFrameRefillRing(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG]);
Jeff Johnson295189b2012-06-20 16:38:30 -07002618
2619 if((!dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].extraConfig.chEnabled) ||
Mihir Shetee6618162015-03-16 14:48:42 +05302620 (!dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].extraConfig.chEnabled) ||
2621 (WLANDXE_IS_VALID_CHANNEL(WDTS_CHANNEL_RX_LOG) &&
2622 !dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG].extraConfig.chEnabled))
Jeff Johnson295189b2012-06-20 16:38:30 -07002623 {
2624 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2625 "DXE already stopped in RX event handler. Just return");
2626 return;
2627 }
2628
Sravan Kumar Kairam8bbda362015-10-06 11:51:14 +05302629 /* Disable device interrupt */
2630 /* Read whole interrupt mask register and exclusive only this channel int */
2631 status = wpalReadRegister(WLANDXE_INT_SRC_RAW_ADDRESS,
2632 &intSrc);
2633 if(eWLAN_PAL_STATUS_SUCCESS != status)
2634 {
2635 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2636 "dxeRXEventHandler Read INT_SRC register fail");
2637 return;
2638 }
2639 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED,
2640 "RX Event Handler INT Source 0x%x", intSrc);
2641
2642 dxeEnvBlk.rxIntChanlSrc = intSrc&0xFF;
2643
Jeff Johnson295189b2012-06-20 16:38:30 -07002644 if((WLANDXE_POWER_STATE_IMPS == dxeCtxt->hostPowerState) ||
2645 (WLANDXE_POWER_STATE_DOWN == dxeCtxt->hostPowerState))
2646 {
Sravan Kumar Kairam3d22ec02016-08-01 12:58:44 +05302647 if (WLANDXE_POWER_STATE_DOWN != dxeCtxt->hostPowerState)
Mihir Shetec4093f92015-05-28 15:21:11 +05302648 {
Sravan Kumar Kairam8bbda362015-10-06 11:51:14 +05302649 if(0 == intSrc)
Mihir Shetec4093f92015-05-28 15:21:11 +05302650 {
2651 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2652 "%s: Read status: %d, regVal: %d",
2653 __func__, status, intSrc);
2654 }
2655 else
2656 {
2657 /* Register Read was succesful and we have a valid interrupt
2658 * source, so WCN is not power collapsed yet and it should
2659 * not power collapse till we set the synchronization bit
2660 * at the end of this function, safe to pull frames...
2661 */
2662 goto pull_frames;
2663 }
2664 }
2665
Sravan Kumar Kairam3d22ec02016-08-01 12:58:44 +05302666 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2667 "%s Riva is in %d, Just Pull frames without any register touch",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002668 __func__, dxeCtxt->hostPowerState);
Jeff Johnson295189b2012-06-20 16:38:30 -07002669
2670 /* Not to touch any register, just pull frame directly from chain ring
2671 * First high priority */
2672 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI];
2673 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002674 channelCb,
2675 chHighStat);
Jeff Johnson295189b2012-06-20 16:38:30 -07002676 if(eWLAN_PAL_STATUS_SUCCESS != status)
2677 {
2678 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Sravan Kumar Kairam3d22ec02016-08-01 12:58:44 +05302679 "dxeRXEventHandler Pull from RX high channel fail");
Jeff Johnson295189b2012-06-20 16:38:30 -07002680 }
Leo Chang46f36162014-01-14 21:47:24 -08002681 /* In case FW could not power collapse in IMPS mode
2682 * Next power restore might have empty interrupt
2683 * If IMPS mode has empty interrupt since RX thread race,
2684 * Invalid re-load driver might happen
2685 * To prevent invalid re-load driver,
2686 * IMPS event handler set dummpy frame count */
2687 channelCb->numFragmentCurrentChain = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07002688
2689 /* Second low priority */
2690 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI];
2691 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002692 channelCb,
2693 chLowStat);
Jeff Johnson295189b2012-06-20 16:38:30 -07002694 if(eWLAN_PAL_STATUS_SUCCESS != status)
2695 {
2696 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Mihir Shetee6618162015-03-16 14:48:42 +05302697 "dxeRXEventHandler Pull from RX low channel fail");
Jeff Johnson295189b2012-06-20 16:38:30 -07002698 }
Leo Chang46f36162014-01-14 21:47:24 -08002699 /* LOW Priority CH same above */
2700 channelCb->numFragmentCurrentChain = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07002701
Mihir Shetee6618162015-03-16 14:48:42 +05302702 if (WLANDXE_IS_VALID_CHANNEL(WDTS_CHANNEL_RX_LOG))
2703 {
2704 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG];
2705 status = dxeRXFrameReady(dxeCtxt,
2706 channelCb,
2707 chLogRxStat);
2708 if(eWLAN_PAL_STATUS_SUCCESS != status)
2709 {
2710 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2711 "dxeRXEventHandler Pull from RX log channel fail");
2712 }
2713 channelCb->numFragmentCurrentChain = 1;
2714 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002715 /* Interrupt will not enabled at here, it will be enabled at PS mode change */
2716 tempDxeCtrlBlk->rxIntDisabledByIMPS = eWLAN_PAL_TRUE;
Sravan Kumar Kairam8bbda362015-10-06 11:51:14 +05302717 dxeEnvBlk.rxIntDisableReturn = VOS_RETURN_ADDRESS;
Sravan Kumar Kairam84e995f2016-05-27 16:16:21 +05302718 dxeEnvBlk.rxIntDisableFrame = __builtin_frame_address(0);
2719 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Sravan Kumar Kairam3d22ec02016-08-01 12:58:44 +05302720 "%s Host is in %d RX Int Disabled",
2721 __func__, dxeCtxt->hostPowerState);
Jeff Johnson295189b2012-06-20 16:38:30 -07002722 return;
2723 }
2724
Mihir Shetec4093f92015-05-28 15:21:11 +05302725pull_frames:
Jeff Johnson295189b2012-06-20 16:38:30 -07002726 /* Test High Priority Channel interrupt is enabled or not */
2727 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI];
2728 if(intSrc & (1 << channelCb->assignedDMAChannel))
2729 {
2730 status = dxeChannelCleanInt(channelCb, &chHighStat);
2731 if(eWLAN_PAL_STATUS_SUCCESS != status)
2732 {
2733 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2734 "dxeRXEventHandler INT Clean up fail");
2735 return;
2736 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002737 if(WLANDXE_CH_STAT_INT_ERR_MASK & chHighStat)
2738 {
2739 /* Error Happen during transaction, Handle it */
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08002740 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
2741 "%11s : 0x%x Error Reported, Reload Driver",
2742 channelType[channelCb->channelType], chHighStat);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05302743
Mihir Shetedfc33ec2014-10-15 13:14:38 +05302744 if (eWLAN_PAL_STATUS_SUCCESS != dxeErrHandler(channelCb, chHighStat))
2745 {
2746 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
Anurag Chouhanf0d0ba12018-02-09 15:13:43 +05302747 wpalWlanReload(VOS_DXE_FAILURE);
Mihir Shetedfc33ec2014-10-15 13:14:38 +05302748 dxeStartSSRTimer(dxeCtxt);
2749 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002750 }
Jeff Johnson32d95a32012-09-10 13:15:23 -07002751 else if((WLANDXE_CH_STAT_INT_DONE_MASK & chHighStat) ||
2752 (WLANDXE_CH_STAT_INT_ED_MASK & chHighStat))
Jeff Johnson295189b2012-06-20 16:38:30 -07002753 {
2754 /* Handle RX Ready for high priority channel */
2755 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002756 channelCb,
2757 chHighStat);
Jeff Johnson295189b2012-06-20 16:38:30 -07002758 }
2759 else if(WLANDXE_CH_STAT_MASKED_MASK & chHighStat)
2760 {
2761 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002762 channelCb,
2763 chHighStat);
Jeff Johnson295189b2012-06-20 16:38:30 -07002764 }
2765 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
2766 "RX HIGH CH EVNT STAT 0x%x, %d frames handled", chHighStat, channelCb->numFragmentCurrentChain);
Jeff Johnsone7245742012-09-05 17:12:55 -07002767 /* Update the Rx DONE histogram */
2768 channelCb->rxDoneHistogram = (channelCb->rxDoneHistogram << 1);
2769 if(WLANDXE_CH_STAT_INT_DONE_MASK & chHighStat)
2770 {
2771 channelCb->rxDoneHistogram |= 1;
2772 }
2773 else
2774 {
jagadeeshf869bba2015-04-07 20:06:21 +05302775 channelCb->rxDoneHistogram &= ~((wpt_uint64)1);
Jeff Johnsone7245742012-09-05 17:12:55 -07002776 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002777 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002778
2779 /* Test Low Priority Channel interrupt is enabled or not */
Jeff Johnsone7245742012-09-05 17:12:55 -07002780 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI];
Jeff Johnson295189b2012-06-20 16:38:30 -07002781 if(intSrc & (1 << channelCb->assignedDMAChannel))
2782 {
2783 status = dxeChannelCleanInt(channelCb, &chLowStat);
2784 if(eWLAN_PAL_STATUS_SUCCESS != status)
2785 {
2786 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2787 "dxeRXEventHandler INT Clean up fail");
2788 return;
2789 }
2790
2791 if(WLANDXE_CH_STAT_INT_ERR_MASK & chLowStat)
2792 {
2793 /* Error Happen during transaction, Handle it */
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08002794 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
2795 "%11s : 0x%x Error Reported, Reload Driver",
2796 channelType[channelCb->channelType], chLowStat);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05302797
Mihir Shetedfc33ec2014-10-15 13:14:38 +05302798 if (eWLAN_PAL_STATUS_SUCCESS !=
2799 dxeErrHandler(channelCb, chLowStat))
2800 {
2801 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
Anurag Chouhanf0d0ba12018-02-09 15:13:43 +05302802 wpalWlanReload(VOS_DXE_FAILURE);
Mihir Shetedfc33ec2014-10-15 13:14:38 +05302803 dxeStartSSRTimer(dxeCtxt);
2804 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002805 }
Mihir Shetef2000552014-05-12 16:21:34 +05302806 else if((WLANDXE_CH_STAT_INT_ED_MASK & chLowStat) ||
2807 (WLANDXE_CH_STAT_INT_DONE_MASK & chLowStat))
Jeff Johnson295189b2012-06-20 16:38:30 -07002808 {
2809 /* Handle RX Ready for low priority channel */
2810 status = dxeRXFrameReady(dxeCtxt,
Leo Changd6de1c22013-03-21 15:42:41 -07002811 channelCb,
2812 chLowStat);
Jeff Johnsone7245742012-09-05 17:12:55 -07002813 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002814
2815 /* Update the Rx DONE histogram */
2816 channelCb->rxDoneHistogram = (channelCb->rxDoneHistogram << 1);
2817 if(WLANDXE_CH_STAT_INT_DONE_MASK & chLowStat)
2818 {
2819 channelCb->rxDoneHistogram |= 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07002820 }
2821 else
2822 {
jagadeeshf869bba2015-04-07 20:06:21 +05302823 channelCb->rxDoneHistogram &= ~((wpt_uint64)1);
Jeff Johnson295189b2012-06-20 16:38:30 -07002824 }
2825 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
2826 "RX LOW CH EVNT STAT 0x%x, %d frames handled", chLowStat, channelCb->numFragmentCurrentChain);
2827 }
Mihir Shetee6618162015-03-16 14:48:42 +05302828
2829 if (WLANDXE_IS_VALID_CHANNEL(WDTS_CHANNEL_RX_LOG))
2830 {
2831 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG];
2832
2833 if(intSrc & (1 << channelCb->assignedDMAChannel))
2834 {
2835 status = dxeChannelCleanInt(channelCb,&chLogRxStat);
2836 if(eWLAN_PAL_STATUS_SUCCESS != status)
2837 {
2838 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2839 "dxeRXEventHandler INT Clean up fail");
2840 return;
2841 }
2842
2843 if(WLANDXE_CH_STAT_INT_ERR_MASK & chLogRxStat)
2844 {
2845 /* Error Happen during transaction, Handle it */
2846 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
2847 "%11s : 0x%x Error Reported, Reload Driver",
2848 channelType[channelCb->channelType], chLogRxStat);
2849
Mihir Shetedfc33ec2014-10-15 13:14:38 +05302850 if (eWLAN_PAL_STATUS_SUCCESS !=
2851 dxeErrHandler(channelCb, chLogRxStat))
2852 {
2853 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
Anurag Chouhanf0d0ba12018-02-09 15:13:43 +05302854 wpalWlanReload(VOS_DXE_FAILURE);
Mihir Shetedfc33ec2014-10-15 13:14:38 +05302855 dxeStartSSRTimer(dxeCtxt);
2856 }
Mihir Shetee6618162015-03-16 14:48:42 +05302857
Mihir Shetee6618162015-03-16 14:48:42 +05302858 }
2859 else if((WLANDXE_CH_STAT_INT_ED_MASK & chLogRxStat) ||
2860 (WLANDXE_CH_STAT_INT_DONE_MASK & chLogRxStat))
2861 {
2862 /* Handle RX Ready for low priority channel */
2863 status = dxeRXFrameReady(dxeCtxt,
2864 channelCb,
2865 chLogRxStat);
2866 }
2867
2868 /* Update the Rx DONE histogram */
2869 channelCb->rxDoneHistogram = (channelCb->rxDoneHistogram << 1);
2870 if(WLANDXE_CH_STAT_INT_DONE_MASK & chLogRxStat)
2871 {
2872 channelCb->rxDoneHistogram |= 1;
2873 }
2874 else
2875 {
2876 channelCb->rxDoneHistogram &= ~1;
2877 }
2878 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
2879 "RX LOG CH EVNT STAT 0x%x, %d frames handled", chLogRxStat, channelCb->numFragmentCurrentChain);
2880 }
2881 }
2882
Mihir Shetec4093f92015-05-28 15:21:11 +05302883 if (WLANDXE_IS_VALID_CHANNEL(WDTS_CHANNEL_RX_FW_LOG))
2884 {
2885 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_FW_LOG];
2886
2887 if(intSrc & (1 << channelCb->assignedDMAChannel))
2888 {
2889 status = dxeChannelCleanInt(channelCb,&chLogRxFwStat);
2890 if(eWLAN_PAL_STATUS_SUCCESS != status)
2891 {
2892 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2893 "dxeRXEventHandler INT Clean up fail");
2894 return;
2895 }
2896
2897 if(WLANDXE_CH_STAT_INT_ERR_MASK & chLogRxFwStat)
2898 {
2899 /* Error Happen during transaction, Handle it */
2900 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
2901 "%11s : 0x%x Error Reported, Reload Driver",
2902 channelType[channelCb->channelType], chLogRxFwStat);
2903
Mihir Shetedfc33ec2014-10-15 13:14:38 +05302904 if (eWLAN_PAL_STATUS_SUCCESS !=
2905 dxeErrHandler(channelCb, chLogRxFwStat))
2906 {
2907 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
Anurag Chouhanf0d0ba12018-02-09 15:13:43 +05302908 wpalWlanReload(VOS_DXE_FAILURE);
Mihir Shetedfc33ec2014-10-15 13:14:38 +05302909 dxeStartSSRTimer(dxeCtxt);
2910 }
Mihir Shetec4093f92015-05-28 15:21:11 +05302911
Mihir Shetec4093f92015-05-28 15:21:11 +05302912 }
2913 else if((WLANDXE_CH_STAT_INT_ED_MASK & chLogRxFwStat) ||
2914 (WLANDXE_CH_STAT_INT_DONE_MASK & chLogRxFwStat))
2915 {
2916 if (!dxeCtxt->hostInitiatedH2H)
2917 {
2918 dxeCtxt->receiveMbMsgCB(dxeCtxt->clientCtxt);
2919 }
2920 else
2921 {
2922 status = dxeRXFrameReady(dxeCtxt,
2923 channelCb,
2924 chLogRxFwStat);
Mihir Shete5affadc2015-05-29 20:54:57 +05302925 if (channelCb->numFreeDesc == channelCb->numDesc)
2926 {
Mihir Shete0b090bf2015-06-09 14:00:44 +05302927 /*
2928 * We have already cleared the interrupts before coming here,
2929 * but it can happen that DXE will copy some new packets after
2930 * that and raise interrupts for those. The packets will be
2931 * processed above but the interrupts will still be pending.
2932 * Its safe to clear those interrupts here because we have
2933 * pulled data from all the allocated descriptors.
2934 */
2935 dxeChannelCleanInt(channelCb,&chLogRxFwStat);
Mihir Shete5affadc2015-05-29 20:54:57 +05302936 dxeCtxt->hostInitiatedH2H = 0;
2937 dxeCtxt->receiveLogCompleteCB(dxeCtxt->clientCtxt);
2938 }
Mihir Shetec4093f92015-05-28 15:21:11 +05302939 }
2940 }
2941
2942 /* Update the Rx DONE histogram */
2943 channelCb->rxDoneHistogram = (channelCb->rxDoneHistogram << 1);
2944 if(WLANDXE_CH_STAT_INT_DONE_MASK & chLogRxFwStat)
2945 {
2946 channelCb->rxDoneHistogram |= 1;
2947 }
2948 else
2949 {
2950 channelCb->rxDoneHistogram &= ~1;
2951 }
2952 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
2953 "RX LOG CH EVNT STAT 0x%x, %d frames handled", chLogRxFwStat, channelCb->numFragmentCurrentChain);
2954 }
2955 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002956 if(eWLAN_PAL_STATUS_SUCCESS != status)
2957 {
2958 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
2959 "dxeRXEventHandler Handle Frame Ready Fail");
2960 return;
2961 }
2962
Jeff Johnson295189b2012-06-20 16:38:30 -07002963 /* Prepare Control Register EN Channel */
2964 if(!(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].extraConfig.chan_mask & WLANDXE_CH_CTRL_EN_MASK))
2965 {
2966 HDXE_ASSERT(0);
2967 }
Mihir Shetef2000552014-05-12 16:21:34 +05302968
2969 if (dxeCtxt->rxPalPacketUnavailable &&
2970 (WLANDXE_CH_STAT_INT_DONE_MASK & chHighStat))
2971 {
2972 chanMask = dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].extraConfig.chan_mask &
2973 (~WLANDXE_CH_CTRL_INE_DONE_MASK);
Mihir Sheted183cef2014-09-26 19:17:56 +05302974 dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].doneIntDisabled = 1;
Mihir Shetef2000552014-05-12 16:21:34 +05302975 }
2976 else
2977 {
2978 chanMask = dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].extraConfig.chan_mask;
Mihir Sheted183cef2014-09-26 19:17:56 +05302979 dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].doneIntDisabled = 0;
Mihir Shetef2000552014-05-12 16:21:34 +05302980 }
Leo Chang094ece82013-04-23 17:57:41 -07002981 wpalWriteRegister(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].channelRegister.chDXECtrlRegAddr,
Mihir Shetef2000552014-05-12 16:21:34 +05302982 chanMask);
Jeff Johnson295189b2012-06-20 16:38:30 -07002983
2984 /* Prepare Control Register EN Channel */
2985 if(!(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].extraConfig.chan_mask & WLANDXE_CH_CTRL_EN_MASK))
2986 {
2987 HDXE_ASSERT(0);
2988 }
Leo Chang094ece82013-04-23 17:57:41 -07002989
Mihir Shetef2000552014-05-12 16:21:34 +05302990 if (dxeCtxt->rxPalPacketUnavailable &&
2991 (WLANDXE_CH_STAT_INT_DONE_MASK & chLowStat))
2992 {
2993 chanMask = dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].extraConfig.chan_mask &
2994 (~WLANDXE_CH_CTRL_INE_DONE_MASK);
Mihir Sheted183cef2014-09-26 19:17:56 +05302995 dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].doneIntDisabled = 1;
Mihir Shetef2000552014-05-12 16:21:34 +05302996 }
2997 else
2998 {
2999 chanMask = dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].extraConfig.chan_mask;
Mihir Sheted183cef2014-09-26 19:17:56 +05303000 dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].doneIntDisabled = 0;
Mihir Shetef2000552014-05-12 16:21:34 +05303001 }
Leo Chang094ece82013-04-23 17:57:41 -07003002 wpalWriteRegister(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].channelRegister.chDXECtrlRegAddr,
Mihir Shetef2000552014-05-12 16:21:34 +05303003 chanMask);
3004
Mihir Shetec01157f2015-06-18 14:13:34 +05303005 /* We do not have knowledge of firmare capabilities when the
3006 * RX_LOG channel is enabled. But when we get the first interrupt
3007 * we have all the required information. So if MGMT Logging is not
3008 * supported by the firmware, do not re-enable RX_LOG channel
3009 */
3010 if (WLANDXE_IS_VALID_CHANNEL(WDTS_CHANNEL_RX_LOG) && wpalIsFwLoggingSupported())
Mihir Shetee6618162015-03-16 14:48:42 +05303011 {
3012 if(!(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG].extraConfig.chan_mask & WLANDXE_CH_CTRL_EN_MASK))
3013 {
3014 HDXE_ASSERT(0);
3015 }
3016
3017 if (dxeCtxt->rxPalPacketUnavailable &&
3018 (WLANDXE_CH_STAT_INT_DONE_MASK & chLogRxStat))
3019 {
3020 chanMask = dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG].extraConfig.chan_mask &
3021 (~WLANDXE_CH_CTRL_INE_DONE_MASK);
3022 dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG].doneIntDisabled = 1;
3023 }
3024 else
3025 {
3026 chanMask = dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG].extraConfig.chan_mask;
3027 dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG].doneIntDisabled = 0;
3028 }
3029 wpalWriteRegister(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG].channelRegister.chDXECtrlRegAddr,
3030 chanMask);
3031 }
Leo Chang094ece82013-04-23 17:57:41 -07003032
3033 /* Clear Interrupt handle processing bit
3034 * RIVA may power down */
Mihir Shete0670b402015-05-13 17:51:41 +05303035 if (!(wpalIsFwLoggingSupported() && wpalIsFwLoggingEnabled()))
Mihir Sheted6274602015-04-28 16:13:21 +05303036 {
3037 wpalReadRegister(WLANDXE_INT_MASK_REG_ADDRESS, &regValue);
3038 regValue &= WLANDXE_RX_INTERRUPT_PRO_UNMASK;
3039 wpalWriteRegister(WLANDXE_INT_MASK_REG_ADDRESS, regValue);
3040 }
3041 else
3042 {
Karthick S09d5dd02015-05-27 16:58:32 +05303043 wpalReadRegister(WLAN_PMU_SPARE_OUT_ADDRESS, &regValue);
3044 regValue &= (~WLAN_PMU_POWER_DOWN_MASK);
3045 wpalWriteRegister(WLAN_PMU_SPARE_OUT_ADDRESS, regValue);
Mihir Sheted6274602015-04-28 16:13:21 +05303046 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003047
Sravan Kumar Kairam8bbda362015-10-06 11:51:14 +05303048 dxeEnvBlk.rxIntChanlSrc = 0;
3049
Leo Chang416afe02013-07-01 13:58:13 -07003050 /* Enable system level ISR */
3051 /* Enable RX ready Interrupt at here */
3052 status = wpalEnableInterrupt(DXE_INTERRUPT_RX_READY);
3053 if(eWLAN_PAL_STATUS_SUCCESS != status)
3054 {
3055 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3056 "dxeRXEventHandler Enable RX Ready interrupt fail");
3057 return;
3058 }
Sravan Kumar Kairama8269e72015-11-06 12:13:24 +05303059 DXTRACE(dxeTrace(WLANDXE_DMA_CHANNEL_MAX, TRACE_RXINT_STATE,
3060 TRACE_WLANDXE_VAR_ENABLE));
Jeff Johnson295189b2012-06-20 16:38:30 -07003061 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003062 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003063 return;
3064}
3065
3066/*==========================================================================
3067 @ Function Name
3068 dxeRXPacketAvailableEventHandler
3069
3070 @ Description
3071 Handle serialized RX Packet Available event when the corresponding callback
3072 is invoked by WPAL.
3073 Try to fill up any completed DXE descriptors with available Rx packet buffer
3074 pointers.
3075
3076 @ Parameters
3077 wpt_msg *rxPktAvailMsg
3078 RX frame ready MSG pointer
3079 include DXE control context
3080
3081 @ Return
3082 NONE
3083
3084===========================================================================*/
3085void dxeRXPacketAvailableEventHandler
3086(
3087 wpt_msg *rxPktAvailMsg
3088)
3089{
3090 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
3091 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
3092 WLANDXE_ChannelCBType *channelCb = NULL;
3093
3094 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003095 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003096
3097 /* Sanity Check */
3098 if(NULL == rxPktAvailMsg)
3099 {
3100 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3101 "dxeRXPacketAvailableEventHandler Context is not valid");
3102 return;
3103 }
3104
3105 dxeCtxt = (WLANDXE_CtrlBlkType *)(rxPktAvailMsg->pContext);
Mihir Shete44547fb2014-03-10 14:15:42 +05303106
3107#ifdef WLAN_DXE_LOW_RESOURCE_TIMER
Leo Chang72cdfd32013-10-17 20:36:30 -07003108 /* Available resource allocated
3109 * Stop timer not needed */
3110 if(VOS_TIMER_STATE_RUNNING ==
3111 wpalTimerGetCurStatus(&dxeCtxt->rxResourceAvailableTimer))
3112 {
3113 wpalTimerStop(&dxeCtxt->rxResourceAvailableTimer);
Sravan Kumar Kairam7b8c3852016-03-28 15:54:05 +05303114 dxeEnvBlk.rx_low_resource_timer = 0;
Leo Chang72cdfd32013-10-17 20:36:30 -07003115 }
Mihir Shete44547fb2014-03-10 14:15:42 +05303116#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003117
3118 do
3119 {
3120 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
3121 "dxeRXPacketAvailableEventHandler, start refilling ring");
3122
3123 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI];
3124 status = dxeRXFrameRefillRing(dxeCtxt,channelCb);
3125
3126 // Wait for another callback to indicate when Rx resources are available
3127 // again.
3128 if(eWLAN_PAL_STATUS_SUCCESS != status)
3129 {
3130 break;
3131 }
3132
3133 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI];
3134 status = dxeRXFrameRefillRing(dxeCtxt,channelCb);
3135 if(eWLAN_PAL_STATUS_SUCCESS != status)
3136 {
3137 break;
3138 }
Mihir Shetee6618162015-03-16 14:48:42 +05303139
3140 if (WLANDXE_IS_VALID_CHANNEL(WDTS_CHANNEL_RX_LOG))
3141 {
3142 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOG];
3143 status = dxeRXFrameRefillRing(dxeCtxt,channelCb);
3144 if(eWLAN_PAL_STATUS_SUCCESS != status)
3145 {
3146 break;
3147 }
3148 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003149 } while(0);
3150
3151 if((WLANDXE_POWER_STATE_IMPS == dxeCtxt->hostPowerState) ||
3152 (WLANDXE_POWER_STATE_DOWN == dxeCtxt->hostPowerState))
3153 {
3154 /* Interrupt will not enabled at here, it will be enabled at PS mode change */
3155 tempDxeCtrlBlk->rxIntDisabledByIMPS = eWLAN_PAL_TRUE;
Sravan Kumar Kairam8bbda362015-10-06 11:51:14 +05303156 dxeEnvBlk.rxIntDisableReturn = VOS_RETURN_ADDRESS;
Sravan Kumar Kairam84e995f2016-05-27 16:16:21 +05303157 dxeEnvBlk.rxIntDisableFrame = __builtin_frame_address(0);
3158 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3159 "dxeRXPacketAvailableEventHandler Int Disabled by IMPS");
Jeff Johnson295189b2012-06-20 16:38:30 -07003160 }
3161}
3162
3163/*==========================================================================
3164 @ Function Name
3165 dxeRXISR
3166
3167 @ Description
3168 RX frame ready interrupt service routine
3169 interrupt entry function, this function called based on ISR context
3170 Must be serialized
3171
3172 @ Parameters
3173 void *hostCtxt
3174 DXE host driver control context,
3175 pre registerd during interrupt registration
3176
3177 @ Return
3178 NONE
3179
3180===========================================================================*/
3181static void dxeRXISR
3182(
3183 void *hostCtxt
3184)
3185{
3186 WLANDXE_CtrlBlkType *dxeCtxt = (WLANDXE_CtrlBlkType *)hostCtxt;
3187 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003188 wpt_uint32 regValue;
Sravan Kumar Kairama8269e72015-11-06 12:13:24 +05303189 wpt_uint32 intSrc = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003190
Leo Chang094ece82013-04-23 17:57:41 -07003191 /* Set Interrupt processing bit
3192 * During this bit set, WLAN HW may not power collapse */
Mihir Shete0670b402015-05-13 17:51:41 +05303193 if (!(wpalIsFwLoggingSupported() && wpalIsFwLoggingEnabled()))
Mihir Sheted6274602015-04-28 16:13:21 +05303194 {
3195 wpalReadRegister(WLANDXE_INT_MASK_REG_ADDRESS, &regValue);
3196 regValue |= WLANPAL_RX_INTERRUPT_PRO_MASK;
3197 wpalWriteRegister(WLANDXE_INT_MASK_REG_ADDRESS, regValue);
3198 }
3199 else
3200 {
Karthick S09d5dd02015-05-27 16:58:32 +05303201 wpalReadRegister(WLAN_PMU_SPARE_OUT_ADDRESS, &regValue);
3202 regValue |= WLAN_PMU_POWER_DOWN_MASK;
3203 wpalWriteRegister(WLAN_PMU_SPARE_OUT_ADDRESS, regValue);
Mihir Sheted6274602015-04-28 16:13:21 +05303204 }
Leo Chang094ece82013-04-23 17:57:41 -07003205
Jeff Johnson295189b2012-06-20 16:38:30 -07003206 /* Disable interrupt at here
3207 * Disable RX Ready system level Interrupt at here
3208 * Otherwise infinite loop might happen */
3209 status = wpalDisableInterrupt(DXE_INTERRUPT_RX_READY);
3210 if(eWLAN_PAL_STATUS_SUCCESS != status)
3211 {
3212 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3213 "dxeRXFrameReadyISR Disable RX ready interrupt fail");
3214 return;
3215 }
3216
Sravan Kumar Kairama8269e72015-11-06 12:13:24 +05303217 wpalReadRegister(WLANDXE_INT_SRC_RAW_ADDRESS,
3218 &intSrc);
3219 /* Note: intSrc which holds the INT_SRC_RAW_ADDRESS reg value
3220 While debugging crash dump convert to power of 2 for channel type */
3221 DXTRACE(dxeTrace(intSrc, TRACE_RXINT_STATE, TRACE_WLANDXE_VAR_DISABLE));
3222
Jeff Johnson295189b2012-06-20 16:38:30 -07003223 /* Serialize RX Ready interrupt upon RX thread */
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08003224 if(NULL == dxeCtxt->rxIsrMsg)
3225 {
3226 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3227 "dxeRXFrameReadyISR NULL message");
3228 HDXE_ASSERT(0);
3229 return;
3230 }
3231
Jeff Johnson295189b2012-06-20 16:38:30 -07003232 status = wpalPostRxMsg(WDI_GET_PAL_CTX(),
3233 dxeCtxt->rxIsrMsg);
3234 if(eWLAN_PAL_STATUS_SUCCESS != status)
3235 {
Jeff Johnson295189b2012-06-20 16:38:30 -07003236 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
3237 "dxeRXFrameReadyISR interrupt serialize fail");
3238 }
3239
Jeff Johnson295189b2012-06-20 16:38:30 -07003240 return;
3241}
3242
3243/*==========================================================================
3244 @ Function Name
3245 dxeTXPushFrame
3246
3247 @ Description
3248 Push TX frame into DXE descriptor and DXE register
3249 Send notification to DXE register that TX frame is ready to transfer
3250
3251 @ Parameters
3252 WLANDXE_ChannelCBType *channelEntry
3253 Channel specific control block
3254 wpt_packet *palPacket
3255 Packet pointer ready to transfer
3256
3257 @ Return
3258 PAL_STATUS_T
3259===========================================================================*/
3260static wpt_status dxeTXPushFrame
3261(
3262 WLANDXE_ChannelCBType *channelEntry,
3263 wpt_packet *palPacket
3264)
3265{
3266 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
3267 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
Sravan Kumar Kairame9d186c2015-11-27 23:37:02 +05303268 WLANDXE_DescCtrlBlkType *tailCtrlBlk = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003269 WLANDXE_DescType *currentDesc = NULL;
3270 WLANDXE_DescType *firstDesc = NULL;
3271 WLANDXE_DescType *LastDesc = NULL;
Sravan Kumar Kairame9d186c2015-11-27 23:37:02 +05303272 WLANDXE_DescType *tailDesc = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003273 void *sourcePhysicalAddress = NULL;
3274 wpt_uint32 xferSize = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003275 wpt_iterator iterator;
Sravan Kumar Kairame9d186c2015-11-27 23:37:02 +05303276 wpt_uint8 KickDxe = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003277
3278 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003279 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003280
Leo Changac1d3612013-07-01 15:15:51 -07003281 tempDxeCtrlBlk->smsmToggled = eWLAN_PAL_FALSE;
3282 if((0 == tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc) &&
3283 (0 == tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc))
Jeff Johnson295189b2012-06-20 16:38:30 -07003284 {
Karthick S8a7e2862015-09-14 09:13:37 +05303285 KickDxe = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07003286 }
3287
Karthick S8a7e2862015-09-14 09:13:37 +05303288 /* Kick DXE when the ring is about to fill */
3289 if (WLANDXE_TX_LOW_RES_THRESHOLD >= channelEntry->numFreeDesc)
Sravan Kumar Kairame9d186c2015-11-27 23:37:02 +05303290 {
Karthick S8a7e2862015-09-14 09:13:37 +05303291 KickDxe = 1;
Sravan Kumar Kairame9d186c2015-11-27 23:37:02 +05303292 tailCtrlBlk = channelEntry->tailCtrlBlk;
3293 tailDesc = tailCtrlBlk->linkedDesc;
3294
3295 if(tailDesc->descCtrl.ctrl& WLANDXE_DESC_CTRL_VALID)
3296 {
3297 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
3298 "dxeTXPushFrame Descs threshold reached No DMA");
3299 }
3300 }
Karthick S8a7e2862015-09-14 09:13:37 +05303301
Jeff Johnson295189b2012-06-20 16:38:30 -07003302 channelEntry->numFragmentCurrentChain = 0;
3303 currentCtrlBlk = channelEntry->headCtrlBlk;
3304
3305 /* Initialize interator, TX is fragmented */
Jeff Johnson295189b2012-06-20 16:38:30 -07003306 status = wpalLockPacketForTransfer(palPacket);
3307 if(eWLAN_PAL_STATUS_SUCCESS != status)
3308 {
3309 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3310 "dxeTXPushFrame unable to lock packet");
3311 return status;
3312 }
3313
3314 status = wpalIteratorInit(&iterator, palPacket);
Jeff Johnson295189b2012-06-20 16:38:30 -07003315 if(eWLAN_PAL_STATUS_SUCCESS != status)
3316 {
3317 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3318 "dxeTXPushFrame iterator init fail");
3319 return status;
3320 }
3321
3322 /* !!!! Revisit break condition !!!!!!! */
3323 while(1)
3324 {
3325 /* Get current descriptor pointer from current control block */
3326 currentDesc = currentCtrlBlk->linkedDesc;
3327 if(NULL == firstDesc)
3328 {
3329 firstDesc = currentCtrlBlk->linkedDesc;
3330 }
3331 /* All control block will have same palPacket Pointer
3332 * to make logic simpler */
3333 currentCtrlBlk->xfrFrame = palPacket;
3334
3335 /* Get next fragment physical address and fragment size
3336 * if this is the first trial, will get first physical address
3337 * if no more fragment, Descriptor src address will be set as NULL, OK??? */
Jeff Johnson295189b2012-06-20 16:38:30 -07003338 status = wpalIteratorNext(&iterator,
3339 palPacket,
3340 &sourcePhysicalAddress,
3341 &xferSize);
jagadeeshf869bba2015-04-07 20:06:21 +05303342 if(eWLAN_PAL_STATUS_SUCCESS != status)
3343 {
3344 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3345 "dxeTXPushFrame Get next frame fail");
3346 return status;
3347 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003348 if((NULL == sourcePhysicalAddress) ||
3349 (0 == xferSize))
3350 {
3351 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
3352 "dxeTXPushFrame end of current frame");
3353 break;
3354 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003355
3356 /* This is the LAST descriptor valid for this transaction */
3357 LastDesc = currentCtrlBlk->linkedDesc;
3358
3359 /* Program DXE descriptor */
3360 currentDesc->dxedesc.dxe_short_desc.srcMemAddrL =
Arun Kumar Khandavalli6119f7d2013-12-18 00:16:17 +05303361 WLANDXE_U32_SWAP_ENDIAN((wpt_uint32)(uintptr_t)sourcePhysicalAddress);
Jeff Johnson295189b2012-06-20 16:38:30 -07003362
3363 /* Just normal data transfer from aCPU Flat Memory to BMU Q */
3364 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
3365 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
3366 {
3367 currentDesc->dxedesc.dxe_short_desc.dstMemAddrL =
3368 WLANDXE_U32_SWAP_ENDIAN(channelEntry->channelConfig.refWQ);
3369 }
3370 else
3371 {
3372 /* Test specific H2H transfer, destination address already set
3373 * Do Nothing */
3374 }
3375 currentDesc->xfrSize = WLANDXE_U32_SWAP_ENDIAN(xferSize);
3376
3377 /* Program channel control register */
3378 /* First frame not set VAL bit, why ??? */
3379 if(0 == channelEntry->numFragmentCurrentChain)
3380 {
3381 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write;
3382 }
3383 else
3384 {
3385 currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write_valid;
3386 }
3387
3388 /* Update statistics */
3389 channelEntry->numFragmentCurrentChain++;
3390 channelEntry->numFreeDesc--;
3391 channelEntry->numRsvdDesc++;
3392
3393 /* Get next control block */
3394 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
3395 }
3396 channelEntry->numTotalFrame++;
3397 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
3398 "NUM TX FRAG %d, Total Frame %d",
3399 channelEntry->numFragmentCurrentChain, channelEntry->numTotalFrame);
3400
3401 /* Program Channel control register
3402 * Set as end of packet
3403 * Enable interrupt also for first code lock down
3404 * performace optimization, this will be revisited */
3405 if(NULL == LastDesc)
3406 {
3407 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3408 "dxeTXPushFrame NULL Last Descriptor, broken chain");
3409 return eWLAN_PAL_STATUS_E_FAULT;
3410 }
3411 LastDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write_eop_int;
3412 /* Now First one also Valid ????
3413 * this procedure will prevent over handle descriptor from previous
3414 * TX trigger */
3415 firstDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write_valid;
3416
3417 /* If in BMPS mode no need to notify the DXE Engine, notify SMSM instead */
3418 if(WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN == tempDxeCtrlBlk->rivaPowerState)
3419 {
3420 /* Update channel head as next avaliable linked slot */
3421 channelEntry->headCtrlBlk = currentCtrlBlk;
Karthick S8a7e2862015-09-14 09:13:37 +05303422 if(KickDxe)
Leo Changac1d3612013-07-01 15:15:51 -07003423 {
3424 tempDxeCtrlBlk->ringNotEmpty = eWLAN_PAL_TRUE;
3425 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
3426 "SMSM_ret LO=%d HI=%d",
3427 tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc,
3428 tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc );
Karthick S39823072015-07-08 18:16:41 +05303429 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
Leo Changac1d3612013-07-01 15:15:51 -07003430 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
3431 tempDxeCtrlBlk->smsmToggled = eWLAN_PAL_TRUE;
Sravan Kumar Kairama8269e72015-11-06 12:13:24 +05303432 DXTRACE(dxeTrace(channelEntry->channelType, TRACE_SMSM_NOTIFY, TRACE_WLANDXE_VAR_ENABLE));
Leo Changac1d3612013-07-01 15:15:51 -07003433 }
Madan Mohan Koyyalamudi2edf6f62012-10-15 15:56:34 -07003434 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07003435 }
3436
3437 /* If DXE use external descriptor, registers are not needed to be programmed
3438 * Just after finish to program descriptor, tirigger to send */
3439 if(channelEntry->extraConfig.chan_mask & WLANDXE_CH_CTRL_EDEN_MASK)
3440 {
3441 /* Issue a dummy read from the DXE descriptor DDR location to
3442 ensure that any previously posted write to the descriptor
3443 completes. */
3444 if(channelEntry->extraConfig.cw_ctrl_write_valid != firstDesc->descCtrl.ctrl)
3445 {
3446 //HDXE_ASSERT(0);
3447 }
3448
Asodi T,Venkateswara Reddy9826c872017-01-18 19:08:25 +05303449 if(wpalIsArpPkt(palPacket))
3450 {
Sravan Kumar Kairam46a5ddb2018-03-29 12:59:56 +05303451 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH,
Asodi T,Venkateswara Reddy9826c872017-01-18 19:08:25 +05303452 "%s :ARP packet", __func__);
3453 }
3454
Jeff Johnson295189b2012-06-20 16:38:30 -07003455 /* Everything is ready
3456 * Trigger to start DMA */
3457 status = wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr,
3458 channelEntry->extraConfig.chan_mask);
3459 if(eWLAN_PAL_STATUS_SUCCESS != status)
3460 {
3461 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3462 "dxeTXPushFrame Write Channel Ctrl Register fail");
3463 return status;
3464 }
Sravan Kumar Kairama8269e72015-11-06 12:13:24 +05303465 DXTRACE(dxeTrace(channelEntry->channelType, TRACE_CH_ENABLE, TRACE_WLANDXE_VAR_ENABLE));
Jeff Johnson295189b2012-06-20 16:38:30 -07003466
3467 /* Update channel head as next avaliable linked slot */
3468 channelEntry->headCtrlBlk = currentCtrlBlk;
3469
3470 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003471 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003472 return status;
3473 }
3474
3475 /* If DXE not use external descriptor, program each registers */
3476 /* Circular buffer handle not need to program DESC register???
3477 * GEN5 code not programed RING buffer case
3478 * REVISIT THIS !!!!!! */
3479 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
3480 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
3481 {
3482 /* Destination address, assigned Work Q */
3483 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrlRegAddr,
3484 channelEntry->channelConfig.refWQ);
3485 if(eWLAN_PAL_STATUS_SUCCESS != status)
3486 {
3487 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3488 "dxeTXPushFrame Program dest address register fail");
3489 return status;
3490 }
3491 /* If descriptor format is SHORT */
3492 if(channelEntry->channelConfig.useShortDescFmt)
3493 {
3494 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrhRegAddr,
3495 0);
3496 if(eWLAN_PAL_STATUS_SUCCESS != status)
3497 {
3498 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3499 "dxeTXPushFrame Program dest address register fail");
3500 return status;
3501 }
3502 }
3503 else
3504 {
3505 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3506 "dxeTXPushFrame LONG Descriptor Format!!!");
3507 }
3508 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003509
3510 /* Program Source address register
3511 * This address is already programmed into DXE Descriptor
3512 * But register also upadte */
3513 status = wpalWriteRegister(channelEntry->channelRegister.chDXESadrlRegAddr,
3514 WLANDXE_U32_SWAP_ENDIAN(firstDesc->dxedesc.dxe_short_desc.srcMemAddrL));
3515 if(eWLAN_PAL_STATUS_SUCCESS != status)
3516 {
3517 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3518 "dxeTXPushFrame Program src address register fail");
3519 return status;
3520 }
3521 /* If descriptor format is SHORT */
3522 if(channelEntry->channelConfig.useShortDescFmt)
3523 {
3524 status = wpalWriteRegister(channelEntry->channelRegister.chDXESadrhRegAddr,
3525 0);
3526 if(eWLAN_PAL_STATUS_SUCCESS != status)
3527 {
3528 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3529 "dxeTXPushFrame Program dest address register fail");
3530 return status;
3531 }
3532 }
3533 else
3534 {
3535 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3536 "dxeTXPushFrame LONG Descriptor Format!!!");
3537 }
3538
3539 /* Linked list Descriptor pointer */
3540 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
3541 channelEntry->headCtrlBlk->linkedDescPhyAddr);
3542 if(eWLAN_PAL_STATUS_SUCCESS != status)
3543 {
3544 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3545 "dxeTXPushFrame Write DESC Address register fail");
3546 return status;
3547 }
3548 /* If descriptor format is SHORT */
3549 if(channelEntry->channelConfig.useShortDescFmt)
3550 {
3551 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDeschRegAddr,
3552 0);
3553 if(eWLAN_PAL_STATUS_SUCCESS != status)
3554 {
3555 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3556 "dxeTXPushFrame Program dest address register fail");
3557 return status;
3558 }
3559 }
3560 else
3561 {
3562 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3563 "dxeTXPushFrame LONG Descriptor Format!!!");
3564 }
3565
3566 /* Transfer Size */
3567 xferSize = WLANDXE_U32_SWAP_ENDIAN(firstDesc->xfrSize);
3568 status = wpalWriteRegister(channelEntry->channelRegister.chDXESzRegAddr,
3569 xferSize);
3570 if(eWLAN_PAL_STATUS_SUCCESS != status)
3571 {
3572 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3573 "dxeTXPushFrame Write DESC Address register fail");
3574 return status;
3575 }
3576
3577 /* Everything is ready
3578 * Trigger to start DMA */
3579 status = wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr,
3580 channelEntry->extraConfig.chan_mask);
3581 if(eWLAN_PAL_STATUS_SUCCESS != status)
3582 {
3583 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3584 "dxeTXPushFrame Write Channel Ctrl Register fail");
3585 return status;
3586 }
3587
3588 /* Update channel head as next avaliable linked slot */
3589 channelEntry->headCtrlBlk = currentCtrlBlk;
3590
3591 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003592 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003593 return status;
3594}
3595
3596/*==========================================================================
3597 @ Function Name
3598 dxeTXCompFrame
3599
3600 @ Description
3601 TX Frame transfer complete event handler
3602
3603 @ Parameters
3604 WLANDXE_CtrlBlkType *dxeCtrlBlk,
3605 DXE host driver main control block
3606 WLANDXE_ChannelCBType *channelEntry
3607 Channel specific control block
3608
3609 @ Return
3610 PAL_STATUS_T
3611===========================================================================*/
3612static wpt_status dxeTXCompFrame
3613(
3614 WLANDXE_CtrlBlkType *hostCtxt,
3615 WLANDXE_ChannelCBType *channelEntry
3616)
3617{
3618 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
3619 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
3620 WLANDXE_DescType *currentDesc = NULL;
3621 wpt_uint32 descCtrlValue = 0;
3622 unsigned int *lowThreshold = NULL;
3623
3624 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003625 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003626
3627 /* Sanity */
3628 if((NULL == hostCtxt) || (NULL == channelEntry))
3629 {
3630 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3631 "dxeTXCompFrame Invalid ARG");
3632 return eWLAN_PAL_STATUS_E_INVAL;
3633 }
3634
3635 if(NULL == hostCtxt->txCompCB)
3636 {
3637 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3638 "dxeTXCompFrame TXCompCB is not registered");
Jeff Johnsone7245742012-09-05 17:12:55 -07003639 return eWLAN_PAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003640 }
3641
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08003642 status = wpalMutexAcquire(&channelEntry->dxeChannelLock);
3643 if(eWLAN_PAL_STATUS_SUCCESS != status)
3644 {
3645 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3646 "dxeTXCompFrame Mutex Acquire fail");
3647 return status;
3648 }
3649
Jeff Johnson295189b2012-06-20 16:38:30 -07003650 currentCtrlBlk = channelEntry->tailCtrlBlk;
3651 currentDesc = currentCtrlBlk->linkedDesc;
3652
3653 if( currentCtrlBlk == channelEntry->headCtrlBlk )
3654 {
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08003655 status = wpalMutexRelease(&channelEntry->dxeChannelLock);
3656 if(eWLAN_PAL_STATUS_SUCCESS != status)
3657 {
3658 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3659 "dxeTXCompFrame Mutex Release fail");
3660 return status;
3661 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003662 return eWLAN_PAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003663 }
3664
Kiet Lam842dad02014-02-18 18:44:02 -08003665
Jeff Johnson295189b2012-06-20 16:38:30 -07003666 while(1)
3667 {
3668// HDXE_ASSERT(WLAN_PAL_IS_STATUS_SUCCESS(WLAN_RivaValidateDesc(currentDesc)));
3669 descCtrlValue = currentDesc->descCtrl.ctrl;
3670 if((descCtrlValue & WLANDXE_DESC_CTRL_VALID))
3671 {
3672 /* caught up with head, bail out */
3673 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED,
3674 "dxeTXCompFrame caught up with head - next DESC has VALID set");
3675 break;
3676 }
3677
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08003678 if(currentCtrlBlk->xfrFrame == NULL)
3679 {
3680 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3681 "Invalid transfer frame");
3682 HDXE_ASSERT(0);
3683 break;
3684 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003685 channelEntry->numFreeDesc++;
3686 channelEntry->numRsvdDesc--;
3687
3688 /* Send Frame TX Complete notification with frame start fragment location */
3689 if(WLANDXE_U32_SWAP_ENDIAN(descCtrlValue) & WLANDXE_DESC_CTRL_EOP)
3690 {
3691 hostCtxt->txCompletedFrames--;
Jeff Johnson295189b2012-06-20 16:38:30 -07003692 status = wpalUnlockPacket(currentCtrlBlk->xfrFrame);
3693 if (eWLAN_PAL_STATUS_SUCCESS != status)
3694 {
3695 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3696 "dxeRXFrameReady unable to unlock packet");
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08003697 status = wpalMutexRelease(&channelEntry->dxeChannelLock);
3698 if(eWLAN_PAL_STATUS_SUCCESS != status)
3699 {
3700 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3701 "dxeTXCompFrame Mutex Release fail");
3702 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003703 return status;
3704 }
Asodi T,Venkateswara Reddy9826c872017-01-18 19:08:25 +05303705
3706 if(wpalIsArpPkt(currentCtrlBlk->xfrFrame))
3707 {
Sravan Kumar Kairam46a5ddb2018-03-29 12:59:56 +05303708 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH,
Asodi T,Venkateswara Reddy9826c872017-01-18 19:08:25 +05303709 "%s :ARP packet DMA-ed ", __func__);
3710 wpalUpdateTXArpFWdeliveredStats();
3711 }
3712
Jeff Johnson295189b2012-06-20 16:38:30 -07003713 hostCtxt->txCompCB(hostCtxt->clientCtxt,
3714 currentCtrlBlk->xfrFrame,
3715 eWLAN_PAL_STATUS_SUCCESS);
3716 channelEntry->numFragmentCurrentChain = 0;
3717 }
3718 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
3719 currentDesc = currentCtrlBlk->linkedDesc;
3720
3721 /* Break condition
3722 * Head control block is the control block must be programed for the next TX
3723 * so, head control block is not programmed control block yet
3724 * if loop encounte head control block, stop to complete
3725 * in theory, COMP CB must be called already ??? */
3726 if(currentCtrlBlk == channelEntry->headCtrlBlk)
3727 {
3728 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED,
3729 "dxeTXCompFrame caught up with head ptr");
3730 break;
3731 }
3732 /* VALID Bit check ???? */
3733 }
3734
3735 /* Tail and Head Control block must be same */
3736 channelEntry->tailCtrlBlk = currentCtrlBlk;
3737
3738 lowThreshold = channelEntry->channelType == WDTS_CHANNEL_TX_LOW_PRI?
3739 &(hostCtxt->txCompInt.txLowResourceThreshold_LoPriCh):
3740 &(hostCtxt->txCompInt.txLowResourceThreshold_HiPriCh);
3741
3742 /* If specific channel hit low resource condition send notification to upper layer */
3743 if((eWLAN_PAL_TRUE == channelEntry->hitLowResource) &&
3744 (channelEntry->numFreeDesc > *lowThreshold))
3745 {
3746 /* Change it back if we raised it for fetching a remaining packet from TL */
3747 if(WLANDXE_TX_LOW_RES_THRESHOLD > *lowThreshold)
3748 {
3749 *lowThreshold = WLANDXE_TX_LOW_RES_THRESHOLD;
3750 }
3751
3752 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
3753 "DXE TX %d channel recovered from low resource", channelEntry->channelType);
3754 hostCtxt->lowResourceCB(hostCtxt->clientCtxt,
3755 channelEntry->channelType,
3756 eWLAN_PAL_TRUE);
3757 channelEntry->hitLowResource = eWLAN_PAL_FALSE;
3758 }
3759
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08003760 status = wpalMutexRelease(&channelEntry->dxeChannelLock);
3761 if(eWLAN_PAL_STATUS_SUCCESS != status)
3762 {
3763 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3764 "dxeTXCompFrame Mutex Release fail");
3765 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003766
3767 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003768 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003769 return status;
3770}
3771
3772/*==========================================================================
Mihir Shetedfc33ec2014-10-15 13:14:38 +05303773 @ Function Name
3774 dxeTXCleanup
3775
3776 @ Description
3777 Cleanup the TX channels after DXE Error
3778
3779 @ Parameters
3780 WLANDXE_CtrlBlkType *dxeCtrlBlk,
3781 DXE host driver main control block
3782
3783 @ Return
3784 PAL_STATUS_T
3785===========================================================================*/
3786static wpt_status dxeTXCleanup
3787(
3788 WLANDXE_CtrlBlkType *hostCtxt
3789)
3790{
3791 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
3792 WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL;
3793 WLANDXE_DescType *currentDesc = NULL;
3794 wpt_uint32 descCtrlValue = 0;
3795 unsigned int *lowThreshold = NULL;
3796 unsigned int idx;
3797 WLANDXE_ChannelCBType *channelEntry;
3798
3799 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
3800 "%s Enter", __func__);
3801
3802 /* Sanity */
3803 if((NULL == hostCtxt))
3804 {
3805 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
3806 "%s: Invalid ARG", __func__);
3807 return eWLAN_PAL_STATUS_E_INVAL;
3808 }
3809
3810 if(NULL == hostCtxt->txCompCB)
3811 {
3812 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
3813 "%s: TXCompCB is not registered",__func__);
3814 return eWLAN_PAL_STATUS_SUCCESS;
3815 }
3816
3817 for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++)
3818 {
3819 channelEntry = &tempDxeCtrlBlk->dxeChannel[idx];
3820 if(idx != WDTS_CHANNEL_TX_LOW_PRI && idx != WDTS_CHANNEL_TX_HIGH_PRI)
3821 {
Sravan Kumar Kairam49d5c4b2016-03-29 15:26:44 +05303822 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
Mihir Shetedfc33ec2014-10-15 13:14:38 +05303823 "%s: %11s continue",__func__,
3824 channelType[channelEntry->channelType]);
3825 continue;
3826 }
3827
3828 status = wpalMutexAcquire(&channelEntry->dxeChannelLock);
3829 if(eWLAN_PAL_STATUS_SUCCESS != status)
3830 {
3831 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3832 "%s: %11s Mutex Acquire fail",__func__,
3833 channelType[channelEntry->channelType]);
3834 return status;
3835 }
3836
3837 currentCtrlBlk = channelEntry->tailCtrlBlk;
3838 currentDesc = currentCtrlBlk->linkedDesc;
3839
3840 if( currentCtrlBlk == channelEntry->headCtrlBlk )
3841 {
Sravan Kumar Kairam49d5c4b2016-03-29 15:26:44 +05303842 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
Mihir Shetedfc33ec2014-10-15 13:14:38 +05303843 "%s: %11s Head and Tail are Same",__func__,
3844 channelType[channelEntry->channelType]);
3845
3846 status = wpalMutexRelease(&channelEntry->dxeChannelLock);
3847 if(eWLAN_PAL_STATUS_SUCCESS != status)
3848 {
3849 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3850 "%s: %11s Mutex Release fail",__func__,
3851 channelType[channelEntry->channelType]);
3852 return status;
3853 }
3854 continue;
3855 }
3856
3857 while(1)
3858 {
3859 descCtrlValue = currentDesc->descCtrl.ctrl;
3860 if((descCtrlValue & WLANDXE_DESC_CTRL_VALID))
3861 {
3862 /* invalidate... */
3863 currentDesc->descCtrl.ctrl &= ~WLANDXE_DESC_CTRL_VALID;
3864 }
3865
3866 if(currentCtrlBlk->xfrFrame == NULL)
3867 {
3868 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
3869 "%s: %11s Invalid transfer frame",__func__,
3870 channelType[channelEntry->channelType]);
3871 HDXE_ASSERT(0);
3872 break;
3873 }
3874 channelEntry->numFreeDesc++;
3875 channelEntry->numRsvdDesc--;
3876
3877 /* Send Frame TX Complete notification with frame start fragment location */
3878 if(WLANDXE_U32_SWAP_ENDIAN(descCtrlValue) & WLANDXE_DESC_CTRL_EOP)
3879 {
3880 hostCtxt->txCompletedFrames--;
3881 status = wpalUnlockPacket(currentCtrlBlk->xfrFrame);
3882 if (eWLAN_PAL_STATUS_SUCCESS != status)
3883 {
3884 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3885 "%s: unable to unlock packet",__func__);
3886 status = wpalMutexRelease(&channelEntry->dxeChannelLock);
3887 if(eWLAN_PAL_STATUS_SUCCESS != status)
3888 {
3889 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3890 "%s: Mutex Release fail",__func__);
3891 }
3892 return status;
3893 }
3894 hostCtxt->txCompCB(hostCtxt->clientCtxt,
3895 currentCtrlBlk->xfrFrame,
3896 eWLAN_PAL_STATUS_SUCCESS); //mir: SUCCESS or FAILURE?
3897 channelEntry->numFragmentCurrentChain = 0;
3898 }
3899 currentCtrlBlk = currentCtrlBlk->nextCtrlBlk;
3900 currentDesc = currentCtrlBlk->linkedDesc;
3901
3902 /* Break condition
3903 * Head control block is the control block must be programed for the next TX
3904 * so, head control block is not programmed control block yet
3905 * if loop encounte head control block, stop to complete
3906 * in theory, COMP CB must be called already ??? */
3907 if(currentCtrlBlk == channelEntry->headCtrlBlk)
3908 {
Sravan Kumar Kairam49d5c4b2016-03-29 15:26:44 +05303909 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
Mihir Shetedfc33ec2014-10-15 13:14:38 +05303910 "%s: %11s caught up with head ptr",__func__,
3911 channelType[channelEntry->channelType]);
3912 break;
3913 }
3914 /* VALID Bit check ???? */
3915 }
3916
3917 /* Tail and Head Control block must be same */
3918 channelEntry->tailCtrlBlk = currentCtrlBlk;
3919 /* Re-Sync Head and CDR */
3920 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
3921 channelEntry->headCtrlBlk->linkedDescPhyAddr);
3922 if(eWLAN_PAL_STATUS_SUCCESS != status)
3923 {
3924 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3925 "dxeChannelInitProgram Write DESC Address register fail");
3926 status = wpalMutexRelease(&channelEntry->dxeChannelLock);
3927 if(eWLAN_PAL_STATUS_SUCCESS != status)
3928 {
3929 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3930 "%s: %11s Mutex Release fail", __func__,
3931 channelType[channelEntry->channelType]);
3932 }
3933 return status;
3934 }
3935
3936 lowThreshold = channelEntry->channelType == WDTS_CHANNEL_TX_LOW_PRI?
3937 &(hostCtxt->txCompInt.txLowResourceThreshold_LoPriCh):
3938 &(hostCtxt->txCompInt.txLowResourceThreshold_HiPriCh);
3939
3940 /* If specific channel hit low resource condition send notification to upper layer */
3941 if((eWLAN_PAL_TRUE == channelEntry->hitLowResource) &&
3942 (channelEntry->numFreeDesc > *lowThreshold))
3943 {
3944 /* Change it back if we raised it for fetching a remaining packet from TL */
3945 if(WLANDXE_TX_LOW_RES_THRESHOLD > *lowThreshold)
3946 {
3947 *lowThreshold = WLANDXE_TX_LOW_RES_THRESHOLD;
3948 }
3949
3950 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
3951 "DXE TX %d channel recovered from low resource", channelEntry->channelType);
3952 hostCtxt->lowResourceCB(hostCtxt->clientCtxt,
3953 channelEntry->channelType,
3954 eWLAN_PAL_TRUE);
3955 channelEntry->hitLowResource = eWLAN_PAL_FALSE;
3956 }
3957 status = wpalMutexRelease(&channelEntry->dxeChannelLock);
3958 if(eWLAN_PAL_STATUS_SUCCESS != status)
3959 {
3960 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
3961 "%s: %11s Mutex Release fail", __func__,
3962 channelType[channelEntry->channelType]);
3963 }
3964 }
3965
3966 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
3967 "%s Exit", __func__);
3968 return status;
3969}
3970/*==========================================================================
Jeff Johnson295189b2012-06-20 16:38:30 -07003971 @ Function Name
3972 dxeTXEventHandler
3973
3974 @ Description
3975 If DXE HW sends TX related interrupt, this event handler will be called
3976 Handle higher priority channel first
3977 Figureout why interrupt happen and call appropriate final even handler
3978 TX complete or error happen
3979
3980 @ Parameters
3981 void *msgPtr
3982 Even MSG
3983
3984 @ Return
3985 PAL_STATUS_T
3986===========================================================================*/
3987void dxeTXEventHandler
3988(
3989 wpt_msg *msgPtr
3990)
3991{
3992 wpt_msg *msgContent = (wpt_msg *)msgPtr;
3993 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
3994 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
3995 wpt_uint32 intSrc = 0;
3996 wpt_uint32 chStat = 0;
3997 WLANDXE_ChannelCBType *channelCb = NULL;
3998
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07003999 wpt_uint8 bEnableISR = 0;
Madan Mohan Koyyalamudidfd6aa82012-10-18 20:18:43 -07004000 static wpt_uint8 successiveIntWithIMPS;
Jeff Johnson295189b2012-06-20 16:38:30 -07004001
4002 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004003 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004004
4005 dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
Jeff Johnsone7245742012-09-05 17:12:55 -07004006 dxeCtxt->ucTxMsgCnt = 0;
4007
4008 if(eWLAN_PAL_TRUE == dxeCtxt->driverReloadInProcessing)
4009 {
4010 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4011 "wlan: TX COMP WLAN Driver re-loading in progress");
4012 return;
4013 }
4014
Sravan Kumar Kairam8bbda362015-10-06 11:51:14 +05304015 /* Read whole interrupt mask register and exclusive only this channel int */
4016 status = wpalReadRegister(WLANDXE_INT_SRC_RAW_ADDRESS,
4017 &intSrc);
4018 if(eWLAN_PAL_STATUS_SUCCESS != status)
4019 {
4020 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4021 "dxeTXCompleteEventHandler Read INT_DONE_SRC register fail");
4022 return;
4023 }
4024 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED,
4025 "TX Event Handler INT Source 0x%x", intSrc);
4026
4027 dxeEnvBlk.txCmpIntChanlSrc = intSrc&0xFF;
4028
Jeff Johnson295189b2012-06-20 16:38:30 -07004029 /* Return from here if the RIVA is in IMPS, to avoid register access */
4030 if(WLANDXE_POWER_STATE_IMPS == dxeCtxt->hostPowerState)
4031 {
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07004032 successiveIntWithIMPS++;
Jeff Johnsone7245742012-09-05 17:12:55 -07004033 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07004034 "dxeTXEventHandler IMPS TX COMP INT successiveIntWithIMPS %d", successiveIntWithIMPS);
Jeff Johnsone7245742012-09-05 17:12:55 -07004035 status = dxeTXCompFrame(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI]);
4036 if(eWLAN_PAL_STATUS_SUCCESS != status)
4037 {
4038 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07004039 "dxeTXEventHandler IMPS HC COMP interrupt fail");
Jeff Johnsone7245742012-09-05 17:12:55 -07004040 }
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07004041
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07004042 status = dxeTXCompFrame(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI]);
4043 if(eWLAN_PAL_STATUS_SUCCESS != status)
4044 {
4045 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4046 "dxeTXEventHandler IMPS LC COMP interrupt fail");
4047 }
4048
4049 if(((dxeCtxt->txCompletedFrames) &&
4050 (eWLAN_PAL_FALSE == dxeCtxt->txIntEnable)) &&
4051 (successiveIntWithIMPS == 1))
Jeff Johnsone7245742012-09-05 17:12:55 -07004052 {
4053 dxeCtxt->txIntEnable = eWLAN_PAL_TRUE;
4054 wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE);
4055 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08004056 "TX COMP INT Enabled, remain TX frame count on ring %d",
4057 dxeCtxt->txCompletedFrames);
Sravan Kumar Kairam8bbda362015-10-06 11:51:14 +05304058
4059 dxeEnvBlk.txCmpIntChanlSrc = 0;
4060
Jeff Johnsone7245742012-09-05 17:12:55 -07004061 /*Kicking the DXE after the TX Complete interrupt was enabled - to avoid
4062 the posibility of a race*/
4063 dxePsComplete(dxeCtxt, eWLAN_PAL_TRUE);
4064 }
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07004065 else
4066 {
4067 dxeCtxt->txIntEnable = eWLAN_PAL_FALSE;
4068 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4069 "TX COMP INT NOT Enabled, RIVA still wake up? remain TX frame count on ring %d, successiveIntWithIMPS %d",
4070 dxeCtxt->txCompletedFrames, successiveIntWithIMPS);
4071 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004072 return;
4073 }
4074
Madan Mohan Koyyalamudi48e375a2012-09-24 13:19:17 -07004075 successiveIntWithIMPS = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07004076 if((!dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].extraConfig.chEnabled) ||
4077 (!dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].extraConfig.chEnabled))
4078 {
4079 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4080 "DXE already stopped in TX event handler. Just return");
4081 return;
4082 }
4083
Jeff Johnson295189b2012-06-20 16:38:30 -07004084 /* Test High Priority Channel is the INT source or not */
4085 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI];
4086 if(intSrc & (1 << channelCb->assignedDMAChannel))
4087 {
4088 status = dxeChannelCleanInt(channelCb, &chStat);
4089 if(eWLAN_PAL_STATUS_SUCCESS != status)
4090 {
4091 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4092 "dxeTXEventHandler INT Clean up fail");
4093 return;
4094 }
4095
4096 if(WLANDXE_CH_STAT_INT_ERR_MASK & chStat)
4097 {
4098 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08004099 "%11s : 0x%x Error Reported, Reload Driver",
4100 channelType[channelCb->channelType], chStat);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304101
Mihir Shetedfc33ec2014-10-15 13:14:38 +05304102 if (eWLAN_PAL_STATUS_SUCCESS !=
4103 dxeErrHandler(channelCb, chStat))
4104 {
4105 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
Anurag Chouhanf0d0ba12018-02-09 15:13:43 +05304106 wpalWlanReload(VOS_DXE_FAILURE);
Mihir Shetedfc33ec2014-10-15 13:14:38 +05304107 dxeStartSSRTimer(dxeCtxt);
4108 }
4109 bEnableISR = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07004110 }
4111 else if(WLANDXE_CH_STAT_INT_DONE_MASK & chStat)
4112 {
4113 /* Handle TX complete for high priority channel */
4114 status = dxeTXCompFrame(dxeCtxt,
4115 channelCb);
Jeff Johnsone7245742012-09-05 17:12:55 -07004116 bEnableISR = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07004117 }
4118 else if(WLANDXE_CH_STAT_INT_ED_MASK & chStat)
4119 {
4120 /* Handle TX complete for high priority channel */
4121 status = dxeTXCompFrame(dxeCtxt,
4122 channelCb);
Jeff Johnsone7245742012-09-05 17:12:55 -07004123 bEnableISR = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07004124 }
4125 else
4126 {
4127 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4128 "dxeTXEventHandler TX HI status=%x", chStat);
4129 }
4130
4131 if(WLANDXE_CH_STAT_MASKED_MASK & chStat)
4132 {
4133 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH,
4134 "dxeTXEventHandler TX HIGH Channel Masked Unmask it!!!!");
4135 }
4136
4137 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH,
4138 "TX HIGH STAT 0x%x RESRVD %d", chStat, channelCb->numRsvdDesc);
4139 }
4140
4141 /* Test Low Priority Channel interrupt is enabled or not */
4142 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI];
4143 if(intSrc & (1 << channelCb->assignedDMAChannel))
4144 {
4145 status = dxeChannelCleanInt(channelCb, &chStat);
4146 if(eWLAN_PAL_STATUS_SUCCESS != status)
4147 {
4148 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4149 "dxeTXEventHandler INT Clean up fail");
4150 return;
4151 }
4152
4153 if(WLANDXE_CH_STAT_INT_ERR_MASK & chStat)
4154 {
4155 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08004156 "%11s : 0x%x Error Reported, Reload Driver",
4157 channelType[channelCb->channelType], chStat);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304158
Mihir Shetedfc33ec2014-10-15 13:14:38 +05304159 if (eWLAN_PAL_STATUS_SUCCESS !=
4160 dxeErrHandler(channelCb, chStat))
4161 {
4162 dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
Anurag Chouhanf0d0ba12018-02-09 15:13:43 +05304163 wpalWlanReload(VOS_DXE_FAILURE);
Mihir Shetedfc33ec2014-10-15 13:14:38 +05304164 dxeStartSSRTimer(dxeCtxt);
4165 }
4166 bEnableISR = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07004167 }
4168 else if(WLANDXE_CH_STAT_INT_DONE_MASK & chStat)
4169 {
4170 /* Handle TX complete for low priority channel */
4171 status = dxeTXCompFrame(dxeCtxt,
4172 channelCb);
Jeff Johnsone7245742012-09-05 17:12:55 -07004173 bEnableISR = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07004174 }
4175 else if(WLANDXE_CH_STAT_INT_ED_MASK & chStat)
4176 {
4177 /* Handle TX complete for low priority channel */
4178 status = dxeTXCompFrame(dxeCtxt,
4179 channelCb);
Jeff Johnsone7245742012-09-05 17:12:55 -07004180 bEnableISR = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07004181 }
4182 else
4183 {
4184 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4185 "dxeTXEventHandler TX LO status=%x", chStat);
4186 }
4187
4188 if(WLANDXE_CH_STAT_MASKED_MASK & chStat)
4189 {
4190 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH,
4191 "dxeTXEventHandler TX Low Channel Masked Unmask it!!!!");
4192 }
4193 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
4194 "TX LOW STAT 0x%x RESRVD %d", chStat, channelCb->numRsvdDesc);
4195 }
4196
Jeff Johnson295189b2012-06-20 16:38:30 -07004197 if((bEnableISR || (dxeCtxt->txCompletedFrames)) &&
4198 (eWLAN_PAL_FALSE == dxeCtxt->txIntEnable))
4199 {
4200 dxeCtxt->txIntEnable = eWLAN_PAL_TRUE;
4201 wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE);
Madan Mohan Koyyalamudide2f8ab2012-11-08 15:08:14 -08004202 if(0 != dxeCtxt->txCompletedFrames)
4203 {
4204 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4205 "TX COMP INT Enabled, remain TX frame count on ring %d",
4206 dxeCtxt->txCompletedFrames);
4207 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004208 }
4209
Sravan Kumar Kairama8269e72015-11-06 12:13:24 +05304210 if(eWLAN_PAL_TRUE == dxeCtxt->txIntEnable)
4211 DXTRACE(dxeTrace(WLANDXE_DMA_CHANNEL_MAX, TRACE_TXINT_STATE,
4212 TRACE_WLANDXE_VAR_ENABLE));
4213
Sravan Kumar Kairam8bbda362015-10-06 11:51:14 +05304214 dxeEnvBlk.txCmpIntChanlSrc = 0;
4215
Jeff Johnson295189b2012-06-20 16:38:30 -07004216 /*Kicking the DXE after the TX Complete interrupt was enabled - to avoid
4217 the posibility of a race*/
4218 dxePsComplete(dxeCtxt, eWLAN_PAL_TRUE);
4219
4220 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004221 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004222 return;
4223}
4224
4225
4226/*==========================================================================
4227 @ Function Name
4228 dxeTXCompleteProcessing
4229
4230 @ Description
4231 If DXE HW sends TX related interrupt, this event handler will be called
4232 Handle higher priority channel first
4233 Figureout why interrupt happen and call appropriate final even handler
4234 TX complete or error happen
4235
4236 @ Parameters
4237 dxeCtxt DXE context
4238
4239 @ Return
4240 PAL_STATUS_T
4241===========================================================================*/
4242void dxeTXCompleteProcessing
4243(
4244 WLANDXE_CtrlBlkType *dxeCtxt
4245)
4246{
4247 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4248 WLANDXE_ChannelCBType *channelCb = NULL;
4249
4250 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004251 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004252
4253 /* Test High Priority Channel is the INT source or not */
4254 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI];
4255
4256 /* Handle TX complete for high priority channel */
4257 status = dxeTXCompFrame(dxeCtxt, channelCb);
4258
4259 /* Test Low Priority Channel interrupt is enabled or not */
4260 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI];
4261
4262 /* Handle TX complete for low priority channel */
4263 status = dxeTXCompFrame(dxeCtxt, channelCb);
4264
4265 if((eWLAN_PAL_FALSE == dxeCtxt->txIntEnable) &&
4266 ((dxeCtxt->txCompletedFrames > 0) ||
4267 (WLANDXE_POWER_STATE_FULL == dxeCtxt->hostPowerState)))
4268 {
4269 dxeCtxt->txIntEnable = eWLAN_PAL_TRUE;
4270 wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE);
4271 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004272 "%s %s : %d, %s : %d", __func__,
Jeff Johnson295189b2012-06-20 16:38:30 -07004273 channelType[dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].channelType],
4274 dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc,
4275 channelType[dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].channelType],
4276 dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc);
Leo Changac1d3612013-07-01 15:15:51 -07004277
4278 if((WLANDXE_POWER_STATE_FULL != dxeCtxt->hostPowerState) &&
4279 (eWLAN_PAL_FALSE == tempDxeCtrlBlk->smsmToggled))
4280 {
4281 /* After TX Comp processing, still remaining frame on the DXE TX ring
4282 * And when push frame, RING was not empty marked
4283 * Then when push frame, no SMSM toggle happen
4284 * To avoid permanent TX stall, SMSM toggle is needed at here
4285 * With this toggle, host should gaurantee SMSM state should be changed */
Karthick S39823072015-07-08 18:16:41 +05304286 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
4287 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
Leo Changac1d3612013-07-01 15:15:51 -07004288 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004289 }
4290
4291 /*Kicking the DXE after the TX Complete interrupt was enabled - to avoid
4292 the posibility of a race*/
4293 dxePsComplete(dxeCtxt, eWLAN_PAL_FALSE);
4294
4295 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004296 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004297 return;
4298}
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004299
4300/*==========================================================================
4301 @ Function Name
4302 dxeTXReSyncDesc
4303
4304 @ Description
4305 When STA comeout from IMPS, check DXE TX next transfer candidate descriptor
4306 And HW programmed descriptor.
4307 If any async happen between HW/SW TX stall will happen
4308
4309 @ Parameters
4310 void *msgPtr
4311 Message pointer to sync with TX thread
4312
4313 @ Return
4314 NONE
4315===========================================================================*/
4316void dxeTXReSyncDesc
4317(
4318 wpt_msg *msgPtr
4319)
4320{
4321 wpt_msg *msgContent = (wpt_msg *)msgPtr;
4322 WLANDXE_CtrlBlkType *pDxeCtrlBlk;
4323 wpt_uint32 nextDescReg;
4324 WLANDXE_ChannelCBType *channelEntry;
4325 WLANDXE_DescCtrlBlkType *validCtrlBlk;
4326 wpt_uint32 descLoop;
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004327 wpt_uint32 channelLoop;
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004328
4329 if(NULL == msgContent)
4330 {
4331 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4332 "dxeTXReSyncDesc Invalid Control Block");
4333 return;
4334 }
4335
4336 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
4337 "dxeTXReSyncDesc Try to re-sync TX channel if any problem");
4338 pDxeCtrlBlk = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
4339
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004340 for(channelLoop = WDTS_CHANNEL_TX_LOW_PRI; channelLoop < WDTS_CHANNEL_RX_LOW_PRI; channelLoop++)
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004341 {
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004342 channelEntry = &pDxeCtrlBlk->dxeChannel[channelLoop];
4343 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
4344 "%11s : Try to detect TX descriptor async", channelType[channelEntry->channelType]);
4345 wpalReadRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
4346 &nextDescReg);
4347 /* Async detect without TX pending frame */
4348 if(channelEntry->tailCtrlBlk == channelEntry->headCtrlBlk)
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004349 {
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004350 if(nextDescReg != channelEntry->tailCtrlBlk->linkedDescPhyAddr)
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004351 {
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004352 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
4353 "TX Async no Pending frame");
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304354
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07004355 dxeChannelMonitor("!!! TX Async no Pending frame !!!", channelEntry, NULL);
4356 dxeChannelRegisterDump(channelEntry, "!!! TX Async no Pending frame !!!", NULL);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304357
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004358 wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004359 channelEntry->tailCtrlBlk->linkedDescPhyAddr);
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004360 }
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004361 }
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004362 /* Async detect with some TX pending frames
4363 * next descriptor register should sync with first valid descriptor */
4364 else
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004365 {
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004366 validCtrlBlk = channelEntry->tailCtrlBlk;
4367 for(descLoop = 0; descLoop < channelEntry->numDesc; descLoop++)
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004368 {
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004369 if(validCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID)
4370 {
4371 if(nextDescReg != validCtrlBlk->linkedDescPhyAddr)
4372 {
4373 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
4374 "TX Async");
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304375
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07004376 dxeChannelMonitor("!!! TX Async !!!", channelEntry, NULL);
4377 dxeChannelRegisterDump(channelEntry, "!!! TX Async !!!", NULL);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304378
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004379 wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
4380 validCtrlBlk->linkedDescPhyAddr);
4381 }
4382 break;
4383 }
4384 validCtrlBlk = (WLANDXE_DescCtrlBlkType *)validCtrlBlk->nextCtrlBlk;
4385 if(validCtrlBlk == channelEntry->headCtrlBlk->nextCtrlBlk)
4386 {
4387 /* Finished to test till head control blcok, but could not find valid descriptor
4388 * from head to tail all descriptors are invalidated
4389 * host point of view head descriptor is next TX candidate
4390 * So, next descriptor control have to be programmed with head descriptor
4391 * check */
4392 if(nextDescReg != channelEntry->headCtrlBlk->linkedDescPhyAddr)
4393 {
4394 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Jeff Johnsonab79c8d2012-12-10 14:30:13 -08004395 "TX Async with not completed transferred frames, next descriptor must be head");
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304396
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07004397 dxeChannelMonitor("!!! TX Async !!!", channelEntry, NULL);
4398 dxeChannelRegisterDump(channelEntry, "!!! TX Async !!!", NULL);
Madan Mohan Koyyalamudi62080282013-08-05 12:51:17 +05304399
Madan Mohan Koyyalamudi01d7c532012-10-15 15:49:02 -07004400 wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
4401 validCtrlBlk->linkedDescPhyAddr);
4402 }
4403 break;
4404 }
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004405 }
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004406 }
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004407 }
4408
Madan Mohan Koyyalamudi5f57c102012-10-15 15:52:54 -07004409 /* HW/SW descriptor resync is done.
4410 * Next if there are any valid descriptor in chain, Push to HW again */
4411 for(channelLoop = WDTS_CHANNEL_TX_LOW_PRI; channelLoop < WDTS_CHANNEL_RX_LOW_PRI; channelLoop++)
4412 {
4413 channelEntry = &pDxeCtrlBlk->dxeChannel[channelLoop];
4414 if(channelEntry->tailCtrlBlk == channelEntry->headCtrlBlk)
4415 {
4416 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
4417 "%11s : No TX Pending frame",
4418 channelType[channelEntry->channelType]);
4419 /* No Pending frame, Do nothing */
4420 }
4421 else
4422 {
4423 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
4424 "%11s : TX Pending frame, process it",
4425 channelType[channelEntry->channelType]);
4426 validCtrlBlk = channelEntry->tailCtrlBlk;
4427 for(descLoop = 0; descLoop < channelEntry->numDesc; descLoop++)
4428 {
4429 if(validCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID)
4430 {
4431 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
4432 "%11s : when exit IMPS found valid descriptor",
4433 channelType[channelEntry->channelType]);
4434
4435 /* Found valid descriptor, kick DXE */
4436 wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr,
4437 channelEntry->extraConfig.chan_mask);
4438 break;
4439 }
4440 validCtrlBlk = (WLANDXE_DescCtrlBlkType *)validCtrlBlk->nextCtrlBlk;
4441 if(validCtrlBlk == channelEntry->headCtrlBlk->nextCtrlBlk)
4442 {
4443 /* Finished to test till head control blcok, but could not find valid descriptor
4444 * from head to tail all descriptors are invalidated */
4445 break;
4446 }
4447 }
4448 }
4449 }
4450
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07004451 wpalMemoryFree(msgPtr);
4452 return;
4453}
4454
Jeff Johnson295189b2012-06-20 16:38:30 -07004455/*==========================================================================
Mihir Shete40a55652014-03-02 14:14:47 +05304456 @ Function Name
4457 dxeDebugTxDescReSync
4458
4459 @ Description
4460 Check DXE Tx channel state and correct it in
4461 case Tx Data stall is detected by calling
4462 %dxeTXReSyncDesc. Also ensure that WCN SS
4463 is not power collapsed before calling
4464 %dxeTXReSyncDesc
4465
4466 @ Parameters
4467 void *msgPtr
4468 Message pointer to sync with TX thread
4469
4470 @ Return
4471 NONE
4472===========================================================================*/
4473void dxeDebugTxDescReSync
4474(
4475 wpt_msg *msgPtr
4476)
4477{
4478 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4479 "%s: Check for DXE TX Async",__func__);
4480 /* Make wake up HW */
4481 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
4482 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
4483
4484 wpalSleep(10);
4485
4486 dxeTXReSyncDesc(msgPtr);
4487}
4488/*==========================================================================
Jeff Johnson295189b2012-06-20 16:38:30 -07004489 @ Function Name
4490 dxeTXISR
4491
4492 @ Description
4493 TX interrupt ISR
4494 Platform will call this function if INT is happen
4495 This function must be registered into platform interrupt module
4496
4497 @ Parameters
4498 void *hostCtxt
4499 DXE host driver control context,
4500 pre registerd during interrupt registration
4501
4502 @ Return
4503 PAL_STATUS_T
4504===========================================================================*/
4505static void dxeTXISR
4506(
4507 void *hostCtxt
4508)
4509{
Sravan Kumar Kairama8269e72015-11-06 12:13:24 +05304510 WLANDXE_CtrlBlkType *dxeCtxt = (WLANDXE_CtrlBlkType *)hostCtxt;
Jeff Johnson295189b2012-06-20 16:38:30 -07004511 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
Sravan Kumar Kairama8269e72015-11-06 12:13:24 +05304512 wpt_uint32 intSrc = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07004513
4514 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004515 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004516
4517 /* Return from here if the RIVA is in IMPS, to avoid register access */
Jeff Johnsone7245742012-09-05 17:12:55 -07004518 if(WLANDXE_POWER_STATE_DOWN == dxeCtxt->hostPowerState)
Jeff Johnson295189b2012-06-20 16:38:30 -07004519 {
Jeff Johnsone7245742012-09-05 17:12:55 -07004520 dxeCtxt->txIntEnable = eWLAN_PAL_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004521 /* Disable interrupt at here,
4522 IMPS or IMPS Pending state should not access RIVA register */
4523 status = wpalDisableInterrupt(DXE_INTERRUPT_TX_COMPLE);
4524 if(eWLAN_PAL_STATUS_SUCCESS != status)
4525 {
4526 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4527 "dxeRXFrameReadyISR Disable RX ready interrupt fail");
4528 return;
4529 }
4530 dxeCtxt->txIntDisabledByIMPS = eWLAN_PAL_TRUE;
4531 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004532 "%s Riva is in %d, return from here ", __func__, dxeCtxt->hostPowerState);
Jeff Johnson295189b2012-06-20 16:38:30 -07004533 return;
4534 }
4535
Jeff Johnson295189b2012-06-20 16:38:30 -07004536 /* Disable TX Complete Interrupt at here */
4537 status = wpalDisableInterrupt(DXE_INTERRUPT_TX_COMPLE);
4538 if(eWLAN_PAL_STATUS_SUCCESS != status)
4539 {
4540 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4541 "dxeTXCompISR Disable TX complete interrupt fail");
4542 return;
4543 }
4544 dxeCtxt->txIntEnable = eWLAN_PAL_FALSE;
4545
Sravan Kumar Kairama8269e72015-11-06 12:13:24 +05304546 wpalReadRegister(WLANDXE_INT_SRC_RAW_ADDRESS,
4547 &intSrc);
4548 /* intSrc which holds the INT_SRC_RAW_ADDRESS reg value
4549 While debugging crash dump convert to power of 2 for channel type */
4550 DXTRACE(dxeTrace(intSrc, TRACE_TXINT_STATE, TRACE_WLANDXE_VAR_DISABLE));
Jeff Johnson295189b2012-06-20 16:38:30 -07004551
4552 if( dxeCtxt->ucTxMsgCnt )
4553 {
4554 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
4555 "Avoiding serializing TX Complete event");
4556 return;
4557 }
Sravan Kumar Kairama8269e72015-11-06 12:13:24 +05304558
Jeff Johnson295189b2012-06-20 16:38:30 -07004559 dxeCtxt->ucTxMsgCnt = 1;
4560
4561 /* Serialize TX complete interrupt upon TX thread */
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08004562 if(NULL == dxeCtxt->txIsrMsg)
4563 {
4564 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
4565 "Invalid message");
4566 HDXE_ASSERT(0);
4567 return;
4568 }
Sravan Kumar Kairama8269e72015-11-06 12:13:24 +05304569
Jeff Johnson295189b2012-06-20 16:38:30 -07004570 status = wpalPostTxMsg(WDI_GET_PAL_CTX(),
4571 dxeCtxt->txIsrMsg);
4572 if(eWLAN_PAL_STATUS_SUCCESS != status)
4573 {
4574 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
4575 "dxeTXCompISR interrupt serialize fail status=%d", status);
4576 }
4577
4578 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004579 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004580 return;
4581}
4582
Sravan Kumar Kairama8269e72015-11-06 12:13:24 +05304583/*==========================================================================
4584 @ Function Name
4585 dxeTraceInit
4586
4587 @ Description
4588 Initialize the DXTRACE when enabled
4589
4590 @ Parameters
4591 NONE
4592
4593 @ Return
4594 NONE
4595===========================================================================*/
4596void dxeTraceInit(void)
4597{
4598 gdxeTraceData.head = INVALID_VOS_TRACE_ADDR;
4599 gdxeTraceData.tail = INVALID_VOS_TRACE_ADDR;
4600 gdxeTraceData.num = 0;
4601 gdxeTraceData.enable = eWLAN_PAL_TRUE;
4602}
4603
4604/*==========================================================================
4605 @ Function Name
4606 dxeTrace
4607
4608 @ Description
4609 puts the messages in to ring-buffer
4610
4611 @ Parameters
4612 v_U8_t chan
4613 Rx/Tx path record
4614 v_U8_t code
4615 Rx/Tx Event
4616 v_U32_t data
4617 Actual message contents
4618 @ Return
4619 NONE
4620===========================================================================*/
4621void dxeTrace(v_U8_t chan, v_U8_t code, v_U32_t data)
4622{
4623 pdxeTraceRecord rec = NULL;
4624 unsigned long flags;
4625
4626 if (!gdxeTraceData.enable)
4627 {
4628 return;
4629 }
4630
4631 /* Aquire the lock and only one thread can access the buffer at a time */
4632 spin_lock_irqsave(&dtraceLock, flags);
4633
4634 gdxeTraceData.num++;
4635
4636 if (gdxeTraceData.num > MAX_DXE_TRACE_RECORDS)
4637 {
4638 gdxeTraceData.num = MAX_DXE_TRACE_RECORDS;
4639 }
4640 if (INVALID_VOS_TRACE_ADDR == gdxeTraceData.head)
4641 {
4642 /* first record */
4643 gdxeTraceData.head = 0;
4644 gdxeTraceData.tail = 0;
4645 }
4646 else
4647 {
4648 /* queue is not empty */
4649 v_U32_t tail = gdxeTraceData.tail + 1;
4650 if (MAX_DXE_TRACE_RECORDS == tail)
4651 {
4652 tail = 0;
4653 }
4654 if (gdxeTraceData.head == tail)
4655 {
4656 /* full */
4657 if (MAX_DXE_TRACE_RECORDS == ++gdxeTraceData.head)
4658 {
4659 gdxeTraceData.head = 0;
4660 }
4661 }
4662 gdxeTraceData.tail = tail;
4663 }
4664
4665 rec = &gdxeTraceTbl[gdxeTraceData.tail];
4666 rec->code = code;
4667 rec->data = data;
4668 rec->time = vos_timer_get_system_time();
4669 rec->chan = chan;
4670
4671 spin_unlock_irqrestore(&dtraceLock, flags);
4672}
4673
Jeff Johnson295189b2012-06-20 16:38:30 -07004674/*-------------------------------------------------------------------------
4675 * Global Function
4676 *-------------------------------------------------------------------------*/
4677/*==========================================================================
4678 @ Function Name
4679 WLANDXE_Open
4680
4681 @ Description
4682 Open host DXE driver, allocate DXE resources
4683 Allocate, DXE local control block, DXE descriptor pool, DXE descriptor control block pool
4684
4685 @ Parameters
Jeff Johnsona8a1a482012-12-12 16:49:33 -08004686 pVoid pAdapter : Driver global control block pointer
Jeff Johnson295189b2012-06-20 16:38:30 -07004687
4688 @ Return
4689 pVoid DXE local module control block pointer
4690===========================================================================*/
4691void *WLANDXE_Open
4692(
4693 void
4694)
4695{
4696 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4697 unsigned int idx;
4698 WLANDXE_ChannelCBType *currentChannel = NULL;
4699 int smsmInitState;
Mihir Shetebe94ebb2015-05-26 12:07:14 +05304700 wpt_uint8 chanMask = WDTS_TRANSPORT_CHANNELS_MASK;
Jeff Johnson295189b2012-06-20 16:38:30 -07004701
4702 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004703 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004704
Mihir Shetee6618162015-03-16 14:48:42 +05304705 if (wpalIsFwLoggingEnabled())
4706 {
Mihir Shetebe94ebb2015-05-26 12:07:14 +05304707 chanMask |= WDTS_RX_LOG_CHANNEL_MASK;
Mihir Shetee6618162015-03-16 14:48:42 +05304708 }
Mihir Shetebe94ebb2015-05-26 12:07:14 +05304709
4710 if (wpalIsFwEvLoggingEnabled())
Mihir Shetee6618162015-03-16 14:48:42 +05304711 {
Mihir Shetebe94ebb2015-05-26 12:07:14 +05304712 chanMask |= WDTS_RX_FW_LOG_CHANNEL_MASK;
Mihir Shetee6618162015-03-16 14:48:42 +05304713 }
Mihir Shetebe94ebb2015-05-26 12:07:14 +05304714 dxeSetEnabledChannels(chanMask);
Mihir Shetee6618162015-03-16 14:48:42 +05304715
Jeff Johnson295189b2012-06-20 16:38:30 -07004716 /* This is temporary allocation */
4717 tempDxeCtrlBlk = (WLANDXE_CtrlBlkType *)wpalMemoryAllocate(sizeof(WLANDXE_CtrlBlkType));
4718 if(NULL == tempDxeCtrlBlk)
4719 {
4720 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4721 "WLANDXE_Open Control Block Alloc Fail");
4722 return NULL;
4723 }
4724 wpalMemoryZero(tempDxeCtrlBlk, sizeof(WLANDXE_CtrlBlkType));
4725
jagadeeshf869bba2015-04-07 20:06:21 +05304726 dxeCommonDefaultConfig(tempDxeCtrlBlk);
Jeff Johnson295189b2012-06-20 16:38:30 -07004727
Mihir Shetee6618162015-03-16 14:48:42 +05304728 foreach_valid_channel(idx)
Jeff Johnson295189b2012-06-20 16:38:30 -07004729 {
4730 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4731 "WLANDXE_Open Channel %s Open Start", channelType[idx]);
4732 currentChannel = &tempDxeCtrlBlk->dxeChannel[idx];
Mihir Shetebe94ebb2015-05-26 12:07:14 +05304733 currentChannel->channelType = idx;
Jeff Johnson295189b2012-06-20 16:38:30 -07004734
4735 /* Config individual channels from channel default setup table */
4736 status = dxeChannelDefaultConfig(tempDxeCtrlBlk,
4737 currentChannel);
4738 if(eWLAN_PAL_STATUS_SUCCESS != status)
4739 {
4740 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4741 "WLANDXE_Open Channel Basic Configuration Fail for channel %d", idx);
4742 WLANDXE_Close(tempDxeCtrlBlk);
4743 return NULL;
4744 }
4745
4746 /* Allocate DXE Control Block will be used by host DXE driver */
4747 status = dxeCtrlBlkAlloc(tempDxeCtrlBlk, currentChannel);
4748 if(eWLAN_PAL_STATUS_SUCCESS != status)
4749 {
4750 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4751 "WLANDXE_Open Alloc DXE Control Block Fail for channel %d", idx);
4752
4753 WLANDXE_Close(tempDxeCtrlBlk);
4754 return NULL;
4755 }
4756 status = wpalMutexInit(&currentChannel->dxeChannelLock);
4757 if(eWLAN_PAL_STATUS_SUCCESS != status)
4758 {
4759 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4760 "WLANDXE_Open Lock Init Fail for channel %d", idx);
4761 WLANDXE_Close(tempDxeCtrlBlk);
4762 return NULL;
4763 }
4764
4765 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4766 "WLANDXE_Open Channel %s Open Success", channelType[idx]);
4767 }
4768
4769 /* Allocate and Init RX READY ISR Serialize Buffer */
4770 tempDxeCtrlBlk->rxIsrMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
4771 if(NULL == tempDxeCtrlBlk->rxIsrMsg)
4772 {
4773 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4774 "WLANDXE_Open Alloc RX ISR Fail");
4775 WLANDXE_Close(tempDxeCtrlBlk);
4776 return NULL;
4777 }
4778 wpalMemoryZero(tempDxeCtrlBlk->rxIsrMsg, sizeof(wpt_msg));
4779 tempDxeCtrlBlk->rxIsrMsg->callback = dxeRXEventHandler;
4780 tempDxeCtrlBlk->rxIsrMsg->pContext = (void *)tempDxeCtrlBlk;
4781
4782 /* Allocate and Init TX COMP ISR Serialize Buffer */
4783 tempDxeCtrlBlk->txIsrMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
4784 if(NULL == tempDxeCtrlBlk->txIsrMsg)
4785 {
4786 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4787 "WLANDXE_Open Alloc TX ISR Fail");
4788 WLANDXE_Close(tempDxeCtrlBlk);
4789 return NULL;
4790 }
4791 wpalMemoryZero(tempDxeCtrlBlk->txIsrMsg, sizeof(wpt_msg));
4792 tempDxeCtrlBlk->txIsrMsg->callback = dxeTXEventHandler;
4793 tempDxeCtrlBlk->txIsrMsg->pContext = (void *)tempDxeCtrlBlk;
4794
4795 /* Allocate and Init RX Packet Available Serialize Message Buffer */
4796 tempDxeCtrlBlk->rxPktAvailMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
4797 if(NULL == tempDxeCtrlBlk->rxPktAvailMsg)
4798 {
4799 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4800 "WLANDXE_Open Alloc RX Packet Available Message Fail");
4801 WLANDXE_Close(tempDxeCtrlBlk);
4802 return NULL;
4803 }
4804 wpalMemoryZero(tempDxeCtrlBlk->rxPktAvailMsg, sizeof(wpt_msg));
4805 tempDxeCtrlBlk->rxPktAvailMsg->callback = dxeRXPacketAvailableEventHandler;
4806 tempDxeCtrlBlk->rxPktAvailMsg->pContext = (void *)tempDxeCtrlBlk;
4807
4808 tempDxeCtrlBlk->freeRXPacket = NULL;
4809 tempDxeCtrlBlk->dxeCookie = WLANDXE_CTXT_COOKIE;
4810 tempDxeCtrlBlk->rxIntDisabledByIMPS = eWLAN_PAL_FALSE;
4811 tempDxeCtrlBlk->txIntDisabledByIMPS = eWLAN_PAL_FALSE;
Jeff Johnsone7245742012-09-05 17:12:55 -07004812 tempDxeCtrlBlk->driverReloadInProcessing = eWLAN_PAL_FALSE;
Leo Changac1d3612013-07-01 15:15:51 -07004813 tempDxeCtrlBlk->smsmToggled = eWLAN_PAL_FALSE;
Karthick Sc6ec8362015-08-12 18:18:47 +05304814 tempDxeCtrlBlk->smsmRingsEmptyHistogram = 0;
4815 tempDxeCtrlBlk->smsmDxeHistogram = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07004816
4817 /* Initialize SMSM state
4818 * Init State is
4819 * Clear TX Enable
4820 * RING EMPTY STATE */
4821 smsmInitState = wpalNotifySmsm(WPAL_SMSM_WLAN_TX_ENABLE,
4822 WPAL_SMSM_WLAN_TX_RINGS_EMPTY);
4823 if(0 != smsmInitState)
4824 {
4825 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4826 "SMSM Channel init fail %d", smsmInitState);
Mihir Shetee6618162015-03-16 14:48:42 +05304827 foreach_valid_channel(idx)
Jeff Johnson295189b2012-06-20 16:38:30 -07004828 {
4829 dxeChannelClose(tempDxeCtrlBlk, &tempDxeCtrlBlk->dxeChannel[idx]);
4830 }
Madan Mohan Koyyalamudibe3597f2012-11-15 17:33:55 -08004831 wpalMemoryFree(tempDxeCtrlBlk->rxIsrMsg);
4832 wpalMemoryFree(tempDxeCtrlBlk->txIsrMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -07004833 wpalMemoryFree(tempDxeCtrlBlk);
4834 return NULL;
4835 }
4836
Mihir Shete44547fb2014-03-10 14:15:42 +05304837#ifdef WLAN_DXE_LOW_RESOURCE_TIMER
Leo Chang72cdfd32013-10-17 20:36:30 -07004838 wpalTimerInit(&tempDxeCtrlBlk->rxResourceAvailableTimer,
4839 dxeRXResourceAvailableTimerExpHandler,
4840 tempDxeCtrlBlk);
Mihir Shete44547fb2014-03-10 14:15:42 +05304841#endif
Leo Chang72cdfd32013-10-17 20:36:30 -07004842
Mihir Shetefdc9f532014-01-09 15:03:02 +05304843 wpalTimerInit(&tempDxeCtrlBlk->dxeSSRTimer,
4844 dxeSSRTimerExpHandler, tempDxeCtrlBlk);
4845
Sravan Kumar Kairamf41f0742015-12-14 16:32:25 +05304846 spin_lock_init(&dtraceLock);
4847
Sravan Kumar Kairama8269e72015-11-06 12:13:24 +05304848#ifdef DXE_TRACE
4849 DXTRACE(dxeTraceInit());
4850#endif
4851
Jeff Johnson295189b2012-06-20 16:38:30 -07004852 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4853 "WLANDXE_Open Success");
4854 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004855 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004856 return (void *)tempDxeCtrlBlk;
4857}
4858
4859/*==========================================================================
4860 @ Function Name
4861 WLANDXE_ClientRegistration
4862
4863 @ Description
4864 Make callback functions registration into DXE driver from DXE driver client
4865
4866 @ Parameters
4867 pVoid pDXEContext : DXE module control block
Mihir Shetec4093f92015-05-28 15:21:11 +05304868 WDTS_ClientCallbacks WDTSCb : Callbacks to WDTS to indicate various events
Jeff Johnson295189b2012-06-20 16:38:30 -07004869 void *userContext : DXE Cliennt control block
4870
4871 @ Return
4872 wpt_status
4873===========================================================================*/
4874wpt_status WLANDXE_ClientRegistration
4875(
4876 void *pDXEContext,
Mihir Shetec4093f92015-05-28 15:21:11 +05304877 WDTS_ClientCallbacks WDTSCb,
Jeff Johnson295189b2012-06-20 16:38:30 -07004878 void *userContext
4879)
4880{
4881 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4882 WLANDXE_CtrlBlkType *dxeCtxt;
4883
4884 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004885 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004886
4887 /* Sanity */
4888 if(NULL == pDXEContext)
4889 {
4890 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4891 "WLANDXE_ClientRegistration Invalid DXE CB");
4892 return eWLAN_PAL_STATUS_E_INVAL;
4893 }
4894
Jeff Johnson295189b2012-06-20 16:38:30 -07004895 if(NULL == userContext)
4896 {
4897 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4898 "WLANDXE_ClientRegistration Invalid userContext");
4899 return eWLAN_PAL_STATUS_E_INVAL;
4900 }
4901
4902 dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
4903
4904 /* Assign */
Mihir Shetec4093f92015-05-28 15:21:11 +05304905 dxeCtxt->rxReadyCB = WDTSCb.rxFrameReadyCB;
4906 dxeCtxt->txCompCB = WDTSCb.txCompleteCB;
4907 dxeCtxt->lowResourceCB = WDTSCb.lowResourceCB;
4908 dxeCtxt->receiveMbMsgCB = WDTSCb.receiveMbMsgCB;
Mihir Shete5affadc2015-05-29 20:54:57 +05304909 dxeCtxt->receiveLogCompleteCB = WDTSCb.receiveLogCompleteCB;
Jeff Johnson295189b2012-06-20 16:38:30 -07004910 dxeCtxt->clientCtxt = userContext;
4911
4912 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004913 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004914 return status;
4915}
4916
4917/*==========================================================================
4918 @ Function Name
4919 WLANDXE_Start
4920
4921 @ Description
4922 Start Host DXE driver
4923 Initialize DXE channels and start channel
4924
4925 @ Parameters
4926 pVoid pDXEContext : DXE module control block
4927
4928 @ Return
4929 wpt_status
4930===========================================================================*/
4931wpt_status WLANDXE_Start
4932(
4933 void *pDXEContext
4934)
4935{
4936 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
4937 wpt_uint32 idx;
4938 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
4939
4940 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004941 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004942
4943 /* Sanity */
4944 if(NULL == pDXEContext)
4945 {
4946 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4947 "WLANDXE_Start Invalid DXE CB");
4948 return eWLAN_PAL_STATUS_E_INVAL;
4949 }
4950 dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
4951
4952 /* WLANDXE_Start called means DXE engine already initiates
4953 * And DXE HW is reset and init finished
4954 * But here to make sure HW is initialized, reset again */
jagadeeshf869bba2015-04-07 20:06:21 +05304955 dxeEngineCoreStart(dxeCtxt);
Jeff Johnson295189b2012-06-20 16:38:30 -07004956
4957 /* Individual Channel Start */
Mihir Shetee6618162015-03-16 14:48:42 +05304958 foreach_valid_channel(idx)
Jeff Johnson295189b2012-06-20 16:38:30 -07004959 {
4960 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4961 "WLANDXE_Start Channel %s Start", channelType[idx]);
4962
4963 /* Allocate DXE descriptor will be shared by Host driver and DXE engine */
4964 /* Make connection between DXE descriptor and DXE control block */
4965 status = dxeDescAllocAndLink(tempDxeCtrlBlk, &dxeCtxt->dxeChannel[idx]);
4966 if(eWLAN_PAL_STATUS_SUCCESS != status)
4967 {
4968 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4969 "WLANDXE_Start Alloc DXE Descriptor Fail for channel %d", idx);
4970 return status;
4971 }
4972
4973 /* Program each channel register with configuration arguments */
4974 status = dxeChannelInitProgram(dxeCtxt,
4975 &dxeCtxt->dxeChannel[idx]);
4976 if(eWLAN_PAL_STATUS_SUCCESS != status)
4977 {
4978 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4979 "WLANDXE_Start %d Program DMA channel Fail", idx);
4980 return status;
4981 }
4982
4983 /* ??? Trigger to start DMA channel
4984 * This must be seperated from ??? */
4985 status = dxeChannelStart(dxeCtxt,
4986 &dxeCtxt->dxeChannel[idx]);
4987 if(eWLAN_PAL_STATUS_SUCCESS != status)
4988 {
4989 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
4990 "WLANDXE_Start %d Channel Start Fail", idx);
4991 return status;
4992 }
4993 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
4994 "WLANDXE_Start Channel %s Start Success", channelType[idx]);
4995 }
4996
4997 /* Register ISR to OS */
4998 /* Register TX complete interrupt into platform */
4999 status = wpalRegisterInterrupt(DXE_INTERRUPT_TX_COMPLE,
5000 dxeTXISR,
5001 dxeCtxt);
5002 if(eWLAN_PAL_STATUS_SUCCESS != status)
5003 {
5004 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5005 "WLANDXE_Start TX comp interrupt registration Fail");
5006 return status;
5007 }
5008
5009 /* Register RX ready interrupt into platform */
5010 status = wpalRegisterInterrupt(DXE_INTERRUPT_RX_READY,
5011 dxeRXISR,
5012 dxeCtxt);
5013 if(eWLAN_PAL_STATUS_SUCCESS != status)
5014 {
5015 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5016 "WLANDXE_Start RX Ready interrupt registration Fail");
5017 return status;
5018 }
5019
5020 /* Enable system level ISR */
5021 /* Enable RX ready Interrupt at here */
5022 status = wpalEnableInterrupt(DXE_INTERRUPT_RX_READY);
5023 if(eWLAN_PAL_STATUS_SUCCESS != status)
5024 {
5025 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5026 "dxeTXCompleteEventHandler Enable TX complete interrupt fail");
5027 return status;
5028 }
5029
5030 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005031 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005032 return status;
5033}
5034
5035/*==========================================================================
5036 @ Function Name
5037 WLANDXE_TXFrame
5038
5039 @ Description
5040 Trigger frame transmit from host to RIVA
5041
5042 @ Parameters
5043 pVoid pDXEContext : DXE Control Block
5044 wpt_packet pPacket : transmit packet structure
5045 WDTS_ChannelType channel : TX channel
5046
5047 @ Return
5048 wpt_status
5049===========================================================================*/
5050wpt_status WLANDXE_TxFrame
5051(
5052 void *pDXEContext,
5053 wpt_packet *pPacket,
5054 WDTS_ChannelType channel
5055)
5056{
5057 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5058 WLANDXE_ChannelCBType *currentChannel = NULL;
5059 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
5060 unsigned int *lowThreshold = NULL;
5061
5062 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005063 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005064
5065 /* Sanity */
5066 if(NULL == pDXEContext)
5067 {
5068 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5069 "WLANDXE_Start Invalid DXE CB");
5070 return eWLAN_PAL_STATUS_E_INVAL;
5071 }
5072
5073 if(NULL == pPacket)
5074 {
5075 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5076 "WLANDXE_Start Invalid pPacket");
5077 return eWLAN_PAL_STATUS_E_INVAL;
5078 }
5079
Mihir Shetee6618162015-03-16 14:48:42 +05305080 if(WDTS_CHANNEL_MAX <= channel)
Jeff Johnson295189b2012-06-20 16:38:30 -07005081 {
5082 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5083 "WLANDXE_Start Invalid channel");
5084 return eWLAN_PAL_STATUS_E_INVAL;
5085 }
5086
5087 dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
5088
5089 currentChannel = &dxeCtxt->dxeChannel[channel];
5090
5091
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08005092 status = wpalMutexAcquire(&currentChannel->dxeChannelLock);
5093 if(eWLAN_PAL_STATUS_SUCCESS != status)
5094 {
5095 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5096 "WLANDXE_TxFrame Mutex Acquire fail");
5097 return status;
5098 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005099
5100 lowThreshold = currentChannel->channelType == WDTS_CHANNEL_TX_LOW_PRI?
5101 &(dxeCtxt->txCompInt.txLowResourceThreshold_LoPriCh):
5102 &(dxeCtxt->txCompInt.txLowResourceThreshold_HiPriCh);
5103
5104 /* Decide have to activate TX complete event or not */
5105 switch(dxeCtxt->txCompInt.txIntEnable)
5106 {
5107 /* TX complete interrupt will be activated when low DXE resource */
5108 case WLANDXE_TX_COMP_INT_LR_THRESHOLD:
5109 if((currentChannel->numFreeDesc <= *lowThreshold) &&
5110 (eWLAN_PAL_FALSE == dxeCtxt->txIntEnable))
5111 {
5112 dxeCtxt->txIntEnable = eWLAN_PAL_TRUE;
5113 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
5114 channel,
5115 eWLAN_PAL_FALSE);
5116 }
5117 break;
5118
Jeff Johnsonab79c8d2012-12-10 14:30:13 -08005119 /* TX complete interrupt will be activated n number of frames transferred */
Jeff Johnson295189b2012-06-20 16:38:30 -07005120 case WLANDXE_TX_COMP_INT_PER_K_FRAMES:
5121 if(channel == WDTS_CHANNEL_TX_LOW_PRI)
5122 {
5123 currentChannel->numFrameBeforeInt++;
5124 }
5125 break;
5126
5127 /* TX complete interrupt will be activated periodically */
5128 case WLANDXE_TX_COMP_INT_TIMER:
5129 break;
5130 }
5131
5132 dxeCtxt->txCompletedFrames++;
5133
5134 /* Update DXE descriptor, this is frame based
5135 * if a frame consist of N fragments, N Descriptor will be programed */
5136 status = dxeTXPushFrame(currentChannel, pPacket);
5137 if(eWLAN_PAL_STATUS_SUCCESS != status)
5138 {
5139 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5140 "WLANDXE_TxFrame TX Push Frame fail");
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08005141 status = wpalMutexRelease(&currentChannel->dxeChannelLock);
5142 if(eWLAN_PAL_STATUS_SUCCESS != status)
5143 {
5144 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5145 "WLANDXE_TxFrame Mutex Release fail");
5146 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005147 return status;
5148 }
5149
5150 /* If specific channel hit low resource condition, send notification to upper layer */
5151 if(currentChannel->numFreeDesc <= *lowThreshold)
5152 {
5153 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
5154 channel,
5155 eWLAN_PAL_FALSE);
5156 currentChannel->hitLowResource = eWLAN_PAL_TRUE;
Madan Mohan Koyyalamudiea777012012-10-31 14:22:34 -07005157
5158 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
5159 "%11s : Low Resource currentChannel->numRsvdDesc %d",
5160 channelType[currentChannel->channelType],
5161 currentChannel->numRsvdDesc);
Mihir Shete68ed77a2014-10-10 10:47:12 +05305162 if (WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN == dxeCtxt->rivaPowerState)
5163 {
5164 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
5165 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
5166 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005167 }
Madan Mohan Koyyalamudib2cb8be2012-11-27 15:07:43 -08005168 status = wpalMutexRelease(&currentChannel->dxeChannelLock);
5169 if(eWLAN_PAL_STATUS_SUCCESS != status)
5170 {
5171 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5172 "WLANDXE_TxFrame Mutex Release fail");
5173 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005174
5175 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005176 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005177 return status;
5178}
5179
5180/*==========================================================================
5181 @ Function Name
5182 WLANDXE_CompleteTX
5183
5184 @ Description
5185 Informs DXE that the current series of Tx packets is complete
5186
5187 @ Parameters
5188 pContext pDXEContext : DXE Control Block
5189 ucTxResReq TX resource number required by TL/WDI
5190
5191 @ Return
5192 wpt_status
5193===========================================================================*/
5194wpt_status
5195WLANDXE_CompleteTX
5196(
5197 void* pContext,
5198 wpt_uint32 ucTxResReq
5199)
5200{
5201 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5202 WLANDXE_CtrlBlkType *dxeCtxt = (WLANDXE_CtrlBlkType *)(pContext);
5203 WLANDXE_ChannelCBType *channelCb = NULL;
5204 wpt_boolean inLowRes;
5205
5206 /* Sanity Check */
5207 if( NULL == pContext )
5208 {
5209 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5210 "WLANDXE_CompleteTX invalid param");
5211 return eWLAN_PAL_STATUS_E_INVAL;
5212 }
5213
5214 channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI];
5215 inLowRes = channelCb->hitLowResource;
5216
5217 if(WLANDXE_TX_LOW_RES_THRESHOLD < ucTxResReq)
5218 {
5219 /* Raise threshold temporarily if necessary */
5220 dxeCtxt->txCompInt.txLowResourceThreshold_LoPriCh = ucTxResReq;
5221
5222 if(eWLAN_PAL_FALSE == inLowRes)
5223 {
5224 /* Put the channel to low resource condition */
5225 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
5226 WDTS_CHANNEL_TX_LOW_PRI,
5227 eWLAN_PAL_FALSE);
5228 inLowRes = channelCb->hitLowResource = eWLAN_PAL_TRUE;
5229 }
5230 }
5231
5232 /*Try to reclaim resources*/
5233 dxeTXCompleteProcessing(dxeCtxt);
5234
5235 /* In previous WLANTL_GetFrames call, TL didn't fetch a packet
5236 because its fragment size is larger than DXE free resource. */
5237 if(0 < ucTxResReq)
5238 {
5239 /* DXE successfully claimed enough free DXE resouces for next fetch. */
5240 if(WLANDXE_GetFreeTxDataResNumber(dxeCtxt) >= ucTxResReq)
5241 {
5242 /* DXE has not been in low resource condition. DXE forces to kick off
5243 TX tranmit */
5244 if((eWLAN_PAL_FALSE == inLowRes) &&
5245 (eWLAN_PAL_FALSE == channelCb->hitLowResource))
5246 {
5247 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
5248 WDTS_CHANNEL_TX_LOW_PRI,
5249 eWLAN_PAL_FALSE);
5250 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
5251 WDTS_CHANNEL_TX_LOW_PRI,
5252 eWLAN_PAL_TRUE);
5253 channelCb->hitLowResource = eWLAN_PAL_FALSE;
5254 }
5255 }
5256 else
5257 {
5258 /* DXE doesn't have enough free DXE resources. Put the channel
5259 to low resource condition. */
5260 if(eWLAN_PAL_FALSE == channelCb->hitLowResource)
5261 {
5262 /* Put the channel to low resource condition */
5263 dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt,
5264 WDTS_CHANNEL_TX_LOW_PRI,
5265 eWLAN_PAL_FALSE);
5266 channelCb->hitLowResource = eWLAN_PAL_TRUE;
5267 }
5268 }
5269 }
5270
5271 return status;
5272}
5273
5274/*==========================================================================
5275 @ Function Name
5276 WLANDXE_Stop
5277
5278 @ Description
5279 Stop DXE channels and DXE engine operations
5280 Disable all channel interrupt
5281 Stop all channel operation
5282
5283 @ Parameters
5284 pVoid pDXEContext : DXE Control Block
5285
5286 @ Return
5287 wpt_status
5288===========================================================================*/
5289wpt_status WLANDXE_Stop
5290(
5291 void *pDXEContext
5292)
5293{
5294 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5295 wpt_uint32 idx;
5296 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
5297
5298 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005299 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005300
5301 /* Sanity */
5302 if(NULL == pDXEContext)
5303 {
5304 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5305 "WLANDXE_Stop Invalid DXE CB");
5306 return eWLAN_PAL_STATUS_E_INVAL;
5307 }
5308
5309 dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
Mihir Shetee6618162015-03-16 14:48:42 +05305310 foreach_valid_channel(idx)
Jeff Johnson295189b2012-06-20 16:38:30 -07005311 {
5312 status = dxeChannelStop(dxeCtxt, &dxeCtxt->dxeChannel[idx]);
5313 if(eWLAN_PAL_STATUS_SUCCESS != status)
5314 {
5315 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5316 "WLANDXE_Stop Channel %d Stop Fail", idx);
Jeff Johnson295189b2012-06-20 16:38:30 -07005317 }
5318 }
5319
5320 /* During Stop unregister interrupt */
5321 wpalUnRegisterInterrupt(DXE_INTERRUPT_TX_COMPLE);
5322 wpalUnRegisterInterrupt(DXE_INTERRUPT_RX_READY);
5323
Mihir Shete44547fb2014-03-10 14:15:42 +05305324#ifdef WLAN_DXE_LOW_RESOURCE_TIMER
Leo Chang72cdfd32013-10-17 20:36:30 -07005325 if(VOS_TIMER_STATE_STOPPED !=
5326 wpalTimerGetCurStatus(&dxeCtxt->rxResourceAvailableTimer))
5327 {
5328 wpalTimerStop(&dxeCtxt->rxResourceAvailableTimer);
5329 }
Mihir Shete44547fb2014-03-10 14:15:42 +05305330#endif
Leo Chang72cdfd32013-10-17 20:36:30 -07005331
Jeff Johnson295189b2012-06-20 16:38:30 -07005332 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005333 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005334 return status;
5335}
5336
5337/*==========================================================================
5338 @ Function Name
5339 WLANDXE_Close
5340
5341 @ Description
5342 Close DXE channels
5343 Free DXE related resources
5344 DXE descriptor free
5345 Descriptor control block free
5346 Pre allocated RX buffer free
5347
5348 @ Parameters
5349 pVoid pDXEContext : DXE Control Block
5350
5351 @ Return
5352 wpt_status
5353===========================================================================*/
5354wpt_status WLANDXE_Close
5355(
5356 void *pDXEContext
5357)
5358{
5359 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5360 wpt_uint32 idx;
5361 WLANDXE_CtrlBlkType *dxeCtxt = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005362
5363 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005364 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005365
5366 /* Sanity */
5367 if(NULL == pDXEContext)
5368 {
5369 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5370 "WLANDXE_Stop Invalid DXE CB");
5371 return eWLAN_PAL_STATUS_E_INVAL;
5372 }
5373
5374 dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
Mihir Shete44547fb2014-03-10 14:15:42 +05305375#ifdef WLAN_DXE_LOW_RESOURCE_TIMER
Leo Chang72cdfd32013-10-17 20:36:30 -07005376 wpalTimerDelete(&dxeCtxt->rxResourceAvailableTimer);
Mihir Shete44547fb2014-03-10 14:15:42 +05305377#endif
Mihir Shetefdc9f532014-01-09 15:03:02 +05305378 wpalTimerDelete(&dxeCtxt->dxeSSRTimer);
Mihir Shetee6618162015-03-16 14:48:42 +05305379 foreach_valid_channel(idx)
Jeff Johnson295189b2012-06-20 16:38:30 -07005380 {
5381 wpalMutexDelete(&dxeCtxt->dxeChannel[idx].dxeChannelLock);
5382 dxeChannelClose(dxeCtxt, &dxeCtxt->dxeChannel[idx]);
Jeff Johnson295189b2012-06-20 16:38:30 -07005383 }
5384
5385 if(NULL != dxeCtxt->rxIsrMsg)
5386 {
5387 wpalMemoryFree(dxeCtxt->rxIsrMsg);
5388 }
5389 if(NULL != dxeCtxt->txIsrMsg)
5390 {
5391 wpalMemoryFree(dxeCtxt->txIsrMsg);
5392 }
5393 if(NULL != dxeCtxt->rxPktAvailMsg)
5394 {
5395 wpalMemoryFree(dxeCtxt->rxPktAvailMsg);
5396 }
5397
5398 wpalMemoryFree(pDXEContext);
5399
5400 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005401 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005402 return status;
5403}
5404
5405/*==========================================================================
5406 @ Function Name
5407 WLANDXE_TriggerTX
5408
5409 @ Description
5410 TBD
5411
5412 @ Parameters
5413 pVoid pDXEContext : DXE Control Block
5414
5415 @ Return
5416 wpt_status
5417===========================================================================*/
5418wpt_status WLANDXE_TriggerTX
5419(
5420 void *pDXEContext
5421)
5422{
5423 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5424
5425 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005426 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005427
5428 /* TBD */
5429
5430 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005431 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005432 return status;
5433}
5434
5435/*==========================================================================
5436 @ Function Name
5437 dxeTxThreadSetPowerStateEventHandler
5438
5439 @ Description
5440 If WDI sends set power state req, this event handler will be called in Tx
5441 thread context
5442
5443 @ Parameters
5444 void *msgPtr
5445 Event MSG
5446
5447 @ Return
5448 None
5449===========================================================================*/
5450void dxeTxThreadSetPowerStateEventHandler
5451(
5452 wpt_msg *msgPtr
5453)
5454{
5455 wpt_msg *msgContent = (wpt_msg *)msgPtr;
5456 WLANDXE_CtrlBlkType *dxeCtxt;
Mihir Shetea4306052014-03-25 00:02:54 +05305457 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07005458 WLANDXE_PowerStateType reqPowerState;
Mihir Shetea4306052014-03-25 00:02:54 +05305459 wpt_int8 i;
5460 WLANDXE_ChannelCBType *channelEntry;
5461 wpt_log_data_stall_channel_type channelLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07005462
5463 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005464 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005465
Jeff Johnson295189b2012-06-20 16:38:30 -07005466 dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
5467 reqPowerState = (WLANDXE_PowerStateType)msgContent->val;
5468 dxeCtxt->setPowerStateCb = (WLANDXE_SetPowerStateCbType)msgContent->ptr;
5469
5470 switch(reqPowerState)
5471 {
5472 case WLANDXE_POWER_STATE_BMPS:
5473 if(WLANDXE_RIVA_POWER_STATE_ACTIVE == dxeCtxt->rivaPowerState)
5474 {
5475 //don't block MC waiting for num_rsvd to become 0 since it may take a while
5476 //based on amount of TX and RX activity - during this time any received
5477 // management frames will remain un-processed consuming RX buffers
5478 dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN;
5479 dxeCtxt->hostPowerState = reqPowerState;
5480 }
5481 else
5482 {
5483 status = eWLAN_PAL_STATUS_E_INVAL;
5484 }
5485 break;
5486 case WLANDXE_POWER_STATE_IMPS:
5487 if(WLANDXE_RIVA_POWER_STATE_ACTIVE == dxeCtxt->rivaPowerState)
5488 {
Mihir Shetea4306052014-03-25 00:02:54 +05305489
5490 for(i = WDTS_CHANNEL_TX_LOW_PRI; i < WDTS_CHANNEL_RX_LOW_PRI; i++)
5491 {
5492 channelEntry = &dxeCtxt->dxeChannel[i];
5493 if(channelEntry->tailCtrlBlk != channelEntry->headCtrlBlk)
5494 {
5495 status = eWLAN_PAL_STATUS_E_FAILURE;
5496 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
5497 "%11s : %s :TX Pending frame",
5498 channelType[channelEntry->channelType], __func__);
5499
5500 dxeChannelMonitor("DXE_IMP_ERR", channelEntry, &channelLog);
5501 dxeDescriptorDump(channelEntry,
5502 channelEntry->headCtrlBlk->linkedDesc, 0);
5503 dxeChannelRegisterDump(channelEntry, "DXE_IMPS_ERR",
5504 &channelLog);
5505 dxeChannelAllDescDump(channelEntry,
5506 channelEntry->channelType,
5507 &channelLog);
5508 }
5509 }
5510
5511 if (eWLAN_PAL_STATUS_SUCCESS == status)
5512 {
5513 dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_IMPS_UNKNOWN;
5514 dxeCtxt->hostPowerState = WLANDXE_POWER_STATE_IMPS;
5515 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005516 }
5517 else
5518 {
5519 status = eWLAN_PAL_STATUS_E_INVAL;
5520 }
5521 break;
5522 case WLANDXE_POWER_STATE_FULL:
5523 if(WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN == dxeCtxt->rivaPowerState)
5524 {
5525 dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_ACTIVE;
5526 }
5527 dxeCtxt->hostPowerState = reqPowerState;
5528 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
5529 break;
5530 case WLANDXE_POWER_STATE_DOWN:
5531 WLANDXE_Stop((void *)dxeCtxt);
5532 break;
5533 default:
5534 //assert
5535 break;
5536 }
5537
Sravan Kumar Kairama8269e72015-11-06 12:13:24 +05305538 DXTRACE(dxeTrace(WLANDXE_DMA_CHANNEL_MAX, TRACE_POWER_STATE, dxeCtxt->hostPowerState));
5539
Jeff Johnson295189b2012-06-20 16:38:30 -07005540 if(WLANDXE_POWER_STATE_BMPS_PENDING != dxeCtxt->hostPowerState)
5541 {
5542 dxeCtxt->setPowerStateCb(status,
5543 dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].descBottomLocPhyAddr);
5544 }
Ravali85acf6b2012-12-12 14:01:38 -08005545 else
5546 {
5547 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
5548 "%s State of DXE is WLANDXE_POWER_STATE_BMPS_PENDING, so cannot proceed", __func__);
5549 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005550 /* Free MSG buffer */
5551 wpalMemoryFree(msgPtr);
5552 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005553 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005554 return;
5555}
5556
5557
5558/*==========================================================================
5559 @ Function Name
5560 dxeRxThreadSetPowerStateEventHandler
5561
5562 @ Description
5563 If WDI sends set power state req, this event handler will be called in Rx
5564 thread context
5565
5566 @ Parameters
5567 void *msgPtr
5568 Event MSG
5569
5570 @ Return
5571 None
5572===========================================================================*/
5573void dxeRxThreadSetPowerStateEventHandler
5574(
5575 wpt_msg *msgPtr
5576)
5577{
5578 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5579
5580 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005581 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005582
5583 /* Now serialise the message through Tx thread also to make sure
5584 * no register access when RIVA is in powersave */
5585 /*Use the same message pointer just change the call back function */
5586 msgPtr->callback = dxeTxThreadSetPowerStateEventHandler;
5587 status = wpalPostTxMsg(WDI_GET_PAL_CTX(),
5588 msgPtr);
5589 if ( eWLAN_PAL_STATUS_SUCCESS != status )
5590 {
5591 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5592 "Tx thread Set power state req serialize fail status=%d",
Jeff Johnson9e237fb2013-10-30 18:46:20 -07005593 status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005594 }
5595
5596 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005597 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005598}
5599
5600/*==========================================================================
5601 @ Function Name
5602 WLANDXE_SetPowerState
5603
5604 @ Description
5605 From Client let DXE knows what is the WLAN HW(RIVA) power state
5606
5607 @ Parameters
5608 pVoid pDXEContext : DXE Control Block
5609 WLANDXE_PowerStateType powerState
5610
5611 @ Return
5612 wpt_status
5613===========================================================================*/
5614wpt_status WLANDXE_SetPowerState
5615(
5616 void *pDXEContext,
5617 WDTS_PowerStateType powerState,
5618 WDTS_SetPSCbType cBack
5619)
5620{
5621 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5622 WLANDXE_CtrlBlkType *pDxeCtrlBlk;
5623 WLANDXE_PowerStateType hostPowerState;
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07005624 wpt_msg *rxCompMsg;
5625 wpt_msg *txDescReSyncMsg;
Sravan Kumar Kairam84e995f2016-05-27 16:16:21 +05305626 int state;
Jeff Johnson295189b2012-06-20 16:38:30 -07005627
5628 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005629 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005630 if(NULL == pDXEContext)
5631 {
5632 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Jeff Johnson9e237fb2013-10-30 18:46:20 -07005633 "NULL pDXEContext passed by caller");
Jeff Johnson295189b2012-06-20 16:38:30 -07005634 return eWLAN_PAL_STATUS_E_FAILURE;
5635 }
5636 pDxeCtrlBlk = (WLANDXE_CtrlBlkType *)pDXEContext;
5637
Jeff Johnson295189b2012-06-20 16:38:30 -07005638 switch(powerState)
5639 {
5640 case WDTS_POWER_STATE_FULL:
Sravan Kumar Kairam84e995f2016-05-27 16:16:21 +05305641 dxeEnvBlk.dxe_prev_ps = pDxeCtrlBlk->hostPowerState;
Madan Mohan Koyyalamudi7f1020d2012-09-28 15:29:03 -07005642 if(WLANDXE_POWER_STATE_IMPS == pDxeCtrlBlk->hostPowerState)
5643 {
5644 txDescReSyncMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
5645 if(NULL == txDescReSyncMsg)
5646 {
5647 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5648 "WLANDXE_SetPowerState, TX Resync MSG MEM alloc Fail");
5649 }
5650 else
5651 {
5652 txDescReSyncMsg->callback = dxeTXReSyncDesc;
5653 txDescReSyncMsg->pContext = pDxeCtrlBlk;
5654 status = wpalPostTxMsg(WDI_GET_PAL_CTX(),
5655 txDescReSyncMsg);
5656 if(eWLAN_PAL_STATUS_SUCCESS != status)
5657 {
5658 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5659 "WLANDXE_SetPowerState, Post TX re-sync MSG fail");
5660 }
5661 }
5662 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005663 hostPowerState = WLANDXE_POWER_STATE_FULL;
5664 break;
5665 case WDTS_POWER_STATE_BMPS:
5666 pDxeCtrlBlk->hostPowerState = WLANDXE_POWER_STATE_BMPS;
5667 hostPowerState = WLANDXE_POWER_STATE_BMPS;
5668 break;
5669 case WDTS_POWER_STATE_IMPS:
Jeff Johnson295189b2012-06-20 16:38:30 -07005670 hostPowerState = WLANDXE_POWER_STATE_IMPS;
5671 break;
5672 case WDTS_POWER_STATE_DOWN:
5673 pDxeCtrlBlk->hostPowerState = WLANDXE_POWER_STATE_DOWN;
5674 hostPowerState = WLANDXE_POWER_STATE_DOWN;
5675 break;
5676 default:
5677 hostPowerState = WLANDXE_POWER_STATE_MAX;
5678 }
5679
5680 // A callback i.e. ACK back is needed only when we want to enable BMPS
5681 // and the data/management path is active because we want to ensure
5682 // DXE registers are not accessed when RIVA may be power-collapsed. So
5683 // we need a callback in enter_bmps_req (the request to RIVA is sent
5684 // only after ACK back from TX thread). A callback is not needed in
5685 // finish_scan_req during BMPS since data-path is resumed only in
5686 // finish_scan_rsp and no management frames are sent in between. No
5687 // callback is needed when going from BMPS enabled to BMPS suspended/
5688 // disabled when it is known that RIVA is awake and cannot enter power
5689 // collapse autonomously so no callback is needed in exit_bmps_rsp or
5690 // init_scan_rsp
5691 if ( cBack )
5692 {
5693 //serialize through Rx thread
5694 rxCompMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
5695 if(NULL == rxCompMsg)
5696 {
5697 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5698 "WLANDXE_SetPowerState, MSG MEM alloc Fail");
5699 return eWLAN_PAL_STATUS_E_RESOURCES;
5700 }
5701
5702 /* Event type, where it must be defined???? */
5703 /* THIS MUST BE CLEARED ASAP
5704 txCompMsg->type = TX_COMPLETE; */
5705 rxCompMsg->callback = dxeRxThreadSetPowerStateEventHandler;
5706 rxCompMsg->pContext = pDxeCtrlBlk;
5707 rxCompMsg->val = hostPowerState;
5708 rxCompMsg->ptr = cBack;
5709 status = wpalPostRxMsg(WDI_GET_PAL_CTX(),
5710 rxCompMsg);
5711 if ( eWLAN_PAL_STATUS_SUCCESS != status )
5712 {
5713 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5714 "Rx thread Set power state req serialize fail status=%d",
Jeff Johnson9e237fb2013-10-30 18:46:20 -07005715 status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005716 }
5717 }
5718 else
5719 {
5720 if ( WLANDXE_POWER_STATE_FULL == hostPowerState )
5721 {
5722 if( WLANDXE_POWER_STATE_BMPS == pDxeCtrlBlk->hostPowerState )
5723 {
5724 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
5725 }
5726 else if( WLANDXE_POWER_STATE_IMPS == pDxeCtrlBlk->hostPowerState )
5727 {
5728 /* Requested Full power from exit IMPS, reenable the interrupts*/
5729 if(eWLAN_PAL_TRUE == pDxeCtrlBlk->rxIntDisabledByIMPS)
5730 {
5731 pDxeCtrlBlk->rxIntDisabledByIMPS = eWLAN_PAL_FALSE;
5732 /* Enable RX interrupt at here, if new PS is not IMPS */
5733 status = wpalEnableInterrupt(DXE_INTERRUPT_RX_READY);
5734 if(eWLAN_PAL_STATUS_SUCCESS != status)
5735 {
5736 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005737 "%s Enable RX ready interrupt fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005738 return status;
5739 }
5740 }
5741 if(eWLAN_PAL_TRUE == pDxeCtrlBlk->txIntDisabledByIMPS)
5742 {
5743 pDxeCtrlBlk->txIntDisabledByIMPS = eWLAN_PAL_FALSE;
Jeff Johnsone7245742012-09-05 17:12:55 -07005744 pDxeCtrlBlk->txIntEnable = eWLAN_PAL_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005745 /* Enable RX interrupt at here, if new PS is not IMPS */
5746 status = wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE);
5747 if(eWLAN_PAL_STATUS_SUCCESS != status)
5748 {
5749 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005750 "%s Enable TX comp interrupt fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005751 return status;
5752 }
5753 }
5754 }
5755 pDxeCtrlBlk->hostPowerState = hostPowerState;
5756 pDxeCtrlBlk->rivaPowerState = WLANDXE_RIVA_POWER_STATE_ACTIVE;
5757 }
5758 else if ( hostPowerState == WLANDXE_POWER_STATE_BMPS )
5759 {
5760 pDxeCtrlBlk->hostPowerState = hostPowerState;
5761 pDxeCtrlBlk->rivaPowerState = WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN;
5762 }
Mihir Shetea4306052014-03-25 00:02:54 +05305763 else if ( hostPowerState == WLANDXE_POWER_STATE_IMPS )
5764 {
5765 pDxeCtrlBlk->hostPowerState = WLANDXE_POWER_STATE_IMPS;
5766 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005767 else
5768 {
5769 HDXE_ASSERT(0);
5770 }
Sravan Kumar Kairam3d22ec02016-08-01 12:58:44 +05305771 DXTRACE(dxeTrace(WLANDXE_DMA_CHANNEL_MAX, TRACE_POWER_STATE,
5772 pDxeCtrlBlk->hostPowerState));
Jeff Johnson295189b2012-06-20 16:38:30 -07005773 }
5774
Sravan Kumar Kairam3d22ec02016-08-01 12:58:44 +05305775 if (WDTS_POWER_STATE_FULL == powerState &&
5776 WLANDXE_POWER_STATE_FULL == pDxeCtrlBlk->hostPowerState) {
Sravan Kumar Kairam84e995f2016-05-27 16:16:21 +05305777 state = wpal_get_int_state(DXE_INTERRUPT_RX_READY);
5778 if (0 == state && eWLAN_PAL_TRUE == pDxeCtrlBlk->rxIntDisabledByIMPS) {
5779 dxeEnvBlk.rx_imps_set_fp = 1;
5780 WARN_ON(1);
5781 }
5782 }
5783
Jeff Johnson295189b2012-06-20 16:38:30 -07005784 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005785 "%s Exit", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005786
5787 return status;
5788}
5789
5790/*==========================================================================
5791 @ Function Name
5792 WLANDXE_GetFreeTxDataResNumber
5793
5794 @ Description
5795 Returns free descriptor numbers for TX data channel (TX high priority)
5796
5797 @ Parameters
5798 pVoid pDXEContext : DXE Control Block
5799
5800 @ Return
5801 wpt_uint32 Free descriptor number of TX high pri ch
5802===========================================================================*/
5803wpt_uint32 WLANDXE_GetFreeTxDataResNumber
5804(
5805 void *pDXEContext
5806)
5807{
5808 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005809 "%s Enter", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005810
5811 if(NULL == pDXEContext)
5812 {
5813 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Jeff Johnson9e237fb2013-10-30 18:46:20 -07005814 "NULL parameter passed by caller");
Jeff Johnson295189b2012-06-20 16:38:30 -07005815 return (0);
5816 }
5817
Mihir Shetee6618162015-03-16 14:48:42 +05305818 return ((WLANDXE_CtrlBlkType *)pDXEContext)->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numFreeDesc;
Jeff Johnson295189b2012-06-20 16:38:30 -07005819}
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005820
5821/*==========================================================================
5822 @ Function Name
5823 WLANDXE_ChannelDebug
5824
5825 @ Description
5826 Display DXE Channel debugging information
5827 User may request to display DXE channel snapshot
5828 Or if host driver detects any abnormal stcuk may display
5829
5830 @ Parameters
Jeff Johnsonb88db982012-12-10 13:34:59 -08005831 displaySnapshot : Display DXE snapshot option
Mihir Shete40a55652014-03-02 14:14:47 +05305832 debugFlags : Enable stall detect features
5833 defined by WPAL_DeviceDebugFlags
5834 These features may effect
5835 data performance.
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005836
5837 @ Return
5838 NONE
5839
5840===========================================================================*/
5841void WLANDXE_ChannelDebug
5842(
Mihir Shete40a55652014-03-02 14:14:47 +05305843 wpt_boolean displaySnapshot,
5844 wpt_uint8 debugFlags
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005845)
5846{
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005847 wpt_msg *channelDebugMsg;
Mihir Shete40a55652014-03-02 14:14:47 +05305848 wpt_msg *txDescReSyncMsg ;
Mihir Shete41c41bb2014-08-18 17:37:12 +05305849 wpt_uint32 regValue, regValueLocal = 0;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005850 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5851
5852 /* Debug Type 1, Display current snapshot */
5853 if(displaySnapshot)
5854 {
5855 /* Whatever RIVA power condition try to wakeup RIVA through SMSM
5856 * This will not simply wakeup RIVA
5857 * Just incase TX not wanted stuck, Trigger TX again */
Leo Chang345ef992013-07-12 10:17:29 -07005858 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
5859 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005860 /* Get free BD count */
Leo Chang345ef992013-07-12 10:17:29 -07005861 wpalSleep(10);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005862 wpalReadRegister(WLANDXE_BMU_AVAILABLE_BD_PDU, &regValue);
Mihir Shete41c41bb2014-08-18 17:37:12 +05305863#ifdef WCN_PRONTO
5864 wpalReadRegister(WLANDXE_BMU_AVAILABLE_BD_PDU_LOCAL, &regValueLocal);
5865#endif
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005866 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
Mihir Shete41c41bb2014-08-18 17:37:12 +05305867 "===== DXE Dump Start HPS %d, FWS %d, TX PFC %d, ABD %d, ABD LOCAL %d =====",
Leo Chang345ef992013-07-12 10:17:29 -07005868 tempDxeCtrlBlk->hostPowerState, tempDxeCtrlBlk->rivaPowerState,
Mihir Shete41c41bb2014-08-18 17:37:12 +05305869 tempDxeCtrlBlk->txCompletedFrames, regValue, regValueLocal);
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005870
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07005871 wpalPacketStallUpdateInfo((wpt_uint32 *)&tempDxeCtrlBlk->rivaPowerState,
5872 &regValue,
5873 NULL,
5874 0);
Bansidhar Gopalachari609b79e2013-07-31 17:03:15 -07005875
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005876 channelDebugMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
5877 if(NULL == channelDebugMsg)
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005878 {
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005879 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5880 "WLANDXE_ChannelDebug, MSG MEM alloc Fail");
5881 return ;
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005882 }
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005883
5884 channelDebugMsg->callback = dxeRxThreadChannelDebugHandler;
5885 status = wpalPostRxMsg(WDI_GET_PAL_CTX(), channelDebugMsg);
5886 if ( eWLAN_PAL_STATUS_SUCCESS != status )
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005887 {
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07005888 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5889 "Tx thread Set power state req serialize fail status=%d",
Jeff Johnson9e237fb2013-10-30 18:46:20 -07005890 status);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005891 }
5892 }
5893
Mihir Shete40a55652014-03-02 14:14:47 +05305894 if(debugFlags & WPAL_DEBUG_TX_DESC_RESYNC)
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005895 {
Mihir Shete40a55652014-03-02 14:14:47 +05305896 txDescReSyncMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg));
5897 if(NULL == txDescReSyncMsg)
5898 {
5899 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5900 "%s: Resync MSG MEM alloc Fail",__func__);
5901 }
5902 else
5903 {
5904 txDescReSyncMsg->callback = dxeDebugTxDescReSync;
5905 txDescReSyncMsg->pContext = tempDxeCtrlBlk;
5906 status = wpalPostTxMsg(WDI_GET_PAL_CTX(),
5907 txDescReSyncMsg);
5908 if(eWLAN_PAL_STATUS_SUCCESS != status)
5909 {
5910 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5911 "%s: Post TX re-sync MSG fail",__func__);
5912 }
5913 }
5914 }
5915
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -07005916 return;
Madan Mohan Koyyalamudi48139e32012-10-11 14:43:56 -07005917}
Mihir Shete5affadc2015-05-29 20:54:57 +05305918
Sravan Kumar Kairame9d186c2015-11-27 23:37:02 +05305919/*==========================================================================
5920 @ Function Name
5921 WLANDXE_KickDxe
5922
5923 @ Description
5924 Kick DXE when HDD TX time out happen
5925
5926 @ Parameters
5927 NONE
5928
5929 @ Return
5930 NONE
5931
5932===========================================================================*/
5933void WLANDXE_KickDxe(void)
5934{
Sravan Kumar Kairamcebb2182016-01-25 20:50:11 +05305935 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
Sravan Kumar Kairame9d186c2015-11-27 23:37:02 +05305936 "%s: Kick Dxe for HDD TX timeout",__func__);
5937 /* Make wake up HW */
5938 dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
5939 dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
Sravan Kumar Kairamcebb2182016-01-25 20:50:11 +05305940 DXTRACE(dxeTrace(WLANDXE_DMA_CHANNEL_MAX, TRACE_SMSM_NOTIFY,
5941 TRACE_WLANDXE_VAR_ENABLE));
Sravan Kumar Kairame9d186c2015-11-27 23:37:02 +05305942}
5943
Mihir Shete5affadc2015-05-29 20:54:57 +05305944wpt_uint32 WLANDXE_SetupLogTransfer(wpt_uint64 bufferAddr, wpt_uint32 bufferLen)
5945{
5946 WLANDXE_ChannelCBType *channelEntry;
5947
5948 channelEntry = &tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_RX_FW_LOG];
5949
5950
5951 return dxeRXLogRefillRing(tempDxeCtrlBlk, channelEntry, bufferAddr,
5952 bufferLen);
5953}
5954
5955wpt_status WLANDXE_StartLogTransfer(void)
5956{
5957 WLANDXE_ChannelCBType *channelEntry;
5958 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
5959
5960 channelEntry = &tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_RX_FW_LOG];
5961
5962 tempDxeCtrlBlk->hostInitiatedH2H = 1;
5963 status = wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr,
5964 channelEntry->headCtrlBlk->linkedDescPhyAddr);
5965 if(eWLAN_PAL_STATUS_SUCCESS != status)
5966 {
5967 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5968 "%s Write DESC Address register fail", __func__);
5969 return status;
5970 }
5971
Abhishek Singh2b055852015-10-07 14:14:13 +05305972 status = wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr,
Mihir Shete5affadc2015-05-29 20:54:57 +05305973 channelEntry->extraConfig.chan_mask);
5974 if(eWLAN_PAL_STATUS_SUCCESS != status)
5975 {
5976 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
5977 "dxeChannelInitProgram Write RX Control register fail");
5978 return status;
5979 }
5980 return status;
5981}