struct assoc_request * assoc_req)
 {
        int ret = 0;
+       unsigned int flags = assoc_req->flags;
 
        lbs_deb_enter(LBS_DEB_ASSOC);
 
-       ret = libertas_prepare_and_send_command(priv,
-                                   CMD_802_11_KEY_MATERIAL,
-                                   CMD_ACT_SET,
-                                   CMD_OPTION_WAITFORRSP,
-                                   0, assoc_req);
+       /* Work around older firmware bug where WPA unicast and multicast
+        * keys must be set independently.  Seen in SDIO parts with firmware
+        * version 5.0.11p0.
+        */
 
+       if (test_bit(ASSOC_FLAG_WPA_UCAST_KEY, &assoc_req->flags)) {
+               clear_bit(ASSOC_FLAG_WPA_MCAST_KEY, &assoc_req->flags);
+               ret = libertas_prepare_and_send_command(priv,
+                                       CMD_802_11_KEY_MATERIAL,
+                                       CMD_ACT_SET,
+                                       CMD_OPTION_WAITFORRSP,
+                                       0, assoc_req);
+               assoc_req->flags = flags;
+       }
+
+       if (ret)
+               goto out;
+
+       if (test_bit(ASSOC_FLAG_WPA_MCAST_KEY, &assoc_req->flags)) {
+               clear_bit(ASSOC_FLAG_WPA_UCAST_KEY, &assoc_req->flags);
+
+               ret = libertas_prepare_and_send_command(priv,
+                                       CMD_802_11_KEY_MATERIAL,
+                                       CMD_ACT_SET,
+                                       CMD_OPTION_WAITFORRSP,
+                                       0, assoc_req);
+               assoc_req->flags = flags;
+       }
+
+out:
        lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret);
        return ret;
 }