aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2007-10-03 10:37:45 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-10-10 19:55:18 -0400
commit2bcde51d095490c223bb4ade351cb7981c367934 (patch)
tree30e71fea1c69262e51fb722074ec05a470703270 /drivers
parent515ea2492cfc93233ba31402d1992a435aa78f37 (diff)
[PATCH] libertas: problems setting wpa keys
The 88w8385 chip, using SDIO interface and firmware release 5.0.11p0, has problems when both unicast and multicast WPA keys are set in one command. This patch ensures the keys are set independently. The original author of this patch is Marc Pignat <marc.pignat@hevs.ch> Signed-off-by: Marc Pignat <marc.pignat@hevs.ch> Signed-off-by: Dan Williams <dcbw@redhat.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/libertas/assoc.c35
1 files changed, 30 insertions, 5 deletions
diff --git a/drivers/net/wireless/libertas/assoc.c b/drivers/net/wireless/libertas/assoc.c
index 2c6ddb1f0072..b61b176e9d07 100644
--- a/drivers/net/wireless/libertas/assoc.c
+++ b/drivers/net/wireless/libertas/assoc.c
@@ -374,15 +374,40 @@ static int assoc_helper_wpa_keys(wlan_private *priv,
374 struct assoc_request * assoc_req) 374 struct assoc_request * assoc_req)
375{ 375{
376 int ret = 0; 376 int ret = 0;
377 unsigned int flags = assoc_req->flags;
377 378
378 lbs_deb_enter(LBS_DEB_ASSOC); 379 lbs_deb_enter(LBS_DEB_ASSOC);
379 380
380 ret = libertas_prepare_and_send_command(priv, 381 /* Work around older firmware bug where WPA unicast and multicast
381 CMD_802_11_KEY_MATERIAL, 382 * keys must be set independently. Seen in SDIO parts with firmware
382 CMD_ACT_SET, 383 * version 5.0.11p0.
383 CMD_OPTION_WAITFORRSP, 384 */
384 0, assoc_req);
385 385
386 if (test_bit(ASSOC_FLAG_WPA_UCAST_KEY, &assoc_req->flags)) {
387 clear_bit(ASSOC_FLAG_WPA_MCAST_KEY, &assoc_req->flags);
388 ret = libertas_prepare_and_send_command(priv,
389 CMD_802_11_KEY_MATERIAL,
390 CMD_ACT_SET,
391 CMD_OPTION_WAITFORRSP,
392 0, assoc_req);
393 assoc_req->flags = flags;
394 }
395
396 if (ret)
397 goto out;
398
399 if (test_bit(ASSOC_FLAG_WPA_MCAST_KEY, &assoc_req->flags)) {
400 clear_bit(ASSOC_FLAG_WPA_UCAST_KEY, &assoc_req->flags);
401
402 ret = libertas_prepare_and_send_command(priv,
403 CMD_802_11_KEY_MATERIAL,
404 CMD_ACT_SET,
405 CMD_OPTION_WAITFORRSP,
406 0, assoc_req);
407 assoc_req->flags = flags;
408 }
409
410out:
386 lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret); 411 lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret);
387 return ret; 412 return ret;
388} 413}