This source file includes following definitions.
- prism2mgmt_mibset_mibget
- prism2mib_bytearea2pstr
- prism2mib_uint32
- prism2mib_flag
- prism2mib_wepdefaultkey
- prism2mib_privacyinvoked
- prism2mib_fragmentationthreshold
- prism2mib_priv
- prism2mgmt_pstr2bytestr
- prism2mgmt_bytestr2pstr
- prism2mgmt_bytearea2pstr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 #include <linux/module.h>
55 #include <linux/kernel.h>
56 #include <linux/sched.h>
57 #include <linux/types.h>
58 #include <linux/wireless.h>
59 #include <linux/netdevice.h>
60 #include <linux/io.h>
61 #include <linux/delay.h>
62 #include <asm/byteorder.h>
63 #include <linux/usb.h>
64 #include <linux/bitops.h>
65
66 #include "p80211types.h"
67 #include "p80211hdr.h"
68 #include "p80211mgmt.h"
69 #include "p80211conv.h"
70 #include "p80211msg.h"
71 #include "p80211netdev.h"
72 #include "p80211metadef.h"
73 #include "p80211metastruct.h"
74 #include "hfa384x.h"
75 #include "prism2mgmt.h"
76
77 #define MIB_TMP_MAXLEN 200
78
79 #define F_STA 0x1
80 #define F_READ 0x2
81 #define F_WRITE 0x4
82
83 struct mibrec {
84 u32 did;
85 u16 flag;
86 u16 parm1;
87 u16 parm2;
88 u16 parm3;
89 int (*func)(struct mibrec *mib,
90 int isget,
91 struct wlandevice *wlandev,
92 struct hfa384x *hw,
93 struct p80211msg_dot11req_mibset *msg, void *data);
94 };
95
96 static int prism2mib_bytearea2pstr(struct mibrec *mib,
97 int isget,
98 struct wlandevice *wlandev,
99 struct hfa384x *hw,
100 struct p80211msg_dot11req_mibset *msg,
101 void *data);
102
103 static int prism2mib_uint32(struct mibrec *mib,
104 int isget,
105 struct wlandevice *wlandev,
106 struct hfa384x *hw,
107 struct p80211msg_dot11req_mibset *msg, void *data);
108
109 static int prism2mib_flag(struct mibrec *mib,
110 int isget,
111 struct wlandevice *wlandev,
112 struct hfa384x *hw,
113 struct p80211msg_dot11req_mibset *msg, void *data);
114
115 static int prism2mib_wepdefaultkey(struct mibrec *mib,
116 int isget,
117 struct wlandevice *wlandev,
118 struct hfa384x *hw,
119 struct p80211msg_dot11req_mibset *msg,
120 void *data);
121
122 static int prism2mib_privacyinvoked(struct mibrec *mib,
123 int isget,
124 struct wlandevice *wlandev,
125 struct hfa384x *hw,
126 struct p80211msg_dot11req_mibset *msg,
127 void *data);
128
129 static int
130 prism2mib_fragmentationthreshold(struct mibrec *mib,
131 int isget,
132 struct wlandevice *wlandev,
133 struct hfa384x *hw,
134 struct p80211msg_dot11req_mibset *msg,
135 void *data);
136
137 static int prism2mib_priv(struct mibrec *mib,
138 int isget,
139 struct wlandevice *wlandev,
140 struct hfa384x *hw,
141 struct p80211msg_dot11req_mibset *msg, void *data);
142
143 static struct mibrec mibtab[] = {
144
145 {didmib_dot11smt_wepdefaultkeystable_key(1),
146 F_STA | F_WRITE,
147 HFA384x_RID_CNFWEPDEFAULTKEY0, 0, 0,
148 prism2mib_wepdefaultkey},
149 {didmib_dot11smt_wepdefaultkeystable_key(2),
150 F_STA | F_WRITE,
151 HFA384x_RID_CNFWEPDEFAULTKEY1, 0, 0,
152 prism2mib_wepdefaultkey},
153 {didmib_dot11smt_wepdefaultkeystable_key(3),
154 F_STA | F_WRITE,
155 HFA384x_RID_CNFWEPDEFAULTKEY2, 0, 0,
156 prism2mib_wepdefaultkey},
157 {didmib_dot11smt_wepdefaultkeystable_key(4),
158 F_STA | F_WRITE,
159 HFA384x_RID_CNFWEPDEFAULTKEY3, 0, 0,
160 prism2mib_wepdefaultkey},
161 {DIDMIB_DOT11SMT_PRIVACYTABLE_PRIVACYINVOKED,
162 F_STA | F_READ | F_WRITE,
163 HFA384x_RID_CNFWEPFLAGS, HFA384x_WEPFLAGS_PRIVINVOKED, 0,
164 prism2mib_privacyinvoked},
165 {DIDMIB_DOT11SMT_PRIVACYTABLE_WEPDEFAULTKEYID,
166 F_STA | F_READ | F_WRITE,
167 HFA384x_RID_CNFWEPDEFAULTKEYID, 0, 0,
168 prism2mib_uint32},
169 {DIDMIB_DOT11SMT_PRIVACYTABLE_EXCLUDEUNENCRYPTED,
170 F_STA | F_READ | F_WRITE,
171 HFA384x_RID_CNFWEPFLAGS, HFA384x_WEPFLAGS_EXCLUDE, 0,
172 prism2mib_flag},
173
174
175
176 {DIDMIB_DOT11MAC_OPERATIONTABLE_MACADDRESS,
177 F_STA | F_READ | F_WRITE,
178 HFA384x_RID_CNFOWNMACADDR, HFA384x_RID_CNFOWNMACADDR_LEN, 0,
179 prism2mib_bytearea2pstr},
180 {DIDMIB_DOT11MAC_OPERATIONTABLE_RTSTHRESHOLD,
181 F_STA | F_READ | F_WRITE,
182 HFA384x_RID_RTSTHRESH, 0, 0,
183 prism2mib_uint32},
184 {DIDMIB_DOT11MAC_OPERATIONTABLE_SHORTRETRYLIMIT,
185 F_STA | F_READ,
186 HFA384x_RID_SHORTRETRYLIMIT, 0, 0,
187 prism2mib_uint32},
188 {DIDMIB_DOT11MAC_OPERATIONTABLE_LONGRETRYLIMIT,
189 F_STA | F_READ,
190 HFA384x_RID_LONGRETRYLIMIT, 0, 0,
191 prism2mib_uint32},
192 {DIDMIB_DOT11MAC_OPERATIONTABLE_FRAGMENTATIONTHRESHOLD,
193 F_STA | F_READ | F_WRITE,
194 HFA384x_RID_FRAGTHRESH, 0, 0,
195 prism2mib_fragmentationthreshold},
196 {DIDMIB_DOT11MAC_OPERATIONTABLE_MAXTRANSMITMSDULIFETIME,
197 F_STA | F_READ,
198 HFA384x_RID_MAXTXLIFETIME, 0, 0,
199 prism2mib_uint32},
200
201
202
203 {DIDMIB_DOT11PHY_DSSSTABLE_CURRENTCHANNEL,
204 F_STA | F_READ,
205 HFA384x_RID_CURRENTCHANNEL, 0, 0,
206 prism2mib_uint32},
207 {DIDMIB_DOT11PHY_TXPOWERTABLE_CURRENTTXPOWERLEVEL,
208 F_STA | F_READ | F_WRITE,
209 HFA384x_RID_TXPOWERMAX, 0, 0,
210 prism2mib_uint32},
211
212
213
214 {DIDMIB_P2_STATIC_CNFPORTTYPE,
215 F_STA | F_READ | F_WRITE,
216 HFA384x_RID_CNFPORTTYPE, 0, 0,
217 prism2mib_uint32},
218
219
220
221 {DIDMIB_P2_MAC_CURRENTTXRATE,
222 F_STA | F_READ,
223 HFA384x_RID_CURRENTTXRATE, 0, 0,
224 prism2mib_uint32},
225
226
227 {DIDMIB_LNX_CONFIGTABLE_RSNAIE,
228 F_STA | F_READ | F_WRITE,
229 HFA384x_RID_CNFWPADATA, 0, 0,
230 prism2mib_priv},
231 {0, 0, 0, 0, 0, NULL}
232 };
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254 int prism2mgmt_mibset_mibget(struct wlandevice *wlandev, void *msgp)
255 {
256 struct hfa384x *hw = wlandev->priv;
257 int result, isget;
258 struct mibrec *mib;
259
260 u16 which;
261
262 struct p80211msg_dot11req_mibset *msg = msgp;
263 struct p80211itemd *mibitem;
264
265 msg->resultcode.status = P80211ENUM_msgitem_status_data_ok;
266 msg->resultcode.data = P80211ENUM_resultcode_success;
267
268
269
270
271
272 which = F_STA;
273
274
275
276
277
278
279
280
281 mibitem = (struct p80211itemd *)msg->mibattribute.data;
282
283 for (mib = mibtab; mib->did != 0; mib++)
284 if (mib->did == mibitem->did && (mib->flag & which))
285 break;
286
287 if (mib->did == 0) {
288 msg->resultcode.data = P80211ENUM_resultcode_not_supported;
289 goto done;
290 }
291
292
293
294
295
296
297
298 isget = (msg->msgcode == DIDMSG_DOT11REQ_MIBGET);
299
300 if (isget) {
301 if (!(mib->flag & F_READ)) {
302 msg->resultcode.data =
303 P80211ENUM_resultcode_cant_get_writeonly_mib;
304 goto done;
305 }
306 } else {
307 if (!(mib->flag & F_WRITE)) {
308 msg->resultcode.data =
309 P80211ENUM_resultcode_cant_set_readonly_mib;
310 goto done;
311 }
312 }
313
314
315
316
317
318
319
320
321
322 result = mib->func(mib, isget, wlandev, hw, msg, (void *)mibitem->data);
323
324 if (msg->resultcode.data == P80211ENUM_resultcode_success) {
325 if (result != 0) {
326 pr_debug("get/set failure, result=%d\n", result);
327 msg->resultcode.data =
328 P80211ENUM_resultcode_implementation_failure;
329 } else {
330 if (isget) {
331 msg->mibattribute.status =
332 P80211ENUM_msgitem_status_data_ok;
333 mibitem->status =
334 P80211ENUM_msgitem_status_data_ok;
335 }
336 }
337 }
338
339 done:
340 return 0;
341 }
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368 static int prism2mib_bytearea2pstr(struct mibrec *mib,
369 int isget,
370 struct wlandevice *wlandev,
371 struct hfa384x *hw,
372 struct p80211msg_dot11req_mibset *msg,
373 void *data)
374 {
375 int result;
376 struct p80211pstrd *pstr = data;
377 u8 bytebuf[MIB_TMP_MAXLEN];
378
379 if (isget) {
380 result =
381 hfa384x_drvr_getconfig(hw, mib->parm1, bytebuf, mib->parm2);
382 prism2mgmt_bytearea2pstr(bytebuf, pstr, mib->parm2);
383 } else {
384 memset(bytebuf, 0, mib->parm2);
385 memcpy(bytebuf, pstr->data, pstr->len);
386 result =
387 hfa384x_drvr_setconfig(hw, mib->parm1, bytebuf, mib->parm2);
388 }
389
390 return result;
391 }
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418 static int prism2mib_uint32(struct mibrec *mib,
419 int isget,
420 struct wlandevice *wlandev,
421 struct hfa384x *hw,
422 struct p80211msg_dot11req_mibset *msg, void *data)
423 {
424 int result;
425 u32 *uint32 = data;
426 u8 bytebuf[MIB_TMP_MAXLEN];
427 u16 *wordbuf = (u16 *)bytebuf;
428
429 if (isget) {
430 result = hfa384x_drvr_getconfig16(hw, mib->parm1, wordbuf);
431 *uint32 = *wordbuf;
432 } else {
433 *wordbuf = *uint32;
434 result = hfa384x_drvr_setconfig16(hw, mib->parm1, *wordbuf);
435 }
436
437 return result;
438 }
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465 static int prism2mib_flag(struct mibrec *mib,
466 int isget,
467 struct wlandevice *wlandev,
468 struct hfa384x *hw,
469 struct p80211msg_dot11req_mibset *msg, void *data)
470 {
471 int result;
472 u32 *uint32 = data;
473 u8 bytebuf[MIB_TMP_MAXLEN];
474 u16 *wordbuf = (u16 *)bytebuf;
475 u32 flags;
476
477 result = hfa384x_drvr_getconfig16(hw, mib->parm1, wordbuf);
478 if (result == 0) {
479 flags = *wordbuf;
480 if (isget) {
481 *uint32 = (flags & mib->parm2) ?
482 P80211ENUM_truth_true : P80211ENUM_truth_false;
483 } else {
484 if ((*uint32) == P80211ENUM_truth_true)
485 flags |= mib->parm2;
486 else
487 flags &= ~mib->parm2;
488 *wordbuf = flags;
489 result =
490 hfa384x_drvr_setconfig16(hw, mib->parm1, *wordbuf);
491 }
492 }
493
494 return result;
495 }
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522 static int prism2mib_wepdefaultkey(struct mibrec *mib,
523 int isget,
524 struct wlandevice *wlandev,
525 struct hfa384x *hw,
526 struct p80211msg_dot11req_mibset *msg,
527 void *data)
528 {
529 int result;
530 struct p80211pstrd *pstr = data;
531 u8 bytebuf[MIB_TMP_MAXLEN];
532 u16 len;
533
534 if (isget) {
535 result = 0;
536 } else {
537 len = (pstr->len > 5) ? HFA384x_RID_CNFWEP128DEFAULTKEY_LEN :
538 HFA384x_RID_CNFWEPDEFAULTKEY_LEN;
539 memset(bytebuf, 0, len);
540 memcpy(bytebuf, pstr->data, pstr->len);
541 result = hfa384x_drvr_setconfig(hw, mib->parm1, bytebuf, len);
542 }
543
544 return result;
545 }
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572 static int prism2mib_privacyinvoked(struct mibrec *mib,
573 int isget,
574 struct wlandevice *wlandev,
575 struct hfa384x *hw,
576 struct p80211msg_dot11req_mibset *msg,
577 void *data)
578 {
579 if (wlandev->hostwep & HOSTWEP_DECRYPT) {
580 if (wlandev->hostwep & HOSTWEP_DECRYPT)
581 mib->parm2 |= HFA384x_WEPFLAGS_DISABLE_RXCRYPT;
582 if (wlandev->hostwep & HOSTWEP_ENCRYPT)
583 mib->parm2 |= HFA384x_WEPFLAGS_DISABLE_TXCRYPT;
584 }
585
586 return prism2mib_flag(mib, isget, wlandev, hw, msg, data);
587 }
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614 static int
615 prism2mib_fragmentationthreshold(struct mibrec *mib,
616 int isget,
617 struct wlandevice *wlandev,
618 struct hfa384x *hw,
619 struct p80211msg_dot11req_mibset *msg,
620 void *data)
621 {
622 u32 *uint32 = data;
623
624 if (!isget)
625 if ((*uint32) % 2) {
626 netdev_warn(wlandev->netdev,
627 "Attempt to set odd number FragmentationThreshold\n");
628 msg->resultcode.data =
629 P80211ENUM_resultcode_not_supported;
630 return 0;
631 }
632
633 return prism2mib_uint32(mib, isget, wlandev, hw, msg, data);
634 }
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661 static int prism2mib_priv(struct mibrec *mib,
662 int isget,
663 struct wlandevice *wlandev,
664 struct hfa384x *hw,
665 struct p80211msg_dot11req_mibset *msg, void *data)
666 {
667 struct p80211pstrd *pstr = data;
668
669 switch (mib->did) {
670 case DIDMIB_LNX_CONFIGTABLE_RSNAIE: {
671 struct hfa384x_wpa_data wpa;
672
673 if (isget) {
674 hfa384x_drvr_getconfig(hw,
675 HFA384x_RID_CNFWPADATA,
676 (u8 *)&wpa,
677 sizeof(wpa));
678 pstr->len = le16_to_cpu(wpa.datalen);
679 memcpy(pstr->data, wpa.data, pstr->len);
680 } else {
681 wpa.datalen = cpu_to_le16(pstr->len);
682 memcpy(wpa.data, pstr->data, pstr->len);
683
684 hfa384x_drvr_setconfig(hw,
685 HFA384x_RID_CNFWPADATA,
686 (u8 *)&wpa,
687 sizeof(wpa));
688 }
689 break;
690 }
691 default:
692 netdev_err(wlandev->netdev, "Unhandled DID 0x%08x\n", mib->did);
693 }
694
695 return 0;
696 }
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713 void prism2mgmt_pstr2bytestr(struct hfa384x_bytestr *bytestr,
714 struct p80211pstrd *pstr)
715 {
716 bytestr->len = cpu_to_le16((u16)(pstr->len));
717 memcpy(bytestr->data, pstr->data, pstr->len);
718 }
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735 void prism2mgmt_bytestr2pstr(struct hfa384x_bytestr *bytestr,
736 struct p80211pstrd *pstr)
737 {
738 pstr->len = (u8)(le16_to_cpu(bytestr->len));
739 memcpy(pstr->data, bytestr->data, pstr->len);
740 }
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757 void prism2mgmt_bytearea2pstr(u8 *bytearea, struct p80211pstrd *pstr, int len)
758 {
759 pstr->len = (u8)len;
760 memcpy(pstr->data, bytearea, len);
761 }