Home | History | Annotate | Download | only in src
      1 /*
      2  * cu_common.c
      3  *
      4  * Copyright 2001-2009 Texas Instruments, Inc. - http://www.ti.com/
      5  *
      6  * Licensed under the Apache License, Version 2.0 (the "License");
      7  * you may not use this file except in compliance with the License.
      8  * You may obtain a copy of the License at
      9  *
     10  *     http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  * Unless required by applicable law or agreed to in writing, software
     13  * distributed under the License is distributed on an "AS IS" BASIS,
     14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15  * See the License for the specific language governing permissions and
     16  * limitations under the License.
     17  */
     18 
     19 /****************************************************************************
     20 *
     21 *   MODULE:  CU_Common.c
     22 *
     23 *   PURPOSE:
     24 *
     25 *   DESCRIPTION:
     26 *   ============
     27 *
     28 *
     29 ****************************************************************************/
     30 
     31 /* includes */
     32 /************/
     33 #include "cu_osapi.h"
     34 #include "oserr.h"
     35 
     36 #include "TWDriver.h"
     37 #include "convert.h"
     38 
     39 #include "ipc_sta.h"
     40 #include "cu_common.h"
     41 
     42 /* defines */
     43 /***********/
     44 
     45 /* local types */
     46 /***************/
     47 /* Module control block */
     48 typedef struct CuCommon_t
     49 {
     50     THandle hIpcSta;
     51 } CuCommon_t;
     52 
     53 
     54 typedef enum
     55 {
     56     DRIVER_STATUS_IDLE              = 0,
     57     DRIVER_STATUS_RUNNING           = 1
     58 } PARAM_OUT_Driver_Status_e;
     59 
     60 
     61 /* local variables */
     62 /*******************/
     63 
     64 /* local fucntions */
     65 /*******************/
     66 
     67 
     68 /* functions */
     69 /*************/
     70 THandle CuCommon_Create(THandle *pIpcSta, const PS8 device_name)
     71 {
     72     CuCommon_t* pCuCommon = (CuCommon_t*)os_MemoryCAlloc(sizeof(CuCommon_t), sizeof(U8));
     73     if(pCuCommon == NULL)
     74     {
     75         os_error_printf(CU_MSG_ERROR, (PS8)("ERROR - CuCommon_Create - cant allocate control block\n") );
     76         return NULL;
     77     }
     78 
     79     pCuCommon->hIpcSta = IpcSta_Create(device_name);
     80     if(pCuCommon->hIpcSta == NULL)
     81     {
     82         CuCommon_Destroy(pCuCommon);
     83         return NULL;
     84     }
     85     *pIpcSta = pCuCommon->hIpcSta;
     86 
     87     return pCuCommon;
     88 }
     89 
     90 VOID CuCommon_Destroy(THandle hCuCommon)
     91 {
     92     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
     93 
     94     if(pCuCommon->hIpcSta)
     95         IpcSta_Destroy(pCuCommon->hIpcSta);
     96 
     97     os_MemoryFree(pCuCommon);
     98 }
     99 
    100 S32 CuCommon_SetU32(THandle hCuCommon, U32 PrivateIoctlId, U32 Data)
    101 {
    102     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
    103     S32 res;
    104 
    105     res = IPC_STA_Private_Send(pCuCommon->hIpcSta, PrivateIoctlId, &Data, sizeof(U32),
    106                                                 NULL, 0);
    107 
    108     if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    109         return ECUERR_CU_COMMON_ERROR;
    110 
    111     return OK;
    112 }
    113 
    114 S32 CuCommon_GetU32(THandle hCuCommon, U32 PrivateIoctlId, PU32 pData)
    115 {
    116     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
    117     S32 res;
    118 
    119     res = IPC_STA_Private_Send(pCuCommon->hIpcSta, PrivateIoctlId, NULL, 0,
    120                                                 pData, sizeof(U32));
    121 
    122     if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    123         return ECUERR_CU_COMMON_ERROR;
    124 
    125     return OK;
    126 }
    127 
    128 S32 CuCommon_SetU16(THandle hCuCommon, U32 PrivateIoctlId, U16 Data)
    129 {
    130     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
    131     S32 res;
    132 
    133     res = IPC_STA_Private_Send(pCuCommon->hIpcSta, PrivateIoctlId, &Data, sizeof(U16),
    134                                                 NULL, 0);
    135 
    136     if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    137         return ECUERR_CU_COMMON_ERROR;
    138 
    139     return OK;
    140 }
    141 
    142 S32 CuCommon_SetU8(THandle hCuCommon, U32 PrivateIoctlId, U8 Data)
    143 {
    144     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
    145     S32 res;
    146 
    147     res = IPC_STA_Private_Send(pCuCommon->hIpcSta, PrivateIoctlId, &Data, sizeof(U8),
    148                                                 NULL, 0);
    149 
    150     if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    151         return ECUERR_CU_COMMON_ERROR;
    152 
    153     return OK;
    154 }
    155 
    156 
    157 S32 CuCommon_GetU8(THandle hCuCommon, U32 PrivateIoctlId, PU8 pData)
    158 {
    159     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
    160     S32 res;
    161 
    162     res = IPC_STA_Private_Send(pCuCommon->hIpcSta, PrivateIoctlId, NULL, 0,
    163                                                 pData, sizeof(U8));
    164 
    165     if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    166         return ECUERR_CU_COMMON_ERROR;
    167 
    168     return OK;
    169 }
    170 
    171 
    172 S32 CuCommon_SetBuffer(THandle hCuCommon, U32 PrivateIoctlId, PVOID pBuffer, U32 len)
    173 {
    174     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
    175     S32 res;
    176 
    177     res = IPC_STA_Private_Send(pCuCommon->hIpcSta, PrivateIoctlId, pBuffer, len,
    178                                                 NULL, 0);
    179 
    180     if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    181         return ECUERR_CU_COMMON_ERROR;
    182 
    183     return OK;
    184 }
    185 
    186 S32 CuCommon_GetBuffer(THandle hCuCommon, U32 PrivateIoctlId, PVOID pBuffer, U32 len)
    187 {
    188     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
    189     S32 res;
    190 
    191     res = IPC_STA_Private_Send(pCuCommon->hIpcSta, PrivateIoctlId, NULL, 0,
    192                                                 pBuffer, len);
    193 
    194     if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    195         return ECUERR_CU_COMMON_ERROR;
    196 
    197     return OK;
    198 }
    199 
    200 S32 CuCommon_GetSetBuffer(THandle hCuCommon, U32 PrivateIoctlId, PVOID pBuffer, U32 len)
    201 {
    202     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
    203     S32 res;
    204 
    205     res = IPC_STA_Private_Send(pCuCommon->hIpcSta, PrivateIoctlId, pBuffer, len,
    206                                                 pBuffer, len);
    207 
    208     if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    209         return ECUERR_CU_COMMON_ERROR;
    210 
    211     return OK;
    212 }
    213 
    214 S32 CuCommon_Get_BssidList_Size(THandle hCuCommon, PU32 pSizeOfBssiList)
    215 {
    216     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
    217     S32 res;
    218 
    219     res = IPC_STA_Private_Send(pCuCommon->hIpcSta, SCAN_CNCN_BSSID_LIST_SIZE_PARAM, NULL, 0,
    220                                                 pSizeOfBssiList, sizeof(U32));
    221 
    222     if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    223         return ECUERR_CU_COMMON_ERROR;
    224 
    225     return OK;
    226 }
    227 
    228 S32 CuCommon_GetRssi(THandle hCuCommon, PS8 pdRssi, PS8 pbRssi)
    229 {
    230     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
    231     S32 res;
    232     TCuCommon_RoamingStatisticsTable buffer;
    233 
    234     res = IPC_STA_Private_Send(pCuCommon->hIpcSta, TIWLN_802_11_RSSI, NULL, 0,
    235                                                 &buffer, sizeof(TCuCommon_RoamingStatisticsTable));
    236     if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    237         return ECUERR_CU_COMMON_ERROR;
    238 
    239     *pdRssi = (S8)buffer.rssi;
    240 	*pbRssi = (S8)buffer.rssiBeacon;
    241 
    242     return OK;
    243 }
    244 
    245 S32 CuCommon_GetSnr(THandle hCuCommon, PU32 pdSnr, PU32 pbSnr)
    246 {
    247     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
    248     S32 res;
    249     TCuCommon_RoamingStatisticsTable buffer;
    250 
    251     res = IPC_STA_Private_Send(pCuCommon->hIpcSta, TWD_SNR_RATIO_PARAM, NULL, 0,
    252                                                 &buffer, sizeof(TCuCommon_RoamingStatisticsTable));
    253     if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    254         return ECUERR_CU_COMMON_ERROR;
    255 
    256 	*pdSnr = (U32)buffer.snr;
    257 	*pbSnr = (U32)buffer.snrBeacon;
    258 
    259     return OK;
    260 }
    261 
    262 S32 CuCommon_GetTxStatistics(THandle hCuCommon, TIWLN_TX_STATISTICS* pTxCounters, U32 doReset)
    263 {
    264     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
    265     S32 res;
    266 
    267     res = IPC_STA_Private_Send(pCuCommon->hIpcSta, TIWLN_802_11_TX_STATISTICS, pTxCounters, sizeof(TIWLN_TX_STATISTICS),
    268                                                 pTxCounters, sizeof(TIWLN_TX_STATISTICS));
    269 
    270     if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    271         return ECUERR_CU_COMMON_ERROR;
    272 
    273     if(doReset)
    274     {
    275         res = IPC_STA_Private_Send(pCuCommon->hIpcSta, TX_CTRL_RESET_COUNTERS_PARAM, NULL, 0,
    276                                                 NULL, 0);
    277         if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    278             return ECUERR_CU_COMMON_ERROR;
    279     }
    280 
    281     return OK;
    282 }
    283 
    284 S32 CuCommon_Radio_Test(THandle hCuCommon,TTestCmd* data)
    285 {
    286     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
    287     S32 res;
    288 
    289 	res = IPC_STA_Private_Send(pCuCommon->hIpcSta,
    290 							   TWD_RADIO_TEST_PARAM,
    291 							   (PVOID)data,
    292 							   sizeof(TTestCmd),
    293 							   (PVOID)data,
    294 							   sizeof(TTestCmd));
    295 
    296     if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    297 	{
    298 		os_error_printf(CU_MSG_INFO2, (PS8)"In CuCommon_Radio_Test: IPC_STA_Private_Send failed\n");
    299 		return ECUERR_CU_COMMON_ERROR;
    300 	}
    301 
    302     return OK;
    303 }
    304 
    305 S32 CuCommon_AddKey(THandle hCuCommon, OS_802_11_WEP* pKey)
    306 {
    307     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
    308     S32 res;
    309     OS_802_11_KEY  key;
    310 
    311     os_memset(&key, 0, sizeof(OS_802_11_KEY));
    312 
    313     key.Length = pKey->Length;
    314     key.KeyIndex = (pKey->KeyIndex & 0x80000000) | (pKey->KeyIndex & 0x3FFFFFFF);
    315     key.KeyLength = pKey->KeyLength;
    316     os_memcpy(key.KeyMaterial, pKey->KeyMaterial, pKey->KeyLength);
    317 
    318     res = IPC_STA_Private_Send(pCuCommon->hIpcSta, RSN_ADD_KEY_PARAM, &key, sizeof(OS_802_11_KEY),
    319                                                 NULL, 0);
    320 
    321     if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    322         return ECUERR_CU_COMMON_ERROR;
    323 
    324     return OK;
    325 }
    326 
    327 S32 CuCommon_RemoveKey(THandle hCuCommon, U32 KeyIndex)
    328 {
    329     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
    330     S32 res;
    331     OS_802_11_KEY  key;
    332 
    333     os_memset(&key, 0, sizeof(OS_802_11_KEY));
    334     key.KeyIndex = KeyIndex;
    335 
    336     res = IPC_STA_Private_Send(pCuCommon->hIpcSta, RSN_REMOVE_KEY_PARAM, &key, sizeof(OS_802_11_KEY),
    337                                                 NULL, 0);
    338 
    339     if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    340         return ECUERR_CU_COMMON_ERROR;
    341 
    342     return OK;
    343 }
    344 
    345 S32 CuCommon_GetDfsChannels(THandle hCuCommon, PU16 pMinDfsChannel, PU16 pMaxDfsChannel)
    346 {
    347     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
    348     S32 res;
    349     DFS_ChannelRange_t DFS_ChannelRange;
    350 
    351     res = IPC_STA_Private_Send(pCuCommon->hIpcSta, TIWLN_REG_DOMAIN_GET_DFS_RANGE, NULL, 0,
    352                                                 &DFS_ChannelRange, sizeof(DFS_ChannelRange_t));
    353 
    354     if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    355         return ECUERR_CU_COMMON_ERROR;
    356 
    357     *pMaxDfsChannel = DFS_ChannelRange.maxDFS_channelNum;
    358     *pMinDfsChannel = DFS_ChannelRange.minDFS_channelNum;
    359 
    360     return OK;
    361 }
    362 
    363 S32 CuCommon_SetDfsChannels(THandle hCuCommon, U16 MinDfsChannel, U16 MaxDfsChannel)
    364 {
    365     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
    366     S32 res;
    367     DFS_ChannelRange_t DFS_ChannelRange;
    368 
    369     DFS_ChannelRange.maxDFS_channelNum = MaxDfsChannel;
    370     DFS_ChannelRange.minDFS_channelNum = MinDfsChannel;
    371 
    372     res = IPC_STA_Private_Send(pCuCommon->hIpcSta, TIWLN_REG_DOMAIN_SET_DFS_RANGE, &DFS_ChannelRange, sizeof(DFS_ChannelRange_t),
    373                                                 NULL, 0);
    374 
    375     if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    376         return ECUERR_CU_COMMON_ERROR;
    377 
    378     return OK;
    379 }
    380 
    381 S32 CuCommon_PrintDriverDebug(THandle hCuCommon, PVOID pParams, U32 param_size)
    382 {
    383     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
    384     S32 res;
    385 
    386 	if ( pParams == NULL )
    387 	{
    388 		return ECUERR_CU_COMMON_ERROR;
    389 	}
    390 
    391     res = IPC_STA_Private_Send(pCuCommon->hIpcSta, TIWLN_DISPLAY_STATS, pParams, param_size,
    392 							   NULL, 0);
    393 
    394     if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    395         return ECUERR_CU_COMMON_ERROR;
    396 
    397     return OK;
    398 }
    399 
    400 S32 CuCommon_PrintDriverDebugBuffer(THandle hCuCommon, U32 func_id, U32 opt_param)
    401 {
    402     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
    403     S32 res, len;
    404     U8 buf[260];  /* no more then 256 + func id */
    405 
    406     if (opt_param == 0)
    407         return ECUERR_CU_ERROR;
    408 
    409     len = os_strlen((PS8)opt_param);
    410     *(PU32)buf = func_id;
    411     os_memcpy((PS8)buf + sizeof(U32),(PS8)opt_param, len);
    412 
    413     res = IPC_STA_Private_Send(pCuCommon->hIpcSta, TIWLN_DISPLAY_STATS, buf, len + sizeof(U32),
    414                                                 NULL, 0);
    415 
    416     if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    417         return ECUERR_CU_COMMON_ERROR;
    418 
    419     return OK;
    420 }
    421 
    422 
    423 S32 CuCommon_GetRxDataFiltersStatistics(THandle hCuCommon, PU32 pUnmatchedPacketsCount, PU32 pMatchedPacketsCount)
    424 {
    425     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
    426     S32 res;
    427     TCuCommon_RxDataFilteringStatistics buffer;
    428 
    429     res = IPC_STA_Private_Send(pCuCommon->hIpcSta, TIWLN_GET_RX_DATA_FILTERS_STATISTICS, NULL, 0,
    430                                                 &buffer, sizeof(TCuCommon_RxDataFilteringStatistics));
    431 
    432     if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    433         return ECUERR_CU_COMMON_ERROR;
    434 
    435     *pUnmatchedPacketsCount = buffer.unmatchedPacketsCount;
    436     os_memcpy(pMatchedPacketsCount, &buffer.matchedPacketsCount, MAX_DATA_FILTERS*sizeof(U32));
    437 
    438     return OK;
    439 }
    440 
    441 
    442 S32 CuCommon_GetPowerConsumptionStat(THandle hCuCommon, ACXPowerConsumptionTimeStat_t *pPowerstat)
    443 {
    444     CuCommon_t* pCuCommon = (CuCommon_t*)hCuCommon;
    445     ACXPowerConsumptionTimeStat_t tStatistics;
    446     S32 res;
    447 
    448 
    449     res = IPC_STA_Private_Send(pCuCommon->hIpcSta, TIWLN_GET_POWER_CONSUMPTION_STATISTICS, NULL, 0,
    450                                                 &tStatistics, sizeof(ACXPowerConsumptionTimeStat_t));
    451 
    452     if(res == EOALERR_IPC_STA_ERROR_SENDING_WEXT)
    453         return ECUERR_CU_COMMON_ERROR;
    454 
    455     os_memcpy(pPowerstat, &tStatistics, sizeof(ACXPowerConsumptionTimeStat_t));
    456 
    457     return OK;
    458 }
    459 
    460 
    461 
    462 
    463 
    464 
    465 
    466