blob: 29317e8eaa681c2799e671f05146e272dbabf5a0 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Mihir Shete96cd1902015-03-04 15:47:31 +05302 * Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
Kiet Lam842dad02014-02-18 18:44:02 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080020 */
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_cfg_i.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_i.h"
65
66/*----------------------------------------------------------------------------
67 * Preprocessor Definitions and Constants
68 * -------------------------------------------------------------------------*/
69typedef struct
70{
71 WDTS_ChannelType wlanChannel;
72 WLANDXE_DMAChannelType DMAChannel;
73 WLANDXE_ChannelConfigType *channelConfig;
74} WLANDXE_ChannelMappingType;
75
76wpt_uint32 channelBaseAddressList[WLANDXE_DMA_CHANNEL_MAX] =
77{
78 WLANDXE_DMA_CHAN0_BASE_ADDRESS,
79 WLANDXE_DMA_CHAN1_BASE_ADDRESS,
80 WLANDXE_DMA_CHAN2_BASE_ADDRESS,
81 WLANDXE_DMA_CHAN3_BASE_ADDRESS,
82 WLANDXE_DMA_CHAN4_BASE_ADDRESS,
83 WLANDXE_DMA_CHAN5_BASE_ADDRESS,
Mihir Shetebe94ebb2015-05-26 12:07:14 +053084 WLANDXE_DMA_CHAN6_BASE_ADDRESS,
85 WLANDXE_DMA_CHAN7_BASE_ADDRESS
Jeff Johnson295189b2012-06-20 16:38:30 -070086};
87
88wpt_uint32 channelInterruptMask[WLANDXE_DMA_CHANNEL_MAX] =
89{
90 WLANDXE_INT_MASK_CHAN_0,
91 WLANDXE_INT_MASK_CHAN_1,
92 WLANDXE_INT_MASK_CHAN_2,
93 WLANDXE_INT_MASK_CHAN_3,
94 WLANDXE_INT_MASK_CHAN_4,
95 WLANDXE_INT_MASK_CHAN_5,
Mihir Shetebe94ebb2015-05-26 12:07:14 +053096 WLANDXE_INT_MASK_CHAN_6,
97 WLANDXE_INT_MASK_CHAN_7
Jeff Johnson295189b2012-06-20 16:38:30 -070098};
99
100WLANDXE_ChannelConfigType chanTXLowPriConfig =
101{
102 /* Q handle type, Circular */
103 WLANDXE_CHANNEL_HANDLE_CIRCULA,
104
105 /* Number of Descriptor, NOT CLEAR YET !!! */
106 WLANDXE_LO_PRI_RES_NUM ,
107
108 /* MAX num RX Buffer */
109 0,
110
111 /* Reference WQ, TX23 */
112 23,
113
114 /* USB Only, End point info */
115 0,
116
117 /* Transfer Type */
118 WLANDXE_DESC_CTRL_XTYPE_H2B,
119
120 /* Channel Priority 7(Highest) - 0(Lowest) NOT CLEAR YET !!! */
121 4,
122
123 /* BD attached to frames for this pipe */
124 eWLAN_PAL_TRUE,
125
126 /* chk_size, NOT CLEAR YET !!!*/
127 0,
128
129 /* bmuThdSel, NOT CLEAR YET !!! */
130 5,
131
132 /* Added in Gen5 for Prefetch, NOT CLEAR YET !!! */
133 eWLAN_PAL_TRUE,
134
135 /* Use short Descriptor */
136 eWLAN_PAL_TRUE
137};
138
139WLANDXE_ChannelConfigType chanTXHighPriConfig =
140{
141 /* Q handle type, Circular */
142 WLANDXE_CHANNEL_HANDLE_CIRCULA,
143
144 /* Number of Descriptor, NOT CLEAR YET !!! */
145 WLANDXE_HI_PRI_RES_NUM ,
146
147 /* MAX num RX Buffer */
148 0,
149
150 /* Reference WQ, TX23 */
151 23,
152
153 /* USB Only, End point info */
154 0,
155
156 /* Transfer Type */
157 WLANDXE_DESC_CTRL_XTYPE_H2B,
158
159 /* Channel Priority 7(Highest) - 0(Lowest), NOT CLEAR YET !!! */
160 6,
161
162 /* BD attached to frames for this pipe */
163 eWLAN_PAL_TRUE,
164
165 /* chk_size, NOT CLEAR YET !!!*/
166 0,
167
168 /* bmuThdSel, NOT CLEAR YET !!! */
169 7,
170
171 /* Added in Gen5 for Prefetch, NOT CLEAR YET !!!*/
172 eWLAN_PAL_TRUE,
173
174 /* Use short Descriptor */
175 eWLAN_PAL_TRUE
176};
177
178WLANDXE_ChannelConfigType chanRXLowPriConfig =
179{
180 /* Q handle type, Circular */
181 WLANDXE_CHANNEL_HANDLE_CIRCULA,
182
183 /* Number of Descriptor, NOT CLEAR YET !!! */
Mohit Khanna5ef35f42012-09-11 15:58:51 -0700184 256,
Jeff Johnson295189b2012-06-20 16:38:30 -0700185
186 /* MAX num RX Buffer, NOT CLEAR YET !!! */
187 1,
188
189 /* Reference WQ, NOT CLEAR YET !!! */
190 /* Temporary BMU Work Q 4 */
191 11,
192
193 /* USB Only, End point info */
194 0,
195
196 /* Transfer Type */
197 WLANDXE_DESC_CTRL_XTYPE_B2H,
198
199 /* Channel Priority 7(Highest) - 0(Lowest), NOT CLEAR YET !!! */
200 5,
201
202 /* BD attached to frames for this pipe */
203 eWLAN_PAL_TRUE,
204
205 /* chk_size, NOT CLEAR YET !!!*/
206 0,
207
208 /* bmuThdSel, NOT CLEAR YET !!! */
209 6,
210
211 /* Added in Gen5 for Prefetch, NOT CLEAR YET !!!*/
212 eWLAN_PAL_TRUE,
213
214 /* Use short Descriptor */
215 eWLAN_PAL_TRUE
216};
217
218WLANDXE_ChannelConfigType chanRXHighPriConfig =
219{
220 /* Q handle type, Circular */
221 WLANDXE_CHANNEL_HANDLE_CIRCULA,
222
223 /* Number of Descriptor, NOT CLEAR YET !!! */
Mohit Khanna5ef35f42012-09-11 15:58:51 -0700224 256,
Jeff Johnson295189b2012-06-20 16:38:30 -0700225
226 /* MAX num RX Buffer, NOT CLEAR YET !!! */
227 1,
228
229 /* Reference WQ, RX11 */
230 4,
231
232 /* USB Only, End point info */
233 0,
234
235 /* Transfer Type */
236 WLANDXE_DESC_CTRL_XTYPE_B2H,
237
238 /* Channel Priority 7(Highest) - 0(Lowest), NOT CLEAR YET !!! */
239 6,
240
241 /* BD attached to frames for this pipe */
242 eWLAN_PAL_TRUE,
243
244 /* chk_size, NOT CLEAR YET !!!*/
245 0,
246
247 /* bmuThdSel, NOT CLEAR YET !!! */
248 8,
249
250 /* Added in Gen5 for Prefetch, NOT CLEAR YET !!!*/
251 eWLAN_PAL_TRUE,
252
253 /* Use short Descriptor */
254 eWLAN_PAL_TRUE
255};
256
Mihir Shetee6618162015-03-16 14:48:42 +0530257WLANDXE_ChannelConfigType chanRXLogConfig =
258{
259 /* Q handle type, Circular */
260 WLANDXE_CHANNEL_HANDLE_CIRCULA,
261
262 /* Number of Descriptors*/
263 8,
264
265 /* MAX num RX Buffer*/
266 1,
267
268 /* Reference WQ, RX23 */
269 23,
270
271 /* USB Only, End point info */
272 0,
273
274 /* Transfer Type */
275 WLANDXE_DESC_CTRL_XTYPE_B2H,
276
277 /* Channel Priority 7(Highest) - 0(Lowest)*/
Mihir Shetebe94ebb2015-05-26 12:07:14 +0530278 1,
279
280 /* BD attached to frames for this pipe */
281 eWLAN_PAL_TRUE,
282
283 /* chk_size*/
284 0,
285
286 /* bmuThdSel*/
287 8,
288
289 /* Added in Gen5 for Prefetch*/
290 eWLAN_PAL_TRUE,
291
292 /* Use short Descriptor */
293 eWLAN_PAL_TRUE
294};
295
296WLANDXE_ChannelConfigType chanRXFWLogConfig =
297{
298 /* Q handle type, Circular */
299 WLANDXE_CHANNEL_HANDLE_CIRCULA,
300
301 /* Number of Descriptors*/
302 32,
303
304 /* MAX num RX Buffer*/
305 1,
306
307 /* Reference WQ - NA as channel used for H2H */
308 0,
309
310 /* USB Only, End point info */
311 0,
312
313 /* Transfer Type */
314 WLANDXE_DESC_CTRL_XTYPE_H2H,
315
316 /* Channel Priority 7(Highest) - 0(Lowest)*/
Mihir Shetee6618162015-03-16 14:48:42 +0530317 0,
318
319 /* BD attached to frames for this pipe */
320 eWLAN_PAL_TRUE,
321
322 /* chk_size*/
323 0,
324
325 /* bmuThdSel*/
326 8,
327
328 /* Added in Gen5 for Prefetch*/
329 eWLAN_PAL_TRUE,
330
331 /* Use short Descriptor */
332 eWLAN_PAL_TRUE
333};
334
Jeff Johnson295189b2012-06-20 16:38:30 -0700335WLANDXE_ChannelMappingType channelList[WDTS_CHANNEL_MAX] =
336{
337 {WDTS_CHANNEL_TX_LOW_PRI, WLANDXE_DMA_CHANNEL_0, &chanTXLowPriConfig},
338 {WDTS_CHANNEL_TX_HIGH_PRI, WLANDXE_DMA_CHANNEL_4, &chanTXHighPriConfig},
339 {WDTS_CHANNEL_RX_LOW_PRI, WLANDXE_DMA_CHANNEL_1, &chanRXLowPriConfig},
Jeff Johnson295189b2012-06-20 16:38:30 -0700340 {WDTS_CHANNEL_RX_HIGH_PRI, WLANDXE_DMA_CHANNEL_3, &chanRXHighPriConfig},
Mihir Shetee6618162015-03-16 14:48:42 +0530341 {WDTS_CHANNEL_RX_LOG, WLANDXE_DMA_CHANNEL_5, &chanRXLogConfig},
Mihir Shetebe94ebb2015-05-26 12:07:14 +0530342 {WDTS_CHANNEL_RX_FW_LOG, WLANDXE_DMA_CHANNEL_7, &chanRXFWLogConfig},
Jeff Johnson295189b2012-06-20 16:38:30 -0700343};
344
345WLANDXE_TxCompIntConfigType txCompInt =
346{
347 /* TX Complete Interrupt enable method */
348 WLANDXE_TX_COMP_INT_PER_K_FRAMES,
349
350 /* TX Low Resource remaining resource threshold for Low Pri Ch */
351 WLANDXE_TX_LOW_RES_THRESHOLD,
352
353 /* TX Low Resource remaining resource threshold for High Pri Ch */
354 WLANDXE_TX_LOW_RES_THRESHOLD,
355
356 /* RX Low Resource remaining resource threshold */
357 5,
358
359 /* Per K frame enable Interrupt */
360 /*WLANDXE_HI_PRI_RES_NUM*/ 5,
361
362 /* Periodic timer msec */
363 10
364};
365
Mihir Shetee6618162015-03-16 14:48:42 +0530366// Indicates the DXE channels being used in the current run.
367static wpt_uint8 dxeEnabledChannels;
368
369/*==========================================================================
370 @ Function Name
371 dxeSetEnabledChannels
372
373 @ Description
374
375 @ Parameters
376
377 @ Return
378 void
379
380===========================================================================*/
381void dxeSetEnabledChannels
382(
383 wpt_uint8 enabledChannels
384)
385{
386 dxeEnabledChannels = enabledChannels;
387}
388
389/*==========================================================================
390 @ Function Name
391 dxeGetEnabledChannels
392
393 @ Description
394
395 @ Parameters
396
397 @ Return
398 wpt_uint8
399
400===========================================================================*/
401wpt_uint8 dxeGetEnabledChannels
402(
403 void
404)
405{
406 return dxeEnabledChannels;
407}
408
Jeff Johnson295189b2012-06-20 16:38:30 -0700409/*==========================================================================
410 @ Function Name
411 dxeCommonDefaultConfig
412
413 @ Description
414
415 @ Parameters
416 WLANDXE_CtrlBlkType *dxeCtrlBlk,
417 DXE host driver main control block
418
419 @ Return
420 wpt_status
421
422===========================================================================*/
423wpt_status dxeCommonDefaultConfig
424(
425 WLANDXE_CtrlBlkType *dxeCtrlBlk
426)
427{
428 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
429
430 dxeCtrlBlk->rxReadyCB = NULL;
431 dxeCtrlBlk->txCompCB = NULL;
432 dxeCtrlBlk->lowResourceCB = NULL;
433
434 wpalMemoryCopy(&dxeCtrlBlk->txCompInt,
435 &txCompInt,
436 sizeof(WLANDXE_TxCompIntConfigType));
437
438 return status;
439}
440
441/*==========================================================================
442 @ Function Name
443 dxeChannelDefaultConfig
444
445 @ Description
446 Get defualt configuration values from pre defined structure
447 All the channels must have it's own configurations
448
449 @ Parameters
Gopichand Nakkalaa2cb10c2013-05-03 17:48:29 -0700450 WLANDXE_CtrlBlkType: *dxeCtrlBlk,
Jeff Johnson295189b2012-06-20 16:38:30 -0700451 DXE host driver main control block
452 WLANDXE_ChannelCBType *channelEntry
453 Channel specific control block
454
455 @ Return
456 wpt_status
457
458===========================================================================*/
459wpt_status dxeChannelDefaultConfig
460(
461 WLANDXE_CtrlBlkType *dxeCtrlBlk,
462 WLANDXE_ChannelCBType *channelEntry
463)
464{
465 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
466 wpt_uint32 baseAddress;
467 wpt_uint32 dxeControlRead = 0;
468 wpt_uint32 dxeControlWrite = 0;
469 wpt_uint32 dxeControlWriteValid = 0;
470 wpt_uint32 dxeControlWriteEop = 0;
471 wpt_uint32 dxeControlWriteEopInt = 0;
472 wpt_uint32 idx;
Gopichand Nakkalaa2cb10c2013-05-03 17:48:29 -0700473 wpt_uint32 rxResourceCount = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700474 WLANDXE_ChannelMappingType *mappedChannel = NULL;
475
476 /* Sanity Check */
477 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
478 {
479 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
480 "dxeLinkDescAndCtrlBlk Channel Entry is not valid");
481 return eWLAN_PAL_STATUS_E_INVAL;
482 }
483
484 for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++)
485 {
486 if(channelEntry->channelType == channelList[idx].wlanChannel)
487 {
488 mappedChannel = &channelList[idx];
489 break;
490 }
491 }
492
493 if((NULL == mappedChannel) || (WDTS_CHANNEL_MAX == idx))
494 {
495 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700496 "%s Failed to map channel", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700497 return eWLAN_PAL_STATUS_E_INVAL;
498 }
499
500 wpalMemoryCopy(&channelEntry->channelConfig,
501 mappedChannel->channelConfig,
502 sizeof(WLANDXE_ChannelConfigType));
503
504 baseAddress = channelBaseAddressList[mappedChannel->DMAChannel];
505 channelEntry->channelRegister.chDXEBaseAddr = baseAddress;
506 channelEntry->channelRegister.chDXEStatusRegAddr = baseAddress + WLANDXE_DMA_CH_STATUS_REG;
507 channelEntry->channelRegister.chDXEDesclRegAddr = baseAddress + WLANDXE_DMA_CH_DESCL_REG;
508 channelEntry->channelRegister.chDXEDeschRegAddr = baseAddress + WLANDXE_DMA_CH_DESCH_REG;
509 channelEntry->channelRegister.chDXELstDesclRegAddr = baseAddress + WLANDXE_DMA_CH_LST_DESCL_REG;
510 channelEntry->channelRegister.chDXECtrlRegAddr = baseAddress + WLANDXE_DMA_CH_CTRL_REG;
511 channelEntry->channelRegister.chDXESzRegAddr = baseAddress + WLANDXE_DMA_CH_SZ_REG;
512 channelEntry->channelRegister.chDXEDadrlRegAddr = baseAddress + WLANDXE_DMA_CH_DADRL_REG;
513 channelEntry->channelRegister.chDXEDadrhRegAddr = baseAddress + WLANDXE_DMA_CH_DADRH_REG;
514 channelEntry->channelRegister.chDXESadrlRegAddr = baseAddress + WLANDXE_DMA_CH_SADRL_REG;
515 channelEntry->channelRegister.chDXESadrhRegAddr = baseAddress + WLANDXE_DMA_CH_SADRH_REG;
516
517 /* Channel Mask?
518 * This value will control channel control register.
519 * This register will be set to trigger actual DMA transfer activate
520 * CH_N_CTRL */
521 channelEntry->extraConfig.chan_mask = 0;
522 /* Check VAL bit before processing descriptor */
523 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_EDVEN_MASK;
524 /* Use External Descriptor Linked List */
525 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_EDEN_MASK;
526 /* Enable Channel Interrupt on error */
527 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_INE_ERR_MASK;
528 /* Enable INT after XFER done */
529 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_INE_DONE_MASK;
530 /* Enable INT External Descriptor */
531 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_INE_ED_MASK;
532 /* Set Channel This is not channel, event counter, somthing wrong */
533 channelEntry->extraConfig.chan_mask |=
534 mappedChannel->DMAChannel << WLANDXE_CH_CTRL_CTR_SEL_OFFSET;
535 /* Transfer Type */
536 channelEntry->extraConfig.chan_mask |= mappedChannel->channelConfig->xfrType;
537 /* Use Short Descriptor, THIS LOOKS SOME WIERD, REVISIT */
538 if(!channelEntry->channelConfig.useShortDescFmt)
539 {
540 channelEntry->extraConfig.chan_mask |= WLANDXE_DESC_CTRL_DFMT;
541 }
542 /* TX Channel, Set DIQ bit, Clear SIQ bit since source is not WQ */
543 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
544 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
545 {
546 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_DIQ_MASK;
Siddharth Bhalb7e8e882014-10-10 16:27:47 +0530547 if (wpalWcnssIsProntoHwVer3())
548 {
549 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
550 "Using WQ 6 for TX Low/High PRI Channel");
551 channelEntry->channelConfig.refWQ = WLANDXE_PRONTO_TX_WQ;
552 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700553 }
554 /* RX Channel, Set SIQ bit, Clear DIQ bit since source is not WQ */
555 else if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
Mihir Shetee6618162015-03-16 14:48:42 +0530556 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType) ||
557 (WDTS_CHANNEL_RX_LOG == channelEntry->channelType))
Jeff Johnson295189b2012-06-20 16:38:30 -0700558 {
559 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_SIQ_MASK;
560 }
561 else
562 {
Mihir Shetebe94ebb2015-05-26 12:07:14 +0530563 /* This is H2H channel, TX, RX not use work Q
Jeff Johnson295189b2012-06-20 16:38:30 -0700564 * Do Nothing */
565 }
Mihir Shetebe94ebb2015-05-26 12:07:14 +0530566
567 if (WDTS_CHANNEL_RX_FW_LOG != channelEntry->channelType)
568 {
569 /* Frame Contents Swap */
570 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_SWAP_MASK;
571 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700572 /* Host System Using Little Endian */
573 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_ENDIAN_MASK;
574 /* BMU Threshold select */
575 channelEntry->extraConfig.chan_mask |=
576 channelEntry->channelConfig.bmuThdSel << WLANDXE_CH_CTRL_BTHLD_SEL_OFFSET;
577 /* EOP for control register ??? */
578 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_EOP_MASK;
579 /* Channel Priority */
580 channelEntry->extraConfig.chan_mask |= channelEntry->channelConfig.chPriority << WLANDXE_CH_CTRL_PRIO_OFFSET;
581 /* PDU REL */
582 channelEntry->extraConfig.chan_mask |= WLANDXE_DESC_CTRL_PDU_REL;
583 /* Disable DMA transfer on this channel */
584 channelEntry->extraConfig.chan_mask_read_disable = channelEntry->extraConfig.chan_mask;
585 /* Enable DMA transfer on this channel */
586 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_EN_MASK;
587 /* Channel Mask done */
588
589 /* Control Read
590 * Default Descriptor control Word value for RX ready DXE descriptor
591 * DXE engine will reference this value before DMA transfer */
592 dxeControlRead = 0;
593 /* Source is a Queue ID, not flat memory address */
Mihir Shetebe94ebb2015-05-26 12:07:14 +0530594 if (WDTS_CHANNEL_RX_FW_LOG != channelEntry->channelType)
595 dxeControlRead |= WLANDXE_DESC_CTRL_SIQ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700596 /* Transfer direction is BMU 2 Host */
Mihir Shetebe94ebb2015-05-26 12:07:14 +0530597 if (WDTS_CHANNEL_RX_FW_LOG != channelEntry->channelType)
598 dxeControlRead |= WLANDXE_DESC_CTRL_XTYPE_B2H;
599 else
600 dxeControlRead |= WLANDXE_DESC_CTRL_XTYPE_H2H;
601
Jeff Johnson295189b2012-06-20 16:38:30 -0700602 /* End of Packet, RX is single fragment */
603 dxeControlRead |= WLANDXE_DESC_CTRL_EOP;
604 /* BD Present, default YES, B2H case it must be 0 to insert BD */
605 if(!channelEntry->channelConfig.bdPresent)
606 {
607 dxeControlRead |= WLANDXE_DESC_CTRL_BDH;
608 }
609 /* Channel Priority */
610 dxeControlRead |= channelEntry->channelConfig.chPriority << WLANDXE_CH_CTRL_PRIO_OFFSET;
611 /* BMU Threshold select, only used H2B, not this case??? */
612 dxeControlRead |= channelEntry->channelConfig.bmuThdSel << WLANDXE_CH_CTRL_BTHLD_SEL_OFFSET;
613 /* PDU Release, Release BD/PDU when DMA done */
614 dxeControlRead |= WLANDXE_DESC_CTRL_PDU_REL;
615 /* Use Short Descriptor, THIS LOOKS SOME WIERD, REVISIT */
616 if(!channelEntry->channelConfig.useShortDescFmt)
617 {
618 dxeControlRead |= WLANDXE_DESC_CTRL_DFMT;
619 }
620 /* Interrupt on Descriptor done */
621 dxeControlRead |= WLANDXE_DESC_CTRL_INT;
622 /* For ready status, this Control WORD must be VALID */
623 dxeControlRead |= WLANDXE_DESC_CTRL_VALID;
624 /* Frame Contents Swap */
625 dxeControlRead |= WLANDXE_DESC_CTRL_BDT_SWAP;
626 /* Host Little Endian */
627 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
Mihir Shetebe94ebb2015-05-26 12:07:14 +0530628 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType) ||
629 (WDTS_CHANNEL_RX_FW_LOG == channelEntry->channelType))
Jeff Johnson295189b2012-06-20 16:38:30 -0700630 {
631 dxeControlRead |= WLANDXE_DESC_CTRL_ENDIANNESS;
632 }
633
634 /* SWAP if needed */
635 channelEntry->extraConfig.cw_ctrl_read = WLANDXE_U32_SWAP_ENDIAN(dxeControlRead);
636 /* Control Read Done */
637
638 /* Control Write
639 * Write into DXE descriptor control word to TX frame
640 * DXE engine will reference this word to contorl TX DMA channel */
641 channelEntry->extraConfig.cw_ctrl_write = 0;
642 /* Transfer type, from Host 2 BMU */
643 dxeControlWrite |= mappedChannel->channelConfig->xfrType;
644 /* BD Present, this looks some weird ??? */
645 if(!channelEntry->channelConfig.bdPresent)
646 {
647 dxeControlWrite |= WLANDXE_DESC_CTRL_BDH;
648 }
649 /* Channel Priority */
650 dxeControlWrite |= channelEntry->channelConfig.chPriority << WLANDXE_CH_CTRL_PRIO_OFFSET;
651 /* Use Short Descriptor, THIS LOOKS SOME WIERD, REVISIT */
652 if(!channelEntry->channelConfig.useShortDescFmt)
653 {
654 dxeControlWrite |= WLANDXE_DESC_CTRL_DFMT;
655 }
656 /* BMU Threshold select, only used H2B, not this case??? */
657 dxeControlWrite |= channelEntry->channelConfig.bmuThdSel << WLANDXE_CH_CTRL_BTHLD_SEL_OFFSET;
658 /* Destination is WQ */
659 dxeControlWrite |= WLANDXE_DESC_CTRL_DIQ;
660 /* Frame Contents Swap */
661 dxeControlWrite |= WLANDXE_DESC_CTRL_BDT_SWAP;
662 /* Host Little Endian */
663 dxeControlWrite |= WLANDXE_DESC_CTRL_ENDIANNESS;
664 /* Interrupt Enable */
665 dxeControlWrite |= WLANDXE_DESC_CTRL_INT;
666
667 dxeControlWriteValid = dxeControlWrite | WLANDXE_DESC_CTRL_VALID;
668 dxeControlWriteEop = dxeControlWriteValid | WLANDXE_DESC_CTRL_EOP;
669 dxeControlWriteEopInt = dxeControlWriteEop | WLANDXE_DESC_CTRL_INT;
670
671 /* DXE Descriptor must has Endian swapped value */
672 channelEntry->extraConfig.cw_ctrl_write = WLANDXE_U32_SWAP_ENDIAN(dxeControlWrite);
673 /* Control Write DONE */
674
675 /* Control Write include VAL bit
676 * This Control word used to set valid bit and
677 * trigger DMA transfer for specific descriptor */
678 channelEntry->extraConfig.cw_ctrl_write_valid =
679 WLANDXE_U32_SWAP_ENDIAN(dxeControlWriteValid);
680
681 /* Control Write include EOP
682 * End of Packet */
683 channelEntry->extraConfig.cw_ctrl_write_eop =
684 WLANDXE_U32_SWAP_ENDIAN(dxeControlWriteEop);
685
686 /* Control Write include EOP and INT
687 * indicate End Of Packet and generate interrupt on descriptor Done */
688 channelEntry->extraConfig.cw_ctrl_write_eop_int =
689 WLANDXE_U32_SWAP_ENDIAN(dxeControlWriteEopInt);
690
691
692 /* size mask???? */
693 channelEntry->extraConfig.chk_size_mask =
694 mappedChannel->channelConfig->chk_size << 10;
695
696 channelEntry->extraConfig.refWQ_swapped =
697 WLANDXE_U32_SWAP_ENDIAN(channelEntry->channelConfig.refWQ);
698
699 /* Set Channel specific Interrupt mask */
700 channelEntry->extraConfig.intMask = channelInterruptMask[mappedChannel->DMAChannel];
701
702
Gopichand Nakkalaa2cb10c2013-05-03 17:48:29 -0700703 wpalGetNumRxRawPacket(&rxResourceCount);
704 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
705 (0 == rxResourceCount))
706 {
707 channelEntry->numDesc = mappedChannel->channelConfig->nDescs;
708 }
Mihir Shetee6618162015-03-16 14:48:42 +0530709 else if(WDTS_CHANNEL_RX_LOG == channelEntry->channelType)
710 {
711 channelEntry->numDesc = mappedChannel->channelConfig->nDescs;
712 }
Mihir Shetebe94ebb2015-05-26 12:07:14 +0530713 else if(WDTS_CHANNEL_RX_FW_LOG == channelEntry->channelType)
714 {
715 channelEntry->numDesc = mappedChannel->channelConfig->nDescs;
716 }
Gopichand Nakkalaa2cb10c2013-05-03 17:48:29 -0700717 else
718 {
719 channelEntry->numDesc = rxResourceCount / 4;
720 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700721 channelEntry->assignedDMAChannel = mappedChannel->DMAChannel;
722 channelEntry->numFreeDesc = 0;
723 channelEntry->numRsvdDesc = 0;
Karthick S3254c5d2015-04-28 15:06:17 +0530724 channelEntry->desc_write_fail_count = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700725 channelEntry->numFragmentCurrentChain = 0;
726 channelEntry->numTotalFrame = 0;
727 channelEntry->hitLowResource = eWLAN_PAL_FALSE;
728
729 return status;
730}