staging: brcm80211: smac: fix for 64 bit systems
authorRoland Vossen <rvossen@broadcom.com>
Tue, 4 Oct 2011 21:19:12 +0000 (23:19 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 5 Oct 2011 20:39:05 +0000 (13:39 -0700)
A bug was introduced by the following commit (Sep 13):

    staging: brcm80211: use endian annotated structures in brcmsmac

Result was that 64 bits systems will not be able to acquire an IP address.
Also the rmmod crashed. This has been fixed and retested on a Sparc64.

Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Alwin Beukers <alwin@broadcom.com>
Reviewed-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/brcm80211/brcmsmac/mac80211_if.c
drivers/staging/brcm80211/brcmsmac/ucode_loader.h

index fa00ab31fab51d5da557737996316e1483e7123b..ac78052b495500a9fa00468145c57fe18c068ff9 100644 (file)
@@ -1606,7 +1606,7 @@ fail:
  * Precondition: Since this function is called in brcms_pci_probe() context,
  * no locking is required.
  */
-int brcms_ucode_init_uint(struct brcms_info *wl, u32 *data, u32 idx)
+int brcms_ucode_init_uint(struct brcms_info *wl, size_t *n_bytes, u32 idx)
 {
        int i, entry;
        const u8 *pdata;
@@ -1623,7 +1623,7 @@ int brcms_ucode_init_uint(struct brcms_info *wl, u32 *data, u32 idx)
                                                  "ERROR: fw hdr len\n");
                                        return -ENOMSG;
                                }
-                               *data = le32_to_cpu(*((__le32 *) pdata));
+                               *n_bytes = le32_to_cpu(*((__le32 *) pdata));
                                return 0;
                        }
                }
index 49d5b7e9a4ecd1ef840bed3cc5768217123033d8..18750a814b4f219f918aaed081d8e99f01e7f6f4 100644 (file)
@@ -50,8 +50,8 @@ extern void brcms_ucode_data_free(struct brcms_ucode *ucode);
 
 extern int brcms_ucode_init_buf(struct brcms_info *wl, void **pbuf,
                                unsigned int idx);
-extern int brcms_ucode_init_uint(struct brcms_info *wl, unsigned *data,
-                             unsigned int idx);
+extern int brcms_ucode_init_uint(struct brcms_info *wl, size_t *n_bytes,
+                                unsigned int idx);
 extern void brcms_ucode_free_buf(void *);
 extern int  brcms_check_firmwares(struct brcms_info *wl);