blob: 4d6b57bd0b7d662a78a28fc4859435fbd0278257 [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
jagadeeshf869bba2015-04-07 20:06:21 +0530420 void
Jeff Johnson295189b2012-06-20 16:38:30 -0700421
422===========================================================================*/
jagadeeshf869bba2015-04-07 20:06:21 +0530423void dxeCommonDefaultConfig
Jeff Johnson295189b2012-06-20 16:38:30 -0700424(
425 WLANDXE_CtrlBlkType *dxeCtrlBlk
426)
427{
Jeff Johnson295189b2012-06-20 16:38:30 -0700428 dxeCtrlBlk->rxReadyCB = NULL;
429 dxeCtrlBlk->txCompCB = NULL;
430 dxeCtrlBlk->lowResourceCB = NULL;
431
432 wpalMemoryCopy(&dxeCtrlBlk->txCompInt,
433 &txCompInt,
434 sizeof(WLANDXE_TxCompIntConfigType));
Jeff Johnson295189b2012-06-20 16:38:30 -0700435}
436
437/*==========================================================================
438 @ Function Name
439 dxeChannelDefaultConfig
440
441 @ Description
442 Get defualt configuration values from pre defined structure
443 All the channels must have it's own configurations
444
445 @ Parameters
Gopichand Nakkalaa2cb10c2013-05-03 17:48:29 -0700446 WLANDXE_CtrlBlkType: *dxeCtrlBlk,
Jeff Johnson295189b2012-06-20 16:38:30 -0700447 DXE host driver main control block
448 WLANDXE_ChannelCBType *channelEntry
449 Channel specific control block
450
451 @ Return
452 wpt_status
453
454===========================================================================*/
455wpt_status dxeChannelDefaultConfig
456(
457 WLANDXE_CtrlBlkType *dxeCtrlBlk,
458 WLANDXE_ChannelCBType *channelEntry
459)
460{
461 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
462 wpt_uint32 baseAddress;
463 wpt_uint32 dxeControlRead = 0;
464 wpt_uint32 dxeControlWrite = 0;
465 wpt_uint32 dxeControlWriteValid = 0;
466 wpt_uint32 dxeControlWriteEop = 0;
467 wpt_uint32 dxeControlWriteEopInt = 0;
468 wpt_uint32 idx;
Gopichand Nakkalaa2cb10c2013-05-03 17:48:29 -0700469 wpt_uint32 rxResourceCount = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700470 WLANDXE_ChannelMappingType *mappedChannel = NULL;
471
472 /* Sanity Check */
473 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
474 {
475 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
476 "dxeLinkDescAndCtrlBlk Channel Entry is not valid");
477 return eWLAN_PAL_STATUS_E_INVAL;
478 }
479
480 for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++)
481 {
482 if(channelEntry->channelType == channelList[idx].wlanChannel)
483 {
484 mappedChannel = &channelList[idx];
485 break;
486 }
487 }
488
489 if((NULL == mappedChannel) || (WDTS_CHANNEL_MAX == idx))
490 {
491 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700492 "%s Failed to map channel", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700493 return eWLAN_PAL_STATUS_E_INVAL;
494 }
495
496 wpalMemoryCopy(&channelEntry->channelConfig,
497 mappedChannel->channelConfig,
498 sizeof(WLANDXE_ChannelConfigType));
499
500 baseAddress = channelBaseAddressList[mappedChannel->DMAChannel];
501 channelEntry->channelRegister.chDXEBaseAddr = baseAddress;
502 channelEntry->channelRegister.chDXEStatusRegAddr = baseAddress + WLANDXE_DMA_CH_STATUS_REG;
503 channelEntry->channelRegister.chDXEDesclRegAddr = baseAddress + WLANDXE_DMA_CH_DESCL_REG;
504 channelEntry->channelRegister.chDXEDeschRegAddr = baseAddress + WLANDXE_DMA_CH_DESCH_REG;
505 channelEntry->channelRegister.chDXELstDesclRegAddr = baseAddress + WLANDXE_DMA_CH_LST_DESCL_REG;
506 channelEntry->channelRegister.chDXECtrlRegAddr = baseAddress + WLANDXE_DMA_CH_CTRL_REG;
507 channelEntry->channelRegister.chDXESzRegAddr = baseAddress + WLANDXE_DMA_CH_SZ_REG;
508 channelEntry->channelRegister.chDXEDadrlRegAddr = baseAddress + WLANDXE_DMA_CH_DADRL_REG;
509 channelEntry->channelRegister.chDXEDadrhRegAddr = baseAddress + WLANDXE_DMA_CH_DADRH_REG;
510 channelEntry->channelRegister.chDXESadrlRegAddr = baseAddress + WLANDXE_DMA_CH_SADRL_REG;
511 channelEntry->channelRegister.chDXESadrhRegAddr = baseAddress + WLANDXE_DMA_CH_SADRH_REG;
512
513 /* Channel Mask?
514 * This value will control channel control register.
515 * This register will be set to trigger actual DMA transfer activate
516 * CH_N_CTRL */
517 channelEntry->extraConfig.chan_mask = 0;
518 /* Check VAL bit before processing descriptor */
519 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_EDVEN_MASK;
520 /* Use External Descriptor Linked List */
521 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_EDEN_MASK;
522 /* Enable Channel Interrupt on error */
523 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_INE_ERR_MASK;
524 /* Enable INT after XFER done */
525 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_INE_DONE_MASK;
526 /* Enable INT External Descriptor */
527 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_INE_ED_MASK;
528 /* Set Channel This is not channel, event counter, somthing wrong */
529 channelEntry->extraConfig.chan_mask |=
530 mappedChannel->DMAChannel << WLANDXE_CH_CTRL_CTR_SEL_OFFSET;
531 /* Transfer Type */
532 channelEntry->extraConfig.chan_mask |= mappedChannel->channelConfig->xfrType;
533 /* Use Short Descriptor, THIS LOOKS SOME WIERD, REVISIT */
534 if(!channelEntry->channelConfig.useShortDescFmt)
535 {
536 channelEntry->extraConfig.chan_mask |= WLANDXE_DESC_CTRL_DFMT;
537 }
538 /* TX Channel, Set DIQ bit, Clear SIQ bit since source is not WQ */
539 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
540 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
541 {
542 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_DIQ_MASK;
Siddharth Bhalb7e8e882014-10-10 16:27:47 +0530543 if (wpalWcnssIsProntoHwVer3())
544 {
Ratheesh S P36dbc932015-08-07 14:28:57 +0530545 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
Siddharth Bhalb7e8e882014-10-10 16:27:47 +0530546 "Using WQ 6 for TX Low/High PRI Channel");
547 channelEntry->channelConfig.refWQ = WLANDXE_PRONTO_TX_WQ;
548 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700549 }
550 /* RX Channel, Set SIQ bit, Clear DIQ bit since source is not WQ */
551 else if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
Mihir Shetee6618162015-03-16 14:48:42 +0530552 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType) ||
553 (WDTS_CHANNEL_RX_LOG == channelEntry->channelType))
Jeff Johnson295189b2012-06-20 16:38:30 -0700554 {
555 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_SIQ_MASK;
556 }
557 else
558 {
Mihir Shetebe94ebb2015-05-26 12:07:14 +0530559 /* This is H2H channel, TX, RX not use work Q
Jeff Johnson295189b2012-06-20 16:38:30 -0700560 * Do Nothing */
561 }
Mihir Shetebe94ebb2015-05-26 12:07:14 +0530562
563 if (WDTS_CHANNEL_RX_FW_LOG != channelEntry->channelType)
564 {
565 /* Frame Contents Swap */
566 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_SWAP_MASK;
567 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700568 /* Host System Using Little Endian */
569 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_ENDIAN_MASK;
570 /* BMU Threshold select */
571 channelEntry->extraConfig.chan_mask |=
572 channelEntry->channelConfig.bmuThdSel << WLANDXE_CH_CTRL_BTHLD_SEL_OFFSET;
573 /* EOP for control register ??? */
574 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_EOP_MASK;
575 /* Channel Priority */
576 channelEntry->extraConfig.chan_mask |= channelEntry->channelConfig.chPriority << WLANDXE_CH_CTRL_PRIO_OFFSET;
577 /* PDU REL */
578 channelEntry->extraConfig.chan_mask |= WLANDXE_DESC_CTRL_PDU_REL;
579 /* Disable DMA transfer on this channel */
580 channelEntry->extraConfig.chan_mask_read_disable = channelEntry->extraConfig.chan_mask;
581 /* Enable DMA transfer on this channel */
582 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_EN_MASK;
583 /* Channel Mask done */
584
585 /* Control Read
586 * Default Descriptor control Word value for RX ready DXE descriptor
587 * DXE engine will reference this value before DMA transfer */
588 dxeControlRead = 0;
589 /* Source is a Queue ID, not flat memory address */
Mihir Shetebe94ebb2015-05-26 12:07:14 +0530590 if (WDTS_CHANNEL_RX_FW_LOG != channelEntry->channelType)
591 dxeControlRead |= WLANDXE_DESC_CTRL_SIQ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700592 /* Transfer direction is BMU 2 Host */
Mihir Shetebe94ebb2015-05-26 12:07:14 +0530593 if (WDTS_CHANNEL_RX_FW_LOG != channelEntry->channelType)
594 dxeControlRead |= WLANDXE_DESC_CTRL_XTYPE_B2H;
595 else
596 dxeControlRead |= WLANDXE_DESC_CTRL_XTYPE_H2H;
597
Jeff Johnson295189b2012-06-20 16:38:30 -0700598 /* End of Packet, RX is single fragment */
599 dxeControlRead |= WLANDXE_DESC_CTRL_EOP;
600 /* BD Present, default YES, B2H case it must be 0 to insert BD */
601 if(!channelEntry->channelConfig.bdPresent)
602 {
603 dxeControlRead |= WLANDXE_DESC_CTRL_BDH;
604 }
605 /* Channel Priority */
606 dxeControlRead |= channelEntry->channelConfig.chPriority << WLANDXE_CH_CTRL_PRIO_OFFSET;
607 /* BMU Threshold select, only used H2B, not this case??? */
608 dxeControlRead |= channelEntry->channelConfig.bmuThdSel << WLANDXE_CH_CTRL_BTHLD_SEL_OFFSET;
609 /* PDU Release, Release BD/PDU when DMA done */
610 dxeControlRead |= WLANDXE_DESC_CTRL_PDU_REL;
611 /* Use Short Descriptor, THIS LOOKS SOME WIERD, REVISIT */
612 if(!channelEntry->channelConfig.useShortDescFmt)
613 {
614 dxeControlRead |= WLANDXE_DESC_CTRL_DFMT;
615 }
616 /* Interrupt on Descriptor done */
617 dxeControlRead |= WLANDXE_DESC_CTRL_INT;
618 /* For ready status, this Control WORD must be VALID */
619 dxeControlRead |= WLANDXE_DESC_CTRL_VALID;
Mihir Shete5affadc2015-05-29 20:54:57 +0530620
Jeff Johnson295189b2012-06-20 16:38:30 -0700621 /* Frame Contents Swap */
Mihir Shete5affadc2015-05-29 20:54:57 +0530622 if (WDTS_CHANNEL_RX_FW_LOG != channelEntry->channelType)
623 dxeControlRead |= WLANDXE_DESC_CTRL_BDT_SWAP;
624
Jeff Johnson295189b2012-06-20 16:38:30 -0700625 /* Host Little Endian */
626 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
Mihir Shetebe94ebb2015-05-26 12:07:14 +0530627 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType) ||
628 (WDTS_CHANNEL_RX_FW_LOG == channelEntry->channelType))
Jeff Johnson295189b2012-06-20 16:38:30 -0700629 {
630 dxeControlRead |= WLANDXE_DESC_CTRL_ENDIANNESS;
631 }
632
633 /* SWAP if needed */
634 channelEntry->extraConfig.cw_ctrl_read = WLANDXE_U32_SWAP_ENDIAN(dxeControlRead);
635 /* Control Read Done */
636
637 /* Control Write
638 * Write into DXE descriptor control word to TX frame
639 * DXE engine will reference this word to contorl TX DMA channel */
640 channelEntry->extraConfig.cw_ctrl_write = 0;
641 /* Transfer type, from Host 2 BMU */
642 dxeControlWrite |= mappedChannel->channelConfig->xfrType;
643 /* BD Present, this looks some weird ??? */
644 if(!channelEntry->channelConfig.bdPresent)
645 {
646 dxeControlWrite |= WLANDXE_DESC_CTRL_BDH;
647 }
648 /* Channel Priority */
649 dxeControlWrite |= channelEntry->channelConfig.chPriority << WLANDXE_CH_CTRL_PRIO_OFFSET;
650 /* Use Short Descriptor, THIS LOOKS SOME WIERD, REVISIT */
651 if(!channelEntry->channelConfig.useShortDescFmt)
652 {
653 dxeControlWrite |= WLANDXE_DESC_CTRL_DFMT;
654 }
655 /* BMU Threshold select, only used H2B, not this case??? */
656 dxeControlWrite |= channelEntry->channelConfig.bmuThdSel << WLANDXE_CH_CTRL_BTHLD_SEL_OFFSET;
657 /* Destination is WQ */
658 dxeControlWrite |= WLANDXE_DESC_CTRL_DIQ;
659 /* Frame Contents Swap */
660 dxeControlWrite |= WLANDXE_DESC_CTRL_BDT_SWAP;
661 /* Host Little Endian */
662 dxeControlWrite |= WLANDXE_DESC_CTRL_ENDIANNESS;
663 /* Interrupt Enable */
664 dxeControlWrite |= WLANDXE_DESC_CTRL_INT;
665
666 dxeControlWriteValid = dxeControlWrite | WLANDXE_DESC_CTRL_VALID;
667 dxeControlWriteEop = dxeControlWriteValid | WLANDXE_DESC_CTRL_EOP;
668 dxeControlWriteEopInt = dxeControlWriteEop | WLANDXE_DESC_CTRL_INT;
669
670 /* DXE Descriptor must has Endian swapped value */
671 channelEntry->extraConfig.cw_ctrl_write = WLANDXE_U32_SWAP_ENDIAN(dxeControlWrite);
672 /* Control Write DONE */
673
674 /* Control Write include VAL bit
675 * This Control word used to set valid bit and
676 * trigger DMA transfer for specific descriptor */
677 channelEntry->extraConfig.cw_ctrl_write_valid =
678 WLANDXE_U32_SWAP_ENDIAN(dxeControlWriteValid);
679
680 /* Control Write include EOP
681 * End of Packet */
682 channelEntry->extraConfig.cw_ctrl_write_eop =
683 WLANDXE_U32_SWAP_ENDIAN(dxeControlWriteEop);
684
685 /* Control Write include EOP and INT
686 * indicate End Of Packet and generate interrupt on descriptor Done */
687 channelEntry->extraConfig.cw_ctrl_write_eop_int =
688 WLANDXE_U32_SWAP_ENDIAN(dxeControlWriteEopInt);
689
690
691 /* size mask???? */
692 channelEntry->extraConfig.chk_size_mask =
693 mappedChannel->channelConfig->chk_size << 10;
694
695 channelEntry->extraConfig.refWQ_swapped =
696 WLANDXE_U32_SWAP_ENDIAN(channelEntry->channelConfig.refWQ);
697
698 /* Set Channel specific Interrupt mask */
699 channelEntry->extraConfig.intMask = channelInterruptMask[mappedChannel->DMAChannel];
700
701
Gopichand Nakkalaa2cb10c2013-05-03 17:48:29 -0700702 wpalGetNumRxRawPacket(&rxResourceCount);
703 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
704 (0 == rxResourceCount))
705 {
706 channelEntry->numDesc = mappedChannel->channelConfig->nDescs;
707 }
Mihir Shetee6618162015-03-16 14:48:42 +0530708 else if(WDTS_CHANNEL_RX_LOG == channelEntry->channelType)
709 {
710 channelEntry->numDesc = mappedChannel->channelConfig->nDescs;
711 }
Mihir Shetebe94ebb2015-05-26 12:07:14 +0530712 else if(WDTS_CHANNEL_RX_FW_LOG == channelEntry->channelType)
713 {
714 channelEntry->numDesc = mappedChannel->channelConfig->nDescs;
715 }
Gopichand Nakkalaa2cb10c2013-05-03 17:48:29 -0700716 else
717 {
718 channelEntry->numDesc = rxResourceCount / 4;
719 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700720 channelEntry->assignedDMAChannel = mappedChannel->DMAChannel;
721 channelEntry->numFreeDesc = 0;
722 channelEntry->numRsvdDesc = 0;
Karthick S3254c5d2015-04-28 15:06:17 +0530723 channelEntry->desc_write_fail_count = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700724 channelEntry->numFragmentCurrentChain = 0;
725 channelEntry->numTotalFrame = 0;
726 channelEntry->hitLowResource = eWLAN_PAL_FALSE;
727
728 return status;
729}