bnxt_en: allow promiscuous mode for trusted VFs
Firmware previously only allowed promiscuous mode for VFs associated with a default VLAN. It is now possible to enable promiscuous mode for a VF having no VLAN configured provided that it is trusted. In such cases the VF will see all packets received by the PF, irrespective of destination MAC or VLAN. Note, it is necessary to query firmware at the time of bnxt_promisc_ok() instead of in bnxt_hwrm_func_qcfg() because the trusted status might be altered by the PF after the VF has been configured. This check must now also be deferred because the firmware call sleeps. Signed-off-by: Edwin Peer <edwin.peer@broadcom.com> Signed-off-by: Michael Chan <michael.chan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
d5ca99054f
commit
dd85fc0ab5
@@ -8340,11 +8340,11 @@ static int bnxt_alloc_rfs_vnics(struct bnxt *bp)
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Allow PF and VF with default VLAN to be in promiscuous mode */
|
||||
/* Allow PF, trusted VFs and VFs with default VLAN to be in promiscuous mode */
|
||||
static bool bnxt_promisc_ok(struct bnxt *bp)
|
||||
{
|
||||
#ifdef CONFIG_BNXT_SRIOV
|
||||
if (BNXT_VF(bp) && !bp->vf.vlan)
|
||||
if (BNXT_VF(bp) && !bp->vf.vlan && !bnxt_is_trusted_vf(bp, &bp->vf))
|
||||
return false;
|
||||
#endif
|
||||
return true;
|
||||
@@ -8441,7 +8441,7 @@ static int bnxt_init_chip(struct bnxt *bp, bool irq_re_init)
|
||||
if (bp->dev->flags & IFF_BROADCAST)
|
||||
vnic->rx_mask |= CFA_L2_SET_RX_MASK_REQ_MASK_BCAST;
|
||||
|
||||
if ((bp->dev->flags & IFF_PROMISC) && bnxt_promisc_ok(bp))
|
||||
if (bp->dev->flags & IFF_PROMISC)
|
||||
vnic->rx_mask |= CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS;
|
||||
|
||||
if (bp->dev->flags & IFF_ALLMULTI) {
|
||||
@@ -10485,7 +10485,7 @@ static void bnxt_set_rx_mode(struct net_device *dev)
|
||||
CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST |
|
||||
CFA_L2_SET_RX_MASK_REQ_MASK_BCAST);
|
||||
|
||||
if ((dev->flags & IFF_PROMISC) && bnxt_promisc_ok(bp))
|
||||
if (dev->flags & IFF_PROMISC)
|
||||
mask |= CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS;
|
||||
|
||||
uc_update = bnxt_uc_list_updated(bp);
|
||||
@@ -10561,6 +10561,9 @@ static int bnxt_cfg_rx_mode(struct bnxt *bp)
|
||||
}
|
||||
|
||||
skip_uc:
|
||||
if ((vnic->rx_mask & CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS) &&
|
||||
!bnxt_promisc_ok(bp))
|
||||
vnic->rx_mask &= ~CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS;
|
||||
rc = bnxt_hwrm_cfa_l2_set_rx_mask(bp, 0);
|
||||
if (rc && vnic->mc_list_count) {
|
||||
netdev_info(bp->dev, "Failed setting MC filters rc: %d, turning on ALL_MCAST mode\n",
|
||||
|
||||
Reference in New Issue
Block a user