FAILED: patch "[PATCH] ixgbevf: fix mailbox API compatibility by negotiating" failed to apply to 6.1-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x a7075f501bd33c93570af759b6f4302ef0175168
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2025102053-upheld-recess-9b2f@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From a7075f501bd33c93570af759b6f4302ef0175168 Mon Sep 17 00:00:00 2001
From: Jedrzej Jagielski <[email protected]>
Date: Thu, 9 Oct 2025 17:03:49 -0700
Subject: [PATCH] ixgbevf: fix mailbox API compatibility by negotiating
supported features
There was backward compatibility in the terms of mailbox API. Various drivers from various OSes supporting 10G adapters from Intel portfolio could easily negotiate mailbox API.
This convention has been broken since introducing API 1.4. Commit 0062e7cc955e ("ixgbevf: add VF IPsec offload code") added support for IPSec which is specific only for the kernel ixgbe driver. None of the rest of the Intel 10G PF/VF drivers supports it. And actually lack of support was not included in the IPSec implementation - there were no such code paths. No possibility to negotiate support for the feature was introduced along with introduction of the feature itself.
Commit 339f28964147 ("ixgbevf: Add support for new mailbox communication between PF and VF") increasing API version to 1.5 did the same - it introduced code supported specifically by the PF ESX driver. It altered API version for the VF driver in the same time not touching the version defined for the PF ixgbe driver. It led to additional discrepancies, as the code provided within API 1.6 cannot be supported for Linux ixgbe driver as it causes crashes.
The issue was noticed some time ago and mitigated by Jake within the commit d0725312adf5 ("ixgbevf: stop attempting IPSEC offload on Mailbox API 1.5"). As a result we have regression for IPsec support and after increasing API to version 1.6 ixgbevf driver stopped to support ESX MBX.
To fix this mess add new mailbox op asking PF driver about supported features. Basing on a response determine whether to set support for IPSec and ESX-specific enhanced mailbox.
New mailbox op, for compatibility purposes, must be added within new API revision, as API version of OOT PF & VF drivers is already increased to 1.6 and doesn't incorporate features negotiate op.
Features negotiation mechanism gives possibility to be extended with new features when needed in the future.
drivers/net/ethernet/intel/ixgbevf/ipsec.c +10 -0
@@ -273,6 +273,9 @@ static int ixgbevf_ipsec_add_sa(struct net_device *dev, adapter =netdev_priv (dev); ipsec = adapter->ipsec; +if (!(adapter->pf_features &IXGBEVF_PF_SUP_IPSEC )) +return -EOPNOTSUPP ; +if (xs->id.proto !=IPPROTO_ESP && xs->id.proto !=IPPROTO_AH ) {NL_SET_ERR_MSG_MOD (extack,"Unsupported protocol for IPsec offload" );return -EINVAL ;
@@ -405,6 +408,9 @@ static void ixgbevf_ipsec_del_sa(struct net_device *dev, adapter =netdev_priv (dev); ipsec = adapter->ipsec; +if (!(adapter->pf_features &IXGBEVF_PF_SUP_IPSEC )) +return ; +if (xs->xso.dir ==XFRM_DEV_OFFLOAD_IN ) { sa_idx = xs->xso.offload_handle -IXGBE_IPSEC_BASE_RX_INDEX ;
@@ -612,6 +618,10 @@ void ixgbevf_init_ipsec_offload(struct ixgbevf_adapter *adapter)size_t size;switch (adapter->hw.api_version) { +case ixgbe_mbox_api_17: +if (!(adapter->pf_features &IXGBEVF_PF_SUP_IPSEC )) +return ; +break ;case ixgbe_mbox_api_14:break ;default :
drivers/net/ethernet/intel/ixgbevf/ixgbevf.h +7 -0
@@ -363,6 +363,13 @@ struct ixgbevf_adapter {struct ixgbe_hw hw;u16 msg_enable; +u32 pf_features; +#define IXGBEVF_PF_SUP_IPSEC BIT(0) +#define IXGBEVF_PF_SUP_ESX_MBX BIT(1) + +#define IXGBEVF_SUPPORTED_FEATURES (IXGBEVF_PF_SUP_IPSEC | \ + IXGBEVF_PF_SUP_ESX_MBX) +struct ixgbevf_hw_stats stats;unsigned long state;
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +30 -2
@@ -2271,10 +2271,35 @@ static void ixgbevf_init_last_counter_stats(struct ixgbevf_adapter *adapter) adapter->stats.base_vfmprc = adapter->stats.last_vfmprc; } +/** +* ixgbevf_set_features - Set features supported by PF +* @adapter: pointer to the adapter struct +* +* Negotiate with PF supported features and then set pf_features accordingly. +*/ +static void ixgbevf_set_features (struct ixgbevf_adapter *adapter) +{ +u32 *pf_features = &adapter->pf_features; +struct ixgbe_hw *hw = &adapter->hw; +int err; + + err = hw->mac.ops.negotiate_features (hw, pf_features); +if (err && err != -EOPNOTSUPP ) +netdev_dbg (adapter->netdev, +"PF feature negotiation failed.\n" ); + +/* Address also pre API 1.7 cases */ +if (hw->api_version == ixgbe_mbox_api_14) + *pf_features |=IXGBEVF_PF_SUP_IPSEC ; +else if (hw->api_version == ixgbe_mbox_api_15) + *pf_features |=IXGBEVF_PF_SUP_ESX_MBX ; +} +static void ixgbevf_negotiate_api (struct ixgbevf_adapter *adapter) {struct ixgbe_hw *hw = &adapter->hw;static const int api[] = { + ixgbe_mbox_api_17, ixgbe_mbox_api_16, ixgbe_mbox_api_15, ixgbe_mbox_api_14,
@@ -2295,8 +2320,9 @@ static void ixgbevf_negotiate_api(struct ixgbevf_adapter *adapter) idx++; } -/* Following is not supported by API 1.6, it is specific for 1.5 */ -if (hw->api_version == ixgbe_mbox_api_15) { +ixgbevf_set_features (adapter); + +if (adapter->pf_features &IXGBEVF_PF_SUP_ESX_MBX ) { hw->mbx.ops.init_params (hw);memcpy (&hw->mbx.ops, &ixgbevf_mbx_ops,sizeof (struct ixgbe_mbx_operations ));
@@ -2654,6 +2680,7 @@ static void ixgbevf_set_num_queues(struct ixgbevf_adapter *adapter)case ixgbe_mbox_api_14:case ixgbe_mbox_api_15:case ixgbe_mbox_api_16: +case ixgbe_mbox_api_17:if (adapter->xdp_prog && hw->mac.max_tx_queues == rss) rss = rss >3 ?2 :1 ;
@@ -4649,6 +4676,7 @@ static int ixgbevf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)case ixgbe_mbox_api_14:case ixgbe_mbox_api_15:case ixgbe_mbox_api_16: +case ixgbe_mbox_api_17: netdev->max_mtu =IXGBE_MAX_JUMBO_FRAME_SIZE - (ETH_HLEN +ETH_FCS_LEN );break ;
drivers/net/ethernet/intel/ixgbevf/mbx.h +4 -0
@@ -67,6 +67,7 @@ enum ixgbe_pfvf_api_rev { ixgbe_mbox_api_14,/* API version 1.4, linux/freebsd VF driver */ ixgbe_mbox_api_15,/* API version 1.5, linux/freebsd VF driver */ ixgbe_mbox_api_16,/* API version 1.6, linux/freebsd VF driver */ + ixgbe_mbox_api_17,/* API version 1.7, linux/freebsd VF driver */ /* This value should always be last */ ixgbe_mbox_api_unknown, /* indicates that API version is not known */ };
@@ -106,6 +107,9 @@ enum ixgbe_pfvf_api_rev {/* mailbox API, version 1.6 VF requests */ #define IXGBE_VF_GET_PF_LINK_STATE 0x11/* request PF to send link info */ +/* mailbox API, version 1.7 VF requests */ +#define IXGBE_VF_FEATURES_NEGOTIATE 0x12/* get features supported by PF*/ +/* length of permanent address message returned from PF */ #define IXGBE_VF_PERMADDR_MSG_LEN 4/* word in permanent address message with the current multicast type */
drivers/net/ethernet/intel/ixgbevf/vf.c +44 -1
99 lines not on this page · raw message
drivers/net/ethernet/intel/ixgbevf/vf.h +1 -0
@@ -26,6 +26,7 @@ struct ixgbe_mac_operations {s32 (*stop_adapter)(struct ixgbe_hw *);s32 (*get_bus_info)(struct ixgbe_hw *);s32 (*negotiate_api_version)(struct ixgbe_hw *hw,int api); +int (*negotiate_features)(struct ixgbe_hw *hw,u32 *pf_features);/* Link */ s32 (*setup_link)(struct ixgbe_hw *,ixgbe_link_speed ,bool ,bool );
Sasha Levin
maintainerPATCH 1/4 PCI: Add PCI_VDEVICE_SUB helper macro
From: Piotr Kwapulinski <[email protected]>
[ Upstream commit 208fff3f567e2a3c3e7e4788845e90245c3891b4 ]
PCI_VDEVICE_SUB generates the pci_device_id struct layout for the specific PCI device/subdevice. Private data may follow the output.
Stable-dep-of: a7075f501bd3 ("ixgbevf: fix mailbox API compatibility by negotiating supported features")
--- include/linux/pci.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
include/linux/pci.h +14 -0
@@ -1026,6 +1026,20 @@ static inline struct pci_driver *to_pci_driver(struct device_driver *drv) .vendor = PCI_VENDOR_ID_##vend, .device = (dev), \ .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID, 0, 0 +/** +* PCI_VDEVICE_SUB - describe a specific PCI device/subdevice in a short form +* @vend: the vendor name +* @dev: the 16 bit PCI Device ID +* @subvend: the 16 bit PCI Subvendor ID +* @subdev: the 16 bit PCI Subdevice ID +* +* Generate the pci_device_id struct layout for the specific PCI +* device/subdevice. Private data may follow the output. +*/ +#define PCI_VDEVICE_SUB (vend, dev, subvend, subdev) \ + .vendor = PCI_VENDOR_ID_##vend, .device = (dev), \ + .subvendor = (subvend), .subdevice = (subdev), 0, 0 +/** * PCI_DEVICE_DATA - macro used to describe a specific PCI device in very short form * @vend: the vendor name (without PCI_VENDOR_ID_ prefix)
Signature · 1 line
2.51.0
Sasha Levin
maintainerPATCH 2/4 ixgbevf: Add support for Intel(R) E610 device
From: Piotr Kwapulinski <[email protected]>
[ Upstream commit 4c44b450c69b676955c2790dcf467c1f969d80f1 ]
Add support for Intel(R) E610 Series of network devices. The E610 is based on X550 but adds firmware managed link, enhanced security capabilities and support for updated server manageability
Stable-dep-of: a7075f501bd3 ("ixgbevf: fix mailbox API compatibility by negotiating supported features")
--- drivers/net/ethernet/intel/ixgbevf/defines.h | 5 ++++- drivers/net/ethernet/intel/ixgbevf/ixgbevf.h | 6 +++++- drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 12 ++++++++++-- drivers/net/ethernet/intel/ixgbevf/vf.c | 12 +++++++++++- drivers/net/ethernet/intel/ixgbevf/vf.h | 4 +++- 5 files changed, 33 insertions(+), 6 deletions(-)
drivers/net/ethernet/intel/ixgbevf/defines.h +4 -1
@@ -1,5 +1,5 @@/* SPDX-License-Identifier: GPL-2.0 */ -/* Copyright(c) 1999 - 2018 Intel Corporation. */ +/* Copyright(c) 1999 - 2024 Intel Corporation. */ #ifndef _IXGBEVF_DEFINES_H_#define _IXGBEVF_DEFINES_H_
@@ -16,6 +16,9 @@#define IXGBE_DEV_ID_X550_VF_HV 0x1564#define IXGBE_DEV_ID_X550EM_X_VF_HV 0x15A9 +#define IXGBE_DEV_ID_E610_VF 0x57AD +#define IXGBE_SUBDEV_ID_E610_VF_HV 0x00FF +#define IXGBE_VF_IRQ_CLEAR_MASK 7#define IXGBE_VF_MAX_TX_QUEUES 8#define IXGBE_VF_MAX_RX_QUEUES 8
drivers/net/ethernet/intel/ixgbevf/ixgbevf.h +5 -1
@@ -1,5 +1,5 @@/* SPDX-License-Identifier: GPL-2.0 */ -/* Copyright(c) 1999 - 2018 Intel Corporation. */ +/* Copyright(c) 1999 - 2024 Intel Corporation. */ #ifndef _IXGBEVF_H_#define _IXGBEVF_H_
@@ -418,6 +418,8 @@ enum ixgbevf_boards { board_X550EM_x_vf, board_X550EM_x_vf_hv, board_x550em_a_vf, + board_e610_vf, + board_e610_vf_hv, }; enum ixgbevf_xcast_modes {
@@ -434,11 +436,13 @@ extern const struct ixgbevf_info ixgbevf_X550EM_x_vf_info;extern const struct ixgbe_mbx_operations ixgbevf_mbx_ops;extern const struct ixgbe_mbx_operations ixgbevf_mbx_ops_legacy;extern const struct ixgbevf_info ixgbevf_x550em_a_vf_info; +extern const struct ixgbevf_info ixgbevf_e610_vf_info;extern const struct ixgbevf_info ixgbevf_82599_vf_hv_info;extern const struct ixgbevf_info ixgbevf_X540_vf_hv_info;extern const struct ixgbevf_info ixgbevf_X550_vf_hv_info;extern const struct ixgbevf_info ixgbevf_X550EM_x_vf_hv_info; +extern const struct ixgbevf_info ixgbevf_e610_vf_hv_info;extern const struct ixgbe_mbx_operations ixgbevf_hv_mbx_ops;/* needed by ethtool.c */
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +10 -2
@@ -1,5 +1,5 @@// SPDX-License-Identifier: GPL-2.0 -/* Copyright(c) 1999 - 2018 Intel Corporation. */ +/* Copyright(c) 1999 - 2024 Intel Corporation. */ /****************************************************************************** Copyright (c)2006 - 2007 Myricom, Inc. for some LRO specific code
@@ -39,7 +39,7 @@ static const char ixgbevf_driver_string[] ="Intel(R) 10 Gigabit PCI Express Virtual Function Network Driver" ;static char ixgbevf_copyright[] = -"Copyright (c) 2009 - 2018 Intel Corporation." ; +"Copyright (c) 2009 - 2024 Intel Corporation." ;static const struct ixgbevf_info *ixgbevf_info_tbl[] = { [board_82599_vf] = &ixgbevf_82599_vf_info,
@@ -51,6 +51,8 @@ static const struct ixgbevf_info *ixgbevf_info_tbl[] = { [board_X550EM_x_vf] = &ixgbevf_X550EM_x_vf_info, [board_X550EM_x_vf_hv] = &ixgbevf_X550EM_x_vf_hv_info, [board_x550em_a_vf] = &ixgbevf_x550em_a_vf_info, + [board_e610_vf] = &ixgbevf_e610_vf_info, + [board_e610_vf_hv] = &ixgbevf_e610_vf_hv_info, };/* ixgbevf_pci_tbl - PCI Device ID Table
@@ -71,6 +73,9 @@ static const struct pci_device_id ixgbevf_pci_tbl[] = { {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_X550EM_X_VF), board_X550EM_x_vf }, {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_X550EM_X_VF_HV), board_X550EM_x_vf_hv}, {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_X550EM_A_VF), board_x550em_a_vf }, + {PCI_VDEVICE_SUB(INTEL, IXGBE_DEV_ID_E610_VF, PCI_ANY_ID, + IXGBE_SUBDEV_ID_E610_VF_HV), board_e610_vf_hv}, + {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_E610_VF), board_e610_vf},/* required last entry */ {0, } };
@@ -4686,6 +4691,9 @@ static int ixgbevf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)case ixgbe_mac_X540_vf:dev_info (&pdev->dev,"Intel(R) X540 Virtual Function\n" );break ; +case ixgbe_mac_e610_vf: +dev_info (&pdev->dev,"Intel(R) E610 Virtual Function\n" ); +break ;case ixgbe_mac_82599_vf:default :dev_info (&pdev->dev,"Intel(R) 82599 Virtual Function\n" );
drivers/net/ethernet/intel/ixgbevf/vf.c +11 -1
@@ -1,5 +1,5 @@// SPDX-License-Identifier: GPL-2.0 -/* Copyright(c) 1999 - 2018 Intel Corporation. */ +/* Copyright(c) 1999 - 2024 Intel Corporation. */ #include "vf.h" #include "ixgbevf.h"
@@ -1076,3 +1076,13 @@ const struct ixgbevf_info ixgbevf_x550em_a_vf_info = { .mac = ixgbe_mac_x550em_a_vf, .mac_ops = &ixgbevf_mac_ops, }; + +const struct ixgbevf_info ixgbevf_e610_vf_info = { + .mac = ixgbe_mac_e610_vf, + .mac_ops = &ixgbevf_mac_ops, +}; + +const struct ixgbevf_info ixgbevf_e610_vf_hv_info = { + .mac = ixgbe_mac_e610_vf, + .mac_ops = &ixgbevf_hv_mac_ops, +};
drivers/net/ethernet/intel/ixgbevf/vf.h +3 -1
@@ -1,5 +1,5 @@/* SPDX-License-Identifier: GPL-2.0 */ -/* Copyright(c) 1999 - 2018 Intel Corporation. */ +/* Copyright(c) 1999 - 2024 Intel Corporation. */ #ifndef __IXGBE_VF_H__#define __IXGBE_VF_H__
@@ -54,6 +54,8 @@ enum ixgbe_mac_type { ixgbe_mac_X550_vf, ixgbe_mac_X550EM_x_vf, ixgbe_mac_x550em_a_vf, + ixgbe_mac_e610, + ixgbe_mac_e610_vf, ixgbe_num_macs };
Signature · 1 line
2.51.0
Sasha Levin
maintainerPATCH 3/4 ixgbevf: fix getting link speed data for E610 devices
In reply to Sasha LevinFrom: Jedrzej Jagielski <[email protected]>
[ Upstream commit 53f0eb62b4d23d40686f2dd51776b8220f2887bb ]
E610 adapters no longer use the VFLINKS register to read PF's link speed and linkup state. As a result VF driver cannot get actual link state and it incorrectly reports 10G which is the default option. It leads to a situation where even 1G adapters print 10G as actual link speed. The same happens when PF driver set speed different than 10G.
Add new mailbox operation to let the VF driver request a PF driver to provide actual link data. Update the mailbox api to v1.6.
Incorporate both ways of getting link status within the legacy ixgbe_check_mac_link_vf() function.
Stable-dep-of: a7075f501bd3 ("ixgbevf: fix mailbox API compatibility by negotiating supported features")
--- drivers/net/ethernet/intel/ixgbevf/defines.h | 1 + .../net/ethernet/intel/ixgbevf/ixgbevf_main.c | 6 +- drivers/net/ethernet/intel/ixgbevf/mbx.h | 4 + drivers/net/ethernet/intel/ixgbevf/vf.c | 137 ++++++++++++++---- 4 files changed, 116 insertions(+), 32 deletions(-)
drivers/net/ethernet/intel/ixgbevf/defines.h +1 -0
@@ -28,6 +28,7 @@/* Link speed */ typedef u32 ixgbe_link_speed ; +#define IXGBE_LINK_SPEED_UNKNOWN 0#define IXGBE_LINK_SPEED_1GB_FULL 0x0020#define IXGBE_LINK_SPEED_10GB_FULL 0x0080#define IXGBE_LINK_SPEED_100_FULL 0x0008
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +5 -1
@@ -2272,6 +2272,7 @@ static void ixgbevf_negotiate_api(struct ixgbevf_adapter *adapter) {struct ixgbe_hw *hw = &adapter->hw;static const int api[] = { + ixgbe_mbox_api_16, ixgbe_mbox_api_15, ixgbe_mbox_api_14, ixgbe_mbox_api_13,
@@ -2291,7 +2292,8 @@ static void ixgbevf_negotiate_api(struct ixgbevf_adapter *adapter) idx++; } -if (hw->api_version >= ixgbe_mbox_api_15) { +/* Following is not supported by API 1.6, it is specific for 1.5 */ +if (hw->api_version == ixgbe_mbox_api_15) { hw->mbx.ops.init_params (hw);memcpy (&hw->mbx.ops, &ixgbevf_mbx_ops,sizeof (struct ixgbe_mbx_operations ));
@@ -2648,6 +2650,7 @@ static void ixgbevf_set_num_queues(struct ixgbevf_adapter *adapter)case ixgbe_mbox_api_13:case ixgbe_mbox_api_14:case ixgbe_mbox_api_15: +case ixgbe_mbox_api_16:if (adapter->xdp_prog && hw->mac.max_tx_queues == rss) rss = rss >3 ?2 :1 ;
@@ -4641,6 +4644,7 @@ static int ixgbevf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)case ixgbe_mbox_api_13:case ixgbe_mbox_api_14:case ixgbe_mbox_api_15: +case ixgbe_mbox_api_16: netdev->max_mtu =IXGBE_MAX_JUMBO_FRAME_SIZE - (ETH_HLEN +ETH_FCS_LEN );break ;
drivers/net/ethernet/intel/ixgbevf/mbx.h +4 -0
@@ -66,6 +66,7 @@ enum ixgbe_pfvf_api_rev { ixgbe_mbox_api_13,/* API version 1.3, linux/freebsd VF driver */ ixgbe_mbox_api_14,/* API version 1.4, linux/freebsd VF driver */ ixgbe_mbox_api_15,/* API version 1.5, linux/freebsd VF driver */ + ixgbe_mbox_api_16,/* API version 1.6, linux/freebsd VF driver */ /* This value should always be last */ ixgbe_mbox_api_unknown, /* indicates that API version is not known */ };
@@ -102,6 +103,9 @@ enum ixgbe_pfvf_api_rev {#define IXGBE_VF_GET_LINK_STATE 0x10/* get vf link state */ +/* mailbox API, version 1.6 VF requests */ +#define IXGBE_VF_GET_PF_LINK_STATE 0x11/* request PF to send link info */ +/* length of permanent address message returned from PF */ #define IXGBE_VF_PERMADDR_MSG_LEN 4/* word in permanent address message with the current multicast type */
drivers/net/ethernet/intel/ixgbevf/vf.c +106 -31
185 lines not on this page · raw message
Signature · 1 line
2.51.0
Sasha Levin
maintainerPATCH 4/4 ixgbevf: fix mailbox API compatibility by negotiating supported features
In reply to Sasha LevinFrom: Jedrzej Jagielski <[email protected]>
[ Upstream commit a7075f501bd33c93570af759b6f4302ef0175168 ]
There was backward compatibility in the terms of mailbox API. Various drivers from various OSes supporting 10G adapters from Intel portfolio could easily negotiate mailbox API.
This convention has been broken since introducing API 1.4. Commit 0062e7cc955e ("ixgbevf: add VF IPsec offload code") added support for IPSec which is specific only for the kernel ixgbe driver. None of the rest of the Intel 10G PF/VF drivers supports it. And actually lack of support was not included in the IPSec implementation - there were no such code paths. No possibility to negotiate support for the feature was introduced along with introduction of the feature itself.
Commit 339f28964147 ("ixgbevf: Add support for new mailbox communication between PF and VF") increasing API version to 1.5 did the same - it introduced code supported specifically by the PF ESX driver. It altered API version for the VF driver in the same time not touching the version defined for the PF ixgbe driver. It led to additional discrepancies, as the code provided within API 1.6 cannot be supported for Linux ixgbe driver as it causes crashes.
The issue was noticed some time ago and mitigated by Jake within the commit d0725312adf5 ("ixgbevf: stop attempting IPSEC offload on Mailbox API 1.5"). As a result we have regression for IPsec support and after increasing API to version 1.6 ixgbevf driver stopped to support ESX MBX.
To fix this mess add new mailbox op asking PF driver about supported features. Basing on a response determine whether to set support for IPSec and ESX-specific enhanced mailbox.
New mailbox op, for compatibility purposes, must be added within new API revision, as API version of OOT PF & VF drivers is already increased to 1.6 and doesn't incorporate features negotiate op.
Features negotiation mechanism gives possibility to be extended with new features when needed in the future.
--- drivers/net/ethernet/intel/ixgbevf/ipsec.c | 10 +++++ drivers/net/ethernet/intel/ixgbevf/ixgbevf.h | 7 +++ .../net/ethernet/intel/ixgbevf/ixgbevf_main.c | 32 ++++++++++++- drivers/net/ethernet/intel/ixgbevf/mbx.h | 4 ++ drivers/net/ethernet/intel/ixgbevf/vf.c | 45 ++++++++++++++++++- drivers/net/ethernet/intel/ixgbevf/vf.h | 1 + 6 files changed, 96 insertions(+), 3 deletions(-)
drivers/net/ethernet/intel/ixgbevf/ipsec.c +10 -0
@@ -269,6 +269,9 @@ static int ixgbevf_ipsec_add_sa(struct xfrm_state *xs) adapter =netdev_priv (dev); ipsec = adapter->ipsec; +if (!(adapter->pf_features &IXGBEVF_PF_SUP_IPSEC )) +return -EOPNOTSUPP ; +if (xs->id.proto !=IPPROTO_ESP && xs->id.proto !=IPPROTO_AH ) {netdev_err (dev,"Unsupported protocol 0x%04x for IPsec offload\n" , xs->id.proto);
@@ -394,6 +397,9 @@ static void ixgbevf_ipsec_del_sa(struct xfrm_state *xs) adapter =netdev_priv (dev); ipsec = adapter->ipsec; +if (!(adapter->pf_features &IXGBEVF_PF_SUP_IPSEC )) +return ; +if (xs->xso.dir ==XFRM_DEV_OFFLOAD_IN ) { sa_idx = xs->xso.offload_handle -IXGBE_IPSEC_BASE_RX_INDEX ;
@@ -622,6 +628,10 @@ void ixgbevf_init_ipsec_offload(struct ixgbevf_adapter *adapter)size_t size;switch (adapter->hw.api_version) { +case ixgbe_mbox_api_17: +if (!(adapter->pf_features &IXGBEVF_PF_SUP_IPSEC )) +return ; +break ;case ixgbe_mbox_api_14:break ;default :
drivers/net/ethernet/intel/ixgbevf/ixgbevf.h +7 -0
@@ -366,6 +366,13 @@ struct ixgbevf_adapter {/* Interrupt Throttle Rate */ u32 eitr_param; +u32 pf_features; +#define IXGBEVF_PF_SUP_IPSEC BIT(0) +#define IXGBEVF_PF_SUP_ESX_MBX BIT(1) + +#define IXGBEVF_SUPPORTED_FEATURES (IXGBEVF_PF_SUP_IPSEC | \ + IXGBEVF_PF_SUP_ESX_MBX) +struct ixgbevf_hw_stats stats;unsigned long state;
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +30 -2
@@ -2268,10 +2268,35 @@ static void ixgbevf_init_last_counter_stats(struct ixgbevf_adapter *adapter) adapter->stats.base_vfmprc = adapter->stats.last_vfmprc; } +/** +* ixgbevf_set_features - Set features supported by PF +* @adapter: pointer to the adapter struct +* +* Negotiate with PF supported features and then set pf_features accordingly. +*/ +static void ixgbevf_set_features (struct ixgbevf_adapter *adapter) +{ +u32 *pf_features = &adapter->pf_features; +struct ixgbe_hw *hw = &adapter->hw; +int err; + + err = hw->mac.ops.negotiate_features (hw, pf_features); +if (err && err != -EOPNOTSUPP ) +netdev_dbg (adapter->netdev, +"PF feature negotiation failed.\n" ); + +/* Address also pre API 1.7 cases */ +if (hw->api_version == ixgbe_mbox_api_14) + *pf_features |=IXGBEVF_PF_SUP_IPSEC ; +else if (hw->api_version == ixgbe_mbox_api_15) + *pf_features |=IXGBEVF_PF_SUP_ESX_MBX ; +} +static void ixgbevf_negotiate_api (struct ixgbevf_adapter *adapter) {struct ixgbe_hw *hw = &adapter->hw;static const int api[] = { + ixgbe_mbox_api_17, ixgbe_mbox_api_16, ixgbe_mbox_api_15, ixgbe_mbox_api_14,
@@ -2292,8 +2317,9 @@ static void ixgbevf_negotiate_api(struct ixgbevf_adapter *adapter) idx++; } -/* Following is not supported by API 1.6, it is specific for 1.5 */ -if (hw->api_version == ixgbe_mbox_api_15) { +ixgbevf_set_features (adapter); + +if (adapter->pf_features &IXGBEVF_PF_SUP_ESX_MBX ) { hw->mbx.ops.init_params (hw);memcpy (&hw->mbx.ops, &ixgbevf_mbx_ops,sizeof (struct ixgbe_mbx_operations ));
@@ -2651,6 +2677,7 @@ static void ixgbevf_set_num_queues(struct ixgbevf_adapter *adapter)case ixgbe_mbox_api_14:case ixgbe_mbox_api_15:case ixgbe_mbox_api_16: +case ixgbe_mbox_api_17:if (adapter->xdp_prog && hw->mac.max_tx_queues == rss) rss = rss >3 ?2 :1 ;
@@ -4645,6 +4672,7 @@ static int ixgbevf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)case ixgbe_mbox_api_14:case ixgbe_mbox_api_15:case ixgbe_mbox_api_16: +case ixgbe_mbox_api_17: netdev->max_mtu =IXGBE_MAX_JUMBO_FRAME_SIZE - (ETH_HLEN +ETH_FCS_LEN );break ;
drivers/net/ethernet/intel/ixgbevf/mbx.h +4 -0
@@ -67,6 +67,7 @@ enum ixgbe_pfvf_api_rev { ixgbe_mbox_api_14,/* API version 1.4, linux/freebsd VF driver */ ixgbe_mbox_api_15,/* API version 1.5, linux/freebsd VF driver */ ixgbe_mbox_api_16,/* API version 1.6, linux/freebsd VF driver */ + ixgbe_mbox_api_17,/* API version 1.7, linux/freebsd VF driver */ /* This value should always be last */ ixgbe_mbox_api_unknown, /* indicates that API version is not known */ };
@@ -106,6 +107,9 @@ enum ixgbe_pfvf_api_rev {/* mailbox API, version 1.6 VF requests */ #define IXGBE_VF_GET_PF_LINK_STATE 0x11/* request PF to send link info */ +/* mailbox API, version 1.7 VF requests */ +#define IXGBE_VF_FEATURES_NEGOTIATE 0x12/* get features supported by PF*/ +/* length of permanent address message returned from PF */ #define IXGBE_VF_PERMADDR_MSG_LEN 4/* word in permanent address message with the current multicast type */
drivers/net/ethernet/intel/ixgbevf/vf.c +44 -1
99 lines not on this page · raw message
drivers/net/ethernet/intel/ixgbevf/vf.h +1 -0
@@ -26,6 +26,7 @@ struct ixgbe_mac_operations {s32 (*stop_adapter)(struct ixgbe_hw *);s32 (*get_bus_info)(struct ixgbe_hw *);s32 (*negotiate_api_version)(struct ixgbe_hw *hw,int api); +int (*negotiate_features)(struct ixgbe_hw *hw,u32 *pf_features);/* Link */ s32 (*setup_link)(struct ixgbe_hw *,ixgbe_link_speed ,bool ,bool );
Signature · 1 line
2.51.0