1 /*
2 * txCtrlParams.c
3 *
4 * Copyright(c) 1998 - 2010 Texas Instruments. All rights reserved.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
16 * distribution.
17 * * Neither the name Texas Instruments nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34 /*******************************************************************************/
35 /* */
36 /* MODULE: txCtrlParams.c */
37 /* PURPOSE: The txCtrl module parameters handling. */
38 /* This is a part of the txCtrl module (using the same object). */
39 /* */
40 /*******************************************************************************/
41
42 #define __FILE_ID__ FILE_ID_57
43 #include "tidef.h"
44 #include "report.h"
45 #include "paramOut.h"
46 #include "osApi.h"
47 #include "timer.h"
48 #include "EvHandler.h"
49 #include "txCtrl.h"
50
51
52
53
54
55 /***********************************************************************
56 * calcCreditFromTimer
57 ***********************************************************************
58 DESCRIPTION: This function is called when credit calculation timer
59 is expired. it calculate the credit for the admission ctrl
60 credit algorithm
61
62
63 INPUT: hTxCtrl - handle to the ts data object
64 bTwdInitOccured - Indicates if TWDriver recovery occured since timer started
65
66 OUTPUT: None
67
68 RETURN: void
69 ************************************************************************/
calcCreditFromTimer(TI_HANDLE hTxCtrl,TI_BOOL bTwdInitOccured)70 static void calcCreditFromTimer(TI_HANDLE hTxCtrl, TI_BOOL bTwdInitOccured)
71 {
72 OS_802_11_THRESHOLD_CROSS_INDICATION_PARAMS mediumTimeCross;
73 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
74 TI_UINT32 ac;
75 TI_INT32 prevCredit;
76 TI_INT32 highCreditThreshold;
77 TI_INT32 lowCreditThreshold;
78 TI_INT32 usageRatio;
79 TI_INT32 currUsage;
80 TI_INT32 prevUsage;
81 TI_UINT32 currentTimeStamp = os_timeStampMs(pTxCtrl->hOs); /* get current time stamp */
82
83 /*
84 * For each AC under admission control calculate the new usage and credit time,
85 * and send events if a threshold is crossed.
86 */
87 for(ac = 0 ; ac < MAX_NUM_OF_AC ; ac++)
88 {
89 /* check if this queue is under admission ctrl operation */
90 if(pTxCtrl->mediumTime[ac] == 0)
91 {
92 TRACE1(pTxCtrl->hReport, REPORT_SEVERITY_INFORMATION, ": ac = %d mediumTime = 0 \n", ac);
93
94 continue;
95 }
96
97 /* in case of wraparound */
98 if(currentTimeStamp < pTxCtrl->lastCreditCalcTimeStamp[ac])
99 pTxCtrl->lastCreditCalcTimeStamp[ac] = 0;
100
101 /* store prev credit */
102 prevCredit = pTxCtrl->credit[ac];
103
104 /* Calculate the medium usage ratio: totalUsedTime / mediumTime * 1000
105 Note that since the totalUsedTime is in usec and not msec we don't multiply by 1000. */
106 usageRatio = pTxCtrl->totalUsedTime[ac] / pTxCtrl->mediumTime[ac];
107
108 /* calculate credit */
109 pTxCtrl->credit[ac] += (currentTimeStamp - pTxCtrl->lastCreditCalcTimeStamp[ac]) - usageRatio;
110
111 /* update last time stamp */
112 pTxCtrl->lastCreditCalcTimeStamp[ac] = currentTimeStamp;
113
114 /* in case credit is bigger than mediumTime -> set credit to medium time */
115 if (pTxCtrl->credit[ac] > (TI_INT32)(pTxCtrl->mediumTime[ac]) )
116 pTxCtrl->credit[ac] = pTxCtrl->mediumTime[ac];
117
118 TRACE2(pTxCtrl->hReport, REPORT_SEVERITY_INFORMATION, "credit = %d | TotalUsedTime = %d\n", pTxCtrl->credit[ac], pTxCtrl->totalUsedTime[ac]/1000);
119
120 /* Check medium-usage threshold cross events */
121 /*********************************************/
122 /*
123 * The medium-usage events are defined as follows:
124 * The high threshold triggers event only when crossed upward (traffic increased above threshold).
125 * The low threshold triggers event only when crossed downward (traffic decreased below threshold).
126 * Thus, the two thresholds provide hysteresis and prevent multiple triggering.
127 * The high threshold should be greater than the low threshold.
128 *
129 * Note: The driver doesn't delay traffic even if violating the usage limit!
130 * It only indicates the user application about the thresholds crossing.
131 */
132
133 highCreditThreshold = (TI_INT32)((pTxCtrl->mediumTime[ac])*(pTxCtrl->highMediumUsageThreshold[ac])/100);
134 lowCreditThreshold = (TI_INT32)((pTxCtrl->mediumTime[ac])*(pTxCtrl->lowMediumUsageThreshold[ac])/100);
135
136 /* The credit is getting more negative as we get closer to the medium usage limit, so we invert
137 it before comparing to the thresholds (lower credit means higher usage). */
138 currUsage = -pTxCtrl->credit[ac];
139 prevUsage = -prevCredit;
140
141 /* crossing below the low threshold */
142 if ( (currUsage < lowCreditThreshold) && (prevUsage >= lowCreditThreshold) )
143 {
144 /* send event */
145 mediumTimeCross.uAC = ac;
146 mediumTimeCross.uHighOrLowThresholdFlag = (TI_UINT32)LOW_THRESHOLD_CROSS;
147 mediumTimeCross.uAboveOrBelowFlag = (TI_UINT32)CROSS_BELOW;
148
149 EvHandlerSendEvent(pTxCtrl->hEvHandler, IPC_EVENT_MEDIUM_TIME_CROSS,
150 (TI_UINT8 *)&mediumTimeCross, sizeof(OS_802_11_THRESHOLD_CROSS_INDICATION_PARAMS));
151
152 TRACE3(pTxCtrl->hReport, REPORT_SEVERITY_INFORMATION, "crossed below low threshold !!! prevUsage = %d, currUsage = %d, lowCreditThreshold = %d\n", prevUsage, currUsage, lowCreditThreshold);
153 }
154
155 /* crossing above the high threshold */
156 else if ( (currUsage > highCreditThreshold) && (prevUsage <= highCreditThreshold) )
157 {
158 /* send event */
159 mediumTimeCross.uAC = ac;
160 mediumTimeCross.uHighOrLowThresholdFlag = (TI_UINT32)HIGH_THRESHOLD_CROSS;
161 mediumTimeCross.uAboveOrBelowFlag = (TI_UINT32)CROSS_ABOVE;
162
163 EvHandlerSendEvent(pTxCtrl->hEvHandler, IPC_EVENT_MEDIUM_TIME_CROSS,
164 (TI_UINT8 *)&mediumTimeCross, sizeof(OS_802_11_THRESHOLD_CROSS_INDICATION_PARAMS));
165
166 TRACE3(pTxCtrl->hReport, REPORT_SEVERITY_INFORMATION, "crossed above high threshold !!! prevUsage = %d, currUsage = %d, highCreditThreshold = %d\n", prevUsage, currUsage, highCreditThreshold);
167 }
168
169 /* reset totalUsedTime */
170 pTxCtrl->totalUsedTime[ac] = 0;
171 }
172 }
173
174
175 /****************************************************************************
176 * updateDataPktPrototype()
177 ****************************************************************************
178 * DESCRIPTION: Updates the data packet prototype values according to
179 changed parameters (e.g. rate policy change).
180 ****************************************************************************/
updateDataPktPrototype(txCtrl_t * pTxCtrl)181 static void updateDataPktPrototype(txCtrl_t *pTxCtrl)
182 {
183 pTxCtrl->dataPktDescAttrib = pTxCtrl->txSessionCount << TX_ATTR_OFST_SESSION_COUNTER;
184 }
185
186
187 /***************************************************************************
188 * txCtrlParams_resetCounters
189 ****************************************************************************
190 * DESCRIPTION: Reset the tx data module counters
191 *
192 * INPUTS: hTxCtrl - the object
193 *
194 * OUTPUT:
195 *
196 * RETURNS:
197 ***************************************************************************/
txCtrlParams_resetCounters(TI_HANDLE hTxCtrl)198 void txCtrlParams_resetCounters(TI_HANDLE hTxCtrl)
199 {
200 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
201
202 os_memoryZero(pTxCtrl->hOs, &pTxCtrl->txDataCounters, sizeof(TTxDataCounters) * MAX_NUM_OF_AC);
203 os_memoryZero(pTxCtrl->hOs, &pTxCtrl->SumTotalDelayUs, sizeof(pTxCtrl->SumTotalDelayUs));
204 pTxCtrl->currentConsecutiveRetryFail = 0;
205 }
206
207
208 /***************************************************************************
209 * txCtrlParams_RegNotif *
210 ****************************************************************************/
txCtrlParams_RegNotif(TI_HANDLE hTxCtrl,TI_UINT16 EventMask,GeneralEventCall_t CallBack,TI_HANDLE context,TI_UINT32 Cookie)211 TI_HANDLE txCtrlParams_RegNotif(TI_HANDLE hTxCtrl, TI_UINT16 EventMask, GeneralEventCall_t CallBack,
212 TI_HANDLE context, TI_UINT32 Cookie)
213 {
214 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
215 if (!hTxCtrl)
216 return NULL;
217 return DistributorMgr_Reg(pTxCtrl->TxEventDistributor,EventMask,(TI_HANDLE)CallBack,context,Cookie);
218 }
219
220
221 /***************************************************************************
222 * txCtrlParams_AddToNotifMask *
223 ****************************************************************************/
txCtrlParams_AddToNotifMask(TI_HANDLE hTxCtrl,TI_HANDLE Notifh,TI_UINT16 EventMask)224 TI_STATUS txCtrlParams_AddToNotifMask(TI_HANDLE hTxCtrl, TI_HANDLE Notifh, TI_UINT16 EventMask)
225 {
226 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
227 if (!hTxCtrl)
228 return TI_NOK;
229 return DistributorMgr_AddToMask(pTxCtrl->TxEventDistributor, Notifh, EventMask);
230 }
231
232
233 /***************************************************************************
234 * txCtrlParams_UnRegNotif *
235 ****************************************************************************/
txCtrlParams_UnRegNotif(TI_HANDLE hTxCtrl,TI_HANDLE RegEventHandle)236 TI_STATUS txCtrlParams_UnRegNotif(TI_HANDLE hTxCtrl, TI_HANDLE RegEventHandle)
237 {
238 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
239
240 if (!hTxCtrl)
241 return TI_NOK;
242
243 return (DistributorMgr_UnReg(pTxCtrl->TxEventDistributor,RegEventHandle));
244 }
245
246
247 /***********************************************************************
248 * txCtrlParams_setAdmissionCtrlParams
249 ***********************************************************************
250 DESCRIPTION: This function is called for add/delete a tspec in order
251 to update parameters.
252
253 INPUT: hTxCtrl - handale to the ts data object
254 acId - the AC of the tspec
255 mediumTime - tha alocated medium time for this UP
256 minimumPHYRate - the min phy rate to send a packet of this UP
257 admFlag - indicate if the its addition or deletion of tspec
258
259 OUTPUT: None
260
261 RETURN: void
262 ************************************************************************/
txCtrlParams_setAdmissionCtrlParams(TI_HANDLE hTxCtrl,TI_UINT8 acId,TI_UINT16 mediumTime,TI_UINT32 minimumPHYRate,TI_BOOL admFlag)263 TI_STATUS txCtrlParams_setAdmissionCtrlParams(TI_HANDLE hTxCtrl, TI_UINT8 acId, TI_UINT16 mediumTime,
264 TI_UINT32 minimumPHYRate, TI_BOOL admFlag)
265 {
266 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
267 TI_UINT32 i;
268
269 if(admFlag == TI_TRUE)
270 {
271 /* tspec added */
272 pTxCtrl->mediumTime[acId] = mediumTime;
273 pTxCtrl->admissionState[acId] = AC_ADMITTED;
274 pTxCtrl->useAdmissionAlgo[acId] = TI_TRUE;
275 pTxCtrl->lastCreditCalcTimeStamp[acId] = os_timeStampMs(pTxCtrl->hOs);
276 pTxCtrl->credit[acId] = mediumTime;
277 }
278 else
279 {
280 /* tspaec deleted */
281 pTxCtrl->mediumTime[acId] = 0;
282 pTxCtrl->admissionState[acId] = AC_NOT_ADMITTED;
283 pTxCtrl->useAdmissionAlgo[acId] = TI_FALSE;
284 pTxCtrl->lastCreditCalcTimeStamp[acId] = 0;
285 pTxCtrl->credit[acId] = 0;
286 }
287
288 /* Update the Tx queues mapping after admission change. */
289 txCtrl_UpdateQueuesMapping (hTxCtrl);
290
291 /* If the timer was not enabled in registry than we will never set it */
292 if (pTxCtrl->bCreditCalcTimerEnabled)
293 {
294 /* enable disable credit calculation timer */
295 for (i = 0; i < MAX_NUM_OF_AC; i++)
296 {
297 if (pTxCtrl->useAdmissionAlgo[i])
298 {
299 if (!pTxCtrl->bCreditCalcTimerRunning)
300 {
301 pTxCtrl->bCreditCalcTimerRunning = TI_TRUE;
302 tmr_StartTimer (pTxCtrl->hCreditTimer,
303 calcCreditFromTimer,
304 (TI_HANDLE)pTxCtrl,
305 pTxCtrl->creditCalculationTimeout,
306 TI_TRUE);
307 }
308
309 return TI_OK;
310 }
311 }
312
313 /* in all queues useAdmissionAlgo is not TRUE, so stop timer if running */
314 if (pTxCtrl->bCreditCalcTimerRunning)
315 {
316 tmr_StopTimer (pTxCtrl->hCreditTimer);
317 pTxCtrl->bCreditCalcTimerRunning = TI_FALSE;
318 }
319 }
320
321 return TI_OK;
322 }
323
324
325 /***************************************************************************
326 * txCtrlParams_getParam
327 ****************************************************************************
328 * DESCRIPTION: Get a specific parameter by an external user application.
329 *
330 * OUTPUT: pParamInfo - structure which include the value of
331 * the requested parameter
332 ***************************************************************************/
txCtrlParams_getParam(TI_HANDLE hTxCtrl,paramInfo_t * pParamInfo)333 TI_STATUS txCtrlParams_getParam(TI_HANDLE hTxCtrl, paramInfo_t *pParamInfo)
334 {
335 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
336 TI_UINT32 ac;
337
338 if(pTxCtrl == NULL) /* check handle validity */
339 {
340 return TI_NOK;
341 }
342
343 switch (pParamInfo->paramType)
344 {
345 case TX_CTRL_COUNTERS_PARAM:
346 /* Convert total-delays units from usec to mSec. */
347 for(ac = 0 ; ac < MAX_NUM_OF_AC ; ac++)
348 {
349 pTxCtrl->txDataCounters[ac].SumTotalDelayMs = pTxCtrl->SumTotalDelayUs[ac] / 1000;
350 }
351 os_memoryCopy( pTxCtrl->hOs, pParamInfo->content.pTxDataCounters, &(pTxCtrl->txDataCounters[0]),
352 sizeof(TTxDataCounters) * MAX_NUM_OF_AC);
353 pParamInfo->paramLength = sizeof(TTxDataCounters) * MAX_NUM_OF_AC;
354 break;
355
356 case TX_CTRL_GET_DATA_FRAME_COUNTER:
357 pParamInfo->content.txPacketsCount = 0;
358 for (ac = 0; ac < MAX_NUM_OF_AC; ac++)
359 pParamInfo->content.txPacketsCount += pTxCtrl->txDataCounters[ac].XmitOk;
360 break;
361
362 case TX_CTRL_REPORT_TS_STATISTICS:
363 ac = pParamInfo->content.tsMetricsCounters.acID;
364 os_memoryCopy(pTxCtrl->hOs,
365 pParamInfo->content.tsMetricsCounters.pTxDataCounters,
366 &(pTxCtrl->txDataCounters[ac]),
367 sizeof(TTxDataCounters));
368 os_memoryZero(pTxCtrl->hOs, &(pTxCtrl->txDataCounters[ac]), sizeof(TTxDataCounters));
369 break;
370
371 case TX_CTRL_GENERIC_ETHERTYPE:
372 pParamInfo->content.txGenericEthertype = pTxCtrl->genericEthertype;
373 break;
374
375
376 default:
377 TRACE0(pTxCtrl->hReport, REPORT_SEVERITY_ERROR, ": PARAMETER NOT SUPPORTED\n");
378 return PARAM_NOT_SUPPORTED;
379 }
380
381 return TI_OK;
382 }
383
384
385 /***************************************************************************
386 * txCtrlParams_setParam
387 ****************************************************************************
388 * DESCRIPTION: Set a specific parameter by an external user application.
389 *
390 * INPUTS: hTxCtrl - the object
391 * pParamInfo - structure which include the value to set for
392 * the requested parameter
393 ***************************************************************************/
txCtrlParams_setParam(TI_HANDLE hTxCtrl,paramInfo_t * pParamInfo)394 TI_STATUS txCtrlParams_setParam(TI_HANDLE hTxCtrl, paramInfo_t *pParamInfo)
395 {
396 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
397 TI_UINT8 acID;
398
399 if(pTxCtrl == NULL) /* check handle validity */
400 {
401 return TI_NOK;
402 }
403
404 switch (pParamInfo->paramType)
405 {
406 case TX_CTRL_SET_MEDIUM_USAGE_THRESHOLD:
407 acID = (TI_UINT8)pParamInfo->content.txDataMediumUsageThreshold.uAC;
408 if(acID < MAX_NUM_OF_AC)
409 {
410 pTxCtrl->highMediumUsageThreshold[acID] =
411 pParamInfo->content.txDataMediumUsageThreshold.uHighThreshold;
412 pTxCtrl->lowMediumUsageThreshold[acID] =
413 pParamInfo->content.txDataMediumUsageThreshold.uLowThreshold;
414 }
415 else
416 TRACE1(pTxCtrl->hReport, REPORT_SEVERITY_ERROR, ": Wrong AC (AC=%d > 3)\n", acID);
417 break;
418
419 case TX_CTRL_GET_MEDIUM_USAGE_THRESHOLD:
420 /* Note: SET operation is used for GET, because AC parameter should be supplied from Utility-
421 Adapter to driver (copy of user supplied block of data is only performed in SetParam calls). */
422 acID = (TI_UINT8)pParamInfo->content.txDataMediumUsageThreshold.uAC;
423 pParamInfo->content.txDataMediumUsageThreshold.uHighThreshold = pTxCtrl->highMediumUsageThreshold[acID];
424 pParamInfo->content.txDataMediumUsageThreshold.uLowThreshold = pTxCtrl->lowMediumUsageThreshold[acID];
425 break;
426
427 case TX_CTRL_POLL_AP_PACKETS_FROM_AC:
428 TRACE0(pTxCtrl->hReport, REPORT_SEVERITY_ERROR, ": Poll-AP is not supported in this version!!\n");
429 return PARAM_NOT_SUPPORTED;
430
431 case TX_CTRL_RESET_COUNTERS_PARAM:
432 txCtrlParams_resetCounters(hTxCtrl);
433 break;
434
435 case TX_CTRL_GENERIC_ETHERTYPE:
436 pTxCtrl->genericEthertype = pParamInfo->content.txGenericEthertype;
437 {
438 paramInfo_t param;
439 param.paramType = RX_DATA_GENERIC_ETHERTYPE_PARAM;
440 param.content.rxGenericEthertype = pTxCtrl->genericEthertype;
441 rxData_setParam(pTxCtrl->hRxData, ¶m);
442 }
443 break;
444
445
446 default:
447 TRACE0(pTxCtrl->hReport, REPORT_SEVERITY_ERROR, ": PARAMETER NOT SUPPORTED\n");
448 return PARAM_NOT_SUPPORTED;
449 }
450
451 return TI_OK;
452 }
453
454
455 /***********************************************************************
456 * txCtrlParams_setBssId
457 ***********************************************************************
458 DESCRIPTION: Update the BSS-ID.
459 ************************************************************************/
txCtrlParams_setBssId(TI_HANDLE hTxCtrl,TMacAddr * pCurrBssId)460 void txCtrlParams_setBssId (TI_HANDLE hTxCtrl, TMacAddr *pCurrBssId)
461 {
462 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
463
464 MAC_COPY (pTxCtrl->currBssId, *pCurrBssId);
465 }
466
467
468 /***********************************************************************
469 * txCtrlParams_setBssType
470 ***********************************************************************
471 DESCRIPTION: Update the BSS type.
472 ************************************************************************/
txCtrlParams_setBssType(TI_HANDLE hTxCtrl,ScanBssType_e currBssType)473 void txCtrlParams_setBssType (TI_HANDLE hTxCtrl, ScanBssType_e currBssType)
474 {
475 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
476
477 pTxCtrl->currBssType = currBssType;
478 }
479
480
481 /***********************************************************************
482 * txCtrlParams_setQosHeaderConverMode
483 ***********************************************************************
484 DESCRIPTION: Update the BSS type.
485 ************************************************************************/
txCtrlParams_setQosHeaderConverMode(TI_HANDLE hTxCtrl,EHeaderConvertMode headerConverMode)486 void txCtrlParams_setQosHeaderConverMode (TI_HANDLE hTxCtrl, EHeaderConvertMode headerConverMode)
487 {
488 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
489
490 pTxCtrl->headerConverMode = headerConverMode;
491
492 updateDataPktPrototype(pTxCtrl); /* Needed due to QoS mode change. */
493 }
494
495 /**
496 * \fn txCtrlParams_SetHtControl()
497 * \brief Update The HT Control Field on txCtrl module.
498 *
499 * \note
500 * \param hTxCtrl - the hTxCtrl handle.
501 * \param pHtCapabilitiesIe - input structure.
502 * \return TI_OK on success or TI_NOK on failure
503 * \sa
504 */
txCtrlParams_SetHtControl(TI_HANDLE hTxCtrl,TtxCtrlHtControl * pHtControl)505 TI_STATUS txCtrlParams_SetHtControl (TI_HANDLE hTxCtrl, TtxCtrlHtControl *pHtControl)
506 {
507 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
508
509 pTxCtrl->tTxCtrlHtControl.bHtEnable = pHtControl->bHtEnable;
510
511 return TI_OK;
512 }
513
514 /***********************************************************************
515 * txCtrlParams_setCurrentPrivacyInvokedMode
516 ***********************************************************************
517 DESCRIPTION: Update the current privacy invoked mode.
518 ************************************************************************/
txCtrlParams_setCurrentPrivacyInvokedMode(TI_HANDLE hTxCtrl,TI_BOOL currentPrivacyInvokedMode)519 void txCtrlParams_setCurrentPrivacyInvokedMode (TI_HANDLE hTxCtrl, TI_BOOL currentPrivacyInvokedMode)
520 {
521 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
522
523 pTxCtrl->currentPrivacyInvokedMode = currentPrivacyInvokedMode;
524 }
525
526
527 /***********************************************************************
528 * txCtrlParams_setEapolEncryptionStatus
529 ***********************************************************************
530 DESCRIPTION: Update the Eapol Encryption Status.
531 ************************************************************************/
txCtrlParams_setEapolEncryptionStatus(TI_HANDLE hTxCtrl,TI_BOOL eapolEncryptionStatus)532 void txCtrlParams_setEapolEncryptionStatus (TI_HANDLE hTxCtrl, TI_BOOL eapolEncryptionStatus)
533 {
534 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
535
536 pTxCtrl->eapolEncryptionStatus = eapolEncryptionStatus;
537 }
538
539
540 /***********************************************************************
541 * txCtrlParams_setEncryptionFieldSizes
542 ***********************************************************************
543 DESCRIPTION: Update the encryption field size for the header padding.
544 ************************************************************************/
txCtrlParams_setEncryptionFieldSizes(TI_HANDLE hTxCtrl,TI_UINT8 encryptionFieldSize)545 void txCtrlParams_setEncryptionFieldSizes (TI_HANDLE hTxCtrl, TI_UINT8 encryptionFieldSize)
546 {
547 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
548
549 pTxCtrl->encryptionFieldSize = encryptionFieldSize;
550 }
551
552
553 /***********************************************************************
554 * txCtrlParams_getCurrentEncryptionInfo
555 ***********************************************************************
556 DESCRIPTION: Provide the current encryption mode and padding size.
557 ************************************************************************/
txCtrlParams_getCurrentEncryptionInfo(TI_HANDLE hTxCtrl,TI_BOOL * pCurrentPrivacyInvokedMode,TI_UINT8 * pEncryptionFieldSize)558 void txCtrlParams_getCurrentEncryptionInfo (TI_HANDLE hTxCtrl,
559 TI_BOOL *pCurrentPrivacyInvokedMode,
560 TI_UINT8 *pEncryptionFieldSize)
561 {
562 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
563
564 *pCurrentPrivacyInvokedMode = pTxCtrl->currentPrivacyInvokedMode;
565 *pEncryptionFieldSize = pTxCtrl->encryptionFieldSize;
566 }
567
568
569 /***********************************************************************
570 * txCtrlParams_GetTxRate
571 ***********************************************************************
572 DESCRIPTION: Provide the last successfull data packet Tx rate.
573 ************************************************************************/
txCtrlParams_GetTxRate(TI_HANDLE hTxCtrl)574 ERate txCtrlParams_GetTxRate (TI_HANDLE hTxCtrl)
575 {
576 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
577
578 return pTxCtrl->eCurrentTxRate;
579 }
580
581
582 /***********************************************************************
583 * txCtrlParams_setAcAdmissionStatus
584 ***********************************************************************
585 DESCRIPTION: Update the AC admission status - required or not and admitted or not.
586 Update also the queues mapping in case it should change.
587 ************************************************************************/
txCtrlParams_setAcAdmissionStatus(TI_HANDLE hTxCtrl,TI_UINT8 ac,EAdmissionState admissionRequired,ETrafficAdmState admissionState)588 void txCtrlParams_setAcAdmissionStatus (TI_HANDLE hTxCtrl,
589 TI_UINT8 ac,
590 EAdmissionState admissionRequired,
591 ETrafficAdmState admissionState)
592 {
593 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
594
595 pTxCtrl->admissionRequired[ac] = admissionRequired;
596 pTxCtrl->admissionState[ac] = admissionState;
597
598 /* Update the Tx queues mapping after admission change. */
599 txCtrl_UpdateQueuesMapping (hTxCtrl);
600 }
601
602
603 /***********************************************************************
604 * txCtrlParams_setAcMsduLifeTime
605 ***********************************************************************
606 DESCRIPTION: Update the AC MSDU lifetime. The units are TUs (1024 usec).
607 ************************************************************************/
txCtrlParams_setAcMsduLifeTime(TI_HANDLE hTxCtrl,TI_UINT8 ac,TI_UINT32 uMsduLifeTimeTu)608 void txCtrlParams_setAcMsduLifeTime (TI_HANDLE hTxCtrl, TI_UINT8 ac, TI_UINT32 uMsduLifeTimeTu)
609 {
610 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
611
612 pTxCtrl->aMsduLifeTimeTu[ac] = (TI_UINT16)uMsduLifeTimeTu;
613 }
614
615
616 /***********************************************************************
617 * txCtrlParams_setAcAckPolicy
618 ***********************************************************************
619 DESCRIPTION: Update the AC Ack policy.
620 ************************************************************************/
txCtrlParams_setAcAckPolicy(TI_HANDLE hTxCtrl,TI_UINT8 ac,AckPolicy_e ackPolicy)621 void txCtrlParams_setAcAckPolicy (TI_HANDLE hTxCtrl, TI_UINT8 ac, AckPolicy_e ackPolicy)
622 {
623 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
624
625 pTxCtrl->ackPolicy[ac] = ackPolicy;
626 }
627
628
629 /***********************************************************************
630 * txCtrlParams_updateMgmtRateAttributes
631 ***********************************************************************
632 DESCRIPTION: Update per AC the rate policy for Mgmnt packets or IBSS BCAST packets.
633 ************************************************************************/
txCtrlParams_updateMgmtRateAttributes(TI_HANDLE hTxCtrl,TI_UINT8 ratePolicyId,TI_UINT8 ac)634 void txCtrlParams_updateMgmtRateAttributes(TI_HANDLE hTxCtrl, TI_UINT8 ratePolicyId, TI_UINT8 ac)
635 {
636 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
637
638 pTxCtrl->mgmtRatePolicy[ac] = ratePolicyId;
639 }
640
641
642 /***********************************************************************
643 * txCtrlParams_updateDataRateAttributes
644 ***********************************************************************
645 DESCRIPTION: Update per AC the rate policy for regular data packets (excluding IBSS BCAST packets).
646 ************************************************************************/
txCtrlParams_updateDataRateAttributes(TI_HANDLE hTxCtrl,TI_UINT8 ratePolicyId,TI_UINT8 ac)647 void txCtrlParams_updateDataRateAttributes(TI_HANDLE hTxCtrl, TI_UINT8 ratePolicyId, TI_UINT8 ac)
648 {
649 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
650
651 pTxCtrl->dataRatePolicy[ac] = ratePolicyId;
652 }
653
654
655 /***********************************************************************
656 * txCtrlParams_updateTxSessionCount
657 ***********************************************************************
658 DESCRIPTION: Update the current Tx-session index configured to FW.
659 ************************************************************************/
txCtrlParams_updateTxSessionCount(TI_HANDLE hTxCtrl,TI_UINT16 txSessionCount)660 void txCtrlParams_updateTxSessionCount(TI_HANDLE hTxCtrl, TI_UINT16 txSessionCount)
661 {
662 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
663
664 pTxCtrl->txSessionCount = txSessionCount;
665
666 updateDataPktPrototype(pTxCtrl);
667 }
668
669
670
671
672 /********************************************************************************
673 * *
674 * DEBUG FUNCTIONS IMPLEMENTATION *
675 * *
676 *********************************************************************************/
677
678 #ifdef TI_DBG
679
680 /***********************************************************************
681 * txCtrlParams_printInfo
682 ***********************************************************************
683 DESCRIPTION: Print module internal information.
684 ************************************************************************/
txCtrlParams_printInfo(TI_HANDLE hTxCtrl)685 void txCtrlParams_printInfo(TI_HANDLE hTxCtrl)
686 {
687 #ifdef REPORT_LOG
688 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
689
690 WLAN_OS_REPORT(("-------------- Tx-Ctrl Module Information --------------\n"));
691 WLAN_OS_REPORT(("========================================================\n"));
692
693 WLAN_OS_REPORT(("ACs Mapping:\n"));
694 WLAN_OS_REPORT(("------------\n"));
695 WLAN_OS_REPORT(("admissionRequired[3,2,1,0] = %d, %d, %d, %d\n",
696 pTxCtrl->admissionRequired[3], pTxCtrl->admissionRequired[2],
697 pTxCtrl->admissionRequired[1], pTxCtrl->admissionRequired[0]));
698 WLAN_OS_REPORT(("admissionState[3,2,1,0] = %d, %d, %d, %d\n",
699 pTxCtrl->admissionState[3], pTxCtrl->admissionState[2],
700 pTxCtrl->admissionState[1], pTxCtrl->admissionState[0]));
701 WLAN_OS_REPORT(("highestAdmittedAc[3,2,1,0] = %d, %d, %d, %d\n",
702 pTxCtrl->highestAdmittedAc[3], pTxCtrl->highestAdmittedAc[2],
703 pTxCtrl->highestAdmittedAc[1], pTxCtrl->highestAdmittedAc[0]));
704 WLAN_OS_REPORT(("admittedAcToTidMap[3,2,1,0] = 0x%x, 0x%x, 0x%x, 0x%x\n",
705 pTxCtrl->admittedAcToTidMap[3], pTxCtrl->admittedAcToTidMap[2],
706 pTxCtrl->admittedAcToTidMap[1], pTxCtrl->admittedAcToTidMap[0]));
707 WLAN_OS_REPORT(("busyAcBitmap = 0x%x\n", pTxCtrl->busyAcBitmap));
708 WLAN_OS_REPORT(("busyTidBitmap = 0x%x\n", pTxCtrl->busyTidBitmap));
709 WLAN_OS_REPORT(("--------------------------------------------------------\n"));
710
711 WLAN_OS_REPORT(("Tx Attributes:\n"));
712 WLAN_OS_REPORT(("--------------\n"));
713 WLAN_OS_REPORT(("mgmtRatePolicy[3,2,1,0] = %d, %d, %d, %d\n",
714 pTxCtrl->mgmtRatePolicy[3], pTxCtrl->mgmtRatePolicy[2],
715 pTxCtrl->mgmtRatePolicy[1], pTxCtrl->mgmtRatePolicy[0]));
716 WLAN_OS_REPORT(("dataRatePolicy[3,2,1,0] = %d, %d, %d, %d\n",
717 pTxCtrl->dataRatePolicy[3], pTxCtrl->dataRatePolicy[2],
718 pTxCtrl->dataRatePolicy[1], pTxCtrl->dataRatePolicy[0]));
719 WLAN_OS_REPORT(("dataPktDescAttrib = 0x%x\n", pTxCtrl->dataPktDescAttrib));
720 WLAN_OS_REPORT(("--------------------------------------------------------\n"));
721
722 WLAN_OS_REPORT(("Parameters:\n"));
723 WLAN_OS_REPORT(("----------\n"));
724 WLAN_OS_REPORT(("headerConverMode = %d\n", pTxCtrl->headerConverMode));
725 WLAN_OS_REPORT(("currentPrivacyInvokedMode = %d\n", pTxCtrl->currentPrivacyInvokedMode));
726 WLAN_OS_REPORT(("eapolEncryptionStatus = %d\n", pTxCtrl->eapolEncryptionStatus));
727 WLAN_OS_REPORT(("encryptionFieldSize = %d\n", pTxCtrl->encryptionFieldSize));
728 WLAN_OS_REPORT(("currBssType = %d\n", pTxCtrl->currBssType));
729 WLAN_OS_REPORT(("========================================================\n\n"));
730 #endif
731 }
732
733
734 /***********************************************************************
735 * txCtrlParams_printDebugCounters
736 ***********************************************************************
737 DESCRIPTION: Print Tx statistics debug counters.
738 ************************************************************************/
txCtrlParams_printDebugCounters(TI_HANDLE hTxCtrl)739 void txCtrlParams_printDebugCounters(TI_HANDLE hTxCtrl)
740 {
741 #ifdef REPORT_LOG
742 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
743 TI_UINT32 ac;
744
745 WLAN_OS_REPORT(("-------------- Tx-Ctrl Statistics Per AC ---------------\n"));
746 WLAN_OS_REPORT(("========================================================\n"));
747
748 WLAN_OS_REPORT(("---------- Packets Sent To Tx-Ctrl ---------------------\n"));
749 for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
750 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumPktsSent[ac]));
751
752 WLAN_OS_REPORT(("---------- Number of Queue-Stop (BP) -------------------\n"));
753 for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
754 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumPktsBackpressure[ac]));
755
756 WLAN_OS_REPORT(("---------- Number of AC Busy (Requeue pkt) -------------\n"));
757 for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
758 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumPktsBusy[ac]));
759
760 WLAN_OS_REPORT(("---------- Packets Sent to Xfer ------------------------\n"));
761 for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
762 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumPktsXfered[ac]));
763
764 WLAN_OS_REPORT(("----------- Xfer rc = Success --------------------------\n"));
765 for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
766 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumPktsSuccess[ac]));
767
768 WLAN_OS_REPORT(("----------- Xfer rc = Pending --------------------------\n"));
769 for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
770 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumPktsPending[ac]));
771
772 WLAN_OS_REPORT(("----------- Xfer rc = Error ----------------------------\n"));
773 for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
774 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumPktsError[ac]));
775
776 WLAN_OS_REPORT(("----------- Number of Tx-Complete Packets --------------\n"));
777 for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
778 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumTxCmplt[ac]));
779
780 WLAN_OS_REPORT(("----------- Number of Tx-Complete Packets TI_OK -----------\n"));
781 for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
782 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumTxCmpltOk[ac]));
783
784 WLAN_OS_REPORT(("----------- Number of Tx-Complete Packets Fails --------\n"));
785 for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
786 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumTxCmpltError[ac]));
787
788 WLAN_OS_REPORT(("----------- Number of Tx-Complete Bytes TI_OK -------------\n"));
789 for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
790 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumTxCmpltOkBytes[ac]));
791 WLAN_OS_REPORT(("--------------------------------------------------------\n"));
792
793 WLAN_OS_REPORT(("Total Number of Xfer-Complete Events = %d\n", pTxCtrl->dbgCounters.dbgNumXferCmplt));
794 WLAN_OS_REPORT(("Total Number of Xfer-Pending Events = %d\n",
795 pTxCtrl->dbgCounters.dbgNumPktsPending[0] + pTxCtrl->dbgCounters.dbgNumPktsPending[1] +
796 pTxCtrl->dbgCounters.dbgNumPktsPending[2] + pTxCtrl->dbgCounters.dbgNumPktsPending[3]));
797 WLAN_OS_REPORT(("========================================================\n\n"));
798 #endif
799 }
800
801
802 /***************************************************************************
803 * txCtrlParams_resetDbgCounters
804 ****************************************************************************
805 * DESCRIPTION: Reset the tx data module debug counters
806 ***************************************************************************/
txCtrlParams_resetDbgCounters(TI_HANDLE hTxCtrl)807 void txCtrlParams_resetDbgCounters(TI_HANDLE hTxCtrl)
808 {
809 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
810
811 os_memoryZero(pTxCtrl->hOs, &pTxCtrl->dbgCounters, sizeof(txDataDbgCounters_t));
812 }
813
814
815
816 #endif /* TI_DBG */
817