]> git.itanic.dy.fi Git - linux-stable/commitdiff
iavf: Fix handling of vlan strip virtual channel messages
authorMichal Maloszewski <michal.maloszewski@intel.com>
Mon, 24 Jan 2022 13:35:43 +0000 (13:35 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 16 Mar 2022 13:26:43 +0000 (14:26 +0100)
[ Upstream commit 2cf29e55894886965722e6625f6a03630b4db31d ]

Modify netdev->features for vlan stripping based on virtual
channel messages received from the PF. Change is needed
to synchronize vlan strip status between PF sysfs and iavf ethtool.

Fixes: 5951a2b9812d ("iavf: Fix VLAN feature flags after VFR")
Signed-off-by: Norbert Ciosek <norbertx.ciosek@intel.com>
Signed-off-by: Michal Maloszewski <michal.maloszewski@intel.com>
Tested-by: Konrad Jankowski <konrad0.jankowski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/intel/iavf/iavf_virtchnl.c

index d3da65d24bd6231e9fea07269de48c46d460ba7b..c83ac6adeeb77f59a4d538d3eccb5f0987253a63 100644 (file)
@@ -1460,6 +1460,22 @@ void iavf_request_reset(struct iavf_adapter *adapter)
        adapter->current_op = VIRTCHNL_OP_UNKNOWN;
 }
 
+/**
+ * iavf_netdev_features_vlan_strip_set - update vlan strip status
+ * @netdev: ptr to netdev being adjusted
+ * @enable: enable or disable vlan strip
+ *
+ * Helper function to change vlan strip status in netdev->features.
+ */
+static void iavf_netdev_features_vlan_strip_set(struct net_device *netdev,
+                                               const bool enable)
+{
+       if (enable)
+               netdev->features |= NETIF_F_HW_VLAN_CTAG_RX;
+       else
+               netdev->features &= ~NETIF_F_HW_VLAN_CTAG_RX;
+}
+
 /**
  * iavf_virtchnl_completion
  * @adapter: adapter structure
@@ -1683,8 +1699,18 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter,
                        }
                        break;
                case VIRTCHNL_OP_ENABLE_VLAN_STRIPPING:
+                       dev_warn(&adapter->pdev->dev, "Changing VLAN Stripping is not allowed when Port VLAN is configured\n");
+                       /* Vlan stripping could not be enabled by ethtool.
+                        * Disable it in netdev->features.
+                        */
+                       iavf_netdev_features_vlan_strip_set(netdev, false);
+                       break;
                case VIRTCHNL_OP_DISABLE_VLAN_STRIPPING:
                        dev_warn(&adapter->pdev->dev, "Changing VLAN Stripping is not allowed when Port VLAN is configured\n");
+                       /* Vlan stripping could not be disabled by ethtool.
+                        * Enable it in netdev->features.
+                        */
+                       iavf_netdev_features_vlan_strip_set(netdev, true);
                        break;
                default:
                        dev_err(&adapter->pdev->dev, "PF returned error %d (%s) to our request %d\n",
@@ -1918,6 +1944,20 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter,
                spin_unlock_bh(&adapter->adv_rss_lock);
                }
                break;
+       case VIRTCHNL_OP_ENABLE_VLAN_STRIPPING:
+               /* PF enabled vlan strip on this VF.
+                * Update netdev->features if needed to be in sync with ethtool.
+                */
+               if (!v_retval)
+                       iavf_netdev_features_vlan_strip_set(netdev, true);
+               break;
+       case VIRTCHNL_OP_DISABLE_VLAN_STRIPPING:
+               /* PF disabled vlan strip on this VF.
+                * Update netdev->features if needed to be in sync with ethtool.
+                */
+               if (!v_retval)
+                       iavf_netdev_features_vlan_strip_set(netdev, false);
+               break;
        default:
                if (adapter->current_op && (v_opcode != adapter->current_op))
                        dev_warn(&adapter->pdev->dev, "Expected response %d from PF, received %d\n",