Home | History | Annotate | Download | only in Data_link
      1 /*
      2  * txCtrlParams.c
      3  *
      4  * Copyright(c) 1998 - 2009 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 ************************************************************************/
     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  ****************************************************************************/
    181 static void updateDataPktPrototype(txCtrl_t *pTxCtrl)
    182 {
    183 	pTxCtrl->dataPktDescAttrib = pTxCtrl->txSessionCount << TX_ATTR_OFST_SESSION_COUNTER;
    184 	if (pTxCtrl->headerConverMode == HDR_CONVERT_QOS)
    185     {
    186 		pTxCtrl->dataPktDescAttrib |= TX_ATTR_HEADER_PAD;
    187     }
    188 }
    189 
    190 
    191 /***************************************************************************
    192 *                       txCtrlParams_resetCounters
    193 ****************************************************************************
    194 * DESCRIPTION:  Reset the tx data module counters
    195 *
    196 * INPUTS:       hTxCtrl - the object
    197 *
    198 * OUTPUT:
    199 *
    200 * RETURNS:
    201 ***************************************************************************/
    202 void txCtrlParams_resetCounters(TI_HANDLE hTxCtrl)
    203 {
    204     txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    205 
    206     os_memoryZero(pTxCtrl->hOs, &pTxCtrl->txDataCounters, sizeof(TTxDataCounters) * MAX_NUM_OF_AC);
    207     os_memoryZero(pTxCtrl->hOs, &pTxCtrl->SumTotalDelayUs, sizeof(pTxCtrl->SumTotalDelayUs));
    208 	pTxCtrl->currentConsecutiveRetryFail = 0;
    209 }
    210 
    211 
    212 /***************************************************************************
    213 *                       txCtrlParams_RegNotif                                    *
    214 ****************************************************************************/
    215 TI_HANDLE txCtrlParams_RegNotif(TI_HANDLE hTxCtrl, TI_UINT16 EventMask, GeneralEventCall_t CallBack,
    216 						  TI_HANDLE context, TI_UINT32 Cookie)
    217 {
    218     txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    219     if (!hTxCtrl)
    220         return NULL;
    221     return DistributorMgr_Reg(pTxCtrl->TxEventDistributor,EventMask,(TI_HANDLE)CallBack,context,Cookie);
    222 }
    223 
    224 
    225 /***************************************************************************
    226 *                       txCtrlParams_AddToNotifMask                              *
    227 ****************************************************************************/
    228 TI_STATUS txCtrlParams_AddToNotifMask(TI_HANDLE hTxCtrl, TI_HANDLE Notifh, TI_UINT16 EventMask)
    229 {
    230     txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    231     if (!hTxCtrl)
    232         return TI_NOK;
    233     return DistributorMgr_AddToMask(pTxCtrl->TxEventDistributor, Notifh, EventMask);
    234 }
    235 
    236 
    237 /***************************************************************************
    238 *                       txCtrlParams_UnRegNotif                                  *
    239 ****************************************************************************/
    240 TI_STATUS txCtrlParams_UnRegNotif(TI_HANDLE hTxCtrl, TI_HANDLE RegEventHandle)
    241 {
    242     TI_STATUS status;
    243     txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    244 
    245     if (!hTxCtrl)
    246         return TI_NOK;
    247 
    248     return (status = DistributorMgr_UnReg(pTxCtrl->TxEventDistributor,RegEventHandle));
    249 }
    250 
    251 
    252 /***********************************************************************
    253  *                        txCtrlParams_setAdmissionCtrlParams
    254  ***********************************************************************
    255 DESCRIPTION:    This function is called for add/delete a tspec in order
    256 				to update parameters.
    257 
    258 INPUT:			hTxCtrl - handale to the ts data object
    259 				acId - the AC of the tspec
    260 				mediumTime	- tha alocated medium time for this UP
    261 				minimumPHYRate - the min phy rate to send a packet of this UP
    262 				admFlag - indicate if the its addition or deletion of tspec
    263 
    264 OUTPUT:     None
    265 
    266 RETURN:     void
    267 ************************************************************************/
    268 TI_STATUS txCtrlParams_setAdmissionCtrlParams(TI_HANDLE hTxCtrl, TI_UINT8 acId, TI_UINT16 mediumTime,
    269 											  TI_UINT32 minimumPHYRate, TI_BOOL admFlag)
    270 {
    271 	txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    272 	TI_UINT32	i;
    273 
    274 	if(admFlag == TI_TRUE)
    275 	{
    276 		/* tspec added */
    277 		pTxCtrl->mediumTime[acId] = mediumTime;
    278         pTxCtrl->admissionState[acId] = AC_ADMITTED;
    279 		pTxCtrl->useAdmissionAlgo[acId] = TI_TRUE;
    280 		pTxCtrl->lastCreditCalcTimeStamp[acId] = os_timeStampMs(pTxCtrl->hOs);
    281 		pTxCtrl->credit[acId] = mediumTime;
    282 	}
    283 	else
    284 	{
    285 		/* tspaec deleted */
    286 		pTxCtrl->mediumTime[acId] = 0;
    287         pTxCtrl->admissionState[acId] = AC_NOT_ADMITTED;
    288 		pTxCtrl->useAdmissionAlgo[acId] = TI_FALSE;
    289 		pTxCtrl->lastCreditCalcTimeStamp[acId] = 0;
    290 		pTxCtrl->credit[acId] = 0;
    291 	}
    292 
    293 	/* Update the Tx queues mapping after admission change. */
    294 	txCtrl_UpdateQueuesMapping (hTxCtrl);
    295 
    296 	/* If the timer was not enabled in registry than we will never set it */
    297 	if (pTxCtrl->bCreditCalcTimerEnabled)
    298 	{
    299     	/* enable disable credit calculation timer */
    300     	for (i = 0; i < MAX_NUM_OF_AC; i++)
    301     	{
    302     		if (pTxCtrl->useAdmissionAlgo[i])
    303     		{
    304     			if (!pTxCtrl->bCreditCalcTimerRunning)
    305     			{
    306     				pTxCtrl->bCreditCalcTimerRunning = TI_TRUE;
    307                     tmr_StartTimer (pTxCtrl->hCreditTimer,
    308                                     calcCreditFromTimer,
    309                                     (TI_HANDLE)pTxCtrl,
    310                                     pTxCtrl->creditCalculationTimeout,
    311                                     TI_TRUE);
    312     			}
    313 
    314     			return TI_OK;
    315     		}
    316     	}
    317 
    318     	/* in all queues useAdmissionAlgo is not TRUE, so stop timer if running */
    319         if (pTxCtrl->bCreditCalcTimerRunning)
    320         {
    321             tmr_StopTimer (pTxCtrl->hCreditTimer);
    322             pTxCtrl->bCreditCalcTimerRunning = TI_FALSE;
    323         }
    324     }
    325 
    326 	return TI_OK;
    327 }
    328 
    329 
    330 /***************************************************************************
    331 *                           txCtrlParams_getParam
    332 ****************************************************************************
    333 * DESCRIPTION:  Get a specific parameter by an external user application.
    334 *
    335 * OUTPUT:       pParamInfo - structure which include the value of
    336 *               the requested parameter
    337 ***************************************************************************/
    338 TI_STATUS txCtrlParams_getParam(TI_HANDLE hTxCtrl, paramInfo_t *pParamInfo)
    339 {
    340 	txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    341 	TI_UINT32 ac;
    342 
    343     if(pTxCtrl == NULL)  /* check handle validity */
    344     {
    345         return TI_NOK;
    346     }
    347 
    348     switch (pParamInfo->paramType)
    349     {
    350     case TX_CTRL_COUNTERS_PARAM:
    351 		/* Convert total-delays units from usec to mSec. */
    352 		for(ac = 0 ; ac < MAX_NUM_OF_AC ; ac++)
    353 		{
    354 			pTxCtrl->txDataCounters[ac].SumTotalDelayMs = pTxCtrl->SumTotalDelayUs[ac] / 1000;
    355 		}
    356         os_memoryCopy( pTxCtrl->hOs, pParamInfo->content.pTxDataCounters, &(pTxCtrl->txDataCounters[0]),
    357                        sizeof(TTxDataCounters) * MAX_NUM_OF_AC);
    358 		pParamInfo->paramLength = sizeof(TTxDataCounters) * MAX_NUM_OF_AC;
    359         break;
    360 
    361 	case TX_CTRL_GET_DATA_FRAME_COUNTER:
    362 		pParamInfo->content.txPacketsCount = 0;
    363 		for (ac = 0; ac < MAX_NUM_OF_AC; ac++)
    364         	pParamInfo->content.txPacketsCount += pTxCtrl->txDataCounters[ac].XmitOk;
    365         break;
    366 
    367 	case TX_CTRL_REPORT_TS_STATISTICS:
    368 		ac = pParamInfo->content.tsMetricsCounters.acID;
    369 		os_memoryCopy(pTxCtrl->hOs,
    370 					  pParamInfo->content.tsMetricsCounters.pTxDataCounters,
    371 					  &(pTxCtrl->txDataCounters[ac]),
    372 					  sizeof(TTxDataCounters));
    373 		os_memoryZero(pTxCtrl->hOs, &(pTxCtrl->txDataCounters[ac]), sizeof(TTxDataCounters));
    374 		break;
    375 
    376 
    377     default:
    378         TRACE0(pTxCtrl->hReport, REPORT_SEVERITY_ERROR, ": PARAMETER NOT SUPPORTED\n");
    379         return PARAM_NOT_SUPPORTED;
    380         break;
    381     }
    382 
    383     return TI_OK;
    384 }
    385 
    386 
    387 /***************************************************************************
    388 *                           txCtrlParams_setParam
    389 ****************************************************************************
    390 * DESCRIPTION:  Set a specific parameter by an external user application.
    391 *
    392 * INPUTS:       hTxCtrl - the object
    393 *               pParamInfo - structure which include the value to set for
    394 *               the requested parameter
    395 ***************************************************************************/
    396 TI_STATUS txCtrlParams_setParam(TI_HANDLE hTxCtrl, paramInfo_t *pParamInfo)
    397 {
    398 	txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    399 	TI_UINT8 acID;
    400 
    401     if(pTxCtrl == NULL)  /* check handle validity */
    402     {
    403         return TI_NOK;
    404     }
    405 
    406     switch (pParamInfo->paramType)
    407     {
    408     case TX_CTRL_SET_MEDIUM_USAGE_THRESHOLD:
    409 		acID = (TI_UINT8)pParamInfo->content.txDataMediumUsageThreshold.uAC;
    410 		if(acID < MAX_NUM_OF_AC)
    411 		{
    412 			pTxCtrl->highMediumUsageThreshold[acID] =
    413 				pParamInfo->content.txDataMediumUsageThreshold.uHighThreshold;
    414 			pTxCtrl->lowMediumUsageThreshold[acID] =
    415 				pParamInfo->content.txDataMediumUsageThreshold.uLowThreshold;
    416 		}
    417 		else
    418 TRACE1(pTxCtrl->hReport, REPORT_SEVERITY_ERROR, ": Wrong AC (AC=%d > 3)\n", acID);
    419 		break;
    420 
    421     case TX_CTRL_GET_MEDIUM_USAGE_THRESHOLD:
    422 		/* Note: SET operation is used for GET, because AC parameter should be supplied from Utility-
    423 	         Adapter to driver (copy of user supplied block of data is only performed in SetParam calls). */
    424 		acID = (TI_UINT8)pParamInfo->content.txDataMediumUsageThreshold.uAC;
    425 		pParamInfo->content.txDataMediumUsageThreshold.uHighThreshold = pTxCtrl->highMediumUsageThreshold[acID];
    426 		pParamInfo->content.txDataMediumUsageThreshold.uLowThreshold  = pTxCtrl->lowMediumUsageThreshold[acID];
    427 		break;
    428 
    429     case TX_CTRL_POLL_AP_PACKETS_FROM_AC:
    430        TRACE0(pTxCtrl->hReport, REPORT_SEVERITY_ERROR, ": Poll-AP is not supported in this version!!\n");
    431        return PARAM_NOT_SUPPORTED;
    432 
    433 	case TX_CTRL_RESET_COUNTERS_PARAM:
    434 		txCtrlParams_resetCounters(hTxCtrl);
    435 		break;
    436 
    437     default:
    438         TRACE0(pTxCtrl->hReport, REPORT_SEVERITY_ERROR, ": PARAMETER NOT SUPPORTED\n");
    439         return PARAM_NOT_SUPPORTED;
    440     }
    441 
    442     return TI_OK;
    443 }
    444 
    445 
    446 /***********************************************************************
    447  *                        txCtrlParams_setBssId
    448  ***********************************************************************
    449 DESCRIPTION:    Update the BSS-ID.
    450 ************************************************************************/
    451 void txCtrlParams_setBssId (TI_HANDLE hTxCtrl, TMacAddr *pCurrBssId)
    452 {
    453 	txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    454 
    455 	MAC_COPY (pTxCtrl->currBssId, *pCurrBssId);
    456 }
    457 
    458 
    459 /***********************************************************************
    460  *                        txCtrlParams_setBssType
    461  ***********************************************************************
    462 DESCRIPTION:    Update the BSS type.
    463 ************************************************************************/
    464 void txCtrlParams_setBssType (TI_HANDLE hTxCtrl, ScanBssType_e currBssType)
    465 {
    466 	txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    467 
    468 	pTxCtrl->currBssType = currBssType;
    469 }
    470 
    471 
    472 /***********************************************************************
    473  *                        txCtrlParams_setQosHeaderConverMode
    474  ***********************************************************************
    475 DESCRIPTION:    Update the BSS type.
    476 ************************************************************************/
    477 void txCtrlParams_setQosHeaderConverMode (TI_HANDLE hTxCtrl, EHeaderConvertMode  headerConverMode)
    478 {
    479 	txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    480 
    481 	pTxCtrl->headerConverMode = headerConverMode;
    482 
    483 	updateDataPktPrototype(pTxCtrl);  /* Needed due to QoS mode change. */
    484 }
    485 
    486 /**
    487  * \fn     txCtrlParams_SetHtControl()
    488  * \brief  Update The HT Control Field on txCtrl module.
    489  *
    490  * \note
    491  * \param  hTxCtrl - the hTxCtrl handle.
    492  * \param  pHtCapabilitiesIe - input structure.
    493  * \return TI_OK on success or TI_NOK on failure
    494  * \sa
    495  */
    496 TI_STATUS txCtrlParams_SetHtControl (TI_HANDLE hTxCtrl, TtxCtrlHtControl *pHtControl)
    497 {
    498     txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    499 
    500     pTxCtrl->tTxCtrlHtControl.bHtEnable = pHtControl->bHtEnable;
    501 
    502     return TI_OK;
    503 }
    504 
    505 /***********************************************************************
    506  *                        txCtrlParams_setCurrentPrivacyInvokedMode
    507  ***********************************************************************
    508 DESCRIPTION:    Update the current privacy invoked mode.
    509 ************************************************************************/
    510 void txCtrlParams_setCurrentPrivacyInvokedMode (TI_HANDLE hTxCtrl, TI_BOOL currentPrivacyInvokedMode)
    511 {
    512 	txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    513 
    514 	pTxCtrl->currentPrivacyInvokedMode = currentPrivacyInvokedMode;
    515 }
    516 
    517 
    518 /***********************************************************************
    519  *                        txCtrlParams_setEapolEncryptionStatus
    520  ***********************************************************************
    521 DESCRIPTION:    Update the Eapol Encryption Status.
    522 ************************************************************************/
    523 void txCtrlParams_setEapolEncryptionStatus (TI_HANDLE hTxCtrl, TI_BOOL eapolEncryptionStatus)
    524 {
    525 	txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    526 
    527 	pTxCtrl->eapolEncryptionStatus = eapolEncryptionStatus;
    528 }
    529 
    530 
    531 /***********************************************************************
    532  *                        txCtrlParams_setEncryptionFieldSizes
    533  ***********************************************************************
    534 DESCRIPTION:    Update the encryption field size for the header padding.
    535 ************************************************************************/
    536 void txCtrlParams_setEncryptionFieldSizes (TI_HANDLE hTxCtrl, TI_UINT8 encryptionFieldSize)
    537 {
    538 	txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    539 
    540 	pTxCtrl->encryptionFieldSize = encryptionFieldSize;
    541 }
    542 
    543 
    544 /***********************************************************************
    545  *                        txCtrlParams_getCurrentEncryptionInfo
    546  ***********************************************************************
    547 DESCRIPTION:    Provide the current encryption mode and padding size.
    548 ************************************************************************/
    549 void txCtrlParams_getCurrentEncryptionInfo (TI_HANDLE hTxCtrl,
    550                                             TI_BOOL    *pCurrentPrivacyInvokedMode,
    551                                             TI_UINT8   *pEncryptionFieldSize)
    552 {
    553 	txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    554 
    555     *pCurrentPrivacyInvokedMode = pTxCtrl->currentPrivacyInvokedMode;
    556     *pEncryptionFieldSize = pTxCtrl->encryptionFieldSize;
    557 }
    558 
    559 
    560 /***********************************************************************
    561  *                        txCtrlParams_GetTxRate
    562  ***********************************************************************
    563 DESCRIPTION:    Provide the last successfull data packet Tx rate.
    564 ************************************************************************/
    565 ERate txCtrlParams_GetTxRate (TI_HANDLE hTxCtrl)
    566 {
    567 	txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    568 
    569     return pTxCtrl->eCurrentTxRate;
    570 }
    571 
    572 
    573 /***********************************************************************
    574  *                        txCtrlParams_setAcAdmissionStatus
    575  ***********************************************************************
    576 DESCRIPTION:    Update the AC admission status - required or not and admitted or not.
    577 				Update also the queues mapping in case it should change.
    578 ************************************************************************/
    579 void txCtrlParams_setAcAdmissionStatus (TI_HANDLE hTxCtrl,
    580                                         TI_UINT8 ac,
    581                                         EAdmissionState admissionRequired,
    582 										ETrafficAdmState admissionState)
    583 {
    584 	txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    585 
    586 	pTxCtrl->admissionRequired[ac] = admissionRequired;
    587 	pTxCtrl->admissionState[ac]    = admissionState;
    588 
    589 	/* Update the Tx queues mapping after admission change. */
    590 	txCtrl_UpdateQueuesMapping (hTxCtrl);
    591 }
    592 
    593 
    594 /***********************************************************************
    595  *                        txCtrlParams_setAcMsduLifeTime
    596  ***********************************************************************
    597 DESCRIPTION:    Update the AC MSDU lifetime. The units are TUs (1024 usec).
    598 ************************************************************************/
    599 void txCtrlParams_setAcMsduLifeTime (TI_HANDLE hTxCtrl, TI_UINT8 ac, TI_UINT32 uMsduLifeTimeTu)
    600 {
    601 	txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    602 
    603 	pTxCtrl->aMsduLifeTimeTu[ac] = (TI_UINT16)uMsduLifeTimeTu;
    604 }
    605 
    606 
    607 /***********************************************************************
    608  *                        txCtrlParams_setAcAckPolicy
    609  ***********************************************************************
    610 DESCRIPTION:    Update the AC Ack policy.
    611 ************************************************************************/
    612 void txCtrlParams_setAcAckPolicy (TI_HANDLE hTxCtrl, TI_UINT8 ac, AckPolicy_e ackPolicy)
    613 {
    614 	txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    615 
    616 	pTxCtrl->ackPolicy[ac] = ackPolicy;
    617 }
    618 
    619 
    620 /***********************************************************************
    621  *                     txCtrlParams_updateMgmtRateAttributes
    622  ***********************************************************************
    623 DESCRIPTION:    Update per AC the rate policy for Mgmnt packets or IBSS BCAST packets.
    624 ************************************************************************/
    625 void txCtrlParams_updateMgmtRateAttributes(TI_HANDLE hTxCtrl, TI_UINT8 ratePolicyId, TI_UINT8 ac)
    626 {
    627 	txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    628 
    629 	pTxCtrl->mgmtRatePolicy[ac] = ratePolicyId;
    630 }
    631 
    632 
    633 /***********************************************************************
    634  *                     txCtrlParams_updateDataRateAttributes
    635  ***********************************************************************
    636 DESCRIPTION:    Update per AC the rate policy for regular data packets (excluding IBSS BCAST packets).
    637 ************************************************************************/
    638 void txCtrlParams_updateDataRateAttributes(TI_HANDLE hTxCtrl, TI_UINT8 ratePolicyId, TI_UINT8 ac)
    639 {
    640 	txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    641 
    642 	pTxCtrl->dataRatePolicy[ac] = ratePolicyId;
    643 }
    644 
    645 
    646 /***********************************************************************
    647  *                     txCtrlParams_updateTxSessionCount
    648  ***********************************************************************
    649 DESCRIPTION:    Update the current Tx-session index configured to FW.
    650 ************************************************************************/
    651 void txCtrlParams_updateTxSessionCount(TI_HANDLE hTxCtrl, TI_UINT16 txSessionCount)
    652 {
    653 	txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    654 
    655 	pTxCtrl->txSessionCount = txSessionCount;
    656 
    657 	updateDataPktPrototype(pTxCtrl);
    658 }
    659 
    660 
    661 
    662 
    663 /********************************************************************************
    664 *																				*
    665 *                       DEBUG  FUNCTIONS  IMPLEMENTATION						*
    666 *																				*
    667 *********************************************************************************/
    668 
    669 #ifdef TI_DBG
    670 
    671 /***********************************************************************
    672  *                     txCtrlParams_printInfo
    673  ***********************************************************************
    674 DESCRIPTION:    Print module internal information.
    675 ************************************************************************/
    676 void txCtrlParams_printInfo(TI_HANDLE hTxCtrl)
    677 {
    678 #ifdef REPORT_LOG
    679     txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    680 
    681     WLAN_OS_REPORT(("-------------- Tx-Ctrl Module Information --------------\n"));
    682     WLAN_OS_REPORT(("========================================================\n"));
    683 
    684     WLAN_OS_REPORT(("ACs Mapping:\n"));
    685     WLAN_OS_REPORT(("------------\n"));
    686     WLAN_OS_REPORT(("admissionRequired[3,2,1,0]   =  %d,   %d,   %d,   %d\n",
    687 		pTxCtrl->admissionRequired[3], pTxCtrl->admissionRequired[2],
    688 		pTxCtrl->admissionRequired[1], pTxCtrl->admissionRequired[0]));
    689     WLAN_OS_REPORT(("admissionState[3,2,1,0]      =  %d,   %d,   %d,   %d\n",
    690 		pTxCtrl->admissionState[3], pTxCtrl->admissionState[2],
    691 		pTxCtrl->admissionState[1], pTxCtrl->admissionState[0]));
    692     WLAN_OS_REPORT(("highestAdmittedAc[3,2,1,0]   =  %d,   %d,   %d,   %d\n",
    693 		pTxCtrl->highestAdmittedAc[3], pTxCtrl->highestAdmittedAc[2],
    694 		pTxCtrl->highestAdmittedAc[1], pTxCtrl->highestAdmittedAc[0]));
    695     WLAN_OS_REPORT(("admittedAcToTidMap[3,2,1,0]  =  0x%x, 0x%x, 0x%x, 0x%x\n",
    696 		pTxCtrl->admittedAcToTidMap[3], pTxCtrl->admittedAcToTidMap[2],
    697 		pTxCtrl->admittedAcToTidMap[1], pTxCtrl->admittedAcToTidMap[0]));
    698     WLAN_OS_REPORT(("busyAcBitmap                 = 0x%x\n", pTxCtrl->busyAcBitmap));
    699     WLAN_OS_REPORT(("busyTidBitmap                = 0x%x\n", pTxCtrl->busyTidBitmap));
    700     WLAN_OS_REPORT(("--------------------------------------------------------\n"));
    701 
    702     WLAN_OS_REPORT(("Tx Attributes:\n"));
    703     WLAN_OS_REPORT(("--------------\n"));
    704     WLAN_OS_REPORT(("mgmtRatePolicy[3,2,1,0]      =  %d,   %d,   %d,   %d\n",
    705 		pTxCtrl->mgmtRatePolicy[3], pTxCtrl->mgmtRatePolicy[2],
    706 		pTxCtrl->mgmtRatePolicy[1], pTxCtrl->mgmtRatePolicy[0]));
    707     WLAN_OS_REPORT(("dataRatePolicy[3,2,1,0]      =  %d,   %d,   %d,   %d\n",
    708 		pTxCtrl->dataRatePolicy[3], pTxCtrl->dataRatePolicy[2],
    709 		pTxCtrl->dataRatePolicy[1], pTxCtrl->dataRatePolicy[0]));
    710     WLAN_OS_REPORT(("dataPktDescAttrib            = 0x%x\n", pTxCtrl->dataPktDescAttrib));
    711     WLAN_OS_REPORT(("--------------------------------------------------------\n"));
    712 
    713     WLAN_OS_REPORT(("Parameters:\n"));
    714     WLAN_OS_REPORT(("----------\n"));
    715     WLAN_OS_REPORT(("headerConverMode             = %d\n", pTxCtrl->headerConverMode));
    716     WLAN_OS_REPORT(("currentPrivacyInvokedMode    = %d\n", pTxCtrl->currentPrivacyInvokedMode));
    717     WLAN_OS_REPORT(("eapolEncryptionStatus        = %d\n", pTxCtrl->eapolEncryptionStatus));
    718     WLAN_OS_REPORT(("encryptionFieldSize          = %d\n", pTxCtrl->encryptionFieldSize));
    719     WLAN_OS_REPORT(("currBssType                  = %d\n", pTxCtrl->currBssType));
    720     WLAN_OS_REPORT(("========================================================\n\n"));
    721 #endif
    722 }
    723 
    724 
    725 /***********************************************************************
    726  *                     txCtrlParams_printDebugCounters
    727  ***********************************************************************
    728 DESCRIPTION:    Print Tx statistics debug counters.
    729 ************************************************************************/
    730 void txCtrlParams_printDebugCounters(TI_HANDLE hTxCtrl)
    731 {
    732 #ifdef REPORT_LOG
    733     txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    734     TI_UINT32 ac;
    735 
    736     WLAN_OS_REPORT(("-------------- Tx-Ctrl Statistics Per AC ---------------\n"));
    737     WLAN_OS_REPORT(("========================================================\n"));
    738 
    739     WLAN_OS_REPORT(("---------- Packets Sent To Tx-Ctrl ---------------------\n"));
    740     for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
    741         WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumPktsSent[ac]));
    742 
    743     WLAN_OS_REPORT(("---------- Number of Queue-Stop (BP) -------------------\n"));
    744     for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
    745         WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumPktsBackpressure[ac]));
    746 
    747     WLAN_OS_REPORT(("---------- Number of AC Busy (Requeue pkt) -------------\n"));
    748     for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
    749         WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumPktsBusy[ac]));
    750 
    751     WLAN_OS_REPORT(("---------- Packets Sent to Xfer ------------------------\n"));
    752     for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
    753         WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumPktsXfered[ac]));
    754 
    755     WLAN_OS_REPORT(("----------- Xfer rc = Success --------------------------\n"));
    756     for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
    757         WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumPktsSuccess[ac]));
    758 
    759     WLAN_OS_REPORT(("----------- Xfer rc = Pending --------------------------\n"));
    760     for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
    761         WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumPktsPending[ac]));
    762 
    763     WLAN_OS_REPORT(("----------- Xfer rc = Error ----------------------------\n"));
    764     for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
    765         WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumPktsError[ac]));
    766 
    767     WLAN_OS_REPORT(("----------- Number of Tx-Complete Packets --------------\n"));
    768     for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
    769         WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumTxCmplt[ac]));
    770 
    771     WLAN_OS_REPORT(("----------- Number of Tx-Complete Packets TI_OK -----------\n"));
    772     for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
    773         WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumTxCmpltOk[ac]));
    774 
    775     WLAN_OS_REPORT(("----------- Number of Tx-Complete Packets Fails --------\n"));
    776     for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
    777         WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumTxCmpltError[ac]));
    778 
    779     WLAN_OS_REPORT(("----------- Number of Tx-Complete Bytes TI_OK -------------\n"));
    780     for(ac = 0; ac < MAX_NUM_OF_AC; ac++)
    781         WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumTxCmpltOkBytes[ac]));
    782     WLAN_OS_REPORT(("--------------------------------------------------------\n"));
    783 
    784     WLAN_OS_REPORT(("Total Number of Xfer-Complete Events = %d\n", pTxCtrl->dbgCounters.dbgNumXferCmplt));
    785     WLAN_OS_REPORT(("Total Number of Xfer-Pending  Events = %d\n",
    786 		pTxCtrl->dbgCounters.dbgNumPktsPending[0] +	pTxCtrl->dbgCounters.dbgNumPktsPending[1] +
    787 		pTxCtrl->dbgCounters.dbgNumPktsPending[2] +	pTxCtrl->dbgCounters.dbgNumPktsPending[3]));
    788     WLAN_OS_REPORT(("========================================================\n\n"));
    789 #endif
    790 }
    791 
    792 
    793 /***************************************************************************
    794 *                       txCtrlParams_resetDbgCounters
    795 ****************************************************************************
    796 * DESCRIPTION:  Reset the tx data module debug counters
    797 ***************************************************************************/
    798 void txCtrlParams_resetDbgCounters(TI_HANDLE hTxCtrl)
    799 {
    800     txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl;
    801 
    802     os_memoryZero(pTxCtrl->hOs, &pTxCtrl->dbgCounters, sizeof(txDataDbgCounters_t));
    803 }
    804 
    805 
    806 
    807 #endif   /* TI_DBG */
    808