i40e: remove code to handle dev_addr specially
The netdev->dev_addr MAC filter already exists in the MAC/VLAN hash table, as it is added when we configure the netdev in i40e_configure_netdev. Because we already know that this address will be updated in the hash_for_each loops, we do not need to handle it specially. This removes duplicate code and simplifies the i40e_vsi_add_vlan and i40e_vsi_kill_vlan functions. Because we know these filters must be part of the MAC/VLAN hash table, this should not have any functional impact on what filters are included and is merely a code simplification. Change-ID: I5e648302dbdd7cc29efc6d203b7019c11f0b5705 Signed-off-by: Jacob Keller <jacob.e.keller@intel.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
6beb84a73e
commit
3c7cbd45bc
|
@ -2515,17 +2515,6 @@ int i40e_vsi_add_vlan(struct i40e_vsi *vsi, s16 vid)
|
||||||
/* Locked once because all functions invoked below iterates list*/
|
/* Locked once because all functions invoked below iterates list*/
|
||||||
spin_lock_bh(&vsi->mac_filter_hash_lock);
|
spin_lock_bh(&vsi->mac_filter_hash_lock);
|
||||||
|
|
||||||
if (vsi->netdev) {
|
|
||||||
add_f = i40e_add_filter(vsi, vsi->netdev->dev_addr, vid);
|
|
||||||
if (!add_f) {
|
|
||||||
dev_info(&vsi->back->pdev->dev,
|
|
||||||
"Could not add vlan filter %d for %pM\n",
|
|
||||||
vid, vsi->netdev->dev_addr);
|
|
||||||
spin_unlock_bh(&vsi->mac_filter_hash_lock);
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) {
|
hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) {
|
||||||
if (f->state == I40E_FILTER_REMOVE)
|
if (f->state == I40E_FILTER_REMOVE)
|
||||||
continue;
|
continue;
|
||||||
|
@ -2539,28 +2528,14 @@ int i40e_vsi_add_vlan(struct i40e_vsi *vsi, s16 vid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now if we add a vlan tag, make sure to check if it is the first
|
/* When we add a new VLAN filter, we need to make sure that all existing
|
||||||
* tag (i.e. a "tag" -1 does exist) and if so replace the -1 "tag"
|
* filters which are marked as vid=-1 (I40E_VLAN_ANY) are converted to
|
||||||
* with 0, so we now accept untagged and specified tagged traffic
|
* vid=0. The simplest way is just search for all filters marked as
|
||||||
* (and not all tags along with untagged)
|
* vid=-1 and replace them with vid=0. This converts all filters that
|
||||||
|
* were marked to receive all traffic (tagged or untagged) into
|
||||||
|
* filters to receive only untagged traffic, so that we don't receive
|
||||||
|
* tagged traffic for VLANs which we have not configured.
|
||||||
*/
|
*/
|
||||||
if (vid > 0 && vsi->netdev) {
|
|
||||||
del_f = i40e_find_filter(vsi, vsi->netdev->dev_addr,
|
|
||||||
I40E_VLAN_ANY);
|
|
||||||
if (del_f) {
|
|
||||||
__i40e_del_filter(vsi, del_f);
|
|
||||||
add_f = i40e_add_filter(vsi, vsi->netdev->dev_addr, 0);
|
|
||||||
if (!add_f) {
|
|
||||||
dev_info(&vsi->back->pdev->dev,
|
|
||||||
"Could not add filter 0 for %pM\n",
|
|
||||||
vsi->netdev->dev_addr);
|
|
||||||
spin_unlock_bh(&vsi->mac_filter_hash_lock);
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Do not assume that I40E_VLAN_ANY should be reset to VLAN 0 */
|
|
||||||
if (vid > 0 && !vsi->info.pvid) {
|
if (vid > 0 && !vsi->info.pvid) {
|
||||||
hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) {
|
hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) {
|
||||||
if (f->state == I40E_FILTER_REMOVE)
|
if (f->state == I40E_FILTER_REMOVE)
|
||||||
|
@ -2597,7 +2572,6 @@ int i40e_vsi_add_vlan(struct i40e_vsi *vsi, s16 vid)
|
||||||
**/
|
**/
|
||||||
void i40e_vsi_kill_vlan(struct i40e_vsi *vsi, s16 vid)
|
void i40e_vsi_kill_vlan(struct i40e_vsi *vsi, s16 vid)
|
||||||
{
|
{
|
||||||
struct net_device *netdev = vsi->netdev;
|
|
||||||
struct i40e_mac_filter *f;
|
struct i40e_mac_filter *f;
|
||||||
struct hlist_node *h;
|
struct hlist_node *h;
|
||||||
int bkt;
|
int bkt;
|
||||||
|
@ -2605,9 +2579,6 @@ void i40e_vsi_kill_vlan(struct i40e_vsi *vsi, s16 vid)
|
||||||
/* Locked once because all functions invoked below iterates list */
|
/* Locked once because all functions invoked below iterates list */
|
||||||
spin_lock_bh(&vsi->mac_filter_hash_lock);
|
spin_lock_bh(&vsi->mac_filter_hash_lock);
|
||||||
|
|
||||||
if (vsi->netdev)
|
|
||||||
i40e_del_filter(vsi, netdev->dev_addr, vid);
|
|
||||||
|
|
||||||
hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) {
|
hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) {
|
||||||
if (f->vlan == vid)
|
if (f->vlan == vid)
|
||||||
__i40e_del_filter(vsi, f);
|
__i40e_del_filter(vsi, f);
|
||||||
|
|
Loading…
Reference in New Issue