OpenWrt packages
Sign in or create your account | Project List | Help
OpenWrt packages Git Source Tree
Root/
| 1 | #include <linux/kernel.h> |
| 2 | #include <linux/mmc/sdio_func.h> |
| 3 | |
| 4 | #include "ks_wlan.h" |
| 5 | #include "ks_hostif.h" |
| 6 | #include "ks_wlan_ioctl.h" |
| 7 | #include "ks_debug.h" |
| 8 | |
| 9 | static int wep_on_off; |
| 10 | #define WEP_OFF 0 |
| 11 | #define WEP_ON_64BIT 1 |
| 12 | #define WEP_ON_128BIT 2 |
| 13 | |
| 14 | static int wep_type; |
| 15 | #define WEP_KEY_CHARACTER 0 |
| 16 | #define WEP_KEY_HEX 1 |
| 17 | |
| 18 | static |
| 19 | void analyze_character_wep_key(struct ks_wlan_parameter *param, int wep_key_index, char *value) |
| 20 | { |
| 21 | int i; |
| 22 | unsigned char wep_key[26], key_length; |
| 23 | |
| 24 | key_length = (wep_on_off == WEP_ON_64BIT) ? 5 : 13; |
| 25 | /* 64bit key_length = 5; 128bit key_length = 13; */ |
| 26 | |
| 27 | for (i=0; i<key_length; i++) { |
| 28 | wep_key[i] = value[i]; |
| 29 | } |
| 30 | |
| 31 | if(wep_key_index < 0 || wep_key_index > 3) |
| 32 | return; |
| 33 | |
| 34 | param->wep_key[wep_key_index].size = key_length; |
| 35 | for (i=0; i<(param->wep_key[wep_key_index].size); i++) { |
| 36 | param->wep_key[wep_key_index].val[i] = wep_key[i]; |
| 37 | } |
| 38 | } |
| 39 | |
| 40 | static |
| 41 | void analyze_hex_wep_key(struct ks_wlan_parameter *param, int wep_key_index, char *value) |
| 42 | { |
| 43 | unsigned char wep_end[26], i, j, key_length; |
| 44 | |
| 45 | key_length = (wep_on_off == WEP_ON_64BIT) ? 10 : 26; |
| 46 | /* 64bit key_length = 10; 128bit key_length = 26; */ |
| 47 | |
| 48 | for (i=0; i<key_length; i++) { |
| 49 | wep_end[i] = value[i]; |
| 50 | if (i % 2) { |
| 51 | /* Odd */ |
| 52 | for (j=0x00; j<0x10; j++) { |
| 53 | if (j<0x0a) { |
| 54 | if (wep_end[i] == j+0x30) |
| 55 | wep_end[i] = j; |
| 56 | } else { |
| 57 | if ((wep_end[i] == j+0x37) | (wep_end[i] == j+0x57)) |
| 58 | wep_end[i] = j; |
| 59 | } |
| 60 | } |
| 61 | } else { |
| 62 | /* Even */ |
| 63 | for (j=0x00; j<0x10; j++) { |
| 64 | if (j<0x0a) { |
| 65 | if (wep_end[i] == j+0x30) { |
| 66 | wep_end[i] = j*16; |
| 67 | } |
| 68 | } else { |
| 69 | if ((wep_end[i] == j+0x37) | (wep_end[i] == j+0x57)) |
| 70 | wep_end[i] = j*16; |
| 71 | } |
| 72 | } |
| 73 | } |
| 74 | } |
| 75 | |
| 76 | for (i=0; i<key_length/2; i++) { |
| 77 | wep_end[i] = wep_end[i*2] + wep_end[(i*2)+1]; |
| 78 | } |
| 79 | |
| 80 | if(wep_key_index < 0 || wep_key_index > 3) |
| 81 | return ; |
| 82 | |
| 83 | param->wep_key[wep_key_index].size = key_length/2; |
| 84 | for (i=0; i<(param->wep_key[wep_key_index].size); i++) { |
| 85 | param->wep_key[wep_key_index].val[i] = wep_end[i]; |
| 86 | } |
| 87 | |
| 88 | } |
| 89 | |
| 90 | static |
| 91 | int rate_set_configuration(ks_wlan_private *priv, char *value) |
| 92 | { |
| 93 | int rc=0; |
| 94 | |
| 95 | priv->reg.tx_rate = TX_RATE_FIXED; |
| 96 | priv->reg.rate_set.size = 1; |
| 97 | |
| 98 | switch(*value){ |
| 99 | case '1': /* 1M 11M 12M 18M */ |
| 100 | if(*(value+1) == '8'){ |
| 101 | priv->reg.rate_set.body[0] = TX_RATE_18M; |
| 102 | } |
| 103 | else if(*(value+1) == '2'){ |
| 104 | priv->reg.rate_set.body[0] = TX_RATE_12M|BASIC_RATE; |
| 105 | } |
| 106 | else if(*(value+1) == '1'){ |
| 107 | priv->reg.rate_set.body[0] = TX_RATE_11M|BASIC_RATE; |
| 108 | } |
| 109 | else{ |
| 110 | priv->reg.rate_set.body[0] = TX_RATE_1M|BASIC_RATE; |
| 111 | } |
| 112 | break; |
| 113 | case '2': /* 2M 24M */ |
| 114 | if(*(value+1) == '4'){ |
| 115 | priv->reg.rate_set.body[0] = TX_RATE_24M|BASIC_RATE; |
| 116 | } |
| 117 | else{ |
| 118 | priv->reg.rate_set.body[0] = TX_RATE_2M|BASIC_RATE; |
| 119 | } |
| 120 | break; |
| 121 | case '3': /* 36M */ |
| 122 | priv->reg.rate_set.body[0] = TX_RATE_36M; |
| 123 | break; |
| 124 | case '4': /* 48M */ |
| 125 | priv->reg.rate_set.body[0] = TX_RATE_48M; |
| 126 | break; |
| 127 | case '5': /* 5.5M 54M */ |
| 128 | if(*(value+1) == '4'){ |
| 129 | priv->reg.rate_set.body[0] = TX_RATE_54M; |
| 130 | } |
| 131 | else{ |
| 132 | priv->reg.rate_set.body[0] = TX_RATE_5M|BASIC_RATE; |
| 133 | } |
| 134 | break; |
| 135 | case '6': /* 6M */ |
| 136 | priv->reg.rate_set.body[0] = TX_RATE_6M|BASIC_RATE; |
| 137 | break; |
| 138 | case '9': /* 9M */ |
| 139 | priv->reg.rate_set.body[0] = TX_RATE_9M; |
| 140 | break; |
| 141 | case 'K': |
| 142 | priv->reg.rate_set.body[6] = TX_RATE_36M; |
| 143 | priv->reg.rate_set.body[5] = TX_RATE_18M; |
| 144 | priv->reg.rate_set.body[4] = TX_RATE_24M|BASIC_RATE; |
| 145 | priv->reg.rate_set.body[3] = TX_RATE_12M|BASIC_RATE; |
| 146 | priv->reg.rate_set.body[2] = TX_RATE_6M|BASIC_RATE; |
| 147 | priv->reg.rate_set.body[1] = TX_RATE_11M|BASIC_RATE; |
| 148 | priv->reg.rate_set.body[0] = TX_RATE_2M|BASIC_RATE; |
| 149 | priv->reg.tx_rate = TX_RATE_FULL_AUTO; |
| 150 | priv->reg.rate_set.size = 7; |
| 151 | break; |
| 152 | default: |
| 153 | priv->reg.rate_set.body[11] = TX_RATE_54M; |
| 154 | priv->reg.rate_set.body[10] = TX_RATE_48M; |
| 155 | priv->reg.rate_set.body[9] = TX_RATE_36M; |
| 156 | priv->reg.rate_set.body[8] = TX_RATE_18M; |
| 157 | priv->reg.rate_set.body[7] = TX_RATE_9M; |
| 158 | priv->reg.rate_set.body[6] = TX_RATE_24M|BASIC_RATE; |
| 159 | priv->reg.rate_set.body[5] = TX_RATE_12M|BASIC_RATE; |
| 160 | priv->reg.rate_set.body[4] = TX_RATE_6M|BASIC_RATE; |
| 161 | priv->reg.rate_set.body[3] = TX_RATE_11M|BASIC_RATE; |
| 162 | priv->reg.rate_set.body[2] = TX_RATE_5M|BASIC_RATE; |
| 163 | priv->reg.rate_set.body[1] = TX_RATE_2M|BASIC_RATE; |
| 164 | priv->reg.rate_set.body[0] = TX_RATE_1M|BASIC_RATE; |
| 165 | priv->reg.tx_rate = TX_RATE_FULL_AUTO; |
| 166 | priv->reg.rate_set.size = 12; |
| 167 | break; |
| 168 | } |
| 169 | return rc; |
| 170 | } |
| 171 | |
| 172 | #ifndef NO_FIRMWARE_CLASS |
| 173 | #include <linux/firmware.h> |
| 174 | #else |
| 175 | #define MAX_CONFIG_FILE_SIZE (1024*10) |
| 176 | #endif |
| 177 | int ks_wlan_read_config_file(ks_wlan_private *priv) |
| 178 | { |
| 179 | struct { |
| 180 | const int key_len; |
| 181 | const char *key; |
| 182 | const char *val; |
| 183 | } cfg_tbl[] = { |
| 184 | {15,"BeaconLostCount", "20"}, /* 0 */ |
| 185 | {7,"Channel", "1"}, /* 1 */ |
| 186 | {17,"FragmentThreshold","2346"}, /* 2 */ |
| 187 | {13,"OperationMode","Infrastructure"}, /* 3 */ |
| 188 | {19,"PowerManagementMode","ACTIVE"}, /* 4 */ |
| 189 | {12,"RTSThreshold","2347"}, /* 5 */ |
| 190 | {4,"SSID","default"}, /* 6 */ |
| 191 | {6,"TxRate","Auto"}, /* 7 */ |
| 192 | {23,"AuthenticationAlgorithm",""}, /* 8 */ |
| 193 | {12,"WepKeyValue1",""}, /* 9 */ |
| 194 | {12,"WepKeyValue2",""}, /* 10 */ |
| 195 | {12,"WepKeyValue3",""}, /* 11 */ |
| 196 | {12,"WepKeyValue4",""}, /* 12 */ |
| 197 | {8,"WepIndex","1"}, /* 13 */ |
| 198 | {7,"WepType","STRING"}, /* 14 */ |
| 199 | {3,"Wep","OFF"}, /* 15 */ |
| 200 | {13,"PREAMBLE_TYPE","SHORT"}, /* 16 */ |
| 201 | {8,"ScanType","ACTIVE_SCAN"}, /* 17 */ |
| 202 | {8,"ROM_FILE", ROM_FILE}, /* 18 */ |
| 203 | {7,"PhyType", "BG_MODE"}, /* 19 */ |
| 204 | {7,"CtsMode", "FALSE"}, /* 20 */ |
| 205 | {19,"PhyInformationTimer", "0"}, /* 21 */ |
| 206 | {0,"",""}, |
| 207 | }; |
| 208 | |
| 209 | #ifndef NO_FIRMWARE_CLASS |
| 210 | const struct firmware *fw_entry; |
| 211 | struct device *dev = NULL; |
| 212 | int retval; |
| 213 | #else |
| 214 | struct file *srcf; |
| 215 | int nr_read ; |
| 216 | int retval; |
| 217 | char *cfg_buf=NULL; |
| 218 | int orgfsuid, orgfsgid; |
| 219 | mm_segment_t orgfs; |
| 220 | #endif |
| 221 | char cfg_file[]=CFG_FILE; |
| 222 | char *cur_p, *end_p; |
| 223 | char wk_buff[256], *wk_p; |
| 224 | |
| 225 | /* Initialize Variable */ |
| 226 | priv->reg.operation_mode = MODE_INFRASTRUCTURE; /* Infrastructure */ |
| 227 | priv->reg.channel = 10; /* 10 */ |
| 228 | memset(priv->reg.bssid, 0x0, ETH_ALEN); /* BSSID */ |
| 229 | priv->reg.ssid.body[0] = '\0'; /* SSID */ |
| 230 | priv->reg.ssid.size = 0; /* SSID size */ |
| 231 | priv->reg.tx_rate = TX_RATE_AUTO; /* TxRate Fully Auto */ |
| 232 | priv->reg.preamble = SHORT_PREAMBLE; /* Preamble = SHORT */ |
| 233 | priv->reg.powermgt = POWMGT_ACTIVE_MODE; /* POWMGT_ACTIVE_MODE */ |
| 234 | priv->reg.scan_type = ACTIVE_SCAN; /* Active */ |
| 235 | priv->reg.beacon_lost_count = 20; /* Beacon Lost Count */ |
| 236 | priv->reg.rts = 2347UL; /* RTS Threashold */ |
| 237 | priv->reg.fragment = 2346UL; /* Fragmentation Threashold */ |
| 238 | |
| 239 | strcpy(&priv->reg.rom_file[0], ROM_FILE); |
| 240 | |
| 241 | priv->skb = NULL; |
| 242 | |
| 243 | priv->reg.authenticate_type = AUTH_TYPE_OPEN_SYSTEM; /* AuthenticationAlgorithm */ |
| 244 | |
| 245 | priv->reg.privacy_invoked = 0x00; /* WEP */ |
| 246 | priv->reg.wep_index=0; |
| 247 | memset(&priv->reg.wep_key[0],0,sizeof(priv->reg.wep_key[0])); |
| 248 | memset(&priv->reg.wep_key[1],0,sizeof(priv->reg.wep_key[0])); |
| 249 | memset(&priv->reg.wep_key[2],0,sizeof(priv->reg.wep_key[0])); |
| 250 | memset(&priv->reg.wep_key[3],0,sizeof(priv->reg.wep_key[0])); |
| 251 | |
| 252 | priv->reg.phy_type = D_11BG_COMPATIBLE_MODE; |
| 253 | priv->reg.cts_mode = CTS_MODE_FALSE; |
| 254 | priv->reg.phy_info_timer = 0; |
| 255 | priv->reg.rate_set.body[11] = TX_RATE_54M; |
| 256 | priv->reg.rate_set.body[10] = TX_RATE_48M; |
| 257 | priv->reg.rate_set.body[9] = TX_RATE_36M; |
| 258 | priv->reg.rate_set.body[8] = TX_RATE_18M; |
| 259 | priv->reg.rate_set.body[7] = TX_RATE_9M; |
| 260 | priv->reg.rate_set.body[6] = TX_RATE_24M|BASIC_RATE; |
| 261 | priv->reg.rate_set.body[5] = TX_RATE_12M|BASIC_RATE; |
| 262 | priv->reg.rate_set.body[4] = TX_RATE_6M|BASIC_RATE; |
| 263 | priv->reg.rate_set.body[3] = TX_RATE_11M|BASIC_RATE; |
| 264 | priv->reg.rate_set.body[2] = TX_RATE_5M|BASIC_RATE; |
| 265 | priv->reg.rate_set.body[1] = TX_RATE_2M|BASIC_RATE; |
| 266 | priv->reg.rate_set.body[0] = TX_RATE_1M|BASIC_RATE; |
| 267 | priv->reg.tx_rate = TX_RATE_FULL_AUTO; |
| 268 | priv->reg.rate_set.size = 12; |
| 269 | |
| 270 | #ifndef NO_FIRMWARE_CLASS |
| 271 | #if (defined _PCMCIA_) |
| 272 | dev = &priv->ks_wlan_hw.pcmcia_dev->dev; |
| 273 | #elif (defined _PCI_) |
| 274 | dev = &priv->ks_wlan_hw.pci_dev->dev; |
| 275 | #elif (defined _SDIO_) |
| 276 | dev = &priv->ks_wlan_hw.sdio_card->func->dev; |
| 277 | #endif |
| 278 | if((retval = request_firmware(&fw_entry, cfg_file, dev)) !=0 ){ |
| 279 | DPRINTK(1, "error request_firmware() file=%s ret=%d\n", cfg_file, retval); |
| 280 | return 1; |
| 281 | } |
| 282 | |
| 283 | DPRINTK(4, "success request_firmware() file=%s size=%d\n", cfg_file, fw_entry->size); |
| 284 | cur_p = fw_entry->data; |
| 285 | end_p = cur_p + fw_entry->size; |
| 286 | #else |
| 287 | orgfsuid=current->fsuid; |
| 288 | orgfsgid=current->fsgid; |
| 289 | orgfs=get_fs(); |
| 290 | set_fs(KERNEL_DS); |
| 291 | |
| 292 | srcf = filp_open(cfg_file, O_RDONLY, 0); |
| 293 | if (IS_ERR(srcf)) { |
| 294 | printk(KERN_ERR "error %ld opening %s\n", -PTR_ERR(srcf),cfg_file); |
| 295 | goto no_config_file; |
| 296 | } |
| 297 | |
| 298 | if (!(srcf->f_op && srcf->f_op->read)) { |
| 299 | printk(KERN_ERR "%s does not have a read method\n", cfg_file); |
| 300 | goto no_config_file; |
| 301 | } |
| 302 | |
| 303 | cfg_buf = (char *)kzalloc(MAX_CONFIG_FILE_SIZE, GFP_ATOMIC); |
| 304 | if (!cfg_buf) { |
| 305 | printk(KERN_ERR "%s does not read : out of memory \n", cfg_file); |
| 306 | goto no_config_file; |
| 307 | } |
| 308 | |
| 309 | nr_read = srcf->f_op->read(srcf, (unsigned char *)cfg_buf, MAX_CONFIG_FILE_SIZE, &srcf->f_pos); |
| 310 | |
| 311 | DPRINTK(1, "read retval=%d file=%s\n", nr_read, priv->reg.cfg_file); |
| 312 | retval=filp_close(srcf ,NULL); |
| 313 | if (retval) |
| 314 | DPRINTK(1, "error %d closing %s\n", -retval,priv->reg.cfg_file); |
| 315 | |
| 316 | if (nr_read < 1) { |
| 317 | printk(KERN_ERR "%s does not read : file is empty num=%d\n", cfg_file, nr_read); |
| 318 | goto no_config_file; |
| 319 | }else if(nr_read > MAX_CONFIG_FILE_SIZE){ |
| 320 | printk(KERN_ERR "%s does not read : file is too big \n", cfg_file); |
| 321 | goto no_config_file; |
| 322 | } |
| 323 | cur_p = cfg_buf; |
| 324 | end_p = cur_p + nr_read; |
| 325 | #endif |
| 326 | *end_p = '\0'; |
| 327 | |
| 328 | while (cur_p < end_p) { |
| 329 | int i, j, len; |
| 330 | |
| 331 | len = end_p - cur_p; |
| 332 | for (i=0; cfg_tbl[i].key_len != 0; i++) { |
| 333 | if (*cur_p == '#') { |
| 334 | break; |
| 335 | } |
| 336 | if (len < cfg_tbl[i].key_len) { |
| 337 | continue; |
| 338 | } |
| 339 | if (!strncmp(cfg_tbl[i].key, cur_p, cfg_tbl[i].key_len)) { |
| 340 | break; |
| 341 | } |
| 342 | } |
| 343 | if ((*cur_p == '#') || (cfg_tbl[i].key_len == 0)) { |
| 344 | while (*cur_p != '\n') { |
| 345 | if (cur_p >= end_p) { |
| 346 | break; |
| 347 | } |
| 348 | cur_p++; |
| 349 | } |
| 350 | cur_p++; |
| 351 | } else { |
| 352 | cur_p += cfg_tbl[i].key_len; |
| 353 | if (*cur_p != '=') { |
| 354 | while (*cur_p != '\n') { |
| 355 | if (cur_p >= end_p) { |
| 356 | break; |
| 357 | } |
| 358 | cur_p++; |
| 359 | } |
| 360 | continue; |
| 361 | } |
| 362 | cur_p++; |
| 363 | |
| 364 | for (j=0,wk_p=cur_p; *wk_p != '\n' && wk_p < end_p; j++,wk_p++) { |
| 365 | wk_buff[j] = *wk_p; |
| 366 | } |
| 367 | wk_buff[j] = '\0'; |
| 368 | cur_p = wk_p; |
| 369 | DPRINTK(4,"%s=%s\n",cfg_tbl[i].key, wk_buff); |
| 370 | wk_p = wk_buff; |
| 371 | |
| 372 | switch (i) { |
| 373 | case 0: /* "BeaconLostCount", "10" */ |
| 374 | priv->reg.beacon_lost_count = simple_strtol(wk_buff, NULL, 10); |
| 375 | break; |
| 376 | case 1: /* "Channel", "1" */ |
| 377 | priv->reg.channel = simple_strtol(wk_buff, NULL, 10); |
| 378 | break; |
| 379 | case 2: /* "FragmentThreshold","2346" */ |
| 380 | j = simple_strtol(wk_buff, NULL, 10); |
| 381 | priv->reg.fragment = (unsigned long)j; |
| 382 | break; |
| 383 | case 3: /* "OperationMode","Infrastructure" */ |
| 384 | switch (*wk_buff) { |
| 385 | case 'P': |
| 386 | priv->reg.operation_mode = MODE_PSEUDO_ADHOC; |
| 387 | break; |
| 388 | case 'I': |
| 389 | priv->reg.operation_mode = MODE_INFRASTRUCTURE; |
| 390 | break; |
| 391 | case '8': |
| 392 | priv->reg.operation_mode = MODE_ADHOC; |
| 393 | break; |
| 394 | default: |
| 395 | priv->reg.operation_mode = MODE_INFRASTRUCTURE; |
| 396 | } |
| 397 | break; |
| 398 | case 4: /* "PowerManagementMode","POWER_ACTIVE" */ |
| 399 | if (!strncmp(wk_buff, "SAVE1", 5)) { |
| 400 | priv->reg.powermgt = POWMGT_SAVE1_MODE; |
| 401 | } else if (!strncmp(wk_buff, "SAVE2", 5)){ |
| 402 | priv->reg.powermgt = POWMGT_SAVE2_MODE; |
| 403 | } else { |
| 404 | priv->reg.powermgt = POWMGT_ACTIVE_MODE; |
| 405 | } |
| 406 | break; |
| 407 | case 5: /* "RTSThreshold","2347" */ |
| 408 | j = simple_strtol(wk_buff, NULL, 10); |
| 409 | priv->reg.rts = (unsigned long)j; |
| 410 | break; |
| 411 | case 6: /* "SSID","" */ |
| 412 | if (*wk_p != '"') |
| 413 | break; |
| 414 | wk_p++; |
| 415 | for (j=0; *wk_p != '"'; j++) { |
| 416 | if (wk_p == '\0') { |
| 417 | break; |
| 418 | } |
| 419 | priv->reg.ssid.body[j] = *wk_p++; |
| 420 | } |
| 421 | priv->reg.ssid.body[j] = '\0'; |
| 422 | priv->reg.ssid.size = j; |
| 423 | wk_p++; |
| 424 | break; |
| 425 | case 7: /* "TxRate","Auto" */ |
| 426 | rate_set_configuration(priv, wk_p); |
| 427 | break; |
| 428 | case 8: /* "AuthenticationAlgorithm","OPEN_SYSTEM" */ |
| 429 | switch (*wk_p) { |
| 430 | case 'O': /* Authenticate System : Open System */ |
| 431 | priv->reg.authenticate_type = AUTH_TYPE_OPEN_SYSTEM; |
| 432 | break; |
| 433 | case 'S': /* Authenticate System : Shared Key */ |
| 434 | priv->reg.authenticate_type = AUTH_TYPE_SHARED_KEY; |
| 435 | break; |
| 436 | } |
| 437 | break; |
| 438 | case 9: /* "WepKeyValue1","" */ |
| 439 | case 10: /* "WepKeyValue2","" */ |
| 440 | case 11: /* "WepKeyValue3","" */ |
| 441 | case 12: /* "WepKeyValue4","" */ |
| 442 | if (wep_on_off != WEP_OFF) { |
| 443 | switch (wep_type) { |
| 444 | case WEP_KEY_CHARACTER: |
| 445 | analyze_character_wep_key(&priv->reg, (i-9), wk_p); |
| 446 | break; |
| 447 | case WEP_KEY_HEX: |
| 448 | analyze_hex_wep_key(&priv->reg, (i-9), wk_p); |
| 449 | break; |
| 450 | } |
| 451 | } |
| 452 | break; |
| 453 | case 13: /* "WepIndex","1"->0 (So, Zero Origin) */ |
| 454 | priv->reg.wep_index = simple_strtol(wk_buff, NULL, 10) - 1; |
| 455 | break; |
| 456 | case 14: /* "WepType","STRING" */ |
| 457 | if (!strncmp(wk_buff, "STRING", 6)) { |
| 458 | wep_type = WEP_KEY_CHARACTER; |
| 459 | } else { |
| 460 | wep_type = WEP_KEY_HEX; |
| 461 | } |
| 462 | break; |
| 463 | case 15: /* "Wep","OFF" */ |
| 464 | if (!strncmp(wk_buff, "OFF", 3)) { |
| 465 | priv->reg.privacy_invoked = 0x00; |
| 466 | wep_on_off = WEP_OFF; |
| 467 | } else { /* 64bit or 128bit */ |
| 468 | priv->reg.privacy_invoked = 0x01; |
| 469 | if (*wk_buff == '6') { /* 64bit */ |
| 470 | wep_on_off = WEP_ON_64BIT; |
| 471 | } else { /* 128bit */ |
| 472 | wep_on_off = WEP_ON_128BIT; |
| 473 | } |
| 474 | } |
| 475 | break; |
| 476 | case 16: /* "PREAMBLE_TYPE","LONG" */ |
| 477 | if (!strncmp(wk_buff, "SHORT", 5)) { |
| 478 | priv->reg.preamble = SHORT_PREAMBLE; |
| 479 | } else { /* "LONG" */ |
| 480 | priv->reg.preamble = LONG_PREAMBLE; |
| 481 | } |
| 482 | break; |
| 483 | case 17: /* "ScanType","ACTIVE_SCAN" */ |
| 484 | if (!strncmp(wk_buff, "PASSIVE_SCAN", 12)) { |
| 485 | priv->reg.scan_type = PASSIVE_SCAN; |
| 486 | } else { /* "ACTIVE_SCAN" */ |
| 487 | priv->reg.scan_type = ACTIVE_SCAN; |
| 488 | } |
| 489 | break; |
| 490 | case 18: // "ROM_FILE",ROMFILE |
| 491 | if (*wk_p != '"') |
| 492 | break; |
| 493 | wk_p++; |
| 494 | for (j=0; *wk_p != '"'; j++) { |
| 495 | if (wk_p == '\0') { |
| 496 | break; |
| 497 | } |
| 498 | priv->reg.rom_file[j] = *wk_p++; |
| 499 | } |
| 500 | priv->reg.rom_file[j] = '\0'; |
| 501 | wk_p++; |
| 502 | break; |
| 503 | case 19: /*"PhyType", "BG_MODE" */ |
| 504 | if (!strncmp(wk_buff, "B_MODE", 6)) { |
| 505 | priv->reg.phy_type = D_11B_ONLY_MODE; |
| 506 | } else if (!strncmp(wk_buff, "G_MODE", 6)) { |
| 507 | priv->reg.phy_type = D_11G_ONLY_MODE; |
| 508 | } else { |
| 509 | priv->reg.phy_type = D_11BG_COMPATIBLE_MODE; |
| 510 | } |
| 511 | break; |
| 512 | case 20: /* "CtsMode", "FALSE" */ |
| 513 | if (!strncmp(wk_buff, "TRUE", 4)) { |
| 514 | priv->reg.cts_mode = CTS_MODE_TRUE; |
| 515 | } else { |
| 516 | priv->reg.cts_mode = CTS_MODE_FALSE; |
| 517 | } |
| 518 | break; |
| 519 | case 21: /* "PhyInformationTimer", "0" */ |
| 520 | j = simple_strtol(wk_buff, NULL, 10); |
| 521 | priv->reg.phy_info_timer = (uint16_t)j; |
| 522 | break; |
| 523 | default: |
| 524 | break; |
| 525 | } |
| 526 | if (cur_p >= end_p) { |
| 527 | break; |
| 528 | } |
| 529 | cur_p++; |
| 530 | } |
| 531 | |
| 532 | } |
| 533 | #ifndef NO_FIRMWARE_CLASS |
| 534 | release_firmware(fw_entry); |
| 535 | #else |
| 536 | no_config_file: |
| 537 | kfree(cfg_buf); |
| 538 | set_fs(orgfs); |
| 539 | current->fsuid=orgfsuid; |
| 540 | current->fsgid=orgfsgid; |
| 541 | #endif |
| 542 | |
| 543 | DPRINTK(3,"\n operation_mode = %d\n channel = %d\n ssid = %s\n tx_rate = %d\n \ |
| 544 | preamble = %d\n powermgt = %d\n scan_type = %d\n beacon_lost_count = %d\n rts = %d\n \ |
| 545 | fragment = %d\n privacy_invoked = %d\n wep_type = %d\n wep_on_off = %d\n wep_index = %d\n romfile = %s\n", |
| 546 | priv->reg.operation_mode,priv->reg.channel,&priv->reg.ssid.body[0],priv->reg.tx_rate, |
| 547 | priv->reg.preamble,priv->reg.powermgt,priv->reg.scan_type,priv->reg.beacon_lost_count, |
| 548 | priv->reg.rts,priv->reg.fragment,priv->reg.privacy_invoked,wep_type,wep_on_off,priv->reg.wep_index, |
| 549 | &priv->reg.rom_file[0] |
| 550 | ); |
| 551 | DPRINTK(3,"\n phy_type = %d\n cts_mode = %d\n tx_rate = %d\n phy_info_timer = %d\n", |
| 552 | priv->reg.phy_type,priv->reg.cts_mode,priv->reg.tx_rate,priv->reg.phy_info_timer ); |
| 553 | |
| 554 | return(0); |
| 555 | } |
| 556 | |
| 557 |
