blob: 147931729901556568b39993fbab1c3ea6e1c501 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Kiet Lam842dad02014-02-18 18:44:02 -08002 * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved.
3 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
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.
35 Copyright (c) 2011 QUALCOMM Incorporated.
36 All Rights Reserved.
37 Qualcomm Confidential and Proprietary
38========================================================================*/
39
40/*===========================================================================
41
42 EDIT HISTORY FOR FILE
43
44
45 This section contains comments describing changes made to the module.
46 Notice that changes are listed in reverse chronological order.
47
48
49 $Header:$ $DateTime: $ $Author: $
50
51
52when who what, where, why
53-------- --- ----------------------------------------------------------
5408/03/10 schang Created module.
55
56===========================================================================*/
57
58/*===========================================================================
59
60 INCLUDE FILES FOR MODULE
61
62===========================================================================*/
63
64/*----------------------------------------------------------------------------
65 * Include Files
66 * -------------------------------------------------------------------------*/
67#include "wlan_qct_dxe_i.h"
68
69/*----------------------------------------------------------------------------
70 * Preprocessor Definitions and Constants
71 * -------------------------------------------------------------------------*/
72typedef struct
73{
74 WDTS_ChannelType wlanChannel;
75 WLANDXE_DMAChannelType DMAChannel;
76 WLANDXE_ChannelConfigType *channelConfig;
77} WLANDXE_ChannelMappingType;
78
79wpt_uint32 channelBaseAddressList[WLANDXE_DMA_CHANNEL_MAX] =
80{
81 WLANDXE_DMA_CHAN0_BASE_ADDRESS,
82 WLANDXE_DMA_CHAN1_BASE_ADDRESS,
83 WLANDXE_DMA_CHAN2_BASE_ADDRESS,
84 WLANDXE_DMA_CHAN3_BASE_ADDRESS,
85 WLANDXE_DMA_CHAN4_BASE_ADDRESS,
86 WLANDXE_DMA_CHAN5_BASE_ADDRESS,
87 WLANDXE_DMA_CHAN6_BASE_ADDRESS
88};
89
90wpt_uint32 channelInterruptMask[WLANDXE_DMA_CHANNEL_MAX] =
91{
92 WLANDXE_INT_MASK_CHAN_0,
93 WLANDXE_INT_MASK_CHAN_1,
94 WLANDXE_INT_MASK_CHAN_2,
95 WLANDXE_INT_MASK_CHAN_3,
96 WLANDXE_INT_MASK_CHAN_4,
97 WLANDXE_INT_MASK_CHAN_5,
98 WLANDXE_INT_MASK_CHAN_6
99};
100
101WLANDXE_ChannelConfigType chanTXLowPriConfig =
102{
103 /* Q handle type, Circular */
104 WLANDXE_CHANNEL_HANDLE_CIRCULA,
105
106 /* Number of Descriptor, NOT CLEAR YET !!! */
107 WLANDXE_LO_PRI_RES_NUM ,
108
109 /* MAX num RX Buffer */
110 0,
111
112 /* Reference WQ, TX23 */
113 23,
114
115 /* USB Only, End point info */
116 0,
117
118 /* Transfer Type */
119 WLANDXE_DESC_CTRL_XTYPE_H2B,
120
121 /* Channel Priority 7(Highest) - 0(Lowest) NOT CLEAR YET !!! */
122 4,
123
124 /* BD attached to frames for this pipe */
125 eWLAN_PAL_TRUE,
126
127 /* chk_size, NOT CLEAR YET !!!*/
128 0,
129
130 /* bmuThdSel, NOT CLEAR YET !!! */
131 5,
132
133 /* Added in Gen5 for Prefetch, NOT CLEAR YET !!! */
134 eWLAN_PAL_TRUE,
135
136 /* Use short Descriptor */
137 eWLAN_PAL_TRUE
138};
139
140WLANDXE_ChannelConfigType chanTXHighPriConfig =
141{
142 /* Q handle type, Circular */
143 WLANDXE_CHANNEL_HANDLE_CIRCULA,
144
145 /* Number of Descriptor, NOT CLEAR YET !!! */
146 WLANDXE_HI_PRI_RES_NUM ,
147
148 /* MAX num RX Buffer */
149 0,
150
151 /* Reference WQ, TX23 */
152 23,
153
154 /* USB Only, End point info */
155 0,
156
157 /* Transfer Type */
158 WLANDXE_DESC_CTRL_XTYPE_H2B,
159
160 /* Channel Priority 7(Highest) - 0(Lowest), NOT CLEAR YET !!! */
161 6,
162
163 /* BD attached to frames for this pipe */
164 eWLAN_PAL_TRUE,
165
166 /* chk_size, NOT CLEAR YET !!!*/
167 0,
168
169 /* bmuThdSel, NOT CLEAR YET !!! */
170 7,
171
172 /* Added in Gen5 for Prefetch, NOT CLEAR YET !!!*/
173 eWLAN_PAL_TRUE,
174
175 /* Use short Descriptor */
176 eWLAN_PAL_TRUE
177};
178
179WLANDXE_ChannelConfigType chanRXLowPriConfig =
180{
181 /* Q handle type, Circular */
182 WLANDXE_CHANNEL_HANDLE_CIRCULA,
183
184 /* Number of Descriptor, NOT CLEAR YET !!! */
Mohit Khanna5ef35f42012-09-11 15:58:51 -0700185 256,
Jeff Johnson295189b2012-06-20 16:38:30 -0700186
187 /* MAX num RX Buffer, NOT CLEAR YET !!! */
188 1,
189
190 /* Reference WQ, NOT CLEAR YET !!! */
191 /* Temporary BMU Work Q 4 */
192 11,
193
194 /* USB Only, End point info */
195 0,
196
197 /* Transfer Type */
198 WLANDXE_DESC_CTRL_XTYPE_B2H,
199
200 /* Channel Priority 7(Highest) - 0(Lowest), NOT CLEAR YET !!! */
201 5,
202
203 /* BD attached to frames for this pipe */
204 eWLAN_PAL_TRUE,
205
206 /* chk_size, NOT CLEAR YET !!!*/
207 0,
208
209 /* bmuThdSel, NOT CLEAR YET !!! */
210 6,
211
212 /* Added in Gen5 for Prefetch, NOT CLEAR YET !!!*/
213 eWLAN_PAL_TRUE,
214
215 /* Use short Descriptor */
216 eWLAN_PAL_TRUE
217};
218
219WLANDXE_ChannelConfigType chanRXHighPriConfig =
220{
221 /* Q handle type, Circular */
222 WLANDXE_CHANNEL_HANDLE_CIRCULA,
223
224 /* Number of Descriptor, NOT CLEAR YET !!! */
Mohit Khanna5ef35f42012-09-11 15:58:51 -0700225 256,
Jeff Johnson295189b2012-06-20 16:38:30 -0700226
227 /* MAX num RX Buffer, NOT CLEAR YET !!! */
228 1,
229
230 /* Reference WQ, RX11 */
231 4,
232
233 /* USB Only, End point info */
234 0,
235
236 /* Transfer Type */
237 WLANDXE_DESC_CTRL_XTYPE_B2H,
238
239 /* Channel Priority 7(Highest) - 0(Lowest), NOT CLEAR YET !!! */
240 6,
241
242 /* BD attached to frames for this pipe */
243 eWLAN_PAL_TRUE,
244
245 /* chk_size, NOT CLEAR YET !!!*/
246 0,
247
248 /* bmuThdSel, NOT CLEAR YET !!! */
249 8,
250
251 /* Added in Gen5 for Prefetch, NOT CLEAR YET !!!*/
252 eWLAN_PAL_TRUE,
253
254 /* Use short Descriptor */
255 eWLAN_PAL_TRUE
256};
257
258#ifdef WLANDXE_TEST_CHANNEL_ENABLE
259WLANDXE_ChannelConfigType chanH2HTestConfig =
260{
261 /* Q handle type, Circular */
262 WLANDXE_CHANNEL_HANDLE_CIRCULA,
263
264 /* Number of Descriptor, NOT CLEAR YET !!! */
265 5,
266
267 /* MAX num RX Buffer, NOT CLEAR YET !!! */
268 0,
269
270 /* Reference WQ, NOT CLEAR YET !!! */
271 /* Temporary BMU Work Q 5 */
272 5,
273
274 /* USB Only, End point info */
275 0,
276
277 /* Transfer Type */
278 WLANDXE_DESC_CTRL_XTYPE_H2H,
279
280 /* Channel Priority 7(Highest) - 0(Lowest), NOT CLEAR YET !!! */
281 5,
282
283 /* BD attached to frames for this pipe */
284 eWLAN_PAL_FALSE,
285
286 /* chk_size, NOT CLEAR YET !!!*/
287 0,
288
289 /* bmuThdSel, NOT CLEAR YET !!! */
290 0,
291
292 /* Added in Gen5 for Prefetch, NOT CLEAR YET !!!*/
293 eWLAN_PAL_TRUE,
294
295 /* Use short Descriptor */
296 eWLAN_PAL_TRUE
297};
298#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
299
300WLANDXE_ChannelMappingType channelList[WDTS_CHANNEL_MAX] =
301{
302 {WDTS_CHANNEL_TX_LOW_PRI, WLANDXE_DMA_CHANNEL_0, &chanTXLowPriConfig},
303 {WDTS_CHANNEL_TX_HIGH_PRI, WLANDXE_DMA_CHANNEL_4, &chanTXHighPriConfig},
304 {WDTS_CHANNEL_RX_LOW_PRI, WLANDXE_DMA_CHANNEL_1, &chanRXLowPriConfig},
305#ifndef WLANDXE_TEST_CHANNEL_ENABLE
306 {WDTS_CHANNEL_RX_HIGH_PRI, WLANDXE_DMA_CHANNEL_3, &chanRXHighPriConfig},
307#else
308 {WDTS_CHANNEL_H2H_TEST_TX, WLANDXE_DMA_CHANNEL_2, &chanH2HTestConfig},
309 {WDTS_CHANNEL_H2H_TEST_RX, WLANDXE_DMA_CHANNEL_2, &chanH2HTestConfig}
310#endif /* WLANDXE_TEST_CHANNEL_ENABLE */
311};
312
313WLANDXE_TxCompIntConfigType txCompInt =
314{
315 /* TX Complete Interrupt enable method */
316 WLANDXE_TX_COMP_INT_PER_K_FRAMES,
317
318 /* TX Low Resource remaining resource threshold for Low Pri Ch */
319 WLANDXE_TX_LOW_RES_THRESHOLD,
320
321 /* TX Low Resource remaining resource threshold for High Pri Ch */
322 WLANDXE_TX_LOW_RES_THRESHOLD,
323
324 /* RX Low Resource remaining resource threshold */
325 5,
326
327 /* Per K frame enable Interrupt */
328 /*WLANDXE_HI_PRI_RES_NUM*/ 5,
329
330 /* Periodic timer msec */
331 10
332};
333
334/*==========================================================================
335 @ Function Name
336 dxeCommonDefaultConfig
337
338 @ Description
339
340 @ Parameters
341 WLANDXE_CtrlBlkType *dxeCtrlBlk,
342 DXE host driver main control block
343
344 @ Return
345 wpt_status
346
347===========================================================================*/
348wpt_status dxeCommonDefaultConfig
349(
350 WLANDXE_CtrlBlkType *dxeCtrlBlk
351)
352{
353 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
354
355 dxeCtrlBlk->rxReadyCB = NULL;
356 dxeCtrlBlk->txCompCB = NULL;
357 dxeCtrlBlk->lowResourceCB = NULL;
358
359 wpalMemoryCopy(&dxeCtrlBlk->txCompInt,
360 &txCompInt,
361 sizeof(WLANDXE_TxCompIntConfigType));
362
363 return status;
364}
365
366/*==========================================================================
367 @ Function Name
368 dxeChannelDefaultConfig
369
370 @ Description
371 Get defualt configuration values from pre defined structure
372 All the channels must have it's own configurations
373
374 @ Parameters
Gopichand Nakkalaa2cb10c2013-05-03 17:48:29 -0700375 WLANDXE_CtrlBlkType: *dxeCtrlBlk,
Jeff Johnson295189b2012-06-20 16:38:30 -0700376 DXE host driver main control block
377 WLANDXE_ChannelCBType *channelEntry
378 Channel specific control block
379
380 @ Return
381 wpt_status
382
383===========================================================================*/
384wpt_status dxeChannelDefaultConfig
385(
386 WLANDXE_CtrlBlkType *dxeCtrlBlk,
387 WLANDXE_ChannelCBType *channelEntry
388)
389{
390 wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
391 wpt_uint32 baseAddress;
392 wpt_uint32 dxeControlRead = 0;
393 wpt_uint32 dxeControlWrite = 0;
394 wpt_uint32 dxeControlWriteValid = 0;
395 wpt_uint32 dxeControlWriteEop = 0;
396 wpt_uint32 dxeControlWriteEopInt = 0;
397 wpt_uint32 idx;
Gopichand Nakkalaa2cb10c2013-05-03 17:48:29 -0700398 wpt_uint32 rxResourceCount = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700399 WLANDXE_ChannelMappingType *mappedChannel = NULL;
400
401 /* Sanity Check */
402 if((NULL == dxeCtrlBlk) || (NULL == channelEntry))
403 {
404 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
405 "dxeLinkDescAndCtrlBlk Channel Entry is not valid");
406 return eWLAN_PAL_STATUS_E_INVAL;
407 }
408
409 for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++)
410 {
411 if(channelEntry->channelType == channelList[idx].wlanChannel)
412 {
413 mappedChannel = &channelList[idx];
414 break;
415 }
416 }
417
418 if((NULL == mappedChannel) || (WDTS_CHANNEL_MAX == idx))
419 {
420 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700421 "%s Failed to map channel", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700422 return eWLAN_PAL_STATUS_E_INVAL;
423 }
424
425 wpalMemoryCopy(&channelEntry->channelConfig,
426 mappedChannel->channelConfig,
427 sizeof(WLANDXE_ChannelConfigType));
428
429 baseAddress = channelBaseAddressList[mappedChannel->DMAChannel];
430 channelEntry->channelRegister.chDXEBaseAddr = baseAddress;
431 channelEntry->channelRegister.chDXEStatusRegAddr = baseAddress + WLANDXE_DMA_CH_STATUS_REG;
432 channelEntry->channelRegister.chDXEDesclRegAddr = baseAddress + WLANDXE_DMA_CH_DESCL_REG;
433 channelEntry->channelRegister.chDXEDeschRegAddr = baseAddress + WLANDXE_DMA_CH_DESCH_REG;
434 channelEntry->channelRegister.chDXELstDesclRegAddr = baseAddress + WLANDXE_DMA_CH_LST_DESCL_REG;
435 channelEntry->channelRegister.chDXECtrlRegAddr = baseAddress + WLANDXE_DMA_CH_CTRL_REG;
436 channelEntry->channelRegister.chDXESzRegAddr = baseAddress + WLANDXE_DMA_CH_SZ_REG;
437 channelEntry->channelRegister.chDXEDadrlRegAddr = baseAddress + WLANDXE_DMA_CH_DADRL_REG;
438 channelEntry->channelRegister.chDXEDadrhRegAddr = baseAddress + WLANDXE_DMA_CH_DADRH_REG;
439 channelEntry->channelRegister.chDXESadrlRegAddr = baseAddress + WLANDXE_DMA_CH_SADRL_REG;
440 channelEntry->channelRegister.chDXESadrhRegAddr = baseAddress + WLANDXE_DMA_CH_SADRH_REG;
441
442 /* Channel Mask?
443 * This value will control channel control register.
444 * This register will be set to trigger actual DMA transfer activate
445 * CH_N_CTRL */
446 channelEntry->extraConfig.chan_mask = 0;
447 /* Check VAL bit before processing descriptor */
448 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_EDVEN_MASK;
449 /* Use External Descriptor Linked List */
450 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_EDEN_MASK;
451 /* Enable Channel Interrupt on error */
452 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_INE_ERR_MASK;
453 /* Enable INT after XFER done */
454 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_INE_DONE_MASK;
455 /* Enable INT External Descriptor */
456 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_INE_ED_MASK;
457 /* Set Channel This is not channel, event counter, somthing wrong */
458 channelEntry->extraConfig.chan_mask |=
459 mappedChannel->DMAChannel << WLANDXE_CH_CTRL_CTR_SEL_OFFSET;
460 /* Transfer Type */
461 channelEntry->extraConfig.chan_mask |= mappedChannel->channelConfig->xfrType;
462 /* Use Short Descriptor, THIS LOOKS SOME WIERD, REVISIT */
463 if(!channelEntry->channelConfig.useShortDescFmt)
464 {
465 channelEntry->extraConfig.chan_mask |= WLANDXE_DESC_CTRL_DFMT;
466 }
467 /* TX Channel, Set DIQ bit, Clear SIQ bit since source is not WQ */
468 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
469 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
470 {
471 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_DIQ_MASK;
Siddharth Bhalb7e8e882014-10-10 16:27:47 +0530472 if (wpalWcnssIsProntoHwVer3())
473 {
474 HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
475 "Using WQ 6 for TX Low/High PRI Channel");
476 channelEntry->channelConfig.refWQ = WLANDXE_PRONTO_TX_WQ;
477 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700478 }
479 /* RX Channel, Set SIQ bit, Clear DIQ bit since source is not WQ */
480 else if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) ||
481 (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType))
482 {
483 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_SIQ_MASK;
484 }
485 else
486 {
487 /* This is test H2H channel, TX, RX not use work Q
488 * Do Nothing */
489 }
490 /* Frame Contents Swap */
491 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_SWAP_MASK;
492 /* Host System Using Little Endian */
493 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_ENDIAN_MASK;
494 /* BMU Threshold select */
495 channelEntry->extraConfig.chan_mask |=
496 channelEntry->channelConfig.bmuThdSel << WLANDXE_CH_CTRL_BTHLD_SEL_OFFSET;
497 /* EOP for control register ??? */
498 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_EOP_MASK;
499 /* Channel Priority */
500 channelEntry->extraConfig.chan_mask |= channelEntry->channelConfig.chPriority << WLANDXE_CH_CTRL_PRIO_OFFSET;
501 /* PDU REL */
502 channelEntry->extraConfig.chan_mask |= WLANDXE_DESC_CTRL_PDU_REL;
503 /* Disable DMA transfer on this channel */
504 channelEntry->extraConfig.chan_mask_read_disable = channelEntry->extraConfig.chan_mask;
505 /* Enable DMA transfer on this channel */
506 channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_EN_MASK;
507 /* Channel Mask done */
508
509 /* Control Read
510 * Default Descriptor control Word value for RX ready DXE descriptor
511 * DXE engine will reference this value before DMA transfer */
512 dxeControlRead = 0;
513 /* Source is a Queue ID, not flat memory address */
514 dxeControlRead |= WLANDXE_DESC_CTRL_SIQ;
515 /* Transfer direction is BMU 2 Host */
516 dxeControlRead |= WLANDXE_DESC_CTRL_XTYPE_B2H;
517 /* End of Packet, RX is single fragment */
518 dxeControlRead |= WLANDXE_DESC_CTRL_EOP;
519 /* BD Present, default YES, B2H case it must be 0 to insert BD */
520 if(!channelEntry->channelConfig.bdPresent)
521 {
522 dxeControlRead |= WLANDXE_DESC_CTRL_BDH;
523 }
524 /* Channel Priority */
525 dxeControlRead |= channelEntry->channelConfig.chPriority << WLANDXE_CH_CTRL_PRIO_OFFSET;
526 /* BMU Threshold select, only used H2B, not this case??? */
527 dxeControlRead |= channelEntry->channelConfig.bmuThdSel << WLANDXE_CH_CTRL_BTHLD_SEL_OFFSET;
528 /* PDU Release, Release BD/PDU when DMA done */
529 dxeControlRead |= WLANDXE_DESC_CTRL_PDU_REL;
530 /* Use Short Descriptor, THIS LOOKS SOME WIERD, REVISIT */
531 if(!channelEntry->channelConfig.useShortDescFmt)
532 {
533 dxeControlRead |= WLANDXE_DESC_CTRL_DFMT;
534 }
535 /* Interrupt on Descriptor done */
536 dxeControlRead |= WLANDXE_DESC_CTRL_INT;
537 /* For ready status, this Control WORD must be VALID */
538 dxeControlRead |= WLANDXE_DESC_CTRL_VALID;
539 /* Frame Contents Swap */
540 dxeControlRead |= WLANDXE_DESC_CTRL_BDT_SWAP;
541 /* Host Little Endian */
542 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
543 (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType))
544 {
545 dxeControlRead |= WLANDXE_DESC_CTRL_ENDIANNESS;
546 }
547
548 /* SWAP if needed */
549 channelEntry->extraConfig.cw_ctrl_read = WLANDXE_U32_SWAP_ENDIAN(dxeControlRead);
550 /* Control Read Done */
551
552 /* Control Write
553 * Write into DXE descriptor control word to TX frame
554 * DXE engine will reference this word to contorl TX DMA channel */
555 channelEntry->extraConfig.cw_ctrl_write = 0;
556 /* Transfer type, from Host 2 BMU */
557 dxeControlWrite |= mappedChannel->channelConfig->xfrType;
558 /* BD Present, this looks some weird ??? */
559 if(!channelEntry->channelConfig.bdPresent)
560 {
561 dxeControlWrite |= WLANDXE_DESC_CTRL_BDH;
562 }
563 /* Channel Priority */
564 dxeControlWrite |= channelEntry->channelConfig.chPriority << WLANDXE_CH_CTRL_PRIO_OFFSET;
565 /* Use Short Descriptor, THIS LOOKS SOME WIERD, REVISIT */
566 if(!channelEntry->channelConfig.useShortDescFmt)
567 {
568 dxeControlWrite |= WLANDXE_DESC_CTRL_DFMT;
569 }
570 /* BMU Threshold select, only used H2B, not this case??? */
571 dxeControlWrite |= channelEntry->channelConfig.bmuThdSel << WLANDXE_CH_CTRL_BTHLD_SEL_OFFSET;
572 /* Destination is WQ */
573 dxeControlWrite |= WLANDXE_DESC_CTRL_DIQ;
574 /* Frame Contents Swap */
575 dxeControlWrite |= WLANDXE_DESC_CTRL_BDT_SWAP;
576 /* Host Little Endian */
577 dxeControlWrite |= WLANDXE_DESC_CTRL_ENDIANNESS;
578 /* Interrupt Enable */
579 dxeControlWrite |= WLANDXE_DESC_CTRL_INT;
580
581 dxeControlWriteValid = dxeControlWrite | WLANDXE_DESC_CTRL_VALID;
582 dxeControlWriteEop = dxeControlWriteValid | WLANDXE_DESC_CTRL_EOP;
583 dxeControlWriteEopInt = dxeControlWriteEop | WLANDXE_DESC_CTRL_INT;
584
585 /* DXE Descriptor must has Endian swapped value */
586 channelEntry->extraConfig.cw_ctrl_write = WLANDXE_U32_SWAP_ENDIAN(dxeControlWrite);
587 /* Control Write DONE */
588
589 /* Control Write include VAL bit
590 * This Control word used to set valid bit and
591 * trigger DMA transfer for specific descriptor */
592 channelEntry->extraConfig.cw_ctrl_write_valid =
593 WLANDXE_U32_SWAP_ENDIAN(dxeControlWriteValid);
594
595 /* Control Write include EOP
596 * End of Packet */
597 channelEntry->extraConfig.cw_ctrl_write_eop =
598 WLANDXE_U32_SWAP_ENDIAN(dxeControlWriteEop);
599
600 /* Control Write include EOP and INT
601 * indicate End Of Packet and generate interrupt on descriptor Done */
602 channelEntry->extraConfig.cw_ctrl_write_eop_int =
603 WLANDXE_U32_SWAP_ENDIAN(dxeControlWriteEopInt);
604
605
606 /* size mask???? */
607 channelEntry->extraConfig.chk_size_mask =
608 mappedChannel->channelConfig->chk_size << 10;
609
610 channelEntry->extraConfig.refWQ_swapped =
611 WLANDXE_U32_SWAP_ENDIAN(channelEntry->channelConfig.refWQ);
612
613 /* Set Channel specific Interrupt mask */
614 channelEntry->extraConfig.intMask = channelInterruptMask[mappedChannel->DMAChannel];
615
616
Gopichand Nakkalaa2cb10c2013-05-03 17:48:29 -0700617 wpalGetNumRxRawPacket(&rxResourceCount);
618 if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) ||
619 (0 == rxResourceCount))
620 {
621 channelEntry->numDesc = mappedChannel->channelConfig->nDescs;
622 }
623 else
624 {
625 channelEntry->numDesc = rxResourceCount / 4;
626 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700627 channelEntry->assignedDMAChannel = mappedChannel->DMAChannel;
628 channelEntry->numFreeDesc = 0;
629 channelEntry->numRsvdDesc = 0;
630 channelEntry->numFragmentCurrentChain = 0;
631 channelEntry->numTotalFrame = 0;
632 channelEntry->hitLowResource = eWLAN_PAL_FALSE;
633
634 return status;
635}