|
@@ -1937,15 +1937,35 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi)
|
|
cur_promisc = (!!(vsi->current_netdev_flags & IFF_PROMISC) ||
|
|
cur_promisc = (!!(vsi->current_netdev_flags & IFF_PROMISC) ||
|
|
test_bit(__I40E_FILTER_OVERFLOW_PROMISC,
|
|
test_bit(__I40E_FILTER_OVERFLOW_PROMISC,
|
|
&vsi->state));
|
|
&vsi->state));
|
|
- ret = i40e_aq_set_vsi_unicast_promiscuous(&vsi->back->hw,
|
|
|
|
|
|
+ if (vsi->type == I40E_VSI_MAIN && pf->lan_veb != I40E_NO_VEB) {
|
|
|
|
+ /* set defport ON for Main VSI instead of true promisc
|
|
|
|
+ * this way we will get all unicast/multicast and VLAN
|
|
|
|
+ * promisc behavior but will not get VF or VMDq traffic
|
|
|
|
+ * replicated on the Main VSI.
|
|
|
|
+ */
|
|
|
|
+ if (pf->cur_promisc != cur_promisc) {
|
|
|
|
+ pf->cur_promisc = cur_promisc;
|
|
|
|
+ i40e_do_reset_safe(pf,
|
|
|
|
+ BIT(__I40E_PF_RESET_REQUESTED));
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ ret = i40e_aq_set_vsi_unicast_promiscuous(
|
|
|
|
+ &vsi->back->hw,
|
|
vsi->seid,
|
|
vsi->seid,
|
|
cur_promisc, NULL);
|
|
cur_promisc, NULL);
|
|
- if (ret)
|
|
|
|
- dev_info(&pf->pdev->dev,
|
|
|
|
- "set uni promisc failed, err %s, aq_err %s\n",
|
|
|
|
- i40e_stat_str(&pf->hw, ret),
|
|
|
|
- i40e_aq_str(&pf->hw,
|
|
|
|
- pf->hw.aq.asq_last_status));
|
|
|
|
|
|
+ if (ret)
|
|
|
|
+ dev_info(&pf->pdev->dev,
|
|
|
|
+ "set unicast promisc failed, err %d, aq_err %d\n",
|
|
|
|
+ ret, pf->hw.aq.asq_last_status);
|
|
|
|
+ ret = i40e_aq_set_vsi_multicast_promiscuous(
|
|
|
|
+ &vsi->back->hw,
|
|
|
|
+ vsi->seid,
|
|
|
|
+ cur_promisc, NULL);
|
|
|
|
+ if (ret)
|
|
|
|
+ dev_info(&pf->pdev->dev,
|
|
|
|
+ "set multicast promisc failed, err %d, aq_err %d\n",
|
|
|
|
+ ret, pf->hw.aq.asq_last_status);
|
|
|
|
+ }
|
|
ret = i40e_aq_set_vsi_broadcast(&vsi->back->hw,
|
|
ret = i40e_aq_set_vsi_broadcast(&vsi->back->hw,
|
|
vsi->seid,
|
|
vsi->seid,
|
|
cur_promisc, NULL);
|
|
cur_promisc, NULL);
|
|
@@ -4001,6 +4021,7 @@ static void i40e_vsi_close(struct i40e_vsi *vsi)
|
|
i40e_vsi_free_irq(vsi);
|
|
i40e_vsi_free_irq(vsi);
|
|
i40e_vsi_free_tx_resources(vsi);
|
|
i40e_vsi_free_tx_resources(vsi);
|
|
i40e_vsi_free_rx_resources(vsi);
|
|
i40e_vsi_free_rx_resources(vsi);
|
|
|
|
+ vsi->current_netdev_flags = 0;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -9312,7 +9333,7 @@ void i40e_veb_release(struct i40e_veb *veb)
|
|
static int i40e_add_veb(struct i40e_veb *veb, struct i40e_vsi *vsi)
|
|
static int i40e_add_veb(struct i40e_veb *veb, struct i40e_vsi *vsi)
|
|
{
|
|
{
|
|
struct i40e_pf *pf = veb->pf;
|
|
struct i40e_pf *pf = veb->pf;
|
|
- bool is_default = false;
|
|
|
|
|
|
+ bool is_default = veb->pf->cur_promisc;
|
|
bool is_cloud = false;
|
|
bool is_cloud = false;
|
|
int ret;
|
|
int ret;
|
|
|
|
|