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: de68f5de56
("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>
This commit is contained in:
parent
3b6b34df34
commit
9b0436c3f2
|
@ -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]);
|
||||
|
|
Loading…
Reference in New Issue