bnxt_en: Fix SRIOV on big-endian architecture.
authorMichael Chan <michael.chan@broadcom.com>
Tue, 11 Jul 2017 17:05:36 +0000 (13:05 -0400)
committerDavid S. Miller <davem@davemloft.net>
Tue, 11 Jul 2017 17:32:11 +0000 (10:32 -0700)
The PF driver sets up a list of firmware commands from the VF driver that
needs to be forwarded to the PF for approval.  This list is a 256-bit
bitmap.  The code that sets up the bitmap falls apart on big-endian
architecture.  __set_bit() does not work because it operates on long types
whereas the firmware interface is defined in u32 types, causing bits in
the wrong 32-bit word to be set.

Fix it by setting the proper bits on an array of u32.

Fixes: de68f5de5651 ("bnxt_en: Fix bitmap declaration to work on 32-bit arches.")
Reported-by: Shannon Nelson <shannon.nelson@oracle.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnxt/bnxt.c

index d9830d09e6c31b41267d12445bd76e3b30cc638a..e7c8539cbddf6704720a4a11f5e09aebec066066 100644 (file)
@@ -3458,13 +3458,18 @@ static int bnxt_hwrm_func_drv_rgtr(struct bnxt *bp)
        req.ver_upd = DRV_VER_UPD;
 
        if (BNXT_PF(bp)) {
-               DECLARE_BITMAP(vf_req_snif_bmap, 256);
-               u32 *data = (u32 *)vf_req_snif_bmap;
+               u32 data[8];
                int i;
 
-               memset(vf_req_snif_bmap, 0, sizeof(vf_req_snif_bmap));
-               for (i = 0; i < ARRAY_SIZE(bnxt_vf_req_snif); i++)
-                       __set_bit(bnxt_vf_req_snif[i], vf_req_snif_bmap);
+               memset(data, 0, sizeof(data));
+               for (i = 0; i < ARRAY_SIZE(bnxt_vf_req_snif); i++) {
+                       u16 cmd = bnxt_vf_req_snif[i];
+                       unsigned int bit, idx;
+
+                       idx = cmd / 32;
+                       bit = cmd % 32;
+                       data[idx] |= 1 << bit;
+               }
 
                for (i = 0; i < 8; i++)
                        req.vf_req_fwd[i] = cpu_to_le32(data[i]);