1/*
2 * cu_cmd.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_cmd.c
22*
23*   PURPOSE:
24*
25*   DESCRIPTION:
26*   ============
27*
28*
29****************************************************************************/
30
31/* includes */
32/************/
33
34#include <stdio.h>
35
36#include "cu_osapi.h"
37#include "TWDriver.h"
38#include "convert.h"
39#include "console.h"
40#include "cu_common.h"
41#include "cu_os.h"
42#include "ipc_event.h"
43#include "wpa_core.h"
44#include "cu_cmd.h"
45#include "oserr.h"
46
47/* defines */
48/***********/
49#define print_available_values(arr) \
50        { \
51            S32 i; \
52            for(i=0; i<SIZE_ARR(arr); i++) \
53                os_error_printf(CU_MSG_INFO2, (PS8)"%d - %s%s", arr[i].value, arr[i].name, (i>=SIZE_ARR(arr)-1) ? (PS8)"\n" : (PS8)", " ); \
54        }
55
56#define CU_CMD_FIND_NAME_ARRAY(index, arr, val) \
57        for ( index = 0; index < SIZE_ARR(arr); index++ ) \
58            if ( arr[ index ].value == (val) ) \
59                break; \
60
61#define CHAN_FREQ_TABLE_SIZE        (sizeof(ChanFreq) / sizeof(struct CHAN_FREQ))
62
63#define IS_BASIC_RATE(a)    ((a) & NET_BASIC_MASK)
64
65#define RATE_2_MBPS(a)    ((F32)((a) & (NET_BASIC_MASK-1))/2)
66
67#define NET_BASIC_MASK      0x80    /* defined in common/src/utils/utils.c */
68
69#define BIT_TO_BYTE_FACTOR  8
70
71#define NVS_FILE_TX_PARAMETERS_UPDATE	0
72#define NVS_FILE_RX_PARAMETERS_UPDATE	1
73
74
75/* local types */
76/***************/
77/* Module control block */
78typedef struct CuCmd_t
79{
80    THandle                 hCuWext;
81    THandle                 hCuCommon;
82    THandle                 hConsole;
83    THandle                 hIpcEvent;
84    THandle                 hWpaCore;
85
86    U32                     isDeviceRunning;
87
88    scan_Params_t             appScanParams;
89    TPeriodicScanParams     tPeriodicAppScanParams;
90    scan_Policy_t             scanPolicy;
91
92} CuCmd_t;
93
94/* local variables */
95/*******************/
96struct CHAN_FREQ {
97    U8       chan;
98    U32      freq;
99} ChanFreq[] = {
100    {1,2412000}, {2,2417000}, {3,2422000}, {4,2427000},
101    {5,2432000}, {6,2437000}, {7,2442000}, {8,2447000},
102    {9,2452000},
103    {10,2457000}, {11,2462000}, {12,2467000}, {13,2472000},
104    {14,2484000}, {36,5180000}, {40,5200000}, {44,5220000},
105    {48,5240000}, {52,5260000}, {56,5280000}, {60,5300000},
106    {64,5320000},
107    {100,5500000}, {104,5520000}, {108,5540000}, {112,5560000},
108    {116,5580000}, {120,5600000}, {124,5620000}, {128,5640000},
109    {132,5660000}, {136,5680000}, {140,5700000}, {149,5745000},
110    {153,5765000}, {157,5785000}, {161,5805000} };
111
112static named_value_t BSS_type[] =
113{
114    { os802_11IBSS,                  (PS8)"AD-Hoc" },
115    { os802_11Infrastructure,        (PS8)"Infr." },
116    { os802_11AutoUnknown,           (PS8)"Auto" },
117};
118
119static named_value_t Current_mode[] =
120{
121    { 0,           (PS8)"SME Auto" },
122    { 1,           (PS8)"SME Manual" },
123};
124
125static named_value_t BeaconFilter_use[] =
126{
127    { 0,        (PS8)"INACTIVE" },
128    { 1,        (PS8)"ACTIVE" },
129};
130
131static named_value_t event_type[] = {
132    { IPC_EVENT_ASSOCIATED,             (PS8)"Associated" },
133    { IPC_EVENT_DISASSOCIATED,          (PS8)"Disassociated"  },
134    { IPC_EVENT_LINK_SPEED,             (PS8)"LinkSpeed" },
135    { IPC_EVENT_AUTH_SUCC,              (PS8)"Authentication Success" },
136    { IPC_EVENT_SCAN_COMPLETE,          (PS8)"ScanComplete" },
137    { IPC_EVENT_SCAN_STOPPED,           (PS8)"ScanStopped" },
138#ifdef XCC_MODULE_INCLUDED
139    { IPC_EVENT_CCKM_START,             (PS8)"CCKM_Start" },
140#endif
141    { IPC_EVENT_MEDIA_SPECIFIC,         (PS8)"Media_Specific" },
142    { IPC_EVENT_EAPOL,                  (PS8)"EAPOL" },
143    { IPC_EVENT_RE_AUTH_STARTED,		(PS8)"IPC_EVENT_RE_AUTH_STARTED" },
144    { IPC_EVENT_RE_AUTH_COMPLETED,		(PS8)"IPC_EVENT_RE_AUTH_COMPLETED" },
145    { IPC_EVENT_RE_AUTH_TERMINATED,     (PS8)"IPC_EVENT_RE_AUTH_TERMINATED" },
146    { IPC_EVENT_BOUND,                  (PS8)"Bound" },
147    { IPC_EVENT_UNBOUND,                (PS8)"Unbound" },
148#ifdef WPA_ENTERPRISE
149    { IPC_EVENT_PREAUTH_EAPOL,          (PS8)"PreAuth EAPOL"},
150#endif
151    { IPC_EVENT_LOW_RSSI,               (PS8)"Low RSSI" },
152    { IPC_EVENT_TSPEC_STATUS,           (PS8)"IPC_EVENT_TSPEC_STATUS" },
153    { IPC_EVENT_TSPEC_RATE_STATUS,      (PS8)"IPC_EVENT_TSPEC_RATE_STATUS" },
154    { IPC_EVENT_MEDIUM_TIME_CROSS,      (PS8)"IPC_EVENT_MEDIUM_TIME_CROSS" },
155    { IPC_EVENT_ROAMING_COMPLETE,       (PS8)"ROAMING_COMPLETE"},
156    { IPC_EVENT_EAP_AUTH_FAILURE,       (PS8)"EAP-FAST/LEAP Auth Failed"},
157    { IPC_EVENT_WPA2_PREAUTHENTICATION, (PS8)"IPC_EVENT_WPA2_PREAUTHENTICATION" },
158    { IPC_EVENT_TRAFFIC_INTENSITY_THRESHOLD_CROSSED, (PS8)"IPC_EVENT_TRAFFIC_INTENSITY_THRESHOLD_CROSSED" },
159    { IPC_EVENT_SCAN_FAILED,			(PS8)"ScanFailed" },
160    { IPC_EVENT_WPS_SESSION_OVERLAP,    (PS8)"IPC_EVENT_WPS_SESSION_OVERLAP" },
161    { IPC_EVENT_RSSI_SNR_TRIGGER_0,     (PS8)"IPC_EVENT_RSSI_SNR_TRIGGER_0" },
162    { IPC_EVENT_RSSI_SNR_TRIGGER_1,     (PS8)"IPC_EVENT_RSSI_SNR_TRIGGER_1" },
163    { IPC_EVENT_TIMEOUT,                (PS8)"Timeout" }
164};
165
166static named_value_t report_module[] =
167{
168    { FILE_ID_0   ,  (PS8)"timer                   " },
169    { FILE_ID_1   ,  (PS8)"measurementMgr          " },
170    { FILE_ID_2   ,  (PS8)"measurementMgrSM        " },
171    { FILE_ID_3   ,  (PS8)"regulatoryDomain        " },
172    { FILE_ID_4   ,  (PS8)"requestHandler          " },
173    { FILE_ID_5   ,  (PS8)"SoftGemini              " },
174    { FILE_ID_6   ,  (PS8)"spectrumMngmntMgr       " },
175    { FILE_ID_7   ,  (PS8)"SwitchChannel           " },
176    { FILE_ID_8   ,  (PS8)"roamingMngr             " },
177    { FILE_ID_9   ,  (PS8)"scanMngr                " },
178    { FILE_ID_10  ,  (PS8)"admCtrlXCC              " },
179    { FILE_ID_11  ,  (PS8)"XCCMngr                 " },
180    { FILE_ID_12  ,  (PS8)"XCCRMMngr               " },
181    { FILE_ID_13  ,  (PS8)"XCCTSMngr               " },
182    { FILE_ID_14  ,  (PS8)"rogueAp                 " },
183    { FILE_ID_15  ,  (PS8)"TransmitPowerXCC        " },
184    { FILE_ID_16  ,  (PS8)"admCtrl                 " },
185    { FILE_ID_17  ,  (PS8)"admCtrlNone             " },
186    { FILE_ID_18  ,  (PS8)"admCtrlWep              " },
187    { FILE_ID_19  ,  (PS8)"admCtrlWpa              " },
188    { FILE_ID_20  ,  (PS8)"admCtrlWpa2             " },
189    { FILE_ID_21  ,  (PS8)"apConn                  " },
190    { FILE_ID_22  ,  (PS8)"broadcastKey802_1x      " },
191    { FILE_ID_23  ,  (PS8)"broadcastKeyNone        " },
192    { FILE_ID_24  ,  (PS8)"broadcastKeySM          " },
193    { FILE_ID_25  ,  (PS8)"conn                    " },
194    { FILE_ID_26  ,  (PS8)"connIbss                " },
195    { FILE_ID_27  ,  (PS8)"connInfra               " },
196    { FILE_ID_28  ,  (PS8)"keyDerive               " },
197    { FILE_ID_29  ,  (PS8)"keyDeriveAes            " },
198    { FILE_ID_30  ,  (PS8)"keyDeriveCkip           " },
199    { FILE_ID_31  ,  (PS8)"keyDeriveTkip           " },
200    { FILE_ID_32  ,  (PS8)"keyDeriveWep            " },
201    { FILE_ID_33  ,  (PS8)"keyParser               " },
202    { FILE_ID_34  ,  (PS8)"keyParserExternal       " },
203    { FILE_ID_35  ,  (PS8)"keyParserWep            " },
204    { FILE_ID_36  ,  (PS8)"mainKeysSm              " },
205    { FILE_ID_37  ,  (PS8)"mainSecKeysOnly         " },
206    { FILE_ID_38  ,  (PS8)"mainSecNull             " },
207    { FILE_ID_39  ,  (PS8)"mainSecSm               " },
208    { FILE_ID_40  ,  (PS8)"rsn                     " },
209    { FILE_ID_41  ,  (PS8)"sme                     " },
210    { FILE_ID_42  ,  (PS8)"smeSelect               " },
211    { FILE_ID_43  ,  (PS8)"smeSm                   " },
212    { FILE_ID_44  ,  (PS8)"unicastKey802_1x        " },
213    { FILE_ID_45  ,  (PS8)"unicastKeyNone          " },
214    { FILE_ID_46  ,  (PS8)"unicastKeySM            " },
215    { FILE_ID_47  ,  (PS8)"CmdDispatcher           " },
216    { FILE_ID_48  ,  (PS8)"CmdHndlr                " },
217    { FILE_ID_49  ,  (PS8)"DrvMain                 " },
218    { FILE_ID_50  ,  (PS8)"EvHandler               " },
219    { FILE_ID_51  ,  (PS8)"Ctrl                    " },
220    { FILE_ID_52  ,  (PS8)"GeneralUtil             " },
221    { FILE_ID_53  ,  (PS8)"RateAdaptation          " },
222    { FILE_ID_54  ,  (PS8)"rx                      " },
223    { FILE_ID_55  ,  (PS8)"TrafficMonitor          " },
224    { FILE_ID_56  ,  (PS8)"txCtrl                  " },
225    { FILE_ID_57  ,  (PS8)"txCtrlParams            " },
226    { FILE_ID_58  ,  (PS8)"txCtrlServ              " },
227    { FILE_ID_59  ,  (PS8)"TxDataClsfr             " },
228    { FILE_ID_60  ,  (PS8)"txDataQueue             " },
229    { FILE_ID_61  ,  (PS8)"txMgmtQueue             " },
230    { FILE_ID_62  ,  (PS8)"txPort                  " },
231    { FILE_ID_63  ,  (PS8)"assocSM                 " },
232    { FILE_ID_64  ,  (PS8)"authSm                  " },
233    { FILE_ID_65  ,  (PS8)"currBss                 " },
234    { FILE_ID_66  ,  (PS8)"healthMonitor           " },
235    { FILE_ID_67  ,  (PS8)"mlmeBuilder             " },
236    { FILE_ID_68  ,  (PS8)"mlmeParser              " },
237    { FILE_ID_69  ,  (PS8)"mlmeSm                  " },
238    { FILE_ID_70  ,  (PS8)"openAuthSm              " },
239    { FILE_ID_71  ,  (PS8)"PowerMgr                " },
240    { FILE_ID_72  ,  (PS8)"PowerMgrDbgPrint        " },
241    { FILE_ID_73  ,  (PS8)"PowerMgrKeepAlive       " },
242    { FILE_ID_74  ,  (PS8)"qosMngr                 " },
243    { FILE_ID_75  ,  (PS8)"roamingInt              " },
244    { FILE_ID_76  ,  (PS8)"ScanCncn                " },
245    { FILE_ID_77  ,  (PS8)"ScanCncnApp             " },
246    { FILE_ID_78  ,  (PS8)"ScanCncnOsSm            " },
247    { FILE_ID_79  ,  (PS8)"ScanCncnSm              " },
248    { FILE_ID_80  ,  (PS8)"ScanCncnSmSpecific      " },
249    { FILE_ID_81  ,  (PS8)"scanResultTable         " },
250    { FILE_ID_82  ,  (PS8)"scr                     " },
251    { FILE_ID_83  ,  (PS8)"sharedKeyAuthSm         " },
252    { FILE_ID_84  ,  (PS8)"siteHash                " },
253    { FILE_ID_85  ,  (PS8)"siteMgr                 " },
254    { FILE_ID_86  ,  (PS8)"StaCap                  " },
255    { FILE_ID_87  ,  (PS8)"systemConfig            " },
256    { FILE_ID_88  ,  (PS8)"templates               " },
257    { FILE_ID_89  ,  (PS8)"trafficAdmControl       " },
258    { FILE_ID_90  ,  (PS8)"CmdBld                  " },
259    { FILE_ID_91  ,  (PS8)"CmdBldCfg               " },
260    { FILE_ID_92  ,  (PS8)"CmdBldCfgIE             " },
261    { FILE_ID_93  ,  (PS8)"CmdBldCmd               " },
262    { FILE_ID_94  ,  (PS8)"CmdBldCmdIE             " },
263    { FILE_ID_95  ,  (PS8)"CmdBldItr               " },
264    { FILE_ID_96  ,  (PS8)"CmdBldItrIE             " },
265    { FILE_ID_97  ,  (PS8)"CmdQueue                " },
266    { FILE_ID_98  ,  (PS8)"RxQueue                 " },
267    { FILE_ID_99  ,  (PS8)"txCtrlBlk               " },
268    { FILE_ID_100 ,  (PS8)"txHwQueue               " },
269    { FILE_ID_101 ,  (PS8)"CmdMBox                 " },
270    { FILE_ID_102 ,  (PS8)"eventMbox               " },
271    { FILE_ID_103 ,  (PS8)"fwDebug                 " },
272    { FILE_ID_104 ,  (PS8)"FwEvent                 " },
273    { FILE_ID_105 ,  (PS8)"HwInit                  " },
274    { FILE_ID_106 ,  (PS8)"RxXfer                  " },
275    { FILE_ID_107 ,  (PS8)"txResult                " },
276    { FILE_ID_108 ,  (PS8)"txXfer                  " },
277    { FILE_ID_109 ,  (PS8)"MacServices             " },
278    { FILE_ID_110 ,  (PS8)"MeasurementSrv          " },
279    { FILE_ID_111 ,  (PS8)"measurementSrvDbgPrint  " },
280    { FILE_ID_112 ,  (PS8)"MeasurementSrvSM        " },
281    { FILE_ID_113 ,  (PS8)"PowerSrv                " },
282    { FILE_ID_114 ,  (PS8)"PowerSrvSM              " },
283    { FILE_ID_115 ,  (PS8)"ScanSrv                 " },
284    { FILE_ID_116 ,  (PS8)"ScanSrvSM               " },
285    { FILE_ID_117 ,  (PS8)"TWDriver                " },
286    { FILE_ID_118 ,  (PS8)"TWDriverCtrl            " },
287    { FILE_ID_119 ,  (PS8)"TWDriverRadio           " },
288    { FILE_ID_120 ,  (PS8)"TWDriverTx              " },
289    { FILE_ID_121 ,  (PS8)"TwIf                    " },
290    { FILE_ID_122 ,  (PS8)"SdioBusDrv              " },
291    { FILE_ID_123 ,  (PS8)"TxnQueue                " },
292    { FILE_ID_124 ,  (PS8)"WspiBusDrv              " },
293    { FILE_ID_125 ,  (PS8)"context                 " },
294    { FILE_ID_126 ,  (PS8)"freq                    " },
295    { FILE_ID_127 ,  (PS8)"fsm                     " },
296    { FILE_ID_128 ,  (PS8)"GenSM                   " },
297    { FILE_ID_129 ,  (PS8)"mem                     " },
298    { FILE_ID_130 ,  (PS8)"queue                   " },
299    { FILE_ID_131 ,  (PS8)"rate                    " },
300    { FILE_ID_132 ,  (PS8)"report                  " },
301    { FILE_ID_133 ,  (PS8)"stack                   " }
302};
303
304static named_value_t report_severity[] = {
305    { 0,                          (PS8)"----"           },
306    { REPORT_SEVERITY_INIT,         (PS8)"INIT",          },
307    { REPORT_SEVERITY_INFORMATION,  (PS8)"INFORMATION",   },
308    { REPORT_SEVERITY_WARNING,      (PS8)"WARNING",       },
309    { REPORT_SEVERITY_ERROR,        (PS8)"ERROR",         },
310    { REPORT_SEVERITY_FATAL_ERROR,  (PS8)"FATAL_ERROR",   },
311    { REPORT_SEVERITY_SM,           (PS8)"SM",            },
312    { REPORT_SEVERITY_CONSOLE,      (PS8)"CONSOLE"        }
313};
314
315static named_value_t power_level[] = {
316        { OS_POWER_LEVEL_ELP,       (PS8)"Extreme Low Power" },
317        { OS_POWER_LEVEL_PD,        (PS8)"Power Down" },
318        { OS_POWER_LEVEL_AWAKE,     (PS8)"Awake" },
319};
320
321static named_value_t band2Str[] = {
322        { RADIO_BAND_2_4_GHZ,                   (PS8)"2.4 GHz"                        },
323        { RADIO_BAND_5_0_GHZ,                   (PS8)"5.0 GHz"                        },
324        { RADIO_BAND_DUAL,                      (PS8)"Both   "                        }
325};
326
327static named_value_t EtEvent2Str[] = {
328        { SCAN_ET_COND_DISABLE,                 (PS8)"ET disabled  "                     },
329        { SCAN_ET_COND_BEACON,                  (PS8)"ET on Beacon "                     },
330        { SCAN_ET_COND_PROBE_RESP,              (PS8)"ET on Prb Rsp"                     },
331        { SCAN_ET_COND_ANY_FRAME,               (PS8)"ET on both   "                     }
332};
333
334static named_value_t rate2Str[] = {
335        { DRV_RATE_MASK_AUTO,                   (PS8)"Auto    "                          },
336        { DRV_RATE_MASK_1_BARKER,               (PS8)"1 Mbps  "                          },
337        { DRV_RATE_MASK_2_BARKER,               (PS8)"2 Mbps  "                          },
338        { DRV_RATE_MASK_5_5_CCK,                (PS8)"5.5 Mbps"                          },
339        { DRV_RATE_MASK_11_CCK,                 (PS8)"11 Mbps "                          },
340        { DRV_RATE_MASK_22_PBCC,                (PS8)"22 Mbps "                          },
341        { DRV_RATE_MASK_6_OFDM,                 (PS8)"6 Mbps  "                          },
342        { DRV_RATE_MASK_9_OFDM,                 (PS8)"9 Mbps  "                          },
343        { DRV_RATE_MASK_12_OFDM,                (PS8)"12 Mbps "                          },
344        { DRV_RATE_MASK_18_OFDM,                (PS8)"18 Mbps "                          },
345        { DRV_RATE_MASK_24_OFDM,                (PS8)"24 Mbps "                          },
346        { DRV_RATE_MASK_36_OFDM,                (PS8)"36 Mbps "                          },
347        { DRV_RATE_MASK_48_OFDM,                (PS8)"48 Mbps "                          },
348        { DRV_RATE_MASK_54_OFDM,                (PS8)"54 Mbps "                          }
349};
350
351static named_value_t scanType2Str[] = {
352        { SCAN_TYPE_NORMAL_PASSIVE,             (PS8)"Passive Normal Scan"               },
353        { SCAN_TYPE_NORMAL_ACTIVE,              (PS8)"Active Normal Scan"                },
354        { SCAN_TYPE_SPS,                        (PS8)"Scheduled Passive Scan (SPS)"      },
355        { SCAN_TYPE_TRIGGERED_PASSIVE,          (PS8)"Passive Triggered Scan"            },
356        { SCAN_TYPE_TRIGGERED_ACTIVE,           (PS8)"Active Triggered Scan"             }
357};
358
359static named_value_t booleanStr[] = {
360        { FALSE,                             (PS8)"False" },
361        { TRUE,                              (PS8)"True" }
362};
363
364static named_value_t ssidVisabilityStr[] = {
365        { SCAN_SSID_VISABILITY_PUBLIC,          (PS8)"Public" },
366        { SCAN_SSID_VISABILITY_HIDDEN,          (PS8)"Hidden" }
367};
368
369static named_value_t bssTypeStr[] = {
370        { BSS_INDEPENDENT,                      (PS8)"Independent" },
371        { BSS_INFRASTRUCTURE,                   (PS8)"Infrastructure" },
372        { BSS_ANY,                              (PS8)"Any" }
373};
374
375static named_value_t power_mode_val[] = {
376        { OS_POWER_MODE_AUTO,                   (PS8)"AUTO" },
377        { OS_POWER_MODE_ACTIVE,                 (PS8)"ACTIVE" },
378        { OS_POWER_MODE_SHORT_DOZE,             (PS8)"SHORT_DOZE" },
379        { OS_POWER_MODE_LONG_DOZE,              (PS8)"LONG_DOZE" }
380};
381
382static named_value_t encrypt_type[] = {
383        { OS_ENCRYPTION_TYPE_NONE,              (PS8)"None" },
384        { OS_ENCRYPTION_TYPE_WEP,               (PS8)"WEP" },
385        { OS_ENCRYPTION_TYPE_TKIP,              (PS8)"TKIP" },
386        { OS_ENCRYPTION_TYPE_AES,               (PS8)"AES" }
387};
388
389static named_value_t tKeepAliveTriggerTypes[] = {
390        { KEEP_ALIVE_TRIG_TYPE_NO_TX,           (PS8)"When Idle" },
391        { KEEP_ALIVE_TRIG_TYPE_PERIOD_ONLY,     (PS8)"Always" }
392};
393
394#if 0 /* need to create debug logic for CLI */
395static named_value_t cli_level_type[] = {
396        { CU_MSG_DEBUG,                         (PS8)"CU_MSG_DEBUG" },
397        { CU_MSG_INFO1,                         (PS8)"CU_MSG_INFO1" },
398        { CU_MSG_WARNING,                       (PS8)"CU_MSG_WARNING" },
399        { CU_MSG_ERROR,                         (PS8)"CU_MSG_ERROR" },
400        { CU_MSG_INFO2,                         (PS8)"CU_MSG_INFO2" }
401};
402#endif
403
404
405/* local fucntions */
406/*******************/
407static S32 CuCmd_Str2MACAddr(PS8 str, PU8 mac)
408{
409    S32 i;
410
411    for( i=0; i<MAC_ADDR_LEN; i++ )
412    {
413        mac[i] = (U8) os_strtoul(str, &str, 16);
414        str++;
415    }
416    return TRUE;
417}
418
419/* used in get_bssid_list() */
420static U8 CuCmd_Freq2Chan(U32 freq)
421{
422    U32 i;
423
424    for(i=0; i<CHAN_FREQ_TABLE_SIZE; i++)
425        if(ChanFreq[i].freq == freq)
426            return ChanFreq[i].chan;
427
428    return 0;
429}
430
431/* Converts a single ASCII character to a hex value (i.e. '0'-'9' = 0-9, 'a'-'f' = a-f, 'A'-'F' = a-f) */
432static U8 CuCmd_atox(U8 c)
433{
434    if (('0' <= c) && ('9' >= c))
435    {
436        return c - '0';
437    }
438    else if (('a' <= c) && ('f' >= c))
439    {
440        return c - 'a' + 10;
441    }
442    else /* assuming input is valid */
443    {
444        return c - 'A' + 10;
445    }
446}
447
448/* converts an ASCII string to a buffer */
449static void CuCmd_atox_string (U8* srcString, U8* dstBuffer)
450{
451    U32 uIndex, uLength;
452
453    uLength = os_strlen ((PS8)srcString);
454
455    /* clear the destination buffer */
456    os_memset (dstBuffer, 0, (uLength / 2) + 1);
457
458    for (uIndex = 0; uIndex < uLength; uIndex++)
459    {
460        if (0 == (uIndex % 2))
461        {
462            dstBuffer[ uIndex / 2 ] |= (CuCmd_atox (srcString[ uIndex ]) << 4);
463        }
464        else
465        {
466            dstBuffer[ uIndex / 2 ] |= CuCmd_atox (srcString[ uIndex ]);
467        }
468    }
469}
470
471static void CuCmd_xtoa_string (U8* srcBuffer, U32 srcBufferLength, U8* dstString)
472{
473    U32 uIndex;
474
475    for (uIndex = 0; uIndex < srcBufferLength; uIndex++)
476    {
477        os_sprintf ((PS8)&(dstString[ uIndex * 2 ]), (PS8)"%02x", srcBuffer[ uIndex ]);
478    }
479}
480
481static VOID CuCmd_Init_Scan_Params(CuCmd_t* pCuCmd)
482{
483    U8 i,j;
484
485    /* init application scan default params */
486    pCuCmd->appScanParams.desiredSsid.len = 0;
487    pCuCmd->appScanParams.scanType = SCAN_TYPE_NORMAL_ACTIVE;
488    pCuCmd->appScanParams.band = RADIO_BAND_2_4_GHZ;
489    pCuCmd->appScanParams.probeReqNumber = 3;
490    pCuCmd->appScanParams.probeRequestRate = RATE_MASK_UNSPECIFIED; /* Let the FW select */;
491    pCuCmd->appScanParams.numOfChannels = 14;
492    for ( i = 0; i < 14; i++ )
493    {
494        for ( j = 0; j < 6; j++ )
495        {
496            pCuCmd->appScanParams.channelEntry[ i ].normalChannelEntry.bssId[ j ] = 0xff;
497        }
498        pCuCmd->appScanParams.channelEntry[ i ].normalChannelEntry.earlyTerminationEvent = SCAN_ET_COND_DISABLE;
499        pCuCmd->appScanParams.channelEntry[ i ].normalChannelEntry.ETMaxNumOfAPframes = 0;
500        pCuCmd->appScanParams.channelEntry[ i ].normalChannelEntry.maxChannelDwellTime = 60000;
501        pCuCmd->appScanParams.channelEntry[ i ].normalChannelEntry.minChannelDwellTime = 30000;
502        pCuCmd->appScanParams.channelEntry[ i ].normalChannelEntry.txPowerDbm = DEF_TX_POWER;
503        pCuCmd->appScanParams.channelEntry[ i ].normalChannelEntry.channel = i + 1;
504    }
505
506    /* init periodic application scan params */
507    pCuCmd->tPeriodicAppScanParams.uSsidNum = 0;
508    pCuCmd->tPeriodicAppScanParams.uSsidListFilterEnabled = 1;
509    pCuCmd->tPeriodicAppScanParams.uCycleNum = 0; /* forever */
510    pCuCmd->tPeriodicAppScanParams.uCycleIntervalMsec[ 0 ] = 3;
511    for (i = 1; i < PERIODIC_SCAN_MAX_INTERVAL_NUM; i++)
512    {
513        pCuCmd->tPeriodicAppScanParams.uCycleIntervalMsec[ i ] = 30000;
514    }
515    pCuCmd->tPeriodicAppScanParams.iRssiThreshold = -80;
516    pCuCmd->tPeriodicAppScanParams.iSnrThreshold = 0;
517    pCuCmd->tPeriodicAppScanParams.uFrameCountReportThreshold = 1;
518    pCuCmd->tPeriodicAppScanParams.bTerminateOnReport = TRUE;
519    pCuCmd->tPeriodicAppScanParams.eBssType = BSS_ANY;
520    pCuCmd->tPeriodicAppScanParams.uProbeRequestNum = 3;
521    pCuCmd->tPeriodicAppScanParams.uChannelNum = 14;
522    for ( i = 0; i < 14; i++ )
523    {
524        pCuCmd->tPeriodicAppScanParams.tChannels[ i ].eBand = RADIO_BAND_2_4_GHZ;
525        pCuCmd->tPeriodicAppScanParams.tChannels[ i ].uChannel = i + 1;
526        pCuCmd->tPeriodicAppScanParams.tChannels[ i ].eScanType = SCAN_TYPE_NORMAL_ACTIVE;
527        pCuCmd->tPeriodicAppScanParams.tChannels[ i ].uMinDwellTimeMs = 5;
528        pCuCmd->tPeriodicAppScanParams.tChannels[ i ].uMaxDwellTimeMs = 20;
529        pCuCmd->tPeriodicAppScanParams.tChannels[ i ].uTxPowerLevelDbm = DEF_TX_POWER;
530    }
531
532    /* init default scan policy */
533    pCuCmd->scanPolicy.normalScanInterval = 10000;
534    pCuCmd->scanPolicy.deterioratingScanInterval = 5000;
535    pCuCmd->scanPolicy.maxTrackFailures = 3;
536    pCuCmd->scanPolicy.BSSListSize = 4;
537    pCuCmd->scanPolicy.BSSNumberToStartDiscovery = 1;
538    pCuCmd->scanPolicy.numOfBands = 1;
539    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].band = RADIO_BAND_2_4_GHZ;
540    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].rxRSSIThreshold = -80;
541    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].numOfChannles = 14;
542    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].numOfChannlesForDiscovery = 3;
543    for ( i = 0; i < 14; i++ )
544    {
545        pCuCmd->scanPolicy.bandScanPolicy[ 0 ].channelList[ i ] = i + 1;
546    }
547    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].trackingMethod.scanType = SCAN_TYPE_NORMAL_ACTIVE;
548    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].trackingMethod.method.basicMethodParams.earlyTerminationEvent = SCAN_ET_COND_DISABLE;
549    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].trackingMethod.method.basicMethodParams.ETMaxNumberOfApFrames = 0;
550    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].trackingMethod.method.basicMethodParams.maxChannelDwellTime = 30000;
551    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].trackingMethod.method.basicMethodParams.minChannelDwellTime = 15000;
552    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].trackingMethod.method.basicMethodParams.probReqParams.bitrate = RATE_MASK_UNSPECIFIED; /* Let the FW select */
553    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].trackingMethod.method.basicMethodParams.probReqParams.numOfProbeReqs = 3;
554    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].trackingMethod.method.basicMethodParams.probReqParams.txPowerDbm = DEF_TX_POWER;
555    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].discoveryMethod.scanType = SCAN_TYPE_NORMAL_ACTIVE;
556    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].discoveryMethod.method.basicMethodParams.earlyTerminationEvent = SCAN_ET_COND_DISABLE;
557    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].discoveryMethod.method.basicMethodParams.ETMaxNumberOfApFrames = 0;
558    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].discoveryMethod.method.basicMethodParams.maxChannelDwellTime = 30000;
559    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].discoveryMethod.method.basicMethodParams.minChannelDwellTime = 15000;
560    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].discoveryMethod.method.basicMethodParams.probReqParams.bitrate = RATE_MASK_UNSPECIFIED; /* Let the FW select */;
561    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].discoveryMethod.method.basicMethodParams.probReqParams.numOfProbeReqs = 3;
562    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].discoveryMethod.method.basicMethodParams.probReqParams.txPowerDbm = DEF_TX_POWER;
563    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].immediateScanMethod.scanType = SCAN_TYPE_NORMAL_ACTIVE;
564    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].immediateScanMethod.method.basicMethodParams.earlyTerminationEvent = SCAN_ET_COND_DISABLE;
565    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].immediateScanMethod.method.basicMethodParams.ETMaxNumberOfApFrames = 0;
566    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].immediateScanMethod.method.basicMethodParams.maxChannelDwellTime = 30000;
567    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].immediateScanMethod.method.basicMethodParams.minChannelDwellTime = 15000;
568    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].immediateScanMethod.method.basicMethodParams.probReqParams.bitrate = RATE_MASK_UNSPECIFIED; /* Let the FW select */;
569    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].immediateScanMethod.method.basicMethodParams.probReqParams.numOfProbeReqs = 3;
570    pCuCmd->scanPolicy.bandScanPolicy[ 0 ].immediateScanMethod.method.basicMethodParams.probReqParams.txPowerDbm = DEF_TX_POWER;
571}
572
573char* PrintSSID(OS_802_11_SSID* ssid)
574{
575	if(ssid->SsidLength < 32)
576		ssid->Ssid[ssid->SsidLength] = 0;
577	else
578		ssid->Ssid[31] = 0;
579
580	return (char*)&ssid->Ssid[0];
581}
582
583
584static VOID CuCmd_PrintBssidList(OS_802_11_BSSID_LIST_EX* bssidList, S32 IsFullPrint, TMacAddr CurrentBssid)
585{
586    U32 i;
587    S8  connectionTypeStr[50];
588    POS_802_11_BSSID_EX pBssid = &bssidList->Bssid[0];
589
590    os_error_printf(CU_MSG_INFO2, (PS8)"BssId List: Num=%u\n", bssidList->NumberOfItems);
591    os_error_printf(CU_MSG_INFO2, (PS8)"         MAC        Privacy Rssi  Mode    Channel    SSID\n");
592    for(i=0; i<bssidList->NumberOfItems; i++)
593    {
594        switch (pBssid->InfrastructureMode)
595        {
596            case os802_11IBSS:
597                os_strcpy (connectionTypeStr, (PS8)"Adhoc");
598                break;
599            case os802_11Infrastructure:
600                os_strcpy (connectionTypeStr, (PS8)"Infra");
601                break;
602            case os802_11AutoUnknown:
603                os_strcpy (connectionTypeStr, (PS8)"Auto");
604                break;
605            default:
606                os_strcpy (connectionTypeStr, (PS8)" --- ");
607                break;
608        }
609        os_error_printf(CU_MSG_INFO2, (PS8)"%s%02x.%02x.%02x.%02x.%02x.%02x   %3u   %4d  %s %6d        %s\n",
610            (!os_memcmp(CurrentBssid, pBssid->MacAddress, MAC_ADDR_LEN))?"*":" ",
611            pBssid->MacAddress[0],
612            pBssid->MacAddress[1],
613            pBssid->MacAddress[2],
614            pBssid->MacAddress[3],
615            pBssid->MacAddress[4],
616            pBssid->MacAddress[5],
617            pBssid->Privacy,
618			(char)pBssid->Rssi | 0xffffff00, /* need the 0xffffff00 to get negative value display */
619            connectionTypeStr,
620            CuCmd_Freq2Chan(pBssid->Configuration.Union.channel),
621            (pBssid->Ssid.Ssid[0] == '\0')?(PS8)"****":((PS8)pBssid->Ssid.Ssid) );
622
623        if (IsFullPrint)
624        {
625            os_error_printf(CU_MSG_INFO2, (PS8)"   BeaconInterval %d\n",  pBssid->Configuration.BeaconPeriod);
626            os_error_printf(CU_MSG_INFO2, (PS8)"   Capabilities   0x%x\n",  pBssid->Capabilities);
627        }
628#ifdef _WINDOWS
629		pBssid = (POS_802_11_BSSID_EX)((S8*)pBssid + (pBssid->Length ? pBssid->Length : sizeof(OS_802_11_BSSID_EX)));
630#else /*for Linux*/
631		pBssid = &bssidList->Bssid[i+1];
632#endif
633    }
634}
635
636static U8 CuCmd_Char2Hex( S8 c )
637{
638    if( c >= '0' && c <= '9' )
639        return c - '0';
640    else if( os_tolower(c) >= 'a' && os_tolower(c) <= 'f' )
641        return (U8) (os_tolower(c) - 'a' + 0x0a);
642    os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - CuCmd_Char2Hex - invalid symbol '%c'\n", c );
643    return ((U8)-1);
644}
645
646static PS8 CuCmd_CreateRateStr(PS8 str, U8 rate)
647{
648    if( rate == 0 )
649        return os_strcpy(str,(PS8)"Auto (0)");
650
651    os_sprintf(str, (PS8)"%.3g Mbps",
652        RATE_2_MBPS(rate));
653
654    return str;
655}
656
657static VOID CuCmd_PrintScanMethod(scan_Method_t* scanMethod)
658{
659    S32 i;
660    os_error_printf(CU_MSG_INFO2, (PS8)"Scan type: %s\n", scanType2Str[ scanMethod->scanType ].name);
661    switch (scanMethod->scanType)
662    {
663        case SCAN_TYPE_NORMAL_ACTIVE:
664        case SCAN_TYPE_NORMAL_PASSIVE:
665            os_error_printf(CU_MSG_INFO2, (PS8)"Max channel dwell time: %d, Min channel dwell time: %d\n",
666                scanMethod->method.basicMethodParams.maxChannelDwellTime,
667                scanMethod->method.basicMethodParams.minChannelDwellTime);
668
669            CU_CMD_FIND_NAME_ARRAY(i, EtEvent2Str, scanMethod->method.basicMethodParams.earlyTerminationEvent);
670            os_error_printf(CU_MSG_INFO2 ,(PS8)"ET condition: %s, ET number of frames: %d\n",
671                EtEvent2Str[i].name,
672                scanMethod->method.basicMethodParams.ETMaxNumberOfApFrames);
673
674            CU_CMD_FIND_NAME_ARRAY(i, rate2Str, scanMethod->method.basicMethodParams.probReqParams.bitrate);
675            os_error_printf(CU_MSG_INFO2 ,(PS8)"Probe request number: %d, probe request rate: %s, TX level: %d\n",
676                scanMethod->method.basicMethodParams.probReqParams.numOfProbeReqs,
677                rate2Str[i].name,
678                scanMethod->method.basicMethodParams.probReqParams.txPowerDbm);
679            break;
680
681        case SCAN_TYPE_TRIGGERED_ACTIVE:
682        case SCAN_TYPE_TRIGGERED_PASSIVE:
683            os_error_printf(CU_MSG_INFO2, (PS8)"Triggering Tid: %d\n", scanMethod->method.TidTriggerdMethodParams.triggeringTid);
684            os_error_printf(CU_MSG_INFO2, (PS8)"Max channel dwell time: %d, Min channel dwell time: %d\n",
685                scanMethod->method.basicMethodParams.maxChannelDwellTime,
686                scanMethod->method.basicMethodParams.minChannelDwellTime);
687
688            CU_CMD_FIND_NAME_ARRAY(i, EtEvent2Str, scanMethod->method.basicMethodParams.earlyTerminationEvent);
689            os_error_printf(CU_MSG_INFO2, (PS8)"ET condition: %s, ET number of frames: %d\n",
690                EtEvent2Str[i].name,
691                scanMethod->method.basicMethodParams.ETMaxNumberOfApFrames);
692
693            CU_CMD_FIND_NAME_ARRAY(i, rate2Str, scanMethod->method.basicMethodParams.probReqParams.bitrate);
694            os_error_printf(CU_MSG_INFO2, (PS8)"Probe request number: %d, probe request rate: %s, TX level: %d\n",
695                scanMethod->method.basicMethodParams.probReqParams.numOfProbeReqs,
696                rate2Str[i].name,
697                scanMethod->method.basicMethodParams.probReqParams.txPowerDbm);
698            break;
699
700        case SCAN_TYPE_SPS:
701            CU_CMD_FIND_NAME_ARRAY(i, EtEvent2Str, scanMethod->method.spsMethodParams.earlyTerminationEvent);
702            os_error_printf(CU_MSG_INFO2, (PS8)"ET condition: %s, ET number of frames: %d\n",
703                EtEvent2Str[i].name,
704                scanMethod->method.spsMethodParams.ETMaxNumberOfApFrames);
705            os_error_printf(CU_MSG_INFO2, (PS8)"Scan duration: %d\n", scanMethod->method.spsMethodParams.scanDuration);
706            break;
707
708        case SCAN_TYPE_NO_SCAN:
709        case SCAN_TYPE_PACTSIVE:
710            break;
711    }
712}
713
714static VOID CuCmd_PrintScanBand(scan_bandPolicy_t* pBandPolicy)
715{
716    S32 j;
717
718    os_error_printf(CU_MSG_INFO2, (PS8)"\nBand: %s\n", band2Str[ pBandPolicy->band ].name);
719    os_error_printf(CU_MSG_INFO2, (PS8)"RSSI Threshold: %d dBm\n", pBandPolicy->rxRSSIThreshold);
720    os_error_printf(CU_MSG_INFO2, (PS8)"Number of channels for each discovery interval: %d\n", pBandPolicy->numOfChannlesForDiscovery);
721    os_error_printf(CU_MSG_INFO2, (PS8)"\nTracking Method:\n");
722    CuCmd_PrintScanMethod( &(pBandPolicy->trackingMethod) );
723    os_error_printf(CU_MSG_INFO2, (PS8)"\nDiscovery Method:\n");
724    CuCmd_PrintScanMethod( &(pBandPolicy->discoveryMethod) );
725    os_error_printf(CU_MSG_INFO2, (PS8)"\nImmediate Scan Method:\n");
726    CuCmd_PrintScanMethod( &(pBandPolicy->immediateScanMethod) );
727    if ( pBandPolicy->numOfChannles > 0 )
728    {
729        os_error_printf(CU_MSG_INFO2, (PS8)"\nChannel list: ");
730        for ( j = 0; j < pBandPolicy->numOfChannles; j++ )
731        {
732            os_error_printf(CU_MSG_INFO2, (PS8)"%3d ", pBandPolicy->channelList[ j ]);
733        }
734        os_error_printf(CU_MSG_INFO2, (PS8)"\n");
735    }
736    else
737    {
738        os_error_printf(CU_MSG_INFO2, (PS8)"\nNo channels defined.\n");
739    }
740}
741
742static U32 CuCmd_IsValueRate(U32 rate)
743{
744
745    switch (rate)
746    {
747        case 1:
748        case 2:
749        case 5:
750        case 6:
751        case 9:
752        case 11:
753        case 12:
754        case 18:
755        case 24:
756        case 36:
757        case 48:
758        case 54:
759            return (TRUE);
760
761        default:
762            return (FALSE);
763   }
764}
765
766static VOID CuCmd_ParseMaskString(PS8 pString, PU8 pBuffer, PU8 pLength)
767{
768    S8  ch;
769    S32 iter = 0;
770    U8  val;
771
772    while ((ch = pString[iter]))
773    {
774        val = (ch == '1' ? 1 : 0);
775
776        if (iter % BIT_TO_BYTE_FACTOR)
777            pBuffer[iter / BIT_TO_BYTE_FACTOR] |= (val << (iter % BIT_TO_BYTE_FACTOR));
778        else
779            pBuffer[iter / BIT_TO_BYTE_FACTOR] = val;
780
781        ++iter;
782    }
783
784    /* iter = 0 len = 0, iter = 1 len = 1, iter = 8 len = 1, and so on... */
785    *pLength = (U8) (iter + BIT_TO_BYTE_FACTOR - 1) / BIT_TO_BYTE_FACTOR;
786}
787
788static VOID CuCmd_ParsePatternString(PS8 pString, PU8 pBuffer, PU8 pLength)
789{
790    S8 ch;
791    S32 iter = 0;
792    U8 val;
793
794    while ((ch = pString[iter]))
795    {
796        val = ((ch >= '0' && ch <= '9') ? (ch - '0') :
797                     (ch >= 'A' && ch <= 'F') ? (0xA + ch - 'A') :
798                     (ch >= 'a' && ch <= 'f') ? (0xA + ch - 'a') : 0);
799
800        /* even indexes go to the lower nibble, odd indexes push them to the */
801        /* higher nibble and then go themselves to the lower nibble. */
802        if (iter % 2)
803            pBuffer[iter / 2] = ((pBuffer[iter / 2] << (BIT_TO_BYTE_FACTOR / 2)) | val);
804        else
805            pBuffer[iter / 2] = val;
806
807        ++iter;
808    }
809
810    /* iter = 0 len = 0, iter = 1 len = 1, iter = 2 len = 1, and so on... */
811    *pLength = (U8) (iter + 1) / 2;
812}
813
814/* functions */
815/*************/
816THandle CuCmd_Create(const PS8 device_name, THandle hConsole, S32 BypassSupplicant, PS8 pSupplIfFile)
817{
818    THandle hIpcSta;
819
820    CuCmd_t* pCuCmd = (CuCmd_t*)os_MemoryCAlloc(sizeof(CuCmd_t), sizeof(U8));
821    if(pCuCmd == NULL)
822    {
823        os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - CuCmd_Create - cant allocate control block\n");
824        return NULL;
825    }
826
827    pCuCmd->isDeviceRunning = FALSE;
828    pCuCmd->hConsole = hConsole;
829
830    pCuCmd->hCuCommon= CuCommon_Create(&hIpcSta, device_name);
831    if(pCuCmd->hCuCommon == NULL)
832    {
833        CuCmd_Destroy(pCuCmd);
834        return NULL;
835    }
836
837    pCuCmd->hCuWext= CuOs_Create(hIpcSta);
838    if(pCuCmd->hCuWext == NULL)
839    {
840        CuCmd_Destroy(pCuCmd);
841        return NULL;
842    }
843
844    pCuCmd->hIpcEvent = (THandle) IpcEvent_Create();
845    if(pCuCmd->hIpcEvent == NULL)
846    {
847        CuCmd_Destroy(pCuCmd);
848        return NULL;
849    }
850
851    if(BypassSupplicant)
852    {
853        /* specify that there is no supplicant */
854        pCuCmd->hWpaCore = NULL;
855    }
856    else
857    {
858#ifndef NO_WPA_SUPPL
859        S32 res;
860
861        pCuCmd->hWpaCore = WpaCore_Create(&res, pSupplIfFile);
862        if((pCuCmd->hWpaCore == NULL) && (res != EOALERR_IPC_WPA_ERROR_CANT_CONNECT_TO_SUPPL))
863        {
864            CuCmd_Destroy(pCuCmd);
865            return NULL;
866        }
867
868        if(res == EOALERR_IPC_WPA_ERROR_CANT_CONNECT_TO_SUPPL)
869        {
870            os_error_printf(CU_MSG_ERROR, (PS8)"******************************************************\n");
871            os_error_printf(CU_MSG_ERROR, (PS8)"Connection to supplicant failed\n");
872            os_error_printf(CU_MSG_ERROR, (PS8)"******************************************************\n");
873        }
874        else
875        {
876            os_error_printf(CU_MSG_INFO2, (PS8)"Connection established with supplicant\n");
877        }
878#endif
879    }
880
881    CuCmd_Init_Scan_Params(pCuCmd);
882
883    return pCuCmd;
884}
885
886VOID CuCmd_Destroy(THandle hCuCmd)
887{
888    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
889
890    if(pCuCmd->hCuCommon)
891    {
892        CuCommon_Destroy(pCuCmd->hCuCommon);
893    }
894
895    if(pCuCmd->hCuWext)
896    {
897        CuOs_Destroy(pCuCmd->hCuWext);
898    }
899
900    if(pCuCmd->hIpcEvent)
901    {
902        IpcEvent_Destroy(pCuCmd->hIpcEvent);
903    }
904
905#ifndef NO_WPA_SUPPL
906    if(pCuCmd->hWpaCore)
907    {
908        WpaCore_Destroy(pCuCmd->hWpaCore);
909    }
910#endif
911
912    os_MemoryFree(pCuCmd);
913}
914
915S32 CuCmd_GetDeviceStatus(THandle hCuCmd)
916{
917    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
918    S32 status;
919
920    status = CuCommon_GetU32(pCuCmd->hCuCommon, DRIVER_STATUS_PARAM, &pCuCmd->isDeviceRunning);
921
922    if ((status == OK) && pCuCmd->isDeviceRunning)
923        return OK;
924
925    return ECUERR_CU_CMD_ERROR_DEVICE_NOT_LOADED;
926}
927
928VOID CuCmd_StartDriver(THandle hCuCmd)
929{
930    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
931    U32 uDummyBuf;
932
933    if(OK != CuCommon_SetBuffer(pCuCmd->hCuCommon, DRIVER_START_PARAM, &uDummyBuf, sizeof(uDummyBuf)))
934    {
935        os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - Failed to start driver!\n");
936    }
937}
938
939VOID CuCmd_StopDriver(THandle hCuCmd)
940{
941    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
942    U32 uDummyBuf;
943
944    if(OK != CuCommon_SetBuffer(pCuCmd->hCuCommon, DRIVER_STOP_PARAM, &uDummyBuf, sizeof(uDummyBuf)))
945    {
946        os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - Failed to stop driver!\n");
947    }
948}
949
950#ifdef XCC_MODULE_INCLUDED
951THandle CuCmd_GetCuCommonHandle(THandle hCuCmd)
952{
953    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
954
955    return pCuCmd->hCuCommon;
956}
957
958THandle CuCmd_GetCuWpaHandle (THandle hCuCmd)
959{
960    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
961
962    return pCuCmd->hWpaCore;
963
964}
965#endif
966
967VOID CuCmd_Show_Status(THandle hCuCmd, ConParm_t parm[], U16 nParms)
968{
969    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
970
971    TMacAddr Mac;
972    OS_802_11_SSID ssid;
973    TMacAddr bssid;
974    U32 channel, threadid=0;
975
976    if(OK != CuCmd_GetDeviceStatus(hCuCmd))
977    {
978        os_error_printf(CU_MSG_INFO2, (PS8)"Driver is stopped!\n");
979        return;
980    }
981
982    CuOs_GetDriverThreadId(pCuCmd->hCuWext, &threadid);
983    if(OK != CuCommon_GetBuffer(pCuCmd->hCuCommon, CTRL_DATA_MAC_ADDRESS, Mac, sizeof(TMacAddr))) return;
984    if(OK != CuOs_Get_SSID(pCuCmd->hCuWext, &ssid)) return;
985    if(OK != CuOs_Get_BSSID(pCuCmd->hCuWext, bssid)) return;
986    if(OK != CuOs_GetCurrentChannel(pCuCmd->hCuWext, &channel)) return;
987
988    if (threadid != 0)
989    {
990        os_error_printf(CU_MSG_INFO2, (PS8)"Thread id: %u (0x%x)\n\n", threadid, threadid);
991    }
992    os_error_printf(CU_MSG_INFO2, (PS8)"==========================\n");
993    os_error_printf(CU_MSG_INFO2, (PS8)"Status   : running\n");
994    os_error_printf(CU_MSG_INFO2, (PS8)"MAC      : %02x.%02x.%02x.%02x.%02x.%02x\n",Mac[0],Mac[1],Mac[2],Mac[3],Mac[4],Mac[5]);
995    os_error_printf(CU_MSG_INFO2, (PS8)"SSID     : %s\n",(ssid.SsidLength)?PrintSSID(&ssid):"<empty>");
996    os_error_printf(CU_MSG_INFO2, (PS8)"BSSID    : %02x.%02x.%02x.%02x.%02x.%02x\n",bssid[0],bssid[1],bssid[2],bssid[3],bssid[4],bssid[5]);
997    if(channel)
998        os_error_printf(CU_MSG_INFO2, (PS8)"Channel  : %d\n",channel);
999    else
1000        os_error_printf(CU_MSG_INFO2, (PS8)"Channel  : <empty>\n");
1001    os_error_printf(CU_MSG_INFO2, (PS8)"==========================\n");
1002
1003}
1004
1005VOID CuCmd_BssidList(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1006{
1007    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1008    U32 SizeOfBssiList=0;
1009    OS_802_11_BSSID_LIST_EX* bssidList;
1010    TMacAddr bssid;
1011
1012    if(OK != CuCommon_Get_BssidList_Size(pCuCmd->hCuCommon, &SizeOfBssiList))
1013    {
1014        os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - CuCmd_Bssid_List - cant get Bssid list size\n");
1015        return;
1016    }
1017
1018    /* allocate the bssidList */
1019    bssidList = os_MemoryCAlloc(SizeOfBssiList, sizeof(U8));
1020    if(bssidList == NULL)
1021    {
1022        os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - CuCmd_Bssid_List - cant allocate Bssid list\n");
1023        return;
1024    }
1025
1026    if(SizeOfBssiList == sizeof(U32))
1027    {
1028        /* means that bssidList is empty*/
1029        bssidList->NumberOfItems = 0;
1030        /* os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - CuCmd_Bssid_List - size of list is %d, indicating empty list\n",
1031                        sizeof(U32)); */
1032    }
1033    else
1034    {
1035        if (OK != CuOs_GetBssidList(pCuCmd->hCuWext, bssidList))
1036        {
1037            os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - CuCmd_Bssid_List - cant get Bssid list\n");
1038            os_MemoryFree(bssidList);
1039            return;
1040        }
1041    }
1042
1043    /* get currently connected bssid */
1044    if(OK != CuOs_Get_BSSID(pCuCmd->hCuWext, bssid))
1045    {
1046        os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - CuCmd_Bssid_List - cant get current BSSID\n");
1047        os_MemoryFree(bssidList);
1048        return;
1049    }
1050
1051    /* print the list to the terminal */
1052    CuCmd_PrintBssidList(bssidList, FALSE, bssid);
1053
1054    /* free the bssidList */
1055    os_MemoryFree(bssidList);
1056
1057}
1058
1059VOID CuCmd_FullBssidList(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1060{
1061    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1062    U32 SizeOfBssiList=0;
1063    OS_802_11_BSSID_LIST_EX* bssidList;
1064    TMacAddr bssid;
1065
1066    if(OK != CuCommon_Get_BssidList_Size(pCuCmd->hCuCommon, &SizeOfBssiList)) return;
1067
1068    /* allocate the bssidList */
1069    bssidList = os_MemoryCAlloc(SizeOfBssiList, sizeof(U8));
1070    if(bssidList == NULL)
1071    {
1072        os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - CuCmd_Bssid_List - cant allocate Bssid list\n");
1073        return;
1074    }
1075
1076    if(SizeOfBssiList == sizeof(U32))
1077    {
1078        /* means that bssidList is empty*/
1079        bssidList->NumberOfItems = 0;
1080
1081    }
1082    else
1083    {
1084        if(OK != CuOs_GetBssidList(pCuCmd->hCuWext, bssidList) ) return;
1085    }
1086
1087    /* get currently connected bssid */
1088    if(OK != CuOs_Get_BSSID(pCuCmd->hCuWext, bssid)) return;
1089
1090    /* print the list to the terminal */
1091    CuCmd_PrintBssidList(bssidList, TRUE, bssid);
1092
1093    /* free the bssidList */
1094    os_MemoryFree(bssidList);
1095}
1096
1097#if defined(CONFIG_EAP_WSC) && !defined(NO_WPA_SUPPL)
1098VOID CuCmd_StartEnrolleePIN(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1099{
1100    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1101
1102    if (pCuCmd->hWpaCore == NULL)
1103    {
1104        os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - Cannot start Enrollee without connection to supplicant\n");
1105        return;
1106    }
1107
1108    WpaCore_StartWpsPIN(pCuCmd->hWpaCore);
1109    os_error_printf(CU_MSG_INFO2, (PS8)"WPS in PIN mode started\n");
1110}
1111
1112VOID CuCmd_StartEnrolleePBC(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1113{
1114    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1115
1116    if (pCuCmd->hWpaCore == NULL)
1117    {
1118        os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - Cannot start Enrollee push button without connection to supplicant\n");
1119        return;
1120    }
1121
1122    WpaCore_StartWpsPBC(pCuCmd->hWpaCore);
1123    os_error_printf(CU_MSG_INFO2, (PS8)"WPS in PBC mode started\n");
1124}
1125
1126VOID CuCmd_StopEnrollee(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1127{
1128    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1129    if (pCuCmd->hWpaCore == NULL)
1130    {
1131        os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - Cannot Stop Enrollee without connection to supplicant\n");
1132        return;
1133    }
1134
1135    WpaCore_StopWps(pCuCmd->hWpaCore);
1136    os_error_printf(CU_MSG_INFO2, (PS8)"WPS mode stopped\n");
1137}
1138
1139VOID CuCmd_SetPin(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1140{
1141    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1142
1143    if (pCuCmd->hWpaCore == NULL)
1144    {
1145        os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - Cannot set PIN without connection to supplicant\n");
1146        return;
1147    }
1148
1149    WpaCore_SetPin(pCuCmd->hWpaCore, (PS8)parm[0].value);
1150    os_error_printf(CU_MSG_INFO2, (PS8)"WPS PIN set %s\n", parm[0].value);
1151}
1152
1153#endif /* CONFIG_EAP_WSC */
1154
1155VOID CuCmd_Connect(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1156{
1157    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1158    TMacAddr bssid = { 0xff,0xff,0xff,0xff,0xff,0xff };
1159    OS_802_11_SSID ssid;
1160    U32 BssType;
1161
1162    switch (nParms)
1163    {
1164        case 0 :
1165            /*
1166            *  No SSID & No BSSID are set -
1167            *  Use Any SSID & Any BSSID.
1168            */
1169            ssid.SsidLength = 0;
1170            ssid.Ssid[0] = 0;
1171            break;
1172        case 1:
1173            /*
1174            *  SSID set & BSSID insn't set  -
1175            *  Use CLI's SSID & Any BSSID.
1176            */
1177            ssid.SsidLength = os_strlen( (PS8)parm[0].value);
1178            os_memcpy((PVOID)ssid.Ssid, (PVOID) parm[0].value, ssid.SsidLength);
1179            ssid.Ssid[ssid.SsidLength] = '\0';
1180            break;
1181        case 2:
1182            /*
1183             *  Both SSID & BSSID are set -
1184             *  Use CLI's SSID & BSSID.
1185             */
1186            if(!CuCmd_Str2MACAddr( (PS8)parm[1].value, bssid) )
1187                return;
1188            ssid.SsidLength = os_strlen((PS8) parm[0].value);
1189            os_memcpy((PVOID)ssid.Ssid, (PVOID) parm[0].value, ssid.SsidLength);
1190            ssid.Ssid[ssid.SsidLength] = '\0';
1191            break;
1192    }
1193
1194    if(pCuCmd->hWpaCore == NULL)
1195    {
1196        if(OK != CuCommon_GetU32(pCuCmd->hCuCommon, CTRL_DATA_CURRENT_BSS_TYPE_PARAM, &BssType)) return;
1197
1198        if((BssType == os802_11IBSS/* Ad-Hoc */) && (ssid.SsidLength == 0))
1199        {
1200            os_error_printf(CU_MSG_INFO2, (PS8)"SSID string is needed due to fact that BSS Type set to Ad-Hoc.\n");
1201            return;
1202        }
1203
1204        if(OK != CuOs_Set_BSSID(pCuCmd->hCuWext, bssid ) ) return;
1205        if(OK != CuOs_Set_ESSID(pCuCmd->hCuWext, &ssid) ) return;
1206    }
1207    else
1208    {
1209#ifndef NO_WPA_SUPPL
1210        if(OK != WpaCore_GetBssType(pCuCmd->hWpaCore, &BssType)) return;
1211
1212        if((BssType == os802_11IBSS/* Ad-Hoc */) && (ssid.SsidLength == 0))
1213        {
1214            os_error_printf(CU_MSG_INFO2, (PS8)"SSID string is needed due to fact BSS Type set to Ad-Hoc\n");
1215            return;
1216        }
1217
1218        WpaCore_SetSsid(pCuCmd->hWpaCore, &ssid, bssid);
1219#endif
1220    }
1221}
1222
1223VOID CuCmd_Disassociate(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1224{
1225    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1226
1227    if(pCuCmd->hWpaCore == NULL)
1228    {
1229        OS_802_11_SSID ssid;
1230
1231        ssid.SsidLength = MAX_SSID_LEN;
1232        os_memset(ssid.Ssid, 0, MAX_SSID_LEN);
1233
1234        CuOs_Set_ESSID(pCuCmd->hCuWext, &ssid);
1235    }
1236    else
1237    {
1238#ifndef NO_WPA_SUPPL
1239        WpaCore_Disassociate(pCuCmd->hWpaCore);
1240#endif
1241    }
1242}
1243
1244VOID CuCmd_ModifySsid(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1245{
1246    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1247    OS_802_11_SSID ssid;
1248    TMacAddr bssid = { 0xff,0xff,0xff,0xff,0xff,0xff };
1249
1250    if( nParms == 0 )
1251    {
1252        OS_802_11_SSID ssid;
1253        if(OK != CuOs_Get_SSID(pCuCmd->hCuWext, &ssid)) return;
1254        os_error_printf(CU_MSG_INFO2, (PS8)"SSID: %s\n",(ssid.SsidLength)?(PS8)PrintSSID(&ssid):(PS8)"<empty>");
1255    }
1256    else
1257    {
1258        /* Setting the new SSID, BRCS BSSID is set to clean pre-set BSSID */
1259        ssid.SsidLength = os_strlen((PS8) parm[0].value);
1260        os_memcpy((PVOID)ssid.Ssid, (PVOID) parm[0].value, ssid.SsidLength);
1261        if(ssid.SsidLength < MAX_SSID_LEN)
1262        {
1263            ssid.Ssid[ssid.SsidLength] = 0;
1264        }
1265
1266        if(OK != CuOs_Set_BSSID(pCuCmd->hCuWext, bssid ) ) return;
1267        if(OK != CuOs_Set_ESSID(pCuCmd->hCuWext, &ssid) ) return;
1268    }
1269}
1270
1271VOID CuCmd_ModifyConnectMode(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1272{
1273    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1274    U32      i;
1275
1276    if( nParms == 0 )
1277    {
1278        U32 uConnectMode;
1279
1280        if(OK != CuCommon_GetU32 (pCuCmd->hCuCommon, SME_CONNECTION_MODE_PARAM, &uConnectMode)) return;
1281        CU_CMD_FIND_NAME_ARRAY (i, Current_mode, uConnectMode);
1282        os_error_printf (CU_MSG_INFO2, (PS8)"Current mode = %s\n", Current_mode[i].name);
1283        print_available_values (Current_mode);
1284    }
1285    else
1286    {
1287        U32 uConnectMode = parm[0].value;
1288
1289        /* check if the param is valid */
1290        CU_CMD_FIND_NAME_ARRAY (i, Current_mode, uConnectMode);
1291        if(i == SIZE_ARR(Current_mode))
1292        {
1293            os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_ModifyConnectMode, Connect Mode %d is not defined!\n", uConnectMode);
1294            print_available_values (Current_mode);
1295            return;
1296        }
1297        else
1298        {
1299            CuCommon_SetU32(pCuCmd->hCuCommon, SME_CONNECTION_MODE_PARAM, uConnectMode);
1300        }
1301    }
1302}
1303
1304VOID CuCmd_ModifyChannel(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1305{
1306    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1307
1308    if( nParms == 0 )
1309    {
1310        U8 desiredChannel = 0;
1311        U32 currentChannel = 0;
1312
1313
1314        if(OK != CuCommon_GetU8(pCuCmd->hCuCommon, SITE_MGR_DESIRED_CHANNEL_PARAM, &desiredChannel)) return;
1315        if(OK != CuOs_GetCurrentChannel(pCuCmd->hCuWext, &currentChannel)) return;
1316
1317        os_error_printf(CU_MSG_INFO2, (PS8)"Channel=%d (desired: %d)\n",currentChannel,desiredChannel);
1318    }
1319    else
1320    {
1321        CuCommon_SetU32(pCuCmd->hCuCommon, SITE_MGR_DESIRED_CHANNEL_PARAM, parm[0].value);
1322    }
1323}
1324
1325VOID CuCmd_GetTxRate(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1326{
1327    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1328
1329    if( nParms == 0)
1330    {
1331        U8 CurrentTxRate;
1332        S8 CurrentTxRateStr[50];
1333
1334        if(OK != CuCommon_GetU8(pCuCmd->hCuCommon, TIWLN_802_11_CURRENT_RATES_GET, &CurrentTxRate)) return;
1335
1336        CuCmd_CreateRateStr(CurrentTxRateStr, CurrentTxRate);
1337        os_error_printf(CU_MSG_INFO2, (PS8)"Rate: %s\n", CurrentTxRateStr);
1338    }
1339}
1340
1341VOID CuCmd_ModifyBssType(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1342{
1343    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1344    U8 BssType;
1345    S32 i;
1346
1347    if( nParms == 0 )
1348    {
1349        if(pCuCmd->hWpaCore == NULL)
1350        {
1351            if(OK != CuCommon_GetU8(pCuCmd->hCuCommon, CTRL_DATA_CURRENT_BSS_TYPE_PARAM, &BssType)) return;
1352        }
1353        else
1354        {
1355#ifndef NO_WPA_SUPPL
1356            if(OK != WpaCore_GetBssType(pCuCmd->hWpaCore, (U32*)&BssType)) return;
1357#endif
1358        }
1359
1360        CU_CMD_FIND_NAME_ARRAY(i, BSS_type, BssType);
1361        if(i == SIZE_ARR(BSS_type))
1362        {
1363            os_error_printf(CU_MSG_INFO2, (PS8)"Error getting the current BssType! BssType=0x%x\n",BssType);
1364            return;
1365        }
1366        else
1367        {
1368            os_error_printf(CU_MSG_INFO2, (PS8)"Current mode = %s\n", BSS_type[i].name);
1369        }
1370        print_available_values(BSS_type);
1371    }
1372    else
1373    {
1374        BssType = parm[0].value;
1375        /* check if the param is valid */
1376        CU_CMD_FIND_NAME_ARRAY(i, BSS_type, BssType);
1377        if(i == SIZE_ARR(BSS_type))
1378        {
1379            os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_ModifyBssType, BssType %d is not defined!\n", BssType);
1380            return;
1381        }
1382        if(pCuCmd->hWpaCore == NULL)
1383        {
1384            CuCommon_SetU8(pCuCmd->hCuCommon, CTRL_DATA_CURRENT_BSS_TYPE_PARAM, BssType);
1385        }
1386        else
1387        {
1388#ifndef NO_WPA_SUPPL
1389            WpaCore_SetBssType(pCuCmd->hWpaCore, BssType);
1390#endif
1391        }
1392    }
1393}
1394
1395VOID CuCmd_ModifyFragTh(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1396{
1397    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1398    S32 FragTh;
1399
1400    if( nParms == 0 )
1401    {
1402        if(OK != CuOs_GetFragTh(pCuCmd->hCuWext, &FragTh)) return;
1403        os_error_printf(CU_MSG_INFO2, (PS8)"Frag. threshold = %d\n", FragTh);
1404    }
1405    else
1406    {
1407        FragTh = parm[0].value;
1408        CuOs_SetFragTh(pCuCmd->hCuWext, FragTh);
1409    }
1410}
1411
1412VOID CuCmd_ModifyRtsTh(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1413{
1414    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1415    S32 RtsTh;
1416
1417    if( nParms == 0 )
1418    {
1419        if(OK != CuOs_GetRtsTh(pCuCmd->hCuWext, &RtsTh)) return;
1420        os_error_printf(CU_MSG_INFO2, (PS8)"RTS threshold = %d\n", RtsTh);
1421    }
1422    else
1423    {
1424        RtsTh = parm[0].value;
1425        CuOs_SetRtsTh(pCuCmd->hCuWext, RtsTh);
1426    }
1427}
1428
1429VOID CuCmd_ModifyPreamble(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1430{
1431    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1432    EPreamble Preamble;
1433    S32 i;
1434    named_value_t preamble_type[] = {
1435        { PREAMBLE_LONG,              (PS8)"PREAMBLE_LONG" },
1436        { PREAMBLE_SHORT,             (PS8)"PREAMBLE_SHORT" }
1437    };
1438
1439    if(nParms)
1440    {
1441        Preamble = parm[0].value;
1442        /* check if the param is valid */
1443        CU_CMD_FIND_NAME_ARRAY(i, preamble_type, Preamble);
1444        if(i == SIZE_ARR(preamble_type))
1445        {
1446            os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_ModifyPreamble, Preamble %d is not defined!\n", Preamble);
1447            return;
1448        }
1449        CuCommon_SetU32(pCuCmd->hCuCommon, TIWLN_802_11_SHORT_PREAMBLE_SET, Preamble);
1450    }
1451    else
1452    {
1453        S32 PreambleData;
1454        if(OK != CuCommon_GetU32(pCuCmd->hCuCommon, TIWLN_802_11_SHORT_PREAMBLE_GET, (PU32)&PreambleData)) return;
1455        Preamble = PreambleData;
1456        os_error_printf(CU_MSG_INFO2, (PS8)"Preamble = %d\n", Preamble);
1457        print_available_values(preamble_type);
1458    }
1459}
1460
1461VOID CuCmd_ModifyShortSlot(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1462{
1463    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1464    slotTime_e SlotTime;
1465    S32 i;
1466    named_value_t SlotTime_type[] = {
1467        { PHY_SLOT_TIME_LONG,              (PS8)"PHY_SLOT_TIME_LONG" },
1468        { PHY_SLOT_TIME_SHORT,             (PS8)"PHY_SLOT_TIME_SHORT" }
1469    };
1470
1471    if(nParms)
1472    {
1473        SlotTime = parm[0].value;
1474        /* check if the param is valid */
1475        CU_CMD_FIND_NAME_ARRAY(i, SlotTime_type, SlotTime);
1476        if(i == SIZE_ARR(SlotTime_type))
1477        {
1478            os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_ModifyShortSlot, SlotTime %d is not defined!\n", SlotTime);
1479            return;
1480        }
1481        CuCommon_SetU32(pCuCmd->hCuCommon, TIWLN_SHORT_SLOT_SET, SlotTime);
1482    }
1483    else
1484    {
1485        S32 SlotTimeData;
1486        if(OK != CuCommon_GetU32(pCuCmd->hCuCommon, TIWLN_SHORT_SLOT_GET, (PU32)&SlotTimeData)) return;
1487        SlotTime = SlotTimeData;
1488        os_error_printf(CU_MSG_INFO2, (PS8)"SlotTime = %d\n", SlotTime);
1489        print_available_values(SlotTime_type);
1490    }
1491}
1492
1493
1494VOID CuCmd_RadioOnOff(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1495{
1496	CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1497	U32      on_off;
1498
1499	if(nParms)
1500    {
1501		on_off = parm[0].value;
1502		CuCommon_SetU32(pCuCmd->hCuCommon, SME_RADIO_ON_PARAM, on_off);
1503	}
1504	else
1505    {
1506		if(OK != CuCommon_GetU32(pCuCmd->hCuCommon, SME_RADIO_ON_PARAM, &on_off)) {
1507			os_error_printf(CU_MSG_ERROR, (PS8)"CuCmd_RadioOnOff error, Cannot get radio state!\n");
1508			return;
1509	}
1510		os_error_printf(CU_MSG_ERROR, (PS8)"Radio state = %s\n", on_off ? "ON" : "OFF");
1511        os_error_printf(CU_MSG_ERROR, (PS8)"Turn radio on/off. 0=OFF, 1=ON\n");
1512	}
1513}
1514
1515
1516VOID CuCmd_GetSelectedBssidInfo(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1517{
1518    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1519    OS_802_11_SSID ssid;
1520    TMacAddr bssid;
1521
1522    if(OK != CuOs_Get_SSID(pCuCmd->hCuWext, &ssid)) return;
1523    if(OK != CuOs_Get_BSSID(pCuCmd->hCuWext, bssid)) return;
1524
1525    os_error_printf(CU_MSG_INFO2, (PS8)"Selected BSSID Info:\n");
1526    os_error_printf(CU_MSG_INFO2, (PS8)"--------------------\n");
1527    os_error_printf(CU_MSG_INFO2, (PS8)"SSID : %s\n",(ssid.SsidLength)?(PS8)PrintSSID(&ssid):(PS8)"<empty>");
1528    os_error_printf(CU_MSG_INFO2, (PS8)"BSSID : %02x.%02x.%02x.%02x.%02x.%02x\n",bssid[0],bssid[1],bssid[2],bssid[3],bssid[4],bssid[5]);
1529}
1530
1531VOID CuCmd_GetRsiiLevel(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1532{
1533    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1534    S8 dRssi, bRssi;
1535
1536    if(OK != CuCommon_GetRssi(pCuCmd->hCuCommon, &dRssi, &bRssi)) return;
1537	/* need the 0xffffff00 to get negative value display */
1538    os_error_printf(CU_MSG_INFO2, (PS8)"Current dataRSSI=%d  beaconRssi=%d\n", dRssi?dRssi|0xffffff00:dRssi, bRssi?bRssi|0xffffff00:bRssi);
1539}
1540
1541VOID CuCmd_GetSnrRatio(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1542{
1543    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1544    U32 dSnr, bSnr;
1545
1546    if(OK != CuCommon_GetSnr(pCuCmd->hCuCommon, &dSnr, &bSnr)) return;
1547    os_error_printf(CU_MSG_INFO2, (PS8)"Current dataSNR=%d   beaconSnr=%d\n", dSnr, bSnr);
1548}
1549
1550VOID CuCmd_ShowTxPowerLevel(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1551{
1552    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1553
1554    S32 txPowerLevel;
1555    if(OK != CuOs_GetTxPowerLevel(pCuCmd->hCuWext, &txPowerLevel)) return;
1556
1557    os_error_printf(CU_MSG_INFO2, (PS8)"Tx Power level = %d\n", txPowerLevel);
1558}
1559
1560VOID CuCmd_ShowTxPowerTable(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1561{
1562    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1563    TpowerLevelTable_t txPowerLevel;
1564    S32 i, res;
1565
1566    res = CuCommon_GetBuffer(pCuCmd->hCuCommon, REGULATORY_DOMAIN_TX_POWER_LEVEL_TABLE_PARAM, &txPowerLevel, sizeof(txPowerLevel));
1567
1568    if( !res )
1569    {
1570        os_error_printf(CU_MSG_INFO2, (PS8)"Power level table (Dbm/10)\n");
1571        for (i = 0; i < NUMBER_OF_SUB_BANDS_E; i++)
1572        {
1573            os_error_printf(CU_MSG_INFO2, (PS8)"sub-band %i: %d %d %d %d\n", i,
1574            txPowerLevel.uDbm[i][0],
1575            txPowerLevel.uDbm[i][1],
1576            txPowerLevel.uDbm[i][2],
1577            txPowerLevel.uDbm[i][3]);
1578        }
1579    }
1580    else
1581    {
1582        os_error_printf(CU_MSG_INFO2, (PS8)"Tx Power level table ERROR !!!\n");
1583    }
1584}
1585
1586VOID CuCmd_TxPowerDbm(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1587{
1588    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1589    U8 txPowerLevelDbm = (U8)parm[0].value;
1590
1591    if(nParms == 0)
1592    {
1593        if(OK != CuCommon_GetU8(pCuCmd->hCuCommon, TIWLN_802_11_TX_POWER_DBM_GET, (PU8)&txPowerLevelDbm)) return;
1594    }
1595    else
1596    {
1597        if (parm[0].value > MAX_TX_POWER)
1598        {
1599            os_error_printf(CU_MSG_INFO2, (PS8)"Please use values between %d and %d\n", MIN_TX_POWER, MAX_TX_POWER); return;
1600        }
1601        else
1602		{
1603			if(OK != CuCommon_SetU8(pCuCmd->hCuCommon, TIWLN_802_11_TX_POWER_DBM_GET, (U8)txPowerLevelDbm)) return;
1604		}
1605    }
1606
1607    os_error_printf(CU_MSG_INFO2, (PS8)"Tx Power in DBM = %d\n", txPowerLevelDbm);
1608}
1609
1610VOID CuCmd_ModifyState_802_11d(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1611{
1612    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1613    U32 Enabled_802_11d;
1614
1615    if(nParms == 0)
1616    {
1617        if(OK != CuCommon_GetU32(pCuCmd->hCuCommon, TIWLN_REG_DOMAIN_GET_802_11D, &Enabled_802_11d)) return;
1618        os_error_printf(CU_MSG_INFO2, (PS8)"802_11d enabled = %s\n", (Enabled_802_11d)?"TRUE":"FALSE");
1619    }
1620    else
1621    {
1622        Enabled_802_11d = parm[0].value;
1623        if(OK != CuCommon_SetU32(pCuCmd->hCuCommon, TIWLN_REG_DOMAIN_ENABLE_DISABLE_802_11D, Enabled_802_11d))
1624        {
1625            U32 Enabled_802_11h;
1626            if(OK != CuCommon_GetU32(pCuCmd->hCuCommon, TIWLN_REG_DOMAIN_GET_802_11H, &Enabled_802_11h)) return;
1627            if(Enabled_802_11h && (!Enabled_802_11d))
1628                os_error_printf(CU_MSG_INFO2, (PS8)"802_11d cannot be disabled while 802_11h is enabled!!\n" );
1629
1630        }
1631        else
1632        {
1633            os_error_printf(CU_MSG_INFO2, (PS8)"802_11d status is updated to = %s\n", (Enabled_802_11d)?"TRUE":"FALSE" );
1634        }
1635    }
1636}
1637
1638VOID CuCmd_ModifyState_802_11h(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1639{
1640    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1641    U32 Enabled_802_11h;
1642
1643    if(nParms == 0)
1644    {
1645        if(OK != CuCommon_GetU32(pCuCmd->hCuCommon, TIWLN_REG_DOMAIN_GET_802_11H, &Enabled_802_11h)) return;
1646        os_error_printf(CU_MSG_INFO2, (PS8)"802_11h enabled = %s\n", (Enabled_802_11h)?"TRUE":"FALSE");
1647    }
1648    else
1649    {
1650        Enabled_802_11h = parm[0].value;
1651        if(OK != CuCommon_SetU32(pCuCmd->hCuCommon, TIWLN_REG_DOMAIN_ENABLE_DISABLE_802_11H, Enabled_802_11h)) return;
1652        if(Enabled_802_11h)
1653            os_error_printf(CU_MSG_INFO2, (PS8)"802_11h enables automatically 802_11d!!\n" );
1654
1655        os_error_printf(CU_MSG_INFO2, (PS8)"802_11h status is updated to =%d\n", Enabled_802_11h );
1656    }
1657}
1658
1659VOID CuCmd_D_Country_2_4Ie(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1660{
1661    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1662
1663    if( nParms == 0 )
1664    {
1665        U8   CountryString[DOT11_COUNTRY_STRING_LEN+1];
1666        if(OK != CuCommon_GetSetBuffer(pCuCmd->hCuCommon, TIWLN_REG_DOMAIN_GET_COUNTRY_2_4,
1667            CountryString, DOT11_COUNTRY_STRING_LEN+1)) return;
1668        CountryString[DOT11_COUNTRY_STRING_LEN] = '\0';
1669        if (CountryString[0] == '\0')
1670        {
1671            os_error_printf(CU_MSG_INFO2, (PS8)"802_11d Country for 2.4 GHz is not found\n");
1672        }
1673        else
1674        {
1675            os_error_printf(CU_MSG_INFO2, (PS8)"802_11d Country for 2.4 GHz is %s \n", CountryString );
1676        }
1677    }
1678    else
1679    {
1680        country_t CountryWorld;
1681
1682        CountryWorld.elementId = COUNTRY_IE_ID;
1683        CountryWorld.len = 6;
1684        os_memcpy( (PVOID)CountryWorld.countryIE.CountryString,(PVOID)"GB ", 3);
1685        CountryWorld.countryIE.tripletChannels[0].firstChannelNumber = 1;
1686        CountryWorld.countryIE.tripletChannels[0].maxTxPowerLevel = 23;
1687        CountryWorld.countryIE.tripletChannels[0].numberOfChannels = 11;
1688
1689        if(OK != CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_REG_DOMAIN_SET_COUNTRY_2_4,
1690            &CountryWorld, sizeof(country_t))) return;
1691
1692        os_error_printf(CU_MSG_INFO2, (PS8)"802_11d Start Setting GB Country for 2.4 GHz\n");
1693    }
1694}
1695
1696
1697VOID CuCmd_D_Country_5Ie(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1698{
1699    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1700
1701    if( nParms == 0 )
1702    {
1703        U8   CountryString[DOT11_COUNTRY_STRING_LEN+1];
1704
1705        if(OK != CuCommon_GetSetBuffer(pCuCmd->hCuCommon, TIWLN_REG_DOMAIN_GET_COUNTRY_5,
1706            CountryString, DOT11_COUNTRY_STRING_LEN+1)) return;
1707
1708        CountryString[DOT11_COUNTRY_STRING_LEN] = '\0';
1709        if (CountryString[0] == '\0')
1710        {
1711            os_error_printf(CU_MSG_INFO2, (PS8)"802_11d Country for 5 GHz is not found\n");
1712        }
1713        else
1714        {
1715            os_error_printf(CU_MSG_INFO2, (PS8)"802_11d Country for 5 GHz is %s\n", CountryString );
1716        }
1717    }
1718    else
1719    {
1720        country_t CountryWorld;
1721
1722        CountryWorld.elementId = COUNTRY_IE_ID;
1723        CountryWorld.len = 6;
1724        os_memcpy((PVOID) CountryWorld.countryIE.CountryString,(PVOID)"US ", 3);
1725        CountryWorld.countryIE.tripletChannels[0].firstChannelNumber = 36;
1726        CountryWorld.countryIE.tripletChannels[0].maxTxPowerLevel = 13;
1727        CountryWorld.countryIE.tripletChannels[0].numberOfChannels = 8;
1728
1729        if(OK != CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_REG_DOMAIN_SET_COUNTRY_5,
1730            &CountryWorld, sizeof(country_t))) return;
1731
1732        os_error_printf(CU_MSG_INFO2, (PS8)"802_11d Start Setting US Country for 5 GHz\n");
1733    }
1734}
1735
1736VOID CuCmd_ModifyDfsRange(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1737{
1738    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1739    U16 minDFS_channelNum;
1740    U16 maxDFS_channelNum;
1741
1742    if( nParms == 0 )
1743    {
1744        if(OK != CuCommon_GetDfsChannels(pCuCmd->hCuCommon, &minDFS_channelNum, &maxDFS_channelNum)) return;
1745
1746        os_error_printf(CU_MSG_INFO2, (PS8)"DFS min channel is %d, DFS max channel is %d\n",
1747                                    minDFS_channelNum, maxDFS_channelNum);
1748    }
1749    else
1750    {
1751        minDFS_channelNum = (U16) parm[0].value;
1752        maxDFS_channelNum = (U16) parm[1].value;
1753
1754        if(OK != CuCommon_SetDfsChannels(pCuCmd->hCuCommon, minDFS_channelNum, maxDFS_channelNum)) return;
1755
1756        os_error_printf(CU_MSG_INFO2, (PS8)"Setting DFS min channel %d, DFS max channel %d\n",
1757                                    minDFS_channelNum, maxDFS_channelNum);
1758    }
1759}
1760
1761VOID CuCmd_SetBeaconFilterDesiredState(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1762{
1763    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1764
1765    if( nParms == 0 )
1766    {
1767        print_available_values(BeaconFilter_use);
1768    }
1769    else
1770    {
1771        CuCommon_SetU8(pCuCmd->hCuCommon, TIWLN_802_11_BEACON_FILTER_DESIRED_STATE_SET, (U8)parm[0].value);
1772    }
1773}
1774
1775VOID CuCmd_GetBeaconFilterDesiredState(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1776{
1777    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1778    U8 beaconFilterDesiredState = 0;
1779
1780    if(OK != CuCommon_GetU8(pCuCmd->hCuCommon, TIWLN_802_11_BEACON_FILTER_DESIRED_STATE_GET, &beaconFilterDesiredState)) return;
1781
1782    os_error_printf(CU_MSG_INFO2, (PS8)"Desired State is %s\n", (beaconFilterDesiredState == 0)?"FILTER INACTIVE":"FILTER ACTIVE" );
1783}
1784
1785VOID CuCmd_ModifySupportedRates(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1786{
1787    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1788    rates_t SupportedRates;
1789    S32 i;
1790
1791    if( nParms == 0 )
1792    {
1793        if(OK != CuCommon_GetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_SUPPORTED_RATES,
1794            &SupportedRates, sizeof(rates_t))) return;
1795
1796        os_error_printf(CU_MSG_INFO2, (PS8)" Rates: ");
1797        for( i=0; i < SupportedRates.len; i++ )
1798        {
1799            os_error_printf(CU_MSG_INFO2,
1800                            (PS8)"%g Mbps(%u%s)%s",
1801                            /* patch in order to support NET_RATE_MCS7 values that equal to NET_RATE_1M_BASIC */
1802                            (RATE_2_MBPS(SupportedRates.ratesString[i]) == 63.5) ? 65 : RATE_2_MBPS(SupportedRates.ratesString[i]),
1803                            /* patch in order to support NET_RATE_MCS7 values that equal to NET_RATE_1M_BASIC */
1804                            (SupportedRates.ratesString[i] == 0x7f) ? 0x83 : SupportedRates.ratesString[i],
1805                IS_BASIC_RATE(SupportedRates.ratesString[i]) ? " - basic" : "",
1806                (i < SupportedRates.len-1) ? "," : "" );
1807        }
1808        os_error_printf(CU_MSG_INFO2, (PS8)"\n");
1809    }
1810    else
1811    {
1812        PS8 buf = (PS8) parm[0].value;
1813        PS8 end_p;
1814        U32 val;
1815        U32 MaxVal = ((1 << (sizeof(SupportedRates.ratesString[i]) * 8))-1);
1816
1817        os_error_printf(CU_MSG_INFO2, (PS8)"param: %s\n", buf );
1818
1819        for( i=0; *buf && i < DOT11_MAX_SUPPORTED_RATES; i++ )
1820        {
1821            val = os_strtoul(buf, &end_p, 0);
1822            if(val == 0)
1823            {
1824                os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_ModifySupportedRates: invalid value - %s\n", buf );
1825                return;
1826            }
1827            if(val > MaxVal)
1828            {
1829                os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_ModifySupportedRates: out of range %d\n", val );
1830                return;
1831            }
1832            /* patch in order to support NET_RATE_MCS7 values that equal to NET_RATE_1M_BASIC */
1833            if (val == 0x83)
1834            {
1835                val = 0x7f;
1836            }
1837            SupportedRates.ratesString[i] = (U8)(val);
1838            buf = end_p;
1839            while( *buf==' ' || *buf == ',' )   buf++;
1840        }
1841        if(*buf)
1842        {
1843            os_error_printf(CU_MSG_INFO2, (PS8)"too many parameters. Max=%d\n", DOT11_MAX_SUPPORTED_RATES );
1844            return;
1845        }
1846
1847        SupportedRates.len = (U8) i;
1848        CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_SUPPORTED_RATES,
1849            &SupportedRates, sizeof(rates_t));
1850    }
1851}
1852
1853VOID CuCmd_SendHealthCheck(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1854{
1855    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1856
1857    if (OK != CuCommon_SetU32(pCuCmd->hCuCommon, HEALTH_MONITOR_CHECK_DEVICE, TRUE)) return;
1858
1859    os_error_printf(CU_MSG_INFO2, (PS8)"Send health check...\n");
1860}
1861
1862VOID CuCmd_EnableRxDataFilters(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1863{
1864    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1865
1866    if (OK != CuCommon_SetU32(pCuCmd->hCuCommon, TIWLN_ENABLE_DISABLE_RX_DATA_FILTERS, TRUE)) return;
1867
1868    os_error_printf(CU_MSG_INFO2, (PS8)"Enabling Rx data filtering...\n");
1869}
1870
1871VOID CuCmd_DisableRxDataFilters(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1872{
1873    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1874
1875    if (OK != CuCommon_SetU32(pCuCmd->hCuCommon, TIWLN_ENABLE_DISABLE_RX_DATA_FILTERS, FALSE)) return;
1876
1877    os_error_printf(CU_MSG_INFO2, (PS8)"Disabling Rx data filtering...\n");
1878}
1879
1880VOID CuCmd_AddRxDataFilter(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1881{
1882    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1883    S32 res;
1884    TRxDataFilterRequest request;
1885    PS8 mask = (PS8) parm[1].value;
1886    PS8 pattern = (PS8) parm[2].value;
1887
1888    request.offset = (U8)parm[0].value;
1889    CuCmd_ParseMaskString(mask, request.mask, &request.maskLength);
1890    CuCmd_ParsePatternString(pattern, request.pattern, &request.patternLength);
1891
1892    res = CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_ADD_RX_DATA_FILTER,
1893        &request, sizeof(TRxDataFilterRequest));
1894
1895    if(res == OK)
1896        os_error_printf(CU_MSG_INFO2, (PS8)"Filter added.\n");
1897    else
1898        os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - CuCmd_AddRxDataFilter - Couldn't add Rx data filter...\n");
1899
1900}
1901
1902VOID CuCmd_RemoveRxDataFilter(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1903{
1904    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1905    S32 res;
1906    TRxDataFilterRequest request;
1907    PS8 mask = (PS8) parm[1].value;
1908    PS8 pattern = (PS8) parm[2].value;
1909
1910    request.offset = (U8)parm[0].value;
1911    CuCmd_ParseMaskString(mask, request.mask, &request.maskLength);
1912    CuCmd_ParsePatternString(pattern, request.pattern, &request.patternLength);
1913
1914    res = CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_REMOVE_RX_DATA_FILTER,
1915        &request, sizeof(TRxDataFilterRequest));
1916
1917    if(res == OK)
1918        os_error_printf(CU_MSG_INFO2, (PS8)"Filter Removed.\n");
1919    else
1920        os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - CuCmd_AddRxDataFilter - Couldn't remove Rx data filter...\n");
1921}
1922
1923VOID CuCmd_GetRxDataFiltersStatistics(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1924{
1925    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1926    U32 UnmatchedPacketsCount;
1927    U32 MatchedPacketsCount[4];
1928
1929    if (OK != CuCommon_GetRxDataFiltersStatistics(pCuCmd->hCuCommon, &UnmatchedPacketsCount, MatchedPacketsCount)) return;
1930
1931    os_error_printf(CU_MSG_INFO2, (PS8)"Rx data filtering statistics:\n");
1932    os_error_printf(CU_MSG_INFO2, (PS8)"Unmatched packets: %u\n", UnmatchedPacketsCount);
1933    os_error_printf(CU_MSG_INFO2, (PS8)"Packets matching filter #1: %u\n", MatchedPacketsCount[0]);
1934    os_error_printf(CU_MSG_INFO2, (PS8)"Packets matching filter #2: %u\n", MatchedPacketsCount[1]);
1935    os_error_printf(CU_MSG_INFO2, (PS8)"Packets matching filter #3: %u\n", MatchedPacketsCount[2]);
1936    os_error_printf(CU_MSG_INFO2, (PS8)"Packets matching filter #4: %u\n", MatchedPacketsCount[3]);
1937}
1938
1939VOID CuCmd_ShowStatistics(THandle hCuCmd, ConParm_t parm[], U16 nParms)
1940{
1941    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
1942
1943    U32 powerMode;
1944    TMacAddr Mac;
1945    OS_802_11_SSID ssid;
1946    U8 desiredChannel;
1947    S32 rtsTh;
1948    S32 fragTh;
1949    S32 txPowerLevel;
1950    U8 bssType;
1951    U32 desiredPreambleType;
1952    TIWLN_COUNTERS driverCounters;
1953    U32 AuthMode;
1954    U8  CurrentTxRate;
1955    S8  CurrentTxRateStr[20];
1956    U8  CurrentRxRate;
1957    S8  CurrentRxRateStr[20];
1958    U32 DefaultKeyId;
1959    U32 WepStatus;
1960    S8 dRssi, bRssi;
1961#ifdef XCC_MODULE_INCLUDED
1962    U32 XCCNetEap;
1963#endif
1964
1965    if(OK != CuCommon_GetBuffer(pCuCmd->hCuCommon, CTRL_DATA_MAC_ADDRESS,
1966            Mac, sizeof(TMacAddr))) return;
1967    if(OK != CuCommon_GetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_POWER_MODE_GET, &powerMode, sizeof(U32))) return;
1968    if(OK != CuOs_Get_SSID(pCuCmd->hCuWext, &ssid)) return;
1969    if(OK != CuCommon_GetU8(pCuCmd->hCuCommon, SITE_MGR_DESIRED_CHANNEL_PARAM, &desiredChannel)) return;
1970    if(OK != CuOs_GetRtsTh(pCuCmd->hCuWext, &rtsTh)) return;
1971    if(OK != CuOs_GetFragTh(pCuCmd->hCuWext, &fragTh)) return;
1972    if(OK != CuOs_GetTxPowerLevel(pCuCmd->hCuWext, &txPowerLevel)) return;
1973    if(OK != CuCommon_GetU8(pCuCmd->hCuCommon, CTRL_DATA_CURRENT_BSS_TYPE_PARAM, &bssType)) return;
1974    if(OK != CuCommon_GetU32(pCuCmd->hCuCommon, TIWLN_802_11_SHORT_PREAMBLE_GET, &desiredPreambleType)) return;
1975    if(OK != CuCommon_GetBuffer(pCuCmd->hCuCommon, SITE_MGR_TI_WLAN_COUNTERS_PARAM, &driverCounters, sizeof(TIWLN_COUNTERS))) return;
1976    if(OK != CuCommon_GetU32(pCuCmd->hCuCommon, RSN_ENCRYPTION_STATUS_PARAM, &WepStatus)) return;
1977    if(OK != CuCommon_GetRssi(pCuCmd->hCuCommon, &dRssi, &bRssi)) return;
1978    if (pCuCmd->hWpaCore == NULL)
1979    {
1980        if(OK != CuCommon_GetU32(pCuCmd->hCuCommon, RSN_EXT_AUTHENTICATION_MODE, &AuthMode)) return;
1981        if(OK != CuCommon_GetU32(pCuCmd->hCuCommon, RSN_DEFAULT_KEY_ID, &DefaultKeyId)) return;
1982    }
1983    else
1984    {
1985#ifndef NO_WPA_SUPPL
1986        if(OK != WpaCore_GetAuthMode(pCuCmd->hWpaCore, &AuthMode)) return;
1987        if(OK != WpaCore_GetDefaultKey(pCuCmd->hWpaCore, &DefaultKeyId)) return;
1988#endif
1989    }
1990
1991    if(OK != CuCommon_GetU8(pCuCmd->hCuCommon, TIWLN_802_11_CURRENT_RATES_GET, &CurrentTxRate)) return;
1992    CuCmd_CreateRateStr(CurrentTxRateStr, CurrentTxRate);
1993
1994    if(OK != CuCommon_GetU8(pCuCmd->hCuCommon, TIWLN_GET_RX_DATA_RATE, &CurrentRxRate)) return;
1995    CuCmd_CreateRateStr(CurrentRxRateStr, CurrentRxRate);
1996
1997#ifdef XCC_MODULE_INCLUDED
1998    if(OK != CuCommon_GetU32(pCuCmd->hCuCommon, RSN_XCC_NETWORK_EAP, &XCCNetEap)) return;
1999#endif
2000
2001    os_error_printf(CU_MSG_INFO2, (PS8)"******************\n");
2002    os_error_printf(CU_MSG_INFO2, (PS8)"Driver Statistics:\n");
2003    os_error_printf(CU_MSG_INFO2, (PS8)"******************\n");
2004
2005    os_error_printf(CU_MSG_INFO2, (PS8)"    dot11CurrentTxRate : %s\n", CurrentTxRateStr);
2006	os_error_printf(CU_MSG_INFO2, (PS8)"         CurrentRxRate : %s\n", CurrentRxRateStr);
2007    os_error_printf(CU_MSG_INFO2, (PS8)"   dot11DesiredChannel : %d\n", desiredChannel);
2008    os_error_printf(CU_MSG_INFO2, (PS8)"     currentMACAddress : %02x.%02x.%02x.%02x.%02x.%02x\n",Mac[0],Mac[1],Mac[2],Mac[3],Mac[4],Mac[5]);
2009    os_error_printf(CU_MSG_INFO2, (PS8)"      dot11DesiredSSID : %s\n", ssid.Ssid);
2010    os_error_printf(CU_MSG_INFO2, (PS8)"          dot11BSSType : %d\n", bssType);
2011    os_error_printf(CU_MSG_INFO2, (PS8)"    AuthenticationMode : %d\n", AuthMode );
2012    os_error_printf(CU_MSG_INFO2, (PS8)"    bShortPreambleUsed : %d\n", desiredPreambleType );
2013    os_error_printf(CU_MSG_INFO2, (PS8)"          RTSThreshold : %d\n", rtsTh );
2014    os_error_printf(CU_MSG_INFO2, (PS8)"FragmentationThreshold : %d\n", fragTh );
2015    os_error_printf(CU_MSG_INFO2, (PS8)" bDefaultWEPKeyDefined : %d\n", DefaultKeyId);
2016    os_error_printf(CU_MSG_INFO2, (PS8)"             WEPStatus : %d\n", WepStatus);
2017    os_error_printf(CU_MSG_INFO2, (PS8)"          TxPowerLevel : %d\n", txPowerLevel );
2018    os_error_printf(CU_MSG_INFO2, (PS8)"             PowerMode : %d\n", powerMode );
2019    os_error_printf(CU_MSG_INFO2, (PS8)"              dataRssi : %d\n", dRssi);
2020	os_error_printf(CU_MSG_INFO2, (PS8)"            beaconRssi : %d\n", bRssi);
2021    /**/
2022    /* network layer statistics*/
2023    /**/
2024    os_error_printf(CU_MSG_INFO2, (PS8)"                RecvOk : %d\n", driverCounters.RecvOk );
2025    os_error_printf(CU_MSG_INFO2, (PS8)"             RecvError : %d\n", driverCounters.RecvError );
2026    os_error_printf(CU_MSG_INFO2, (PS8)"     DirectedBytesRecv : %d\n", driverCounters.DirectedBytesRecv );
2027    os_error_printf(CU_MSG_INFO2, (PS8)"    DirectedFramesRecv : %d\n", driverCounters.DirectedFramesRecv );
2028    os_error_printf(CU_MSG_INFO2, (PS8)"    MulticastBytesRecv : %d\n", driverCounters.MulticastBytesRecv );
2029    os_error_printf(CU_MSG_INFO2, (PS8)"   MulticastFramesRecv : %d\n", driverCounters.MulticastFramesRecv );
2030    os_error_printf(CU_MSG_INFO2, (PS8)"    BroadcastBytesRecv : %d\n", driverCounters.BroadcastBytesRecv );
2031    os_error_printf(CU_MSG_INFO2, (PS8)"   BroadcastFramesRecv : %d\n", driverCounters.BroadcastFramesRecv );
2032    os_error_printf(CU_MSG_INFO2, (PS8)"             FcsErrors : %d\n", driverCounters.FcsErrors );
2033    os_error_printf(CU_MSG_INFO2, (PS8)"           BeaconsRecv : %d\n", driverCounters.BeaconsRecv );
2034    os_error_printf(CU_MSG_INFO2, (PS8)"          AssocRejects : %d\n", driverCounters.AssocRejects );
2035    os_error_printf(CU_MSG_INFO2, (PS8)"         AssocTimeouts : %d\n", driverCounters.AssocTimeouts );
2036    os_error_printf(CU_MSG_INFO2, (PS8)"           AuthRejects : %d\n", driverCounters.AuthRejects );
2037    os_error_printf(CU_MSG_INFO2, (PS8)"          AuthTimeouts : %d\n", driverCounters.AuthTimeouts );
2038
2039    /**/
2040    /* other statistics*/
2041    /**/
2042#ifdef XCC_MODULE_INCLUDED
2043    os_error_printf(CU_MSG_INFO2, (PS8)"        dwSecuritySuit : %d\n", XCCNetEap);
2044#endif
2045}
2046
2047VOID CuCmd_ShowTxStatistics(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2048{
2049    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2050    TIWLN_TX_STATISTICS txCounters;
2051    U32 TxQid;
2052    U32 AverageDelay;
2053    U32 AverageFWDelay;
2054    U32 AverageMacDelay;
2055
2056    if( nParms == 0 )
2057    {
2058        if(OK != CuCommon_GetTxStatistics(pCuCmd->hCuCommon, &txCounters, 0)) return;
2059    }
2060    else
2061    {
2062        if(OK != CuCommon_GetTxStatistics(pCuCmd->hCuCommon, &txCounters, parm[0].value)) return;
2063    }
2064
2065    os_error_printf(CU_MSG_INFO2, (PS8)"*********************\n");
2066    os_error_printf(CU_MSG_INFO2, (PS8)"Tx Queues Statistics:\n");
2067    os_error_printf(CU_MSG_INFO2, (PS8)"*********************\n");
2068
2069    for (TxQid = 0; TxQid < MAX_NUM_OF_AC; TxQid++)
2070    {
2071        os_error_printf(CU_MSG_INFO2, (PS8)"\nTx Queue %d:\n", TxQid);
2072        os_error_printf(CU_MSG_INFO2, (PS8)"===========\n");
2073
2074        os_error_printf(CU_MSG_INFO2, (PS8)"  Total Good Frames             : %d\n", txCounters.txCounters[TxQid].XmitOk );
2075        os_error_printf(CU_MSG_INFO2, (PS8)"  Unicast Bytes                 : %d\n", txCounters.txCounters[TxQid].DirectedBytesXmit );
2076        os_error_printf(CU_MSG_INFO2, (PS8)"  Unicast Frames                : %d\n", txCounters.txCounters[TxQid].DirectedFramesXmit );
2077        os_error_printf(CU_MSG_INFO2, (PS8)"  Multicast Bytes               : %d\n", txCounters.txCounters[TxQid].MulticastBytesXmit );
2078        os_error_printf(CU_MSG_INFO2, (PS8)"  Multicast Frames              : %d\n", txCounters.txCounters[TxQid].MulticastFramesXmit );
2079        os_error_printf(CU_MSG_INFO2, (PS8)"  Broadcast Bytes               : %d\n", txCounters.txCounters[TxQid].BroadcastBytesXmit );
2080        os_error_printf(CU_MSG_INFO2, (PS8)"  Broadcast Frames              : %d\n", txCounters.txCounters[TxQid].BroadcastFramesXmit );
2081        os_error_printf(CU_MSG_INFO2, (PS8)"  Retry Failures                : %d\n", txCounters.txCounters[TxQid].RetryFailCounter );
2082        os_error_printf(CU_MSG_INFO2, (PS8)"  Tx Timeout Failures           : %d\n", txCounters.txCounters[TxQid].TxTimeoutCounter );
2083        os_error_printf(CU_MSG_INFO2, (PS8)"  No Link Failures              : %d\n", txCounters.txCounters[TxQid].NoLinkCounter );
2084        os_error_printf(CU_MSG_INFO2, (PS8)"  Other Failures                : %d\n", txCounters.txCounters[TxQid].OtherFailCounter );
2085        os_error_printf(CU_MSG_INFO2, (PS8)"  Max Consecutive Retry Failures : %d\n\n", txCounters.txCounters[TxQid].MaxConsecutiveRetryFail );
2086
2087        os_error_printf(CU_MSG_INFO2, (PS8)"  Retry histogram:\n");
2088        os_error_printf(CU_MSG_INFO2, (PS8)"  ----------------\n\n");
2089        os_error_printf(CU_MSG_INFO2, (PS8)"  Retries: %8d %8d %8d %8d %8d %8d %8d %8d\n", 0, 1, 2, 3, 4, 5, 6, 7);
2090        os_error_printf(CU_MSG_INFO2, (PS8)"  packets: %8d %8d %8d %8d %8d %8d %8d %8d\n\n",
2091                                txCounters.txCounters[TxQid].RetryHistogram[ 0 ],
2092                                txCounters.txCounters[TxQid].RetryHistogram[ 1 ],
2093                                txCounters.txCounters[TxQid].RetryHistogram[ 2 ],
2094                                txCounters.txCounters[TxQid].RetryHistogram[ 3 ],
2095                                txCounters.txCounters[TxQid].RetryHistogram[ 4 ],
2096                                txCounters.txCounters[TxQid].RetryHistogram[ 5 ],
2097                                txCounters.txCounters[TxQid].RetryHistogram[ 6 ],
2098                                txCounters.txCounters[TxQid].RetryHistogram[ 7 ]);
2099        os_error_printf(CU_MSG_INFO2, (PS8)"  Retries: %8d %8d %8d %8d %8d %8d %8d %8d\n", 8, 9, 10, 11, 12, 13, 14, 15);
2100        os_error_printf(CU_MSG_INFO2, (PS8)"  packets: %8d %8d %8d %8d %8d %8d %8d %8d\n\n",
2101                                txCounters.txCounters[TxQid].RetryHistogram[ 8 ],
2102                                txCounters.txCounters[TxQid].RetryHistogram[ 9 ],
2103                                txCounters.txCounters[TxQid].RetryHistogram[ 10 ],
2104                                txCounters.txCounters[TxQid].RetryHistogram[ 11 ],
2105                                txCounters.txCounters[TxQid].RetryHistogram[ 12 ],
2106                                txCounters.txCounters[TxQid].RetryHistogram[ 13 ],
2107                                txCounters.txCounters[TxQid].RetryHistogram[ 14 ],
2108                                txCounters.txCounters[TxQid].RetryHistogram[ 15 ]);
2109
2110        if (txCounters.txCounters[TxQid].NumPackets)
2111        {
2112            AverageDelay = txCounters.txCounters[TxQid].SumTotalDelayMs / txCounters.txCounters[TxQid].NumPackets;
2113            AverageFWDelay = txCounters.txCounters[TxQid].SumFWDelayUs / txCounters.txCounters[TxQid].NumPackets;
2114            AverageMacDelay = txCounters.txCounters[TxQid].SumMacDelayUs / txCounters.txCounters[TxQid].NumPackets;
2115        }
2116        else
2117        {
2118            AverageDelay = 0;
2119            AverageFWDelay = 0;
2120            AverageMacDelay = 0;
2121        }
2122
2123        os_error_printf(CU_MSG_INFO2, (PS8)"  Total Delay ms (average/sum) : %d / %d\n", AverageDelay, txCounters.txCounters[TxQid].SumTotalDelayMs);
2124        os_error_printf(CU_MSG_INFO2, (PS8)"  FW Delay us (average/sum) : %d / %d\n", AverageFWDelay, txCounters.txCounters[TxQid].SumFWDelayUs);
2125        os_error_printf(CU_MSG_INFO2, (PS8)"  MAC Delay us (average/sum)   : %d / %d\n\n", AverageMacDelay, txCounters.txCounters[TxQid].SumMacDelayUs);
2126
2127        os_error_printf(CU_MSG_INFO2, (PS8)"  Delay Ranges [msec]  : Num of packets\n");
2128        os_error_printf(CU_MSG_INFO2, (PS8)"  -------------------  : --------------\n");
2129        os_error_printf(CU_MSG_INFO2, (PS8)"        0   -    1     : %d\n", txCounters.txCounters[TxQid].txDelayHistogram[TX_DELAY_RANGE_0_TO_1] );
2130        os_error_printf(CU_MSG_INFO2, (PS8)"        1   -   10     : %d\n", txCounters.txCounters[TxQid].txDelayHistogram[TX_DELAY_RANGE_1_TO_10] );
2131        os_error_printf(CU_MSG_INFO2, (PS8)"       10   -   20     : %d\n", txCounters.txCounters[TxQid].txDelayHistogram[TX_DELAY_RANGE_10_TO_20] );
2132        os_error_printf(CU_MSG_INFO2, (PS8)"       20   -   40     : %d\n", txCounters.txCounters[TxQid].txDelayHistogram[TX_DELAY_RANGE_20_TO_40] );
2133        os_error_printf(CU_MSG_INFO2, (PS8)"       40   -   60     : %d\n", txCounters.txCounters[TxQid].txDelayHistogram[TX_DELAY_RANGE_40_TO_60] );
2134        os_error_printf(CU_MSG_INFO2, (PS8)"       60   -   80     : %d\n", txCounters.txCounters[TxQid].txDelayHistogram[TX_DELAY_RANGE_60_TO_80] );
2135        os_error_printf(CU_MSG_INFO2, (PS8)"       80   -  100     : %d\n", txCounters.txCounters[TxQid].txDelayHistogram[TX_DELAY_RANGE_80_TO_100] );
2136        os_error_printf(CU_MSG_INFO2, (PS8)"      100   -  200     : %d\n", txCounters.txCounters[TxQid].txDelayHistogram[TX_DELAY_RANGE_100_TO_200] );
2137        os_error_printf(CU_MSG_INFO2, (PS8)"        Above 200      : %d\n", txCounters.txCounters[TxQid].txDelayHistogram[TX_DELAY_RANGE_ABOVE_200] );
2138    }
2139}
2140
2141VOID CuCmd_ShowAdvancedParams(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2142{
2143    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2144
2145    U32 AuthMode;
2146    TPowerMgr_PowerMode Mode;
2147    S32 txPowerLevel;
2148#ifndef NO_WPA_SUPPL
2149    OS_802_11_ENCRYPTION_TYPES EncryptionTypePairwise;
2150    OS_802_11_ENCRYPTION_TYPES EncryptionTypeGroup;
2151#endif
2152    S32 Preamble;
2153    S32 FragTh;
2154    S32 RtsTh;
2155
2156    if (pCuCmd->hWpaCore == NULL)
2157    {
2158        if(OK != CuCommon_GetU32(pCuCmd->hCuCommon, RSN_EXT_AUTHENTICATION_MODE, &AuthMode)) return;
2159    }
2160    else
2161    {
2162#ifndef NO_WPA_SUPPL
2163        if(OK != WpaCore_GetAuthMode(pCuCmd->hWpaCore, &AuthMode)) return;
2164#endif
2165    }
2166    if(OK != CuCommon_GetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_POWER_MODE_GET, &Mode, sizeof(TPowerMgr_PowerMode))) return;
2167    if(OK != CuOs_GetTxPowerLevel(pCuCmd->hCuWext, &txPowerLevel)) return;
2168#ifndef NO_WPA_SUPPL
2169    if(OK != WpaCore_GetEncryptionPairWise(pCuCmd->hWpaCore, &EncryptionTypePairwise)) return;
2170    if(OK != WpaCore_GetEncryptionGroup(pCuCmd->hWpaCore, &EncryptionTypeGroup)) return;
2171#endif
2172    if(OK != CuCommon_GetU32(pCuCmd->hCuCommon, TIWLN_802_11_SHORT_PREAMBLE_GET, (PU32)&Preamble)) return;
2173    if(OK != CuOs_GetFragTh(pCuCmd->hCuWext, &FragTh)) return;
2174    if(OK != CuOs_GetRtsTh(pCuCmd->hCuWext, &RtsTh)) return;
2175
2176
2177    os_error_printf(CU_MSG_INFO2, (PS8)"********************\n");
2178    os_error_printf(CU_MSG_INFO2, (PS8)"Advanced Statistics:\n");
2179    os_error_printf(CU_MSG_INFO2, (PS8)"********************\n");
2180
2181    os_error_printf(CU_MSG_INFO2, (PS8)"  Authentication : %u\n", AuthMode );
2182    os_error_printf(CU_MSG_INFO2, (PS8)"  Power mode : %d\n", Mode.PowerMode );
2183    os_error_printf(CU_MSG_INFO2, (PS8)"  Tx Power level : %d\n", txPowerLevel );
2184#ifndef NO_WPA_SUPPL
2185    os_error_printf(CU_MSG_INFO2, (PS8)"  Encryption Pairwise: %u\n", EncryptionTypePairwise );
2186    os_error_printf(CU_MSG_INFO2, (PS8)"  Encryption Group: %u\n", EncryptionTypeGroup );
2187#endif
2188    os_error_printf(CU_MSG_INFO2, (PS8)"  Preamble : <%s>\n", (Preamble) ? "short" : "long");
2189    os_error_printf(CU_MSG_INFO2, (PS8)"  Frag. threshold : %u\n", FragTh);
2190    os_error_printf(CU_MSG_INFO2, (PS8)"  RTS threshold : %u\n", RtsTh );
2191    os_error_printf(CU_MSG_INFO2, (PS8)"  Power mode: ");
2192    print_available_values(power_mode_val);
2193    os_error_printf(CU_MSG_INFO2, (PS8)"  Encryption type: ");
2194    print_available_values(encrypt_type);
2195
2196}
2197
2198
2199VOID Cucmd_ShowPowerConsumptionStats(THandle hCuCmd,ConParm_t parm[],U16 nParms)
2200{
2201    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2202    ACXPowerConsumptionTimeStat_t tStatistics;
2203
2204    os_memset( &tStatistics, 0, sizeof(ACXPowerConsumptionTimeStat_t) );
2205
2206     if (OK != CuCommon_GetPowerConsumptionStat(pCuCmd->hCuCommon,&tStatistics))
2207     {
2208        os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - Failed to read power consumption statistic!\n");
2209        return;
2210     }
2211
2212
2213
2214    os_error_printf(CU_MSG_INFO2, (PS8)"\nPower Consumption Statistics:\n");
2215    os_error_printf(CU_MSG_INFO2, (PS8)"-----------------------------\n");
2216    os_error_printf(CU_MSG_INFO2, (PS8)"activeTimeCnt:0x%x%x\n", tStatistics.awakeTimeCnt_Hi,tStatistics.awakeTimeCnt_Low );
2217    os_error_printf(CU_MSG_INFO2, (PS8)"elpTimeCnt: 0x%x%x\n", tStatistics.elpTimeCnt_Hi,tStatistics.elpTimeCnt_Low);
2218    os_error_printf(CU_MSG_INFO2, (PS8)"powerDownTimeCnt: 0x%x%x\n", tStatistics.powerDownTimeCnt_Hi,tStatistics.powerDownTimeCnt_Low);
2219    os_error_printf(CU_MSG_INFO2, (PS8)"ListenMode11BTimeCnt: 0x%x%x\n", tStatistics.ListenMode11BTimeCnt_Hi,tStatistics.ListenMode11BTimeCnt_Low);
2220    os_error_printf(CU_MSG_INFO2, (PS8)"ListenModeOFDMTimeCnt: 0x%x%x\n", tStatistics.ListenModeOFDMTimeCnt_Hi,tStatistics.ListenModeOFDMTimeCnt_Low);
2221
2222}
2223
2224
2225
2226VOID CuCmd_ScanAppGlobalConfig(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2227{
2228    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2229
2230    if ( 0 == os_strcmp( (PS8)"<empty>", (PS8)parm[0].value) )
2231    {
2232        pCuCmd->appScanParams.desiredSsid.len = 0;
2233        pCuCmd->appScanParams.desiredSsid.str[ 0 ] = '\0';
2234    }
2235    else
2236    {
2237        pCuCmd->appScanParams.desiredSsid.len = (U8) os_strlen((PS8)parm[0].value);
2238        os_memcpy( (PVOID)&(pCuCmd->appScanParams.desiredSsid.str), (PVOID)parm[0].value, pCuCmd->appScanParams.desiredSsid.len );
2239        if(pCuCmd->appScanParams.desiredSsid.len < MAX_SSID_LEN)
2240        {
2241            pCuCmd->appScanParams.desiredSsid.str[pCuCmd->appScanParams.desiredSsid.len] = 0;
2242        }
2243    }
2244    pCuCmd->appScanParams.scanType = parm[1].value;
2245    pCuCmd->appScanParams.band = parm[2].value;
2246    pCuCmd->appScanParams.probeReqNumber = (U8)parm[3].value;
2247    pCuCmd->appScanParams.probeRequestRate = parm[4].value;
2248#ifdef TI_DBG
2249    pCuCmd->appScanParams.Tid = (U8)parm[5].value;
2250    pCuCmd->appScanParams.numOfChannels  = (U8)parm[6].value;
2251#else
2252    pCuCmd->appScanParams.Tid = 0;
2253    pCuCmd->appScanParams.numOfChannels = (U8)parm[5].value;
2254#endif
2255}
2256
2257VOID CuCmd_ScanAppChannelConfig(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2258{
2259    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2260
2261    scan_normalChannelEntry_t* pChannelEntry =
2262        &(pCuCmd->appScanParams.channelEntry[ parm[0].value ].normalChannelEntry);
2263
2264    if (parm[2].value < parm[3].value)
2265    {
2266        os_error_printf(CU_MSG_INFO2, (PS8)"Max Dwell Time must be larger than or equal to Min Dwell Time...\n");
2267        return;
2268    }
2269
2270    CuCmd_Str2MACAddr ((PS8)parm[1].value, pChannelEntry->bssId);
2271    pChannelEntry->maxChannelDwellTime = parm[2].value;
2272    pChannelEntry->minChannelDwellTime = parm[3].value;
2273    pChannelEntry->earlyTerminationEvent = parm[4].value;
2274    pChannelEntry->ETMaxNumOfAPframes = (U8)parm[5].value;
2275    pChannelEntry->txPowerDbm = (U8)parm[6].value;
2276    pChannelEntry->channel = (U8)parm[7].value;
2277}
2278
2279VOID CuCmd_ScanAppClear(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2280{
2281    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2282    os_memset( &pCuCmd->appScanParams, 0, sizeof(scan_Params_t) );
2283    os_error_printf(CU_MSG_INFO2, (PS8)"Application scan parameters cleared.\n");
2284}
2285
2286VOID CuCmd_ScanAppDisplay(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2287{
2288    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2289    S32 i,j;
2290    scan_normalChannelEntry_t* pNormalChannel;
2291
2292    CU_CMD_FIND_NAME_ARRAY(j, rate2Str, pCuCmd->appScanParams.probeRequestRate);
2293    os_error_printf(CU_MSG_INFO2, (PS8)"Application Scan params:\n");
2294    os_error_printf(CU_MSG_INFO2, (PS8)"SSID: %s, Type: %s\n",
2295        pCuCmd->appScanParams.desiredSsid.str,
2296        scanType2Str[ pCuCmd->appScanParams.scanType ].name);
2297    os_error_printf(CU_MSG_INFO2, (PS8)"Band: %s, Number of probe req:%d, probe req. rate:%s\n",
2298        band2Str[ pCuCmd->appScanParams.band ].name,
2299        pCuCmd->appScanParams.probeReqNumber,
2300        rate2Str[j].name);
2301#ifdef TI_DBG
2302    os_error_printf(CU_MSG_INFO2, (PS8)"Tid :%d\n\n", pCuCmd->appScanParams.Tid);
2303#else
2304    os_error_printf(CU_MSG_INFO2, (PS8)"\n");
2305#endif
2306    os_error_printf(CU_MSG_INFO2, (PS8)"Channel  BSS ID             Max time  Min time  ET event     ET frame num Power\n");
2307    os_error_printf(CU_MSG_INFO2, (PS8)"-------------------------------------------------------------------------------\n");
2308    for ( i = 0; i < pCuCmd->appScanParams.numOfChannels; i++ )
2309    {
2310        pNormalChannel = &(pCuCmd->appScanParams.channelEntry[ i ].normalChannelEntry);
2311        CU_CMD_FIND_NAME_ARRAY(j, EtEvent2Str, pNormalChannel->earlyTerminationEvent);
2312        os_error_printf(CU_MSG_INFO2, (PS8)"%2d       %02x.%02x.%02x.%02x.%02x.%02x  %7d   %7d   %s%3d          %1d\n",
2313               pNormalChannel->channel,
2314               pNormalChannel->bssId[0],pNormalChannel->bssId[1],pNormalChannel->bssId[2],pNormalChannel->bssId[3],pNormalChannel->bssId[4],pNormalChannel->bssId[5],
2315               pNormalChannel->maxChannelDwellTime,
2316               pNormalChannel->minChannelDwellTime,
2317               EtEvent2Str[j].name,
2318               pNormalChannel->ETMaxNumOfAPframes,
2319               pNormalChannel->txPowerDbm);
2320    }
2321    os_error_printf(CU_MSG_INFO2, (PS8)"\n");
2322}
2323
2324VOID CuCmd_StartScan(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2325{
2326    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2327
2328    if(OK != CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_START_APP_SCAN_SET,
2329        &pCuCmd->appScanParams, sizeof(scan_Params_t)))
2330    {
2331        return;
2332    }
2333
2334    os_error_printf(CU_MSG_INFO2, (PS8)"Application scan started\n");
2335
2336    /*
2337	 * In order to have ability to set the application scan we are using application scan priver command
2338	 * exsample for using supplicant scan command below:
2339	 * #ifndef NO_WPA_SUPPL
2340     *       CuOs_Start_Scan(pCuCmd->hCuWext, &ssid);
2341	 * #endif
2342	 */
2343}
2344
2345VOID CuCmd_WextStartScan(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2346{
2347    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2348    OS_802_11_SSID ssid;
2349
2350    switch (nParms)
2351    {
2352        case 0 :
2353            /*
2354            *  No SSID & No BSSID are set -
2355            *  Use Any SSID & Any BSSID.
2356            */
2357            ssid.SsidLength = 0;
2358            ssid.Ssid[0] = 0;
2359            break;
2360        case 1:
2361            /*
2362            *  SSID set
2363            *  Use CLI's SSID & Any BSSID.
2364            */
2365            ssid.SsidLength = os_strlen( (PS8)parm[0].value);
2366            os_memcpy((PVOID)ssid.Ssid, (PVOID) parm[0].value, ssid.SsidLength);
2367            ssid.Ssid[ssid.SsidLength] = '\0';
2368            break;
2369
2370        default:
2371            os_error_printf(CU_MSG_INFO2, (PS8)"w <ssid Name As optional>\n");
2372            return;
2373    }
2374
2375#ifndef NO_WPA_SUPPL
2376    CuOs_Start_Scan(pCuCmd->hCuWext, &ssid);
2377#else
2378    os_error_printf(CU_MSG_INFO2, (PS8)"WEXT not build, Scan Not Started\n");
2379#endif
2380
2381}
2382
2383VOID CuCmd_StopScan (THandle hCuCmd, ConParm_t parm[], U16 nParms)
2384{
2385    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2386
2387    if(OK != CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_STOP_APP_SCAN_SET, NULL, 0))
2388    {
2389        return;
2390    }
2391    os_error_printf(CU_MSG_INFO2, (PS8)"Application scan stopped\n");
2392}
2393
2394VOID CuCmd_ConfigPeriodicScanGlobal (THandle hCuCmd, ConParm_t parm[], U16 nParms)
2395{
2396    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2397
2398    pCuCmd->tPeriodicAppScanParams.iRssiThreshold = (S8)parm[ 0 ].value;
2399    pCuCmd->tPeriodicAppScanParams.iSnrThreshold = (S8)parm[ 1 ].value;
2400    pCuCmd->tPeriodicAppScanParams.uFrameCountReportThreshold = parm[ 2 ].value;
2401    pCuCmd->tPeriodicAppScanParams.bTerminateOnReport = parm[ 3 ].value;
2402    pCuCmd->tPeriodicAppScanParams.eBssType = (ScanBssType_e )parm[ 4 ].value;
2403    pCuCmd->tPeriodicAppScanParams.uProbeRequestNum = parm[ 5 ].value;
2404    pCuCmd->tPeriodicAppScanParams.uCycleNum = parm[ 6 ].value;
2405    pCuCmd->tPeriodicAppScanParams.uSsidNum = parm[ 7 ].value;
2406    pCuCmd->tPeriodicAppScanParams.uSsidListFilterEnabled = (U8)(parm[ 8 ].value);
2407    pCuCmd->tPeriodicAppScanParams.uChannelNum = parm[ 9 ].value;
2408}
2409
2410VOID CuCmd_ConfigPeriodicScanInterval (THandle hCuCmd, ConParm_t parm[], U16 nParms)
2411{
2412    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2413
2414    pCuCmd->tPeriodicAppScanParams.uCycleIntervalMsec[ parm[ 0 ].value ] = parm[ 1 ].value;
2415}
2416
2417VOID CuCmd_ConfigurePeriodicScanSsid (THandle hCuCmd, ConParm_t parm[], U16 nParms)
2418{
2419    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2420    TSsid *pSsid = &pCuCmd->tPeriodicAppScanParams.tDesiredSsid[ parm[ 0 ].value ].tSsid;
2421
2422    pCuCmd->tPeriodicAppScanParams.tDesiredSsid[ parm[ 0 ].value ].eVisability = parm[ 1 ].value;
2423    pSsid->len = (U8)os_strlen ((PS8)parm[ 2 ].value);
2424    os_memcpy ((PVOID)&(pSsid->str),
2425               (PVOID)parm[ 2 ].value,
2426               pSsid->len);
2427    if(pSsid->len < MAX_SSID_LEN)
2428    {
2429        pSsid->str[pSsid->len] = 0;
2430    }
2431}
2432
2433VOID CuCmd_ConfigurePeriodicScanChannel (THandle hCuCmd, ConParm_t parm[], U16 nParms)
2434{
2435    CuCmd_t                 *pCuCmd = (CuCmd_t*)hCuCmd;
2436    TPeriodicChannelEntry   *pChannelEnrty = &(pCuCmd->tPeriodicAppScanParams.tChannels[ parm[ 0 ].value ]);
2437
2438    pChannelEnrty->eBand = parm[ 1 ].value;
2439    pChannelEnrty->uChannel = parm[ 2 ].value;
2440    pChannelEnrty->eScanType = parm[ 3 ].value;
2441    pChannelEnrty->uMinDwellTimeMs = parm[ 4 ].value;;
2442    pChannelEnrty->uMaxDwellTimeMs = parm[ 5 ].value;
2443    pChannelEnrty->uTxPowerLevelDbm = parm[ 6 ].value;
2444}
2445
2446VOID CuCmd_ClearPeriodicScanConfiguration (THandle hCuCmd, ConParm_t parm[], U16 nParms)
2447{
2448    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2449
2450    os_memset (&(pCuCmd->tPeriodicAppScanParams), 0, sizeof (TPeriodicScanParams));
2451    os_error_printf(CU_MSG_INFO2, (PS8)"Periodic application scan parameters cleared.\n");
2452}
2453
2454VOID CuCmd_DisplayPeriodicScanConfiguration (THandle hCuCmd, ConParm_t parm[], U16 nParms)
2455{
2456    CuCmd_t*    pCuCmd = (CuCmd_t*)hCuCmd;
2457    S32         i, j, k;
2458
2459    os_error_printf(CU_MSG_INFO2, (PS8)"Application Periodic Scan parameters:\n");
2460    os_error_printf(CU_MSG_INFO2, (PS8)"RSSI Threshold: %d, SNR Threshold: %d, Report Threshold: %d  Number of cycles: %d\n",
2461                    pCuCmd->tPeriodicAppScanParams.iRssiThreshold, pCuCmd->tPeriodicAppScanParams.iSnrThreshold,
2462                    pCuCmd->tPeriodicAppScanParams.uFrameCountReportThreshold, pCuCmd->tPeriodicAppScanParams.uCycleNum);
2463    CU_CMD_FIND_NAME_ARRAY (i, booleanStr, pCuCmd->tPeriodicAppScanParams.bTerminateOnReport);
2464    CU_CMD_FIND_NAME_ARRAY (j, bssTypeStr, pCuCmd->tPeriodicAppScanParams.eBssType);
2465    os_error_printf(CU_MSG_INFO2, (PS8)"Terminate on Report: %s, BSS type: %s, Probe Request Number: %d\n",
2466                    booleanStr[ i ].name, bssTypeStr[ j ].name, pCuCmd->tPeriodicAppScanParams.uProbeRequestNum);
2467
2468    os_error_printf(CU_MSG_INFO2, (PS8)"\nIntervals (msec):\n");
2469    for (i = 0; i < PERIODIC_SCAN_MAX_INTERVAL_NUM; i++)
2470    {
2471        os_error_printf(CU_MSG_INFO2, (PS8)"%d ", pCuCmd->tPeriodicAppScanParams.uCycleIntervalMsec[ i ]);
2472    }
2473    os_error_printf(CU_MSG_INFO2, (PS8)"\n\nSSIDs:\n");
2474    for (i = 0; i < (S32)pCuCmd->tPeriodicAppScanParams.uSsidNum; i++)
2475    {
2476        CU_CMD_FIND_NAME_ARRAY (j, ssidVisabilityStr, pCuCmd->tPeriodicAppScanParams.tDesiredSsid[ i ].eVisability);
2477        os_error_printf(CU_MSG_INFO2, (PS8)"%s (%s), ", pCuCmd->tPeriodicAppScanParams.tDesiredSsid[ i ].tSsid.str,
2478                        ssidVisabilityStr[ j ].name);
2479    }
2480    os_error_printf(CU_MSG_INFO2, (PS8)"\n\nSSID List Filter Enabled: %d\n", pCuCmd->tPeriodicAppScanParams.uSsidListFilterEnabled );
2481
2482    os_error_printf(CU_MSG_INFO2, (PS8)"\n\nChannels:\n");
2483    os_error_printf(CU_MSG_INFO2, (PS8)"%-15s %-10s %-20s %-15s %-15s %-20s\n",
2484                    (PS8)"Band", (PS8)"Channel", (PS8)"Scan type", (PS8)"Min dwell time", (PS8)"Max dwell time", (PS8)"Power level (dBm*10)");
2485    os_error_printf(CU_MSG_INFO2, (PS8)"----------------------------------------------------------------------------------------------------\n");
2486    for (i = 0; i < (S32)pCuCmd->tPeriodicAppScanParams.uChannelNum; i++)
2487    {
2488        CU_CMD_FIND_NAME_ARRAY (j, band2Str, pCuCmd->tPeriodicAppScanParams.tChannels[ i ].eBand);
2489        CU_CMD_FIND_NAME_ARRAY (k, scanType2Str, pCuCmd->tPeriodicAppScanParams.tChannels[ i ].eScanType);
2490        os_error_printf(CU_MSG_INFO2, (PS8)"%-15s %-10d %-20s %-15d %-15d %-20d\n",
2491                        band2Str[ j ].name,
2492                        pCuCmd->tPeriodicAppScanParams.tChannels[ i ].uChannel,
2493                        scanType2Str[ k ].name,
2494                        pCuCmd->tPeriodicAppScanParams.tChannels[ i ].uMinDwellTimeMs,
2495                        pCuCmd->tPeriodicAppScanParams.tChannels[ i ].uMaxDwellTimeMs,
2496                        pCuCmd->tPeriodicAppScanParams.tChannels[ i ].uTxPowerLevelDbm);
2497    }
2498    os_error_printf(CU_MSG_INFO2, (PS8)"\n");
2499}
2500
2501VOID CuCmd_StartPeriodicScan (THandle hCuCmd, ConParm_t parm[], U16 nParms)
2502{
2503    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2504
2505    if(OK != CuCommon_SetBuffer(pCuCmd->hCuCommon, SCAN_CNCN_START_PERIODIC_SCAN,
2506                                &(pCuCmd->tPeriodicAppScanParams), sizeof(TPeriodicScanParams)))
2507    {
2508        return;
2509    }
2510    os_error_printf(CU_MSG_INFO2, (PS8)"Periodic application scan started.\n");
2511}
2512
2513VOID CuCmd_StopPeriodicScan (THandle hCuCmd, ConParm_t parm[], U16 nParms)
2514{
2515    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2516
2517    if(OK != CuCommon_SetBuffer(pCuCmd->hCuCommon, SCAN_CNCN_STOP_PERIODIC_SCAN,
2518                                NULL, 0))
2519    {
2520        return;
2521    }
2522    os_error_printf(CU_MSG_INFO2, (PS8)"Periodic application scan stopped.\n");
2523}
2524
2525VOID CuCmd_ConfigScanPolicy(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2526{
2527    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2528
2529    pCuCmd->scanPolicy.normalScanInterval =  parm[ 0 ].value;
2530    pCuCmd->scanPolicy.deterioratingScanInterval = parm[ 1 ].value;
2531    pCuCmd->scanPolicy.maxTrackFailures = (U8)(parm[ 2 ].value);
2532    pCuCmd->scanPolicy.BSSListSize = (U8)(parm[ 3 ].value);
2533    pCuCmd->scanPolicy.BSSNumberToStartDiscovery = (U8)(parm[ 4 ].value);
2534    pCuCmd->scanPolicy.numOfBands = (U8)(parm[ 5 ].value);
2535}
2536
2537VOID CuCmd_ConfigScanBand(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2538{
2539    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2540    scan_bandPolicy_t* pBandPolicy = &(pCuCmd->scanPolicy.bandScanPolicy[ parm [ 0 ].value ]);
2541
2542    pBandPolicy->band = parm[ 1 ].value;
2543    pBandPolicy->rxRSSIThreshold = (S8)(parm[ 2 ].value);
2544    pBandPolicy->numOfChannlesForDiscovery = (U8)(parm[ 3 ].value);
2545    pBandPolicy->numOfChannles = (U8)(parm[ 4 ].value);
2546}
2547
2548VOID CuCmd_ConfigScanBandChannel(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2549{
2550    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2551    scan_bandPolicy_t* pBandPolicy = &(pCuCmd->scanPolicy.bandScanPolicy[ parm [ 0 ].value ]);
2552
2553    pBandPolicy->channelList[ parm[ 1 ].value ] = (U8)(parm[ 2 ].value);
2554}
2555
2556VOID CuCmd_ConfigScanBandTrack(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2557{
2558    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2559    scan_bandPolicy_t* pBandPolicy = &(pCuCmd->scanPolicy.bandScanPolicy[ parm [ 0 ].value ]);
2560
2561    if (parm[6].value < parm[7].value)
2562    {
2563        os_error_printf(CU_MSG_INFO2, (PS8)"Max Dwell Time must be larger than or equal to Min Dwell Time...\n");
2564        return;
2565    }
2566
2567    pBandPolicy->trackingMethod.scanType = parm[ 1 ].value;
2568
2569    switch (pBandPolicy->trackingMethod.scanType)
2570    {
2571        case SCAN_TYPE_NORMAL_ACTIVE:
2572        case SCAN_TYPE_NORMAL_PASSIVE:
2573            pBandPolicy->trackingMethod.method.basicMethodParams.maxChannelDwellTime = (parm[ 6 ].value);
2574            pBandPolicy->trackingMethod.method.basicMethodParams.minChannelDwellTime = (parm[ 7 ].value);
2575            pBandPolicy->trackingMethod.method.basicMethodParams.earlyTerminationEvent = parm[ 2 ].value;
2576            pBandPolicy->trackingMethod.method.basicMethodParams.ETMaxNumberOfApFrames = (U8)(parm[ 3 ].value);
2577            pBandPolicy->trackingMethod.method.basicMethodParams.probReqParams.bitrate = parm[ 9 ].value;
2578            pBandPolicy->trackingMethod.method.basicMethodParams.probReqParams.numOfProbeReqs = (U8)(parm[ 8 ].value);
2579            pBandPolicy->trackingMethod.method.basicMethodParams.probReqParams.txPowerDbm = (U8)(parm[ 10 ].value);
2580            break;
2581
2582        case SCAN_TYPE_TRIGGERED_ACTIVE:
2583        case SCAN_TYPE_TRIGGERED_PASSIVE:
2584            /* Check if valid TID */
2585            if (((parm[ 4 ].value) > 7) && ((parm[ 4 ].value) != 255))
2586            {
2587                os_error_printf (CU_MSG_INFO2, (PS8)"ERROR Tid (AC) should be 0..7 or 255 instead = %d (using default = 255)\n",(parm[ 4 ].value));
2588                parm[ 4 ].value = 255;
2589            }
2590
2591            pBandPolicy->trackingMethod.method.TidTriggerdMethodParams.triggeringTid = (U8)(parm[ 4 ].value);
2592            pBandPolicy->trackingMethod.method.TidTriggerdMethodParams.basicMethodParams.maxChannelDwellTime = (parm[ 6 ].value);
2593            pBandPolicy->trackingMethod.method.TidTriggerdMethodParams.basicMethodParams.minChannelDwellTime = (parm[ 7 ].value);
2594            pBandPolicy->trackingMethod.method.TidTriggerdMethodParams.basicMethodParams.earlyTerminationEvent = parm[ 2 ].value;
2595            pBandPolicy->trackingMethod.method.TidTriggerdMethodParams.basicMethodParams.ETMaxNumberOfApFrames = (U8)(parm[ 3 ].value);
2596            pBandPolicy->trackingMethod.method.TidTriggerdMethodParams.basicMethodParams.probReqParams.bitrate = parm[ 9 ].value;
2597            pBandPolicy->trackingMethod.method.TidTriggerdMethodParams.basicMethodParams.probReqParams.numOfProbeReqs = (U8)(parm[ 8 ].value);
2598            pBandPolicy->trackingMethod.method.TidTriggerdMethodParams.basicMethodParams.probReqParams.txPowerDbm = (U8)(parm[ 10 ].value);
2599            break;
2600
2601        case SCAN_TYPE_SPS:
2602            pBandPolicy->trackingMethod.method.spsMethodParams.earlyTerminationEvent = parm[ 2 ].value;
2603            pBandPolicy->trackingMethod.method.spsMethodParams.ETMaxNumberOfApFrames = (U8)(parm[ 3 ].value);
2604            pBandPolicy->trackingMethod.method.spsMethodParams.scanDuration = parm[ 5 ].value;
2605            break;
2606
2607        default:
2608            pBandPolicy->trackingMethod.scanType = SCAN_TYPE_NO_SCAN;
2609            break;
2610    }
2611}
2612
2613VOID CuCmd_ConfigScanBandDiscover(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2614{
2615    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2616    scan_bandPolicy_t* pBandPolicy = &(pCuCmd->scanPolicy.bandScanPolicy[ parm [ 0 ].value ]);
2617
2618    if (parm[6].value < parm[7].value)
2619    {
2620        os_error_printf(CU_MSG_INFO2, (PS8)"Max Dwell Time must be larger than or equal to Min Dwell Time...\n");
2621        return;
2622    }
2623
2624    pBandPolicy->discoveryMethod.scanType = parm[ 1 ].value;
2625
2626    switch (pBandPolicy->discoveryMethod.scanType)
2627    {
2628        case SCAN_TYPE_NORMAL_ACTIVE:
2629        case SCAN_TYPE_NORMAL_PASSIVE:
2630            pBandPolicy->discoveryMethod.method.basicMethodParams.maxChannelDwellTime = (parm[ 6 ].value);
2631            pBandPolicy->discoveryMethod.method.basicMethodParams.minChannelDwellTime = (parm[ 7 ].value);
2632            pBandPolicy->discoveryMethod.method.basicMethodParams.earlyTerminationEvent = parm[ 2 ].value;
2633            pBandPolicy->discoveryMethod.method.basicMethodParams.ETMaxNumberOfApFrames = (U8)(parm[ 3 ].value);
2634            pBandPolicy->discoveryMethod.method.basicMethodParams.probReqParams.bitrate = parm[ 9 ].value;
2635            pBandPolicy->discoveryMethod.method.basicMethodParams.probReqParams.numOfProbeReqs = (U8)(parm[ 8 ].value);
2636            pBandPolicy->discoveryMethod.method.basicMethodParams.probReqParams.txPowerDbm = (U8)(parm[ 10 ].value);
2637            break;
2638
2639        case SCAN_TYPE_TRIGGERED_ACTIVE:
2640        case SCAN_TYPE_TRIGGERED_PASSIVE:
2641            /* Check if valid TID */
2642            if (((parm[ 4 ].value) > 7) && ((parm[ 4 ].value) != 255))
2643            {
2644                os_error_printf(CU_MSG_INFO2, (PS8)"ERROR Tid (AC) should be 0..7 or 255 instead = %d (using default = 255)\n",(parm[ 4 ].value));
2645                parm[ 4 ].value = 255;
2646            }
2647
2648            pBandPolicy->discoveryMethod.method.TidTriggerdMethodParams.triggeringTid = (U8)(parm[ 4 ].value);
2649            pBandPolicy->discoveryMethod.method.TidTriggerdMethodParams.basicMethodParams.maxChannelDwellTime = (parm[ 6 ].value);
2650            pBandPolicy->discoveryMethod.method.TidTriggerdMethodParams.basicMethodParams.minChannelDwellTime = (parm[ 7 ].value);
2651            pBandPolicy->discoveryMethod.method.TidTriggerdMethodParams.basicMethodParams.earlyTerminationEvent = parm[ 2 ].value;
2652            pBandPolicy->discoveryMethod.method.TidTriggerdMethodParams.basicMethodParams.ETMaxNumberOfApFrames = (U8)(parm[ 3 ].value);
2653            pBandPolicy->discoveryMethod.method.TidTriggerdMethodParams.basicMethodParams.probReqParams.bitrate = parm[ 9 ].value;
2654            pBandPolicy->discoveryMethod.method.TidTriggerdMethodParams.basicMethodParams.probReqParams.numOfProbeReqs = (U8)(parm[ 8 ].value);
2655            pBandPolicy->discoveryMethod.method.TidTriggerdMethodParams.basicMethodParams.probReqParams.txPowerDbm = (U8)(parm[ 10 ].value);
2656            break;
2657
2658        case SCAN_TYPE_SPS:
2659            pBandPolicy->discoveryMethod.method.spsMethodParams.earlyTerminationEvent = parm[ 2 ].value;
2660            pBandPolicy->discoveryMethod.method.spsMethodParams.ETMaxNumberOfApFrames = (U8)(parm[ 3 ].value);
2661            pBandPolicy->discoveryMethod.method.spsMethodParams.scanDuration = parm[ 5 ].value;
2662            break;
2663
2664        default:
2665            pBandPolicy->discoveryMethod.scanType = SCAN_TYPE_NO_SCAN;
2666            break;
2667    }
2668}
2669
2670VOID CuCmd_ConfigScanBandImmed(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2671{
2672    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2673    scan_bandPolicy_t* pBandPolicy = &(pCuCmd->scanPolicy.bandScanPolicy[ parm [ 0 ].value ]);
2674
2675    if (parm[6].value < parm[7].value)
2676    {
2677        os_error_printf(CU_MSG_INFO2, (PS8)"Max Dwell Time must be larger than or equal to Min Dwell Time...\n");
2678        return;
2679    }
2680
2681    pBandPolicy->immediateScanMethod.scanType = parm[ 1 ].value;
2682
2683    switch (pBandPolicy->immediateScanMethod.scanType)
2684    {
2685        case SCAN_TYPE_NORMAL_ACTIVE:
2686        case SCAN_TYPE_NORMAL_PASSIVE:
2687            pBandPolicy->immediateScanMethod.method.basicMethodParams.maxChannelDwellTime = (parm[ 6 ].value);
2688            pBandPolicy->immediateScanMethod.method.basicMethodParams.minChannelDwellTime = (parm[ 7 ].value);
2689            pBandPolicy->immediateScanMethod.method.basicMethodParams.earlyTerminationEvent = parm[ 2 ].value;
2690            pBandPolicy->immediateScanMethod.method.basicMethodParams.ETMaxNumberOfApFrames = (U8)(parm[ 3 ].value);
2691            pBandPolicy->immediateScanMethod.method.basicMethodParams.probReqParams.bitrate = parm[ 9 ].value;
2692            pBandPolicy->immediateScanMethod.method.basicMethodParams.probReqParams.numOfProbeReqs = (U8)(parm[ 8 ].value);
2693            pBandPolicy->immediateScanMethod.method.basicMethodParams.probReqParams.txPowerDbm = (U8)(parm[ 10 ].value);
2694            break;
2695
2696        case SCAN_TYPE_TRIGGERED_ACTIVE:
2697        case SCAN_TYPE_TRIGGERED_PASSIVE:
2698            /* Check if valid TID */
2699            if (((parm[ 4 ].value) > 7) && ((parm[ 4 ].value) != 255))
2700            {
2701                os_error_printf (CU_MSG_INFO2, (PS8)"ERROR Tid (AC) should be 0..7 or 255 instead = %d (using default = 255)\n",(parm[ 4 ].value));
2702                parm[ 4 ].value = 255;
2703            }
2704
2705            pBandPolicy->immediateScanMethod.method.TidTriggerdMethodParams.triggeringTid = (U8)(parm[ 4 ].value);
2706            pBandPolicy->immediateScanMethod.method.TidTriggerdMethodParams.basicMethodParams.maxChannelDwellTime = (parm[ 6 ].value);
2707            pBandPolicy->immediateScanMethod.method.TidTriggerdMethodParams.basicMethodParams.minChannelDwellTime = (parm[ 7 ].value);
2708            pBandPolicy->immediateScanMethod.method.TidTriggerdMethodParams.basicMethodParams.earlyTerminationEvent = parm[ 2 ].value;
2709            pBandPolicy->immediateScanMethod.method.TidTriggerdMethodParams.basicMethodParams.ETMaxNumberOfApFrames = (U8)(parm[ 3 ].value);
2710            pBandPolicy->immediateScanMethod.method.TidTriggerdMethodParams.basicMethodParams.probReqParams.bitrate = parm[ 9 ].value;
2711            pBandPolicy->immediateScanMethod.method.TidTriggerdMethodParams.basicMethodParams.probReqParams.numOfProbeReqs = (U8)(parm[ 8 ].value);
2712            pBandPolicy->immediateScanMethod.method.TidTriggerdMethodParams.basicMethodParams.probReqParams.txPowerDbm = (U8)(parm[ 10 ].value);
2713            break;
2714
2715        case SCAN_TYPE_SPS:
2716            pBandPolicy->immediateScanMethod.method.spsMethodParams.earlyTerminationEvent = parm[ 2 ].value;
2717            pBandPolicy->immediateScanMethod.method.spsMethodParams.ETMaxNumberOfApFrames = (U8)(parm[ 3 ].value);
2718            pBandPolicy->immediateScanMethod.method.spsMethodParams.scanDuration = parm[ 5 ].value;
2719            break;
2720
2721        default:
2722            pBandPolicy->immediateScanMethod.scanType = SCAN_TYPE_NO_SCAN;
2723            break;
2724    }
2725}
2726
2727VOID CuCmd_DisplayScanPolicy(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2728{
2729    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2730    S32 i;
2731
2732    os_error_printf(CU_MSG_INFO2, (PS8)"Scan Policy:\n");
2733    os_error_printf(CU_MSG_INFO2, (PS8)"Normal scan interval: %d, deteriorating scan interval: %d\n",
2734          pCuCmd->scanPolicy.normalScanInterval, pCuCmd->scanPolicy.deterioratingScanInterval);
2735    os_error_printf(CU_MSG_INFO2, (PS8)"Max track attempt failures: %d\n", pCuCmd->scanPolicy.maxTrackFailures);
2736    os_error_printf(CU_MSG_INFO2, (PS8)"BSS list size: %d, number of BSSes to start discovery: %d\n",
2737          pCuCmd->scanPolicy.BSSListSize, pCuCmd->scanPolicy.BSSNumberToStartDiscovery);
2738    os_error_printf(CU_MSG_INFO2, (PS8)"Number of configured bands: %d\n", pCuCmd->scanPolicy.numOfBands);
2739    for ( i = 0; i < pCuCmd->scanPolicy.numOfBands; i++ )
2740    {
2741        CuCmd_PrintScanBand(&(pCuCmd->scanPolicy.bandScanPolicy[ i ]));
2742    }
2743}
2744
2745VOID CuCmd_ClearScanPolicy(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2746{
2747    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2748
2749    os_memset( &pCuCmd->scanPolicy, 0, sizeof(scan_Policy_t) );
2750    os_error_printf(CU_MSG_INFO2, (PS8)"Scan policy cleared.\n");
2751}
2752
2753VOID CuCmd_SetScanPolicy(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2754{
2755    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2756
2757    if(OK != CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_SCAN_POLICY_PARAM_SET,
2758        &pCuCmd->scanPolicy, sizeof(scan_Policy_t))) return;
2759    os_error_printf(CU_MSG_INFO2, (PS8)"Scan policy stored.\n");
2760}
2761
2762VOID CuCmd_GetScanBssList(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2763{
2764    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2765    bssList_t list;
2766    S32 i;
2767
2768    if(OK != CuCommon_GetSetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_SCAN_BSS_LIST_GET,
2769        &list, sizeof(bssList_t))) return;
2770
2771    /* os_error_printf list */
2772    os_error_printf(CU_MSG_INFO2, (PS8)"BSS List:\n");
2773    os_error_printf(CU_MSG_INFO2, (PS8)"%-17s  %-7s  %-6s  %-4s  %-10s\n", (PS8)"BSSID", (PS8)"Band", (PS8)"Channel", (PS8)"RSSI", (PS8)"Neighbor?");
2774    os_error_printf(CU_MSG_INFO2, (PS8)"-----------------------------------------------------\n");
2775    for  ( i = 0; i < list.numOfEntries; i++ )
2776    {
2777        os_error_printf(CU_MSG_INFO2,  (PS8)"%02x.%02x.%02x.%02x.%02x.%02x  %s  %-7d  %-4d  %s\n",
2778               list.BSSList[i].BSSID[0], list.BSSList[i].BSSID[1], list.BSSList[i].BSSID[2], list.BSSList[i].BSSID[3], list.BSSList[i].BSSID[4], list.BSSList[i].BSSID[5],
2779               band2Str[ list.BSSList[ i ].band ].name,
2780               list.BSSList[ i ].channel, list.BSSList[ i ].RSSI,
2781               (TRUE == list.BSSList[ i ].bNeighborAP ? (PS8)"Yes" : (PS8)"No") );
2782    }
2783}
2784
2785VOID CuCmd_RoamingEnable(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2786{
2787    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2788    roamingMngrConfigParams_t   roamingMngrConfigParams;
2789
2790    if(OK != CuCommon_GetBuffer(pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2791        &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t))) return;
2792    roamingMngrConfigParams.roamingMngrConfig.enableDisable = ROAMING_ENABLED;
2793    if(OK != CuCommon_SetBuffer(pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2794        &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2795    os_error_printf(CU_MSG_INFO2, (PS8)"Roaming is enabled \n");
2796}
2797
2798VOID CuCmd_RoamingDisable(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2799{
2800    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2801    roamingMngrConfigParams_t   roamingMngrConfigParams;
2802
2803    if(OK != CuCommon_GetBuffer(pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2804        &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2805    roamingMngrConfigParams.roamingMngrConfig.enableDisable = ROAMING_DISABLED;
2806    if(OK != CuCommon_SetBuffer (pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2807        &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2808    os_error_printf(CU_MSG_INFO2, (PS8)"Roaming is disabled \n");
2809}
2810
2811VOID CuCmd_RoamingLowPassFilter(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2812{
2813    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2814    roamingMngrConfigParams_t   roamingMngrConfigParams;
2815
2816    if(OK != CuCommon_GetBuffer (pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2817        &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2818    if( nParms != 0 )
2819    {
2820        roamingMngrConfigParams.roamingMngrConfig.lowPassFilterRoamingAttempt = (U16) parm[0].value;
2821        if(OK != CuCommon_SetBuffer (pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2822            &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2823    }
2824    os_error_printf(CU_MSG_INFO2, (PS8)"Time in sec to wait before low quality Roaming Triggers, \n lowPassFilterRoamingAttempt = %d sec\n",
2825           roamingMngrConfigParams.roamingMngrConfig.lowPassFilterRoamingAttempt);
2826}
2827
2828VOID CuCmd_RoamingQualityIndicator(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2829{
2830    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2831    roamingMngrConfigParams_t   roamingMngrConfigParams;
2832
2833    if(OK != CuCommon_GetBuffer (pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2834        &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2835    if( nParms != 0 )
2836    {
2837        roamingMngrConfigParams.roamingMngrConfig.apQualityThreshold = (S8) parm[0].value;
2838        if(OK != CuCommon_SetBuffer (pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2839            &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2840    }
2841    os_error_printf(CU_MSG_INFO2, (PS8)"Quality indicator (RSSI) to be used when comparing AP List matching quality, \n apQualityThreshold = %d \n",
2842           (roamingMngrConfigParams.roamingMngrConfig.apQualityThreshold));
2843}
2844
2845VOID CuCmd_RoamingDataRetryThreshold(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2846{
2847    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2848    roamingMngrConfigParams_t   roamingMngrConfigParams;
2849
2850    if(OK != CuCommon_GetBuffer (pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2851        &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2852    if( nParms != 0 )
2853    {
2854        roamingMngrConfigParams.roamingMngrThresholdsConfig.dataRetryThreshold =  (S8) parm[0].value;
2855        if(OK != CuCommon_SetBuffer (pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2856            &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2857    }
2858    os_error_printf(CU_MSG_INFO2, (PS8)"dataRetryThreshold = %d \n",
2859           roamingMngrConfigParams.roamingMngrThresholdsConfig.dataRetryThreshold);
2860
2861}
2862VOID CuCmd_RoamingNumExpectedTbttForBSSLoss(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2863{
2864    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2865    roamingMngrConfigParams_t   roamingMngrConfigParams;
2866
2867    if(OK != CuCommon_GetBuffer (pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2868        &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2869    if( nParms != 0 )
2870    {
2871        roamingMngrConfigParams.roamingMngrThresholdsConfig.numExpectedTbttForBSSLoss =  (S8) parm[0].value;
2872        if(OK != CuCommon_SetBuffer (pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2873            &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2874    }
2875    os_error_printf(CU_MSG_INFO2, (PS8)"Number of expected TBTTs for BSS Loss event, \n numExpectedTbttForBSSLoss = %d \n",
2876           roamingMngrConfigParams.roamingMngrThresholdsConfig.numExpectedTbttForBSSLoss);
2877
2878}
2879VOID CuCmd_RoamingTxRateThreshold(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2880{
2881    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2882    roamingMngrConfigParams_t   roamingMngrConfigParams;
2883
2884    if(OK != CuCommon_GetBuffer (pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2885        &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2886    if( nParms != 0 )
2887    {
2888        roamingMngrConfigParams.roamingMngrThresholdsConfig.txRateThreshold =  (S8 )parm[0].value;
2889        if(OK != CuCommon_SetBuffer (pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2890            &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2891    }
2892    os_error_printf(CU_MSG_INFO2, (PS8)"txRateThreshold = %d \n",
2893           roamingMngrConfigParams.roamingMngrThresholdsConfig.txRateThreshold);
2894
2895}
2896
2897VOID CuCmd_RoamingLowRssiThreshold(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2898{
2899    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2900    roamingMngrConfigParams_t   roamingMngrConfigParams;
2901
2902    if(OK != CuCommon_GetBuffer (pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2903        &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2904    if( nParms != 0 )
2905    {
2906        roamingMngrConfigParams.roamingMngrThresholdsConfig.lowRssiThreshold =  (S8) parm[0].value;
2907        if(OK != CuCommon_SetBuffer (pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2908            &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2909    }
2910    os_error_printf(CU_MSG_INFO2, (PS8)"lowRssiThreshold = %d \n",
2911           (roamingMngrConfigParams.roamingMngrThresholdsConfig.lowRssiThreshold));
2912
2913}
2914
2915VOID CuCmd_RoamingLowSnrThreshold(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2916{
2917    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2918    roamingMngrConfigParams_t   roamingMngrConfigParams;
2919
2920    if(OK != CuCommon_GetBuffer (pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2921        &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2922    if( nParms != 0 )
2923    {
2924        roamingMngrConfigParams.roamingMngrThresholdsConfig.lowSnrThreshold =  (S8)parm[0].value;
2925        if(OK != CuCommon_SetBuffer (pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2926            &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2927    }
2928    os_error_printf(CU_MSG_INFO2, (PS8)"lowSnrThreshold = %d \n", roamingMngrConfigParams.roamingMngrThresholdsConfig.lowSnrThreshold);
2929}
2930
2931VOID CuCmd_RoamingLowQualityForBackgroungScanCondition(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2932{
2933    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2934    roamingMngrConfigParams_t   roamingMngrConfigParams;
2935
2936    if(OK != CuCommon_GetBuffer (pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2937        &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2938    if( nParms != 0 )
2939    {
2940        roamingMngrConfigParams.roamingMngrThresholdsConfig.lowQualityForBackgroungScanCondition = (S8) parm[0].value;
2941        if(OK != CuCommon_SetBuffer (pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2942            &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2943    }
2944    os_error_printf(CU_MSG_INFO2, (PS8)"Indicator used to increase the background scan period when quality is low, \n lowQualityForBackgroungScanCondition = %d \n",
2945           (roamingMngrConfigParams.roamingMngrThresholdsConfig.lowQualityForBackgroungScanCondition));
2946
2947}
2948
2949VOID CuCmd_RoamingNormalQualityForBackgroungScanCondition(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2950{
2951    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2952    roamingMngrConfigParams_t   roamingMngrConfigParams;
2953
2954    if(OK != CuCommon_GetBuffer (pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2955        &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2956    if( nParms != 0 )
2957    {
2958        roamingMngrConfigParams.roamingMngrThresholdsConfig.normalQualityForBackgroungScanCondition = (S8) parm[0].value;
2959        if(OK != CuCommon_SetBuffer (pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2960            &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2961    }
2962    os_error_printf(CU_MSG_INFO2, (PS8)"Indicator used to reduce the background scan period when quality is normal, \n normalQualityForBackgroungScanCondition = %d \n",
2963           (roamingMngrConfigParams.roamingMngrThresholdsConfig.normalQualityForBackgroungScanCondition));
2964
2965}
2966
2967VOID CuCmd_RoamingGetConfParams(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2968{
2969    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
2970    roamingMngrConfigParams_t   roamingMngrConfigParams;
2971
2972    if(OK != CuCommon_GetBuffer (pCuCmd->hCuCommon, ROAMING_MNGR_APPLICATION_CONFIGURATION,
2973        &roamingMngrConfigParams, sizeof(roamingMngrConfigParams_t)) ) return;
2974
2975    os_error_printf(CU_MSG_INFO2, (PS8)"Roaming is: %s \n", roamingMngrConfigParams.roamingMngrConfig.enableDisable ? "Enabled" : "Disabled\n");
2976    os_error_printf(CU_MSG_INFO2, (PS8)" lowPassFilterRoamingAttempt = %d sec,\n apQualityThreshold = %d\n",
2977        roamingMngrConfigParams.roamingMngrConfig.lowPassFilterRoamingAttempt,
2978        roamingMngrConfigParams.roamingMngrConfig.apQualityThreshold);
2979    os_error_printf(CU_MSG_INFO2, (PS8)" Roaming Triggers' thresholds are: \n");
2980    os_error_printf(CU_MSG_INFO2, (PS8)" dataRetryThreshold = %d,\n lowQualityForBackgroungScanCondition = %d,\n lowRssiThreshold = %d,\n lowSnrThreshold = %d,\n normalQualityForBackgroungScanCondition = %d,\n numExpectedTbttForBSSLoss = %d,\n txRateThreshold = %d \n",
2981					roamingMngrConfigParams.roamingMngrThresholdsConfig.dataRetryThreshold,
2982					roamingMngrConfigParams.roamingMngrThresholdsConfig.lowQualityForBackgroungScanCondition,
2983					roamingMngrConfigParams.roamingMngrThresholdsConfig.lowRssiThreshold,
2984					roamingMngrConfigParams.roamingMngrThresholdsConfig.lowSnrThreshold,
2985					roamingMngrConfigParams.roamingMngrThresholdsConfig.normalQualityForBackgroungScanCondition,
2986					roamingMngrConfigParams.roamingMngrThresholdsConfig.numExpectedTbttForBSSLoss,
2987					roamingMngrConfigParams.roamingMngrThresholdsConfig.txRateThreshold);
2988}
2989
2990VOID CuCmd_CurrBssUserDefinedTrigger(THandle hCuCmd, ConParm_t parm[], U16 nParms)
2991{
2992    CuCmd_t *pCuCmd = (CuCmd_t*)hCuCmd;
2993    TUserDefinedQualityTrigger  userTrigger;
2994
2995    if (nParms == 0)
2996        return;
2997
2998    userTrigger.uIndex     = (U8)parm[0].value;
2999    userTrigger.iThreshold = (U16)parm[1].value;
3000    userTrigger.uPacing    = (U16)parm[2].value;
3001    userTrigger.uMetric    = (U8)parm[3].value;
3002    userTrigger.uType      = (U8)parm[4].value;
3003    userTrigger.uDirection = (U8)parm[5].value;
3004    userTrigger.uHystersis = (U8)parm[6].value;
3005    userTrigger.uEnable    = (U8)parm[7].value;
3006
3007    userTrigger.uClientID = 0; /* '0' means that external application with no clientId has registered for the event */
3008
3009    if (OK != CuCommon_SetBuffer (pCuCmd->hCuCommon, CURR_BSS_REGISTER_LINK_QUALITY_EVENT_PARAM,
3010                                  &userTrigger, sizeof(TUserDefinedQualityTrigger)) )
3011        return;
3012
3013    os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_RoamingUserDefinedTrigger: \n \
3014          index = %d, \n \
3015          threshold = %d, \n \
3016          pacing = %d, \n \
3017          metric = %d, \n \
3018          type = %d, \n \
3019          direction = %d, \n \
3020          hystersis = %d, \n \
3021          enable = %d \n",
3022          userTrigger.uIndex,
3023          userTrigger.iThreshold,
3024          userTrigger.uPacing,
3025          userTrigger.uMetric,
3026          userTrigger.uType,
3027          userTrigger.uDirection,
3028          userTrigger.uHystersis,
3029          userTrigger.uEnable);
3030}
3031
3032VOID CuCmd_AddTspec(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3033{
3034    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3035    OS_802_11_QOS_TSPEC_PARAMS TspecParams;
3036
3037    TspecParams.uUserPriority = parm[0].value;
3038    TspecParams.uNominalMSDUsize = parm[1].value;
3039    TspecParams.uMeanDataRate = parm[2].value;
3040    TspecParams.uMinimumPHYRate = parm[3].value * 1000 * 1000;
3041    TspecParams.uSurplusBandwidthAllowance = parm[4].value << 13;
3042    TspecParams.uAPSDFlag = parm[5].value;
3043    TspecParams.uMinimumServiceInterval = parm[6].value;
3044    TspecParams.uMaximumServiceInterval = parm[7].value;
3045
3046    if(OK != CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_ADD_TSPEC,
3047        &TspecParams, sizeof(OS_802_11_QOS_TSPEC_PARAMS))) return;
3048
3049    os_error_printf(CU_MSG_INFO2, (PS8)"TSpec request sent to driver...\n uUserPriority = %d\n uNominalMSDUsize = %d\n uMeanDataRate = %d\n uMinimumPHYRate = %d\n uSurplusBandwidthAllowance = %d\n uAPSDFlag = %d uMinimumServiceInterval = %d uMaximumServiceInterval = %d\n",
3050               parm[0].value,
3051               parm[1].value,
3052               parm[2].value,
3053               parm[3].value,
3054               parm[4].value,
3055               parm[5].value,
3056               parm[6].value,
3057               parm[7].value);
3058
3059}
3060
3061VOID CuCmd_GetTspec(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3062{
3063    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3064    OS_802_11_QOS_TSPEC_PARAMS TspecParams;
3065
3066    TspecParams.uUserPriority = parm[0].value;
3067
3068    if(OK != CuCommon_GetSetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_GET_TSPEC_PARAMS,
3069        &TspecParams, sizeof(OS_802_11_QOS_TSPEC_PARAMS))) return;
3070
3071    os_error_printf(CU_MSG_INFO2, (PS8)"TSpec parameters retrieved:\nuUserPriority = %d\nuNominalMSDUsize = %d\nuMeanDataRate = %d\nuMinimumPHYRate = %d\nuSurplusBandwidthAllowance = %d\nuUAPSD_Flag = %d\nuMinimumServiceInterval = %d\nuMaximumServiceInterval = %d\nuMediumTime = %d\n",
3072               TspecParams.uUserPriority,
3073               TspecParams.uNominalMSDUsize,
3074               TspecParams.uMeanDataRate,
3075               TspecParams.uMinimumPHYRate,
3076               TspecParams.uSurplusBandwidthAllowance,
3077               TspecParams.uAPSDFlag,
3078               TspecParams.uMinimumServiceInterval,
3079               TspecParams.uMaximumServiceInterval,
3080               TspecParams.uMediumTime);
3081}
3082
3083VOID CuCmd_DeleteTspec(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3084{
3085    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3086    OS_802_11_QOS_DELETE_TSPEC_PARAMS TspecParams;
3087
3088    TspecParams.uUserPriority = parm[0].value;
3089    TspecParams.uReasonCode = parm[1].value;
3090
3091    if(OK != CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_DELETE_TSPEC,
3092        &TspecParams, sizeof(OS_802_11_QOS_TSPEC_PARAMS))) return;
3093
3094    os_error_printf(CU_MSG_INFO2, (PS8)"TSPEC Delete request sent to driver...\n uUserPriority = %d\n uReasonCode = %d\n",
3095        TspecParams.uUserPriority,
3096        TspecParams.uReasonCode);
3097}
3098
3099VOID CuCmd_GetApQosParams(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3100{
3101    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3102    OS_802_11_AC_QOS_PARAMS AcQosParams;
3103    S32 i = 0;
3104
3105    /* test if we can get the AC QOS Params */
3106    AcQosParams.uAC = i;
3107    if(OK != CuCommon_GetSetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_GET_AP_QOS_PARAMS,
3108        &AcQosParams, sizeof(AcQosParams))) return;
3109
3110    os_error_printf(CU_MSG_INFO2, (PS8)"AP QOS Parameters:\n");
3111    os_error_printf(CU_MSG_INFO2, (PS8)"+----+-------------+----------+-----------+-----------+-----------+\n");
3112    os_error_printf(CU_MSG_INFO2, (PS8)"| AC | AdmCtrlFlag |   AIFS   |   CwMin   |   CwMax   | TXOPLimit |\n");
3113    os_error_printf(CU_MSG_INFO2, (PS8)"+----+-------------+----------+-----------+-----------+-----------+\n");
3114    os_error_printf(CU_MSG_INFO2, (PS8)"| %2d | %11d | %8d | %9d | %9d | %9d |\n",
3115            i,
3116            AcQosParams.uAssocAdmissionCtrlFlag,
3117            AcQosParams.uAIFS,
3118            AcQosParams.uCwMin,
3119            AcQosParams.uCwMax,
3120            AcQosParams.uTXOPLimit);
3121
3122    for (i=1; i<4; i++)
3123    {
3124        AcQosParams.uAC = i;
3125        if(OK != CuCommon_GetSetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_GET_AP_QOS_PARAMS,
3126            &AcQosParams, sizeof(AcQosParams))) return;
3127
3128        os_error_printf(CU_MSG_INFO2, (PS8)"| %2d | %11d | %8d | %9d | %9d | %9d |\n",
3129            i,
3130            AcQosParams.uAssocAdmissionCtrlFlag,
3131            AcQosParams.uAIFS,
3132            AcQosParams.uCwMin,
3133            AcQosParams.uCwMax,
3134            AcQosParams.uTXOPLimit);
3135    }
3136    os_error_printf(CU_MSG_INFO2, (PS8)"+----+-------------+----------+-----------+-----------+-----------+\n");
3137}
3138
3139VOID CuCmd_GetPsRxStreamingParams(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3140{
3141    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3142    TPsRxStreaming tPsRxStreaming;
3143    S32 i = 0;
3144
3145    os_error_printf(CU_MSG_INFO2, (PS8)"PS Rx Streaming Parameters:\n");
3146    os_error_printf(CU_MSG_INFO2, (PS8)"+-----+--------------+------------+---------+\n");
3147    os_error_printf(CU_MSG_INFO2, (PS8)"| TID | StreamPeriod | uTxTimeout | Enabled |\n");
3148    os_error_printf(CU_MSG_INFO2, (PS8)"+-----+--------------+------------+---------+\n");
3149
3150    for (i=0; i<8; i++)
3151    {
3152        tPsRxStreaming.uTid = i;
3153        if(OK != CuCommon_GetSetBuffer(pCuCmd->hCuCommon, QOS_MNGR_PS_RX_STREAMING,
3154            &tPsRxStreaming, sizeof(TPsRxStreaming))) return;
3155
3156        os_error_printf(CU_MSG_INFO2, (PS8)"| %3d | %12d | %10d | %7d |\n",
3157            tPsRxStreaming.uTid,
3158            tPsRxStreaming.uStreamPeriod,
3159            tPsRxStreaming.uTxTimeout,
3160            tPsRxStreaming.bEnabled);
3161    }
3162    os_error_printf(CU_MSG_INFO2, (PS8)"+-----+--------------+------------+---------+\n");
3163}
3164
3165VOID CuCmd_GetApQosCapabilities(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3166{
3167    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3168
3169    OS_802_11_AP_QOS_CAPABILITIES_PARAMS ApQosCapabiltiesParams;
3170
3171    if(OK != CuCommon_GetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_GET_AP_QOS_CAPABILITIES,
3172        &ApQosCapabiltiesParams, sizeof(OS_802_11_AP_QOS_CAPABILITIES_PARAMS))) return;
3173
3174    os_error_printf(CU_MSG_INFO2, (PS8)"AP Qos Capabilities:\n QOSFlag = %d\n APSDFlag = %d\n",
3175        ApQosCapabiltiesParams.uQOSFlag,
3176        ApQosCapabiltiesParams.uAPSDFlag);
3177
3178}
3179
3180VOID CuCmd_GetAcStatus(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3181{
3182    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3183    OS_802_11_AC_UPSD_STATUS_PARAMS AcStatusParams;
3184
3185    AcStatusParams.uAC = parm[0].value;
3186
3187    if(OK != CuCommon_GetSetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_GET_CURRENT_AC_STATUS,
3188        &AcStatusParams, sizeof(OS_802_11_AC_UPSD_STATUS_PARAMS))) return;
3189
3190    os_error_printf(CU_MSG_INFO2, (PS8)"AC %d Status:\n", AcStatusParams.uAC);
3191    os_error_printf(CU_MSG_INFO2, (PS8)"PS Scheme = %d (0=LEGACY, 1=UPSD)\n", AcStatusParams.uCurrentUAPSDStatus);
3192    os_error_printf(CU_MSG_INFO2, (PS8)"Admission Status = %d (0=NOT_ADMITTED, 1=WAIT_ADMISSION, 2=ADMITTED)\n", AcStatusParams.pCurrentAdmissionStatus);
3193}
3194
3195VOID CuCmd_ModifyMediumUsageTh(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3196{
3197    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3198    OS_802_11_THRESHOLD_CROSS_PARAMS ThCrossParams;
3199
3200    if (nParms == 3) /* If user supplied 3 parameters - this is a SET operation */
3201    {
3202        ThCrossParams.uAC = parm[0].value;
3203        ThCrossParams.uHighThreshold = parm[1].value;
3204        ThCrossParams.uLowThreshold = parm[2].value;
3205
3206        if (ThCrossParams.uLowThreshold > ThCrossParams.uHighThreshold)
3207        {
3208            os_error_printf(CU_MSG_INFO2, (PS8)"Low threshold cannot be higher than the High threshold...Aborting...\n");
3209            return;
3210        }
3211
3212        if(OK != CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_SET_MEDIUM_USAGE_THRESHOLD,
3213            &ThCrossParams, sizeof(OS_802_11_THRESHOLD_CROSS_PARAMS))) return;
3214
3215        os_error_printf(CU_MSG_INFO2, (PS8)"Medium usage threshold for AC %d has been set to:\n LowThreshold = %d\n HighThreshold = %d\n",
3216            ThCrossParams.uAC,
3217            ThCrossParams.uLowThreshold,
3218            ThCrossParams.uHighThreshold);
3219   }
3220   else if (nParms == 1) /* Only 1 parameter means a GET operation */
3221   {
3222        ThCrossParams.uAC = parm[0].value;
3223        ThCrossParams.uLowThreshold = 0;
3224        ThCrossParams.uHighThreshold = 0;
3225
3226        if(OK != CuCommon_GetSetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_GET_MEDIUM_USAGE_THRESHOLD,
3227            &ThCrossParams, sizeof(OS_802_11_THRESHOLD_CROSS_PARAMS))) return;
3228
3229        os_error_printf(CU_MSG_INFO2, (PS8)"Medium usage threshold for AC %d:\n LowThreshold = %d\n HighThreshold = %d\n",
3230            ThCrossParams.uAC,
3231            ThCrossParams.uLowThreshold,
3232            ThCrossParams.uHighThreshold);
3233   }
3234}
3235
3236
3237VOID CuCmd_GetDesiredPsMode(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3238{
3239    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3240    OS_802_11_QOS_DESIRED_PS_MODE DesiredPsMode;
3241
3242    if(OK != CuCommon_GetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_GET_DESIRED_PS_MODE,
3243        &DesiredPsMode, sizeof(OS_802_11_QOS_DESIRED_PS_MODE))) return;
3244
3245    os_error_printf(CU_MSG_INFO2, (PS8)"Desired PS Mode (0=PS_POLL, 1=UPSD, 2=PS_NONE):\n");
3246    os_error_printf(CU_MSG_INFO2, (PS8)"===============================================\n");
3247    os_error_printf(CU_MSG_INFO2, (PS8)"  +-----------+------+\n");
3248    os_error_printf(CU_MSG_INFO2, (PS8)"  |    AC     | Mode |\n");
3249    os_error_printf(CU_MSG_INFO2, (PS8)"  +-----------+------+\n");
3250    os_error_printf(CU_MSG_INFO2, (PS8)"  |  General  |  %d   |\n", DesiredPsMode.uDesiredPsMode);
3251    os_error_printf(CU_MSG_INFO2, (PS8)"  |   BE_AC   |  %d   |\n", DesiredPsMode.uDesiredWmeAcPsMode[QOS_AC_BE]);
3252    os_error_printf(CU_MSG_INFO2, (PS8)"  |   BK_AC   |  %d   |\n", DesiredPsMode.uDesiredWmeAcPsMode[QOS_AC_BK]);
3253    os_error_printf(CU_MSG_INFO2, (PS8)"  |   VI_AC   |  %d   |\n", DesiredPsMode.uDesiredWmeAcPsMode[QOS_AC_VI]);
3254    os_error_printf(CU_MSG_INFO2, (PS8)"  |   VO_AC   |  %d   |\n", DesiredPsMode.uDesiredWmeAcPsMode[QOS_AC_VO]);
3255    os_error_printf(CU_MSG_INFO2, (PS8)"  +-----------+------+\n");
3256}
3257
3258
3259VOID CuCmd_InsertClsfrEntry(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3260{
3261    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3262    clsfr_tableEntry_t newUserTableEntry;
3263    S32 i;
3264
3265    if (nParms >=2)
3266        newUserTableEntry.DTag = (U8) parm[1].value;
3267
3268    switch(parm[0].value)
3269    {
3270        case D_TAG_CLSFR:
3271            os_error_printf(CU_MSG_INFO2, (PS8)"Cannot insert D_TAG classifier entry!\n");
3272            return;
3273        case DSCP_CLSFR:
3274            if (nParms != 3)
3275            {
3276                os_error_printf(CU_MSG_INFO2, (PS8)"DSCP_CLSFR Entry type, wrong number of parameters(too many?)\n");
3277                return;
3278            }
3279            newUserTableEntry.Dscp.CodePoint = (U8) parm[2].value;
3280            os_error_printf(CU_MSG_INFO2, (PS8)"Inserting new DSCP_CLSFR classifier entry\nD-Tag = %d\nCodePoint = %d\n",newUserTableEntry.DTag,newUserTableEntry.Dscp.CodePoint);
3281            break;
3282        case PORT_CLSFR:
3283            if (nParms != 3)
3284            {
3285                os_error_printf(CU_MSG_INFO2, (PS8)"PORT_CLSFR Entry type, wrong number of parameters(too many?)\n");
3286                return;
3287            }
3288            newUserTableEntry.Dscp.DstPortNum = (U16) parm[2].value;
3289            os_error_printf(CU_MSG_INFO2, (PS8)"Inserting new PORT_CLSFR classifier entry\nD-Tag = %d\nPort = %d\n",newUserTableEntry.DTag,newUserTableEntry.Dscp.DstPortNum);
3290            break;
3291        case IPPORT_CLSFR:
3292            if (nParms != 7)
3293            {
3294                os_error_printf(CU_MSG_INFO2, (PS8)"PORT_CLSFR Entry type, wrong number of parameters\n");
3295                return;
3296            }
3297            newUserTableEntry.Dscp.DstIPPort.DstPortNum = (U16) parm[2].value;
3298            newUserTableEntry.Dscp.DstIPPort.DstIPAddress = 0;
3299            for(i=0; i<4; i++)
3300            {
3301                newUserTableEntry.Dscp.DstIPPort.DstIPAddress |= parm[i+3].value << i * 8;
3302            }
3303            os_error_printf(CU_MSG_INFO2, (PS8)"Inserting new IPPORT_CLSFR classifier entry\nD-Tag = %d\nPort = %d\nIP = %3d.%d.%d.%d\n",
3304                newUserTableEntry.DTag,
3305                newUserTableEntry.Dscp.DstIPPort.DstPortNum,
3306                (S32)parm[3].value,(S32)parm[4].value,(S32)parm[5].value,(S32)parm[6].value);
3307            break;
3308        default:
3309            os_error_printf(CU_MSG_INFO2, (PS8)"Unknown Classifier Type - Command aborted!\n");
3310            return;
3311    }
3312
3313    if(CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_CONFIG_TX_CLASS,
3314        &newUserTableEntry, sizeof(clsfr_tableEntry_t)))
3315    {
3316        os_error_printf(CU_MSG_INFO2, (PS8)"Failed to insert new classifier entry...\n");
3317    }
3318}
3319
3320VOID CuCmd_RemoveClsfrEntry(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3321{
3322    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3323    clsfr_tableEntry_t newUserTableEntry;
3324    S32 i;
3325
3326    if (nParms >=2)
3327        newUserTableEntry.DTag = (U8) parm[1].value;
3328
3329    switch(parm[0].value)
3330    {
3331        case D_TAG_CLSFR:
3332            os_error_printf(CU_MSG_INFO2, (PS8)"Cannot remove D_TAG classifier entry!\n");
3333            return;
3334        case DSCP_CLSFR:
3335            if (nParms != 3)
3336            {
3337                os_error_printf(CU_MSG_INFO2, (PS8)"DSCP_CLSFR Entry type, wrong number of parameters(too many?)\n");
3338                return;
3339            }
3340            newUserTableEntry.Dscp.CodePoint = (U8) parm[2].value;
3341            os_error_printf(CU_MSG_INFO2, (PS8)"Removing DSCP_CLSFR classifier entry\nD-Tag = %d\nCodePoint = %d\n",newUserTableEntry.DTag,newUserTableEntry.Dscp.CodePoint);
3342        break;
3343        case PORT_CLSFR:
3344            if (nParms != 3)
3345            {
3346                os_error_printf(CU_MSG_INFO2, (PS8)"PORT_CLSFR Entry type, wrong number of parameters(too many?)\n");
3347                return;
3348            }
3349            newUserTableEntry.Dscp.DstPortNum = (U16) parm[2].value;
3350            os_error_printf(CU_MSG_INFO2, (PS8)"Removing PORT_CLSFR classifier entry\nD-Tag = %d\nPort = %d\n",newUserTableEntry.DTag,newUserTableEntry.Dscp.DstPortNum);
3351        break;
3352        case IPPORT_CLSFR:
3353            if (nParms != 7)
3354            {
3355                os_error_printf(CU_MSG_INFO2, (PS8)"PORT_CLSFR Entry type, wrong number of parameters\n");
3356                return;
3357            }
3358            newUserTableEntry.Dscp.DstIPPort.DstPortNum = (U16) parm[2].value;
3359            newUserTableEntry.Dscp.DstIPPort.DstIPAddress = 0;
3360            for(i=0; i<4; i++)
3361                {
3362                    newUserTableEntry.Dscp.DstIPPort.DstIPAddress |= parm[i+3].value << i * 8;
3363                }
3364            os_error_printf(CU_MSG_INFO2, (PS8)"Removing IPPORT_CLSFR classifier entry\nD-Tag = %d\nPort = %d\nIP = %3d.%d.%d.%d\n",
3365                    newUserTableEntry.DTag,
3366                    newUserTableEntry.Dscp.DstIPPort.DstPortNum,
3367                    (S32)parm[3].value,(S32)parm[4].value,(S32)parm[5].value,(S32)parm[6].value);
3368            break;
3369        default:
3370            os_error_printf(CU_MSG_INFO2, (PS8)"Unknown Classifier Type - Command aborted!\n");
3371            return;
3372        break;
3373    }
3374
3375    if(CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_REMOVE_CLSFR_ENTRY,
3376        &newUserTableEntry, sizeof(clsfr_tableEntry_t)))
3377    {
3378       os_error_printf(CU_MSG_INFO2, (PS8)"Failed to remove classifier entry...\n");
3379    }
3380}
3381
3382
3383VOID CuCmd_SetPsRxDelivery(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3384{
3385    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3386    TPsRxStreaming tPsRxStreaming;
3387
3388    tPsRxStreaming.uTid          = parm[0].value;
3389    tPsRxStreaming.uStreamPeriod = parm[1].value;
3390    tPsRxStreaming.uTxTimeout    = parm[2].value;
3391    tPsRxStreaming.bEnabled      = parm[3].value;
3392
3393    if (CuCommon_SetBuffer(pCuCmd->hCuCommon, QOS_MNGR_PS_RX_STREAMING,
3394        &tPsRxStreaming, sizeof(TPsRxStreaming)) == OK)
3395    {
3396        os_error_printf(CU_MSG_INFO2, (PS8)"Sent PS Rx Delivery to driver...");
3397    }
3398    else
3399    {
3400        os_error_printf(CU_MSG_INFO2, (PS8)"Error: could not set PS Rx Delivery in driver...\n");
3401    }
3402    os_error_printf(CU_MSG_INFO2,
3403        (PS8)"TID = %d \n RxPeriod = %d \n TxTimeout = %d\n Enabled = %d\n",
3404        tPsRxStreaming.uTid,
3405        tPsRxStreaming.uStreamPeriod,
3406        tPsRxStreaming.uTxTimeout,
3407        tPsRxStreaming.bEnabled);
3408}
3409
3410
3411VOID CuCmd_SetQosParams(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3412{
3413    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3414    OS_802_11_QOS_PARAMS QosParams;
3415
3416    QosParams.acID=parm[0].value;
3417    QosParams.MaxLifeTime=parm[1].value;
3418    QosParams.PSDeliveryProtocol = parm[2].value;
3419
3420    if (CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_SET_QOS_PARAMS,
3421        &QosParams, sizeof(OS_802_11_QOS_PARAMS)) == OK)
3422    {
3423        os_error_printf(CU_MSG_INFO2, (PS8)"Sent QOS params to driver...\n AC Number=%d \n MaxLifeTime=%d \n PSDeliveryProtocol = %d\n",
3424            QosParams.acID,
3425            QosParams.MaxLifeTime,
3426            QosParams.PSDeliveryProtocol);
3427   }
3428   else
3429   {
3430        os_error_printf(CU_MSG_INFO2, (PS8)"Error: could not set QOS params...\n");
3431   }
3432}
3433
3434VOID CuCmd_SetRxTimeOut(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3435{
3436    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3437    OS_802_11_QOS_RX_TIMEOUT_PARAMS rxTimeOut;
3438
3439    rxTimeOut.psPoll = parm[0].value;
3440    rxTimeOut.UPSD   = parm[1].value;
3441
3442    if (nParms != 2)
3443    {
3444        os_error_printf(CU_MSG_INFO2, (PS8)"Please enter Rx Time Out:\n");
3445        os_error_printf(CU_MSG_INFO2, (PS8)"Param 0 - psPoll (0 - 65000)\n");
3446        os_error_printf(CU_MSG_INFO2, (PS8)"Param 1 - UPSD (1 - 65000)\n");
3447    }
3448    else
3449    {
3450        if(CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_SET_RX_TIMEOUT,
3451            &rxTimeOut, sizeof(OS_802_11_QOS_RX_TIMEOUT_PARAMS)) == OK)
3452        {
3453            os_error_printf(CU_MSG_INFO2, (PS8)"Sent QOS Rx TimeOut params to driver...\n PsPoll = %d\n UPSD = %d\n",
3454                rxTimeOut.psPoll,
3455                rxTimeOut.UPSD);
3456        }
3457        else
3458        {
3459            os_error_printf(CU_MSG_INFO2, (PS8)"Error: could not set Rx TimeOut..\n");
3460        }
3461    }
3462}
3463
3464VOID CuCmd_RegisterEvents(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3465{
3466    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3467
3468    if( nParms )
3469    {
3470        U32 event;
3471        S32 res, i;
3472
3473        event = (U32)parm[0].value;
3474
3475        CU_CMD_FIND_NAME_ARRAY(i, event_type, event);
3476        if(i == SIZE_ARR(event_type))
3477        {
3478            os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_RegisterEvents, event %d is not defined!\n", event);
3479            return;
3480        }
3481
3482        res = IpcEvent_EnableEvent(pCuCmd->hIpcEvent, event);
3483        if (res == EOALERR_IPC_EVENT_ERROR_EVENT_ALREADY_ENABLED)
3484        {
3485            CU_CMD_FIND_NAME_ARRAY(i, event_type, event);
3486            os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_RegisterEvents, event %s is already enabled!\n", event_type[i].name);
3487            return;
3488        }
3489
3490    }
3491    else
3492    {
3493        print_available_values(event_type);
3494    }
3495}
3496
3497VOID CuCmd_UnregisterEvents(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3498{
3499    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3500
3501    if( nParms )
3502    {
3503        U32 event;
3504        S32 res, i;
3505
3506        event = (U32)parm[0].value;
3507
3508        CU_CMD_FIND_NAME_ARRAY(i, event_type, event);
3509        if(i == SIZE_ARR(event_type))
3510        {
3511            os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_RegisterEvents, event %d is not defined!\n", event);
3512            return;
3513        }
3514
3515        res = IpcEvent_DisableEvent(pCuCmd->hIpcEvent, event);
3516        if (res == EOALERR_IPC_EVENT_ERROR_EVENT_ALREADY_DISABLED)
3517        {
3518            CU_CMD_FIND_NAME_ARRAY(i, event_type, event);
3519            os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_RegisterEvents, event %s is already disabled!\n", event_type[i].name);
3520            return;
3521        }
3522
3523    }
3524    else
3525    {
3526        print_available_values(event_type);
3527    }
3528}
3529
3530VOID CuCmd_EnableBtCoe(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3531{
3532    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3533    ESoftGeminiEnableModes BtMode;
3534    S32 i;
3535
3536    named_value_t BtCoe_Mode[] =
3537    {
3538        { SG_DISABLE,       (PS8)"Disable" },
3539        { SG_PROTECTIVE,    (PS8)"Protective" },
3540        { SG_OPPORTUNISTIC, (PS8)"Opportunistic" },
3541    };
3542
3543
3544    if(nParms)
3545    {
3546        CU_CMD_FIND_NAME_ARRAY(i, BtCoe_Mode, parm[0].value);
3547        if(i == SIZE_ARR(BtCoe_Mode))
3548        {
3549            os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_EnableBtCoe, mode %d is not defined!\n", parm[0].value);
3550            return;
3551        }
3552        BtMode = parm[0].value;
3553        CuCommon_SetU32(pCuCmd->hCuCommon, SOFT_GEMINI_SET_ENABLE, BtMode);
3554    }
3555    else
3556    {
3557        print_available_values(BtCoe_Mode);
3558    }
3559}
3560
3561VOID CuCmd_ConfigBtCoe(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3562{
3563    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3564    U32 Values[NUM_OF_CONFIG_PARAMS_IN_SG];
3565    U8 Index;
3566
3567    if( nParms != NUM_OF_CONFIG_PARAMS_IN_SG )
3568    {
3569		os_error_printf(CU_MSG_INFO2, (PS8)"Please enter <index (0,1..)> <value> \n");
3570
3571		os_error_printf(CU_MSG_INFO2, (PS8)"Param 0  - coexBtPerThreshold (0 - 10000000) PER threshold in PPM of the BT voice \n");
3572		os_error_printf(CU_MSG_INFO2, (PS8)"Param 1  - coexAutoScanCompensationMaxTime (0 - 10000000 usec)  \n");
3573		os_error_printf(CU_MSG_INFO2, (PS8)"Param 2  - coexBtNfsSampleInterval (1 - 65000 msec)  \n");
3574		os_error_printf(CU_MSG_INFO2, (PS8)"Param 3  - coexBtLoadRatio (0 - 100 %)  \n");
3575		os_error_printf(CU_MSG_INFO2, (PS8)"Param 4  - coexAutoPsMode (0 = Disabled, 1 = Enabled) Auto Power Save \n");
3576		os_error_printf(CU_MSG_INFO2, (PS8)"Param 5  - coexAutoScanEnlargedNumOfProbeReqPercent (%)  \n");
3577		os_error_printf(CU_MSG_INFO2, (PS8)"Param 6  - coexAutoScanEnlargedScanWindowPercent (%)  \n");
3578		os_error_printf(CU_MSG_INFO2, (PS8)"Param 7  - coexAntennaConfiguration (0 = Single, 1 = Dual)\n");
3579		os_error_printf(CU_MSG_INFO2, (PS8)"Param 8  - coexMaxConsecutiveBeaconMissPrecent (1 - 100 %) \n");
3580		os_error_printf(CU_MSG_INFO2, (PS8)"Param 9  - coexAPRateAdapationThr - rates (1 - 54)\n");
3581		os_error_printf(CU_MSG_INFO2, (PS8)"Param 10 - coexAPRateAdapationSnr 	  (-128 - 127)\n");
3582		os_error_printf(CU_MSG_INFO2, (PS8)"Param 11 - coexWlanPsBtAclMasterMinBR      (msec) \n");
3583		os_error_printf(CU_MSG_INFO2, (PS8)"Param 12 - coexWlanPsBtAclMasterMaxBR      (msec) \n");
3584		os_error_printf(CU_MSG_INFO2, (PS8)"Param 13 - coexWlanPsMaxBtAclMasterBR      (msec) \n");
3585		os_error_printf(CU_MSG_INFO2, (PS8)"Param 14 - coexWlanPsBtAclSlaveMinBR   	   (msec) \n");
3586		os_error_printf(CU_MSG_INFO2, (PS8)"Param 15 - coexWlanPsBtAclSlaveMaxBR  	   (msec) \n");
3587		os_error_printf(CU_MSG_INFO2, (PS8)"Param 16 - coexWlanPsMaxBtAclSlaveBR       (msec) \n");
3588        os_error_printf(CU_MSG_INFO2, (PS8)"Param 17 - coexWlanPsBtAclMasterMinEDR     (msec) \n");
3589		os_error_printf(CU_MSG_INFO2, (PS8)"Param 18 - coexWlanPsBtAclMasterMaxEDR     (msec) \n");
3590		os_error_printf(CU_MSG_INFO2, (PS8)"Param 19 - coexWlanPsMaxBtAclMasterEDR     (msec) \n");
3591		os_error_printf(CU_MSG_INFO2, (PS8)"Param 20 - coexWlanPsBtAclSlaveMinEDR      (msec) \n");
3592		os_error_printf(CU_MSG_INFO2, (PS8)"Param 21 - coexWlanPsBtAclSlaveMaxEDR  	   (msec) \n");
3593		os_error_printf(CU_MSG_INFO2, (PS8)"Param 22 - coexWlanPsMaxBtAclSlaveEDR      (msec) \n");
3594		os_error_printf(CU_MSG_INFO2, (PS8)"Param 23 - coexRxt                    (usec) \n");
3595		os_error_printf(CU_MSG_INFO2, (PS8)"Param 24 - coexTxt                    (usec) \n");
3596		os_error_printf(CU_MSG_INFO2, (PS8)"Param 25 - coexAdaptiveRxtTxt    	  (0 = Disable, 1 = Enable) \n");
3597		os_error_printf(CU_MSG_INFO2, (PS8)"Param 26 - coexPsPollTimeout          (msec) \n");
3598		os_error_printf(CU_MSG_INFO2, (PS8)"Param 27 - coexUpsdTimeout       	  (msec) \n");
3599		os_error_printf(CU_MSG_INFO2, (PS8)"Param 28 - coexWlanActiveBtAclMasterMinEDR (msec) \n");
3600		os_error_printf(CU_MSG_INFO2, (PS8)"Param 29 - coexWlanActiveBtAclMasterMaxEDR (msec) \n");
3601		os_error_printf(CU_MSG_INFO2, (PS8)"Param 30 - coexWlanActiveMaxBtAclMasterEDR (msec) \n");
3602        os_error_printf(CU_MSG_INFO2, (PS8)"Param 31 - coexWlanActiveBtAclSlaveMinEDR  (msec) \n");
3603		os_error_printf(CU_MSG_INFO2, (PS8)"Param 32 - coexWlanActiveBtAclSlaveMaxEDR  (msec) \n");
3604		os_error_printf(CU_MSG_INFO2, (PS8)"Param 33 - coexWlanActiveMaxBtAclSlaveEDR  (msec) \n");
3605		os_error_printf(CU_MSG_INFO2, (PS8)"Param 34 - coexWlanActiveBtAclMinBR        (msec) \n");
3606		os_error_printf(CU_MSG_INFO2, (PS8)"Param 35 - coexWlanActiveBtAclMaxBR        (msec) \n");
3607		os_error_printf(CU_MSG_INFO2, (PS8)"Param 36 - coexWlanActiveMaxBtAclBR        (msec) \n");
3608        os_error_printf(CU_MSG_INFO2, (PS8)"Param 37 - coexTempParam1 \n");
3609		os_error_printf(CU_MSG_INFO2, (PS8)"Param 38 - coexTempParam2 \n");
3610		os_error_printf(CU_MSG_INFO2, (PS8)"Param 39 - coexTempParam3 \n");
3611		os_error_printf(CU_MSG_INFO2, (PS8)"Param 40 - coexTempParam4 \n");
3612		os_error_printf(CU_MSG_INFO2, (PS8)"Param 41 - coexTempParam5 \n");
3613
3614		return;
3615    }
3616    if ((parm[0].value == SOFT_GEMINI_RATE_ADAPT_THRESH) && (CuCmd_IsValueRate(parm[1].value) == FALSE))
3617    {
3618        os_error_printf(CU_MSG_INFO2, (PS8)"Invalid rate - PHY rate valid values are: 1,2,5,6,9,11,12,18,24,36,48,54\n");
3619    }
3620    else
3621    {
3622        for (Index = 0; Index < NUM_OF_CONFIG_PARAMS_IN_SG; Index++ )
3623        {
3624            Values[Index] = parm[Index].value;
3625/* value[0] - parmater index, value[1] - parameter value */
3626        }
3627        CuCommon_SetBuffer(pCuCmd->hCuCommon, SOFT_GEMINI_SET_CONFIG, Values, sizeof(Values));
3628    }
3629}
3630
3631VOID CuCmd_GetBtCoeStatus(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3632{
3633    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3634    U32 uDummyBuf;
3635
3636    if(OK != CuCommon_GetBuffer(pCuCmd->hCuCommon, SOFT_GEMINI_GET_CONFIG,
3637            &uDummyBuf, sizeof(U32)))
3638    {
3639        return;
3640    }
3641}
3642
3643VOID CuCmd_ConfigCoexActivity(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3644{
3645    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3646    TCoexActivity tCoexActivity;
3647
3648    if( nParms != NUM_OF_COEX_ACTIVITY_PARAMS_IN_SG )
3649    {
3650		os_error_printf(CU_MSG_INFO2, (PS8)"Param 1 - coexIp          (0 - 1) BT-0, WLAN-1 \n");
3651		os_error_printf(CU_MSG_INFO2, (PS8)"Param 2 - activityId      (0 - 24)  \n");
3652		os_error_printf(CU_MSG_INFO2, (PS8)"Param 3 - defaultPriority (0 - 255)  \n");
3653		os_error_printf(CU_MSG_INFO2, (PS8)"Param 4 - raisedPriority  (0 - 255)  \n");
3654		os_error_printf(CU_MSG_INFO2, (PS8)"Param 5 - minService      (0 - 65535)  \n");
3655		os_error_printf(CU_MSG_INFO2, (PS8)"Param 6 - maxService      (0 - 65535)  \n");
3656    }
3657    else
3658    {
3659        tCoexActivity.coexIp          = (U8)parm[0].value;
3660        tCoexActivity.activityId      = (U8)parm[1].value;
3661        tCoexActivity.defaultPriority = (U8)parm[2].value;
3662        tCoexActivity.raisedPriority  = (U8)parm[3].value;
3663        tCoexActivity.minService      = (U16)parm[4].value;
3664        tCoexActivity.maxService      = (U16)parm[5].value;
3665
3666        CuCommon_SetBuffer(pCuCmd->hCuCommon, TWD_COEX_ACTIVITY_PARAM,
3667        &tCoexActivity, sizeof(tCoexActivity));
3668    }
3669}
3670
3671VOID CuCmd_ConfigFmCoex(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3672{
3673    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3674    TFmCoexParams tFmCoexParams;
3675
3676    if (nParms != 10)
3677    {
3678		os_error_printf(CU_MSG_INFO2, (PS8)"1 - Enable                   (0 - 1)  \n");
3679		os_error_printf(CU_MSG_INFO2, (PS8)"2 - SwallowPeriod            (0 - 255)  \n");
3680		os_error_printf(CU_MSG_INFO2, (PS8)"3 - NDividerFrefSet1         (0 - 255)  \n");
3681		os_error_printf(CU_MSG_INFO2, (PS8)"4 - NDividerFrefSet2         (0 - 255)  \n");
3682		os_error_printf(CU_MSG_INFO2, (PS8)"5 - MDividerFrefSet1         (0 - 65535)  \n");
3683		os_error_printf(CU_MSG_INFO2, (PS8)"6 - MDividerFrefSet2         (0 - 65535)  \n");
3684		os_error_printf(CU_MSG_INFO2, (PS8)"7 - CoexPllStabilizationTime (0 - 4294967295)  \n");
3685		os_error_printf(CU_MSG_INFO2, (PS8)"8 - LdoStabilizationTime     (0 - 65535)  \n");
3686		os_error_printf(CU_MSG_INFO2, (PS8)"9 - FmDisturbedBandMargin    (0 - 255)  \n");
3687		os_error_printf(CU_MSG_INFO2, (PS8)"10- SwallowClkDif            (0 - 255)  \n");
3688    }
3689    else
3690    {
3691        tFmCoexParams.uEnable                    = (TI_UINT8)parm[0].value;
3692        tFmCoexParams.uSwallowPeriod             = (TI_UINT8)parm[1].value;
3693        tFmCoexParams.uNDividerFrefSet1          = (TI_UINT8)parm[2].value;
3694        tFmCoexParams.uNDividerFrefSet2          = (TI_UINT8)parm[3].value;
3695        tFmCoexParams.uMDividerFrefSet1          = (TI_UINT16)parm[4].value;
3696        tFmCoexParams.uMDividerFrefSet2          = (TI_UINT16)parm[5].value;
3697        tFmCoexParams.uCoexPllStabilizationTime  = parm[6].value;
3698        tFmCoexParams.uLdoStabilizationTime      = (TI_UINT16)parm[7].value;
3699        tFmCoexParams.uFmDisturbedBandMargin     = (TI_UINT8)parm[8].value;
3700        tFmCoexParams.uSwallowClkDif             = (TI_UINT8)parm[9].value;
3701
3702        CuCommon_SetBuffer(pCuCmd->hCuCommon, TWD_FM_COEX_PARAM, &tFmCoexParams, sizeof(TFmCoexParams));
3703    }
3704}
3705
3706VOID CuCmd_SetPowerMode(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3707{
3708    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3709    TPowerMgr_PowerMode Mode;
3710    S32 i;
3711
3712    if( nParms )
3713    {
3714        CU_CMD_FIND_NAME_ARRAY(i, power_mode_val, parm[0].value);
3715        if(i == SIZE_ARR(power_mode_val))
3716        {
3717            os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_SetPowerMode, mode %d is not defined!\n", parm[0].value);
3718            return;
3719        }
3720        Mode.PowerMode = parm[0].value;
3721        Mode.PowerMngPriority = POWER_MANAGER_USER_PRIORITY;
3722        CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_POWER_MODE_SET,
3723            &Mode, sizeof(TPowerMgr_PowerMode));
3724    }
3725    else
3726    {
3727        if(!CuCommon_GetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_POWER_MODE_GET, &Mode, sizeof(TPowerMgr_PowerMode)))
3728        {
3729            os_error_printf(CU_MSG_INFO2, (PS8)"Power mode: %d\n", Mode.PowerMode);
3730            print_available_values(power_mode_val);
3731        }
3732    }
3733}
3734
3735VOID CuCmd_SetPowerSavePowerLevel(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3736{
3737    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3738    U32 PowerSavePowerLevel;
3739    S32 i;
3740
3741    if( nParms )
3742    {
3743        CU_CMD_FIND_NAME_ARRAY(i, power_level, parm[0].value);
3744        if(i == SIZE_ARR(power_level))
3745        {
3746            os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_SetPowerSavePowerLevel, level %d is not defined!\n", parm[0].value);
3747            return;
3748        }
3749        PowerSavePowerLevel = parm[0].value;
3750        CuCommon_SetU32(pCuCmd->hCuCommon, TIWLN_802_11_POWER_LEVEL_PS_SET, PowerSavePowerLevel);
3751    }
3752    else
3753    {
3754        if(!CuCommon_GetU32(pCuCmd->hCuCommon, TIWLN_802_11_POWER_LEVEL_PS_GET, &PowerSavePowerLevel))
3755        {
3756            CU_CMD_FIND_NAME_ARRAY(i, power_level, PowerSavePowerLevel);
3757            os_error_printf(CU_MSG_INFO2, (PS8)"Power Level PowerSave is: %s\n", power_level[i].name);
3758            print_available_values(power_level);
3759        }
3760    }
3761}
3762
3763VOID CuCmd_SetDefaultPowerLevel(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3764{
3765    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3766    U32 DefaultPowerLevel;
3767    S32 i;
3768
3769    if( nParms )
3770    {
3771        CU_CMD_FIND_NAME_ARRAY(i, power_level, parm[0].value);
3772        if(i == SIZE_ARR(power_level))
3773        {
3774            os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_SetDefaultPowerLevel, level %d is not defined!\n", parm[0].value);
3775            return;
3776        }
3777        DefaultPowerLevel = parm[0].value;
3778        CuCommon_SetU32(pCuCmd->hCuCommon, TIWLN_802_11_POWER_LEVEL_DEFAULT_SET, DefaultPowerLevel);
3779    }
3780    else
3781    {
3782        if(!CuCommon_GetU32(pCuCmd->hCuCommon, TIWLN_802_11_POWER_LEVEL_DEFAULT_GET, &DefaultPowerLevel))
3783        {
3784            CU_CMD_FIND_NAME_ARRAY(i, power_level, DefaultPowerLevel);
3785            os_error_printf(CU_MSG_INFO2, (PS8)"Power Level Default is: %s\n", power_level[i].name);
3786            print_available_values(power_level);
3787        }
3788    }
3789}
3790
3791VOID CuCmd_SetDozeModeInAutoPowerLevel(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3792{
3793    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3794    U32 DozeModeInAutoPowerLevel;
3795    S32 i;
3796
3797    if( nParms )
3798    {
3799        DozeModeInAutoPowerLevel = parm[0].value;
3800
3801        if((DozeModeInAutoPowerLevel > AUTO_POWER_MODE_DOZE_MODE_MAX_VALUE) || (DozeModeInAutoPowerLevel < AUTO_POWER_MODE_DOZE_MODE_MIN_VALUE))
3802        {
3803            os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_SetDozeModeInAutoPowerLevel, level %d is not defined!\n", DozeModeInAutoPowerLevel);
3804            return;
3805        }
3806        CuCommon_SetU32(pCuCmd->hCuCommon, TIWLN_802_11_POWER_LEVEL_DOZE_MODE_SET, DozeModeInAutoPowerLevel);
3807    }
3808    else
3809    {
3810        /* set Short or Long Doze. no use of other parameters */
3811        if(!CuCommon_GetU32(pCuCmd->hCuCommon, TIWLN_802_11_POWER_LEVEL_DOZE_MODE_GET, &DozeModeInAutoPowerLevel))
3812        {
3813            CU_CMD_FIND_NAME_ARRAY(i, power_mode_val, DozeModeInAutoPowerLevel);
3814            os_error_printf(CU_MSG_INFO2, (PS8)"Doze power level in auto mode is: %s\n", power_mode_val[i].name);
3815        }
3816    }
3817}
3818
3819VOID CuCmd_SetTrafficIntensityTh(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3820{
3821    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3822    OS_802_11_TRAFFIC_INTENSITY_THRESHOLD_PARAMS TrafficIntensityTh;
3823
3824    if (nParms == 3)
3825    {
3826        TrafficIntensityTh.uHighThreshold = parm[0].value;
3827        TrafficIntensityTh.uLowThreshold = parm[1].value;
3828        TrafficIntensityTh.TestInterval = parm[2].value;
3829
3830        if (TrafficIntensityTh.uLowThreshold >= TrafficIntensityTh.uHighThreshold)
3831        {
3832            os_error_printf(CU_MSG_ERROR, (PS8)"Error - CuCmd_SetTrafficIntensityTh - low threshold equal or greater than the high threshold...aborting...\n");
3833        }
3834
3835        if(OK == CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_SET_TRAFFIC_INTENSITY_THRESHOLDS,
3836            &TrafficIntensityTh, sizeof(OS_802_11_TRAFFIC_INTENSITY_THRESHOLD_PARAMS)))
3837        {
3838            os_error_printf(CU_MSG_INFO2, (PS8)"Successfully set traffic intensity thresholds...\n");
3839        }
3840        else
3841        {
3842            os_error_printf(CU_MSG_ERROR, (PS8)"Error - CuCmd_SetTrafficIntensityTh - cannot set thresholds\n");
3843        }
3844    }
3845    else if (nParms == 0)
3846    {
3847        if(OK == CuCommon_GetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_GET_TRAFFIC_INTENSITY_THRESHOLDS,
3848            &TrafficIntensityTh, sizeof(OS_802_11_TRAFFIC_INTENSITY_THRESHOLD_PARAMS)))
3849        {
3850            os_error_printf(CU_MSG_INFO2, (PS8)"Traffic intensity thresholds :\n HighThreshold = %d\n LowThreshold = %d\n TestInterval = %d\n",
3851                  TrafficIntensityTh.uHighThreshold,
3852                  TrafficIntensityTh.uLowThreshold,
3853                  TrafficIntensityTh.TestInterval);
3854        }
3855        else
3856        {
3857            os_error_printf (CU_MSG_ERROR, (PS8)"Error - CuCmd_SetTrafficIntensityTh - cannot get thresholds\n");
3858        }
3859    }
3860}
3861
3862VOID CuCmd_EnableTrafficEvents(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3863{
3864    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3865    if(OK != CuCommon_SetU32(pCuCmd->hCuCommon, TIWLN_802_11_TOGGLE_TRAFFIC_INTENSITY_EVENTS, TRUE) ) return;
3866    os_error_printf(CU_MSG_INFO2, (PS8)"Traffic intensity thresholds enabled...\n");
3867}
3868
3869VOID CuCmd_DisableTrafficEvents(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3870{
3871    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3872    if(OK != CuCommon_SetU32(pCuCmd->hCuCommon, TIWLN_802_11_TOGGLE_TRAFFIC_INTENSITY_EVENTS, FALSE) ) return;
3873    os_error_printf(CU_MSG_INFO2, (PS8)"Traffic intensity thresholds disabled...\n");
3874}
3875
3876
3877VOID CuCmd_LogAddReport(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3878{
3879    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3880    U8 ModuleTable[REPORT_FILES_NUM], ModuleValue[REPORT_FILES_NUM] = {0};
3881    int index = 0;
3882
3883    os_memcpy((THandle)ModuleValue, (THandle)(parm[0].value), nParms);
3884
3885    for (index = 0; index < REPORT_FILES_NUM; index ++)
3886    {
3887        if (ModuleValue[index] == '1')
3888        {
3889            ModuleTable[index] = '1';
3890        }
3891        else
3892        {
3893            ModuleTable[index] = '0';
3894        }
3895    }
3896    CuCommon_SetBuffer(pCuCmd->hCuCommon, REPORT_MODULE_TABLE_PARAM, ModuleTable, REPORT_FILES_NUM);
3897}
3898
3899VOID CuCmd_LogReportSeverityLevel(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3900{
3901    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3902    U8 SeverityTable[REPORT_SEVERITY_MAX];
3903    S32 index = 0;
3904    PS8 SeverityValue = (PS8)(parm[0].value);
3905
3906    /* Get the current report severity */
3907    if (!CuCommon_GetBuffer(pCuCmd->hCuCommon, REPORT_SEVERITY_TABLE_PARAM, SeverityTable, REPORT_SEVERITY_MAX))
3908    {
3909        if(nParms == 0)
3910        {
3911            S32 i;
3912
3913            os_error_printf(CU_MSG_INFO2, (PS8)"Severity:\n");
3914            os_error_printf(CU_MSG_INFO2, (PS8)"-------------------------------\n");
3915            os_error_printf(CU_MSG_INFO2, (PS8)"%14s\tState\t%s\n", (PS8)"Severity level", (PS8)"Desc");
3916
3917            for( i=1; i<SIZE_ARR(report_severity); i++ )
3918            {
3919                os_error_printf(CU_MSG_INFO2, (PS8)"%d\t%c\t%s\n", report_severity[i].value, (SeverityTable[i] == '1') ? '+' : ' ', report_severity[i].name );
3920            }
3921
3922            os_error_printf(CU_MSG_INFO2, (PS8)"* Use '0' to clear all table.\n");
3923            os_error_printf(CU_MSG_INFO2, (PS8)"* Use '%d' (max index) to set all table.\n", REPORT_SEVERITY_MAX);
3924        }
3925        else
3926        {
3927            for (index = 0; index < REPORT_SEVERITY_MAX; index ++)
3928            {
3929                if (SeverityValue[index] == '0')
3930                {
3931                    SeverityTable[index] = '0';
3932                }
3933                else
3934                {
3935                    SeverityTable[index] = '1';
3936                }
3937            }
3938            CuCommon_SetBuffer(pCuCmd->hCuCommon, REPORT_SEVERITY_TABLE_PARAM, SeverityTable, REPORT_SEVERITY_MAX);
3939        }
3940    }
3941    else
3942    {
3943        os_error_printf(CU_MSG_ERROR, (PS8)"Error retriving the severity table from the driver\n");
3944    }
3945}
3946
3947VOID CuCmd_SetReport(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3948{
3949    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3950    U8 *pModuleTable = (U8 *)parm[0].value;
3951
3952    if( nParms != 1)
3953    {
3954        U8 ModuleTable[REPORT_FILES_NUM];
3955        S32 i;
3956
3957        if (!CuCommon_GetBuffer(pCuCmd->hCuCommon, TIWLN_REPORT_MODULE_GET, ModuleTable, REPORT_FILES_NUM))
3958        {
3959            os_error_printf(CU_MSG_INFO2, (PS8)"-------------------------------\n");
3960            os_error_printf(CU_MSG_INFO2, (PS8)"%.5s\tState\t %s\n", (PS8)"Index", (PS8)"Desc");
3961
3962            for( i = 0; i < SIZE_ARR(report_module); i++)
3963            {
3964                /* Check if there is string content (the first character is not ZERO) */
3965                if( report_module[i].name[0] )
3966                {
3967                    U8 module_num = (U8) report_module[i].value;
3968                    os_error_printf(CU_MSG_INFO2, (PS8)"%3d\t%c\t%s\n",
3969                         module_num,
3970                         (ModuleTable[module_num] == '1') ? '+' : ' ',
3971                         report_module[i].name );
3972                }
3973            }
3974        }
3975        else
3976        {
3977            os_error_printf(CU_MSG_ERROR, (PS8)"Error reading the report table form the driver\n");
3978        }
3979    }
3980    else
3981    {
3982        CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_REPORT_MODULE_SET, pModuleTable, REPORT_FILES_NUM);
3983    }
3984}
3985
3986VOID CuCmd_AddReport(THandle hCuCmd, ConParm_t parm[], U16 nParms)
3987{
3988    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
3989    U8 ModuleTable[REPORT_FILES_NUM];
3990
3991    if( nParms != 1)
3992    {
3993        S32 i;
3994        if (!CuCommon_GetBuffer(pCuCmd->hCuCommon, TIWLN_REPORT_MODULE_GET, ModuleTable, REPORT_FILES_NUM))
3995        {
3996            os_error_printf(CU_MSG_INFO2, (PS8)"-------------------------------\n");
3997            os_error_printf(CU_MSG_INFO2, (PS8)"%.5s\tState\t %s\n", (PS8)"Index", (PS8)"Desc");
3998
3999            for( i = 0; i < SIZE_ARR(report_module); i++)
4000            {
4001                /* Check if there is string content (the first character is not ZERO) */
4002                if( report_module[i].name[0] )
4003                {
4004                    os_error_printf(CU_MSG_INFO2, (PS8)"%3d\t%c\t%s\n", report_module[i].value, (ModuleTable[i] == '1') ? '+' : ' ', report_module[i].name );
4005                }
4006            }
4007        }
4008        else
4009        {
4010            os_error_printf(CU_MSG_ERROR, (PS8)"Error reading the report table form the driver\n");
4011        }
4012        os_error_printf(CU_MSG_INFO2, (PS8)"* Use '%d' (max index) to set all table.\n", REPORT_FILES_NUM);
4013    }
4014    else if(!CuCommon_GetBuffer(pCuCmd->hCuCommon, TIWLN_REPORT_MODULE_GET, ModuleTable, REPORT_FILES_NUM))
4015    {
4016        if (parm[0].value == REPORT_FILES_NUM)
4017        {
4018            os_memset(ModuleTable, '1', REPORT_FILES_NUM);
4019        }
4020        else if(parm[0].value < REPORT_FILES_NUM)
4021        {
4022            ModuleTable[parm[0].value] = '1';
4023        }
4024        CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_REPORT_MODULE_SET, ModuleTable, REPORT_FILES_NUM);
4025    }
4026}
4027
4028VOID CuCmd_ClearReport(THandle hCuCmd, ConParm_t parm[], U16 nParms)
4029{
4030    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
4031    U8 ModuleTable[REPORT_FILES_NUM];
4032
4033    if( nParms != 1)
4034    {
4035        S32 i;
4036        if (!CuCommon_GetBuffer(pCuCmd->hCuCommon, TIWLN_REPORT_MODULE_GET, ModuleTable, REPORT_FILES_NUM))
4037        {
4038            os_error_printf(CU_MSG_INFO2, (PS8)"-------------------------------\n");
4039            os_error_printf(CU_MSG_INFO2, (PS8)"%.5s\tState\t %s\n", (PS8)"Index", (PS8)"Desc");
4040
4041            for( i = 0; i < SIZE_ARR(report_module); i++)
4042            {
4043                /* Check if there is string content (the first character is not ZERO) */
4044                if( report_module[i].name[0] )
4045                {
4046                    os_error_printf(CU_MSG_INFO2, (PS8)"%3d\t%c\t%s\n", report_module[i].value, (ModuleTable[i] == '1') ? '+' : ' ', report_module[i].name );
4047                }
4048            }
4049        }
4050        else
4051        {
4052            os_error_printf(CU_MSG_ERROR, (PS8)"Error reading the report table form the driver\n");
4053        }
4054        os_error_printf(CU_MSG_INFO2, (PS8)"* Use '%d' (max index) to clear all table.\n", REPORT_FILES_NUM);
4055    }
4056    else if(!CuCommon_GetBuffer(pCuCmd->hCuCommon, TIWLN_REPORT_MODULE_GET, ModuleTable, REPORT_FILES_NUM))
4057    {
4058        if (parm[0].value == REPORT_FILES_NUM)
4059        {
4060            os_memset(ModuleTable, '0', REPORT_FILES_NUM);
4061        }
4062        else if(parm[0].value < REPORT_FILES_NUM)
4063        {
4064            ModuleTable[parm[0].value] = '0';
4065        }
4066        CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_REPORT_MODULE_SET, ModuleTable, REPORT_FILES_NUM);
4067    }
4068}
4069
4070VOID CuCmd_ReportSeverityLevel(THandle hCuCmd, ConParm_t parm[], U16 nParms)
4071{
4072    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
4073    U8 SeverityTable[REPORT_SEVERITY_MAX];
4074
4075    /* Get the current report severity */
4076    if (!CuCommon_GetBuffer(pCuCmd->hCuCommon, TIWLN_REPORT_SEVERITY_GET, SeverityTable, REPORT_SEVERITY_MAX))
4077    {
4078        if(nParms == 0)
4079        {
4080            S32 i;
4081
4082            os_error_printf(CU_MSG_INFO2, (PS8)"Severity:\n");
4083            os_error_printf(CU_MSG_INFO2, (PS8)"-------------------------------\n");
4084            os_error_printf(CU_MSG_INFO2, (PS8)"%14s\tState\t%s\n", (PS8)"Severity level", (PS8)"Desc");
4085
4086            for( i=1; i<SIZE_ARR(report_severity); i++ )
4087            {
4088                os_error_printf(CU_MSG_INFO2, (PS8)"%d\t%c\t%s\n", report_severity[i].value, (SeverityTable[i] == '1') ? '+' : ' ', report_severity[i].name );
4089            }
4090
4091            os_error_printf(CU_MSG_INFO2, (PS8)"* Use '0' to clear all table.\n");
4092            os_error_printf(CU_MSG_INFO2, (PS8)"* Use '%d' (max index) to set all table.\n", REPORT_SEVERITY_MAX);
4093        }
4094        else
4095        {
4096            if (parm[0].value == 0)
4097            {
4098                /* Disable all severity levels */
4099                os_memset(SeverityTable, '0', sizeof(SeverityTable));
4100                CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_REPORT_SEVERITY_SET, SeverityTable, REPORT_SEVERITY_MAX);
4101            }
4102            else if (parm[0].value == REPORT_SEVERITY_MAX)
4103            {
4104                /* Enable all severity levels */
4105                os_memset(SeverityTable, '1', sizeof(SeverityTable));
4106                CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_REPORT_SEVERITY_SET, SeverityTable, REPORT_SEVERITY_MAX);
4107            }
4108            else if (parm[0].value < REPORT_SEVERITY_MAX)
4109            {
4110                os_error_printf(CU_MSG_INFO2, (PS8)"Toggle severity level %#lx\n", parm[0].value);
4111                if (SeverityTable[parm[0].value] == '1')
4112                {
4113                    /* The level is enabled - Disable it */
4114                    SeverityTable[parm[0].value] = '0';
4115                }
4116                else
4117                {
4118                    /* The bit is disabled - Enable it */
4119                    SeverityTable[parm[0].value] = '1';
4120                }
4121                CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_REPORT_SEVERITY_SET, SeverityTable, REPORT_SEVERITY_MAX);
4122            }
4123            else
4124            {
4125                os_error_printf(CU_MSG_INFO2, (PS8)"invalid level value: %#lx\n", parm[0].value );
4126            }
4127        }
4128    }
4129    else
4130    {
4131        os_error_printf(CU_MSG_ERROR, (PS8)"Error retriving the severity table from the driver\n");
4132    }
4133}
4134
4135VOID CuCmd_SetReportLevelCLI(THandle hCuCmd, ConParm_t parm[], U16 nParms)
4136{
4137#if 0 /* need to create debug logic for CLI */
4138    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
4139    S32 i, cli_debug_level;
4140
4141    if(nParms)
4142    {
4143        cli_debug_level = parm[0].value;
4144        /* check if the param is valid */
4145        CU_CMD_FIND_NAME_ARRAY(i, cli_level_type, cli_debug_level);
4146        if(i == SIZE_ARR(cli_level_type))
4147        {
4148            os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_SetReportLevelCLI, cli_debug_level %d is not defined!\n", cli_debug_level);
4149            return;
4150        }
4151
4152        g_debug_level = cli_debug_level;
4153        IpcEvent_UpdateDebugLevel(pCuCmd->hIpcEvent, cli_debug_level);
4154        os_error_printf(CU_MSG_INFO2, (PS8)"set CLI debug value = %s \n", cli_level_type[i].name);
4155    }
4156    else
4157    {
4158        cli_debug_level = g_debug_level;
4159        CU_CMD_FIND_NAME_ARRAY(i, cli_level_type, cli_debug_level);
4160        os_error_printf(CU_MSG_INFO2, (PS8)"CLI debug value = %s (%d)\n", cli_level_type[i].name, cli_debug_level);
4161        print_available_values(cli_level_type);
4162    }
4163#endif
4164}
4165
4166
4167char* SkipSpaces(char* str)
4168{
4169	char* tmp = str;
4170
4171	while(*tmp == ' ') tmp++;
4172	return tmp;
4173}
4174
4175#define ti_isdigit(c)      ('0' <= (c) && (c) <= '9')
4176#define ti_islower(c)      ('a' <= (c) && (c) <= 'z')
4177#define ti_toupper(c)      (ti_islower(c) ? ((c) - 'a' + 'A') : (c))
4178
4179#define ti_isxdigit(c)   (('0' <= (c) && (c) <= '9') \
4180                         || ('a' <= (c) && (c) <= 'f') \
4181                         || ('A' <= (c) && (c) <= 'F'))
4182
4183#define ti_atol(x) strtoul(x, 0)
4184
4185
4186unsigned long ti_strtoul(char *cp, char** endp, unsigned int base)
4187{
4188	unsigned long result = 0, value;
4189
4190	if (!base) {
4191		  base = 10;
4192		  if (*cp == '0') {
4193				  base = 8;
4194				  cp++;
4195				  if ((ti_toupper(*cp) == 'X') && ti_isxdigit(cp[1])) {
4196						  cp++;
4197						  base = 16;
4198				  }
4199		  }
4200	} else if (base == 16) {
4201		  if (cp[0] == '0' && ti_toupper(cp[1]) == 'X')
4202				  cp += 2;
4203	}
4204	while (ti_isxdigit(*cp) &&
4205			(value = ti_isdigit(*cp) ? *cp-'0' : ti_toupper(*cp)-'A'+10) < base) {
4206			result = result*base + value;
4207			 cp++;
4208	}
4209
4210	if(endp)
4211		*endp = (char *)cp;
4212
4213	return result;
4214}
4215
4216
4217VOID CuCmd_FwDebug(THandle hCuCmd, ConParm_t parm[], U16 nParms)
4218{
4219	CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
4220	U32 *buf_ptr, *pbuf;
4221	char *pstr = (char *)parm[0].value;
4222	U32 parm_length;
4223
4224	os_error_printf(CU_MSG_INFO2, (PS8)"FwDebug parm: %s\n", parm[0].value);
4225
4226	buf_ptr = (U32*)os_MemoryCAlloc(252, sizeof(U32));
4227	if(!buf_ptr)
4228		return;
4229
4230	pbuf = buf_ptr + 2;
4231
4232	pstr = SkipSpaces(pstr);
4233	while(*pstr) {
4234		*pbuf++ =  ti_strtoul(pstr, &pstr, 0);
4235		pstr = SkipSpaces(pstr);
4236	}
4237
4238	parm_length = (U32)((U8*)pbuf-(U8*)buf_ptr);
4239
4240	os_error_printf(CU_MSG_INFO2, (PS8)"Parms buf size = %d\n", parm_length);
4241
4242	*buf_ptr = 2210;
4243	*(buf_ptr+1) = parm_length - 2*sizeof(U32);
4244
4245	CuCommon_PrintDriverDebug(pCuCmd->hCuCommon, (PVOID)buf_ptr, parm_length);
4246
4247	os_MemoryFree(buf_ptr);
4248
4249}
4250
4251VOID CuCmd_SetRateMngDebug(THandle hCuCmd, ConParm_t parm[], U16 nParms)
4252{
4253    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
4254    RateMangeParams_t     RateParams;
4255
4256	RateParams.paramIndex = (TI_UINT8)parm[0].value;
4257
4258
4259    if( nParms == 2 )
4260    {
4261		switch (RateParams.paramIndex)
4262		{
4263		case RATE_MGMT_RETRY_SCORE_PARAM:
4264			RateParams.RateRetryScore = (TI_UINT16)parm[1].value;
4265			break;
4266		case RATE_MGMT_PER_ADD_PARAM:
4267			RateParams.PerAdd = (TI_UINT16)parm[1].value;
4268			break;
4269		case RATE_MGMT_PER_TH1_PARAM:
4270			RateParams.PerTh1 = (TI_UINT16)parm[1].value;
4271			break;
4272		case RATE_MGMT_PER_TH2_PARAM:
4273			RateParams.PerTh2 = (TI_UINT16)parm[1].value;
4274			break;
4275		case RATE_MGMT_MAX_PER_PARAM:
4276			RateParams.MaxPer = (TI_UINT16)parm[1].value;
4277			break;
4278		case RATE_MGMT_INVERSE_CURIOSITY_FACTOR_PARAM:
4279			RateParams.InverseCuriosityFactor = (TI_UINT8)parm[1].value;
4280			break;
4281		case RATE_MGMT_TX_FAIL_LOW_TH_PARAM:
4282			RateParams.TxFailLowTh = (TI_UINT8)parm[1].value;
4283			break;
4284		case RATE_MGMT_TX_FAIL_HIGH_TH_PARAM:
4285			RateParams.TxFailHighTh = (TI_UINT8)parm[1].value;
4286			break;
4287		case RATE_MGMT_PER_ALPHA_SHIFT_PARAM:
4288			RateParams.PerAlphaShift = (TI_UINT8)parm[1].value;
4289			break;
4290		case RATE_MGMT_PER_ADD_SHIFT_PARAM:
4291			RateParams.PerAddShift = (TI_UINT8)parm[1].value;
4292			break;
4293		case RATE_MGMT_PER_BETA1_SHIFT_PARAM:
4294			RateParams.PerBeta1Shift = (TI_UINT8)parm[1].value;
4295			break;
4296		case RATE_MGMT_PER_BETA2_SHIFT_PARAM:
4297			RateParams.PerBeta2Shift = (TI_UINT8)parm[1].value;
4298			break;
4299		case RATE_MGMT_RATE_CHECK_UP_PARAM:
4300			RateParams.RateCheckUp = (TI_UINT8)parm[1].value;
4301			break;
4302		case RATE_MGMT_RATE_CHECK_DOWN_PARAM:
4303			RateParams.RateCheckDown = (TI_UINT8)parm[1].value;
4304			break;
4305		default:
4306			os_error_printf(CU_MSG_INFO2,"Error: index is not valid! \n");
4307			return;
4308
4309		}
4310	}
4311	else if ((nParms == NUM_OF_RATE_MNGT_PARAMS_MAX) && (parm[0].value == RATE_MGMT_RATE_RETRY_POLICY_PARAM ))
4312	{
4313		int i=0;
4314		for (i=1; i < NUM_OF_RATE_MNGT_PARAMS_MAX; i++)
4315		{
4316			RateParams.RateRetryPolicy[i-1] = (TI_UINT8)parm[i].value;
4317		}
4318    }
4319    else
4320    {
4321           os_error_printf(CU_MSG_INFO2,"(0)  RateMngRateRetryScore \n");
4322           os_error_printf(CU_MSG_INFO2,"(1)  RateMngPerAdd \n");
4323           os_error_printf(CU_MSG_INFO2,"(2)  RateMngPerTh1 \n");
4324           os_error_printf(CU_MSG_INFO2,"(3)  RateMngPerTh2 \n");
4325		   os_error_printf(CU_MSG_INFO2,"(4)  RateMngMaxPer \n");
4326           os_error_printf(CU_MSG_INFO2,"(5)  RateMngInverseCuriosityFactor \n");
4327           os_error_printf(CU_MSG_INFO2,"(6)  RateMngTxFailLowTh \n");
4328		   os_error_printf(CU_MSG_INFO2,"(7)  RateMngTxFailHighTh \n");
4329           os_error_printf(CU_MSG_INFO2,"(8)  RateMngPerAlphaShift \n");
4330           os_error_printf(CU_MSG_INFO2,"(9)  RateMngPerAddShift \n");
4331           os_error_printf(CU_MSG_INFO2,"(10) RateMngPerBeta1Shift \n");
4332           os_error_printf(CU_MSG_INFO2,"(11) RateMngPerBeta2Shift \n");
4333           os_error_printf(CU_MSG_INFO2,"(12) RateMngRateCheckUp \n");
4334		   os_error_printf(CU_MSG_INFO2,"(13) RateMngRateCheckDown \n");
4335		   os_error_printf(CU_MSG_INFO2,"(14) RateMngRateRetryPolicy[13] \n");
4336		   return;
4337    }
4338
4339	CuCommon_SetBuffer(pCuCmd->hCuCommon, TIWLN_RATE_MNG_SET,&RateParams, sizeof(RateMangeParams_t));
4340}
4341
4342VOID CuCmd_GetRateMngDebug(THandle hCuCmd, ConParm_t parm[], U16 nParms)
4343{
4344    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
4345    AcxRateMangeParams ReadRateParams;
4346	int i;
4347
4348    os_memset(&ReadRateParams,0,sizeof(AcxRateMangeParams));
4349
4350    CuCommon_GetBuffer(pCuCmd->hCuCommon, TIWLN_RATE_MNG_GET, &ReadRateParams, sizeof(AcxRateMangeParams));
4351
4352	if (0 == nParms)
4353	{
4354		parm[0].value =  RATE_MGMT_ALL_PARAMS;
4355	}
4356
4357	 switch (parm[0].value)
4358		{
4359		case RATE_MGMT_RETRY_SCORE_PARAM:
4360			os_error_printf(CU_MSG_INFO2,"RateMngRateRetryScore = %d \n", ReadRateParams.RateRetryScore);
4361			break;
4362		case RATE_MGMT_PER_ADD_PARAM:
4363			os_error_printf(CU_MSG_INFO2,"RateMngPerAdd = %d\n" , ReadRateParams.PerAdd);
4364			break;
4365		case RATE_MGMT_PER_TH1_PARAM:
4366			os_error_printf(CU_MSG_INFO2,"RateMngPerTh1 = %d\n" , ReadRateParams.PerTh1);
4367			break;
4368		case RATE_MGMT_PER_TH2_PARAM:
4369			os_error_printf(CU_MSG_INFO2,"RateMngPerTh2 = %d\n" , ReadRateParams.PerTh2);
4370			break;
4371		case RATE_MGMT_MAX_PER_PARAM:
4372			os_error_printf(CU_MSG_INFO2,"RateMngMaxPer = %d\n" , ReadRateParams.MaxPer);
4373			break;
4374		case RATE_MGMT_INVERSE_CURIOSITY_FACTOR_PARAM:
4375			os_error_printf(CU_MSG_INFO2,"RateMngInverseCuriosityFactor = %d \n" , ReadRateParams.InverseCuriosityFactor);
4376			break;
4377		case RATE_MGMT_TX_FAIL_LOW_TH_PARAM:
4378			os_error_printf(CU_MSG_INFO2,"RateMngTxFailLowTh = %d\n" , ReadRateParams.TxFailLowTh);
4379			break;
4380		case RATE_MGMT_TX_FAIL_HIGH_TH_PARAM:
4381			os_error_printf(CU_MSG_INFO2,"RateMngTxFailHighTh = %d\n" , ReadRateParams.TxFailHighTh);
4382			break;
4383		case RATE_MGMT_PER_ALPHA_SHIFT_PARAM:
4384			os_error_printf(CU_MSG_INFO2,"RateMngPerAlphaShift = %d\n" , ReadRateParams.PerAlphaShift);
4385			break;
4386		case RATE_MGMT_PER_ADD_SHIFT_PARAM:
4387			os_error_printf(CU_MSG_INFO2,"RateMngPerAddShift = %d\n" , ReadRateParams.PerAddShift);
4388			break;
4389		case RATE_MGMT_PER_BETA1_SHIFT_PARAM:
4390			os_error_printf(CU_MSG_INFO2,"RateMngPerBeta1Shift = %d\n" , ReadRateParams.PerBeta1Shift);
4391			break;
4392		case RATE_MGMT_PER_BETA2_SHIFT_PARAM:
4393			os_error_printf(CU_MSG_INFO2,"RateMngPerBeta2Shift = %d\n" , ReadRateParams.PerBeta2Shift);
4394			break;
4395		case RATE_MGMT_RATE_CHECK_UP_PARAM:
4396			os_error_printf(CU_MSG_INFO2,"RateMngRateCheckUp = %d\n" , ReadRateParams.RateCheckUp);
4397			break;
4398		case RATE_MGMT_RATE_CHECK_DOWN_PARAM:
4399			os_error_printf(CU_MSG_INFO2,"RateMngRateCheckDown = %d\n" , ReadRateParams.RateCheckDown);
4400			break;
4401	    case RATE_MGMT_RATE_RETRY_POLICY_PARAM:
4402			os_error_printf(CU_MSG_INFO2,"RateMngRateRetryPolicy = ");
4403
4404			for (i=0 ; i< RATE_MNG_MAX_RETRY_POLICY_PARAMS_LEN ; i++)
4405			{
4406				os_error_printf(CU_MSG_INFO2,"%d ",ReadRateParams.RateRetryPolicy[i]);
4407			}
4408
4409			os_error_printf(CU_MSG_INFO2,"\n");
4410
4411			break;
4412
4413	    case RATE_MGMT_ALL_PARAMS:
4414		   os_error_printf(CU_MSG_INFO2,"RateMngRateRetryScore = %d \n", ReadRateParams.RateRetryScore);
4415           os_error_printf(CU_MSG_INFO2,"RateMngPerAdd = %d\n" , ReadRateParams.PerAdd);
4416           os_error_printf(CU_MSG_INFO2,"RateMngPerTh1 = %d\n" , ReadRateParams.PerTh1);
4417           os_error_printf(CU_MSG_INFO2,"RateMngPerTh2 = %d\n" , ReadRateParams.PerTh2);
4418		   os_error_printf(CU_MSG_INFO2,"RateMngMaxPer = %d\n" , ReadRateParams.MaxPer);
4419           os_error_printf(CU_MSG_INFO2,"RateMngInverseCuriosityFactor = %d \n" , ReadRateParams.InverseCuriosityFactor);
4420           os_error_printf(CU_MSG_INFO2,"RateMngTxFailLowTh = %d\n" , ReadRateParams.TxFailLowTh);
4421		   os_error_printf(CU_MSG_INFO2,"RateMngTxFailHighTh = %d\n" , ReadRateParams.TxFailHighTh);
4422           os_error_printf(CU_MSG_INFO2,"RateMngPerAlphaShift = %d\n" , ReadRateParams.PerAlphaShift);
4423           os_error_printf(CU_MSG_INFO2,"RateMngPerAddShift = %d\n" , ReadRateParams.PerAddShift);
4424           os_error_printf(CU_MSG_INFO2,"RateMngPerBeta1Shift = %d\n" , ReadRateParams.PerBeta1Shift);
4425           os_error_printf(CU_MSG_INFO2,"RateMngPerBeta2Shift = %d\n" , ReadRateParams.PerBeta2Shift);
4426           os_error_printf(CU_MSG_INFO2,"RateMngRateCheckUp = %d\n" , ReadRateParams.RateCheckUp);
4427		   os_error_printf(CU_MSG_INFO2,"RateMngRateCheckDown = %d\n" , ReadRateParams.RateCheckDown);
4428		   os_error_printf(CU_MSG_INFO2,"RateMngRateRetryPolicy = ");
4429
4430			for (i=0 ; i< RATE_MNG_MAX_RETRY_POLICY_PARAMS_LEN ; i++)
4431			{
4432				os_error_printf(CU_MSG_INFO2,"%d ",ReadRateParams.RateRetryPolicy[i]);
4433			}
4434			os_error_printf(CU_MSG_INFO2,"\n");
4435		 break;
4436
4437		default:
4438			os_error_printf(CU_MSG_INFO2,"Error: index is not valid! \n");
4439			return;
4440	 }
4441
4442}
4443
4444
4445VOID CuCmd_PrintDriverDebug(THandle hCuCmd, ConParm_t parm[], U16 nParms)
4446{
4447    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
4448	U32 size		= 0;
4449	TTwdDebug data;
4450
4451	/* check if nParam is invalid */
4452	if (( nParms == 0 ) || ( nParms > 4 ))
4453	{
4454		os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_PrintDriverDebug: Invalid number of Parameters %d\n", nParms);
4455		return;
4456	}
4457
4458	/* init */
4459    os_memset( &data.debug_data.mem_debug.UBuf.buf8, 0, sizeof(data.debug_data.mem_debug.UBuf.buf8) );
4460	data.func_id 						= parm[0].value;
4461	size								= sizeof(data.func_id);
4462
4463	os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_PrintDriverDebug: FUN_ID: %u\n", data.func_id);
4464
4465	/* if R reg request - read data */
4466    if ( nParms == 2 )
4467	{
4468        data.debug_data.opt_param = 4;
4469		data.debug_data.opt_param = parm[1].value;
4470		size += sizeof(data.debug_data.opt_param);
4471	}
4472    else
4473	/* if W reg request - read data */
4474	if ( nParms > 2 )
4475	{
4476        data.debug_data.mem_debug.addr 		= 0;
4477
4478        data.debug_data.mem_debug.length 	= 4;
4479        size += sizeof(data.debug_data.mem_debug.length);
4480
4481        data.debug_data.mem_debug.addr = parm[1].value;
4482        size += sizeof(data.debug_data.mem_debug.addr);
4483
4484        data.debug_data.mem_debug.UBuf.buf32[0] = parm[2].value;
4485        size += sizeof(data.debug_data.mem_debug.UBuf.buf32[0]);
4486
4487		os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_PrintDriverDebug: addr: 0x%x\n", data.debug_data.opt_param);
4488        os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_PrintDriverDebug: data: 0x%x\n", data.debug_data.mem_debug.UBuf.buf32[0]);
4489	}
4490	CuCommon_PrintDriverDebug(pCuCmd->hCuCommon, (PVOID)&data, size);
4491}
4492
4493VOID CuCmd_PrintDriverDebugBuffer(THandle hCuCmd, ConParm_t parm[], U16 nParms)
4494{
4495    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
4496
4497    U32 func_id = ( nParms > 0 ) ? parm[0].value : 0;
4498    U32 opt_param = ( nParms > 1 ) ? parm[1].value : 0;
4499
4500    os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_PrintDriverDebugBuffer: FUNC:%u, PARAM:%u\n", func_id, opt_param);
4501
4502    CuCommon_PrintDriverDebugBuffer(pCuCmd->hCuCommon, func_id, opt_param);
4503}
4504
4505/*-------------------*/
4506/* Radio Debug Tests */
4507/*-------------------*/
4508/* Set the RX channel --> Radio Tune */
4509VOID CuCmd_RadioDebug_ChannelTune(THandle hCuCmd, ConParm_t parm[], U16 nParms)
4510{
4511    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
4512    TPowerMgr_PowerMode Mode;
4513    TTestCmd data;
4514
4515    if ((nParms == 0) || (nParms > 2))
4516    {
4517        os_error_printf(CU_MSG_INFO2, (PS8)"Param 0 - Band (0-2.4Ghz, 1-5Ghz, 2-4.9Ghz)\n");
4518        os_error_printf(CU_MSG_INFO2, (PS8)"Param 1 - Channel\n");
4519    }
4520    else
4521    {
4522        if(OK != CuCommon_GetBuffer(pCuCmd->hCuCommon, TIWLN_802_11_POWER_MODE_GET,
4523            &Mode, sizeof(TPowerMgr_PowerMode))) return;
4524        if(Mode.PowerMode != OS_POWER_MODE_ACTIVE)
4525        {
4526            os_error_printf(CU_MSG_INFO2, (PS8)"Radio tune was not performed becouse Default power-mode is not ACTIVE\n");
4527        }
4528        else
4529        {
4530			os_memset(&data, 0, sizeof(TTestCmd));
4531			data.testCmdId 						= TEST_CMD_CHANNEL_TUNE;
4532			data.testCmd_u.Channel.iChannel 	= (U8)parm[1].value;
4533			data.testCmd_u.Channel.iBand 		= (U8)parm[0].value;
4534
4535			if(OK != CuCommon_Radio_Test(pCuCmd->hCuCommon, &data))
4536			{
4537				os_error_printf(CU_MSG_INFO2, (PS8)"Channel %d tune failed\n",data.testCmd_u.Channel.iChannel);
4538				return;
4539			}
4540            os_error_printf(CU_MSG_INFO2, (PS8)"Channel tune of channel %d was performed OK\n",(U8)data.testCmd_u.Channel.iChannel);
4541        }
4542    }
4543}
4544
4545/* Start CW test (TELEC) */
4546VOID CuCmd_RadioDebug_StartTxCw(THandle hCuCmd, ConParm_t parm[], U16 nParms)
4547{
4548	CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
4549	TTestCmd data;
4550
4551	/* check # of params OK */
4552    if ((nParms == 0) || (nParms > 2))
4553    {
4554		/* print help */
4555        os_error_printf(CU_MSG_INFO2, (PS8)"Param 0  - Power (0-25000 1/1000 db)\n");
4556        os_error_printf(CU_MSG_INFO2, (PS8)"Param 1  - Tone Type (1-Single Tone, 2-Carrier Feed Through)\n");
4557
4558/*        os_error_printf(CU_MSG_INFO2, (PS8)"Param 2  - Band\n");
4559        os_error_printf(CU_MSG_INFO2, (PS8)"Param 3  - Channel\n");
4560        os_error_printf(CU_MSG_INFO2, (PS8)"Param 4  - PPA Step\n");
4561        os_error_printf(CU_MSG_INFO2, (PS8)"Param 5  - Tone no. Single Tones\n");
4562        os_error_printf(CU_MSG_INFO2, (PS8)"Param 6  - Tone no. Two Tones\n");
4563        os_error_printf(CU_MSG_INFO2, (PS8)"Param 7  - Use digital DC\n");
4564        os_error_printf(CU_MSG_INFO2, (PS8)"Param 8  - Invert\n");
4565        os_error_printf(CU_MSG_INFO2, (PS8)"Param 9  - Eleven N Span\n");
4566        os_error_printf(CU_MSG_INFO2, (PS8)"Param 10 - Digital DC\n");
4567        os_error_printf(CU_MSG_INFO2, (PS8)"Param 11 - Analog DC Fine\n");
4568        os_error_printf(CU_MSG_INFO2, (PS8)"Param 12 - Analog DC Course\n");*/
4569    }
4570    else
4571    {
4572		os_memset(&data, 0, sizeof(TTestCmd));
4573		data.testCmdId 										= TEST_CMD_TELEC;
4574        data.testCmd_u.TxToneParams.iPower 					= (U16)parm[0].value;
4575        data.testCmd_u.TxToneParams.iToneType 				= (U8)parm[1].value;
4576/*		data.testCmd_u.TxToneParams.iPpaStep 				= (U8)parm[4].value;
4577		data.testCmd_u.TxToneParams.iToneNumberSingleTones 	= (U8)parm[5].value;
4578		data.testCmd_u.TxToneParams.iToneNumberTwoTones 	= (U8)parm[6].value;
4579		data.testCmd_u.TxToneParams.iUseDigitalDC 			= (U8)parm[7].value;
4580		data.testCmd_u.TxToneParams.iInvert 				= (U8)parm[8].value;
4581		data.testCmd_u.TxToneParams.iElevenNSpan 			= (U8)parm[9].value;
4582		data.testCmd_u.TxToneParams.iDigitalDC 				= (U8)parm[10].value;
4583		data.testCmd_u.TxToneParams.iAnalogDCFine 			= (U8)parm[11].value;
4584		data.testCmd_u.TxToneParams.iAnalogDCCoarse 		= (U8)parm[12].value;*/
4585
4586		if(OK != CuCommon_Radio_Test(pCuCmd->hCuCommon, &data))
4587		{
4588			os_error_printf(CU_MSG_INFO2, (PS8)"CW test failed\n");
4589			return;
4590		}
4591        os_error_printf(CU_MSG_INFO2, (PS8)"CW test was performed OK\n");
4592    }
4593}
4594
4595/* Start TX continues test (FCC) */
4596VOID CuCmd_RadioDebug_StartContinuousTx(THandle hCuCmd, ConParm_t parm[], U16 nParms)
4597{
4598    TMacAddr mac_addr_mask 	= { 0xff,0xff,0xff,0xff,0xff,0xff };
4599	CuCmd_t* pCuCmd 		= (CuCmd_t*)hCuCmd;
4600	TTestCmd data;
4601
4602    if ((nParms == 0) || (nParms > 15))
4603    {
4604		/* print help */
4605        os_error_printf(CU_MSG_INFO2, (PS8)"\n");
4606        os_error_printf(CU_MSG_INFO2, (PS8)"Param 0 - Delay\n");
4607		os_error_printf(CU_MSG_INFO2, (PS8)"Param 1 - Rate\n");
4608		os_error_printf(CU_MSG_INFO2, (PS8)"Param 2  - Size\n");
4609		os_error_printf(CU_MSG_INFO2, (PS8)"Param 3  - Amount\n");
4610		os_error_printf(CU_MSG_INFO2, (PS8)"Param 4  - Power\n");
4611		os_error_printf(CU_MSG_INFO2, (PS8)"Param 5  - Seed\n");
4612		os_error_printf(CU_MSG_INFO2, (PS8)"Param 6  - Packet Mode\n");
4613		os_error_printf(CU_MSG_INFO2, (PS8)"Param 7  - DCF On/Off\n");
4614		os_error_printf(CU_MSG_INFO2, (PS8)"Param 8  - GI\n");
4615		os_error_printf(CU_MSG_INFO2, (PS8)"Param 9  - Preamble\n");
4616		os_error_printf(CU_MSG_INFO2, (PS8)"Param 10 - Type\n");
4617		os_error_printf(CU_MSG_INFO2, (PS8)"Param 11 - Scrambler\n");
4618		os_error_printf(CU_MSG_INFO2, (PS8)"Param 12 - Enable CLPC\n");
4619		os_error_printf(CU_MSG_INFO2, (PS8)"Param 13 - Sequance no. Mode\n");
4620        /* future use. for now the oregenal source address are use.
4621        os_error_printf(CU_MSG_INFO2, (PS8)"Param 14 - Source MAC Address\n");
4622        */
4623		os_error_printf(CU_MSG_INFO2, (PS8)"Param 14 - Destination MAC Address\n");
4624    }
4625    else
4626    {
4627		os_memset(&data, 0, sizeof(TTestCmd));
4628		data.testCmdId = TEST_CMD_FCC;
4629		data.testCmd_u.TxPacketParams.iDelay 			= (U32)parm[0].value;
4630		data.testCmd_u.TxPacketParams.iRate 			= (U32)parm[1].value;
4631		data.testCmd_u.TxPacketParams.iSize 			= (U16)parm[2].value;
4632		data.testCmd_u.TxPacketParams.iAmount 			= (U16)parm[3].value;
4633		data.testCmd_u.TxPacketParams.iPower 			= (U16)parm[4].value;
4634		data.testCmd_u.TxPacketParams.iSeed 			= (U16)parm[5].value;
4635		data.testCmd_u.TxPacketParams.iPacketMode 		= (U8)parm[6].value;
4636		data.testCmd_u.TxPacketParams.iDcfOnOff 		= (U8)parm[7].value;
4637		data.testCmd_u.TxPacketParams.iGI 				= (U8)parm[8].value;
4638		data.testCmd_u.TxPacketParams.iPreamble 		= (U8)parm[9].value;
4639		data.testCmd_u.TxPacketParams.iType 			= (U8)parm[10].value;
4640		data.testCmd_u.TxPacketParams.iScrambler 		= (U8)parm[11].value;
4641		data.testCmd_u.TxPacketParams.iEnableCLPC 		= (U8)parm[12].value;
4642		data.testCmd_u.TxPacketParams.iSeqNumMode 		= (U8)parm[13].value;
4643        /* future use. for now the oregenal source address are use.
4644        if(!CuCmd_Str2MACAddr((PS8)parm[16].value, (PU8)mac_addr_mask) )
4645		{
4646			os_error_printf(CU_MSG_INFO2, (PS8)"Continuous Tx start has failed to read source MAC Address \n");
4647			return;
4648		}
4649        */
4650		os_memcpy((PVOID)data.testCmd_u.TxPacketParams.iSrcMacAddr,
4651				  (PVOID)mac_addr_mask,
4652				  sizeof(mac_addr_mask));
4653		if(!CuCmd_Str2MACAddr((PS8)parm[14].value, (PU8)mac_addr_mask) )
4654		{
4655			os_error_printf(CU_MSG_INFO2, (PS8)"Continuous Tx start has failed to read destination MAC Address \n");
4656			return;
4657		}
4658		os_memcpy((PVOID)data.testCmd_u.TxPacketParams.iDstMacAddr,
4659				  (PVOID)mac_addr_mask,
4660				  sizeof(mac_addr_mask));
4661
4662        if(OK != CuCommon_Radio_Test(pCuCmd->hCuCommon, &data))
4663		{
4664			os_error_printf(CU_MSG_INFO2, (PS8)"Continuous Tx start has failed\n");
4665			return;
4666		}
4667        os_error_printf(CU_MSG_INFO2, (PS8)"Continuous Tx started OK\n");
4668   }
4669}
4670
4671/* Stop FCC/TELEC (Radio Debug) */
4672VOID CuCmd_RadioDebug_StopTx(THandle hCuCmd, ConParm_t parm[], U16 nParms)
4673{
4674    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
4675    TTestCmd data;
4676
4677    os_memset(&data, 0, sizeof(TTestCmd));
4678    data.testCmdId = TEST_CMD_STOP_TX;
4679
4680	if(OK != CuCommon_Radio_Test(pCuCmd->hCuCommon, &data))
4681	{
4682        os_error_printf(CU_MSG_INFO2, (PS8)"Plt Tx Stop has failed\n");
4683		return;
4684	}
4685	os_error_printf(CU_MSG_INFO2, (PS8)"Plt Tx Stop was OK\n");
4686}
4687
4688/* download packet template for transmissions
4689	the template shall be set before calling TX Debug */
4690VOID CuCmd_RadioDebug_Template(THandle hCuCmd, ConParm_t parm[], U16 nParms)
4691{
4692    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
4693    TTestCmd data;
4694
4695    if ((nParms == 0) || (nParms > 3))
4696    {
4697		/* print help */
4698        os_error_printf(CU_MSG_INFO2, (PS8)"\n");
4699		os_error_printf(CU_MSG_INFO2, (PS8)"Param 1 	- Buffer Offset\n");
4700		os_error_printf(CU_MSG_INFO2, (PS8)"Param 2 	- Buffer Data\n");
4701	}
4702	else
4703	{
4704		os_memset(&data, 0, sizeof(TTestCmd));
4705		data.testCmdId 									= TEST_CMD_PLT_TEMPLATE;
4706		data.testCmd_u.TxTemplateParams.bufferOffset 	= (U16)parm[0].value;
4707		data.testCmd_u.TxTemplateParams.bufferLength	= (U16)os_strlen((PS8)parm[1].value);
4708		/* check that length is valid */
4709		if( data.testCmd_u.TxTemplateParams.bufferOffset + data.testCmd_u.TxTemplateParams.bufferLength > TX_TEMPLATE_MAX_BUF_LEN )
4710		{
4711			os_error_printf(CU_MSG_INFO2, (PS8)"Plt Template has failed because of invalid buffer length\n");
4712			return;
4713		}
4714		/* convert the string to hexadeciaml values, and copy it */
4715		CuCmd_atox_string ((U8*)parm[1].value,(U8*)data.testCmd_u.TxTemplateParams.buffer);
4716
4717		if(OK != CuCommon_Radio_Test(pCuCmd->hCuCommon, &data))
4718		{
4719			os_error_printf(CU_MSG_INFO2, (PS8)"Plt Template has failed\n");
4720			return;
4721		}
4722		os_error_printf(CU_MSG_INFO2, (PS8)"Plt Template was OK\n");
4723	}
4724}
4725
4726
4727/* Start RX Statistics */
4728VOID CuCmd_RadioDebug_StartRxStatistics(THandle hCuCmd, ConParm_t parm[], U16 nParms)
4729{
4730    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
4731    TTestCmd data;
4732
4733    os_memset(&data, 0, sizeof(TTestCmd));
4734    data.testCmdId = TEST_CMD_RX_STAT_START;
4735
4736	if(OK != CuCommon_Radio_Test(pCuCmd->hCuCommon, &data))
4737    {
4738		os_error_printf(CU_MSG_INFO2, (PS8)"Start RX Statistics has failed\n");
4739		return;
4740    }
4741	os_error_printf(CU_MSG_INFO2, (PS8)"Start RX Statistics OK\n");
4742}
4743
4744/* Stop RX Statistics */
4745VOID CuCmd_RadioDebug_StopRxStatistics(THandle hCuCmd, ConParm_t parm[], U16 nParms)
4746{
4747    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
4748    TTestCmd data;
4749
4750    os_memset(&data, 0, sizeof(TTestCmd));
4751    data.testCmdId = TEST_CMD_RX_STAT_STOP;
4752
4753	if(OK != CuCommon_Radio_Test(pCuCmd->hCuCommon, &data))
4754    {
4755		os_error_printf(CU_MSG_INFO2, (PS8)"Stop RX Statistics has failed\n");
4756		return;
4757    }
4758	os_error_printf(CU_MSG_INFO2, (PS8)"Stop RX Statistics OK\n");
4759}
4760
4761/* Reset RX Statistics */
4762VOID CuCmd_RadioDebug_ResetRxStatistics(THandle hCuCmd, ConParm_t parm[], U16 nParms)
4763{
4764    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
4765    TTestCmd data;
4766
4767    os_memset(&data, 0, sizeof(TTestCmd));
4768    data.testCmdId = TEST_CMD_RX_STAT_RESET;
4769
4770	if(OK != CuCommon_Radio_Test(pCuCmd->hCuCommon, &data))
4771    {
4772		os_error_printf(CU_MSG_INFO2, (PS8)"Reset RX Statistics has failed\n");
4773		return;
4774    }
4775	os_error_printf(CU_MSG_INFO2, (PS8)"Reset RX Statistics OK\n");
4776}
4777
4778
4779/* Get HDK Version*/
4780VOID CuCmd_RadioDebug_GetHDKVersion(THandle hCuCmd, ConParm_t parm[], U16 nParms)
4781{
4782	CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
4783	TTestCmd data;
4784
4785	os_memset(&data, 0, sizeof(TTestCmd));
4786
4787	data.testCmdId = TEST_CMD_GET_FW_VERSIONS;
4788	if(OK != CuCommon_Radio_Test(pCuCmd->hCuCommon, &data))
4789	{
4790		os_error_printf(CU_MSG_INFO2, (PS8)"Get FW version function has failed\n");
4791		return;
4792	}
4793	os_error_printf(CU_MSG_INFO2, (PS8)"ProductName:                       %d\n", data.testCmd_u.fwVersions.hdkVersion.ProductName);
4794	os_error_printf(CU_MSG_INFO2, (PS8)"PgNumber:                          %d\n", data.testCmd_u.fwVersions.hdkVersion.PgNumber);
4795	os_error_printf(CU_MSG_INFO2, (PS8)"SoftwareVersionLevel:              %d\n", data.testCmd_u.fwVersions.hdkVersion.SoftwareVersionLevel);
4796	os_error_printf(CU_MSG_INFO2, (PS8)"radioModuleType:                   %d\n", data.testCmd_u.fwVersions.hdkVersion.radioModuleType);
4797	os_error_printf(CU_MSG_INFO2, (PS8)"SoftwareVersionDelivery:           %d\n", data.testCmd_u.fwVersions.hdkVersion.SoftwareVersionDelivery);
4798	os_error_printf(CU_MSG_INFO2, (PS8)"numberOfReferenceDesignsSupported: %d\n", data.testCmd_u.fwVersions.hdkVersion.numberOfReferenceDesignsSupported);
4799#ifdef FIX_HDK_VERSION_API /* HDK version struct should be changed aligned and without pointer */
4800	os_error_printf(CU_MSG_INFO2, (PS8)"referenceDesignsSupported->referenceDesignId: %d\n",    data.testCmd_u.fwVersions.hdkVersion.referenceDesignsSupported->referenceDesignId);
4801	os_error_printf(CU_MSG_INFO2, (PS8)"referenceDesignsSupported->nvsMajorVersion: %d\n",      data.testCmd_u.fwVersions.hdkVersion.referenceDesignsSupported->nvsMajorVersion);
4802	os_error_printf(CU_MSG_INFO2, (PS8)"referenceDesignsSupported->nvsMinorVersion: %d\n",      data.testCmd_u.fwVersions.hdkVersion.referenceDesignsSupported->nvsMinorVersion);
4803	os_error_printf(CU_MSG_INFO2, (PS8)"referenceDesignsSupported->nvsMinorMinorVersion: %d\n", data.testCmd_u.fwVersions.hdkVersion.referenceDesignsSupported->nvsMinorMinorVersion);
4804#endif
4805}
4806
4807/* Get RX Statistics */
4808VOID CuCmd_RadioDebug_GetRxStatistics(THandle hCuCmd, ConParm_t parm[], U16 nParms)
4809{
4810#if 0 /*Temp: currently not supported*/
4811	U32 i 			= 0;
4812#endif
4813
4814    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
4815    TTestCmd data;
4816
4817    os_memset(&data, 0, sizeof(TTestCmd));
4818    data.testCmdId = TEST_CMD_RX_STAT_GET;
4819
4820	if(OK != CuCommon_Radio_Test(pCuCmd->hCuCommon, &data))
4821    {
4822		os_error_printf(CU_MSG_INFO2, (PS8)"Get RX Statistics has failed\n");
4823		return;
4824    }
4825	/* print Statistics Got */
4826	os_error_printf(CU_MSG_INFO2, (PS8)"\n");
4827	os_error_printf(CU_MSG_INFO2, (PS8)"Received Valid Packet no.: %d(0x%x)\n", data.testCmd_u.Statistics.oRxPathStatistics.ReceivedValidPacketsNumber,data.testCmd_u.Statistics.oRxPathStatistics.ReceivedValidPacketsNumber);
4828	os_error_printf(CU_MSG_INFO2, (PS8)"Received FCS Error Packet no.: %d(0x%x)\n", data.testCmd_u.Statistics.oRxPathStatistics.ReceivedFcsErrorPacketsNumber,data.testCmd_u.Statistics.oRxPathStatistics.ReceivedFcsErrorPacketsNumber);
4829	os_error_printf(CU_MSG_INFO2, (PS8)"Received Address mismatched packet: %d(0x%x)\n", data.testCmd_u.Statistics.oRxPathStatistics.ReceivedPlcpErrorPacketsNumber,data.testCmd_u.Statistics.oRxPathStatistics.ReceivedPlcpErrorPacketsNumber);
4830	os_error_printf(CU_MSG_INFO2, (PS8)"Sequance Nomber Missing Count: %d(0x%x)\n", data.testCmd_u.Statistics.oRxPathStatistics.SeqNumMissCount,data.testCmd_u.Statistics.oRxPathStatistics.SeqNumMissCount);
4831	/* The RSSI and SNR are in octal units, the value divided by 8 for the print */
4832	os_error_printf(CU_MSG_INFO2, (PS8)"Average SNR: %d(0x%x)\n", data.testCmd_u.Statistics.oRxPathStatistics.AverageSnr/8,data.testCmd_u.Statistics.oRxPathStatistics.AverageSnr/8);
4833	os_error_printf(CU_MSG_INFO2, (PS8)"Average RSSI: %d(0x%x)\n", (data.testCmd_u.Statistics.oRxPathStatistics.AverageRssi)/8,(data.testCmd_u.Statistics.oRxPathStatistics.AverageRssi)/8);
4834	os_error_printf(CU_MSG_INFO2, (PS8)"Base Packet ID: %d(0x%x)\n", data.testCmd_u.Statistics.oBasePacketId,data.testCmd_u.Statistics.oBasePacketId);
4835	os_error_printf(CU_MSG_INFO2, (PS8)"Number of Packets: %d(0x%x)\n", data.testCmd_u.Statistics.ioNumberOfPackets,data.testCmd_u.Statistics.ioNumberOfPackets);
4836	os_error_printf(CU_MSG_INFO2, (PS8)"Number of Missed Packets: %d(0x%x)\n", data.testCmd_u.Statistics.oNumberOfMissedPackets,data.testCmd_u.Statistics.oNumberOfMissedPackets);
4837#if 0/*Temp: currently not supported*/
4838	for ( i = 0 ; i < RX_STAT_PACKETS_PER_MESSAGE ; i++ )
4839	{
4840		os_error_printf(CU_MSG_INFO2, (PS8)"RX Packet %d Statistics\n",i);
4841		os_error_printf(CU_MSG_INFO2, (PS8)"Length: %d(0x%x)\n", data.testCmd_u.Statistics.RxPacketStatistics[i].Length,data.testCmd_u.Statistics.RxPacketStatistics[i].Length);
4842		os_error_printf(CU_MSG_INFO2, (PS8)"EVM: %d(0x%x)\n", data.testCmd_u.Statistics.RxPacketStatistics[i].EVM,data.testCmd_u.Statistics.RxPacketStatistics[i].EVM);
4843		os_error_printf(CU_MSG_INFO2, (PS8)"RSSI: %d(0x%x)\n", data.testCmd_u.Statistics.RxPacketStatistics[i].RSSI,data.testCmd_u.Statistics.RxPacketStatistics[i].RSSI);
4844		os_error_printf(CU_MSG_INFO2, (PS8)"Frequency Delta: %d(0x%x)\n", data.testCmd_u.Statistics.RxPacketStatistics[i].FrequencyDelta,data.testCmd_u.Statistics.RxPacketStatistics[i].FrequencyDelta);
4845		os_error_printf(CU_MSG_INFO2, (PS8)"Flags: %d(0x%x)\n", data.testCmd_u.Statistics.RxPacketStatistics[i].Flags,data.testCmd_u.Statistics.RxPacketStatistics[i].Flags);
4846		os_error_printf(CU_MSG_INFO2, (PS8)"Type: %d(0x%x)\n", data.testCmd_u.Statistics.RxPacketStatistics[i].Type,data.testCmd_u.Statistics.RxPacketStatistics[i].Type);
4847		os_error_printf(CU_MSG_INFO2, (PS8)"Rate: %d(0x%x)\n", data.testCmd_u.Statistics.RxPacketStatistics[i].Rate,data.testCmd_u.Statistics.RxPacketStatistics[i].Rate);
4848		os_error_printf(CU_MSG_INFO2, (PS8)"Noise: %d(0x%x)\n", data.testCmd_u.Statistics.RxPacketStatistics[i].Noise,data.testCmd_u.Statistics.RxPacketStatistics[i].Noise);
4849		os_error_printf(CU_MSG_INFO2, (PS8)"AGC Gain: %d(0x%x)\n", data.testCmd_u.Statistics.RxPacketStatistics[i].AgcGain,data.testCmd_u.Statistics.RxPacketStatistics[i].AgcGain);
4850	}
4851#endif
4852}
4853
4854
4855/*-----------*/
4856/* BIP Tests */
4857/*-----------*/
4858
4859
4860void FillMACAddressToNVS(THandle hCuCmd, FILE *nvsBinFile)
4861{
4862	CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
4863	TMacAddr Mac;
4864	U8	lengthToSet;
4865	U8	addressHigher;
4866	U8	addressLower;
4867	U8	valueToSet=0;
4868
4869	lengthToSet = 0x1;
4870
4871
4872	os_error_printf(CU_MSG_INFO2, (PS8)"Entering FillMACAddressToNVS\n");
4873	/* param 0 in nvs*/
4874	os_fwrite(&lengthToSet, sizeof(U8), 1, nvsBinFile);
4875
4876	/* register for MAC Address*/
4877	addressHigher	= 0x6D;
4878	addressLower	= 0x54;
4879
4880	/* param 1 in nvs*/
4881	os_fwrite(&addressHigher, sizeof(U8), 1, nvsBinFile);
4882	/* param 2 in nvs*/
4883	os_fwrite(&addressLower, sizeof(U8), 1, nvsBinFile);
4884
4885
4886   /*	read mac address */
4887	if(OK != CuCommon_GetBuffer(pCuCmd->hCuCommon, CTRL_DATA_MAC_ADDRESS, Mac, sizeof(TMacAddr)))
4888	{
4889		os_error_printf(CU_MSG_INFO2, (PS8)"Unable  to get Mac address, aborting\n");
4890		return;
4891	}
4892	os_error_printf(CU_MSG_INFO2, (PS8)"Mac[0]=%02x\n", Mac[0]);
4893	os_error_printf(CU_MSG_INFO2, (PS8)"Mac[1]=%02x\n", Mac[1]);
4894	os_error_printf(CU_MSG_INFO2, (PS8)"Mac[2]=%02x\n", Mac[2]);
4895	os_error_printf(CU_MSG_INFO2, (PS8)"Mac[3]=%02x\n", Mac[3]);
4896	os_error_printf(CU_MSG_INFO2, (PS8)"Mac[4]=%02x\n", Mac[4]);
4897	os_error_printf(CU_MSG_INFO2, (PS8)"Mac[5]=%02x\n", Mac[5]);
4898
4899	/* write the lower MAC address starting from the LSB
4900	   params 3-6 in NVS*/
4901	os_fwrite(&Mac[5], sizeof(U8), 1, nvsBinFile);
4902	os_fwrite(&Mac[4], sizeof(U8), 1, nvsBinFile);
4903	os_fwrite(&Mac[3], sizeof(U8), 1, nvsBinFile);
4904	os_fwrite(&Mac[2], sizeof(U8), 1, nvsBinFile);
4905
4906    /* param 7 in NVS*/
4907	os_fwrite(&lengthToSet, sizeof(U8), 1, nvsBinFile);
4908
4909	addressHigher	= 0x71;
4910	addressLower	= 0x54;
4911
4912	/* params 8-9 in NVS*/
4913	os_fwrite(&addressHigher, sizeof(U8), 1, nvsBinFile);
4914	os_fwrite(&addressLower, sizeof(U8), 1, nvsBinFile);
4915
4916
4917    /* Write the higher MAC address starting from the LSB
4918	   params 10-13 in NVS*/
4919	os_fwrite(&Mac[1], sizeof(U8), 1, nvsBinFile);
4920	os_fwrite(&Mac[0], sizeof(U8), 1, nvsBinFile);
4921
4922    os_fwrite(&valueToSet, sizeof(U8), 1, nvsBinFile);
4923	os_fwrite(&valueToSet, sizeof(U8), 1, nvsBinFile);
4924
4925    os_error_printf(CU_MSG_INFO2, (PS8)"exiting FillMACAddressToNVS\n");
4926}
4927
4928
4929/****************************************************************************/
4930/*  Function:		FillTXParameterToNVS									*/
4931/****************************************************************************/
4932/*  Description:	Fill TX parameters to the NVS							*/
4933/*  Parameters:		nvsBinFile - NVS bin file								*/
4934/*					nvsPtr - NVS pointer									*/
4935/*  Return Value:	True - file created, False - otherwise					*/
4936/****************************************************************************/
4937void FillTXParameterToNVS(FILE	*nvsBinFile, const TTestCmdP2GCal *nvsPtr)
4938{
4939	TTestCmdP2GCal	*ptgStruct	= (TTestCmdP2GCal *)nvsPtr;
4940	U16			tlvLength;
4941	U16			index;
4942	U8			valueToSet;
4943
4944
4945	/* TX BiP type */
4946	valueToSet = eNVS_RADIO_TX_PARAMETERS;
4947    os_fwrite(&valueToSet, sizeof(U8), 1, nvsBinFile);
4948
4949	/* TX Bip Length */
4950	tlvLength = NVS_TX_PARAM_LENGTH;
4951    os_fwrite(&tlvLength, sizeof(U16), 1, nvsBinFile);
4952
4953	for (index = 0; index < NVS_TX_PARAM_LENGTH; index++)
4954	{
4955	 valueToSet = ptgStruct->oNvsStruct.Buffer[index];
4956     os_fwrite(&valueToSet, sizeof(U8), 1, nvsBinFile);
4957	}
4958}
4959
4960
4961/****************************************************************************/
4962/*  Function:		FillOldRXParameterToNVS									*/
4963/****************************************************************************/
4964/*  Description:	Fill old RX parameters to the NVS						*/
4965/*  Parameters:		nvsBinFile - NVS bin file								*/
4966/*					buffer - buffer of uin8 values							*/
4967/*					maxLengthOfBuffer - maximum length of all the buffer	*/
4968/*  Return Value:	True - file created, False - otherwise					*/
4969/****************************************************************************/
4970void FillOldRXParameterToNVS(FILE *nvsBinFile, const U8	*buffer)
4971{
4972	U32		index;
4973	U32		paramStartIndex = NVS_PRE_PARAMETERS_LENGTH + NVS_RX_PARAM_INDEX;
4974	U32		paramEndIndex = paramStartIndex + NVS_RX_PARAM_LENGTH;
4975	U8		valueToSet;
4976	U16		tlvLength;
4977
4978	/* RX BiP type */
4979	valueToSet = eNVS_RADIO_RX_PARAMETERS;
4980    os_fwrite(&valueToSet, sizeof(U8), 1, nvsBinFile);
4981
4982	/* RX Bip Length */
4983	tlvLength = NVS_RX_PARAM_LENGTH;
4984    os_fwrite(&tlvLength, sizeof(U16), 1, nvsBinFile);
4985
4986	for (index = paramStartIndex;
4987	    (index < paramEndIndex);
4988        index++)
4989	{
4990	   valueToSet = buffer[index];
4991       os_fwrite(&valueToSet, sizeof(U8), 1, nvsBinFile);
4992	}
4993}
4994
4995/****************************************************************************/
4996/*  Function:		FillRXParameterToNVS									*/
4997/****************************************************************************/
4998/*  Description:	Fill old TX parameters to the NVS						*/
4999/*  Parameters:		nvsBinFile - NVS bin file								*/
5000/*					buffer - buffer of uin8 values							*/
5001/*					maxLengthOfBuffer - maximum length of all the buffer	*/
5002/*  Return Value:	True - file created, False - otherwise					*/
5003/****************************************************************************/
5004void FillRXParameterToNVS(FILE *nvsBinFile, const RadioRxPltCal *nvsPtr)
5005{
5006    RadioRxPltCal	*ptgStruct	= (RadioRxPltCal *)nvsPtr;
5007	U32		index;
5008   	U8		valueToSet;
5009	U16		tlvLength;
5010
5011   /* RX BiP type */
5012	valueToSet = eNVS_RADIO_RX_PARAMETERS;
5013    os_fwrite(&valueToSet, sizeof(U8), 1, nvsBinFile);
5014
5015	/* RX Bip Length */
5016	tlvLength = NVS_RX_PARAM_LENGTH;
5017    os_fwrite(&tlvLength, sizeof(U16), 1, nvsBinFile);
5018
5019
5020	for (index = 0;
5021	     index < NVS_RX_PARAM_LENGTH;
5022		 index++)
5023	{
5024	  valueToSet = ptgStruct->oNvsStruct.Buffer[index];
5025      os_fwrite(&valueToSet, sizeof(U8), 1, nvsBinFile);
5026	}
5027}
5028
5029
5030/****************************************************************************/
5031/*  Function:		FillOldTXParameterToNVS									*/
5032/****************************************************************************/
5033/*  Description:	Fill old TX parameters to the NVS						*/
5034/*  Parameters:		nvsBinFile - NVS bin file								*/
5035/*					buffer - buffer of uin8 values							*/
5036/*					maxLengthOfBuffer - maximum length of all the buffer	*/
5037/*  Return Value:	True - file created, False - otherwise					*/
5038/****************************************************************************/
5039void FillOldTXParameterToNVS(FILE *nvsBinFile, const U8	*buffer)
5040{
5041    U32		index ;
5042   	U8		valueToSet;
5043	U16		tlvLength;
5044    U32		paramStartIndex = NVS_PRE_PARAMETERS_LENGTH + NVS_TX_PARAM_INDEX;
5045    U32		paramEndIndex = paramStartIndex + NVS_TX_PARAM_LENGTH;
5046
5047	 /* TX BiP type */
5048	valueToSet = eNVS_RADIO_TX_PARAMETERS;
5049    os_fwrite(&valueToSet, sizeof(U8), 1, nvsBinFile);
5050
5051	/* TX Bip Length */
5052	tlvLength = NVS_TX_PARAM_LENGTH;
5053    os_fwrite(&tlvLength, sizeof(U16), 1, nvsBinFile);
5054
5055    for (index = paramStartIndex; index < paramEndIndex; index++)
5056	{
5057	  valueToSet = buffer[index];
5058      os_fwrite(&valueToSet, sizeof(U8), 1, nvsBinFile);
5059	}
5060}
5061
5062/****************************************************************************/
5063/*  Function:		FillDefaultTXParameterToNVS								*/
5064/****************************************************************************/
5065/*  Description:	Set 0 in all tX parameters								*/
5066/*  Parameters:		nvsBinFile - NVS bin file								*/
5067/*  Return Value:	True - file created, False - otherwise					*/
5068/****************************************************************************/
5069void FillDefaultTXParameterToNVS(FILE *nvsBinFile)
5070{
5071	S8	typeValue = eNVS_RADIO_TX_PARAMETERS;
5072	U16	tlvLength = NVS_TX_PARAM_LENGTH;
5073	U8	valueToSet = 0;
5074	U32	txParamIndex;
5075
5076	/* TX type */
5077    os_fwrite(&typeValue, sizeof(U8), 1, nvsBinFile);
5078
5079	/* TX length; */
5080    os_fwrite(&tlvLength, sizeof(U16), 1, nvsBinFile);
5081
5082	for (txParamIndex = 0; txParamIndex < tlvLength; txParamIndex++)
5083	{
5084      os_fwrite(&valueToSet, sizeof(U8), 1, nvsBinFile);
5085	}
5086}
5087
5088
5089
5090/****************************************************************************/
5091/*  Function:		FillDefaultRXParameterToNVS								*/
5092/****************************************************************************/
5093/*  Description:	Set 0 in all RX parameters								*/
5094/*  Parameters:		nvsBinFile - NVS bin file								*/
5095/*  Return Value:	True - file created, False - otherwise					*/
5096/****************************************************************************/
5097void FillDefaultRXParameterToNVS(FILE *nvsBinFile)
5098{
5099	S8	typeValue = eNVS_RADIO_RX_PARAMETERS;
5100	U16	lengthValue = NVS_RX_PARAM_LENGTH;
5101	U8	valueToSet = 0;
5102	S8	rxParamIndex;
5103
5104	/* RX type */
5105    os_fwrite(&typeValue, sizeof(U8), 1, nvsBinFile);
5106
5107	/* RX length; */
5108    os_fwrite(&lengthValue, sizeof(U16), 1, nvsBinFile);
5109
5110	for (rxParamIndex = 0; rxParamIndex < lengthValue; rxParamIndex++)
5111	{
5112      os_fwrite(&valueToSet, sizeof(U8), 1, nvsBinFile);
5113	}
5114}
5115
5116
5117/****************************************************************************/
5118/*  Function:		WriteEndNVSParam										*/
5119/****************************************************************************/
5120/*  Description:	Write end of NVS										*/
5121/*  Parameters:		nvsBinFile - NVS bin file								*/
5122/*  Return Value:	None													*/
5123/****************************************************************************/
5124void WriteEndNVSParam(FILE *nvsBinFile)
5125{
5126	U16			lengthToSet;
5127	U8			valueToSet;
5128
5129	/* version type */
5130	valueToSet = eTLV_LAST;
5131    os_fwrite(&valueToSet, sizeof(U8), 1, nvsBinFile);
5132
5133	valueToSet = eTLV_LAST;
5134    os_fwrite(&valueToSet, sizeof(U8), 1, nvsBinFile);
5135
5136	/* version length */
5137	lengthToSet = 0;
5138    os_fwrite(&lengthToSet, sizeof(U16), 1, nvsBinFile);
5139}
5140
5141
5142/****************************************************************************/
5143/*  Function:		FillVersionToNVS										*/
5144/****************************************************************************/
5145/*  Description:	Fill version to the NVS									*/
5146/*  Parameters:		nvsBinFile - NVS bin file								*/
5147/*					oldVersionValid - old verson parameter valide			*/
5148/*					buffer - buffer of uin8 values							*/
5149/*					maxLengthOfBuffer - maximum length of all the buffer	*/
5150/*  Return Value:	None													*/
5151/****************************************************************************/
5152/*	25.05.2008		Efil	Function Created								*/
5153/****************************************************************************/
5154void FillVersionToNVS(FILE			*nvsBinFile,
5155									 S8		*versionStr,
5156									 const TI_BOOL	oldVersionValid,
5157									 const U8	    *buffer,
5158									 const U32  	maxLengthOfBuffer)
5159{
5160#define NUMBER_OF_DIGIT_VERISON		3
5161	U8		version[NUMBER_OF_DIGIT_VERISON];
5162	U8		charToVersion = 0;
5163	U8		tempStr[MAX_NVS_VERSION_LENGTH];
5164	U8		numberOfVersionDigit;
5165	U8		valueToSet;
5166	U16		lengthToSet;
5167	U32		index;
5168	U32		lengthOfStructStr;
5169	U32		startParamIndex;
5170	U32  	endVersionParamIndex;
5171	U8		indexForDefaultVersion;
5172
5173	/* version type */
5174	valueToSet = eNVS_VERSION;
5175    fwrite(&valueToSet, sizeof(U8), 1, nvsBinFile);
5176
5177	/* version length */
5178	lengthToSet = NUMBER_OF_DIGIT_VERISON;
5179    os_fwrite(&lengthToSet, sizeof(U16), 1, nvsBinFile);
5180
5181	if (versionStr != NULL)
5182	{
5183		lengthOfStructStr = os_strlen(versionStr);
5184
5185		for (numberOfVersionDigit = 0, charToVersion = 0, index = 0;
5186			 (index < MAX_NVS_VERSION_LENGTH) && (numberOfVersionDigit < NUMBER_OF_DIGIT_VERISON); charToVersion = 0, index++)
5187		{
5188			while ((versionStr[index] != '.') && (index < lengthOfStructStr))
5189			{
5190				if ((versionStr[index] < '0') || (versionStr[index] > '9'))
5191				{
5192					index++;
5193				}
5194				else
5195				{
5196					tempStr[charToVersion++] = versionStr[index++];
5197				}
5198			}
5199
5200			tempStr[charToVersion] = '\0';
5201
5202			if (0 == os_strlen((PS8)tempStr))
5203			{
5204				for (valueToSet = 0, indexForDefaultVersion = 0; indexForDefaultVersion < NUMBER_OF_DIGIT_VERISON - numberOfVersionDigit; indexForDefaultVersion++)
5205				{
5206                   os_fwrite(&valueToSet, sizeof(U8), 1, nvsBinFile);
5207				}
5208
5209				break;
5210			}
5211
5212
5213			version[numberOfVersionDigit] = (U8)os_atoi((PS8)tempStr);
5214            os_fwrite(&(version[numberOfVersionDigit]), sizeof(U8), 1, nvsBinFile);
5215
5216			numberOfVersionDigit++;
5217		}
5218	}
5219	else
5220	{
5221		if (oldVersionValid)
5222		{
5223
5224			startParamIndex			= NVS_PRE_PARAMETERS_LENGTH + NVS_VERSION_PARAMETER_INDEX;
5225			endVersionParamIndex	= startParamIndex + NUMBER_OF_DIGIT_VERISON;
5226
5227			if (maxLengthOfBuffer >= endVersionParamIndex)
5228			{
5229				for (index = startParamIndex; index < endVersionParamIndex; index++)
5230				{
5231					valueToSet = buffer[index];
5232                    os_fwrite(&valueToSet, sizeof(U8), 1, nvsBinFile);
5233				}
5234			}
5235			else
5236			{
5237				valueToSet = 0;
5238
5239				for (index = startParamIndex; index < endVersionParamIndex; index++)
5240				{
5241                    os_fwrite(&valueToSet, sizeof(U8), 1, nvsBinFile);
5242				}
5243
5244			}
5245		}
5246		else
5247		{
5248			valueToSet = 0;
5249
5250			for (index = 0; index < NUMBER_OF_DIGIT_VERISON; index++)
5251			{
5252                os_fwrite(&valueToSet, sizeof(U8), 1, nvsBinFile);
5253			}
5254		}
5255	}
5256
5257
5258}
5259
5260
5261
5262VOID build_nvs_file(THandle hCuCmd, TTestCmd data, S8 updatedProtocol)
5263{
5264#ifdef _WINDOWS
5265    PS8 nvs_file_name = (PS8)"/windows/nvs_map.bin";
5266#else
5267    PS8 nvs_file_name = (PS8)"./nvs_map.bin";
5268#endif /*_WINDOWS*/
5269	FILE *nvsBinFile = NULL;
5270	S8 index;
5271	U8 valueToSet = 0;
5272	S8 nvsFileValid = TRUE;
5273    uint8 	Buffer[MAX_TLV_LENGTH];
5274    uint8   uTxTypeIndexValue;
5275    uint8	uRrxTypeIndexValue;
5276
5277
5278    os_memset (Buffer, 0, MAX_TLV_LENGTH);
5279
5280    if (NULL == (nvsBinFile = os_fopen (nvs_file_name, OS_FOPEN_READ_BINARY)))
5281    {
5282       nvsFileValid = FALSE;
5283    }
5284    else
5285    {
5286        os_fread(Buffer,1, MAX_TLV_LENGTH, nvsBinFile);
5287        os_fclose(nvsBinFile);
5288
5289        uTxTypeIndexValue = Buffer[NVS_PRE_PARAMETERS_LENGTH + NVS_TX_TYPE_INDEX];
5290        uRrxTypeIndexValue = Buffer[NVS_PRE_PARAMETERS_LENGTH + NVS_RX_TYPE_INDEX];
5291
5292        /* if the NVS includes just the MAC preamble (the firest 24B) don't use the Tx and RX values */
5293        if ((uTxTypeIndexValue != eNVS_RADIO_TX_PARAMETERS) || (uRrxTypeIndexValue != eNVS_RADIO_RX_PARAMETERS))
5294		{
5295			nvsFileValid = FALSE;
5296		}
5297    }
5298
5299	/* open NVS file */
5300	if (NULL == (nvsBinFile = os_fopen (nvs_file_name, OS_FOPEN_WRITE_BINARY)))
5301	{
5302		os_error_printf(CU_MSG_INFO2, (PS8)"Open NVS file failed\n");
5303		return;
5304	}
5305
5306	FillMACAddressToNVS(hCuCmd, nvsBinFile);
5307
5308	/* fill end burst transaction zeros*/
5309
5310    for (index = 0; index < NVS_END_BURST_TRANSACTION_LENGTH; index++)
5311	{
5312        os_fwrite(&valueToSet, sizeof(U8), 1, nvsBinFile);
5313	}
5314
5315	/* fill zeros to Align TLV start address*/
5316	for (index = 0; index < NVS_ALING_TLV_START_ADDRESS_LENGTH; index++)
5317	{
5318        os_fwrite(&valueToSet, sizeof(U8), 1, nvsBinFile);
5319	}
5320
5321	/* Getting from TX BiP Command*/
5322	if(NVS_FILE_TX_PARAMETERS_UPDATE == updatedProtocol)
5323	{
5324        /* Fill new TX BiP values*/
5325		FillTXParameterToNVS(nvsBinFile, &data.testCmd_u.P2GCal);
5326		if (nvsFileValid)
5327		{
5328            /*set Parameters of RX from the previous file*/
5329			FillOldRXParameterToNVS(nvsBinFile,
5330				                    Buffer);
5331
5332		}
5333		else
5334		{
5335           FillDefaultRXParameterToNVS(nvsBinFile);
5336		}
5337
5338	}
5339    else  /* Fill new RX BiP values*/
5340    {
5341        if (nvsFileValid)
5342        {
5343            /*set Parameters of TX from the previous file*/
5344            FillOldTXParameterToNVS(nvsBinFile,
5345                                    Buffer);
5346
5347        }
5348        else
5349        {
5350            FillDefaultTXParameterToNVS(nvsBinFile);
5351        }
5352
5353       /* Fill new RX BiP values*/
5354        FillRXParameterToNVS(nvsBinFile, &data.testCmd_u.RxPlt);
5355
5356    }
5357
5358
5359    /*Fill the NVS version to the NVS*/
5360	FillVersionToNVS(nvsBinFile,
5361						   data.testCmd_u.P2GCal.oNvsVersion,
5362						   nvsFileValid,
5363						   data.testCmd_u.P2GCal.oNvsStruct.Buffer,
5364						   data.testCmd_u.P2GCal.oNvsStruct.Length);
5365
5366	/* End of NVS*/
5367	WriteEndNVSParam(nvsBinFile);
5368
5369
5370#if 0
5371	/* Save NVS Results in NVS file */
5372	if (data.testCmd_u.P2GCal.oNvsStruct.Length != os_fwrite(data.testCmd_u.P2GCal.oNvsStruct.Buffer, sizeof(U8),data.testCmd_u.P2GCal.oNvsStruct.Length,nvs_file))
5373	{
5374		os_error_printf(CU_MSG_INFO2, (PS8)"Writing to NVS file failed\n");
5375	}
5376#endif
5377
5378    /* close NVS File */
5379	os_fclose(nvsBinFile);
5380}
5381
5382VOID CuCmd_BIP_BufferCalReferencePoint(THandle hCuCmd, ConParm_t parm[], U16 nParms)
5383{
5384#define NUM_OF_PARAMETERS_REF_POINT 3
5385
5386	CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
5387	TTestCmd data;
5388
5389	if(nParms != NUM_OF_PARAMETERS_REF_POINT)
5390	{
5391		os_error_printf(CU_MSG_INFO2, (PS8)"Missing Param1: iReferencePointDetectorValue\n");
5392		os_error_printf(CU_MSG_INFO2, (PS8)"Missing Param2: iReferencePointPower\n");
5393		os_error_printf(CU_MSG_INFO2, (PS8)"Missing Param3: isubBand\n");
5394		return;
5395	}
5396	else
5397	{
5398		os_memset(&data, 0, sizeof(TTestCmd));
5399		data.testCmdId = TEST_CMD_UPDATE_PD_REFERENCE_POINT;
5400/*		data.testCmd_u.PdBufferCalReferencePoint.iReferencePointDetectorValue = 189;
5401		data.testCmd_u.PdBufferCalReferencePoint.iReferencePointPower = 12;
5402		data.testCmd_u.PdBufferCalReferencePoint.isubBand = 0; 1- BG 2-*/
5403
5404		data.testCmd_u.PdBufferCalReferencePoint.iReferencePointDetectorValue = parm[0].value;
5405		data.testCmd_u.PdBufferCalReferencePoint.iReferencePointPower = parm[1].value;
5406		data.testCmd_u.PdBufferCalReferencePoint.isubBand = (U8)parm[2].value;
5407
5408		if(OK != CuCommon_Radio_Test(pCuCmd->hCuCommon, &data))
5409		{
5410			os_error_printf(CU_MSG_INFO2, (PS8)"BufferCalReferencePoint has failed\n");
5411			return;
5412		}
5413
5414		os_error_printf(CU_MSG_INFO2, (PS8)"BufferCalReferencePoint was configured succesfully\n");
5415	}
5416	return;
5417}
5418
5419
5420/* P2G Calibration */
5421VOID CuCmd_BIP_StartBIP(THandle hCuCmd, ConParm_t parm[], U16 nParms)
5422{
5423	CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
5424    TTestCmd data;
5425    U32 i;
5426
5427	os_memset(&data, 0, sizeof(TTestCmd));
5428
5429	data.testCmdId = TEST_CMD_P2G_CAL;
5430
5431    data.testCmd_u.P2GCal.iSubBandMask = 0;
5432    for (i = 0; i < 8; i++)
5433    {
5434        data.testCmd_u.P2GCal.iSubBandMask |= (U8)parm[i].value << i;
5435    }
5436
5437	if (data.testCmd_u.P2GCal.iSubBandMask == 0)
5438	{
5439		os_error_printf(CU_MSG_INFO2, (PS8)"At least one sub-band should be enabled\n");
5440		return;
5441	}
5442
5443	if(OK != CuCommon_Radio_Test(pCuCmd->hCuCommon, &data))
5444	{
5445		os_error_printf(CU_MSG_INFO2, (PS8)"Tx calibration start has failed\n");
5446		return;
5447	}
5448
5449	if (TI_OK != data.testCmd_u.P2GCal.oRadioStatus) {
5450		os_error_printf(CU_MSG_INFO2, (PS8)"Tx calibration returned status: %d\n", data.testCmd_u.P2GCal.oRadioStatus);
5451		return;
5452	}
5453
5454/*	for (i=0;i<data.testCmd_u.P2GCal.oNvsStruct.Length;i++) {
5455		os_error_printf(CU_MSG_INFO2, (PS8)"nvs buffer[%d]=%x\n, ", i, data.testCmd_u.P2GCal.oNvsStruct.Buffer[i]);
5456	} */
5457
5458    build_nvs_file(hCuCmd, data, NVS_FILE_TX_PARAMETERS_UPDATE);
5459}
5460
5461VOID CuCmd_BIP_EnterRxBIP(THandle hCuCmd, ConParm_t parm[], U16 nParms)
5462{
5463	CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
5464    TTestCmd data;
5465
5466	os_memset(&data, 0, sizeof(TTestCmd));
5467
5468	data.testCmdId = TEST_CMD_RX_PLT_ENTER;
5469
5470	if(OK != CuCommon_Radio_Test(pCuCmd->hCuCommon, &data))
5471	{
5472		os_error_printf(CU_MSG_INFO2, (PS8)"Enter Rx calibration has failed\n");
5473		return;
5474	}
5475
5476
5477    if (TI_OK != data.testCmd_u.RxPlt.oRadioStatus) {
5478		os_error_printf(CU_MSG_INFO2, (PS8)"Enter Rx calibration returned status: %d\n", data.testCmd_u.RxPlt.oRadioStatus);
5479		return;
5480	}
5481
5482}
5483
5484
5485VOID CuCmd_BIP_StartRxBIP(THandle hCuCmd, ConParm_t parm[], U16 nParms)
5486{
5487	CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
5488    TTestCmd data;
5489
5490	os_memset(&data, 0, sizeof(TTestCmd));
5491
5492    data.testCmdId = TEST_CMD_RX_PLT_CAL;
5493    data.testCmd_u.RxPlt.iExternalSignalPowerLevel = (S32)parm[0].value;
5494
5495    if(OK != CuCommon_Radio_Test(pCuCmd->hCuCommon, &data))
5496    {
5497        os_error_printf(CU_MSG_INFO2, (PS8)"Rx calibration has failed\n");
5498        return;
5499    }
5500
5501    if (TI_OK != data.testCmd_u.RxPlt.oRadioStatus) {
5502		os_error_printf(CU_MSG_INFO2, (PS8)"Rx calibration returned status: %d\n", data.testCmd_u.RxPlt.oRadioStatus);
5503		return;
5504	}
5505
5506    build_nvs_file(hCuCmd, data, NVS_FILE_RX_PARAMETERS_UPDATE);
5507
5508}
5509
5510VOID CuCmd_BIP_ExitRxBIP(THandle hCuCmd, ConParm_t parm[], U16 nParms)
5511{
5512	CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
5513    TTestCmd data;
5514
5515	os_memset(&data, 0, sizeof(TTestCmd));
5516
5517	data.testCmdId = TEST_CMD_RX_PLT_EXIT;
5518
5519	if(OK != CuCommon_Radio_Test(pCuCmd->hCuCommon, &data))
5520	{
5521		os_error_printf(CU_MSG_INFO2, (PS8)"Exit Rx calibration has failed\n");
5522		return;
5523	}
5524
5525
5526    if (TI_OK != data.testCmd_u.RxPlt.oRadioStatus) {
5527		os_error_printf(CU_MSG_INFO2, (PS8)"Exit Rx calibration returned status: %d\n", data.testCmd_u.RxPlt.oRadioStatus);
5528		return;
5529	}
5530
5531}
5532
5533
5534
5535VOID CuCmd_SetPrivacyAuth(THandle hCuCmd, ConParm_t parm[], U16 nParms)
5536{
5537    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
5538    U32 AuthMode;
5539
5540    if( nParms )
5541    {
5542        os_error_printf(CU_MSG_INFO2, (PS8)"Setting privacy authentication to %ld\n", parm[0].value);
5543        AuthMode = parm[0].value;
5544        if (pCuCmd->hWpaCore == NULL)
5545        {
5546            /* we can only accept WEP or OPEN configurations */
5547            if((AuthMode >= os802_11AuthModeOpen) && (AuthMode <= os802_11AuthModeAutoSwitch))
5548            {
5549                if(OK != CuCommon_SetU32(pCuCmd->hCuCommon, RSN_EXT_AUTHENTICATION_MODE, AuthMode)) return;
5550            }
5551            else
5552            {
5553                os_error_printf(CU_MSG_ERROR, (PS8)"Error - CuCmd_SetPrivacyAuth - cannot set mode (%ld) when Suppl is not present\n", AuthMode);
5554                return;
5555            }
5556        }
5557        else
5558        {
5559#ifndef NO_WPA_SUPPL
5560            if(OK != WpaCore_SetAuthMode(pCuCmd->hWpaCore, AuthMode)) return;
5561#endif
5562        }
5563    }
5564    else
5565    {
5566#ifdef WPA_ENTERPRISE
5567        static named_value_t auth_mode_type[] = {
5568            { os802_11AuthModeOpen,             (PS8)"Open"      },
5569            { os802_11AuthModeShared,           (PS8)"Shared"    },
5570            { os802_11AuthModeAutoSwitch,       (PS8)"AutoSwitch"},
5571            { os802_11AuthModeWPA,              (PS8)"WPA"       },
5572            { os802_11AuthModeWPAPSK,           (PS8)"WPAPSK"    },
5573            { os802_11AuthModeWPANone,          (PS8)"WPANone"   },
5574            { os802_11AuthModeWPA2,             (PS8)"WPA2"      },
5575            { os802_11AuthModeWPA2PSK,          (PS8)"WPA2PSK"   },
5576        };
5577#else
5578        static named_value_t auth_mode_type[] = {
5579            { os802_11AuthModeOpen,             (PS8)"Open"      },
5580            { os802_11AuthModeShared,           (PS8)"Shared"    },
5581            { os802_11AuthModeWPAPSK,           (PS8)"WPAPSK"    },
5582            { os802_11AuthModeWPA2PSK,          (PS8)"WPA2PSK"   },
5583        };
5584#endif
5585
5586        if (pCuCmd->hWpaCore == NULL)
5587        {
5588            if(OK != CuCommon_GetU32(pCuCmd->hCuCommon, RSN_EXT_AUTHENTICATION_MODE, &AuthMode)) return;
5589        }
5590        else
5591        {
5592#ifndef NO_WPA_SUPPL
5593            if(OK != WpaCore_GetAuthMode(pCuCmd->hWpaCore, &AuthMode)) return;
5594#endif
5595        }
5596
5597        print_available_values(auth_mode_type);
5598        os_error_printf(CU_MSG_INFO2, (PS8)"AuthenticationMode=%d\n", AuthMode );
5599    }
5600}
5601
5602VOID CuCmd_SetPrivacyEap(THandle hCuCmd, ConParm_t parm[], U16 nParms)
5603{
5604    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
5605    OS_802_11_EAP_TYPES EapType;
5606    S32 i;
5607    named_value_t EapType_type[] = {
5608        { OS_EAP_TYPE_NONE,                 (PS8)"OS_EAP_TYPE_NONE" },
5609        { OS_EAP_TYPE_MD5_CHALLENGE,        (PS8)"OS_EAP_TYPE_MD5_CHALLENGE" },
5610        { OS_EAP_TYPE_GENERIC_TOKEN_CARD,   (PS8)"OS_EAP_TYPE_GENERIC_TOKEN_CARD" },
5611        { OS_EAP_TYPE_TLS,                  (PS8)"OS_EAP_TYPE_TLS" },
5612        { OS_EAP_TYPE_LEAP,                 (PS8)"OS_EAP_TYPE_LEAP" },
5613        { OS_EAP_TYPE_TTLS,                 (PS8)"OS_EAP_TYPE_TTLS" },
5614        { OS_EAP_TYPE_PEAP,                 (PS8)"OS_EAP_TYPE_PEAP" },
5615        { OS_EAP_TYPE_MS_CHAP_V2,           (PS8)"OS_EAP_TYPE_MS_CHAP_V2" },
5616        { OS_EAP_TYPE_FAST,                 (PS8)"OS_EAP_TYPE_FAST" }
5617    };
5618
5619    /* check if we have supplicant */
5620    if (pCuCmd->hWpaCore == NULL)
5621    {
5622        os_error_printf(CU_MSG_ERROR, (PS8)"Error - CuCmd_SetPrivacyEap - cannot set EapType when Suppl is not present\n");
5623        return;
5624    }
5625
5626    if( nParms )
5627    {
5628        EapType = parm[0].value;
5629        /* check if the param is valid */
5630        CU_CMD_FIND_NAME_ARRAY(i, EapType_type, EapType);
5631        if(i == SIZE_ARR(EapType_type))
5632        {
5633            os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_SetPrivacyEap, EapType %d is not defined!\n", EapType);
5634            return;
5635        }
5636
5637#ifndef NO_WPA_SUPPL
5638
5639        if(OK != WpaCore_SetPrivacyEap(pCuCmd->hWpaCore, EapType))
5640            os_error_printf(CU_MSG_INFO2, (PS8)"Error Setting EapType to %ld\n", EapType);
5641        else
5642            os_error_printf(CU_MSG_INFO2, (PS8)"Setting EapType to %ld\n", EapType);
5643
5644#endif
5645               /*
5646        WEXT phase I
5647        TI_SetEAPType( g_id_adapter, (OS_802_11_EAP_TYPES) parm[0].value );
5648        TI_SetEAPTypeDriver( g_id_adapter, (OS_802_11_EAP_TYPES) parm[0].value );
5649        */
5650
5651    }
5652    else
5653    {
5654        print_available_values(EapType_type);
5655    }
5656}
5657
5658
5659VOID CuCmd_SetPrivacyEncryption(THandle hCuCmd, ConParm_t parm[], U16 nParms)
5660{
5661    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
5662    U32 EncryptionType;
5663#ifndef NO_WPA_SUPPL
5664    OS_802_11_ENCRYPTION_TYPES EncryptionTypePairWise;
5665    OS_802_11_ENCRYPTION_TYPES EncryptionTypeGroup;
5666#endif
5667    S32 i;
5668
5669    if( nParms )
5670    {
5671        EncryptionType = parm[0].value;
5672
5673        /* check if the param is valid */
5674        CU_CMD_FIND_NAME_ARRAY(i, encrypt_type, EncryptionType);
5675        if(i == SIZE_ARR(encrypt_type))
5676        {
5677            os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_SetPrivacyEncryption, EncryptionType %d is not defined!\n", EncryptionType);
5678            return;
5679        }
5680
5681        if (pCuCmd->hWpaCore == NULL)
5682        {
5683            if((EncryptionType == OS_ENCRYPTION_TYPE_NONE) || (EncryptionType == OS_ENCRYPTION_TYPE_WEP))
5684            {
5685                if(OK != CuCommon_SetU32(pCuCmd->hCuCommon, RSN_ENCRYPTION_STATUS_PARAM, (U32)EncryptionType)) return;
5686            }
5687            else
5688            {
5689                os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - CuCmd_SetPrivacyEncryption - can't set EncryptionType %s when not connected to supplicant",encrypt_type[i].name);
5690                return;
5691            }
5692        }
5693        else
5694        {
5695#ifndef NO_WPA_SUPPL
5696            switch(EncryptionType)
5697            {
5698                case OS_ENCRYPTION_TYPE_NONE:
5699                    EncryptionTypePairWise = OS_ENCRYPTION_TYPE_NONE;
5700                    EncryptionTypeGroup = OS_ENCRYPTION_TYPE_NONE;
5701                    break;
5702                case OS_ENCRYPTION_TYPE_WEP:
5703                    EncryptionTypePairWise = OS_ENCRYPTION_TYPE_WEP;
5704                    EncryptionTypeGroup = OS_ENCRYPTION_TYPE_WEP;
5705                    break;
5706                case OS_ENCRYPTION_TYPE_TKIP:
5707                    EncryptionTypePairWise = OS_ENCRYPTION_TYPE_TKIP;
5708                    EncryptionTypeGroup = OS_ENCRYPTION_TYPE_TKIP;
5709                    break;
5710                case OS_ENCRYPTION_TYPE_AES:
5711                    EncryptionTypePairWise = OS_ENCRYPTION_TYPE_AES;
5712                    EncryptionTypeGroup = OS_ENCRYPTION_TYPE_AES;
5713                    break;
5714            }
5715
5716            if(OK != WpaCore_SetEncryptionPairWise(pCuCmd->hWpaCore, EncryptionTypePairWise)) return;
5717            if(OK != WpaCore_SetEncryptionGroup(pCuCmd->hWpaCore, EncryptionTypeGroup)) return;
5718#endif
5719
5720        }
5721
5722        os_error_printf(CU_MSG_INFO2, (PS8)"Setting privacy encryption to %ld\n", encrypt_type[i]);
5723    }
5724    else
5725    {
5726        if (pCuCmd->hWpaCore == NULL)
5727        {
5728            if(OK != CuCommon_GetU32(pCuCmd->hCuCommon, RSN_ENCRYPTION_STATUS_PARAM, &EncryptionType)) return;
5729
5730            switch (EncryptionType)
5731            {
5732            case TWD_CIPHER_NONE:
5733                EncryptionType = OS_ENCRYPTION_TYPE_NONE;
5734                break;
5735            case TWD_CIPHER_WEP:
5736            case TWD_CIPHER_WEP104:
5737                EncryptionType = OS_ENCRYPTION_TYPE_WEP;
5738                break;
5739            case TWD_CIPHER_TKIP:
5740                EncryptionType = OS_ENCRYPTION_TYPE_TKIP;
5741                break;
5742            case TWD_CIPHER_AES_WRAP:
5743            case TWD_CIPHER_AES_CCMP:
5744                EncryptionType = OS_ENCRYPTION_TYPE_AES;
5745                break;
5746            default:
5747                os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - CuCmd_SetPrivacyEncryption - unknown encryption type (%d)",EncryptionType);
5748                break;
5749            }
5750        }
5751        else
5752        {
5753#ifndef NO_WPA_SUPPL
5754            if(OK != WpaCore_GetEncryptionPairWise(pCuCmd->hWpaCore, &EncryptionTypePairWise)) return;
5755            if(OK != WpaCore_GetEncryptionGroup(pCuCmd->hWpaCore, &EncryptionTypeGroup)) return;
5756
5757            if((EncryptionTypePairWise == OS_ENCRYPTION_TYPE_NONE) && (EncryptionTypeGroup == OS_ENCRYPTION_TYPE_NONE))
5758                EncryptionType = OS_ENCRYPTION_TYPE_NONE;
5759            else if((EncryptionTypePairWise == OS_ENCRYPTION_TYPE_WEP) && (EncryptionTypeGroup == OS_ENCRYPTION_TYPE_WEP))
5760                EncryptionType = OS_ENCRYPTION_TYPE_WEP;
5761            else if((EncryptionTypePairWise == OS_ENCRYPTION_TYPE_TKIP) && (EncryptionTypeGroup == OS_ENCRYPTION_TYPE_TKIP))
5762                EncryptionType = OS_ENCRYPTION_TYPE_TKIP;
5763            else if((EncryptionTypePairWise == OS_ENCRYPTION_TYPE_AES) && (EncryptionTypeGroup == OS_ENCRYPTION_TYPE_AES))
5764                EncryptionType = OS_ENCRYPTION_TYPE_AES;
5765            else
5766            {
5767                os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - CuCmd_SetPrivacyEncryption - unknown encryption type (%d,%d)",EncryptionTypePairWise, EncryptionTypeGroup);
5768                return;
5769            }
5770#endif
5771        }
5772
5773        print_available_values(encrypt_type);
5774        os_error_printf(CU_MSG_INFO2, (PS8)"Encryption = %d\n", EncryptionType);
5775    }
5776}
5777
5778VOID CuCmd_SetPrivacyKeyType(THandle hCuCmd, ConParm_t parm[], U16 nParms)
5779{
5780    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
5781    OS_802_11_KEY_TYPES KeyType;
5782    S32 i;
5783    static named_value_t KeyType_type[] = {
5784            { OS_KEY_TYPE_STATIC,             (PS8)"STATIC" },
5785            { OS_KEY_TYPE_DYNAMIC,            (PS8)"DYNAMIC"}
5786    };
5787
5788    /* check if we have supplicant */
5789    if (pCuCmd->hWpaCore == NULL)
5790    {
5791        os_error_printf(CU_MSG_ERROR, (PS8)"Error - CuCmd_SetPrivacyEncryptGroup - cannot set encryption Group when Suppl is not present\n");
5792        return;
5793    }
5794
5795    if( nParms )
5796    {
5797        KeyType = parm[0].value;
5798        /* check if the param is valid */
5799        CU_CMD_FIND_NAME_ARRAY(i, KeyType_type, KeyType);
5800        if(i == SIZE_ARR(KeyType_type))
5801        {
5802            os_error_printf(CU_MSG_INFO2, (PS8)"CuCmd_SetPrivacyKeyType - KeyType %d is not defined!\n", KeyType);
5803            return;
5804        }
5805
5806        os_error_printf(CU_MSG_INFO2, (PS8)"Setting KeyType to %ld\n", KeyType);
5807
5808         /*
5809        WEXT phase I
5810        TI_SetKeyType( g_id_adapter, (OS_802_11_KEY_TYPES)parm[0].value );
5811        */
5812    }
5813    else
5814    {
5815        print_available_values(KeyType_type);
5816    }
5817}
5818
5819VOID CuCmd_SetPrivacyMixedMode(THandle hCuCmd, ConParm_t parm[], U16 nParms)
5820{
5821    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
5822    U32 MixedMode;
5823
5824    if( nParms )
5825    {
5826        MixedMode = parm[0].value;
5827        os_error_printf(CU_MSG_INFO2, (PS8)"Setting MixedMode to %s\n", (MixedMode)?"True":"False");
5828
5829        CuCommon_SetU32(pCuCmd->hCuCommon, TIWLN_802_11_MIXED_MODE_SET, MixedMode);
5830    }
5831    else
5832    {
5833        if(OK != CuCommon_GetU32(pCuCmd->hCuCommon, TIWLN_802_11_MIXED_MODE_GET, &MixedMode)) return;
5834
5835        os_error_printf(CU_MSG_INFO2, (PS8)"Mixed Mode: 0 - FALSE, 1 - TRUE\n");
5836        os_error_printf(CU_MSG_INFO2, (PS8)"Mixed Mode =%s\n", (MixedMode)?"True":"False");
5837    }
5838}
5839
5840VOID CuCmd_SetPrivacyAnyWpaMode(THandle hCuCmd, ConParm_t parm[], U16 nParms)
5841{
5842    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
5843#ifndef NO_WPA_SUPPL
5844    U32 anyWpaMode;
5845
5846    if( nParms )
5847    {
5848        anyWpaMode = parm[0].value;
5849        os_error_printf(CU_MSG_INFO2, (PS8)"Setting anyWpaMode to %s\n", (anyWpaMode)?"True":"False");
5850
5851        WpaCore_SetAnyWpaMode(pCuCmd->hWpaCore,(U8)anyWpaMode);
5852    }
5853    else
5854    {
5855		WpaCore_GetAnyWpaMode(pCuCmd->hWpaCore,(U8 *)&anyWpaMode);
5856        os_error_printf(CU_MSG_INFO2, (PS8)"Any WPA Mode: 0 - FALSE, 1 - TRUE\n");
5857        os_error_printf(CU_MSG_INFO2, (PS8)"Any WPA =%s\n", (anyWpaMode)?"True":"False");
5858    }
5859#else
5860    os_error_printf(CU_MSG_INFO2, (PS8)"Any Wpa Mode support only in Linux supplicants\n");
5861#endif
5862}
5863
5864VOID CuCmd_SetPrivacyCredentials(THandle hCuCmd, ConParm_t parm[], U16 nParms)
5865{
5866    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
5867
5868    if( nParms == 0 )
5869        return;
5870
5871   if (pCuCmd->hWpaCore == NULL)
5872   {
5873       os_error_printf(CU_MSG_ERROR, (PS8)"Error - CuCmd_SetPrivacyPskPassPhrase - cannot set Credential password phrase when Suppl is not present\n");
5874       return;
5875   }
5876
5877#ifndef NO_WPA_SUPPL
5878
5879     if( nParms == 2 )
5880    {
5881      WpaCore_SetCredentials(pCuCmd->hWpaCore,(PU8)(parm[0].value),(PU8)(parm[1].value));
5882    }
5883    else if( nParms == 1 )
5884    {
5885      WpaCore_SetCredentials(pCuCmd->hWpaCore,(PU8)(parm[0].value),NULL);
5886    }
5887#endif
5888}
5889
5890VOID CuCmd_SetPrivacyPskPassPhrase(THandle hCuCmd, ConParm_t parm[], U16 nParms)
5891{
5892    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
5893    U32 IsHexKey = FALSE;
5894    U8 buf[WPACORE_MAX_PSK_STRING_LENGTH];
5895    PS8 pPassphrase;
5896    S32 len;
5897
5898    if( nParms == 0 )
5899        return;
5900
5901    /* check if we have supplicant */
5902    if (pCuCmd->hWpaCore == NULL)
5903    {
5904        os_error_printf(CU_MSG_ERROR, (PS8)"Error - CuCmd_SetPrivacyPskPassPhrase - cannot set PSK password phrase when Suppl is not present\n");
5905        return;
5906    }
5907
5908    len = os_strlen((PS8)(parm[0].value));
5909    pPassphrase = ((PS8)parm[0].value);
5910    os_memset(buf, 0, WPACORE_MAX_PSK_STRING_LENGTH);
5911
5912
5913    if( nParms == 2 )
5914    {
5915        if( !os_strcmp( (PS8) parm[1].value, (PS8)"hex") )
5916            IsHexKey = TRUE;
5917        else if(!os_strcmp( (PS8) parm[1].value, (PS8)"text"))
5918            IsHexKey = FALSE;
5919    }
5920
5921    if( IsHexKey )
5922    {
5923        U8 val_l;
5924        U8 val_u;
5925        S32 i;
5926
5927        if( len != WPACORE_PSK_HEX_LENGTH )
5928        {
5929            os_error_printf(CU_MSG_INFO2, (PS8)"The hexa PSKPassphrase must be at length of %d hexa digits \n",WPACORE_PSK_HEX_LENGTH);
5930            return;
5931        }
5932
5933        for( i=0; *pPassphrase; i++, pPassphrase++ )
5934        {
5935            val_u = CuCmd_Char2Hex(*pPassphrase);
5936            if( val_u == ((U8)-1) ) return;
5937            val_l = CuCmd_Char2Hex(*(++pPassphrase));
5938            if( val_l == ((U8)-1) ) return;
5939            buf[i] = ((val_u << 4) | val_l);
5940        }
5941    }
5942    else
5943    {
5944        if (len > WPACORE_MAX_PSK_STRING_LENGTH || len < WPACORE_MIN_PSK_STRING_LENGTH)
5945        {
5946            os_error_printf(CU_MSG_INFO2, (PS8)"The PSKPassphrase must be between %d to  %d chars \n", WPACORE_MIN_PSK_STRING_LENGTH, WPACORE_MAX_PSK_STRING_LENGTH);
5947            return;
5948        }
5949
5950        os_memcpy((PVOID)buf, (PVOID)pPassphrase, len);
5951    }
5952
5953    os_error_printf(CU_MSG_INFO2, (PS8)"Setting PSKPassphrase to %s\n", (PS8) parm[0].value);
5954#ifndef NO_WPA_SUPPL
5955    WpaCore_SetPskPassPhrase(pCuCmd->hWpaCore, buf);
5956#endif
5957
5958}
5959
5960VOID CuCmd_SetPrivacyCertificate(THandle hCuCmd, ConParm_t parm[], U16 nParms)
5961{
5962  CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
5963
5964   if( nParms == 0 )
5965        return;
5966
5967   if (pCuCmd->hWpaCore == NULL)
5968   {
5969       os_error_printf(CU_MSG_ERROR, (PS8)"Error - CuCmd_SetPrivacyPskPassPhrase - cannot set Certification  when Suppl is not present\n");
5970       return;
5971   }
5972#ifndef NO_WPA_SUPPL
5973   WpaCore_SetCertificate(pCuCmd->hWpaCore,(PU8)(parm[0].value));
5974#endif
5975
5976
5977}
5978
5979VOID CuCmd_StopSuppl(THandle hCuCmd, ConParm_t parm[], U16 nParms)
5980{
5981    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
5982
5983    /* check if we have supplicant */
5984    if (pCuCmd->hWpaCore == NULL)
5985    {
5986        os_error_printf(CU_MSG_ERROR, (PS8)"Error - CuCmd_StopSuppl - cannot stop supplicant when Suppl is not present :-)\n");
5987        return;
5988    }
5989#ifndef NO_WPA_SUPPL
5990    WpaCore_StopSuppl(pCuCmd->hWpaCore);
5991#endif
5992}
5993
5994VOID CuCmd_ChangeSupplDebugLevels(THandle hCuCmd, ConParm_t parm[], U16 nParms)
5995{
5996    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
5997
5998    /* check if we have supplicant */
5999    if (pCuCmd->hWpaCore == NULL)
6000    {
6001        os_error_printf(CU_MSG_ERROR, (PS8)"Error - CuCmd_DebugSuppl - cannot debug supplicant when Suppl is not present :-)\n");
6002        return;
6003    }
6004#ifndef NO_WPA_SUPPL
6005    WpaCore_ChangeSupplDebugLevels(pCuCmd->hWpaCore, parm[0].value, parm[1].value, parm[2].value);
6006#endif
6007}
6008
6009VOID CuCmd_AddPrivacyKey(THandle hCuCmd, ConParm_t parm[], U16 nParms)
6010{
6011    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
6012    PS8 buf;
6013    U32 key_id = 0;
6014    U32 def_flag = 0;
6015    U32 IsHexKey = TRUE;
6016    OS_802_11_WEP data;
6017    U8 val_l, val_u;
6018    S32 len;
6019
6020    buf =  (PS8)parm[0].value;
6021    key_id = (U32)parm[1].value;
6022    if( parm[2].value ) def_flag = 0x80000000;
6023    os_memset(data.KeyMaterial,0,sizeof(data.KeyMaterial));
6024    len = os_strlen((PS8)buf);
6025
6026    if(key_id > 3)
6027    {
6028        os_error_printf(CU_MSG_INFO2, (PS8)"the key index must be between 0 and 3\n");
6029        return;
6030    }
6031
6032    if( nParms >= 4 )
6033    {
6034        if( !os_strcmp( (PS8) parm[3].value, (PS8)"hex") )
6035            IsHexKey = TRUE;
6036        else if( !os_strcmp( (PS8) parm[3].value, (PS8)"HEX") )
6037            IsHexKey = TRUE;
6038        else if(!os_strcmp( (PS8) parm[3].value, (PS8)"text"))
6039            IsHexKey = FALSE;
6040        else if(!os_strcmp( (PS8) parm[3].value, (PS8)"TEXT"))
6041            IsHexKey = FALSE;
6042    }
6043
6044    if( IsHexKey )
6045    {
6046        S32 i;
6047
6048        if( len % 2 )
6049        {
6050            os_error_printf(CU_MSG_INFO2, (PS8)"The hexa key should be even length\n");
6051            return;
6052        }
6053        if(len <= 10) /*10 is number of character for key length 40 bit*/
6054            data.KeyLength = 5;
6055        else if(len <= 26) /*26 is number of character for key length 128 bit*/
6056            data.KeyLength = 13;
6057        else if(len <= 58) /*58 is number of character for key length 256 bit*/
6058            data.KeyLength = 29;
6059        else
6060        {
6061            os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - CuCmd_AddPrivacyKey - key length not valid\n" );
6062            return;
6063        }
6064
6065        for( i=0; *buf; i++, buf++ )
6066        {
6067            val_u = CuCmd_Char2Hex(*buf);
6068            if(val_u == ((U8)-1)) return;
6069            val_l = CuCmd_Char2Hex(*(++buf));
6070            if(val_l == ((U8)-1)) return;
6071            data.KeyMaterial[i] = ((val_u << 4) | val_l);
6072        }
6073    }
6074    else /* for ascii key */
6075    {
6076        if(len <= 5) /*10 is number of character for key length 40 bit*/
6077            data.KeyLength = 5;
6078        else if(len <= 13) /*26 is number of character for key length 128 bit*/
6079            data.KeyLength = 13;
6080        else if(len <= 29) /*58 is number of character for key length 256 bit*/
6081            data.KeyLength = 29;
6082        else
6083        {
6084            os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - CuCmd_AddPrivacyKey - key length not valid\n" );
6085            return;
6086        }
6087        os_memcpy((PVOID)data.KeyMaterial, (PVOID)buf, len);
6088    }
6089
6090    data.KeyIndex = def_flag | key_id;
6091    data.Length = sizeof(OS_802_11_WEP);
6092
6093    /* check if we have supplicant */
6094    if (pCuCmd->hWpaCore == NULL)
6095    {
6096        CuCommon_AddKey(pCuCmd->hCuCommon, &data);
6097    }
6098    else
6099    {
6100#ifndef NO_WPA_SUPPL
6101        WpaCore_AddKey(pCuCmd->hWpaCore, &data);
6102#endif
6103    }
6104}
6105
6106VOID CuCmd_RemovePrivacyKey(THandle hCuCmd, ConParm_t parm[], U16 nParms)
6107{
6108    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
6109
6110    /* check if we have supplicant */
6111    CuCommon_RemoveKey(pCuCmd->hCuCommon, parm[0].value);
6112}
6113
6114VOID CuCmd_GetPrivacyDefaultKey(THandle hCuCmd, ConParm_t parm[], U16 nParms)
6115{
6116    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
6117    U32 DefaultKeyId;
6118
6119    /* check if we have supplicant */
6120    if (pCuCmd->hWpaCore == NULL)
6121    {
6122        if(OK != CuCommon_GetU32(pCuCmd->hCuCommon, RSN_DEFAULT_KEY_ID, &DefaultKeyId)) return;
6123    }
6124    else
6125    {
6126#ifndef NO_WPA_SUPPL
6127        if(OK != WpaCore_GetDefaultKey(pCuCmd->hWpaCore, &DefaultKeyId)) return;
6128#endif
6129    }
6130
6131    os_error_printf(CU_MSG_INFO2, (PS8)"WEP default key ID = %d\n", DefaultKeyId );
6132}
6133
6134VOID CuCmd_EnableKeepAlive (THandle hCuCmd, ConParm_t parm[], U16 nParms)
6135{
6136    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
6137
6138    if (OK != CuCommon_SetU32 (pCuCmd->hCuCommon, POWER_MGR_KEEP_ALIVE_ENA_DIS, 1))
6139    {
6140        os_error_printf (CU_MSG_ERROR, (PS8)"Unable to enable keep-alive messages\n");
6141    }
6142}
6143
6144VOID CuCmd_DisableKeepAlive (THandle hCuCmd, ConParm_t parm[], U16 nParms)
6145{
6146    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
6147
6148    if (OK != CuCommon_SetU32 (pCuCmd->hCuCommon, POWER_MGR_KEEP_ALIVE_ENA_DIS, 0))
6149    {
6150        os_error_printf (CU_MSG_ERROR, (PS8)"Unable to disable keep-alive messages\n");
6151    }
6152}
6153
6154VOID CuCmd_AddKeepAliveMessage (THandle hCuCmd, ConParm_t parm[], U16 nParms)
6155{
6156    CuCmd_t                 *pCuCmd = (CuCmd_t*)hCuCmd;
6157    TKeepAliveTemplate      keepAliveParams;
6158
6159    if (4 != nParms)
6160    {
6161        os_error_printf (CU_MSG_ERROR, (PS8)"Number of params to add keep-alive message is %d\n", nParms);
6162        return;
6163    }
6164
6165    /* copy keep-alive params */
6166    keepAliveParams.keepAliveParams.index = (U8)parm[ 0 ].value;
6167    keepAliveParams.keepAliveParams.interval = parm[ 1 ].value;
6168    keepAliveParams.keepAliveParams.trigType = parm[ 2 ].value;
6169    keepAliveParams.keepAliveParams.enaDisFlag = 1; /* set to enable */
6170    keepAliveParams.msgBufferLength = os_strlen ((PS8)parm[ 3 ].value);
6171    if (0 == (keepAliveParams.msgBufferLength %2))
6172    {
6173        keepAliveParams.msgBufferLength = keepAliveParams.msgBufferLength / 2;
6174    }
6175    else
6176    {
6177        keepAliveParams.msgBufferLength = (keepAliveParams.msgBufferLength / 2) + 1;
6178    }
6179    /* convert the string to hexadeciaml values, and copy it */
6180    CuCmd_atox_string ((U8*)parm[ 3 ].value, &keepAliveParams.msgBuffer[ 0 ]);
6181
6182    if (TI_OK != CuCommon_SetBuffer(pCuCmd->hCuCommon, POWER_MGR_KEEP_ALIVE_ADD_REM,
6183                                    &(keepAliveParams), sizeof(TKeepAliveTemplate)))
6184    {
6185        os_error_printf (CU_MSG_ERROR, (PS8)"Unable to add keep-alive message\n");
6186    }
6187}
6188
6189VOID CuCmd_RemoveKeepAliveMessage (THandle hCuCmd, ConParm_t parm[], U16 nParms)
6190{
6191    CuCmd_t                 *pCuCmd = (CuCmd_t*)hCuCmd;
6192    TKeepAliveTemplate      keepAliveParams;
6193
6194    if (1 != nParms)
6195    {
6196        os_error_printf (CU_MSG_ERROR, (PS8)"Number of params to remove keep-alive message is %d\n", nParms);
6197        return;
6198    }
6199
6200    /* copy keep-alive params */
6201    keepAliveParams.keepAliveParams.index = (U8)parm[ 0 ].value;
6202    keepAliveParams.keepAliveParams.enaDisFlag = 0; /* set to disable */
6203    keepAliveParams.keepAliveParams.interval = 1000; /* FW validate all parameters, so some reasonable values must be used */
6204    keepAliveParams.keepAliveParams.trigType = KEEP_ALIVE_TRIG_TYPE_PERIOD_ONLY;
6205
6206    if (OK != CuCommon_SetBuffer (pCuCmd->hCuCommon, POWER_MGR_KEEP_ALIVE_ADD_REM,
6207                                  &(keepAliveParams), sizeof(TKeepAliveTemplate)))
6208    {
6209        os_error_printf (CU_MSG_ERROR, (PS8)"Unable to remove keep-alive message\n");
6210    }
6211}
6212
6213VOID CuCmd_ShowKeepAlive (THandle hCuCmd, ConParm_t parm[], U16 nParms)
6214{
6215    CuCmd_t                 *pCuCmd = (CuCmd_t*)hCuCmd;
6216    TKeepAliveConfig        tConfig;
6217    U32                     uIndex, uNameIndex;
6218    S8                      msgBuffer[ KEEP_ALIVE_TEMPLATE_MAX_LENGTH * 2 ];
6219
6220    if (OK != CuCommon_GetSetBuffer (pCuCmd->hCuCommon, POWER_MGR_KEEP_ALIVE_GET_CONFIG,
6221                                     &(tConfig), sizeof(TKeepAliveConfig)))
6222    {
6223        os_error_printf (CU_MSG_ERROR, (PS8)"Unable to read keep-alive configuration\n");
6224    }
6225
6226    os_error_printf (CU_MSG_ERROR, (PS8)"Keep-Alive configuration:\n"
6227                                   "-------------------------\n");
6228    if (TRUE == tConfig.enaDisFlag)
6229    {
6230        os_error_printf (CU_MSG_ERROR, (PS8)"Keep-Alive global flag set to enabled\n\n");
6231    }
6232    else
6233    {
6234        os_error_printf (CU_MSG_ERROR, (PS8)"Keep-Alive global flag set to disabled\n\n");
6235    }
6236
6237    os_error_printf (CU_MSG_ERROR, (PS8)"%-8s %-8s %-9s %-10s %s\n", (PS8)"Index", (PS8)"Enabled", (PS8)"Trig Type", (PS8)"Interval", (PS8)"Pattern");
6238    os_error_printf (CU_MSG_ERROR, (PS8)"-----------------------------------------------\n");
6239    for (uIndex = 0; uIndex < KEEP_ALIVE_MAX_USER_MESSAGES; uIndex++)
6240    {
6241        if (TRUE == tConfig.templates[ uIndex ].keepAliveParams.enaDisFlag)
6242        {
6243            CU_CMD_FIND_NAME_ARRAY (uNameIndex, tKeepAliveTriggerTypes,
6244                                    tConfig.templates[ uIndex ].keepAliveParams.trigType);
6245            CuCmd_xtoa_string (&(tConfig.templates[ uIndex ].msgBuffer[ 0 ]),
6246                               tConfig.templates[ uIndex ].msgBufferLength, (U8*)&(msgBuffer[ 0 ]));
6247                             os_error_printf (CU_MSG_ERROR, (PS8)"%-8d %-8d %-9s %-10d %s\n", uIndex,
6248                             tConfig.templates[ uIndex ].keepAliveParams.enaDisFlag,
6249                             tKeepAliveTriggerTypes[ uNameIndex ].name,
6250                             tConfig.templates[ uIndex ].keepAliveParams.interval,
6251                             &(msgBuffer[ 0 ]));
6252        }
6253        else
6254        {
6255            os_error_printf (CU_MSG_ERROR, (PS8)"%-8d %-8d %-9s %-10d %s\n", uIndex, 0, (PS8)"N/A", 0, (PS8)"N/A");
6256        }
6257    }
6258}
6259
6260VOID CuCmd_ShowAbout(THandle hCuCmd, ConParm_t parm[], U16 nParms)
6261{
6262    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
6263    S8 FwVesrion[FW_VERSION_LEN];
6264
6265    if(OK != CuCommon_GetBuffer(pCuCmd->hCuCommon, SITE_MGR_FIRMWARE_VERSION_PARAM,
6266        FwVesrion, FW_VERSION_LEN)) return;
6267
6268#ifdef XCC_MODULE_INCLUDED
6269    os_error_printf(CU_MSG_INFO2, (PS8)"Driver version: %s_XCC\n",
6270                                                SW_VERSION_STR);
6271#else
6272    os_error_printf(CU_MSG_INFO2, (PS8)"Driver version: %s_NOCCX\n",
6273                                                SW_VERSION_STR);
6274#endif/* XCC_MODULE_INCLUDED*/
6275    os_error_printf(CU_MSG_INFO2, (PS8)"Firmware version: %s\n",
6276                                                FwVesrion);
6277
6278}
6279
6280VOID CuCmd_Quit(THandle hCuCmd, ConParm_t parm[], U16 nParms)
6281{
6282    CuCmd_t* pCuCmd = (CuCmd_t*)hCuCmd;
6283
6284    Console_Stop(pCuCmd->hConsole);
6285}
6286
6287
6288