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 }
801