ice: Restore fix disabling RX VLAN filtering
authorMarcin Szycik <marcin.szycik@linux.intel.com>
Tue, 7 Nov 2023 13:51:38 +0000 (14:51 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 13 Dec 2023 17:45:06 +0000 (18:45 +0100)
[ Upstream commit 4e7f0087b058cc3cab8f3c32141b51aa5457d298 ]

Fix setting dis_rx_filtering depending on whether port vlan is being
turned on or off. This was originally fixed in commit c793f8ea15e3 ("ice:
Fix disabling Rx VLAN filtering with port VLAN enabled"), but while
refactoring ice_vf_vsi_init_vlan_ops(), the fix has been lost. Restore the
fix along with the original comment from that change.

Also delete duplicate lines in ice_port_vlan_on().

Fixes: 2946204b3fa8 ("ice: implement bridge port vlan")
Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com>
Signed-off-by: Marcin Szycik <marcin.szycik@linux.intel.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Tested-by: Rafal Romanowski <rafal.romanowski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/intel/ice/ice_vf_vsi_vlan_ops.c

index d7b10dc..80dc4bc 100644 (file)
@@ -32,7 +32,6 @@ static void ice_port_vlan_on(struct ice_vsi *vsi)
                /* setup outer VLAN ops */
                vlan_ops->set_port_vlan = ice_vsi_set_outer_port_vlan;
                vlan_ops->clear_port_vlan = ice_vsi_clear_outer_port_vlan;
-               vlan_ops->clear_port_vlan = ice_vsi_clear_outer_port_vlan;
 
                /* setup inner VLAN ops */
                vlan_ops = &vsi->inner_vlan_ops;
@@ -47,8 +46,13 @@ static void ice_port_vlan_on(struct ice_vsi *vsi)
 
                vlan_ops->set_port_vlan = ice_vsi_set_inner_port_vlan;
                vlan_ops->clear_port_vlan = ice_vsi_clear_inner_port_vlan;
-               vlan_ops->clear_port_vlan = ice_vsi_clear_inner_port_vlan;
        }
+
+       /* all Rx traffic should be in the domain of the assigned port VLAN,
+        * so prevent disabling Rx VLAN filtering
+        */
+       vlan_ops->dis_rx_filtering = noop_vlan;
+
        vlan_ops->ena_rx_filtering = ice_vsi_ena_rx_vlan_filtering;
 }
 
@@ -77,6 +81,8 @@ static void ice_port_vlan_off(struct ice_vsi *vsi)
                vlan_ops->del_vlan = ice_vsi_del_vlan;
        }
 
+       vlan_ops->dis_rx_filtering = ice_vsi_dis_rx_vlan_filtering;
+
        if (!test_bit(ICE_FLAG_VF_VLAN_PRUNING, pf->flags))
                vlan_ops->ena_rx_filtering = noop_vlan;
        else
@@ -141,7 +147,6 @@ void ice_vf_vsi_init_vlan_ops(struct ice_vsi *vsi)
                &vsi->outer_vlan_ops : &vsi->inner_vlan_ops;
 
        vlan_ops->add_vlan = ice_vsi_add_vlan;
-       vlan_ops->dis_rx_filtering = ice_vsi_dis_rx_vlan_filtering;
        vlan_ops->ena_tx_filtering = ice_vsi_ena_tx_vlan_filtering;
        vlan_ops->dis_tx_filtering = ice_vsi_dis_tx_vlan_filtering;
 }