Skip to content

Commit 8cdb159

Browse files
Pavan Chebbidavem330
authored andcommitted
bnxt_en: Fix incorrect multicast rx mask setting when not requested
We should setup multicast only when net_device flags explicitly has IFF_MULTICAST set. Otherwise we will incorrectly turn it on even when not asked. Fix it by only passing the multicast table to the firmware if IFF_MULTICAST is set. Fixes: 7d2837d ("bnxt_en: Setup multicast properly after resetting device.") Signed-off-by: Pavan Chebbi <[email protected]> Signed-off-by: Michael Chan <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent cfcab3b commit 8cdb159

File tree

1 file changed

+8
-5
lines changed
  • drivers/net/ethernet/broadcom/bnxt

1 file changed

+8
-5
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4747,8 +4747,10 @@ static int bnxt_hwrm_cfa_l2_set_rx_mask(struct bnxt *bp, u16 vnic_id)
47474747
return rc;
47484748

47494749
req->vnic_id = cpu_to_le32(vnic->fw_vnic_id);
4750-
req->num_mc_entries = cpu_to_le32(vnic->mc_list_count);
4751-
req->mc_tbl_addr = cpu_to_le64(vnic->mc_list_mapping);
4750+
if (vnic->rx_mask & CFA_L2_SET_RX_MASK_REQ_MASK_MCAST) {
4751+
req->num_mc_entries = cpu_to_le32(vnic->mc_list_count);
4752+
req->mc_tbl_addr = cpu_to_le64(vnic->mc_list_mapping);
4753+
}
47524754
req->mask = cpu_to_le32(vnic->rx_mask);
47534755
return hwrm_req_send_silent(bp, req);
47544756
}
@@ -8651,7 +8653,7 @@ static int bnxt_init_chip(struct bnxt *bp, bool irq_re_init)
86518653
if (bp->dev->flags & IFF_ALLMULTI) {
86528654
vnic->rx_mask |= CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST;
86538655
vnic->mc_list_count = 0;
8654-
} else {
8656+
} else if (bp->dev->flags & IFF_MULTICAST) {
86558657
u32 mask = 0;
86568658

86578659
bnxt_mc_list_updated(bp, &mask);
@@ -10779,7 +10781,7 @@ static void bnxt_set_rx_mode(struct net_device *dev)
1077910781
if (dev->flags & IFF_ALLMULTI) {
1078010782
mask |= CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST;
1078110783
vnic->mc_list_count = 0;
10782-
} else {
10784+
} else if (dev->flags & IFF_MULTICAST) {
1078310785
mc_update = bnxt_mc_list_updated(bp, &mask);
1078410786
}
1078510787

@@ -10856,9 +10858,10 @@ static int bnxt_cfg_rx_mode(struct bnxt *bp)
1085610858
!bnxt_promisc_ok(bp))
1085710859
vnic->rx_mask &= ~CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS;
1085810860
rc = bnxt_hwrm_cfa_l2_set_rx_mask(bp, 0);
10859-
if (rc && vnic->mc_list_count) {
10861+
if (rc && (vnic->rx_mask & CFA_L2_SET_RX_MASK_REQ_MASK_MCAST)) {
1086010862
netdev_info(bp->dev, "Failed setting MC filters rc: %d, turning on ALL_MCAST mode\n",
1086110863
rc);
10864+
vnic->rx_mask &= ~CFA_L2_SET_RX_MASK_REQ_MASK_MCAST;
1086210865
vnic->rx_mask |= CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST;
1086310866
vnic->mc_list_count = 0;
1086410867
rc = bnxt_hwrm_cfa_l2_set_rx_mask(bp, 0);

0 commit comments

Comments
 (0)