1 /* ////////////////////////////////////////////////////////////////////////// */
3 /* Copyright (c) Atmel Corporation. All rights reserved. */
5 /* Module Name: wilc_wlan_cfg.c */
8 /* ///////////////////////////////////////////////////////////////////////// */
10 #include <linux/string.h>
11 #include "wilc_wlan_if.h"
12 #include "wilc_wlan.h"
13 #include "wilc_wlan_cfg.h"
14 #include "coreconfigurator.h"
16 /********************************************
20 ********************************************/
23 wilc_debug_func dPrint
;
30 u8 firmware_version
[129];
34 u8 hardwareProductVersion
[33];
45 static wilc_mac_cfg_t g_mac
;
47 static wilc_cfg_byte_t g_cfg_byte
[] = {
49 {WID_CURRENT_TX_RATE
, 0},
50 {WID_CURRENT_CHANNEL
, 0},
52 {WID_11G_OPERATING_MODE
, 0},
57 {WID_POWER_MANAGEMENT
, 0},
61 {WID_LISTEN_INTERVAL
, 0},
65 {WID_REKEY_POLICY
, 0},
66 {WID_SHORT_SLOT_ALLOWED
, 0},
67 {WID_START_SCAN_REQ
, 0},
70 {WID_AUTO_RX_SENSITIVITY
, 0},
71 {WID_DATAFLOW_CONTROL
, 0},
73 {WID_11N_PROT_MECH
, 0},
74 {WID_11N_ERP_PROT_TYPE
, 0},
76 {WID_11N_OPERATING_MODE
, 0},
77 {WID_11N_OBSS_NONHT_DETECTION
, 0},
78 {WID_11N_HT_PROT_TYPE
, 0},
79 {WID_11N_RIFS_PROT_ENABLE
, 0},
80 {WID_11N_SMPS_MODE
, 0},
81 {WID_11N_CURRENT_TX_MCS
, 0},
82 {WID_11N_SHORT_GI_ENABLE
, 0},
84 {WID_TX_ABORT_CONFIG
, 0},
85 {WID_11N_IMMEDIATE_BA_ENABLED
, 0},
86 {WID_11N_TXOP_PROT_DISABLE
, 0},
90 static wilc_cfg_hword_t g_cfg_hword
[] = {
91 {WID_LINK_LOSS_THRESHOLD
, 0},
92 {WID_RTS_THRESHOLD
, 0},
93 {WID_FRAG_THRESHOLD
, 0},
94 {WID_SHORT_RETRY_LIMIT
, 0},
95 {WID_LONG_RETRY_LIMIT
, 0},
96 {WID_BEACON_INTERVAL
, 0},
98 {WID_ACTIVE_SCAN_TIME
, 0},
99 {WID_PASSIVE_SCAN_TIME
, 0},
100 {WID_SITE_SURVEY_SCAN_TIME
, 0},
101 {WID_JOIN_START_TIMEOUT
, 0},
102 {WID_AUTH_TIMEOUT
, 0},
103 {WID_ASOC_TIMEOUT
, 0},
104 {WID_11I_PROTOCOL_TIMEOUT
, 0},
105 {WID_EAPOL_RESPONSE_TIMEOUT
, 0},
106 {WID_11N_SIG_QUAL_VAL
, 0},
107 {WID_CCA_THRESHOLD
, 0},
111 static wilc_cfg_word_t g_cfg_word
[] = {
112 {WID_FAILED_COUNT
, 0},
113 {WID_RETRY_COUNT
, 0},
114 {WID_MULTIPLE_RETRY_COUNT
, 0},
115 {WID_FRAME_DUPLICATE_COUNT
, 0},
116 {WID_ACK_FAILURE_COUNT
, 0},
117 {WID_RECEIVED_FRAGMENT_COUNT
, 0},
118 {WID_MCAST_RECEIVED_FRAME_COUNT
, 0},
119 {WID_FCS_ERROR_COUNT
, 0},
120 {WID_SUCCESS_FRAME_COUNT
, 0},
121 {WID_TX_FRAGMENT_COUNT
, 0},
122 {WID_TX_MULTICAST_FRAME_COUNT
, 0},
123 {WID_RTS_SUCCESS_COUNT
, 0},
124 {WID_RTS_FAILURE_COUNT
, 0},
125 {WID_WEP_UNDECRYPTABLE_COUNT
, 0},
126 {WID_REKEY_PERIOD
, 0},
127 {WID_REKEY_PACKET_COUNT
, 0},
128 {WID_HW_RX_COUNT
, 0},
129 {WID_GET_INACTIVE_TIME
, 0},
134 static wilc_cfg_str_t g_cfg_str
[] = {
135 {WID_SSID
, g_mac
.ssid
}, /* 33 + 1 bytes */
136 {WID_FIRMWARE_VERSION
, g_mac
.firmware_version
},
137 {WID_OPERATIONAL_RATE_SET
, g_mac
.supp_rate
},
138 {WID_BSSID
, g_mac
.bssid
}, /* 6 bytes */
139 {WID_WEP_KEY_VALUE
, g_mac
.wep_key
}, /* 27 bytes */
140 {WID_11I_PSK
, g_mac
.i_psk
}, /* 65 bytes */
141 /* {WID_11E_P_ACTION_REQ, g_mac.action_req}, */
142 {WID_HARDWARE_VERSION
, g_mac
.hardwareProductVersion
},
143 {WID_MAC_ADDR
, g_mac
.mac_address
},
144 {WID_PHY_VERSION
, g_mac
.phyversion
},
145 {WID_SUPP_USERNAME
, g_mac
.supp_username
},
146 {WID_SUPP_PASSWORD
, g_mac
.supp_password
},
147 {WID_SITE_SURVEY_RESULTS
, g_mac
.scan_result
},
148 {WID_SITE_SURVEY_RESULTS
, g_mac
.scan_result1
},
149 /* {WID_RX_POWER_LEVEL, g_mac.channel_rssi}, */
150 {WID_ASSOC_REQ_INFO
, g_mac
.assoc_req
},
151 {WID_ASSOC_RES_INFO
, g_mac
.assoc_rsp
},
152 /* {WID_11N_P_ACTION_REQ, g_mac.action_req}, */
153 {WID_FIRMWARE_INFO
, g_mac
.firmware_version
},
154 {WID_IP_ADDRESS
, g_mac
.ip_address
},
158 /********************************************
160 * Configuration Functions
162 ********************************************/
164 static int wilc_wlan_cfg_set_byte(u8
*frame
, u32 offset
, u16 id
, u8 val8
)
168 if ((offset
+ 4) >= MAX_CFG_FRAME_SIZE
)
171 buf
= &frame
[offset
];
174 buf
[1] = (u8
)(id
>> 8);
180 static int wilc_wlan_cfg_set_hword(u8
*frame
, u32 offset
, u16 id
, u16 val16
)
184 if ((offset
+ 5) >= MAX_CFG_FRAME_SIZE
)
187 buf
= &frame
[offset
];
190 buf
[1] = (u8
)(id
>> 8);
193 buf
[4] = (u8
)(val16
>> 8);
198 static int wilc_wlan_cfg_set_word(u8
*frame
, u32 offset
, u16 id
, u32 val32
)
202 if ((offset
+ 7) >= MAX_CFG_FRAME_SIZE
)
205 buf
= &frame
[offset
];
208 buf
[1] = (u8
)(id
>> 8);
211 buf
[4] = (u8
)(val32
>> 8);
212 buf
[5] = (u8
)(val32
>> 16);
213 buf
[6] = (u8
)(val32
>> 24);
218 static int wilc_wlan_cfg_set_str(u8
*frame
, u32 offset
, u16 id
, u8
*str
, u32 size
)
222 if ((offset
+ size
+ 3) >= MAX_CFG_FRAME_SIZE
)
225 buf
= &frame
[offset
];
228 buf
[1] = (u8
)(id
>> 8);
231 if ((str
!= NULL
) && (size
!= 0))
232 memcpy(&buf
[3], str
, size
);
237 static int wilc_wlan_cfg_set_bin(u8
*frame
, u32 offset
, u16 id
, u8
*b
, u32 size
)
243 if ((offset
+ size
+ 5) >= MAX_CFG_FRAME_SIZE
)
246 buf
= &frame
[offset
];
248 buf
[1] = (u8
)(id
>> 8);
250 buf
[3] = (u8
)(size
>> 8);
252 if ((b
!= NULL
) && (size
!= 0)) {
253 memcpy(&buf
[4], b
, size
);
254 for (i
= 0; i
< size
; i
++) {
255 checksum
+= buf
[i
+ 4];
259 buf
[size
+ 4] = checksum
;
264 /********************************************
266 * Configuration Response Functions
268 ********************************************/
270 static void wilc_wlan_parse_response_frame(u8
*info
, int size
)
272 u32 wid
, len
= 0, i
= 0;
276 wid
= info
[0] | (info
[1] << 8);
277 wid
= cpu_to_le32(wid
);
279 switch ((wid
>> 12) & 0x7) {
282 if (g_cfg_byte
[i
].id
== WID_NIL
)
285 if (g_cfg_byte
[i
].id
== wid
) {
286 g_cfg_byte
[i
].val
= info
[3];
296 if (g_cfg_hword
[i
].id
== WID_NIL
)
299 if (g_cfg_hword
[i
].id
== wid
) {
300 g_cfg_hword
[i
].val
= cpu_to_le16(info
[3] | (info
[4] << 8));
310 if (g_cfg_word
[i
].id
== WID_NIL
)
313 if (g_cfg_word
[i
].id
== wid
) {
314 g_cfg_word
[i
].val
= cpu_to_le32(info
[3] | (info
[4] << 8) | (info
[5] << 16) | (info
[6] << 24));
324 if (g_cfg_str
[i
].id
== WID_NIL
)
327 if (g_cfg_str
[i
].id
== wid
) {
328 if (wid
== WID_SITE_SURVEY_RESULTS
) {
334 memcpy(g_cfg_str
[i
].str
, &info
[2], (info
[2] + 1));
350 static int wilc_wlan_parse_info_frame(u8
*info
, int size
)
352 wilc_mac_cfg_t
*pd
= &g_mac
;
354 int type
= WILC_CFG_RSP_STATUS
;
356 wid
= info
[0] | (info
[1] << 8);
360 if ((len
== 1) && (wid
== WID_STATUS
)) {
361 pd
->mac_status
= info
[3];
362 type
= WILC_CFG_RSP_STATUS
;
368 /********************************************
370 * Configuration Exported Functions
372 ********************************************/
374 int wilc_wlan_cfg_set_wid(u8
*frame
, u32 offset
, u16 id
, u8
*buf
, int size
)
376 u8 type
= (id
>> 12) & 0xf;
379 if (type
== 0) { /* byte command */
381 ret
= wilc_wlan_cfg_set_byte(frame
, offset
, id
, *buf
);
382 } else if (type
== 1) { /* half word command */
384 ret
= wilc_wlan_cfg_set_hword(frame
, offset
, id
, *((u16
*)buf
));
385 } else if (type
== 2) { /* word command */
387 ret
= wilc_wlan_cfg_set_word(frame
, offset
, id
, *((u32
*)buf
));
388 } else if (type
== 3) { /* string command */
389 ret
= wilc_wlan_cfg_set_str(frame
, offset
, id
, buf
, size
);
390 } else if (type
== 4) { /* binary command */
391 ret
= wilc_wlan_cfg_set_bin(frame
, offset
, id
, buf
, size
);
393 g_mac
.dPrint(N_ERR
, "illegal id\n");
399 int wilc_wlan_cfg_get_wid(u8
*frame
, u32 offset
, u16 id
)
403 if ((offset
+ 2) >= MAX_CFG_FRAME_SIZE
)
406 buf
= &frame
[offset
];
409 buf
[1] = (u8
)(id
>> 8);
414 int wilc_wlan_cfg_get_wid_value(u16 wid
, u8
*buffer
, u32 buffer_size
)
416 u32 type
= (wid
>> 12) & 0xf;
419 if (wid
== WID_STATUS
) {
420 *((u32
*)buffer
) = g_mac
.mac_status
;
425 if (type
== 0) { /* byte command */
427 if (g_cfg_byte
[i
].id
== WID_NIL
)
430 if (g_cfg_byte
[i
].id
== wid
) {
431 memcpy(buffer
, &g_cfg_byte
[i
].val
, 1);
437 } else if (type
== 1) { /* half word command */
439 if (g_cfg_hword
[i
].id
== WID_NIL
)
442 if (g_cfg_hword
[i
].id
== wid
) {
443 memcpy(buffer
, &g_cfg_hword
[i
].val
, 2);
449 } else if (type
== 2) { /* word command */
451 if (g_cfg_word
[i
].id
== WID_NIL
)
454 if (g_cfg_word
[i
].id
== wid
) {
455 memcpy(buffer
, &g_cfg_word
[i
].val
, 4);
461 } else if (type
== 3) { /* string command */
463 if (g_cfg_str
[i
].id
== WID_NIL
)
466 if (g_cfg_str
[i
].id
== wid
) {
467 u32 size
= g_cfg_str
[i
].str
[0];
469 if (buffer_size
>= size
) {
470 if (g_cfg_str
[i
].id
== WID_SITE_SURVEY_RESULTS
) {
477 memcpy(buffer
, &g_cfg_str
[i
].str
[1], size
);
485 g_mac
.dPrint(N_ERR
, "[CFG]: illegal type (%08x)\n", wid
);
491 int wilc_wlan_cfg_indicate_rx(struct wilc
*wilc
, u8
*frame
, int size
,
492 struct wilc_cfg_rsp
*rsp
)
499 msg_id
= frame
[1]; /* seq no */
504 * The valid types of response messages are 'R' (Response), 'I' (Information), and 'N' (Network Information)
509 wilc_wlan_parse_response_frame(frame
, size
);
510 rsp
->type
= WILC_CFG_RSP
;
511 rsp
->seq_no
= msg_id
;
515 rsp
->type
= wilc_wlan_parse_info_frame(frame
, size
);
516 rsp
->seq_no
= msg_id
;
517 /*call host interface info parse as well*/
518 wilc_gnrl_async_info_received(wilc
, frame
- 4, size
+ 4);
522 wilc_network_info_received(wilc
, frame
- 4, size
+ 4);
527 wilc_scan_complete_received(wilc
, frame
- 4, size
+ 4);
532 rsp
->seq_no
= msg_id
;
540 int wilc_wlan_cfg_init(wilc_debug_func func
)
542 memset((void *)&g_mac
, 0, sizeof(wilc_mac_cfg_t
));