Commit ab0441b4 authored by David S. Miller's avatar David S. Miller

Merge branch 'vmxnet3-version-6'

Ronak Doshi says:

====================
vmxnet3: upgrade to version 6

vmxnet3 emulation has recently added several new features which includes
increase in queues supported, remove power of 2 limitation on queues,
add RSS for ESP IPv6, etc. This patch series extends the vmxnet3 driver
to leverage these new features.

Compatibility is maintained using existing vmxnet3 versioning mechanism as
follows:
- new features added to vmxnet3 emulation are associated with new vmxnet3
   version viz. vmxnet3 version 6.
- emulation advertises all the versions it supports to the driver.
- during initialization, vmxnet3 driver picks the highest version number
supported by both the emulation and the driver and configures emulation
to run at that version.

In particular, following changes are introduced:

Patch 1:
  This patch introduces utility macros for vmxnet3 version 6 comparison
  and updates Copyright information.

Patch 2:
  This patch adds support to increase maximum Tx/Rx queues from 8 to 32.

Patch 3:
  This patch removes the limitation of power of 2 on the queues.

Patch 4:
  Uses existing get_rss_hash_opts and set_rss_hash_opts methods to add
  support for ESP IPv6 RSS.

Patch 5:
  This patch reports correct RSS hash type based on the type of RSS
  performed.

Patch 6:
  This patch updates maximum configurable mtu to 9190.

Patch 7:
  With all vmxnet3 version 6 changes incorporated in the vmxnet3 driver,
  with this patch, the driver can configure emulation to run at vmxnet3
  version 6.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents f4919ff5 ce2639ad
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
# #
# Linux driver for VMware's vmxnet3 ethernet NIC. # Linux driver for VMware's vmxnet3 ethernet NIC.
# #
# Copyright (C) 2007-2020, VMware, Inc. All Rights Reserved. # Copyright (C) 2007-2021, VMware, Inc. All Rights Reserved.
# #
# This program is free software; you can redistribute it and/or modify it # This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the # under the terms of the GNU General Public License as published by the
......
/* /*
* Linux driver for VMware's vmxnet3 ethernet NIC. * Linux driver for VMware's vmxnet3 ethernet NIC.
* *
* Copyright (C) 2008-2020, VMware, Inc. All Rights Reserved. * Copyright (C) 2008-2021, VMware, Inc. All Rights Reserved.
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the * under the terms of the GNU General Public License as published by the
......
/* /*
* Linux driver for VMware's vmxnet3 ethernet NIC. * Linux driver for VMware's vmxnet3 ethernet NIC.
* *
* Copyright (C) 2008-2020, VMware, Inc. All Rights Reserved. * Copyright (C) 2008-2021, VMware, Inc. All Rights Reserved.
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the * under the terms of the GNU General Public License as published by the
...@@ -98,6 +98,9 @@ enum { ...@@ -98,6 +98,9 @@ enum {
VMXNET3_CMD_GET_TXDATA_DESC_SIZE, VMXNET3_CMD_GET_TXDATA_DESC_SIZE,
VMXNET3_CMD_GET_COALESCE, VMXNET3_CMD_GET_COALESCE,
VMXNET3_CMD_GET_RSS_FIELDS, VMXNET3_CMD_GET_RSS_FIELDS,
VMXNET3_CMD_GET_RESERVED2,
VMXNET3_CMD_GET_RESERVED3,
VMXNET3_CMD_GET_MAX_QUEUES_CONF,
}; };
/* /*
...@@ -341,13 +344,15 @@ struct Vmxnet3_RxCompDescExt { ...@@ -341,13 +344,15 @@ struct Vmxnet3_RxCompDescExt {
#define VMXNET3_TXD_EOP_SIZE 1 #define VMXNET3_TXD_EOP_SIZE 1
/* value of RxCompDesc.rssType */ /* value of RxCompDesc.rssType */
enum { #define VMXNET3_RCD_RSS_TYPE_NONE 0
VMXNET3_RCD_RSS_TYPE_NONE = 0, #define VMXNET3_RCD_RSS_TYPE_IPV4 1
VMXNET3_RCD_RSS_TYPE_IPV4 = 1, #define VMXNET3_RCD_RSS_TYPE_TCPIPV4 2
VMXNET3_RCD_RSS_TYPE_TCPIPV4 = 2, #define VMXNET3_RCD_RSS_TYPE_IPV6 3
VMXNET3_RCD_RSS_TYPE_IPV6 = 3, #define VMXNET3_RCD_RSS_TYPE_TCPIPV6 4
VMXNET3_RCD_RSS_TYPE_TCPIPV6 = 4, #define VMXNET3_RCD_RSS_TYPE_UDPIPV4 5
}; #define VMXNET3_RCD_RSS_TYPE_UDPIPV6 6
#define VMXNET3_RCD_RSS_TYPE_ESPIPV4 7
#define VMXNET3_RCD_RSS_TYPE_ESPIPV6 8
/* a union for accessing all cmd/completion descriptors */ /* a union for accessing all cmd/completion descriptors */
...@@ -533,6 +538,13 @@ enum vmxnet3_intr_type { ...@@ -533,6 +538,13 @@ enum vmxnet3_intr_type {
/* addition 1 for events */ /* addition 1 for events */
#define VMXNET3_MAX_INTRS 25 #define VMXNET3_MAX_INTRS 25
/* Version 6 and later will use below macros */
#define VMXNET3_EXT_MAX_TX_QUEUES 32
#define VMXNET3_EXT_MAX_RX_QUEUES 32
/* addition 1 for events */
#define VMXNET3_EXT_MAX_INTRS 65
#define VMXNET3_FIRST_SET_INTRS 64
/* value of intrCtrl */ /* value of intrCtrl */
#define VMXNET3_IC_DISABLE_ALL 0x1 /* bit 0 */ #define VMXNET3_IC_DISABLE_ALL 0x1 /* bit 0 */
...@@ -547,6 +559,19 @@ struct Vmxnet3_IntrConf { ...@@ -547,6 +559,19 @@ struct Vmxnet3_IntrConf {
__le32 reserved[2]; __le32 reserved[2];
}; };
struct Vmxnet3_IntrConfExt {
u8 autoMask;
u8 numIntrs; /* # of interrupts */
u8 eventIntrIdx;
u8 reserved;
__le32 intrCtrl;
__le32 reserved1;
u8 modLevels[VMXNET3_EXT_MAX_INTRS]; /* moderation level for
* each intr
*/
u8 reserved2[3];
};
/* one bit per VLAN ID, the size is in the units of u32 */ /* one bit per VLAN ID, the size is in the units of u32 */
#define VMXNET3_VFT_SIZE (4096 / (sizeof(u32) * 8)) #define VMXNET3_VFT_SIZE (4096 / (sizeof(u32) * 8))
...@@ -719,11 +744,16 @@ struct Vmxnet3_DSDevRead { ...@@ -719,11 +744,16 @@ struct Vmxnet3_DSDevRead {
struct Vmxnet3_VariableLenConfDesc pluginConfDesc; struct Vmxnet3_VariableLenConfDesc pluginConfDesc;
}; };
struct Vmxnet3_DSDevReadExt {
/* read-only region for device, read by dev in response to a SET cmd */
struct Vmxnet3_IntrConfExt intrConfExt;
};
/* All structures in DriverShared are padded to multiples of 8 bytes */ /* All structures in DriverShared are padded to multiples of 8 bytes */
struct Vmxnet3_DriverShared { struct Vmxnet3_DriverShared {
__le32 magic; __le32 magic;
/* make devRead start at 64bit boundaries */ /* make devRead start at 64bit boundaries */
__le32 pad; __le32 size; /* size of DriverShared */
struct Vmxnet3_DSDevRead devRead; struct Vmxnet3_DSDevRead devRead;
__le32 ecr; __le32 ecr;
__le32 reserved; __le32 reserved;
...@@ -734,6 +764,7 @@ struct Vmxnet3_DriverShared { ...@@ -734,6 +764,7 @@ struct Vmxnet3_DriverShared {
* command * command
*/ */
} cu; } cu;
struct Vmxnet3_DSDevReadExt devReadExt;
}; };
...@@ -764,6 +795,7 @@ struct Vmxnet3_DriverShared { ...@@ -764,6 +795,7 @@ struct Vmxnet3_DriverShared {
((vfTable[vid >> 5] & (1 << (vid & 31))) != 0) ((vfTable[vid >> 5] & (1 << (vid & 31))) != 0)
#define VMXNET3_MAX_MTU 9000 #define VMXNET3_MAX_MTU 9000
#define VMXNET3_V6_MAX_MTU 9190
#define VMXNET3_MIN_MTU 60 #define VMXNET3_MIN_MTU 60
#define VMXNET3_LINK_UP (10000 << 16 | 1) /* 10 Gbps, up */ #define VMXNET3_LINK_UP (10000 << 16 | 1) /* 10 Gbps, up */
......
This diff is collapsed.
...@@ -787,6 +787,10 @@ vmxnet3_get_rss_hash_opts(struct vmxnet3_adapter *adapter, ...@@ -787,6 +787,10 @@ vmxnet3_get_rss_hash_opts(struct vmxnet3_adapter *adapter,
case AH_ESP_V6_FLOW: case AH_ESP_V6_FLOW:
case AH_V6_FLOW: case AH_V6_FLOW:
case ESP_V6_FLOW: case ESP_V6_FLOW:
if (VMXNET3_VERSION_GE_6(adapter) &&
(rss_fields & VMXNET3_RSS_FIELDS_ESPIP6))
info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
fallthrough;
case SCTP_V6_FLOW: case SCTP_V6_FLOW:
case IPV6_FLOW: case IPV6_FLOW:
info->data |= RXH_IP_SRC | RXH_IP_DST; info->data |= RXH_IP_SRC | RXH_IP_DST;
...@@ -871,6 +875,22 @@ vmxnet3_set_rss_hash_opt(struct net_device *netdev, ...@@ -871,6 +875,22 @@ vmxnet3_set_rss_hash_opt(struct net_device *netdev,
case ESP_V6_FLOW: case ESP_V6_FLOW:
case AH_V6_FLOW: case AH_V6_FLOW:
case AH_ESP_V6_FLOW: case AH_ESP_V6_FLOW:
if (!VMXNET3_VERSION_GE_6(adapter))
return -EOPNOTSUPP;
if (!(nfc->data & RXH_IP_SRC) ||
!(nfc->data & RXH_IP_DST))
return -EINVAL;
switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) {
case 0:
rss_fields &= ~VMXNET3_RSS_FIELDS_ESPIP6;
break;
case (RXH_L4_B_0_1 | RXH_L4_B_2_3):
rss_fields |= VMXNET3_RSS_FIELDS_ESPIP6;
break;
default:
return -EINVAL;
}
break;
case SCTP_V4_FLOW: case SCTP_V4_FLOW:
case SCTP_V6_FLOW: case SCTP_V6_FLOW:
if (!(nfc->data & RXH_IP_SRC) || if (!(nfc->data & RXH_IP_SRC) ||
......
/* /*
* Linux driver for VMware's vmxnet3 ethernet NIC. * Linux driver for VMware's vmxnet3 ethernet NIC.
* *
* Copyright (C) 2008-2020, VMware, Inc. All Rights Reserved. * Copyright (C) 2008-2021, VMware, Inc. All Rights Reserved.
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the * under the terms of the GNU General Public License as published by the
...@@ -69,18 +69,20 @@ ...@@ -69,18 +69,20 @@
/* /*
* Version numbers * Version numbers
*/ */
#define VMXNET3_DRIVER_VERSION_STRING "1.5.0.0-k" #define VMXNET3_DRIVER_VERSION_STRING "1.6.0.0-k"
/* Each byte of this 32-bit integer encodes a version number in /* Each byte of this 32-bit integer encodes a version number in
* VMXNET3_DRIVER_VERSION_STRING. * VMXNET3_DRIVER_VERSION_STRING.
*/ */
#define VMXNET3_DRIVER_VERSION_NUM 0x01050000 #define VMXNET3_DRIVER_VERSION_NUM 0x01060000
#if defined(CONFIG_PCI_MSI) #if defined(CONFIG_PCI_MSI)
/* RSS only makes sense if MSI-X is supported. */ /* RSS only makes sense if MSI-X is supported. */
#define VMXNET3_RSS #define VMXNET3_RSS
#endif #endif
#define VMXNET3_REV_6 5 /* Vmxnet3 Rev. 6 */
#define VMXNET3_REV_5 4 /* Vmxnet3 Rev. 5 */
#define VMXNET3_REV_4 3 /* Vmxnet3 Rev. 4 */ #define VMXNET3_REV_4 3 /* Vmxnet3 Rev. 4 */
#define VMXNET3_REV_3 2 /* Vmxnet3 Rev. 3 */ #define VMXNET3_REV_3 2 /* Vmxnet3 Rev. 3 */
#define VMXNET3_REV_2 1 /* Vmxnet3 Rev. 2 */ #define VMXNET3_REV_2 1 /* Vmxnet3 Rev. 2 */
...@@ -301,15 +303,18 @@ struct vmxnet3_rx_queue { ...@@ -301,15 +303,18 @@ struct vmxnet3_rx_queue {
struct vmxnet3_rq_driver_stats stats; struct vmxnet3_rq_driver_stats stats;
} __attribute__((__aligned__(SMP_CACHE_BYTES))); } __attribute__((__aligned__(SMP_CACHE_BYTES)));
#define VMXNET3_DEVICE_MAX_TX_QUEUES 8 #define VMXNET3_DEVICE_MAX_TX_QUEUES 32
#define VMXNET3_DEVICE_MAX_RX_QUEUES 8 /* Keep this value as a power of 2 */ #define VMXNET3_DEVICE_MAX_RX_QUEUES 32 /* Keep this value as a power of 2 */
#define VMXNET3_DEVICE_DEFAULT_TX_QUEUES 8
#define VMXNET3_DEVICE_DEFAULT_RX_QUEUES 8 /* Keep this value as a power of 2 */
/* Should be less than UPT1_RSS_MAX_IND_TABLE_SIZE */ /* Should be less than UPT1_RSS_MAX_IND_TABLE_SIZE */
#define VMXNET3_RSS_IND_TABLE_SIZE (VMXNET3_DEVICE_MAX_RX_QUEUES * 4) #define VMXNET3_RSS_IND_TABLE_SIZE (VMXNET3_DEVICE_MAX_RX_QUEUES * 4)
#define VMXNET3_LINUX_MAX_MSIX_VECT (VMXNET3_DEVICE_MAX_TX_QUEUES + \ #define VMXNET3_LINUX_MAX_MSIX_VECT (VMXNET3_DEVICE_MAX_TX_QUEUES + \
VMXNET3_DEVICE_MAX_RX_QUEUES + 1) VMXNET3_DEVICE_MAX_RX_QUEUES + 1)
#define VMXNET3_LINUX_MIN_MSIX_VECT 2 /* 1 for tx-rx pair and 1 for event */ #define VMXNET3_LINUX_MIN_MSIX_VECT 3 /* 1 for tx, 1 for rx pair and 1 for event */
struct vmxnet3_intr { struct vmxnet3_intr {
...@@ -396,6 +401,7 @@ struct vmxnet3_adapter { ...@@ -396,6 +401,7 @@ struct vmxnet3_adapter {
dma_addr_t adapter_pa; dma_addr_t adapter_pa;
dma_addr_t pm_conf_pa; dma_addr_t pm_conf_pa;
dma_addr_t rss_conf_pa; dma_addr_t rss_conf_pa;
bool queuesExtEnabled;
}; };
#define VMXNET3_WRITE_BAR0_REG(adapter, reg, val) \ #define VMXNET3_WRITE_BAR0_REG(adapter, reg, val) \
...@@ -421,6 +427,10 @@ struct vmxnet3_adapter { ...@@ -421,6 +427,10 @@ struct vmxnet3_adapter {
(adapter->version >= VMXNET3_REV_3 + 1) (adapter->version >= VMXNET3_REV_3 + 1)
#define VMXNET3_VERSION_GE_4(adapter) \ #define VMXNET3_VERSION_GE_4(adapter) \
(adapter->version >= VMXNET3_REV_4 + 1) (adapter->version >= VMXNET3_REV_4 + 1)
#define VMXNET3_VERSION_GE_5(adapter) \
(adapter->version >= VMXNET3_REV_5 + 1)
#define VMXNET3_VERSION_GE_6(adapter) \
(adapter->version >= VMXNET3_REV_6 + 1)
/* must be a multiple of VMXNET3_RING_SIZE_ALIGN */ /* must be a multiple of VMXNET3_RING_SIZE_ALIGN */
#define VMXNET3_DEF_TX_RING_SIZE 512 #define VMXNET3_DEF_TX_RING_SIZE 512
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment