Skip to content

Commit d1d5df4

Browse files
committed
Merge branch 'intel-wired-lan-driver-updates-2025-10-01-idpf-ixgbe-ixgbevf'
Jacob Keller says: ==================== Intel Wired LAN Driver Updates 2025-10-01 (idpf, ixgbe, ixgbevf) For idpf: Milena fixes a memory leak in the idpf reset logic when the driver resets with an outstanding Tx timestamp. For ixgbe and ixgbevf: Jedrzej fixes an issue with reporting link speed on E610 VFs. Jedrzej also fixes the VF mailbox API incompatibilities caused by the confusion with API v1.4, v1.5, and v1.6. The v1.4 API introduced IPSEC offload, but this was only supported on Linux hosts. The v1.5 API introduced a new mailbox API which is necessary to resolve issues on ESX hosts. The v1.6 API introduced a new link management API for E610. Jedrzej introduces a new v1.7 API with a feature negotiation which enables properly checking if features such as IPSEC or the ESX mailbox APIs are supported. This resolves issues with compatibility on different hosts, and aligns the API across hosts instead of having Linux require custom mailbox API versions for IPSEC offload. Koichiro fixes a KASAN use-after-free bug in ixgbe_remove(). ==================== Link: https://patch.msgid.link/20251009-jk-iwl-net-2025-10-01-v3-0-ef32a425b92a@intel.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2 parents 21f4d45 + 5feef67 commit d1d5df4

File tree

12 files changed

+310
-34
lines changed

12 files changed

+310
-34
lines changed

drivers/net/ethernet/intel/idpf/idpf_ptp.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -863,6 +863,9 @@ static void idpf_ptp_release_vport_tstamp(struct idpf_vport *vport)
863863
u64_stats_inc(&vport->tstamp_stats.flushed);
864864

865865
list_del(&ptp_tx_tstamp->list_member);
866+
if (ptp_tx_tstamp->skb)
867+
consume_skb(ptp_tx_tstamp->skb);
868+
866869
kfree(ptp_tx_tstamp);
867870
}
868871
u64_stats_update_end(&vport->tstamp_stats.stats_sync);

drivers/net/ethernet/intel/idpf/idpf_virtchnl_ptp.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,7 @@ idpf_ptp_get_tstamp_value(struct idpf_vport *vport,
517517
shhwtstamps.hwtstamp = ns_to_ktime(tstamp);
518518
skb_tstamp_tx(ptp_tx_tstamp->skb, &shhwtstamps);
519519
consume_skb(ptp_tx_tstamp->skb);
520+
ptp_tx_tstamp->skb = NULL;
520521

521522
list_add(&ptp_tx_tstamp->list_member,
522523
&tx_tstamp_caps->latches_free);

drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12101,7 +12101,6 @@ static void ixgbe_remove(struct pci_dev *pdev)
1210112101

1210212102
devl_port_unregister(&adapter->devlink_port);
1210312103
devl_unlock(adapter->devlink);
12104-
devlink_free(adapter->devlink);
1210512104

1210612105
ixgbe_stop_ipsec_offload(adapter);
1210712106
ixgbe_clear_interrupt_scheme(adapter);
@@ -12137,6 +12136,8 @@ static void ixgbe_remove(struct pci_dev *pdev)
1213712136

1213812137
if (disable_dev)
1213912138
pci_disable_device(pdev);
12139+
12140+
devlink_free(adapter->devlink);
1214012141
}
1214112142

1214212143
/**

drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ enum ixgbe_pfvf_api_rev {
5050
ixgbe_mbox_api_12, /* API version 1.2, linux/freebsd VF driver */
5151
ixgbe_mbox_api_13, /* API version 1.3, linux/freebsd VF driver */
5252
ixgbe_mbox_api_14, /* API version 1.4, linux/freebsd VF driver */
53+
ixgbe_mbox_api_15, /* API version 1.5, linux/freebsd VF driver */
54+
ixgbe_mbox_api_16, /* API version 1.6, linux/freebsd VF driver */
55+
ixgbe_mbox_api_17, /* API version 1.7, linux/freebsd VF driver */
5356
/* This value should always be last */
5457
ixgbe_mbox_api_unknown, /* indicates that API version is not known */
5558
};
@@ -86,6 +89,12 @@ enum ixgbe_pfvf_api_rev {
8689

8790
#define IXGBE_VF_GET_LINK_STATE 0x10 /* get vf link state */
8891

92+
/* mailbox API, version 1.6 VF requests */
93+
#define IXGBE_VF_GET_PF_LINK_STATE 0x11 /* request PF to send link info */
94+
95+
/* mailbox API, version 1.7 VF requests */
96+
#define IXGBE_VF_FEATURES_NEGOTIATE 0x12 /* get features supported by PF */
97+
8998
/* length of permanent address message returned from PF */
9099
#define IXGBE_VF_PERMADDR_MSG_LEN 4
91100
/* word in permanent address message with the current multicast type */
@@ -96,6 +105,12 @@ enum ixgbe_pfvf_api_rev {
96105
#define IXGBE_VF_MBX_INIT_TIMEOUT 2000 /* number of retries on mailbox */
97106
#define IXGBE_VF_MBX_INIT_DELAY 500 /* microseconds between retries */
98107

108+
/* features negotiated between PF/VF */
109+
#define IXGBEVF_PF_SUP_IPSEC BIT(0)
110+
#define IXGBEVF_PF_SUP_ESX_MBX BIT(1)
111+
112+
#define IXGBE_SUPPORTED_FEATURES IXGBEVF_PF_SUP_IPSEC
113+
99114
struct ixgbe_hw;
100115

101116
int ixgbe_read_mbx(struct ixgbe_hw *, u32 *, u16, u16);

drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,8 @@ static int ixgbe_set_vf_lpe(struct ixgbe_adapter *adapter, u32 max_frame, u32 vf
510510
case ixgbe_mbox_api_12:
511511
case ixgbe_mbox_api_13:
512512
case ixgbe_mbox_api_14:
513+
case ixgbe_mbox_api_16:
514+
case ixgbe_mbox_api_17:
513515
/* Version 1.1 supports jumbo frames on VFs if PF has
514516
* jumbo frames enabled which means legacy VFs are
515517
* disabled
@@ -1046,6 +1048,8 @@ static int ixgbe_negotiate_vf_api(struct ixgbe_adapter *adapter,
10461048
case ixgbe_mbox_api_12:
10471049
case ixgbe_mbox_api_13:
10481050
case ixgbe_mbox_api_14:
1051+
case ixgbe_mbox_api_16:
1052+
case ixgbe_mbox_api_17:
10491053
adapter->vfinfo[vf].vf_api = api;
10501054
return 0;
10511055
default:
@@ -1072,6 +1076,8 @@ static int ixgbe_get_vf_queues(struct ixgbe_adapter *adapter,
10721076
case ixgbe_mbox_api_12:
10731077
case ixgbe_mbox_api_13:
10741078
case ixgbe_mbox_api_14:
1079+
case ixgbe_mbox_api_16:
1080+
case ixgbe_mbox_api_17:
10751081
break;
10761082
default:
10771083
return -1;
@@ -1112,6 +1118,8 @@ static int ixgbe_get_vf_reta(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf)
11121118

11131119
/* verify the PF is supporting the correct API */
11141120
switch (adapter->vfinfo[vf].vf_api) {
1121+
case ixgbe_mbox_api_17:
1122+
case ixgbe_mbox_api_16:
11151123
case ixgbe_mbox_api_14:
11161124
case ixgbe_mbox_api_13:
11171125
case ixgbe_mbox_api_12:
@@ -1145,6 +1153,8 @@ static int ixgbe_get_vf_rss_key(struct ixgbe_adapter *adapter,
11451153

11461154
/* verify the PF is supporting the correct API */
11471155
switch (adapter->vfinfo[vf].vf_api) {
1156+
case ixgbe_mbox_api_17:
1157+
case ixgbe_mbox_api_16:
11481158
case ixgbe_mbox_api_14:
11491159
case ixgbe_mbox_api_13:
11501160
case ixgbe_mbox_api_12:
@@ -1174,6 +1184,8 @@ static int ixgbe_update_vf_xcast_mode(struct ixgbe_adapter *adapter,
11741184
fallthrough;
11751185
case ixgbe_mbox_api_13:
11761186
case ixgbe_mbox_api_14:
1187+
case ixgbe_mbox_api_16:
1188+
case ixgbe_mbox_api_17:
11771189
break;
11781190
default:
11791191
return -EOPNOTSUPP;
@@ -1244,6 +1256,8 @@ static int ixgbe_get_vf_link_state(struct ixgbe_adapter *adapter,
12441256
case ixgbe_mbox_api_12:
12451257
case ixgbe_mbox_api_13:
12461258
case ixgbe_mbox_api_14:
1259+
case ixgbe_mbox_api_16:
1260+
case ixgbe_mbox_api_17:
12471261
break;
12481262
default:
12491263
return -EOPNOTSUPP;
@@ -1254,6 +1268,65 @@ static int ixgbe_get_vf_link_state(struct ixgbe_adapter *adapter,
12541268
return 0;
12551269
}
12561270

1271+
/**
1272+
* ixgbe_send_vf_link_status - send link status data to VF
1273+
* @adapter: pointer to adapter struct
1274+
* @msgbuf: pointer to message buffers
1275+
* @vf: VF identifier
1276+
*
1277+
* Reply for IXGBE_VF_GET_PF_LINK_STATE mbox command sending link status data.
1278+
*
1279+
* Return: 0 on success or -EOPNOTSUPP when operation is not supported.
1280+
*/
1281+
static int ixgbe_send_vf_link_status(struct ixgbe_adapter *adapter,
1282+
u32 *msgbuf, u32 vf)
1283+
{
1284+
struct ixgbe_hw *hw = &adapter->hw;
1285+
1286+
switch (adapter->vfinfo[vf].vf_api) {
1287+
case ixgbe_mbox_api_16:
1288+
case ixgbe_mbox_api_17:
1289+
if (hw->mac.type != ixgbe_mac_e610)
1290+
return -EOPNOTSUPP;
1291+
break;
1292+
default:
1293+
return -EOPNOTSUPP;
1294+
}
1295+
/* Simply provide stored values as watchdog & link status events take
1296+
* care of its freshness.
1297+
*/
1298+
msgbuf[1] = adapter->link_speed;
1299+
msgbuf[2] = adapter->link_up;
1300+
1301+
return 0;
1302+
}
1303+
1304+
/**
1305+
* ixgbe_negotiate_vf_features - negotiate supported features with VF driver
1306+
* @adapter: pointer to adapter struct
1307+
* @msgbuf: pointer to message buffers
1308+
* @vf: VF identifier
1309+
*
1310+
* Return: 0 on success or -EOPNOTSUPP when operation is not supported.
1311+
*/
1312+
static int ixgbe_negotiate_vf_features(struct ixgbe_adapter *adapter,
1313+
u32 *msgbuf, u32 vf)
1314+
{
1315+
u32 features = msgbuf[1];
1316+
1317+
switch (adapter->vfinfo[vf].vf_api) {
1318+
case ixgbe_mbox_api_17:
1319+
break;
1320+
default:
1321+
return -EOPNOTSUPP;
1322+
}
1323+
1324+
features &= IXGBE_SUPPORTED_FEATURES;
1325+
msgbuf[1] = features;
1326+
1327+
return 0;
1328+
}
1329+
12571330
static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
12581331
{
12591332
u32 mbx_size = IXGBE_VFMAILBOX_SIZE;
@@ -1328,6 +1401,12 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
13281401
case IXGBE_VF_IPSEC_DEL:
13291402
retval = ixgbe_ipsec_vf_del_sa(adapter, msgbuf, vf);
13301403
break;
1404+
case IXGBE_VF_GET_PF_LINK_STATE:
1405+
retval = ixgbe_send_vf_link_status(adapter, msgbuf, vf);
1406+
break;
1407+
case IXGBE_VF_FEATURES_NEGOTIATE:
1408+
retval = ixgbe_negotiate_vf_features(adapter, msgbuf, vf);
1409+
break;
13311410
default:
13321411
e_err(drv, "Unhandled Msg %8.8x\n", msgbuf[0]);
13331412
retval = -EIO;

drivers/net/ethernet/intel/ixgbevf/defines.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
/* Link speed */
3030
typedef u32 ixgbe_link_speed;
31+
#define IXGBE_LINK_SPEED_UNKNOWN 0
3132
#define IXGBE_LINK_SPEED_1GB_FULL 0x0020
3233
#define IXGBE_LINK_SPEED_10GB_FULL 0x0080
3334
#define IXGBE_LINK_SPEED_100_FULL 0x0008

drivers/net/ethernet/intel/ixgbevf/ipsec.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,9 @@ static int ixgbevf_ipsec_add_sa(struct net_device *dev,
273273
adapter = netdev_priv(dev);
274274
ipsec = adapter->ipsec;
275275

276+
if (!(adapter->pf_features & IXGBEVF_PF_SUP_IPSEC))
277+
return -EOPNOTSUPP;
278+
276279
if (xs->id.proto != IPPROTO_ESP && xs->id.proto != IPPROTO_AH) {
277280
NL_SET_ERR_MSG_MOD(extack, "Unsupported protocol for IPsec offload");
278281
return -EINVAL;
@@ -405,6 +408,9 @@ static void ixgbevf_ipsec_del_sa(struct net_device *dev,
405408
adapter = netdev_priv(dev);
406409
ipsec = adapter->ipsec;
407410

411+
if (!(adapter->pf_features & IXGBEVF_PF_SUP_IPSEC))
412+
return;
413+
408414
if (xs->xso.dir == XFRM_DEV_OFFLOAD_IN) {
409415
sa_idx = xs->xso.offload_handle - IXGBE_IPSEC_BASE_RX_INDEX;
410416

@@ -612,6 +618,10 @@ void ixgbevf_init_ipsec_offload(struct ixgbevf_adapter *adapter)
612618
size_t size;
613619

614620
switch (adapter->hw.api_version) {
621+
case ixgbe_mbox_api_17:
622+
if (!(adapter->pf_features & IXGBEVF_PF_SUP_IPSEC))
623+
return;
624+
break;
615625
case ixgbe_mbox_api_14:
616626
break;
617627
default:

drivers/net/ethernet/intel/ixgbevf/ixgbevf.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,13 @@ struct ixgbevf_adapter {
363363
struct ixgbe_hw hw;
364364
u16 msg_enable;
365365

366+
u32 pf_features;
367+
#define IXGBEVF_PF_SUP_IPSEC BIT(0)
368+
#define IXGBEVF_PF_SUP_ESX_MBX BIT(1)
369+
370+
#define IXGBEVF_SUPPORTED_FEATURES (IXGBEVF_PF_SUP_IPSEC | \
371+
IXGBEVF_PF_SUP_ESX_MBX)
372+
366373
struct ixgbevf_hw_stats stats;
367374

368375
unsigned long state;

drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2271,10 +2271,36 @@ static void ixgbevf_init_last_counter_stats(struct ixgbevf_adapter *adapter)
22712271
adapter->stats.base_vfmprc = adapter->stats.last_vfmprc;
22722272
}
22732273

2274+
/**
2275+
* ixgbevf_set_features - Set features supported by PF
2276+
* @adapter: pointer to the adapter struct
2277+
*
2278+
* Negotiate with PF supported features and then set pf_features accordingly.
2279+
*/
2280+
static void ixgbevf_set_features(struct ixgbevf_adapter *adapter)
2281+
{
2282+
u32 *pf_features = &adapter->pf_features;
2283+
struct ixgbe_hw *hw = &adapter->hw;
2284+
int err;
2285+
2286+
err = hw->mac.ops.negotiate_features(hw, pf_features);
2287+
if (err && err != -EOPNOTSUPP)
2288+
netdev_dbg(adapter->netdev,
2289+
"PF feature negotiation failed.\n");
2290+
2291+
/* Address also pre API 1.7 cases */
2292+
if (hw->api_version == ixgbe_mbox_api_14)
2293+
*pf_features |= IXGBEVF_PF_SUP_IPSEC;
2294+
else if (hw->api_version == ixgbe_mbox_api_15)
2295+
*pf_features |= IXGBEVF_PF_SUP_ESX_MBX;
2296+
}
2297+
22742298
static void ixgbevf_negotiate_api(struct ixgbevf_adapter *adapter)
22752299
{
22762300
struct ixgbe_hw *hw = &adapter->hw;
22772301
static const int api[] = {
2302+
ixgbe_mbox_api_17,
2303+
ixgbe_mbox_api_16,
22782304
ixgbe_mbox_api_15,
22792305
ixgbe_mbox_api_14,
22802306
ixgbe_mbox_api_13,
@@ -2294,7 +2320,9 @@ static void ixgbevf_negotiate_api(struct ixgbevf_adapter *adapter)
22942320
idx++;
22952321
}
22962322

2297-
if (hw->api_version >= ixgbe_mbox_api_15) {
2323+
ixgbevf_set_features(adapter);
2324+
2325+
if (adapter->pf_features & IXGBEVF_PF_SUP_ESX_MBX) {
22982326
hw->mbx.ops.init_params(hw);
22992327
memcpy(&hw->mbx.ops, &ixgbevf_mbx_ops,
23002328
sizeof(struct ixgbe_mbx_operations));
@@ -2651,6 +2679,8 @@ static void ixgbevf_set_num_queues(struct ixgbevf_adapter *adapter)
26512679
case ixgbe_mbox_api_13:
26522680
case ixgbe_mbox_api_14:
26532681
case ixgbe_mbox_api_15:
2682+
case ixgbe_mbox_api_16:
2683+
case ixgbe_mbox_api_17:
26542684
if (adapter->xdp_prog &&
26552685
hw->mac.max_tx_queues == rss)
26562686
rss = rss > 3 ? 2 : 1;
@@ -4645,6 +4675,8 @@ static int ixgbevf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
46454675
case ixgbe_mbox_api_13:
46464676
case ixgbe_mbox_api_14:
46474677
case ixgbe_mbox_api_15:
4678+
case ixgbe_mbox_api_16:
4679+
case ixgbe_mbox_api_17:
46484680
netdev->max_mtu = IXGBE_MAX_JUMBO_FRAME_SIZE -
46494681
(ETH_HLEN + ETH_FCS_LEN);
46504682
break;

drivers/net/ethernet/intel/ixgbevf/mbx.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ enum ixgbe_pfvf_api_rev {
6666
ixgbe_mbox_api_13, /* API version 1.3, linux/freebsd VF driver */
6767
ixgbe_mbox_api_14, /* API version 1.4, linux/freebsd VF driver */
6868
ixgbe_mbox_api_15, /* API version 1.5, linux/freebsd VF driver */
69+
ixgbe_mbox_api_16, /* API version 1.6, linux/freebsd VF driver */
70+
ixgbe_mbox_api_17, /* API version 1.7, linux/freebsd VF driver */
6971
/* This value should always be last */
7072
ixgbe_mbox_api_unknown, /* indicates that API version is not known */
7173
};
@@ -102,6 +104,12 @@ enum ixgbe_pfvf_api_rev {
102104

103105
#define IXGBE_VF_GET_LINK_STATE 0x10 /* get vf link state */
104106

107+
/* mailbox API, version 1.6 VF requests */
108+
#define IXGBE_VF_GET_PF_LINK_STATE 0x11 /* request PF to send link info */
109+
110+
/* mailbox API, version 1.7 VF requests */
111+
#define IXGBE_VF_FEATURES_NEGOTIATE 0x12 /* get features supported by PF*/
112+
105113
/* length of permanent address message returned from PF */
106114
#define IXGBE_VF_PERMADDR_MSG_LEN 4
107115
/* word in permanent address message with the current multicast type */

0 commit comments

Comments
 (0)