Commit 9b0436c3 authored by Michael Chan's avatar Michael Chan Committed by David S. Miller

bnxt_en: Fix SRIOV on big-endian architecture.

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: de68f5de ("bnxt_en: Fix bitmap declaration to work on 32-bit arches.")
Reported-by: default avatarShannon Nelson <shannon.nelson@oracle.com>
Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3b6b34df
...@@ -3458,13 +3458,18 @@ static int bnxt_hwrm_func_drv_rgtr(struct bnxt *bp) ...@@ -3458,13 +3458,18 @@ static int bnxt_hwrm_func_drv_rgtr(struct bnxt *bp)
req.ver_upd = DRV_VER_UPD; req.ver_upd = DRV_VER_UPD;
if (BNXT_PF(bp)) { if (BNXT_PF(bp)) {
DECLARE_BITMAP(vf_req_snif_bmap, 256); u32 data[8];
u32 *data = (u32 *)vf_req_snif_bmap;
int i; int i;
memset(vf_req_snif_bmap, 0, sizeof(vf_req_snif_bmap)); memset(data, 0, sizeof(data));
for (i = 0; i < ARRAY_SIZE(bnxt_vf_req_snif); i++) for (i = 0; i < ARRAY_SIZE(bnxt_vf_req_snif); i++) {
__set_bit(bnxt_vf_req_snif[i], vf_req_snif_bmap); 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++) for (i = 0; i < 8; i++)
req.vf_req_fwd[i] = cpu_to_le32(data[i]); req.vf_req_fwd[i] = cpu_to_le32(data[i]);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment