GNU Linux-libre 4.14.328-gnu1
[releases.git] / drivers / staging / wlan-ng / prism2mib.c
1 /* src/prism2/driver/prism2mib.c
2  *
3  * Management request for mibset/mibget
4  *
5  * Copyright (C) 1999 AbsoluteValue Systems, Inc.  All Rights Reserved.
6  * --------------------------------------------------------------------
7  *
8  * linux-wlan
9  *
10  *   The contents of this file are subject to the Mozilla Public
11  *   License Version 1.1 (the "License"); you may not use this file
12  *   except in compliance with the License. You may obtain a copy of
13  *   the License at http://www.mozilla.org/MPL/
14  *
15  *   Software distributed under the License is distributed on an "AS
16  *   IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
17  *   implied. See the License for the specific language governing
18  *   rights and limitations under the License.
19  *
20  *   Alternatively, the contents of this file may be used under the
21  *   terms of the GNU Public License version 2 (the "GPL"), in which
22  *   case the provisions of the GPL are applicable instead of the
23  *   above.  If you wish to allow the use of your version of this file
24  *   only under the terms of the GPL and not to allow others to use
25  *   your version of this file under the MPL, indicate your decision
26  *   by deleting the provisions above and replace them with the notice
27  *   and other provisions required by the GPL.  If you do not delete
28  *   the provisions above, a recipient may use your version of this
29  *   file under either the MPL or the GPL.
30  *
31  * --------------------------------------------------------------------
32  *
33  * Inquiries regarding the linux-wlan Open Source project can be
34  * made directly to:
35  *
36  * AbsoluteValue Systems Inc.
37  * info@linux-wlan.com
38  * http://www.linux-wlan.com
39  *
40  * --------------------------------------------------------------------
41  *
42  * Portions of the development of this software were funded by
43  * Intersil Corporation as part of PRISM(R) chipset product development.
44  *
45  * --------------------------------------------------------------------
46  *
47  * The functions in this file handle the mibset/mibget management
48  * functions.
49  *
50  * --------------------------------------------------------------------
51  */
52
53 #include <linux/module.h>
54 #include <linux/kernel.h>
55 #include <linux/sched.h>
56 #include <linux/types.h>
57 #include <linux/wireless.h>
58 #include <linux/netdevice.h>
59 #include <linux/io.h>
60 #include <linux/delay.h>
61 #include <asm/byteorder.h>
62 #include <linux/usb.h>
63 #include <linux/bitops.h>
64
65 #include "p80211types.h"
66 #include "p80211hdr.h"
67 #include "p80211mgmt.h"
68 #include "p80211conv.h"
69 #include "p80211msg.h"
70 #include "p80211netdev.h"
71 #include "p80211metadef.h"
72 #include "p80211metastruct.h"
73 #include "hfa384x.h"
74 #include "prism2mgmt.h"
75
76 #define MIB_TMP_MAXLEN    200   /* Max length of RID record (in bytes). */
77
78 #define  F_STA        0x1       /* MIB is supported on stations. */
79 #define  F_READ       0x2       /* MIB may be read. */
80 #define  F_WRITE      0x4       /* MIB may be written. */
81
82 struct mibrec {
83         u32 did;
84         u16 flag;
85         u16 parm1;
86         u16 parm2;
87         u16 parm3;
88         int (*func)(struct mibrec *mib,
89                      int isget,
90                      struct wlandevice *wlandev,
91                      struct hfa384x *hw,
92                      struct p80211msg_dot11req_mibset *msg, void *data);
93 };
94
95 static int prism2mib_bytearea2pstr(struct mibrec *mib,
96                                    int isget,
97                                    struct wlandevice *wlandev,
98                                    struct hfa384x *hw,
99                                    struct p80211msg_dot11req_mibset *msg,
100                                    void *data);
101
102 static int prism2mib_uint32(struct mibrec *mib,
103                             int isget,
104                             struct wlandevice *wlandev,
105                             struct hfa384x *hw,
106                             struct p80211msg_dot11req_mibset *msg, void *data);
107
108 static int prism2mib_flag(struct mibrec *mib,
109                           int isget,
110                           struct wlandevice *wlandev,
111                           struct hfa384x *hw,
112                           struct p80211msg_dot11req_mibset *msg, void *data);
113
114 static int prism2mib_wepdefaultkey(struct mibrec *mib,
115                                    int isget,
116                                    struct wlandevice *wlandev,
117                                    struct hfa384x *hw,
118                                    struct p80211msg_dot11req_mibset *msg,
119                                    void *data);
120
121 static int prism2mib_privacyinvoked(struct mibrec *mib,
122                                     int isget,
123                                     struct wlandevice *wlandev,
124                                     struct hfa384x *hw,
125                                     struct p80211msg_dot11req_mibset *msg,
126                                     void *data);
127
128 static int prism2mib_excludeunencrypted(struct mibrec *mib,
129                                         int isget,
130                                         struct wlandevice *wlandev,
131                                         struct hfa384x *hw,
132                                         struct p80211msg_dot11req_mibset *msg,
133                                         void *data);
134
135 static int prism2mib_fragmentationthreshold(struct mibrec *mib,
136                                             int isget,
137                                             struct wlandevice *wlandev,
138                                             struct hfa384x *hw,
139                                             struct p80211msg_dot11req_mibset *msg,
140                                             void *data);
141
142 static int prism2mib_priv(struct mibrec *mib,
143                           int isget,
144                           struct wlandevice *wlandev,
145                           struct hfa384x *hw,
146                           struct p80211msg_dot11req_mibset *msg, void *data);
147
148 static struct mibrec mibtab[] = {
149         /* dot11smt MIB's */
150         {DIDmib_dot11smt_dot11WEPDefaultKeysTable_key(1),
151          F_STA | F_WRITE,
152          HFA384x_RID_CNFWEPDEFAULTKEY0, 0, 0,
153          prism2mib_wepdefaultkey},
154         {DIDmib_dot11smt_dot11WEPDefaultKeysTable_key(2),
155          F_STA | F_WRITE,
156          HFA384x_RID_CNFWEPDEFAULTKEY1, 0, 0,
157          prism2mib_wepdefaultkey},
158         {DIDmib_dot11smt_dot11WEPDefaultKeysTable_key(3),
159          F_STA | F_WRITE,
160          HFA384x_RID_CNFWEPDEFAULTKEY2, 0, 0,
161          prism2mib_wepdefaultkey},
162         {DIDmib_dot11smt_dot11WEPDefaultKeysTable_key(4),
163          F_STA | F_WRITE,
164          HFA384x_RID_CNFWEPDEFAULTKEY3, 0, 0,
165          prism2mib_wepdefaultkey},
166         {DIDmib_dot11smt_dot11PrivacyTable_dot11PrivacyInvoked,
167          F_STA | F_READ | F_WRITE,
168          HFA384x_RID_CNFWEPFLAGS, HFA384x_WEPFLAGS_PRIVINVOKED, 0,
169          prism2mib_privacyinvoked},
170         {DIDmib_dot11smt_dot11PrivacyTable_dot11WEPDefaultKeyID,
171          F_STA | F_READ | F_WRITE,
172          HFA384x_RID_CNFWEPDEFAULTKEYID, 0, 0,
173          prism2mib_uint32},
174         {DIDmib_dot11smt_dot11PrivacyTable_dot11ExcludeUnencrypted,
175          F_STA | F_READ | F_WRITE,
176          HFA384x_RID_CNFWEPFLAGS, HFA384x_WEPFLAGS_EXCLUDE, 0,
177          prism2mib_excludeunencrypted},
178
179         /* dot11mac MIB's */
180
181         {DIDmib_dot11mac_dot11OperationTable_dot11MACAddress,
182          F_STA | F_READ | F_WRITE,
183          HFA384x_RID_CNFOWNMACADDR, HFA384x_RID_CNFOWNMACADDR_LEN, 0,
184          prism2mib_bytearea2pstr},
185         {DIDmib_dot11mac_dot11OperationTable_dot11RTSThreshold,
186          F_STA | F_READ | F_WRITE,
187          HFA384x_RID_RTSTHRESH, 0, 0,
188          prism2mib_uint32},
189         {DIDmib_dot11mac_dot11OperationTable_dot11ShortRetryLimit,
190          F_STA | F_READ,
191          HFA384x_RID_SHORTRETRYLIMIT, 0, 0,
192          prism2mib_uint32},
193         {DIDmib_dot11mac_dot11OperationTable_dot11LongRetryLimit,
194          F_STA | F_READ,
195          HFA384x_RID_LONGRETRYLIMIT, 0, 0,
196          prism2mib_uint32},
197         {DIDmib_dot11mac_dot11OperationTable_dot11FragmentationThreshold,
198          F_STA | F_READ | F_WRITE,
199          HFA384x_RID_FRAGTHRESH, 0, 0,
200          prism2mib_fragmentationthreshold},
201         {DIDmib_dot11mac_dot11OperationTable_dot11MaxTransmitMSDULifetime,
202          F_STA | F_READ,
203          HFA384x_RID_MAXTXLIFETIME, 0, 0,
204          prism2mib_uint32},
205
206         /* dot11phy MIB's */
207
208         {DIDmib_dot11phy_dot11PhyDSSSTable_dot11CurrentChannel,
209          F_STA | F_READ,
210          HFA384x_RID_CURRENTCHANNEL, 0, 0,
211          prism2mib_uint32},
212         {DIDmib_dot11phy_dot11PhyTxPowerTable_dot11CurrentTxPowerLevel,
213          F_STA | F_READ | F_WRITE,
214          HFA384x_RID_TXPOWERMAX, 0, 0,
215          prism2mib_uint32},
216
217         /* p2Static MIB's */
218
219         {DIDmib_p2_p2Static_p2CnfPortType,
220          F_STA | F_READ | F_WRITE,
221          HFA384x_RID_CNFPORTTYPE, 0, 0,
222          prism2mib_uint32},
223
224         /* p2MAC MIB's */
225
226         {DIDmib_p2_p2MAC_p2CurrentTxRate,
227          F_STA | F_READ,
228          HFA384x_RID_CURRENTTXRATE, 0, 0,
229          prism2mib_uint32},
230
231         /* And finally, lnx mibs */
232         {DIDmib_lnx_lnxConfigTable_lnxRSNAIE,
233          F_STA | F_READ | F_WRITE,
234          HFA384x_RID_CNFWPADATA, 0, 0,
235          prism2mib_priv},
236         {0, 0, 0, 0, 0, NULL}
237 };
238
239 /*
240  * prism2mgmt_mibset_mibget
241  *
242  * Set the value of a mib item.
243  *
244  * Arguments:
245  *      wlandev         wlan device structure
246  *      msgp            ptr to msg buffer
247  *
248  * Returns:
249  *      0       success and done
250  *      <0      success, but we're waiting for something to finish.
251  *      >0      an error occurred while handling the message.
252  * Side effects:
253  *
254  * Call context:
255  *      process thread  (usually)
256  *      interrupt
257  */
258
259 int prism2mgmt_mibset_mibget(struct wlandevice *wlandev, void *msgp)
260 {
261         struct hfa384x *hw = wlandev->priv;
262         int result, isget;
263         struct mibrec *mib;
264
265         u16 which;
266
267         struct p80211msg_dot11req_mibset *msg = msgp;
268         struct p80211itemd *mibitem;
269
270         msg->resultcode.status = P80211ENUM_msgitem_status_data_ok;
271         msg->resultcode.data = P80211ENUM_resultcode_success;
272
273         /*
274          ** Determine if this is an Access Point or a station.
275          */
276
277         which = F_STA;
278
279         /*
280          ** Find the MIB in the MIB table.  Note that a MIB may be in the
281          ** table twice...once for an AP and once for a station.  Make sure
282          ** to get the correct one.  Note that DID=0 marks the end of the
283          ** MIB table.
284          */
285
286         mibitem = (struct p80211itemd *)msg->mibattribute.data;
287
288         for (mib = mibtab; mib->did != 0; mib++)
289                 if (mib->did == mibitem->did && (mib->flag & which))
290                         break;
291
292         if (mib->did == 0) {
293                 msg->resultcode.data = P80211ENUM_resultcode_not_supported;
294                 goto done;
295         }
296
297         /*
298          ** Determine if this is a "mibget" or a "mibset".  If this is a
299          ** "mibget", then make sure that the MIB may be read.  Otherwise,
300          ** this is a "mibset" so make make sure that the MIB may be written.
301          */
302
303         isget = (msg->msgcode == DIDmsg_dot11req_mibget);
304
305         if (isget) {
306                 if (!(mib->flag & F_READ)) {
307                         msg->resultcode.data =
308                             P80211ENUM_resultcode_cant_get_writeonly_mib;
309                         goto done;
310                 }
311         } else {
312                 if (!(mib->flag & F_WRITE)) {
313                         msg->resultcode.data =
314                             P80211ENUM_resultcode_cant_set_readonly_mib;
315                         goto done;
316                 }
317         }
318
319         /*
320          ** Execute the MIB function.  If things worked okay, then make
321          ** sure that the MIB function also worked okay.  If so, and this
322          ** is a "mibget", then the status value must be set for both the
323          ** "mibattribute" parameter and the mib item within the data
324          ** portion of the "mibattribute".
325          */
326
327         result = mib->func(mib, isget, wlandev, hw, msg, (void *)mibitem->data);
328
329         if (msg->resultcode.data == P80211ENUM_resultcode_success) {
330                 if (result != 0) {
331                         pr_debug("get/set failure, result=%d\n", result);
332                         msg->resultcode.data =
333                             P80211ENUM_resultcode_implementation_failure;
334                 } else {
335                         if (isget) {
336                                 msg->mibattribute.status =
337                                     P80211ENUM_msgitem_status_data_ok;
338                                 mibitem->status =
339                                     P80211ENUM_msgitem_status_data_ok;
340                         }
341                 }
342         }
343
344 done:
345         return 0;
346 }
347
348 /*
349  * prism2mib_bytearea2pstr
350  *
351  * Get/set pstr data to/from a byte area.
352  *
353  * MIB record parameters:
354  *       parm1    Prism2 RID value.
355  *       parm2    Number of bytes of RID data.
356  *       parm3    Not used.
357  *
358  * Arguments:
359  *       mib      MIB record.
360  *       isget    MIBGET/MIBSET flag.
361  *       wlandev  wlan device structure.
362  *       priv     "priv" structure.
363  *       hw       "hw" structure.
364  *       msg      Message structure.
365  *       data     Data buffer.
366  *
367  * Returns:
368  *       0   - Success.
369  *       ~0  - Error.
370  *
371  */
372
373 static int prism2mib_bytearea2pstr(struct mibrec *mib,
374                                    int isget,
375                                    struct wlandevice *wlandev,
376                                    struct hfa384x *hw,
377                                    struct p80211msg_dot11req_mibset *msg,
378                                    void *data)
379 {
380         int result;
381         struct p80211pstrd *pstr = data;
382         u8 bytebuf[MIB_TMP_MAXLEN];
383
384         if (isget) {
385                 result =
386                     hfa384x_drvr_getconfig(hw, mib->parm1, bytebuf, mib->parm2);
387                 prism2mgmt_bytearea2pstr(bytebuf, pstr, mib->parm2);
388         } else {
389                 memset(bytebuf, 0, mib->parm2);
390                 memcpy(bytebuf, pstr->data, pstr->len);
391                 result =
392                     hfa384x_drvr_setconfig(hw, mib->parm1, bytebuf, mib->parm2);
393         }
394
395         return result;
396 }
397
398 /*
399  * prism2mib_uint32
400  *
401  * Get/set uint32 data.
402  *
403  * MIB record parameters:
404  *       parm1    Prism2 RID value.
405  *       parm2    Not used.
406  *       parm3    Not used.
407  *
408  * Arguments:
409  *       mib      MIB record.
410  *       isget    MIBGET/MIBSET flag.
411  *       wlandev  wlan device structure.
412  *       priv     "priv" structure.
413  *       hw       "hw" structure.
414  *       msg      Message structure.
415  *       data     Data buffer.
416  *
417  * Returns:
418  *       0   - Success.
419  *       ~0  - Error.
420  *
421  */
422
423 static int prism2mib_uint32(struct mibrec *mib,
424                             int isget,
425                             struct wlandevice *wlandev,
426                             struct hfa384x *hw,
427                             struct p80211msg_dot11req_mibset *msg, void *data)
428 {
429         int result;
430         u32 *uint32 = data;
431         u8 bytebuf[MIB_TMP_MAXLEN];
432         u16 *wordbuf = (u16 *)bytebuf;
433
434         if (isget) {
435                 result = hfa384x_drvr_getconfig16(hw, mib->parm1, wordbuf);
436                 *uint32 = *wordbuf;
437         } else {
438                 *wordbuf = *uint32;
439                 result = hfa384x_drvr_setconfig16(hw, mib->parm1, *wordbuf);
440         }
441
442         return result;
443 }
444
445 /*
446  * prism2mib_flag
447  *
448  * Get/set a flag.
449  *
450  * MIB record parameters:
451  *       parm1    Prism2 RID value.
452  *       parm2    Bit to get/set.
453  *       parm3    Not used.
454  *
455  * Arguments:
456  *       mib      MIB record.
457  *       isget    MIBGET/MIBSET flag.
458  *       wlandev  wlan device structure.
459  *       priv     "priv" structure.
460  *       hw       "hw" structure.
461  *       msg      Message structure.
462  *       data     Data buffer.
463  *
464  * Returns:
465  *       0   - Success.
466  *       ~0  - Error.
467  *
468  */
469
470 static int prism2mib_flag(struct mibrec *mib,
471                           int isget,
472                           struct wlandevice *wlandev,
473                           struct hfa384x *hw,
474                           struct p80211msg_dot11req_mibset *msg, void *data)
475 {
476         int result;
477         u32 *uint32 = data;
478         u8 bytebuf[MIB_TMP_MAXLEN];
479         u16 *wordbuf = (u16 *)bytebuf;
480         u32 flags;
481
482         result = hfa384x_drvr_getconfig16(hw, mib->parm1, wordbuf);
483         if (result == 0) {
484                 flags = *wordbuf;
485                 if (isget) {
486                         *uint32 = (flags & mib->parm2) ?
487                             P80211ENUM_truth_true : P80211ENUM_truth_false;
488                 } else {
489                         if ((*uint32) == P80211ENUM_truth_true)
490                                 flags |= mib->parm2;
491                         else
492                                 flags &= ~mib->parm2;
493                         *wordbuf = flags;
494                         result =
495                             hfa384x_drvr_setconfig16(hw, mib->parm1, *wordbuf);
496                 }
497         }
498
499         return result;
500 }
501
502 /*
503  * prism2mib_wepdefaultkey
504  *
505  * Get/set WEP default keys.
506  *
507  * MIB record parameters:
508  *       parm1    Prism2 RID value.
509  *       parm2    Number of bytes of RID data.
510  *       parm3    Not used.
511  *
512  * Arguments:
513  *       mib      MIB record.
514  *       isget    MIBGET/MIBSET flag.
515  *       wlandev  wlan device structure.
516  *       priv     "priv" structure.
517  *       hw       "hw" structure.
518  *       msg      Message structure.
519  *       data     Data buffer.
520  *
521  * Returns:
522  *       0   - Success.
523  *       ~0  - Error.
524  *
525  */
526
527 static int prism2mib_wepdefaultkey(struct mibrec *mib,
528                                    int isget,
529                                    struct wlandevice *wlandev,
530                                    struct hfa384x *hw,
531                                    struct p80211msg_dot11req_mibset *msg,
532                                    void *data)
533 {
534         int result;
535         struct p80211pstrd *pstr = data;
536         u8 bytebuf[MIB_TMP_MAXLEN];
537         u16 len;
538
539         if (isget) {
540                 result = 0;     /* Should never happen. */
541         } else {
542                 len = (pstr->len > 5) ? HFA384x_RID_CNFWEP128DEFAULTKEY_LEN :
543                     HFA384x_RID_CNFWEPDEFAULTKEY_LEN;
544                 memset(bytebuf, 0, len);
545                 memcpy(bytebuf, pstr->data, pstr->len);
546                 result = hfa384x_drvr_setconfig(hw, mib->parm1, bytebuf, len);
547         }
548
549         return result;
550 }
551
552 /*
553  * prism2mib_privacyinvoked
554  *
555  * Get/set the dot11PrivacyInvoked value.
556  *
557  * MIB record parameters:
558  *       parm1    Prism2 RID value.
559  *       parm2    Bit value for PrivacyInvoked flag.
560  *       parm3    Not used.
561  *
562  * Arguments:
563  *       mib      MIB record.
564  *       isget    MIBGET/MIBSET flag.
565  *       wlandev  wlan device structure.
566  *       priv     "priv" structure.
567  *       hw       "hw" structure.
568  *       msg      Message structure.
569  *       data     Data buffer.
570  *
571  * Returns:
572  *       0   - Success.
573  *       ~0  - Error.
574  *
575  */
576
577 static int prism2mib_privacyinvoked(struct mibrec *mib,
578                                     int isget,
579                                     struct wlandevice *wlandev,
580                                     struct hfa384x *hw,
581                                     struct p80211msg_dot11req_mibset *msg,
582                                     void *data)
583 {
584         if (wlandev->hostwep & HOSTWEP_DECRYPT) {
585                 if (wlandev->hostwep & HOSTWEP_DECRYPT)
586                         mib->parm2 |= HFA384x_WEPFLAGS_DISABLE_RXCRYPT;
587                 if (wlandev->hostwep & HOSTWEP_ENCRYPT)
588                         mib->parm2 |= HFA384x_WEPFLAGS_DISABLE_TXCRYPT;
589         }
590
591         return prism2mib_flag(mib, isget, wlandev, hw, msg, data);
592 }
593
594 /*
595  * prism2mib_excludeunencrypted
596  *
597  * Get/set the dot11ExcludeUnencrypted value.
598  *
599  * MIB record parameters:
600  *       parm1    Prism2 RID value.
601  *       parm2    Bit value for ExcludeUnencrypted flag.
602  *       parm3    Not used.
603  *
604  * Arguments:
605  *       mib      MIB record.
606  *       isget    MIBGET/MIBSET flag.
607  *       wlandev  wlan device structure.
608  *       priv     "priv" structure.
609  *       hw       "hw" structure.
610  *       msg      Message structure.
611  *       data     Data buffer.
612  *
613  * Returns:
614  *       0   - Success.
615  *       ~0  - Error.
616  *
617  */
618
619 static int prism2mib_excludeunencrypted(struct mibrec *mib,
620                                         int isget,
621                                         struct wlandevice *wlandev,
622                                         struct hfa384x *hw,
623                                         struct p80211msg_dot11req_mibset *msg,
624                                         void *data)
625 {
626         return prism2mib_flag(mib, isget, wlandev, hw, msg, data);
627 }
628
629 /*
630  * prism2mib_fragmentationthreshold
631  *
632  * Get/set the fragmentation threshold.
633  *
634  * MIB record parameters:
635  *       parm1    Prism2 RID value.
636  *       parm2    Not used.
637  *       parm3    Not used.
638  *
639  * Arguments:
640  *       mib      MIB record.
641  *       isget    MIBGET/MIBSET flag.
642  *       wlandev  wlan device structure.
643  *       priv     "priv" structure.
644  *       hw       "hw" structure.
645  *       msg      Message structure.
646  *       data     Data buffer.
647  *
648  * Returns:
649  *       0   - Success.
650  *       ~0  - Error.
651  *
652  */
653
654 static int prism2mib_fragmentationthreshold(struct mibrec *mib,
655                                             int isget,
656                                             struct wlandevice *wlandev,
657                                             struct hfa384x *hw,
658                                             struct p80211msg_dot11req_mibset *msg,
659                                             void *data)
660 {
661         u32 *uint32 = data;
662
663         if (!isget)
664                 if ((*uint32) % 2) {
665                         netdev_warn(wlandev->netdev,
666                                     "Attempt to set odd number FragmentationThreshold\n");
667                         msg->resultcode.data =
668                             P80211ENUM_resultcode_not_supported;
669                         return 0;
670                 }
671
672         return prism2mib_uint32(mib, isget, wlandev, hw, msg, data);
673 }
674
675 /*
676  * prism2mib_priv
677  *
678  * Get/set values in the "priv" data structure.
679  *
680  * MIB record parameters:
681  *       parm1    Not used.
682  *       parm2    Not used.
683  *       parm3    Not used.
684  *
685  * Arguments:
686  *       mib      MIB record.
687  *       isget    MIBGET/MIBSET flag.
688  *       wlandev  wlan device structure.
689  *       priv     "priv" structure.
690  *       hw       "hw" structure.
691  *       msg      Message structure.
692  *       data     Data buffer.
693  *
694  * Returns:
695  *       0   - Success.
696  *       ~0  - Error.
697  *
698  */
699
700 static int prism2mib_priv(struct mibrec *mib,
701                           int isget,
702                           struct wlandevice *wlandev,
703                           struct hfa384x *hw,
704                           struct p80211msg_dot11req_mibset *msg, void *data)
705 {
706         struct p80211pstrd *pstr = data;
707
708         switch (mib->did) {
709         case DIDmib_lnx_lnxConfigTable_lnxRSNAIE:{
710                         struct hfa384x_wpa_data wpa;
711
712                         if (isget) {
713                                 hfa384x_drvr_getconfig(hw,
714                                                        HFA384x_RID_CNFWPADATA,
715                                                        (u8 *)&wpa,
716                                                        sizeof(wpa));
717                                 pstr->len = le16_to_cpu(wpa.datalen);
718                                 memcpy(pstr->data, wpa.data, pstr->len);
719                         } else {
720                                 wpa.datalen = cpu_to_le16(pstr->len);
721                                 memcpy(wpa.data, pstr->data, pstr->len);
722
723                                 hfa384x_drvr_setconfig(hw,
724                                                        HFA384x_RID_CNFWPADATA,
725                                                        (u8 *)&wpa,
726                                                        sizeof(wpa));
727                         }
728                         break;
729                 }
730         default:
731                 netdev_err(wlandev->netdev, "Unhandled DID 0x%08x\n", mib->did);
732         }
733
734         return 0;
735 }
736
737 /*
738  * prism2mgmt_pstr2bytestr
739  *
740  * Convert the pstr data in the WLAN message structure into an hfa384x
741  * byte string format.
742  *
743  * Arguments:
744  *      bytestr         hfa384x byte string data type
745  *      pstr            wlan message data
746  *
747  * Returns:
748  *      Nothing
749  *
750  */
751
752 void prism2mgmt_pstr2bytestr(struct hfa384x_bytestr *bytestr,
753                              struct p80211pstrd *pstr)
754 {
755         bytestr->len = cpu_to_le16((u16)(pstr->len));
756         memcpy(bytestr->data, pstr->data, pstr->len);
757 }
758
759 /*
760  * prism2mgmt_bytestr2pstr
761  *
762  * Convert the data in an hfa384x byte string format into a
763  * pstr in the WLAN message.
764  *
765  * Arguments:
766  *      bytestr         hfa384x byte string data type
767  *      msg             wlan message
768  *
769  * Returns:
770  *      Nothing
771  *
772  */
773
774 void prism2mgmt_bytestr2pstr(struct hfa384x_bytestr *bytestr,
775                              struct p80211pstrd *pstr)
776 {
777         pstr->len = (u8)(le16_to_cpu(bytestr->len));
778         memcpy(pstr->data, bytestr->data, pstr->len);
779 }
780
781 /*
782  * prism2mgmt_bytearea2pstr
783  *
784  * Convert the data in an hfa384x byte area format into a pstr
785  * in the WLAN message.
786  *
787  * Arguments:
788  *      bytearea        hfa384x byte area data type
789  *      msg             wlan message
790  *
791  * Returns:
792  *      Nothing
793  *
794  */
795
796 void prism2mgmt_bytearea2pstr(u8 *bytearea, struct p80211pstrd *pstr, int len)
797 {
798         pstr->len = (u8)len;
799         memcpy(pstr->data, bytearea, len);
800 }