PageRenderTime 31ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/drivers/net/wireless/tiwlan1251/common/src/core/data_ctrl/Ctrl/Ctrl.c

https://bitbucket.org/cyanogenmod/cm-kernel
C | 2251 lines | 1292 code | 359 blank | 600 comment | 174 complexity | 0029e10247c32a9f141d8e4d5eac7920 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
  1. /****************************************************************************
  2. **+-----------------------------------------------------------------------+**
  3. **| |**
  4. **| Copyright(c) 1998 - 2008 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. /* */
  37. /* MODULE: Ctrl.c */
  38. /* PURPOSE: Control module functions */
  39. /* */
  40. /***************************************************************************/
  41. #include "Ctrl.h"
  42. #include "802_11Defs.h"
  43. #include "DataCtrl_Api.h"
  44. #include "osApi.h"
  45. #include "report.h"
  46. #include "utils.h"
  47. #include "smeApi.h"
  48. #include "siteMgrApi.h"
  49. #include "Ethernet.h"
  50. #include "tx.h"
  51. #include "TrafficMonitorAPI.h"
  52. #include "TI_IPC_Api.h"
  53. #include "EvHandler.h"
  54. #include "apConn.h"
  55. #include "TNETW_Driver_api.h"
  56. #include "Core_AdaptTx.h"
  57. #include "whalCtrl_api.h"
  58. static void selectRateTable(TI_HANDLE hCtrlData, UINT32 rateMask);
  59. static void ctrlData_setTxRatePolicies(ctrlData_t *pCtrlData);
  60. static void ctrlData_resetCounters(TI_HANDLE hCtrlData);
  61. static void ctrlData_resetCounters(TI_HANDLE hCtrlData);
  62. static void ctrlData_UnregisterTrafficIntensityEvents (TI_HANDLE hCtrlData);
  63. static void ctrlData_RegisterTrafficIntensityEvents (TI_HANDLE hCtrlData);
  64. static UINT32 ctrlData_buildHwBitMapFromArray(policyClassRatesArray_t *pArray);
  65. static void ctrlData_storeTSRateSet(ctrlData_t *pCtrlData, txDataQosParams_t *tsrsParams);
  66. static rate_e ctrlData_getClosestTSRate(ctrlData_t *pCtrlData, UINT32 ac, rate_e givenRate);
  67. void ctrlData_TrafficThresholdCrossed(TI_HANDLE Context,UINT32 Cookie);
  68. /* definitions for medium usage calculations - in uSec units*/
  69. #define AVERAGE_ACK_TIME 10
  70. #define AVERAGE_CTS_TIME 20
  71. #define B_SIFS 10
  72. #define SHORT_PREAMBLE_TIME 96
  73. #define LONG_PREAMBLE_TIME 192
  74. #define OFDM_PREAMBLE 12
  75. #define OFDM_SIGNAL_EXT 6
  76. #define OFDM_PLCP_HDR 24
  77. #define OFDM_DURATION (B_SIFS + OFDM_PLCP_HDR + OFDM_SIGNAL_EXT)
  78. #define NONOFDM_SHORT_DURATION (B_SIFS + SHORT_PREAMBLE_TIME)
  79. #define NONOFDM_LONG_DURATION (B_SIFS + LONG_PREAMBLE_TIME)
  80. /*************************************************************************
  81. * ctrlData_create *
  82. **************************************************************************
  83. * DESCRIPTION: This function initializes the Ctrl data module.
  84. *
  85. * INPUT: hOs - handle to Os Abstraction Layer
  86. *
  87. * OUTPUT: TxCmplt_CB - call back function that return to configMngr
  88. * in order to register in the Hal
  89. *
  90. * RETURN: Handle to the allocated Ctrl data control block
  91. ************************************************************************/
  92. TI_HANDLE ctrlData_create(TI_HANDLE hOs)
  93. {
  94. ctrlData_t* hCtrlData;
  95. rateAdaptation_t* pRateAdaptation;
  96. #ifdef SUPPORT_4X
  97. fourX_t* pFourX;
  98. #endif
  99. classifier_t* pClsfr;
  100. if( hOs == NULL )
  101. {
  102. WLAN_OS_REPORT(("FATAL ERROR: ctrlData_create(): OS handle Error - Aborting\n"));
  103. return NULL;
  104. }
  105. /* alocate Control module control block */
  106. hCtrlData = os_memoryAlloc(hOs, (sizeof(ctrlData_t)));
  107. if(!hCtrlData)
  108. return NULL;
  109. /* create rate adaptation module */
  110. pRateAdaptation = rateAdaptation_create(hOs);
  111. #ifdef SUPPORT_4X
  112. /* create 4X module */
  113. pFourX = fourX_create(hOs);
  114. #endif
  115. /* create the classifier module */
  116. pClsfr = Classifier_create(hOs);
  117. if ( (!pRateAdaptation)
  118. #ifdef SUPPORT_4X
  119. || (!pFourX)
  120. #endif
  121. )
  122. {
  123. utils_nullMemoryFree(hOs, pRateAdaptation, sizeof(rateAdaptation_t));
  124. #ifdef SUPPORT_4X
  125. utils_nullMemoryFree(hOs, pFourX, sizeof(fourX_t));
  126. #endif
  127. utils_nullMemoryFree(hOs, hCtrlData, sizeof(ctrlData_t));
  128. WLAN_OS_REPORT(("FATAL ERROR: ctrlData_create(): Error Creating Ctrl Module - Aborting\n"));
  129. return(NULL);
  130. }
  131. /* reset control module control block */
  132. os_memoryZero(hOs, hCtrlData, (sizeof(ctrlData_t)));
  133. hCtrlData->pRateAdaptation = pRateAdaptation;
  134. #ifdef SUPPORT_4X
  135. hCtrlData->pFourX = pFourX;
  136. #endif
  137. hCtrlData->pClsfr = pClsfr;
  138. hCtrlData->hOs = hOs;
  139. return(hCtrlData);
  140. }
  141. /***************************************************************************
  142. * ctrlData_config *
  143. ****************************************************************************
  144. * DESCRIPTION: This function configures the Ctrl Data module
  145. *
  146. * INPUTS: hCtrlData - The object
  147. * hWhalCtrl - Handle to the Whal Ctrl object
  148. * hSiteMgrHandle - Handle to the Site Mngr object
  149. * hTxData - Handle to the Tx Data object
  150. * hRxData - Handle to the Rx Data object
  151. * hOs - Handle to the Os Abstraction Layer
  152. * hReport - Handle to the Report object
  153. * ctrlDataInitParams - pointer to Ctrl module init parameters
  154. * OUTPUT:
  155. *
  156. * RETURNS: OK - Configuration succesfull
  157. * NOK - Configuration unsuccesfull
  158. ***************************************************************************/
  159. TI_STATUS ctrlData_config(TI_HANDLE hCtrlData,
  160. TI_HANDLE hWhalCtrl,
  161. TI_HANDLE hSiteMgrHandle,
  162. TI_HANDLE hTxData,
  163. TI_HANDLE hRxData,
  164. TI_HANDLE hOs,
  165. TI_HANDLE hReport,
  166. TI_HANDLE hMemMngr,
  167. TI_HANDLE hEvHandler,
  168. TI_HANDLE hAPConnection,
  169. TI_HANDLE hTrafficMonitor,
  170. disassocSentCB_t disassocSentCBFunc,
  171. TI_HANDLE disassocSentCBObj,
  172. ctrlDataInitParams_t *ctrlDataInitParams)
  173. {
  174. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  175. TI_STATUS Status = OK;
  176. rateClassClients_e clientIDindex;
  177. txRateClassId_e TxRateIndex;
  178. UINT32 ac;
  179. /* check parameters validity */
  180. if( hCtrlData == NULL || hWhalCtrl == NULL || hSiteMgrHandle == NULL || hRxData == NULL ||
  181. hTxData == NULL || hOs == NULL || hReport == NULL || hMemMngr == NULL || ctrlDataInitParams == NULL)
  182. {
  183. WLAN_OS_REPORT(("FATAL ERROR: ctrlData_config(): Parameters Error - Aborting\n"));
  184. return NOK;
  185. }
  186. /* set objects handles */
  187. pCtrlData->hWhalCtrl = hWhalCtrl;
  188. pCtrlData->hSiteMgr = hSiteMgrHandle;
  189. pCtrlData->hTxData = hTxData;
  190. pCtrlData->hRxData = hRxData;
  191. pCtrlData->hOs = hOs;
  192. pCtrlData->hReport = hReport;
  193. pCtrlData->hAPConn = hAPConnection;
  194. pCtrlData->hEvHandler = hEvHandler;
  195. pCtrlData->hTrafficMonitor = hTrafficMonitor;
  196. pCtrlData->disassocSentCBObj = disassocSentCBObj;
  197. pCtrlData->disassocSentCBFunc = disassocSentCBFunc;
  198. /* set Control module parameters */
  199. pCtrlData->ctrlDataRateControlEnable = ctrlDataInitParams->ctrlDataRateControlEnable;
  200. pCtrlData->ctrlDataIbssProtectionType = ctrlDataInitParams->ctrlDataDesiredIbssProtection;
  201. pCtrlData->ctrlDataRtsCtsStatus = ctrlDataInitParams->ctrlDataDesiredCtsRtsStatus;
  202. #ifdef SUPPORT_4X
  203. pCtrlData->ctrlDataFourXEnable = ctrlDataInitParams->ctrlDataFourXEnable;
  204. pCtrlData->ctrlDataCerruentFourXstate = ctrlDataInitParams->ctrlDataFourXEnable;
  205. #else
  206. pCtrlData->ctrlDataFourXEnable = FALSE;
  207. pCtrlData->ctrlDataCerruentFourXstate = FALSE;
  208. #endif
  209. MAC_COPY(pCtrlData->hOs, (&pCtrlData->ctrlDataDeviceMacAddress),
  210. (&ctrlDataInitParams->ctrlDataDeviceMacAddress));
  211. pCtrlData->ctrlDataStartStoplinkControlAlg = DEF_START_STOP_LINK_CTRL_ALG;
  212. pCtrlData->ctrlDataCurrentBasicRate = DEF_BASIC_RATE;
  213. pCtrlData->ctrlDataBasicRateBitMask = DEF_BASIC_RATE_MASK;
  214. pCtrlData->ctrlDataCurrentBasicModulationType = DRV_MODULATION_QPSK;
  215. pCtrlData->ctrlDataCurrentModulationType = DEF_CURRENT_MUDULATION_TYPE;
  216. pCtrlData->ctrlDataCurrentBssType = BSS_INFRASTRUCTURE;
  217. os_memoryCopy(pCtrlData->hOs, &pCtrlData->ctrlDataRateTables,
  218. &ctrlDataInitParams->rateTable,
  219. sizeof(rateTables_t) );
  220. for (clientIDindex = (rateClassClients_e)0 ; clientIDindex < NUM_OF_RATE_CLASS_CLIENTS ; clientIDindex++)
  221. {
  222. pCtrlData->bIsClassAvailable[clientIDindex] = TRUE;
  223. /* by default all clients use all available rates */
  224. pCtrlData->currClientRateMask[clientIDindex] = ALL_RATES_AVAILABLE;
  225. pCtrlData->nextClientRateMask[clientIDindex] = ALL_RATES_AVAILABLE;
  226. /* Init Params are initialized for USER & SG policies only */
  227. /* Set short/long retry for all ACs */
  228. for (ac=0; ac < MAX_NUM_OF_AC; ac++)
  229. {
  230. pCtrlData->ctrlDataTxRatePolicy.rateClass[clientIDindex*MAX_NUM_OF_AC+ac].longRetryLimit = ctrlDataInitParams->ctrlDataTxRatePolicy[clientIDindex].longRetryLimit;
  231. pCtrlData->ctrlDataTxRatePolicy.rateClass[clientIDindex*MAX_NUM_OF_AC+ac].shortRetryLimit = ctrlDataInitParams->ctrlDataTxRatePolicy[clientIDindex].shortRetryLimit;
  232. }
  233. for (TxRateIndex = txPolicy54; TxRateIndex < MAX_NUM_OF_TX_RATES_IN_CLASS; TxRateIndex++)
  234. {
  235. pCtrlData->policyClassRatesArrayCck[clientIDindex].txRate[TxRateIndex] = ctrlDataInitParams->policyClassRatesArrayCck[clientIDindex].txRate[TxRateIndex];
  236. pCtrlData->policyClassRatesArrayPbcc[clientIDindex].txRate[TxRateIndex] = ctrlDataInitParams->policyClassRatesArrayPbcc[clientIDindex].txRate[TxRateIndex];
  237. pCtrlData->policyClassRatesArrayOfdm[clientIDindex].txRate[TxRateIndex] = ctrlDataInitParams->policyClassRatesArrayOfdm[clientIDindex].txRate[TxRateIndex];
  238. pCtrlData->policyClassRatesArrayOfdmA[clientIDindex].txRate[TxRateIndex] = ctrlDataInitParams->policyClassRatesArrayOfdmA[clientIDindex].txRate[TxRateIndex];
  239. }
  240. }
  241. /* By default use USER_RATE_CLASS */
  242. pCtrlData->currClientRateID = USER_RATE_CLASS;
  243. pCtrlData->configuredClientRateID = USER_RATE_CLASS;
  244. pCtrlData->ctrlDataCurrentRateTable = &pCtrlData->ctrlDataRateTables.ctrlDataCckRateTable;
  245. /* reset Counters */
  246. ctrlData_resetCounters(pCtrlData);
  247. /* Configure Rate Adaptation Module */
  248. rateAdaptation_config(pCtrlData->pRateAdaptation, hOs, hReport, pCtrlData, hEvHandler,
  249. hAPConnection, &ctrlDataInitParams->rateAdaptationInitParam);
  250. #ifdef SUPPORT_4X
  251. /* configure fourX Module */
  252. fourX_config(pCtrlData->pFourX, hOs, hReport, hMemMngr, hWhalCtrl, hTxData,
  253. &ctrlDataInitParams->fourXInitParams);
  254. #endif
  255. /* configure the classifier Module */
  256. Status = Classifier_config(pCtrlData->pClsfr, hOs, hReport, &ctrlDataInitParams->ClsfrInitParam);
  257. if (Status != OK)
  258. {
  259. WLAN_OS_REPORT(("FATAL ERROR: ctrlData_config(): Classifier_config() failed - Aborting\n"));
  260. return Status;
  261. }
  262. /* Initialize traffic intensity threshold parameters */
  263. pCtrlData->ctrlDataTrafficIntensityEventsEnabled = ctrlDataInitParams->ctrlDataTrafficThresholdEnabled;
  264. pCtrlData->ctrlDataTrafficIntensityThresholds.uHighThreshold = ctrlDataInitParams->ctrlDataTrafficThreshold.uHighThreshold;
  265. pCtrlData->ctrlDataTrafficIntensityThresholds.uLowThreshold = ctrlDataInitParams->ctrlDataTrafficThreshold.uLowThreshold;
  266. pCtrlData->ctrlDataTrafficIntensityThresholds.TestInterval = ctrlDataInitParams->ctrlDataTrafficThreshold.TestInterval;
  267. WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  268. ("\nTraffic Intensity parameters:\nEvents enabled = %d\nuHighThreshold = %d\nuLowThreshold = %d\nTestInterval = %d\n\n",
  269. pCtrlData->ctrlDataTrafficIntensityEventsEnabled,
  270. pCtrlData->ctrlDataTrafficIntensityThresholds.uHighThreshold,
  271. pCtrlData->ctrlDataTrafficIntensityThresholds.uLowThreshold,
  272. pCtrlData->ctrlDataTrafficIntensityThresholds.TestInterval));
  273. /* Register the traffic intensity events with the traffic monitor */
  274. ctrlData_RegisterTrafficIntensityEvents (pCtrlData);
  275. /* If the events are enabled, start notification, if disabled - then do nothing */
  276. ctrlData_ToggleTrafficIntensityNotification (pCtrlData, pCtrlData->ctrlDataTrafficIntensityEventsEnabled);
  277. WLAN_REPORT_INIT(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  278. (".....Ctrl Data configured successfully ...\n"));
  279. return OK;
  280. }
  281. /***************************************************************************
  282. * ctrlData_unLoad *
  283. ****************************************************************************
  284. * DESCRIPTION: This function unload the Ctrl data module.
  285. *
  286. * INPUTS: hCtrlData - the object
  287. *
  288. * OUTPUT:
  289. *
  290. * RETURNS: OK - Unload succesfull
  291. * NOK - Unload unsuccesfull
  292. ***************************************************************************/
  293. TI_STATUS ctrlData_unLoad(TI_HANDLE hCtrlData)
  294. {
  295. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  296. /* check parameters validity */
  297. if( pCtrlData == NULL )
  298. {
  299. WLAN_REPORT_ERROR(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  300. (" ctrlData_unLoad() : parametrs value error \n"));
  301. return NOK;
  302. }
  303. rateAdaptation_destroy(pCtrlData->pRateAdaptation);
  304. #ifdef SUPPORT_4X
  305. fourX_destroy(pCtrlData->pFourX);
  306. #endif
  307. Classifier_destroy(pCtrlData->pClsfr);
  308. /* free timer */
  309. /* free control module controll block */
  310. os_memoryFree(pCtrlData->hOs, hCtrlData, sizeof(ctrlData_t));
  311. return OK;
  312. }
  313. /***************************************************************************
  314. * ctrlData_getParam *
  315. ****************************************************************************
  316. * DESCRIPTION: get a specific parameter
  317. *
  318. * INPUTS: hCtrlData - the object
  319. *
  320. *
  321. * OUTPUT: pParamInfo - structure which include the value of
  322. * the requested parameter
  323. *
  324. * RETURNS: OK
  325. * NOK
  326. ***************************************************************************/
  327. TI_STATUS ctrlData_getParam(TI_HANDLE hCtrlData, paramInfo_t *pParamInfo)
  328. {
  329. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  330. /* WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  331. ("ctrlData_getParam() : param=0x%x \n", pParamInfo->paramType)); */
  332. switch (pParamInfo->paramType)
  333. {
  334. case CTRL_DATA_RATE_CONTROL_ENABLE_PARAM:
  335. pParamInfo->content.ctrlDataRateControlEnable = pCtrlData->ctrlDataRateControlEnable;
  336. break;
  337. case CTRL_DATA_FOUR_X_ENABLE_PARAM:
  338. pParamInfo->content.ctrlDataFourXEnable = pCtrlData->ctrlDataFourXEnable;
  339. break;
  340. case CTRL_DATA_FOUR_X_CURRRENT_STATUS_PARAM:
  341. if (pCtrlData->ctrlDataCurrentBssType == BSS_INFRASTRUCTURE)
  342. {
  343. pParamInfo->content.ctrlDataCerruentFourXstate = pCtrlData->ctrlDataCerruentFourXstate;
  344. } else {
  345. pParamInfo->content.ctrlDataCerruentFourXstate = pCtrlData->ctrlDataFourXEnable;
  346. }
  347. break;
  348. case CTRL_DATA_CURRENT_BSSID_PARAM:
  349. MAC_COPY(pCtrlData->hOs, (&pParamInfo->content.ctrlDataCurrentBSSID),
  350. (&pCtrlData->ctrlDataCurrentBSSID));
  351. break;
  352. case CTRL_DATA_CURRENT_BSS_TYPE_PARAM:
  353. pParamInfo->content.ctrlDataCurrentBssType = pCtrlData->ctrlDataCurrentBssType;
  354. break;
  355. case CTRL_DATA_CURRENT_MODULATION_TYPE_PARAM:
  356. pParamInfo->content.ctrlDataCurrentModulationType = pCtrlData->ctrlDataCurrentModulationType;
  357. break;
  358. case CTRL_DATA_CURRENT_PREAMBLE_TYPE_PARAM:
  359. pParamInfo->content.ctrlDataCurrentPreambleType = pCtrlData->ctrlDataCurrentPreambleType;
  360. break;
  361. case CTRL_DATA_MAC_ADDRESS:
  362. MAC_COPY(pCtrlData->hOs, (&pParamInfo->content.ctrlDataDeviceMacAddress), (&pCtrlData->ctrlDataDeviceMacAddress));
  363. break;
  364. case CTRL_DATA_CURRENT_BASIC_RATE_PARAM:
  365. pParamInfo->content.ctrlDataCurrentBasicRate = pCtrlData->ctrlDataCurrentBasicRate;
  366. break;
  367. case CTRL_DATA_CURRENT_BASIC_RATE_MASK_PARAM:
  368. pParamInfo->content.ctrlDataBasicRateBitMask = pCtrlData->ctrlDataBasicRateBitMask;
  369. break;
  370. case CTRL_DATA_CURRENT_BASIC_MODULATION_PARAM:
  371. pParamInfo->content.ctrlDataCurrentBasicModulationType = pCtrlData->ctrlDataCurrentBasicModulationType;
  372. break;
  373. case CTRL_DATA_COUNTERS_PARAM:
  374. os_memoryCopy(pCtrlData->hOs,&pParamInfo->content.ctrlDataCounters,
  375. &pCtrlData->ctrlDataCounters, sizeof(ctrlDataCounters_t));
  376. break;
  377. case CTRL_DATA_CURRENT_SUPPORTED_RATE_MASK_PARAM:
  378. pParamInfo->content.ctrlDataCurrentRateMask = pCtrlData->ctrlDataCurrentRateMask;
  379. break;
  380. case CTRL_DATA_CURRENT_PROTECTION_STATUS_PARAM:
  381. pParamInfo->content.ctrlDataProtectionEnabled = pCtrlData->ctrlDataProtectionEnabled;
  382. break;
  383. case CTRL_DATA_CURRENT_IBSS_PROTECTION_PARAM:
  384. pParamInfo->content.ctrlDataIbssProtecionType = pCtrlData->ctrlDataIbssProtectionType;
  385. break;
  386. case CTRL_DATA_CURRENT_RTS_CTS_STATUS_PARAM:
  387. pParamInfo->content.ctrlDataRtsCtsStatus = pCtrlData->ctrlDataRtsCtsStatus;
  388. break;
  389. case CTRL_DATA_CLSFR_TYPE:
  390. Classifier_getClsfrType (pCtrlData->pClsfr,&pParamInfo->content.ctrlDataClsfrType);
  391. break;
  392. /*
  393. * NOTE: currently supporting only USER_RATE_CLASS!!!!!!!!!
  394. */
  395. case CTRL_DATA_SHORT_RETRY_LIMIT_PARAM:
  396. pParamInfo->content.TxRatePolicy.rateClass[USER_RATE_CLASS].shortRetryLimit = pCtrlData->ctrlDataTxRatePolicy.rateClass[USER_RATE_CLASS].shortRetryLimit;
  397. break;
  398. /*
  399. * NOTE: currently supporting only ONE txRatePolicy!!!!!!!!!
  400. */
  401. case CTRL_DATA_LONG_RETRY_LIMIT_PARAM:
  402. pParamInfo->content.TxRatePolicy.rateClass[USER_RATE_CLASS].longRetryLimit = pCtrlData->ctrlDataTxRatePolicy.rateClass[USER_RATE_CLASS].longRetryLimit;
  403. break;
  404. case CTRL_DATA_TRAFFIC_INTENSITY_THRESHOLD:
  405. pParamInfo->content.ctrlDataTrafficIntensityThresholds.uHighThreshold = pCtrlData->ctrlDataTrafficIntensityThresholds.uHighThreshold;
  406. pParamInfo->content.ctrlDataTrafficIntensityThresholds.uLowThreshold = pCtrlData->ctrlDataTrafficIntensityThresholds.uLowThreshold;
  407. pParamInfo->content.ctrlDataTrafficIntensityThresholds.TestInterval = pCtrlData->ctrlDataTrafficIntensityThresholds.TestInterval;
  408. break;
  409. default:
  410. return (PARAM_NOT_SUPPORTED);
  411. /* WLAN_REPORT_ERROR(pCtrlData->hReport, TX_DATA_MODULE_LOG,
  412. (" ctrlData_getParam() : PARAMETER NOT SUPPORTED \n"));
  413. return NOK;
  414. break; - unreachable */
  415. }
  416. return (OK);
  417. }
  418. /***************************************************************************
  419. * ctrlData_getParam *
  420. ****************************************************************************
  421. * DESCRIPTION: get a specific parameter
  422. *
  423. * INPUTS: hCtrlData - the object
  424. *
  425. *
  426. * OUTPUT: pParamInfo - structure which include the value of
  427. * the requested parameter
  428. *
  429. * RETURNS: OK
  430. * NOK
  431. ***************************************************************************/
  432. /* note: ctrlData_getParamPartial() is part of ctrlData_getParam() it was implemented to reduce Stack usage */
  433. TI_STATUS ctrlData_getParamPartial(TI_HANDLE hCtrlData, paramInfoPartial_t *pParamInfo)
  434. {
  435. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  436. switch (pParamInfo->paramType)
  437. {
  438. case CTRL_DATA_CURRENT_PREAMBLE_TYPE_PARAM:
  439. pParamInfo->content.ctrlDataCurrentPreambleType = pCtrlData->ctrlDataCurrentPreambleType;
  440. break;
  441. default:
  442. return (PARAM_NOT_SUPPORTED);
  443. }
  444. return (OK);
  445. }
  446. /***************************************************************************
  447. * ctrlData_buildSupportedHwRates *
  448. ****************************************************************************
  449. * DESCRIPTION: builds HwRatesBitMap (supported rates) for txRatePolicy using 4 elements :
  450. * 1) AP support
  451. * 2) Driver support
  452. * 3) Client support (using currClientRateMask[clientIDindex] )
  453. * 4) Policy rates (retries per client)
  454. *
  455. * OUTPUT:
  456. *
  457. * RETURNS: OK
  458. * NOK
  459. ***************************************************************************/
  460. static UINT32 ctrlData_buildSupportedHwRates(ctrlData_rateAdapt_t *pDriverTable,
  461. UINT32 APsupport,
  462. UINT32 clientSupport,
  463. UINT32 policySupport)
  464. {
  465. UINT16 AppRateBitMap = 0;
  466. UINT32 HwRatesBitMap, DriverTableBitMap = 0;
  467. UINT32 i = 0;
  468. /* 1. Convert Rates table into bit mask */
  469. while (i <= pDriverTable->len)
  470. {
  471. DriverTableBitMap |= (1 << (pDriverTable->rateAdaptRatesTable[i++] - 1));
  472. }
  473. /* 2. AND with other masks */
  474. AppRateBitMap = (UINT16)(DriverTableBitMap & APsupport & clientSupport & policySupport);
  475. /* In case there are no mutual rates, try to ignore policy settings */
  476. if (AppRateBitMap == 0)
  477. {
  478. AppRateBitMap = (UINT16)(DriverTableBitMap & APsupport);
  479. }
  480. /* 3. Set total supported rates bit map for txRatePolicy */
  481. ConvertAppRatesToBitmap(AppRateBitMap, &HwRatesBitMap);
  482. return HwRatesBitMap;
  483. }
  484. /***************************************************************************
  485. * ctrlData_setTxRatePolicies *
  486. ****************************************************************************
  487. * DESCRIPTION: This function sets rate fallback policies to be configured to FW
  488. * If TSRS is defined to specific AC, the policy is derived from it,
  489. * otherwise it is derived from pre-defined map
  490. *
  491. * INPUTS: pCtrlData - the object
  492. *
  493. * RETURNS: -
  494. *
  495. ***************************************************************************/
  496. static void ctrlData_setTxRatePolicies(ctrlData_t *pCtrlData)
  497. {
  498. UINT32 ac, policyClassRateMask, supportedHwRatesBitMap, clientIDindex, hwRateIndex;
  499. UINT32 fwPolicyID;
  500. UINT8 shortRetryLimit, longRetryLimit;
  501. txRateClassId_e txRateIndex;
  502. whalParamInfo_t param;
  503. pCtrlData->currClientRateID = pCtrlData->configuredClientRateID;
  504. for (clientIDindex = 0, fwPolicyID = 0; clientIDindex < NUM_OF_RATE_CLASS_CLIENTS; clientIDindex++)
  505. {
  506. /* Retrieve retry limits stored in first AC of current class */
  507. shortRetryLimit = pCtrlData->ctrlDataTxRatePolicy.rateClass[fwPolicyID].shortRetryLimit;
  508. longRetryLimit = pCtrlData->ctrlDataTxRatePolicy.rateClass[fwPolicyID].longRetryLimit;
  509. /* By default assume that this class can be enabled */
  510. pCtrlData->bIsClassAvailable[clientIDindex] = TRUE;
  511. /* Update the rate mask from nextClientRateMask, where it was stored untill now */
  512. pCtrlData->currClientRateMask[clientIDindex] = pCtrlData->nextClientRateMask[clientIDindex];
  513. for (ac = 0; ac < MAX_NUM_OF_AC; ac++)
  514. {
  515. /* 1. Check if there is special rate set defined for this access category, */
  516. /* then verify that at least one rate is mutual between TSRS and class policy, */
  517. /* otherwise use default settings for this class */
  518. if (pCtrlData->tsrsParameters[ac].supportedRatesMask[clientIDindex] != 0)
  519. {
  520. /* Check if at least one rate is mutual between TSRS and current class policy, */
  521. /* otherwise use default for this class */
  522. policyClassRateMask = pCtrlData->tsrsParameters[ac].policyClassRateMask[clientIDindex];
  523. }
  524. else
  525. {
  526. policyClassRateMask = ctrlData_buildHwBitMapFromArray(&(pCtrlData->pCurrPolicyClassRatesArray[clientIDindex]));
  527. }
  528. /* 2. Build a bitMap for the supported rates */
  529. supportedHwRatesBitMap = ctrlData_buildSupportedHwRates(
  530. pCtrlData->ctrlDataCurrentRateTable, /* according to radio mode */
  531. pCtrlData->ctrlDataCurrentRateMask, /* AP supported rates */
  532. pCtrlData->currClientRateMask[clientIDindex], /* STA supported rates */
  533. policyClassRateMask); /* requested by class policy rates */
  534. if (supportedHwRatesBitMap == 0)
  535. {
  536. WLAN_REPORT_ERROR(pCtrlData->hReport,CTRL_DATA_MODULE_LOG,
  537. ("%s No supported rates for client %d, ac %d \n", __FUNCTION__, clientIDindex, ac));
  538. pCtrlData->bIsClassAvailable[clientIDindex] = FALSE;
  539. pCtrlData->currClientRateID = USER_RATE_CLASS;
  540. }
  541. /* 3. Configure retransmission for the rates */
  542. for (hwRateIndex = HW_BIT_RATE_54MBPS, txRateIndex = txPolicy54;
  543. txRateIndex < MAX_NUM_OF_TX_RATES_IN_CLASS;
  544. hwRateIndex >>= 1, txRateIndex++)
  545. {
  546. /* if supported rate */
  547. if (supportedHwRatesBitMap & hwRateIndex)
  548. {
  549. /* if rate fall back is enabled */
  550. if (pCtrlData->ctrlDataRateControlEnable)
  551. {
  552. /* Set retries as they were configured in ini file for this class; */
  553. /* make sure at least one retransmission is defined, */
  554. /* to take care of cases in which we ignored pre-defined policy */
  555. pCtrlData->ctrlDataTxRatePolicy.rateClass[fwPolicyID].txRate[txRateIndex] =
  556. (pCtrlData->pCurrPolicyClassRatesArray[clientIDindex].txRate[txRateIndex] > 1) ?
  557. pCtrlData->pCurrPolicyClassRatesArray[clientIDindex].txRate[txRateIndex] : 1;
  558. }
  559. else /* no rate fallback */
  560. {
  561. /* set max reties because no fall back is implemented */
  562. pCtrlData->ctrlDataTxRatePolicy.rateClass[fwPolicyID].txRate[txRateIndex] =
  563. (shortRetryLimit > longRetryLimit) ? shortRetryLimit : longRetryLimit;
  564. pCtrlData->ctrlDataTxRatePolicy.rateClass[fwPolicyID].flags |= TX_POLICY_FLAGS_TRUNCATE;
  565. }
  566. }
  567. else
  568. {
  569. pCtrlData->ctrlDataTxRatePolicy.rateClass[fwPolicyID].txRate[txRateIndex] = 0;
  570. }
  571. WLAN_REPORT_INFORMATION(pCtrlData->hReport,CTRL_DATA_MODULE_LOG,
  572. ("%s: AC %d, class %d, rate 0x%x[%d]\n", __FUNCTION__, ac, clientIDindex, hwRateIndex, pCtrlData->ctrlDataTxRatePolicy.rateClass[fwPolicyID].txRate[txRateIndex]));
  573. }
  574. /* Note that Long/Short retries are pre-set during configuration stage */
  575. /* 4. Finally, increase total number of policies */
  576. pCtrlData->tsrsParameters[ac].fwPolicyID[clientIDindex] = fwPolicyID++;
  577. }
  578. }
  579. /* Download policies to the FW. Num of policies is 8 - one for each AC for every class */
  580. WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  581. ("%s: num of Rate policies: %d\n", __FUNCTION__, fwPolicyID));
  582. pCtrlData->ctrlDataTxRatePolicy.numOfRateClasses = fwPolicyID;
  583. param.paramType = HAL_CTRL_TX_RATE_CLASS_PARAMS;
  584. param.content.pTxRatePlicy = &pCtrlData->ctrlDataTxRatePolicy;
  585. whalCtrl_SetParam(pCtrlData->hWhalCtrl, &param);
  586. }
  587. /***************************************************************************
  588. * ctrlData_setParam *
  589. ****************************************************************************
  590. * DESCRIPTION: set a specific parameter
  591. *
  592. * INPUTS: hCtrlData - the object
  593. * pParamInfo - structure which include the value to set for
  594. * the requested parameter
  595. *
  596. * OUTPUT:
  597. *
  598. * RETURNS: OK
  599. * NOK
  600. ***************************************************************************/
  601. TI_STATUS ctrlData_setParam(TI_HANDLE hCtrlData, paramInfo_t *pParamInfo)
  602. {
  603. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  604. whalParamInfo_t param;
  605. rateClassClients_e clientID;
  606. /* WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  607. ("ctrlData_setParam() : param=0x%x \n", pParamInfo->paramType)); */
  608. switch (pParamInfo->paramType)
  609. {
  610. case CTRL_DATA_RATE_CONTROL_ENABLE_PARAM:
  611. pCtrlData->ctrlDataRateControlEnable = pParamInfo->content.ctrlDataRateControlEnable;
  612. selectRateTable(pCtrlData, pCtrlData->ctrlDataCurrentRateMask);
  613. ctrlData_setTxRatePolicies(pCtrlData);
  614. rateAdaptation_buildRateMapTable(pCtrlData->pRateAdaptation,
  615. pCtrlData->ctrlDataCurrentRateTable,
  616. pCtrlData->ctrlDataCurrentRateMask,
  617. pCtrlData->currClientRateMask[pCtrlData->currClientRateID],
  618. pCtrlData->ctrlDataCurrentModulationType,
  619. pCtrlData->ctrlDataCerruentFourXstate,
  620. pCtrlData->ctrlDataCurrentBssType);
  621. if(pCtrlData->ctrlDataRateControlEnable == TRUE )
  622. {
  623. /* start rate adaptation algorithm */
  624. if( pCtrlData->ctrlDataStartStoplinkControlAlg == TRUE)
  625. {
  626. rateAdaptation_start(pCtrlData->pRateAdaptation);
  627. }
  628. else
  629. {
  630. /* stop rate adaptation algorithm */
  631. rateAdaptation_stop(pCtrlData->pRateAdaptation);
  632. }
  633. }
  634. else
  635. {
  636. rateAdaptation_stopTimer(pCtrlData->pRateAdaptation);
  637. }
  638. break;
  639. case CTRL_DATA_FOUR_X_ENABLE_PARAM:
  640. #ifdef SUPPORT_4X
  641. pCtrlData->ctrlDataFourXEnable = pParamInfo->content.ctrlDataFourXEnable;
  642. if(pCtrlData->ctrlDataStartStoplinkControlAlg == TRUE)
  643. {
  644. if(pCtrlData->ctrlDataFourXEnable == TRUE)
  645. {
  646. pCtrlData->ctrlDataCerruentFourXstate = TRUE;
  647. }
  648. else
  649. {
  650. pCtrlData->ctrlDataCerruentFourXstate = FALSE;
  651. }
  652. }
  653. rateAdaptation_update4xEnable(pCtrlData->pRateAdaptation,
  654. pCtrlData->ctrlDataCerruentFourXstate,
  655. pCtrlData->ctrlDataCurrentBssType );
  656. #else
  657. pCtrlData->ctrlDataFourXEnable = FALSE;
  658. pCtrlData->ctrlDataCerruentFourXstate = FALSE;
  659. #endif
  660. break;
  661. case CTRL_DATA_CURRENT_RATE_CLASS_CLIENT:
  662. /* set a new rate class client to be used on data packets */
  663. clientID = pParamInfo->content.ctrlDataRateClassID;
  664. /* always save the wanted configuration , even when not enabled */
  665. pCtrlData->configuredClientRateID = clientID;
  666. if (clientID == pCtrlData->currClientRateID)
  667. {
  668. /* Do nothing - already configured */
  669. break;
  670. }
  671. else
  672. {
  673. if (TRUE == pCtrlData->bIsClassAvailable[clientID])
  674. {
  675. /* use the new clientID + reset rateAdaptation tables */
  676. pCtrlData->currClientRateID = clientID;
  677. selectRateTable(pCtrlData, pCtrlData->ctrlDataCurrentRateMask);
  678. rateAdaptation_buildRateMapTable(pCtrlData->pRateAdaptation,
  679. pCtrlData->ctrlDataCurrentRateTable,
  680. pCtrlData->ctrlDataCurrentRateMask,
  681. pCtrlData->currClientRateMask[pCtrlData->currClientRateID],
  682. pCtrlData->ctrlDataCurrentModulationType,
  683. pCtrlData->ctrlDataCerruentFourXstate,
  684. pCtrlData->ctrlDataCurrentBssType);
  685. break;
  686. }
  687. else
  688. {
  689. /* The class could not be configured due to no rate support - don't use it */
  690. WLAN_REPORT_ERROR(pCtrlData->hReport,CTRL_DATA_MODULE_LOG,
  691. ("%s: Can't enable rate class ID %d\n",__FUNCTION__,clientID));
  692. break;
  693. }
  694. }
  695. case CTRL_DATA_NEXT_RATE_MASK_FOR_CLIENT:
  696. /* configure the next rate mask to be used for a specific client on the next connection */
  697. /* NOTE : changing USER_RATE_CLASS configuration is not advisable */
  698. pCtrlData->nextClientRateMask[pParamInfo->content.ctrlDataRateClassMask.clientID] =
  699. pParamInfo->content.ctrlDataRateClassMask.clientRateMask;
  700. break;
  701. case CTRL_DATA_FOUR_X_CURRRENT_STATUS_PARAM:
  702. #ifdef SUPPORT_4X
  703. if((pCtrlData->ctrlDataFourXEnable == TRUE) &&
  704. (pCtrlData->ctrlDataCurrentBssType == BSS_INFRASTRUCTURE))
  705. pCtrlData->ctrlDataCerruentFourXstate = pParamInfo->content.ctrlDataCerruentFourXstate;
  706. else
  707. pCtrlData->ctrlDataCerruentFourXstate = FALSE;
  708. #else
  709. pCtrlData->ctrlDataCerruentFourXstate = FALSE;
  710. #endif
  711. break;
  712. case CTRL_DATA_CURRENT_BSSID_PARAM:
  713. MAC_COPY(pCtrlData->hOs, (&pCtrlData->ctrlDataCurrentBSSID),
  714. (&pParamInfo->content.ctrlDataCurrentBSSID));
  715. break;
  716. case CTRL_DATA_CURRENT_BSS_TYPE_PARAM:
  717. if( pParamInfo->content.ctrlDataCurrentBssType != BSS_INFRASTRUCTURE &&
  718. pParamInfo->content.ctrlDataCurrentBssType != BSS_INDEPENDENT )
  719. return(PARAM_VALUE_NOT_VALID);
  720. pCtrlData->ctrlDataCurrentBssType = pParamInfo->content.ctrlDataCurrentBssType;
  721. break;
  722. case CTRL_DATA_CURRENT_MODULATION_TYPE_PARAM:
  723. pCtrlData->ctrlDataCurrentModulationType = pParamInfo->content.ctrlDataCurrentModulationType;
  724. /* update rate modulatin table for Rate adaptation algorithm */
  725. rateAdaptation_updateModulation(pCtrlData->pRateAdaptation,
  726. pCtrlData->ctrlDataCurrentModulationType,
  727. pCtrlData->ctrlDataCurrentBssType);
  728. break;
  729. case CTRL_DATA_CURRENT_PREAMBLE_TYPE_PARAM:
  730. if( pParamInfo->content.ctrlDataCurrentPreambleType != PREAMBLE_LONG &&
  731. pParamInfo->content.ctrlDataCurrentPreambleType != PREAMBLE_SHORT )
  732. return(PARAM_VALUE_NOT_VALID);
  733. pCtrlData->ctrlDataCurrentPreambleType = pParamInfo->content.ctrlDataCurrentPreambleType;
  734. break;
  735. case CTRL_DATA_MAC_ADDRESS:
  736. {
  737. int status;
  738. status = whalCtrl_SetMacAddress(pCtrlData->hWhalCtrl, &pParamInfo->content.ctrlDataDeviceMacAddress);
  739. WLAN_REPORT_ERROR(pCtrlData->hReport, TX_DATA_MODULE_LOG,
  740. (" ctrlData_setParam() : MAC ADDRESS SET STATUS: %d \n",status));
  741. if(status == OK)
  742. MAC_COPY(pCtrlData->hOs, (&pCtrlData->ctrlDataDeviceMacAddress),
  743. (&pParamInfo->content.ctrlDataDeviceMacAddress));
  744. }
  745. break;
  746. case CTRL_DATA_CURRENT_BASIC_RATE_PARAM:
  747. pCtrlData->ctrlDataCurrentBasicRate = pParamInfo->content.ctrlDataCurrentBasicRate;
  748. /* for Basic Rate Set use the USER_RATE_CLASS (otherwise we could get 0 rates) */
  749. pCtrlData->ctrlDataBasicRateBitMask = rateAdaptation_Utils_buildRateBitMap(pCtrlData->pRateAdaptation,
  750. pCtrlData->ctrlDataCurrentRateTable,
  751. pCtrlData->ctrlDataCurrentBasicRate,
  752. pCtrlData->ctrlDataCurrentRateMask,
  753. pCtrlData->currClientRateMask[USER_RATE_CLASS]);
  754. break;
  755. case CTRL_DATA_CURRENT_BASIC_RATE_MASK_PARAM:
  756. pCtrlData->ctrlDataBasicRateBitMask = pParamInfo->content.ctrlDataBasicRateBitMask;
  757. break;
  758. case CTRL_DATA_CURRENT_BASIC_MODULATION_PARAM:
  759. pCtrlData->ctrlDataCurrentBasicModulationType = pParamInfo->content.ctrlDataCurrentBasicModulationType;
  760. break;
  761. case CTRL_DATA_CURRENT_SUPPORTED_RATE_MASK_PARAM:
  762. pCtrlData->ctrlDataCurrentRateMask = pParamInfo->content.ctrlDataCurrentRateMask;
  763. selectRateTable(pCtrlData, pCtrlData->ctrlDataCurrentRateMask);
  764. rateAdaptation_buildRateMapTable(pCtrlData->pRateAdaptation,
  765. pCtrlData->ctrlDataCurrentRateTable,
  766. pCtrlData->ctrlDataCurrentRateMask,
  767. pCtrlData->currClientRateMask[pCtrlData->currClientRateID],
  768. (modulationType_e)pCtrlData->ctrlDataCerruentFourXstate,
  769. pCtrlData->ctrlDataCurrentModulationType,
  770. pCtrlData->ctrlDataCurrentBssType);
  771. break;
  772. case CTRL_DATA_CURRENT_ACTIVE_RATE_PARAM:
  773. rateAdaptation_setCurrentRate(pCtrlData->pRateAdaptation, pParamInfo->content.ctrlDataCurrentActiveRate);
  774. break;
  775. case CTRL_DATA_TSRS_PARAM:
  776. ctrlData_storeTSRateSet(pCtrlData, &pParamInfo->content.txDataQosParams);
  777. break;
  778. case CTRL_DATA_CURRENT_PROTECTION_STATUS_PARAM:
  779. if (pCtrlData->ctrlDataProtectionEnabled != pParamInfo->content.ctrlDataProtectionEnabled)
  780. {
  781. pCtrlData->ctrlDataProtectionEnabled = pParamInfo->content.ctrlDataProtectionEnabled;
  782. /* set indication also to TNET */
  783. param.paramType = HAL_CTRL_CTS_TO_SELF_PARAM;
  784. if(pCtrlData->ctrlDataProtectionEnabled == TRUE)
  785. param.content.halCtrlCtsToSelf = CTS_TO_SELF_ENABLE;
  786. else
  787. param.content.halCtrlCtsToSelf = CTS_TO_SELF_DISABLE;
  788. whalCtrl_SetParam(pCtrlData->hWhalCtrl,&param);
  789. /* In case of using protection fragmentation should be disabled */
  790. param.paramType = HAL_CTRL_FRAG_THRESHOLD_PARAM;
  791. if(pCtrlData->ctrlDataProtectionEnabled == TRUE)
  792. {
  793. /* save last non-protection mode fragmentation threshold */
  794. whalCtrl_GetParam(pCtrlData->hWhalCtrl,&param);
  795. pCtrlData->lastFragmentThreshold = param.content.halCtrlFragThreshold;
  796. /* set fragmentation threshold to max (disable) */
  797. param.content.halCtrlFragThreshold = HAL_CTRL_FRAG_THRESHOLD_MAX;
  798. }
  799. else
  800. param.content.halCtrlFragThreshold = pCtrlData->lastFragmentThreshold;
  801. whalCtrl_SetParam(pCtrlData->hWhalCtrl,&param);
  802. }
  803. break;
  804. case CTRL_DATA_CURRENT_IBSS_PROTECTION_PARAM:
  805. pCtrlData->ctrlDataIbssProtectionType = pParamInfo->content.ctrlDataIbssProtecionType;
  806. /* set indication also to TNET */
  807. param.paramType = HAL_CTRL_CTS_TO_SELF_PARAM;
  808. if(pCtrlData->ctrlDataIbssProtectionType != ERP_PROTECTION_NONE)
  809. param.content.halCtrlCtsToSelf = CTS_TO_SELF_ENABLE;
  810. else
  811. param.content.halCtrlCtsToSelf = CTS_TO_SELF_DISABLE;
  812. whalCtrl_SetParam(pCtrlData->hWhalCtrl,&param);
  813. break;
  814. case CTRL_DATA_CURRENT_RTS_CTS_STATUS_PARAM:
  815. pCtrlData->ctrlDataRtsCtsStatus = pParamInfo->content.ctrlDataRtsCtsStatus;
  816. break;
  817. case CTRL_DATA_CLSFR_TYPE:
  818. ctrlData_clsfrSetClsfrType (pCtrlData->pClsfr,pParamInfo->content.ctrlDataClsfrType);
  819. break;
  820. case CTRL_DATA_CLSFR_CONFIG:
  821. Classifier_InsertClsfrEntry(pCtrlData->pClsfr, 1, &pParamInfo->content.ctrlDataClsfrInsertTable);
  822. break;
  823. case CTRL_DATA_CLSFR_REMOVE_ENTRY:
  824. classifier_RemoveClsfrEntry(pCtrlData->pClsfr, &pParamInfo->content.ctrlDataClsfrInsertTable);
  825. break;
  826. case CTRL_DATA_GET_USER_PRIORITY_OF_STREAM:
  827. Classifier_deriveUserPriorityFromStream (pCtrlData->pClsfr,&pParamInfo->content.ctrlDataUpOfStream);
  828. break;
  829. /*
  830. * NOTE: currently supporting only ONE txRatePolicy!!!!!!!!!
  831. */
  832. case CTRL_DATA_SHORT_RETRY_LIMIT_PARAM:
  833. pCtrlData->ctrlDataTxRatePolicy.rateClass[USER_RATE_CLASS].shortRetryLimit = pParamInfo->content.TxRatePolicy.rateClass[USER_RATE_CLASS].shortRetryLimit;
  834. break;
  835. /*
  836. * NOTE: currently supporting only ONE txRatePolicy!!!!!!!!!
  837. */
  838. case CTRL_DATA_LONG_RETRY_LIMIT_PARAM:
  839. pCtrlData->ctrlDataTxRatePolicy.rateClass[USER_RATE_CLASS].longRetryLimit = pParamInfo->content.TxRatePolicy.rateClass[USER_RATE_CLASS].longRetryLimit;
  840. break;
  841. case CTRL_DATA_TOGGLE_TRAFFIC_INTENSITY_EVENTS:
  842. /* Enable or disable events according to flag */
  843. ctrlData_ToggleTrafficIntensityNotification (pCtrlData, (BOOL)pParamInfo->content.ctrlDataTrafficIntensityEventsFlag);
  844. break;
  845. case CTRL_DATA_TRAFFIC_INTENSITY_THRESHOLD:
  846. {
  847. OS_802_11_TRAFFIC_INTENSITY_THRESHOLD_PARAMS *localParams = &pParamInfo->content.ctrlDataTrafficIntensityThresholds;
  848. BOOL savedEnableFlag; /* Used to save previous enable/disable flag - before stopping/starting events for change in params */
  849. /* If any of the parameters has changed, we need to re-register with the Traffic Monitor */
  850. if ((localParams->uHighThreshold != pCtrlData->ctrlDataTrafficIntensityThresholds.uHighThreshold) ||
  851. (localParams->uLowThreshold != pCtrlData->ctrlDataTrafficIntensityThresholds.uLowThreshold) ||
  852. (localParams->TestInterval != pCtrlData->ctrlDataTrafficIntensityThresholds.TestInterval))
  853. {
  854. os_memoryCopy(pCtrlData->hOs, &pCtrlData->ctrlDataTrafficIntensityThresholds,
  855. localParams,
  856. sizeof(OS_802_11_TRAFFIC_INTENSITY_THRESHOLD_PARAMS));
  857. savedEnableFlag = pCtrlData->ctrlDataTrafficIntensityEventsEnabled;
  858. /* Turn off traffic events */
  859. ctrlData_ToggleTrafficIntensityNotification (pCtrlData, FALSE);
  860. /* Unregister current events */
  861. ctrlData_UnregisterTrafficIntensityEvents (pCtrlData);
  862. /* And re-register with new thresholds */
  863. ctrlData_RegisterTrafficIntensityEvents (pCtrlData);
  864. /* Enable events if they were enabled */
  865. ctrlData_ToggleTrafficIntensityNotification (pCtrlData, savedEnableFlag);
  866. }
  867. }
  868. break;
  869. default:
  870. WLAN_REPORT_ERROR(pCtrlData->hReport, TX_DATA_MODULE_LOG,
  871. (" ctrlData_setParam() : PARAMETER NOT SUPPORTED \n"));
  872. return (PARAM_NOT_SUPPORTED);
  873. /* break; - unrechable */
  874. }
  875. return (OK);
  876. }
  877. /***************************************************************************
  878. * ctrlData_getTspecsRateThresholds *
  879. ****************************************************************************
  880. * DESCRIPTION: The function retrieves the current low/high phy rate thresholds.
  881. *
  882. * INPUTS: hCtrlData - the object
  883. * uAC - The AC number.
  884. *
  885. * OUTPUT: pHighThreshold - The current phy rate high threshold
  886. * pHighThreshold - The current phy rate low threshold
  887. *
  888. * RETURNS:
  889. ***************************************************************************/
  890. void ctrlData_getTspecsRateThresholds(TI_HANDLE hCtrlData, UINT8 uAC, UINT32* pHighThreshold, UINT32* pLowThreshold)
  891. {
  892. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  893. rateAdaptation_t* pRateAdaptation = (rateAdaptation_t*)pCtrlData->pRateAdaptation;
  894. *pHighThreshold = hostToUtilityRate(RateNumberToHost(pRateAdaptation->tspecsRateParameters[uAC].highRateThreshold));
  895. *pLowThreshold = hostToUtilityRate(RateNumberToHost(pRateAdaptation->tspecsRateParameters[uAC].lowRateThreshold));
  896. }
  897. /***************************************************************************
  898. * selectRateTable *
  899. ****************************************************************************
  900. * DESCRIPTION:
  901. *
  902. * INPUTS: hCtrlData - the object
  903. *
  904. * OUTPUT:
  905. *
  906. * RETURNS:
  907. ***************************************************************************/
  908. static void selectRateTable(TI_HANDLE hCtrlData, UINT32 rateMask)
  909. {
  910. paramInfo_t param;
  911. rate_e rate;
  912. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  913. rate = getMaxRatefromBitmap(rateMask);
  914. param.paramType = SITE_MGR_OPERATIONAL_MODE_PARAM;
  915. siteMgr_getParam(pCtrlData->hSiteMgr, &param);
  916. switch(param.content.siteMgrDot11OperationalMode)
  917. {
  918. case DOT11_B_MODE:
  919. {
  920. if(rate == DRV_RATE_22M)
  921. {
  922. pCtrlData->ctrlDataCurrentRateTable = &pCtrlData->ctrlDataRateTables.ctrlDataPbccRateTable;
  923. pCtrlData->pCurrPolicyClassRatesArray = pCtrlData->policyClassRatesArrayPbcc;
  924. }
  925. else
  926. {
  927. pCtrlData->ctrlDataCurrentRateTable = &pCtrlData->ctrlDataRateTables.ctrlDataCckRateTable;
  928. pCtrlData->pCurrPolicyClassRatesArray = pCtrlData->policyClassRatesArrayCck;
  929. }
  930. }
  931. break;
  932. case DOT11_G_MODE:
  933. if( (rate == DRV_RATE_22M) ||
  934. (rate == DRV_RATE_11M) ||
  935. (rate == DRV_RATE_5_5M)||
  936. (rate == DRV_RATE_2M) ||
  937. (rate == DRV_RATE_1M) )
  938. {
  939. pCtrlData->ctrlDataCurrentRateTable = &pCtrlData->ctrlDataRateTables.ctrlDataPbccRateTable;
  940. pCtrlData->pCurrPolicyClassRatesArray = pCtrlData->policyClassRatesArrayPbcc;
  941. }
  942. else
  943. {
  944. pCtrlData->ctrlDataCurrentRateTable = &pCtrlData->ctrlDataRateTables.ctrlDataOfdmRateTable ;
  945. pCtrlData->pCurrPolicyClassRatesArray = pCtrlData->policyClassRatesArrayOfdm;
  946. }
  947. break;
  948. case DOT11_A_MODE:
  949. pCtrlData->ctrlDataCurrentRateTable = &pCtrlData->ctrlDataRateTables.ctrlDataOfdmARateTable;
  950. pCtrlData->pCurrPolicyClassRatesArray = pCtrlData->policyClassRatesArrayOfdmA;
  951. break;
  952. case DOT11_DUAL_MODE:
  953. case DOT11_MAX_MODE:
  954. WLAN_REPORT_ERROR(pCtrlData->hReport,CTRL_DATA_MODULE_LOG,
  955. ("%s ctrlDataCurrentRateTable not configured !!!",__FUNCTION__));
  956. break;
  957. }
  958. }
  959. /***************************************************************************
  960. * ctrlData_start *
  961. ****************************************************************************
  962. * DESCRIPTION: This function start the link control algorithms. It start
  963. * each algorithm (Rate Adaptation) if needed.
  964. *
  965. * INPUTS: hCtrlData - the object
  966. *
  967. * OUTPUT:
  968. *
  969. * RETURNS: OK
  970. * NOK
  971. ***************************************************************************/
  972. TI_STATUS ctrlData_start(TI_HANDLE hCtrlData)
  973. {
  974. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  975. pCtrlData->ctrlDataStartStoplinkControlAlg = TRUE;
  976. /* start Rate Adaptation if needed */
  977. if(pCtrlData->ctrlDataRateControlEnable == TRUE)
  978. {
  979. rateAdaptation_start(pCtrlData->pRateAdaptation);
  980. }
  981. WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  982. (" ctrlData_start() : Link control algorithms started successfully \n"));
  983. return OK;
  984. }
  985. /***************************************************************************
  986. * ctrlData_stop *
  987. ****************************************************************************
  988. * DESCRIPTION: This function stop the link control algorithms.
  989. *
  990. * INPUTS: hCtrlData - the object
  991. *
  992. * OUTPUT:
  993. *
  994. * RETURNS: OK
  995. * NOK
  996. ***************************************************************************/
  997. TI_STATUS ctrlData_stop(TI_HANDLE hCtrlData)
  998. {
  999. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1000. /* stop link control algorithm */
  1001. pCtrlData->ctrlDataStartStoplinkControlAlg = FALSE;
  1002. /* set modulation option to default value*/
  1003. pCtrlData->ctrlDataCurrentModulationType = DEF_CURRENT_MUDULATION_TYPE;
  1004. /* set Preamble length option to default value*/
  1005. pCtrlData->ctrlDataCurrentPreambleType = DEF_CURRENT_PREAMBLE;
  1006. /* set mgmt rate to default value */
  1007. pCtrlData->ctrlDataCurrentBasicRate = DEF_BASIC_RATE;
  1008. pCtrlData->ctrlDataBasicRateBitMask = DEF_BASIC_RATE_MASK;
  1009. pCtrlData->ctrlDataCurrentBasicModulationType = DRV_MODULATION_QPSK;
  1010. os_memoryZero(pCtrlData->hOs,
  1011. &pCtrlData->tsrsParameters,
  1012. sizeof(pCtrlData->tsrsParameters));
  1013. WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  1014. (" ctrlData_stop() : Link control algorithms stoped \n"));
  1015. rateAdaptation_stop(pCtrlData->pRateAdaptation);
  1016. return OK;
  1017. }
  1018. /***************************************************************************
  1019. * ctrlData_receiveParamFromRx *
  1020. ****************************************************************************
  1021. * DESCRIPTION: This function receive Msdu Rx parameters from the Rx data
  1022. * module, update counters.
  1023. *
  1024. * INPUTS: hCtrlData - the object
  1025. * pRxMsduInfo - Information about the receive msdu
  1026. * OUTPUT:
  1027. *
  1028. * RETURNS: OK
  1029. * NOK
  1030. ***************************************************************************/
  1031. #ifdef SUPPORT_4X
  1032. TI_STATUS ctrlData_rxMsdu(TI_HANDLE hCtrlData,
  1033. mem_MSDU_T **pRxMsdu)
  1034. {
  1035. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1036. if(pCtrlData->ctrlDataStartStoplinkControlAlg == FALSE)
  1037. return OK;
  1038. if((pCtrlData->ctrlDataFourXEnable == TRUE) &&
  1039. (pCtrlData->ctrlDataCurrentBssType == BSS_INFRASTRUCTURE))
  1040. {
  1041. /* Call fourX function */
  1042. if(fourX_rxMsdu(pCtrlData->pFourX, pRxMsdu) != OK)
  1043. {
  1044. WLAN_REPORT_ERROR(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  1045. (" failed in fourX_rxMsdu\n"));
  1046. return NOK;
  1047. }
  1048. }
  1049. return OK;
  1050. }
  1051. #endif
  1052. /***************************************************************************
  1053. * ctrlData_getTxAttributes *
  1054. ****************************************************************************
  1055. * DESCRIPTION: This function set the transmited parameters for a
  1056. * specific msdu
  1057. *
  1058. * INPUTS: hCtrlData - the object
  1059. * txFlags - Information about the msdu
  1060. *
  1061. * OUTPUT: pTxAttr - pointer to the tx parameters structure
  1062. *
  1063. * RETURNS: OK
  1064. * NOK
  1065. ***************************************************************************/
  1066. TI_STATUS ctrlData_getTxAttributes(TI_HANDLE hCtrlData, UINT32 txFlags,
  1067. txData_attr_t *pTxAttr, UINT32 ac)
  1068. {
  1069. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1070. rateModulation4x_table_t* pRateModulation;
  1071. os_memoryZero(pCtrlData->hOs, pTxAttr, sizeof(txData_attr_t));
  1072. if( ((txFlags & TX_DATA_MULTICAST_FRAME) && (pCtrlData->ctrlDataCurrentBssType == BSS_INDEPENDENT)) ||
  1073. (txFlags & TX_DATA_MGMT_MSDU) )
  1074. {
  1075. /* BCAST packets in IBSS should be sent at 2M and not in the highest basic rate. */
  1076. if (pCtrlData->ctrlDataCurrentRateMask & DRV_RATE_MASK_2_BARKER)
  1077. {
  1078. pTxAttr->Rate = DRV_RATE_2M;
  1079. }
  1080. else
  1081. {
  1082. pTxAttr->Rate = ctrlData_getClosestTSRate(pCtrlData, ac, pCtrlData->ctrlDataCurrentBasicRate);
  1083. }
  1084. /* by default use USER_RATE_CLASS for this kind of packets */
  1085. pTxAttr->txRatePolicyId = pCtrlData->tsrsParameters[ac].fwPolicyID[USER_RATE_CLASS];
  1086. }
  1087. /* For regular data packets use the rate-adaptation rates. */
  1088. else
  1089. {
  1090. pRateModulation = rateAdaptation_getCurrent(pCtrlData->pRateAdaptation);
  1091. pTxAttr->Rate = ctrlData_getClosestTSRate(pCtrlData, ac, pRateModulation->rate);
  1092. /* rate class Id ( retries profile per rate) */
  1093. pTxAttr->txRatePolicyId = pCtrlData->tsrsParameters[ac].fwPolicyID[pCtrlData->currClientRateID];
  1094. /* For voice delivery PSPoll, use only basic rates */
  1095. if (txFlags & TX_DATA_PS_POLL)
  1096. {
  1097. paramInfo_t param;
  1098. modulationType_e tempModulation;
  1099. param.paramType = SITE_MGR_OPERATIONAL_MODE_PARAM;
  1100. siteMgr_getParam(pCtrlData->hSiteMgr, &param);
  1101. /* Get the max rate and modulation from the BasicRateBitMask. */
  1102. getMaxRate(pCtrlData->ctrlDataBasicRateBitMask,
  1103. &pTxAttr->Rate,
  1104. &tempModulation,
  1105. param.content.siteMgrDot11OperationalMode);
  1106. }
  1107. }
  1108. /* convert Application rate to HW rate */
  1109. ConvertAppRateToHwBitMapRate(pTxAttr->Rate, &(pTxAttr->HwRate));
  1110. WLAN_REPORT_DEBUG_TX(pCtrlData->hReport,
  1111. ("%s: Rate = %d, HwRate = 0x%x\n",
  1112. __FUNCTION__,
  1113. pTxAttr->Rate,
  1114. pTxAttr->HwRate));
  1115. return OK;
  1116. }
  1117. /***************************************************************************
  1118. * ctrlData_txCompleteStatus *
  1119. ****************************************************************************
  1120. * DESCRIPTION: This function is called by the Hal for every Tx supportedBitMap
  1121. * Interrupt - it update the rate adaptation algorithm about
  1122. * the status of the last transmission and used as a trigger
  1123. * for the Tx scheduler.
  1124. *
  1125. * INPUTS: hCtrlData - the object
  1126. * CmpltTxAttr - Information structure about the last
  1127. * transmission
  1128. *
  1129. * OUTPUT:
  1130. *
  1131. * RETURNS: void
  1132. ***************************************************************************/
  1133. void ctrlData_txCompleteStatus( TI_HANDLE hCtrlData,
  1134. txCompleteAttr_t *pTxCompleteAttr )
  1135. {
  1136. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1137. UINT8 txCompleteFlags;
  1138. BOOL frameDataType = 0;
  1139. rate_e txActualRate;
  1140. rate_e txRequestRate;
  1141. UINT8 qId;
  1142. txPacketIdAttr_t *pPacketId = (txPacketIdAttr_t*)pTxCompleteAttr->packetId;
  1143. /*
  1144. * perform rate adaptation algorithm if host processes packets
  1145. * and not TNET.
  1146. * NOTE: MSDU was already freed in sendPacketTransfer
  1147. */
  1148. frameDataType = pPacketId->bDataMsdu;
  1149. qId = pPacketId->txQid;
  1150. ConvertHwBitRateToAppRate(pTxCompleteAttr->rate, &txActualRate);
  1151. ConvertHwBitRateToAppRate(pPacketId->maxTransmitRate, &txRequestRate);
  1152. /* perform rate adaptation algorithm if needed */
  1153. if((pCtrlData->ctrlDataRateControlEnable == TRUE ) &&
  1154. (pCtrlData->ctrlDataStartStoplinkControlAlg == TRUE) &&
  1155. (frameDataType))
  1156. {
  1157. rateAdaptation_updateRateAdaptation(pCtrlData->pRateAdaptation, txActualRate,
  1158. txRequestRate,pTxCompleteAttr->status, 0);
  1159. }
  1160. txCompleteFlags = pPacketId->txCompleteFlags;
  1161. if(txCompleteFlags & TX_DATA_DISASSOC_SYNC_TRIG)
  1162. {
  1163. WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,("Call disconnect test upon NULL data"));
  1164. pCtrlData->disassocSentCBFunc( pCtrlData->disassocSentCBObj );
  1165. }
  1166. if(txCompleteFlags & TX_DATA_DEAUTH_SYNC_TRIG)
  1167. {
  1168. WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  1169. ("De Auth TxCmplt: txStatus = %d, txActualRate = %d \n",pTxCompleteAttr->status,pTxCompleteAttr->rate));
  1170. pCtrlData->disassocSentCBFunc( pCtrlData->disassocSentCBObj );
  1171. }
  1172. if(txData_isQueueUseMediumTime(pCtrlData->hTxData , qId) == TRUE )
  1173. {
  1174. WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  1175. (" ctrlData_txCompleteStatus() :usedTime = %d qNum = %d\n",
  1176. pTxCompleteAttr->actualDurationInAir, qId));
  1177. txData_updateUsedTime(pCtrlData->hTxData,
  1178. qId,
  1179. pTxCompleteAttr->actualDurationInAir);
  1180. }
  1181. /*
  1182. * update tx complete status to txData (which schedule another packet also );
  1183. */
  1184. txData_txCompleteUpdate( pCtrlData->hTxData, pTxCompleteAttr );
  1185. }
  1186. /***************************************************************************
  1187. * ctrlData_resetCounters *
  1188. ****************************************************************************
  1189. * DESCRIPTION: This function reset the Ctrl Data module counters
  1190. *
  1191. * INPUTS: hCtrlData - the object
  1192. *
  1193. * OUTPUT:
  1194. *
  1195. * RETURNS: void
  1196. ***************************************************************************/
  1197. static void ctrlData_resetCounters(TI_HANDLE hCtrlData)
  1198. {
  1199. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1200. os_memoryZero(pCtrlData->hOs,&pCtrlData->ctrlDataCounters,
  1201. sizeof(ctrlDataCounters_t));
  1202. }
  1203. /***************************************************************************
  1204. * ctrlData_getCurrBssTypeAndCurrBssId *
  1205. ****************************************************************************
  1206. * DESCRIPTION: This function return the current BSSID and the
  1207. * current BSS Type
  1208. *
  1209. * INPUTS: hCtrlData - the object
  1210. *
  1211. * OUTPUT: pCurrBssid - pointer to return the current bssid
  1212. * pCurrBssType - pointer to return the current bss type
  1213. *
  1214. * RETURNS: void
  1215. ***************************************************************************/
  1216. void ctrlData_getCurrBssTypeAndCurrBssId(TI_HANDLE hCtrlData, macAddress_t *pCurrBssid,
  1217. bssType_e *pCurrBssType)
  1218. {
  1219. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1220. MAC_COPY(pCtrlData->hOs, (pCurrBssid), (&pCtrlData->ctrlDataCurrentBSSID));
  1221. *pCurrBssType = pCtrlData->ctrlDataCurrentBssType;
  1222. }
  1223. #ifdef SUPPORT_4X
  1224. /***************************************************************************
  1225. * ctrlData_get4xInfoElemnt *
  1226. ****************************************************************************
  1227. * DESCRIPTION:
  1228. *
  1229. * INPUTS: hCtrlData - the object
  1230. *
  1231. * OUTPUT:
  1232. *
  1233. * RETURNS:
  1234. ***************************************************************************/
  1235. TI_STATUS ctrlData_get4xInfoElemnt(TI_HANDLE hCtrlData,
  1236. dot11_4X_t* fourXInfoElemnt)
  1237. {
  1238. TI_STATUS Status = NOK;
  1239. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1240. if((pCtrlData->ctrlDataFourXEnable == TRUE) &&
  1241. (pCtrlData->ctrlDataCurrentBssType == BSS_INFRASTRUCTURE))
  1242. {
  1243. Status = fourXManager_get4xInfoElemnt(pCtrlData->pFourX, fourXInfoElemnt);
  1244. }
  1245. return Status;
  1246. }
  1247. #endif
  1248. /***************************************************************************
  1249. * ctrlData_get4xStatus *
  1250. ****************************************************************************
  1251. * DESCRIPTION:
  1252. *
  1253. * INPUTS: hCtrlData - the object
  1254. *
  1255. * OUTPUT:
  1256. *
  1257. * RETURNS:
  1258. ***************************************************************************/
  1259. TI_STATUS ctrlData_get4xStatus(TI_HANDLE hCtrlData,BOOL* fourXEnable)
  1260. {
  1261. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1262. *fourXEnable = pCtrlData->ctrlDataCerruentFourXstate;
  1263. return OK;
  1264. }
  1265. #ifdef SUPPORT_4X
  1266. /***************************************************************************
  1267. * ctrlData_evalSite *
  1268. ****************************************************************************
  1269. * DESCRIPTION:
  1270. *
  1271. * INPUTS: hCtrlData - the object
  1272. *
  1273. * OUTPUT:
  1274. *
  1275. * RETURNS:
  1276. ***************************************************************************/
  1277. TI_STATUS ctrlData_evalSite(TI_HANDLE hCtrlData,
  1278. dot11_4X_t* site4xParams,
  1279. UINT32 *matchingLevel)
  1280. {
  1281. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1282. if((pCtrlData->ctrlDataFourXEnable == TRUE) &&
  1283. (pCtrlData->ctrlDataCurrentBssType == BSS_INFRASTRUCTURE))
  1284. {
  1285. return (fourXManager_evalSite(pCtrlData->pFourX, site4xParams, matchingLevel));
  1286. }
  1287. return OK;
  1288. }
  1289. #endif
  1290. /***************************************************************************
  1291. * ctrlData_setSite *
  1292. ****************************************************************************
  1293. * DESCRIPTION:
  1294. *
  1295. * INPUTS: hCtrlData - the object
  1296. *
  1297. * OUTPUT:
  1298. *
  1299. * RETURNS:
  1300. ***************************************************************************/
  1301. TI_STATUS ctrlData_setSite(TI_HANDLE hCtrlData,
  1302. dot11_4X_t* site4xParams)
  1303. {
  1304. TI_STATUS status = NOK;
  1305. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1306. #ifdef SUPPORT_4X
  1307. if((pCtrlData->ctrlDataFourXEnable == TRUE) &&
  1308. (pCtrlData->ctrlDataCurrentBssType == BSS_INFRASTRUCTURE))
  1309. {
  1310. status = fourXManager_setSite(pCtrlData->pFourX, site4xParams);
  1311. }
  1312. #endif
  1313. if(status != OK)
  1314. pCtrlData->ctrlDataCerruentFourXstate = FALSE;
  1315. else
  1316. pCtrlData->ctrlDataCerruentFourXstate = TRUE;
  1317. return status;
  1318. }
  1319. #ifdef SUPPORT_4X
  1320. /***************************************************************************
  1321. * ctrlData_txDequeueMsdu *
  1322. ****************************************************************************
  1323. * DESCRIPTION:
  1324. *
  1325. * INPUTS: hCtrlData - the object
  1326. *
  1327. * OUTPUT:
  1328. *
  1329. * RETURNS:
  1330. ***************************************************************************/
  1331. TI_STATUS ctrlData_txDequeueMsdu(TI_HANDLE hCtrlData,
  1332. mem_MSDU_T** buildMsduPtr,
  1333. MsduList_t* pMsduList,
  1334. whalTx_attr_t* pWhalTx_attr,
  1335. hwTxInformation_t* pHwTxInformation)
  1336. {
  1337. TI_STATUS status;
  1338. UINT32 currNumOfMsdu;
  1339. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1340. *buildMsduPtr = NULL;
  1341. currNumOfMsdu = msduList_getCurrNumOfMsdu(pMsduList);
  1342. if(currNumOfMsdu == 0)
  1343. return DO_NOT_SEND_MSDU;
  1344. if(pCtrlData->ctrlDataCerruentFourXstate == TRUE)
  1345. {
  1346. /* call 4x */
  1347. status = fourX_txMsduDeQueue(pCtrlData->pFourX, buildMsduPtr, pMsduList, pHwTxInformation);
  1348. if(status != OK)
  1349. {
  1350. return DO_NOT_SEND_MSDU;
  1351. }
  1352. ctrlData_getTxAttributes(pCtrlData, (*buildMsduPtr)->txFlags, pWhalTx_attr, QOS_AC_BE); /* stub */
  1353. return SEND_ONE_MSDU;
  1354. }
  1355. return FOUR_X_DISABLE;
  1356. }
  1357. /***************************************************************************
  1358. * ctrlData_txMsdu *
  1359. ****************************************************************************
  1360. * DESCRIPTION:
  1361. *
  1362. * INPUTS: hCtrlData - the object
  1363. *
  1364. * OUTPUT:
  1365. *
  1366. * RETURNS:
  1367. ***************************************************************************/
  1368. TI_STATUS ctrlData_txMsdu(TI_HANDLE hCtrlData,
  1369. mem_MSDU_T** msduPtr)
  1370. {
  1371. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1372. if(pCtrlData->ctrlDataCerruentFourXstate == TRUE)
  1373. {
  1374. fourX_txMsduBeforInsertToQueue(pCtrlData->pFourX, msduPtr);
  1375. }
  1376. return OK;
  1377. }
  1378. #endif /* SUPPORT_4X */
  1379. /***************************************************************************
  1380. * ctrlData_setTspecsRateEvent *
  1381. ****************************************************************************
  1382. * DESCRIPTION:
  1383. *
  1384. * INPUTS: hCtrlData - the object
  1385. *
  1386. * OUTPUT:
  1387. *
  1388. * RETURNS:
  1389. ***************************************************************************/
  1390. void ctrlData_setTspecsRateEvent(TI_HANDLE hCtrlData,
  1391. UINT8 acID,
  1392. BOOL enableEvent)
  1393. {
  1394. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1395. rateAdaptation_setTspecsRateEvent(pCtrlData->pRateAdaptation, acID, enableEvent);
  1396. }
  1397. /***************************************************************************
  1398. * ctrlData_setTspecsRateThresholds *
  1399. ****************************************************************************
  1400. * DESCRIPTION:
  1401. *
  1402. * INPUTS: hCtrlData - the object
  1403. *
  1404. * OUTPUT:
  1405. *
  1406. * RETURNS:
  1407. ***************************************************************************/
  1408. void ctrlData_setTspecsRateThresholds(TI_HANDLE hCtrlData,
  1409. UINT8 acID,
  1410. UINT8 highRateThreshold,
  1411. UINT8 lowRateThreshold)
  1412. {
  1413. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1414. rateAdaptation_setTspecsRateThresholds(pCtrlData->pRateAdaptation, acID, highRateThreshold, lowRateThreshold);
  1415. }
  1416. /************************************************************************
  1417. * Classifier functions
  1418. ************************************************************************ */
  1419. /************************************************************************
  1420. * ctrlData_clsfrClassifyTxMSDU
  1421. ************************************************************************
  1422. Input:
  1423. * hCtrlData: hCtrlData - the object
  1424. * pMsdu: pointer to the MSDU
  1425. * packet_DTag: NDIS Packet 802.1 user priority (UP)
  1426. Output:
  1427. OK on success and PARAM_VALUE_NOT_VALID in case of input parameters problems.
  1428. If the value PARAM_VALUE_NOT_VALID is returned, the MSDU qosTag field is zero.
  1429. Description:
  1430. This function performs the classification algorithm on the MSDU by calling the
  1431. Classifier_classifyTxMSDU API.
  1432. ************************************************************************/
  1433. TI_STATUS ctrlData_ClsfrClassifyTxMSDU(TI_HANDLE hCtrlData,
  1434. mem_MSDU_T *pMsdu,
  1435. UINT8 packet_DTag)
  1436. {
  1437. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1438. /* check parameters validity */
  1439. if(!hCtrlData)
  1440. return NOK;
  1441. if (pMsdu == NULL)
  1442. {
  1443. WLAN_REPORT_ERROR(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  1444. (" ctrlData_ClsfrClassifyTxMSDU() : parametrs value error (the MSDU's qosTag is not updated) \n"));
  1445. return PARAM_VALUE_NOT_VALID;
  1446. }
  1447. return (Classifier_classifyTxMSDU(pCtrlData->pClsfr, pMsdu, packet_DTag));
  1448. }
  1449. /************************************************************************
  1450. * ctrlData_clsfrSetClsfrType
  1451. ************************************************************************
  1452. Input:
  1453. * hCtrlData: hCtrlData - the object
  1454. * newClsfrType: the new classifier type
  1455. Output:
  1456. OK on success and PARAM_VALUE_NOT_VALID in case of input parameters problems.
  1457. If the value PARAM_VALUE_NOT_VALID is returned, the classifier type is not updated.
  1458. Description:
  1459. This function changes the active classifier type by calling the
  1460. Classifier_setClsfrType API.
  1461. ************************************************************************/
  1462. TI_STATUS ctrlData_clsfrSetClsfrType(TI_HANDLE hCtrlData,
  1463. clsfrTypeAndSupport newClsfrType)
  1464. {
  1465. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1466. /* check parameters validity */
  1467. if(!hCtrlData)
  1468. return PARAM_VALUE_NOT_VALID;
  1469. return (Classifier_setClsfrType(pCtrlData->pClsfr, (clsfr_type_e)newClsfrType.ClsfrType));
  1470. }
  1471. /*-----------------------------------------------------------------------------
  1472. Routine Name: ctrlData_ToggleTrafficIntensityNotification
  1473. Routine Description: turns ON/OFF traffic intensity notification events
  1474. from Traffic Monitor module
  1475. Arguments:
  1476. Return Value:
  1477. -----------------------------------------------------------------------------*/
  1478. void ctrlData_ToggleTrafficIntensityNotification (TI_HANDLE hCtrlData, BOOL enabledFlag)
  1479. {
  1480. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1481. UINT8 idx;
  1482. if (enabledFlag)
  1483. {
  1484. for (idx=0; idx < CTRL_DATA_TRAFFIC_INTENSITY_MAX_EVENTS; idx++)
  1485. {
  1486. TrafficMonitor_StartEventNotif (pCtrlData->hTrafficMonitor,pCtrlData->ctrlDataTrafficThresholdEvents[idx]);
  1487. }
  1488. WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  1489. ("ctrlData_ToggleTrafficIntensityNotification (TRUE)\n"));
  1490. }
  1491. else
  1492. {
  1493. for (idx=0; idx < CTRL_DATA_TRAFFIC_INTENSITY_MAX_EVENTS; idx++)
  1494. {
  1495. TrafficMonitor_StopEventNotif (pCtrlData->hTrafficMonitor,pCtrlData->ctrlDataTrafficThresholdEvents[idx]);
  1496. }
  1497. WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  1498. ("ctrlData_ToggleTrafficIntensityNotification (FALSE)\n"));
  1499. }
  1500. pCtrlData->ctrlDataTrafficIntensityEventsEnabled = enabledFlag;
  1501. }
  1502. /*-----------------------------------------------------------------------------
  1503. Routine Name: ctrlData_UnregisterTrafficIntensityEvents
  1504. Routine Description: unregisters existing events from traffic monitor
  1505. Arguments:
  1506. Return Value:
  1507. -----------------------------------------------------------------------------*/
  1508. static void ctrlData_UnregisterTrafficIntensityEvents (TI_HANDLE hCtrlData)
  1509. {
  1510. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1511. UINT8 idx;
  1512. /* Loop through events and unregister them */
  1513. for (idx=0; idx < CTRL_DATA_TRAFFIC_INTENSITY_MAX_EVENTS; idx++)
  1514. {
  1515. TrafficMonitor_UnregEvent (pCtrlData->hTrafficMonitor,pCtrlData->ctrlDataTrafficThresholdEvents[idx]);
  1516. }
  1517. WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  1518. ("ctrlData_UnregisterTrafficIntensityEvents: Unregistered all events\n"));
  1519. }
  1520. /*-----------------------------------------------------------------------------
  1521. Routine Name: ctrlData_RegisterTrafficIntensityEvents
  1522. Routine Description: Registers traffic intensity threshold events through traffic monitor
  1523. Arguments:
  1524. Return Value:
  1525. -----------------------------------------------------------------------------*/
  1526. static void ctrlData_RegisterTrafficIntensityEvents (TI_HANDLE hCtrlData)
  1527. {
  1528. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1529. TrafficAlertRegParm_t TrafficAlertRegParm;
  1530. TI_STATUS status;
  1531. /* Register high threshold "direction up" event */
  1532. TrafficAlertRegParm.CallBack = ctrlData_TrafficThresholdCrossed;
  1533. TrafficAlertRegParm.Context = hCtrlData;
  1534. TrafficAlertRegParm.Cookie = CTRL_DATA_TRAFFIC_INTENSITY_HIGH_CROSSED_ABOVE;
  1535. TrafficAlertRegParm.Direction = TRAFF_UP;
  1536. TrafficAlertRegParm.Trigger = TRAFF_EDGE;
  1537. TrafficAlertRegParm.TimeIntervalMs = pCtrlData->ctrlDataTrafficIntensityThresholds.TestInterval;
  1538. TrafficAlertRegParm.Threshold = pCtrlData->ctrlDataTrafficIntensityThresholds.uHighThreshold;
  1539. TrafficAlertRegParm.MonitorType = TX_RX_DIRECTED_FRAMES;
  1540. pCtrlData->ctrlDataTrafficThresholdEvents[0] = TrafficMonitor_RegEvent(pCtrlData->hTrafficMonitor,&TrafficAlertRegParm,FALSE);
  1541. if (pCtrlData->ctrlDataTrafficThresholdEvents[0] == NULL)
  1542. {
  1543. WLAN_REPORT_ERROR(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  1544. (" ctrlData_RegisterTrafficIntensityEvents() : Failed to register high treshold event (TRAFF_UP) \n"));
  1545. return;
  1546. }
  1547. /* Register high threshold "direction down" event*/
  1548. TrafficAlertRegParm.Cookie = CTRL_DATA_TRAFFIC_INTENSITY_HIGH_CROSSED_BELOW;
  1549. TrafficAlertRegParm.Direction = TRAFF_DOWN;
  1550. TrafficAlertRegParm.Trigger = TRAFF_EDGE;
  1551. TrafficAlertRegParm.Threshold = pCtrlData->ctrlDataTrafficIntensityThresholds.uHighThreshold;
  1552. pCtrlData->ctrlDataTrafficThresholdEvents[1] = TrafficMonitor_RegEvent(pCtrlData->hTrafficMonitor,&TrafficAlertRegParm,FALSE);
  1553. if (pCtrlData->ctrlDataTrafficThresholdEvents[1] == NULL)
  1554. {
  1555. WLAN_REPORT_ERROR(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  1556. (" ctrlData_RegisterTrafficIntensityEvents() : Failed to register high treshold event (TRAFF_DOWN) \n"));
  1557. return;
  1558. }
  1559. /* Define the "direction below" and "direction above" events as opposites (events that reset eachother)*/
  1560. status = TrafficMonitor_SetRstCondition(pCtrlData->hTrafficMonitor,
  1561. pCtrlData->ctrlDataTrafficThresholdEvents[0],
  1562. pCtrlData->ctrlDataTrafficThresholdEvents[1],
  1563. TRUE);
  1564. if (status != OK)
  1565. {
  1566. WLAN_REPORT_ERROR (pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  1567. ("ctrlData_RegisterTrafficIntensityEvents: TrafficMonitor_SetRstCondition returned status = %d\n",status));
  1568. }
  1569. /* Register low threshold "direction up" event */
  1570. TrafficAlertRegParm.Cookie = CTRL_DATA_TRAFFIC_INTENSITY_LOW_CROSSED_ABOVE;
  1571. TrafficAlertRegParm.Direction = TRAFF_UP;
  1572. TrafficAlertRegParm.Trigger = TRAFF_EDGE;
  1573. TrafficAlertRegParm.Threshold = pCtrlData->ctrlDataTrafficIntensityThresholds.uLowThreshold;
  1574. pCtrlData->ctrlDataTrafficThresholdEvents[2] = TrafficMonitor_RegEvent(pCtrlData->hTrafficMonitor,&TrafficAlertRegParm,FALSE);
  1575. if (pCtrlData->ctrlDataTrafficThresholdEvents[2] == NULL)
  1576. {
  1577. WLAN_REPORT_ERROR(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  1578. (" ctrlData_RegisterTrafficIntensityEvents() : Failed to register low treshold event (TRAFF_UP) \n"));
  1579. return;
  1580. }
  1581. /* Register low threshold "direction below" event */
  1582. TrafficAlertRegParm.Cookie = CTRL_DATA_TRAFFIC_INTENSITY_LOW_CROSSED_BELOW;
  1583. TrafficAlertRegParm.Direction = TRAFF_DOWN;
  1584. TrafficAlertRegParm.Trigger = TRAFF_EDGE;
  1585. TrafficAlertRegParm.Threshold = pCtrlData->ctrlDataTrafficIntensityThresholds.uLowThreshold;
  1586. pCtrlData->ctrlDataTrafficThresholdEvents[3] = TrafficMonitor_RegEvent(pCtrlData->hTrafficMonitor,&TrafficAlertRegParm,FALSE);
  1587. if (pCtrlData->ctrlDataTrafficThresholdEvents[3] == NULL)
  1588. {
  1589. WLAN_REPORT_ERROR(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  1590. (" ctrlData_RegisterTrafficIntensityEvents() : Failed to register low treshold event (TRAFF_DOWN) \n"));
  1591. return;
  1592. }
  1593. /* Define the "direction below" and "direction above" events as opposites (events that reset eachother)*/
  1594. status = TrafficMonitor_SetRstCondition(pCtrlData->hTrafficMonitor,
  1595. pCtrlData->ctrlDataTrafficThresholdEvents[2],
  1596. pCtrlData->ctrlDataTrafficThresholdEvents[3],
  1597. TRUE);
  1598. if (status != OK)
  1599. {
  1600. WLAN_REPORT_ERROR (pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  1601. ("ctrlData_RegisterTrafficIntensityEvents: TrafficMonitor_SetRstCondition returned status = %d\n",status));
  1602. }
  1603. WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  1604. (" ctrlData_RegisterTrafficIntensityEvents() : finished registering all events \n"));
  1605. }
  1606. /*-----------------------------------------------------------------------------
  1607. Routine Name: ctrlData_TrafficThresholdCrossed
  1608. Routine Description: called whenever traffic intensity threshold is crossed.
  1609. notifies event handler to send appropriate event with threshold parameters.
  1610. Arguments:
  1611. Return Value:
  1612. -----------------------------------------------------------------------------*/
  1613. void ctrlData_TrafficThresholdCrossed(TI_HANDLE Context,UINT32 Cookie)
  1614. {
  1615. ctrlData_t *pCtrlData = (ctrlData_t *)Context;
  1616. trafficIntensityThresholdCross_t crossInfo;
  1617. switch(Cookie)
  1618. {
  1619. case CTRL_DATA_TRAFFIC_INTENSITY_HIGH_CROSSED_ABOVE:
  1620. crossInfo.thresholdCross = (UINT32)HIGH_THRESHOLD_CROSS;
  1621. crossInfo.thresholdCrossDirection = (UINT32)CROSS_ABOVE;
  1622. EvHandlerSendEvent(pCtrlData->hEvHandler, IPC_EVENT_TRAFFIC_INTENSITY_THRESHOLD_CROSSED, (UINT8 *)&crossInfo,sizeof(trafficIntensityThresholdCross_t));
  1623. break;
  1624. case CTRL_DATA_TRAFFIC_INTENSITY_HIGH_CROSSED_BELOW:
  1625. crossInfo.thresholdCross = (UINT32)HIGH_THRESHOLD_CROSS;
  1626. crossInfo.thresholdCrossDirection = (UINT32)CROSS_BELOW;
  1627. EvHandlerSendEvent(pCtrlData->hEvHandler, IPC_EVENT_TRAFFIC_INTENSITY_THRESHOLD_CROSSED, (UINT8 *)&crossInfo,sizeof(trafficIntensityThresholdCross_t));
  1628. break;
  1629. case CTRL_DATA_TRAFFIC_INTENSITY_LOW_CROSSED_ABOVE:
  1630. crossInfo.thresholdCross = (UINT32)LOW_THRESHOLD_CROSS;
  1631. crossInfo.thresholdCrossDirection = (UINT32)CROSS_ABOVE;
  1632. EvHandlerSendEvent(pCtrlData->hEvHandler, IPC_EVENT_TRAFFIC_INTENSITY_THRESHOLD_CROSSED, (UINT8 *)&crossInfo,sizeof(trafficIntensityThresholdCross_t));
  1633. break;
  1634. case CTRL_DATA_TRAFFIC_INTENSITY_LOW_CROSSED_BELOW:
  1635. crossInfo.thresholdCross = (UINT32)LOW_THRESHOLD_CROSS;
  1636. crossInfo.thresholdCrossDirection = (UINT32)CROSS_BELOW;
  1637. EvHandlerSendEvent(pCtrlData->hEvHandler, IPC_EVENT_TRAFFIC_INTENSITY_THRESHOLD_CROSSED, (UINT8 *)&crossInfo,sizeof(trafficIntensityThresholdCross_t));
  1638. break;
  1639. default:
  1640. WLAN_REPORT_ERROR(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
  1641. (" ctrlData_TrafficThresholdCrossed() : Unknown cookie received from traffic monitor !!! \n"));
  1642. break;
  1643. }
  1644. }
  1645. /***************************************************************************
  1646. * ctrlData_buildHwBitMapFromArray *
  1647. ****************************************************************************
  1648. * DESCRIPTION: builds HwRatesBitMap (supported rates) for txRatePolicy
  1649. * using an array that consist number of retries for each rate
  1650. * all ew do is : if retry > 0 than the HwBit is ON.
  1651. *
  1652. * INPUTS: Array of retries
  1653. *
  1654. * OUTPUT: Bit Map of Hw rates.
  1655. *
  1656. * RETURNS: Bit Map of Hw rates.
  1657. *
  1658. ***************************************************************************/
  1659. static UINT32 ctrlData_buildHwBitMapFromArray(policyClassRatesArray_t *pArray)
  1660. {
  1661. txRateClassId_e TxRateIndex;
  1662. UINT32 policyRateMask = 0;
  1663. rateMask_e tempArray[MAX_NUM_OF_TX_RATES_IN_CLASS] =
  1664. {
  1665. DRV_RATE_MASK_54_OFDM,DRV_RATE_MASK_48_OFDM,DRV_RATE_MASK_36_OFDM,
  1666. DRV_RATE_MASK_24_OFDM,DRV_RATE_MASK_22_PBCC,DRV_RATE_MASK_18_OFDM,
  1667. DRV_RATE_MASK_12_OFDM,DRV_RATE_MASK_11_CCK,DRV_RATE_MASK_9_OFDM,
  1668. DRV_RATE_MASK_6_OFDM,DRV_RATE_MASK_5_5_CCK,DRV_RATE_MASK_2_BARKER,
  1669. DRV_RATE_MASK_1_BARKER};
  1670. for (TxRateIndex = txPolicy54; TxRateIndex < MAX_NUM_OF_TX_RATES_IN_CLASS; TxRateIndex++)
  1671. {
  1672. if (pArray->txRate[TxRateIndex] > 0 )
  1673. {
  1674. policyRateMask |= tempArray[TxRateIndex];
  1675. }
  1676. }
  1677. return policyRateMask;
  1678. }
  1679. /*************************************************************************
  1680. * *
  1681. * DEBUG FUNCTIONS *
  1682. * *
  1683. *************************************************************************/
  1684. void ctrlData_printTxParameters(TI_HANDLE hCtrlData)
  1685. {
  1686. WLAN_OS_REPORT((" Tx Parameters \n"));
  1687. WLAN_OS_REPORT(("-------------------------------------\n"));
  1688. WLAN_OS_REPORT(("currentPreamble = %d\n\n",((ctrlData_t *)hCtrlData)->ctrlDataCurrentPreambleType));
  1689. WLAN_OS_REPORT(("currentModulation = %d\n", ((ctrlData_t *)hCtrlData)->ctrlDataCurrentModulationType));
  1690. WLAN_OS_REPORT(("ctrlDataCurrentBasicModulationType = %d\n", ((ctrlData_t *)hCtrlData)->ctrlDataCurrentBasicModulationType));
  1691. WLAN_OS_REPORT(("ctrlDataCurrentBasicRate = %d\n", ((ctrlData_t *)hCtrlData)->ctrlDataCurrentBasicRate));
  1692. WLAN_OS_REPORT(("ctrlDataBasicRateBitMask = 0x%X\n",((ctrlData_t *)hCtrlData)->ctrlDataBasicRateBitMask));
  1693. WLAN_OS_REPORT(("ctrlDataCurrentRateMask = 0x%X\n",((ctrlData_t *)hCtrlData)->ctrlDataCurrentRateMask));
  1694. }
  1695. void ctrlData_printRateAdaptation(TI_HANDLE hCtrlData)
  1696. {
  1697. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1698. rateAdaptation_print(pCtrlData->pRateAdaptation);
  1699. }
  1700. #ifdef SUPPORT_4X
  1701. void ctrlData_printFourX(TI_HANDLE hCtrlData)
  1702. {
  1703. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1704. fourX_printParams(pCtrlData->pFourX);
  1705. }
  1706. #endif
  1707. void ctrlData_printCtrlBlock(TI_HANDLE hCtrlData)
  1708. {
  1709. rateClassClients_e clientID;
  1710. txRateClassId_e TxRateIndex;
  1711. WLAN_OS_REPORT((" CtrlData BLock \n"));
  1712. WLAN_OS_REPORT(("----------------------\n"));
  1713. WLAN_OS_REPORT(("hSiteMgr = 0x%X\n",((ctrlData_t *)hCtrlData)->hSiteMgr));
  1714. WLAN_OS_REPORT(("hTxData = 0x%X\n",((ctrlData_t *)hCtrlData)->hTxData));
  1715. WLAN_OS_REPORT(("hWhalCtrl = 0x%X\n",((ctrlData_t *)hCtrlData)->hWhalCtrl));
  1716. WLAN_OS_REPORT(("hOs = 0x%X\n",((ctrlData_t *)hCtrlData)->hOs));
  1717. WLAN_OS_REPORT(("hReport = 0x%X\n",((ctrlData_t *)hCtrlData)->hReport));
  1718. WLAN_OS_REPORT(("ctrlDataDeviceMacAddress = 0x%X.0x%X.0x%X.0x%X.0x%X.0x%X. \n", ((ctrlData_t *)hCtrlData)->ctrlDataDeviceMacAddress.addr[0],
  1719. ((ctrlData_t *)hCtrlData)->ctrlDataDeviceMacAddress.addr[1],
  1720. ((ctrlData_t *)hCtrlData)->ctrlDataDeviceMacAddress.addr[2],
  1721. ((ctrlData_t *)hCtrlData)->ctrlDataDeviceMacAddress.addr[3],
  1722. ((ctrlData_t *)hCtrlData)->ctrlDataDeviceMacAddress.addr[4],
  1723. ((ctrlData_t *)hCtrlData)->ctrlDataDeviceMacAddress.addr[5]));
  1724. WLAN_OS_REPORT(("ctrlDataCurrentBSSID = 0x%X.0x%X.0x%X.0x%X.0x%X.0x%X. \n", ((ctrlData_t *)hCtrlData)->ctrlDataCurrentBSSID.addr[0],
  1725. ((ctrlData_t *)hCtrlData)->ctrlDataCurrentBSSID.addr[1],
  1726. ((ctrlData_t *)hCtrlData)->ctrlDataCurrentBSSID.addr[2],
  1727. ((ctrlData_t *)hCtrlData)->ctrlDataCurrentBSSID.addr[3],
  1728. ((ctrlData_t *)hCtrlData)->ctrlDataCurrentBSSID.addr[4],
  1729. ((ctrlData_t *)hCtrlData)->ctrlDataCurrentBSSID.addr[5]));
  1730. WLAN_OS_REPORT(("ctrlDataRateControlEnable = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataRateControlEnable));
  1731. WLAN_OS_REPORT(("ctrlDataFourXEnable = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataFourXEnable));
  1732. WLAN_OS_REPORT(("ctrlDataFourCurrState = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataCerruentFourXstate));
  1733. WLAN_OS_REPORT(("ctrlDataStartStoplinkControlAlg = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataStartStoplinkControlAlg));
  1734. WLAN_OS_REPORT(("ctrlDataCurrentBssType = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataCurrentBssType));
  1735. WLAN_OS_REPORT(("ctrlDataCurrentModulationType = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataCurrentModulationType));
  1736. WLAN_OS_REPORT(("ctrlDataCurrentBasicRate = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataCurrentBasicRate));
  1737. WLAN_OS_REPORT(("ctrlDataBasicRateBitMask = 0x%X\n",((ctrlData_t *)hCtrlData)->ctrlDataBasicRateBitMask));
  1738. WLAN_OS_REPORT(("ctrlDataCurrentRateMask = 0x%X\n",((ctrlData_t *)hCtrlData)->ctrlDataCurrentRateMask));
  1739. WLAN_OS_REPORT(("ctrlDataCurrentBasicModulationType = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataCurrentBasicModulationType));
  1740. WLAN_OS_REPORT(("ctrlDataCurrentPreambleType = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataCurrentPreambleType));
  1741. WLAN_OS_REPORT(("Traffic Intensity threshold events status: %s\n", (((ctrlData_t *)hCtrlData)->ctrlDataTrafficIntensityEventsEnabled ? "Enabled" : "Disabled")));
  1742. WLAN_OS_REPORT(("Traffic Intensity high threshold: %d packets/sec \n", ((ctrlData_t *)hCtrlData)->ctrlDataTrafficIntensityThresholds.uHighThreshold));
  1743. WLAN_OS_REPORT(("Traffic Intensity low threshold: %d packets/sec \n", ((ctrlData_t *)hCtrlData)->ctrlDataTrafficIntensityThresholds.uLowThreshold));
  1744. WLAN_OS_REPORT(("Traffic Intensity test interval: %d ms\n", ((ctrlData_t *)hCtrlData)->ctrlDataTrafficIntensityThresholds.TestInterval));
  1745. for (clientID = (rateClassClients_e)0 ; clientID < NUM_OF_RATE_CLASS_CLIENTS ; clientID++)
  1746. {
  1747. WLAN_OS_REPORT((" client = %d : bIsClassAvailable = %s currMask = 0x%x nextMask = 0x%x \n",
  1748. clientID,(TRUE == ((ctrlData_t *)hCtrlData)->bIsClassAvailable[clientID] ? "TRUE" : "FALSE"),
  1749. ((ctrlData_t *)hCtrlData)->currClientRateMask[clientID],((ctrlData_t *)hCtrlData)->nextClientRateMask[clientID]));
  1750. WLAN_OS_REPORT(("Policy for client %d (starting from 54): \n",clientID));
  1751. for (TxRateIndex = txPolicy54; TxRateIndex < MAX_NUM_OF_TX_RATES_IN_CLASS; TxRateIndex++)
  1752. {
  1753. WLAN_OS_REPORT(("retries for rate %d = %d\n",TxRateIndex,((ctrlData_t *)hCtrlData)->ctrlDataTxRatePolicy.rateClass[clientID*MAX_NUM_OF_AC].txRate[TxRateIndex]));
  1754. }
  1755. WLAN_OS_REPORT(("Long retry = %d , Short retry = %d\n",
  1756. ((ctrlData_t *)hCtrlData)->ctrlDataTxRatePolicy.rateClass[clientID].longRetryLimit,((ctrlData_t *)hCtrlData)->ctrlDataTxRatePolicy.rateClass[clientID*MAX_NUM_OF_AC].shortRetryLimit));
  1757. }
  1758. WLAN_OS_REPORT(("current used client %d\n",((ctrlData_t *)hCtrlData)->currClientRateID));
  1759. }
  1760. void ctrlData_printCtrlCounters(TI_HANDLE hCtrlData)
  1761. {
  1762. WLAN_OS_REPORT((" CtrlData Counters \n"));
  1763. WLAN_OS_REPORT(("-------------------------\n"));
  1764. WLAN_OS_REPORT(("icvFailCounter = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataCounters.icvFailCounter));
  1765. WLAN_OS_REPORT(("keyNotFoundCounter = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataCounters.keyNotFoundCounter));
  1766. WLAN_OS_REPORT(("MicFailureCounter = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataCounters.MicFailureCounter));
  1767. }
  1768. #ifdef TI_DBG
  1769. void ctrlData_printClsfrTable ( TI_HANDLE hCtrlData )
  1770. {
  1771. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1772. Classifier_dbgPrintClsfrTable (pCtrlData->pClsfr);
  1773. }
  1774. void ctrlData_clearClsfrTable ( TI_HANDLE hCtrlData )
  1775. {
  1776. clsfrTypeAndSupport myLocalType;
  1777. ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
  1778. Classifier_getClsfrType (pCtrlData->pClsfr,&myLocalType);
  1779. ctrlData_clsfrSetClsfrType (pCtrlData,myLocalType);
  1780. }
  1781. #endif
  1782. /***************************************************************************
  1783. * ctrlData_storeTSRateSet
  1784. ****************************************************************************
  1785. * DESCRIPTION: This function translates TSRS rates into map of retransmissions
  1786. * similar to predefined clients rates retransmissions, and stores
  1787. * in the Ctrl database
  1788. *
  1789. * INPUTS: pCtrlData - the object
  1790. * acID
  1791. * rates array
  1792. *
  1793. * RETURNS: -
  1794. ****************************************************************************/
  1795. static void ctrlData_storeTSRateSet(ctrlData_t *pCtrlData, txDataQosParams_t *tsrsParams)
  1796. {
  1797. UINT32 rateCount;
  1798. UINT32 acID, rateID;
  1799. UINT32 tsrsRequestedMap;
  1800. rate_e rateNumber;
  1801. rateClassClients_e clientNumber;
  1802. txRateClassId_e rate_e_to_txRateClassId_e[DRV_RATE_MAX+1] =
  1803. {
  1804. txPolicy1, txPolicy1, txPolicy2, txPolicy5_5, txPolicy11,
  1805. txPolicy22, txPolicy6, txPolicy9, txPolicy12, txPolicy18,
  1806. txPolicy24, txPolicy36, txPolicy48, txPolicy54
  1807. };
  1808. acID = tsrsParams->acID;
  1809. os_memoryZero(pCtrlData->hOs,
  1810. &(pCtrlData->tsrsParameters[acID]),
  1811. sizeof(pCtrlData->tsrsParameters[acID]));
  1812. for (clientNumber = (rateClassClients_e)0; clientNumber < NUM_OF_RATE_CLASS_CLIENTS; clientNumber++)
  1813. {
  1814. tsrsRequestedMap = 0;
  1815. for (rateCount = 0; rateCount < tsrsParams->tsrsArrLen; rateCount++)
  1816. {
  1817. /* Erase Most significant bit in case it was raised to mark nominal PHY rates (& 0x7F) */
  1818. /* Convert multiplication of 500kb/sec to rate_e and then to txRateClassId_e */
  1819. /* and update retransmission map in accordance to USER_RATE client definitions */
  1820. rateNumber = RateNumberToHost((tsrsParams->tsrsArr[rateCount] & 0x7F) >> 1);
  1821. rateID = rate_e_to_txRateClassId_e[rateNumber];
  1822. /* Update Rate Fallback policy map according to the class predefined policy map */
  1823. if (pCtrlData->pCurrPolicyClassRatesArray[clientNumber].txRate[rateID] > 0)
  1824. {
  1825. pCtrlData->tsrsParameters[acID].policyClassRateMask[clientNumber] |= (1<<(rateNumber-1));
  1826. }
  1827. tsrsRequestedMap |= (1<<(rateNumber-1));
  1828. }
  1829. /* Update supportedRatesMask according to TSRS rates and rates supported for this class */
  1830. pCtrlData->tsrsParameters[acID].supportedRatesMask[clientNumber] =
  1831. pCtrlData->nextClientRateMask[clientNumber] & tsrsRequestedMap;
  1832. /* Check that Rate Fallback policy map is not empty; if this is a case, ignore pre-defined policy */
  1833. if (pCtrlData->tsrsParameters[acID].policyClassRateMask[clientNumber] == 0)
  1834. {
  1835. pCtrlData->tsrsParameters[acID].policyClassRateMask[clientNumber] =
  1836. pCtrlData->tsrsParameters[acID].supportedRatesMask[clientNumber];
  1837. }
  1838. }
  1839. }
  1840. /***************************************************************************
  1841. * ctrlData_getClosestTSRate
  1842. ****************************************************************************
  1843. * DESCRIPTION: This function checks if the TSRS is defined for the requested
  1844. * access category or not; if requested, it chooses from the TSRS
  1845. * a rate that is as close as possible to the requestede one.
  1846. *
  1847. * INPUTS: pCtrlData - the object
  1848. * acID
  1849. *
  1850. * RETURNS: -
  1851. ****************************************************************************/
  1852. static rate_e ctrlData_getClosestTSRate(ctrlData_t *pCtrlData, UINT32 ac, rate_e givenRate)
  1853. {
  1854. UINT32 tsRate;
  1855. rate_e resultRate;
  1856. if (pCtrlData->tsrsParameters[ac].supportedRatesMask[pCtrlData->currClientRateID] != 0)
  1857. {
  1858. /* From TSRS rates, choose the closest to the basic rate */
  1859. /* ((1 << givenRate) - 1) gives a map of all rates <= givenRate */
  1860. /* Logical AND with TSRS supported rates gives a map of supported rates <= givenRate */
  1861. /* Now just pick the maximal */
  1862. tsRate = pCtrlData->tsrsParameters[ac].supportedRatesMask[pCtrlData->currClientRateID]
  1863. & ((1 << givenRate) - 1);
  1864. resultRate = calculateMaxSupportedRate(&tsRate);
  1865. if (resultRate == DRV_RATE_INVALID)
  1866. {
  1867. return givenRate;
  1868. }
  1869. else
  1870. {
  1871. return resultRate;
  1872. }
  1873. }
  1874. else
  1875. {
  1876. return givenRate;
  1877. }
  1878. }