Re: [PATCH next 4/7] vmxnet3: add command to set ring buffer sizes

2023-04-28 Thread Ronak Doshi

> On 4/27/23, 1:51 AM, "Ferruh Yigit" mailto:ferruh.yi...@amd.com>> wrote:
>
> README doesn't say much.
>
> The usage is not standard, and intention is not clear.
> Can you please dig this issue more to learn the the intention, may be we
> can find a better way or get rid of them completely?

Sure, I can take this up, but it will be better if that is investigated and 
done as a separate patch
as lot of definitions include those header files. The intention of this patch 
series is completely different,
and I don't want to break or delay this patch series. Is that OK?


Thanks, 
Ronak







Re: [PATCH next 0/7] vmxnet3: upgrade to version 7

2023-04-28 Thread Ronak Doshi

> On 4/27/23, 2:16 AM, "Ferruh Yigit"  > wrote:
>
> That document focuses on 1G and 10G network speeds, and uses "AMD
> Opteron 2384 Processors" (which seems discontinued at this point).
> I would expect there is an up to date version of the document, but if
> there isn't is the existing one still relevant to keep?

I don't think there is any recent public facing performance measurement document
for vmxnet3. I will remove the reference to this old document and will update 
the doc
once we have new document in the future.

Thanks, 
Ronak



[PATCH v3 next 0/7] net/vmxnet3: upgrade to version 7

2023-04-28 Thread Ronak Doshi
vmxnet3 emulation has recently added several new features including
support for uniform passthrough(UPT). To make UPT work vmxnet3 has
to be enhanced as per the new specification. 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 7.
- 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 7 comparison
  and updates Copyright information.

Patch 2:
  This patch adds new capability registers to fine control enablement of
  individual features based on emulation and passthrough.

Patch 3:
  This patch adds support for large passthrough BAR register.

Patch 4:
  This patch introduces new command to set ring buffer sizes to pass this
  information to the hardware.

Patch 5:
  For better performance, hardware has a requirement to limit number of TSO
  descriptors. This patch adds that support.

Patch 6:
  Avoid updating rxprod register when in UPT for performance reasons.

Patch 7:
  With all vmxnet3 version 7 changes incorporated in the vmxnet3 driver,
  with this patch, the driver can configure emulation to run at vmxnet3
  version 7.

Changes v2->v3:
- removed reference to old performance document

Changes in v2:
- modified the title to include "net/"
- addressed checkpatch complaints and some typo in patch commits
- removed RTE_ETH_DEV_CAPA_PASS_THRU as it was specific to vmxnet3
- added new features information in release notes
- updated feature related information in vmxnet3 driver documentation

Ronak Doshi (7):
  net/vmxnet3: prepare for version 7 changes
  net/vmxnet3: add support for capability registers
  net/vmxnet3: add support for large passthrough BAR register
  net/vmxnet3: add command to set ring buffer sizes
  net/vmxnet3: limit number of TXDs used for TSO packet
  net/vmxnet3: avoid updating rxprod register frequently
  net/vmxnet3: update to version 7

 doc/guides/nics/vmxnet3.rst | 30 +--
 doc/guides/rel_notes/release_23_07.rst  |  6 +++
 drivers/net/vmxnet3/base/vmxnet3_defs.h | 74 ++---
 drivers/net/vmxnet3/vmxnet3_ethdev.c| 95 -
 drivers/net/vmxnet3/vmxnet3_ethdev.h| 16 ++
 drivers/net/vmxnet3/vmxnet3_ring.h  |  2 +-
 drivers/net/vmxnet3/vmxnet3_rxtx.c  | 48 -
 7 files changed, 245 insertions(+), 26 deletions(-)

-- 
2.11.0



[PATCH v3 next 1/7] net/vmxnet3: prepare for version 7 changes

2023-04-28 Thread Ronak Doshi
vmxnet3 is currently at version 6 and this patch initiates the
preparation to accommodate changes for up to version 7. Introduced
utility macros for vmxnet3 version 7 comparison.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 drivers/net/vmxnet3/vmxnet3_ethdev.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.h 
b/drivers/net/vmxnet3/vmxnet3_ethdev.h
index 5a303717b1..fc976707fd 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.h
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.h
@@ -124,6 +124,7 @@ struct vmxnet3_hw {
UPT1_RxStats  snapshot_rx_stats[VMXNET3_MAX_RX_QUEUES];
 };
 
+#define VMXNET3_REV_7  6   /* Vmxnet3 Rev. 7 */
 #define VMXNET3_REV_6  5   /* Vmxnet3 Rev. 6 */
 #define VMXNET3_REV_5  4   /* Vmxnet3 Rev. 5 */
 #define VMXNET3_REV_4  3   /* Vmxnet3 Rev. 4 */
@@ -131,6 +132,7 @@ struct vmxnet3_hw {
 #define VMXNET3_REV_2  1   /* Vmxnet3 Rev. 2 */
 #define VMXNET3_REV_1  0   /* Vmxnet3 Rev. 1 */
 
+#define VMXNET3_VERSION_GE_7(hw) ((hw)->version >= VMXNET3_REV_7 + 1)
 #define VMXNET3_VERSION_GE_6(hw) ((hw)->version >= VMXNET3_REV_6 + 1)
 #define VMXNET3_VERSION_GE_5(hw) ((hw)->version >= VMXNET3_REV_5 + 1)
 #define VMXNET3_VERSION_GE_4(hw) ((hw)->version >= VMXNET3_REV_4 + 1)
-- 
2.11.0



[PATCH v3 next 2/7] net/vmxnet3: add support for capability registers

2023-04-28 Thread Ronak Doshi
This patch enhances vmxnet3 to support capability registers which
allows it to enable features selectively. The DCR register tracks
the capabilities vmxnet3 device supports. The PTCR register states
the capabilities that the passthrough device supports.

With the help of these registers, vmxnet3 can enable only those
features which the passthrough device supports. This allows
smooth transition to Uniform-Passthrough (UPT) mode if the virtual
NIC requests it. If PTCR register returns nothing or error it means
UPT is not being requested and vnic will continue in emulation mode.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 drivers/net/vmxnet3/base/vmxnet3_defs.h | 44 +---
 drivers/net/vmxnet3/vmxnet3_ethdev.c| 60 +
 drivers/net/vmxnet3/vmxnet3_ethdev.h| 11 ++
 3 files changed, 110 insertions(+), 5 deletions(-)

diff --git a/drivers/net/vmxnet3/base/vmxnet3_defs.h 
b/drivers/net/vmxnet3/base/vmxnet3_defs.h
index bd6695e69d..759fdb6e4a 100644
--- a/drivers/net/vmxnet3/base/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/base/vmxnet3_defs.h
@@ -26,6 +26,12 @@
 #define VMXNET3_REG_MACH  0x30   /* MAC Address High */
 #define VMXNET3_REG_ICR   0x38   /* Interrupt Cause Register */
 #define VMXNET3_REG_ECR   0x40   /* Event Cause Register */
+#define VMXNET3_REG_DCR   0x48   /* Device capability register,
+ * from 0x48 to 0x80
+ */
+#define VMXNET3_REG_PTCR  0x88   /* Passthru capbility register
+ * from 0x88 to 0xb0
+ */
 
 #define VMXNET3_REG_WSAL  0xF00  /* Wireless Shared Address Lo  */
 #define VMXNET3_REG_WSAH  0xF08  /* Wireless Shared Address Hi  */
@@ -103,11 +109,13 @@ typedef enum {
VMXNET3_CMD_GET_CONF_INTR,
VMXNET3_CMD_GET_ADAPTIVE_RING_INFO,
VMXNET3_CMD_GET_TXDATA_DESC_SIZE,
-   VMXNET3_CMD_RESERVED5,
-   VMXNET3_CMD_RESERVED6,
-   VMXNET3_CMD_RESERVED7,
-   VMXNET3_CMD_RESERVED8,
-   VMXNET3_CMD_GET_MAX_QUEUES_CONF,
+   VMXNET3_CMD_RESERVED5,
+   VMXNET3_CMD_RESERVED6,
+   VMXNET3_CMD_RESERVED7,
+   VMXNET3_CMD_RESERVED8,
+   VMXNET3_CMD_GET_MAX_QUEUES_CONF,
+   VMXNET3_CMD_GET_MAX_CAPABILITIES,
+   VMXNET3_CMD_GET_DCR0_REG,
 } Vmxnet3_Cmd;
 
 /* Adaptive Ring Info Flags */
@@ -877,4 +885,30 @@ do {\
 
 #define VMXNET3_DID_PASSTHRU0x
 
+#define VMXNET3_DCR_ERROR  31   /* error when bit 31 
of DCR is set */
+#define VMXNET3_CAP_UDP_RSS0/* bit 0 of DCR 0 */
+#define VMXNET3_CAP_ESP_RSS_IPV4   1/* bit 1 of DCR 0 */
+#define VMXNET3_CAP_GENEVE_CHECKSUM_OFFLOAD2/* bit 2 of DCR 0 */
+#define VMXNET3_CAP_GENEVE_TSO 3/* bit 3 of DCR 0 */
+#define VMXNET3_CAP_VXLAN_CHECKSUM_OFFLOAD 4/* bit 4 of DCR 0 */
+#define VMXNET3_CAP_VXLAN_TSO  5/* bit 5 of DCR 0 */
+#define VMXNET3_CAP_GENEVE_OUTER_CHECKSUM_OFFLOAD  6/* bit 6 of DCR 0 */
+#define VMXNET3_CAP_VXLAN_OUTER_CHECKSUM_OFFLOAD   7/* bit 7 of DCR 0 */
+#define VMXNET3_CAP_PKT_STEERING_IPV4  8/* bit 8 of DCR 0 */
+#define VMXNET3_CAP_VERSION_4_MAX  
VMXNET3_CAP_PKT_STEERING_IPV4
+#define VMXNET3_CAP_ESP_RSS_IPV6   9/* bit 9 of DCR 0 */
+#define VMXNET3_CAP_VERSION_5_MAX  VMXNET3_CAP_ESP_RSS_IPV6
+#define VMXNET3_CAP_ESP_OVER_UDP_RSS   10   /* bit 10 of DCR 0 */
+#define VMXNET3_CAP_INNER_RSS  11   /* bit 11 of DCR 0 */
+#define VMXNET3_CAP_INNER_ESP_RSS  12   /* bit 12 of DCR 0 */
+#define VMXNET3_CAP_CRC32_HASH_FUNC13   /* bit 13 of DCR 0 */
+#define VMXNET3_CAP_VERSION_6_MAX  VMXNET3_CAP_CRC32_HASH_FUNC
+#define VMXNET3_CAP_OAM_FILTER 14   /* bit 14 of DCR 0 */
+#define VMXNET3_CAP_ESP_QS 15   /* bit 15 of DCR 0 */
+#define VMXNET3_CAP_LARGE_BAR  16   /* bit 16 of DCR 0 */
+#define VMXNET3_CAP_OOORX_COMP 17   /* bit 17 of DCR 0 */
+#define VMXNET3_CAP_VERSION_7_MAX  18
+/* when new capability is introduced, update VMXNET3_CAP_MAX */
+#define VMXNET3_CAP_MAXVMXNET3_CAP_VERSION_7_MAX
+
 #endif /* _VMXNET3_DEFS_H_ */
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c 
b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index fd946dec5c..05b6d54cb9 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -299,6 +299,61 @@ eth_vmxnet3_txdata_get(struct vmxnet3_hw *hw)
sizeof(struct Vmxnet3_TxDataDesc) : txdata_desc_size;
 }
 
+static int
+eth_vmxnet3_setup_capabilities(struct vmxnet3_hw *hw,
+  struct rte_eth_dev *eth_dev)
+{
+   uint32_t dcr, ptcr, value;
+   struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev

[PATCH v3 next 4/7] net/vmxnet3: add command to set ring buffer sizes

2023-04-28 Thread Ronak Doshi
This patch adds a new command to set ring buffer sizes. This is
required to pass the buffer size information to passthrough devices.
Also, ring sizes are round down to power of 2.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 drivers/net/vmxnet3/base/vmxnet3_defs.h | 15 +++
 drivers/net/vmxnet3/vmxnet3_ethdev.c| 18 ++
 drivers/net/vmxnet3/vmxnet3_ethdev.h|  1 +
 drivers/net/vmxnet3/vmxnet3_rxtx.c  |  7 +++
 4 files changed, 41 insertions(+)

diff --git a/drivers/net/vmxnet3/base/vmxnet3_defs.h 
b/drivers/net/vmxnet3/base/vmxnet3_defs.h
index 27f35a0062..d8cc295b08 100644
--- a/drivers/net/vmxnet3/base/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/base/vmxnet3_defs.h
@@ -105,6 +105,9 @@ typedef enum {
VMXNET3_CMD_RESERVED4,
VMXNET3_CMD_REGISTER_MEMREGS,
VMXNET3_CMD_SET_RSS_FIELDS,
+   VMXNET3_CMD_RESERVED9,
+   VMXNET3_CMD_RESERVED10,
+   VMXNET3_CMD_SET_RING_BUFFER_SIZE,
 
VMXNET3_CMD_FIRST_GET = 0xF00D,
VMXNET3_CMD_GET_QUEUE_STATUS = VMXNET3_CMD_FIRST_GET,
@@ -822,6 +825,17 @@ typedef enum Vmxnet3_RSSField {
VMXNET3_RSS_FIELDS_ESPIP6 = 0x0020,
 } Vmxnet3_RSSField;
 
+typedef
+#include "vmware_pack_begin.h"
+struct Vmxnet3_RingBufferSize {
+   __le16  ring1BufSizeType0;
+   __le16  ring1BufSizeType1;
+   __le16  ring2BufSizeType1;
+   __le16  pad;
+}
+#include "vmware_pack_end.h"
+Vmxnet3_RingBufferSize;
+
 /*
  * If the command data <= 16 bytes, use the shared memory direcly.
  * Otherwise, use the variable length configuration descriptor.
@@ -832,6 +846,7 @@ union Vmxnet3_CmdInfo {
Vmxnet3_VariableLenConfDesc varConf;
Vmxnet3_SetPolling  setPolling;
Vmxnet3_RSSFieldsetRSSFields;
+   Vmxnet3_RingBufferSize  ringBufSize;
__le16  reserved[2];
__le64  data[2];
 }
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c 
b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index 62c7e048f5..b9cf007429 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -1018,6 +1018,22 @@ vmxnet3_setup_driver_shared(struct rte_eth_dev *dev)
return VMXNET3_SUCCESS;
 }
 
+static void
+vmxnet3_init_bufsize(struct vmxnet3_hw *hw)
+{
+   struct Vmxnet3_DriverShared *shared = hw->shared;
+   union Vmxnet3_CmdInfo *cmd_info = &shared->cu.cmdInfo;
+
+   if (!VMXNET3_VERSION_GE_7(hw))
+   return;
+
+   cmd_info->ringBufSize.ring1BufSizeType0 = hw->rxdata_buf_size;
+   cmd_info->ringBufSize.ring1BufSizeType1 = 0;
+   cmd_info->ringBufSize.ring2BufSizeType1 = hw->rxdata_buf_size;
+   VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD,
+  VMXNET3_CMD_SET_RING_BUFFER_SIZE);
+}
+
 /*
  * Configure device link speed and setup link.
  * Must be called after eth_vmxnet3_dev_init. Other wise it might fail
@@ -1101,6 +1117,8 @@ vmxnet3_dev_start(struct rte_eth_dev *dev)
return ret;
}
 
+   vmxnet3_init_bufsize(hw);
+
hw->adapter_stopped = FALSE;
 
/* Setting proper Rx Mode and issue Rx Mode Update command */
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.h 
b/drivers/net/vmxnet3/vmxnet3_ethdev.h
index cabd83e7e1..2b3e2c4caa 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.h
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.h
@@ -96,6 +96,7 @@ struct vmxnet3_hw {
 
uint16_t txdata_desc_size; /* tx data ring buffer size */
uint16_t rxdata_desc_size; /* rx data ring buffer size */
+   uint16_t rxdata_buf_size; /* rx data buffer size */
 
uint8_t num_intrs;
 
diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c 
b/drivers/net/vmxnet3/vmxnet3_rxtx.c
index 83daac02c4..e31878ecab 100644
--- a/drivers/net/vmxnet3/vmxnet3_rxtx.c
+++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c
@@ -1113,6 +1113,8 @@ vmxnet3_dev_tx_queue_setup(struct rte_eth_dev *dev,
return -EINVAL;
} else {
ring->size = nb_desc;
+   if (VMXNET3_VERSION_GE_7(hw))
+   ring->size = rte_align32prevpow2(nb_desc);
ring->size &= ~VMXNET3_RING_SIZE_MASK;
}
comp_ring->size = data_ring->size = ring->size;
@@ -1193,6 +1195,9 @@ vmxnet3_dev_rx_queue_setup(struct rte_eth_dev *dev,
}
 
rxq->mp = mp;
+   /* Remember buffer size for initialization in dev start. */
+   hw->rxdata_buf_size =
+   rte_pktmbuf_data_room_size(mp) - RTE_PKTMBUF_HEADROOM;
rxq->queue_id = queue_idx;
rxq->port_id = dev->data->port_id;
rxq->shared = NULL; /* set in vmxnet3_setup_driver_shared() */
@@ -1217,6 +1222,8 @@ vmxnet3_dev_rx_queue_setup(struct rte_eth_dev *dev,
return -EINVAL;
} else {
ring0->size = nb_desc;
+   if (VMXNET3_VERSION_GE_7(hw))
+   r

[PATCH v3 next 3/7] net/vmxnet3: add support for large passthrough BAR register

2023-04-28 Thread Ronak Doshi
For vmxnet3 to work in UPT mode, the BAR sizes have been increased.
The PT page has been extended to 2 pages and also includes OOB pages
as a part of PT BAR. This patch enhances vmxnet3 to use appropriate
BAR offsets based on the capability registered. To use new offsets,
VMXNET3_CAP_LARGE_BAR needs to be set by the device. If it is not set
then the device will use legacy PT page layout.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 drivers/net/vmxnet3/base/vmxnet3_defs.h | 13 +++--
 drivers/net/vmxnet3/vmxnet3_ethdev.c| 11 +++
 drivers/net/vmxnet3/vmxnet3_ethdev.h|  2 ++
 drivers/net/vmxnet3/vmxnet3_rxtx.c  | 13 +++--
 4 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/drivers/net/vmxnet3/base/vmxnet3_defs.h 
b/drivers/net/vmxnet3/base/vmxnet3_defs.h
index 759fdb6e4a..27f35a0062 100644
--- a/drivers/net/vmxnet3/base/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/base/vmxnet3_defs.h
@@ -43,8 +43,16 @@
 #define VMXNET3_REG_RXPROD   0x800 /* Rx Producer Index for ring 1 */
 #define VMXNET3_REG_RXPROD2  0xA00 /* Rx Producer Index for ring 2 */
 
-#define VMXNET3_PT_REG_SIZE 4096/* BAR 0 */
-#define VMXNET3_VD_REG_SIZE 4096/* BAR 1 */
+/* For Large PT BAR, the following offset to DB register */
+#define VMXNET3_REG_LB_TXPROD   0x1000 /* Tx Producer Index */
+#define VMXNET3_REG_LB_RXPROD   0x1400 /* Rx Producer Index for ring 1 */
+#define VMXNET3_REG_LB_RXPROD2  0x1800 /* Rx Producer Index for ring 2 */
+
+#define VMXNET3_PT_REG_SIZE 4096   /* BAR 0 */
+#define VMXNET3_LARGE_PT_REG_SIZE   8192   /* large PT pages */
+#define VMXNET3_VD_REG_SIZE 4096   /* BAR 1 */
+#define VMXNET3_LARGE_BAR0_REG_SIZE (4096 * 4096)  /* LARGE BAR 0 */
+#define VMXNET3_OOB_REG_SIZE(4094 * 4096)  /* OOB pages */
 
 /*
  * The two Vmxnet3 MMIO Register PCI BARs (BAR 0 at offset 10h and BAR 1 at
@@ -56,6 +64,7 @@
  * VMXNET3_MSIX_BAR_SIZE is defined in "vmxnet3Int.h"
  */
 #define VMXNET3_PHYSMEM_PAGES   4
+#define VMXNET3_PHYSMEM_LB_PAGES 4099 /* 4096 + 1 + 2 */
 
 #define VMXNET3_REG_ALIGN   8  /* All registers are 8-byte aligned. */
 #define VMXNET3_REG_ALIGN_MASK  0x7
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c 
b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index 05b6d54cb9..62c7e048f5 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -456,6 +456,17 @@ eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev)
hw->uptv2_enabled = TRUE;
eth_vmxnet3_setup_capabilities(hw, eth_dev);
}
+
+   if (hw->used_DCR_capabilities[0] & (1 << VMXNET3_CAP_LARGE_BAR)) {
+   hw->tx_prod_offset = VMXNET3_REG_LB_TXPROD;
+   hw->rx_prod_offset[0] = VMXNET3_REG_LB_RXPROD;
+   hw->rx_prod_offset[1] = VMXNET3_REG_LB_RXPROD2;
+   } else {
+   hw->tx_prod_offset = VMXNET3_REG_TXPROD;
+   hw->rx_prod_offset[0] = VMXNET3_REG_RXPROD;
+   hw->rx_prod_offset[1] = VMXNET3_REG_RXPROD2;
+   }
+
/* Getting MAC Address */
mac_lo = VMXNET3_READ_BAR1_REG(hw, VMXNET3_REG_MACL);
mac_hi = VMXNET3_READ_BAR1_REG(hw, VMXNET3_REG_MACH);
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.h 
b/drivers/net/vmxnet3/vmxnet3_ethdev.h
index 1bbf2b4465..cabd83e7e1 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.h
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.h
@@ -122,6 +122,8 @@ struct vmxnet3_hw {
UPT1_RxStats  saved_rx_stats[VMXNET3_EXT_MAX_RX_QUEUES];
UPT1_TxStats  snapshot_tx_stats[VMXNET3_MAX_TX_QUEUES];
UPT1_RxStats  snapshot_rx_stats[VMXNET3_MAX_RX_QUEUES];
+   uint16_t  tx_prod_offset;
+   uint16_t  rx_prod_offset[2];
/* device capability bit map */
uint32_t  DCR_capabilities[8];
/* pass-through capability bit map */
diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c 
b/drivers/net/vmxnet3/vmxnet3_rxtx.c
index a875ffec07..83daac02c4 100644
--- a/drivers/net/vmxnet3/vmxnet3_rxtx.c
+++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c
@@ -57,8 +57,6 @@
 #defineVMXNET3_TX_OFFLOAD_NOTSUP_MASK  \
(RTE_MBUF_F_TX_OFFLOAD_MASK ^ VMXNET3_TX_OFFLOAD_MASK)
 
-static const uint32_t rxprod_reg[2] = {VMXNET3_REG_RXPROD, 
VMXNET3_REG_RXPROD2};
-
 static int vmxnet3_post_rx_bufs(vmxnet3_rx_queue_t*, uint8_t);
 static void vmxnet3_tq_tx_complete(vmxnet3_tx_queue_t *);
 #ifdef RTE_LIBRTE_VMXNET3_DEBUG_DRIVER_NOT_USED
@@ -577,7 +575,7 @@ vmxnet3_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
if (deferred >= rte_le_to_cpu_32(txq_ctrl->txThreshold)) {
txq_ctrl->txNumDeferred = 0;
/* Notify vSwitch that packets are available. */
-   VMXNET3_WRITE_BAR0_REG(hw, (VMXNET3_REG_TXPROD + txq->queue_id 
* VMXNET3_REG_ALIGN),
+   VMXNET3_WRITE_BAR0_REG(hw, 

[PATCH v3 next 5/7] net/vmxnet3: limit number of TXDs used for TSO packet

2023-04-28 Thread Ronak Doshi
Currently, vmxnet3 does not have a limit on number of descriptors
used for a TSO packet. However, with UPT, for hardware performance
reasons, this patch limits the number of transmit descriptors to 24
for a TSO packet.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 drivers/net/vmxnet3/base/vmxnet3_defs.h |  2 ++
 drivers/net/vmxnet3/vmxnet3_rxtx.c  | 18 ++
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/drivers/net/vmxnet3/base/vmxnet3_defs.h 
b/drivers/net/vmxnet3/base/vmxnet3_defs.h
index d8cc295b08..24c235876e 100644
--- a/drivers/net/vmxnet3/base/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/base/vmxnet3_defs.h
@@ -419,6 +419,8 @@ typedef union Vmxnet3_GenericDesc {
 
 /* max # of tx descs for a non-tso pkt */
 #define VMXNET3_MAX_TXD_PER_PKT 16
+/* max # of tx descs for a tso pkt */
+#define VMXNET3_MAX_TSO_TXD_PER_PKT 24
 
 /* Max size of a single rx buffer */
 #define VMXNET3_MAX_RX_BUF_SIZE  ((1 << 14) - 1)
diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c 
b/drivers/net/vmxnet3/vmxnet3_rxtx.c
index e31878ecab..7bbae4177e 100644
--- a/drivers/net/vmxnet3/vmxnet3_rxtx.c
+++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c
@@ -364,6 +364,14 @@ vmxnet3_prep_pkts(__rte_unused void *tx_queue, struct 
rte_mbuf **tx_pkts,
rte_errno = EINVAL;
return i;
}
+   /* TSO packet cannot occupy more than
+* VMXNET3_MAX_TSO_TXD_PER_PKT TX descriptors.
+*/
+   if ((ol_flags & RTE_MBUF_F_TX_TCP_SEG) != 0 &&
+   m->nb_segs > VMXNET3_MAX_TSO_TXD_PER_PKT) {
+   rte_errno = EINVAL;
+   return i;
+   }
 
/* check that only supported TX offloads are requested. */
if ((ol_flags & VMXNET3_TX_OFFLOAD_NOTSUP_MASK) != 0 ||
@@ -444,10 +452,12 @@ vmxnet3_xmit_pkts(void *tx_queue, struct rte_mbuf 
**tx_pkts,
continue;
}
 
-   /* Drop non-TSO packet that is excessively fragmented */
-   if (unlikely(!tso && count > VMXNET3_MAX_TXD_PER_PKT)) {
-   PMD_TX_LOG(ERR, "Non-TSO packet cannot occupy more than 
%d tx "
-  "descriptors. Packet dropped.", 
VMXNET3_MAX_TXD_PER_PKT);
+   /* Drop non-TSO or TSO packet that is excessively fragmented */
+   if (unlikely((!tso && count > VMXNET3_MAX_TXD_PER_PKT) ||
+(tso && count > VMXNET3_MAX_TSO_TXD_PER_PKT))) {
+   PMD_TX_LOG(ERR, "Non-TSO or TSO packet cannot occupy 
more than "
+  "%d or %d tx descriptors respectively. 
Packet dropped.",
+  VMXNET3_MAX_TXD_PER_PKT, 
VMXNET3_MAX_TSO_TXD_PER_PKT);
txq->stats.drop_too_many_segs++;
txq->stats.drop_total++;
rte_pktmbuf_free(txm);
-- 
2.11.0



[PATCH v3 next 6/7] net/vmxnet3: avoid updating rxprod register frequently

2023-04-28 Thread Ronak Doshi
When UPT is enabled, the driver updates rxprod register to
let the device know that it has processed the received packets
and new buffers are available. However, updating it too
frequently can lead to reduced performance.

This patch adds code to avoid updating the register frequently.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 drivers/net/vmxnet3/vmxnet3_rxtx.c | 14 +-
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c 
b/drivers/net/vmxnet3/vmxnet3_rxtx.c
index 7bbae4177e..39ad0726cb 100644
--- a/drivers/net/vmxnet3/vmxnet3_rxtx.c
+++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c
@@ -1007,7 +1007,8 @@ vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf 
**rx_pkts, uint16_t nb_pkts)
 
/* It's time to renew descriptors */
vmxnet3_renew_desc(rxq, ring_idx, newm);
-   if (unlikely(rxq->shared->ctrl.updateRxProd)) {
+   if (unlikely(rxq->shared->ctrl.updateRxProd &&
+(rxq->cmd_ring[ring_idx].next2fill & 0xf) == 0)) {
VMXNET3_WRITE_BAR0_REG(hw, hw->rx_prod_offset[ring_idx] 
+
   (rxq->queue_id * 
VMXNET3_REG_ALIGN),
   
rxq->cmd_ring[ring_idx].next2fill);
@@ -1027,18 +1028,21 @@ vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf 
**rx_pkts, uint16_t nb_pkts)
 
if (unlikely(nb_rxd == 0)) {
uint32_t avail;
+   uint32_t posted = 0;
for (ring_idx = 0; ring_idx < VMXNET3_RX_CMDRING_SIZE; 
ring_idx++) {
avail = 
vmxnet3_cmd_ring_desc_avail(&rxq->cmd_ring[ring_idx]);
if (unlikely(avail > 0)) {
/* try to alloc new buf and renew descriptors */
-   vmxnet3_post_rx_bufs(rxq, ring_idx);
+   if (vmxnet3_post_rx_bufs(rxq, ring_idx) > 0)
+   posted |= (1 << ring_idx);
}
}
if (unlikely(rxq->shared->ctrl.updateRxProd)) {
for (ring_idx = 0; ring_idx < VMXNET3_RX_CMDRING_SIZE; 
ring_idx++) {
-   VMXNET3_WRITE_BAR0_REG(hw, 
hw->rx_prod_offset[ring_idx] +
-  (rxq->queue_id * 
VMXNET3_REG_ALIGN),
-  
rxq->cmd_ring[ring_idx].next2fill);
+   if (posted & (1 << ring_idx))
+   VMXNET3_WRITE_BAR0_REG(hw, 
hw->rx_prod_offset[ring_idx] +
+  (rxq->queue_id * 
VMXNET3_REG_ALIGN),
+  
rxq->cmd_ring[ring_idx].next2fill);
}
}
}
-- 
2.11.0



[PATCH v3 next 7/7] net/vmxnet3: update to version 7

2023-04-28 Thread Ronak Doshi
With all vmxnet3 version 7 changes incorporated in the vmxnet3 driver,
the driver can configure emulation to run at vmxnet3 version 7, provided
the emulation advertises support for version 7.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 doc/guides/nics/vmxnet3.rst| 30 ++
 doc/guides/rel_notes/release_23_07.rst |  6 ++
 drivers/net/vmxnet3/vmxnet3_ethdev.c   |  6 +-
 drivers/net/vmxnet3/vmxnet3_ring.h |  2 +-
 4 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/doc/guides/nics/vmxnet3.rst b/doc/guides/nics/vmxnet3.rst
index 190cf91a47..db242cd642 100644
--- a/doc/guides/nics/vmxnet3.rst
+++ b/doc/guides/nics/vmxnet3.rst
@@ -21,10 +21,6 @@ VMXNET3 Implementation in the DPDK
 
 For details on the VMXNET3 device, refer to the VMXNET3 driver's vmxnet3 
directory and support manual from VMware*.
 
-For performance details, refer to the following link from VMware:
-
-`http://www.vmware.com/pdf/vsp_4_vmxnet3_perf.pdf 
<http://www.vmware.com/pdf/vsp_4_vmxnet3_perf.pdf>`_
-
 As a PMD, the VMXNET3 driver provides the packet reception and transmission 
callbacks, vmxnet3_recv_pkts and vmxnet3_xmit_pkts.
 
 The VMXNET3 PMD handles all the packet buffer memory allocation and resides in 
guest address space
@@ -67,6 +63,32 @@ There are several options available for filtering packets at 
VMXNET3 device leve
 
 *   VLAN tag based filtering without load balancing - SUPPORTED
 
+#.  Vmxnet3 versions and associated features.
+
+Vmxnet3 version is tied to corresponding ESXi hardware version and each
+version defines a set of compatible features.
+
+* Vmxnet3 version 7, hw ver 19
+  This version adds support for Uniform Passthrough(UPT).
+
+* Vmxnet3 version 6, hw ver 17
+  This version enhanced vmxnet3 to support queues up to 32 and also
+  removed power-of-two limitations on the queues.
+
+* Vmxnet3 version 5, hw ver 15
+  Features not related to dpdk vmxnet3 PMD.
+
+* Vmxnet3 version 4, hw ver 14
+  This version adds supoprt for UDP and ESP RSS
+
+* Vmxnet3 version 3, hw ver 13
+  This version added performance enhancement features such as
+  configurable Tx data ring, Receive Data Ring, and the ability
+  to register memory regions.
+
+* Vmxnet3 version 2, hw ver 11
+  This version adds support for Large Receive offload (LRO).
+
 .. note::
 
 
diff --git a/doc/guides/rel_notes/release_23_07.rst 
b/doc/guides/rel_notes/release_23_07.rst
index a9b1293689..907a06cd62 100644
--- a/doc/guides/rel_notes/release_23_07.rst
+++ b/doc/guides/rel_notes/release_23_07.rst
@@ -55,6 +55,12 @@ New Features
  Also, make sure to start the actual text at the margin.
  ===
 
+   * **Added vmxnet3 version 7 support.**
+
+ Added support for vmxnet3 version 7 which includes support
+ for uniform passthrough(UPT). The patches also add support
+ for new capability registers, large passthru BAR and some
+ performance enhancements for UPT.
 
 Removed Items
 -
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c 
b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index b9cf007429..41073e9798 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -410,7 +410,11 @@ eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev)
/* Check h/w version compatibility with driver. */
ver = VMXNET3_READ_BAR1_REG(hw, VMXNET3_REG_VRRS);
 
-   if (ver & (1 << VMXNET3_REV_6)) {
+   if (ver & (1 << VMXNET3_REV_7)) {
+   VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_VRRS,
+  1 << VMXNET3_REV_7);
+   hw->version = VMXNET3_REV_7 + 1;
+   } else if (ver & (1 << VMXNET3_REV_6)) {
VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_VRRS,
   1 << VMXNET3_REV_6);
hw->version = VMXNET3_REV_6 + 1;
diff --git a/drivers/net/vmxnet3/vmxnet3_ring.h 
b/drivers/net/vmxnet3/vmxnet3_ring.h
index 50992349d8..948762db90 100644
--- a/drivers/net/vmxnet3/vmxnet3_ring.h
+++ b/drivers/net/vmxnet3/vmxnet3_ring.h
@@ -7,7 +7,7 @@
 
 #define VMXNET3_RX_CMDRING_SIZE 2
 
-#define VMXNET3_DRIVER_VERSION_NUM 0x01012000
+#define VMXNET3_DRIVER_VERSION_NUM 0x01013000
 
 /* Default ring size */
 #define VMXNET3_DEF_TX_RING_SIZE 512
-- 
2.11.0



[PATCH net] net/vmxnet3: fix drop of empty segments in tx

2023-05-08 Thread Ronak Doshi
When empty segments are dropped, some descriptor variable values are
updated in the segment processing loop before it is exited. This can
lead to a wedged queue where all subsequent packets are dropped for
this queue.

Also move the check for empty packet to catch the case of a zero
length packet with multiple segments.

Fixes: d863f19efa4f ("net/vmxnet3: skip empty segments in transmission")
Cc: sta...@dpdk.org
Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 drivers/net/vmxnet3/vmxnet3_rxtx.c | 33 +++--
 1 file changed, 19 insertions(+), 14 deletions(-)

diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c 
b/drivers/net/vmxnet3/vmxnet3_rxtx.c
index a875ffec07..8208cefdff 100644
--- a/drivers/net/vmxnet3/vmxnet3_rxtx.c
+++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c
@@ -412,8 +412,8 @@ vmxnet3_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
 
nb_tx = 0;
while (nb_tx < nb_pkts) {
-   Vmxnet3_GenericDesc *gdesc;
-   vmxnet3_buf_info_t *tbi;
+   Vmxnet3_GenericDesc *gdesc = NULL;
+   vmxnet3_buf_info_t *tbi = NULL;
uint32_t first2fill, avail, dw2;
struct rte_mbuf *txm = tx_pkts[nb_tx];
struct rte_mbuf *m_seg = txm;
@@ -457,18 +457,18 @@ vmxnet3_xmit_pkts(void *tx_queue, struct rte_mbuf 
**tx_pkts,
continue;
}
 
+   /* Skip empty packets */
+   if (unlikely(rte_pktmbuf_pkt_len(txm) == 0)) {
+   txq->stats.drop_total++;
+   rte_pktmbuf_free(txm);
+   nb_tx++;
+   continue;
+   }
+
if (txm->nb_segs == 1 &&
rte_pktmbuf_pkt_len(txm) <= txq->txdata_desc_size) {
struct Vmxnet3_TxDataDesc *tdd;
 
-   /* Skip empty packets */
-   if (unlikely(rte_pktmbuf_pkt_len(txm) == 0)) {
-   txq->stats.drop_total++;
-   rte_pktmbuf_free(txm);
-   nb_tx++;
-   continue;
-   }
-
tdd = (struct Vmxnet3_TxDataDesc *)
((uint8 *)txq->data_ring.base +
 txq->cmd_ring.next2fill *
@@ -481,6 +481,10 @@ vmxnet3_xmit_pkts(void *tx_queue, struct rte_mbuf 
**tx_pkts,
dw2 = (txq->cmd_ring.gen ^ 0x1) << VMXNET3_TXD_GEN_SHIFT;
first2fill = txq->cmd_ring.next2fill;
do {
+   /* Skip empty segments */
+   if (unlikely(m_seg->data_len == 0))
+   continue;
+
/* Remember the transmit buffer for cleanup */
tbi = txq->cmd_ring.buf_info + txq->cmd_ring.next2fill;
 
@@ -490,10 +494,6 @@ vmxnet3_xmit_pkts(void *tx_queue, struct rte_mbuf 
**tx_pkts,
 */
gdesc = txq->cmd_ring.base + txq->cmd_ring.next2fill;
 
-   /* Skip empty segments */
-   if (unlikely(m_seg->data_len == 0))
-   continue;
-
if (copy_size) {
uint64 offset =
(uint64)txq->cmd_ring.next2fill *
@@ -514,6 +514,11 @@ vmxnet3_xmit_pkts(void *tx_queue, struct rte_mbuf 
**tx_pkts,
/* use the right gen for non-SOP desc */
dw2 = txq->cmd_ring.gen << VMXNET3_TXD_GEN_SHIFT;
} while ((m_seg = m_seg->next) != NULL);
+   /* We must have exectuted the complete preceding loop at least
+* once without skipping an empty segment, as we can't have
+* a packet with only empty segments.
+* Thus, tbi and gdesc have been initialized.
+*/
 
/* set the last buf_info for the pkt */
tbi->m = txm;
-- 
2.11.0



[PATCH next] net/vmxnet3: add interrupt handling for reset

2023-05-08 Thread Ronak Doshi
vmxnet3 should call the reset callback when a queue is stopped
by the host. This patch also fixes a logging issue. Currently,
status of only first queue is checked and logged. But status
of all queues should be checked.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 drivers/net/vmxnet3/vmxnet3_ethdev.c | 27 ---
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c 
b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index 41073e9798..76e80e3025 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -1833,6 +1833,7 @@ vmxnet3_process_events(struct rte_eth_dev *dev)
 {
struct vmxnet3_hw *hw = dev->data->dev_private;
uint32_t events = hw->shared->ecr;
+   int i;
 
if (!events)
return;
@@ -1857,16 +1858,28 @@ vmxnet3_process_events(struct rte_eth_dev *dev)
VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD,
   VMXNET3_CMD_GET_QUEUE_STATUS);
 
-   if (hw->tqd_start->status.stopped)
-   PMD_DRV_LOG(ERR, "tq error 0x%x",
-   hw->tqd_start->status.error);
+   PMD_DRV_LOG(ERR, "queue error event 0x%x for "
+   RTE_ETHER_ADDR_PRT_FMT, events,
+   hw->perm_addr[0], hw->perm_addr[1],
+   hw->perm_addr[2], hw->perm_addr[3],
+   hw->perm_addr[4], hw->perm_addr[5]);
 
-   if (hw->rqd_start->status.stopped)
-   PMD_DRV_LOG(ERR, "rq error 0x%x",
-hw->rqd_start->status.error);
+   for (i = 0; i < hw->num_tx_queues; i++) {
+   if (hw->tqd_start[i].status.stopped)
+   PMD_DRV_LOG(ERR, "tq %d error 0x%x",
+   i, hw->tqd_start[i].status.error);
+   }
+   for (i = 0; i < hw->num_rx_queues; i++) {
+   if (hw->rqd_start[i].status.stopped)
+   PMD_DRV_LOG(ERR, "rq %d error 0x%x",
+   i, hw->rqd_start[i].status.error);
+   }
 
-   /* Reset the device */
/* Have to reset the device */
+   /* Notify the application so that it can reset the device */
+   rte_eth_dev_callback_process(dev,
+RTE_ETH_EVENT_INTR_RESET,
+NULL);
}
 
if (events & VMXNET3_ECR_DIC)
-- 
2.11.0



[PATCH net v2] net/vmxnet3: fix drop of empty segments in tx

2023-05-08 Thread Ronak Doshi
When empty segments are dropped, some descriptor variable values are
updated in the segment processing loop before it is exited. This can
lead to a wedged queue where all subsequent packets are dropped for
this queue.

Also move the check for empty packet to catch the case of a zero
length packet with multiple segments.

Fixes: d863f19efa4f ("net/vmxnet3: skip empty segments in transmission")
Cc: sta...@dpdk.org
Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
--
Change log
v2: fixed typo
---
 drivers/net/vmxnet3/vmxnet3_rxtx.c | 33 +++--
 1 file changed, 19 insertions(+), 14 deletions(-)

diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c 
b/drivers/net/vmxnet3/vmxnet3_rxtx.c
index a875ffec07..f4cade0954 100644
--- a/drivers/net/vmxnet3/vmxnet3_rxtx.c
+++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c
@@ -412,8 +412,8 @@ vmxnet3_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
 
nb_tx = 0;
while (nb_tx < nb_pkts) {
-   Vmxnet3_GenericDesc *gdesc;
-   vmxnet3_buf_info_t *tbi;
+   Vmxnet3_GenericDesc *gdesc = NULL;
+   vmxnet3_buf_info_t *tbi = NULL;
uint32_t first2fill, avail, dw2;
struct rte_mbuf *txm = tx_pkts[nb_tx];
struct rte_mbuf *m_seg = txm;
@@ -457,18 +457,18 @@ vmxnet3_xmit_pkts(void *tx_queue, struct rte_mbuf 
**tx_pkts,
continue;
}
 
+   /* Skip empty packets */
+   if (unlikely(rte_pktmbuf_pkt_len(txm) == 0)) {
+   txq->stats.drop_total++;
+   rte_pktmbuf_free(txm);
+   nb_tx++;
+   continue;
+   }
+
if (txm->nb_segs == 1 &&
rte_pktmbuf_pkt_len(txm) <= txq->txdata_desc_size) {
struct Vmxnet3_TxDataDesc *tdd;
 
-   /* Skip empty packets */
-   if (unlikely(rte_pktmbuf_pkt_len(txm) == 0)) {
-   txq->stats.drop_total++;
-   rte_pktmbuf_free(txm);
-   nb_tx++;
-   continue;
-   }
-
tdd = (struct Vmxnet3_TxDataDesc *)
((uint8 *)txq->data_ring.base +
 txq->cmd_ring.next2fill *
@@ -481,6 +481,10 @@ vmxnet3_xmit_pkts(void *tx_queue, struct rte_mbuf 
**tx_pkts,
dw2 = (txq->cmd_ring.gen ^ 0x1) << VMXNET3_TXD_GEN_SHIFT;
first2fill = txq->cmd_ring.next2fill;
do {
+   /* Skip empty segments */
+   if (unlikely(m_seg->data_len == 0))
+   continue;
+
/* Remember the transmit buffer for cleanup */
tbi = txq->cmd_ring.buf_info + txq->cmd_ring.next2fill;
 
@@ -490,10 +494,6 @@ vmxnet3_xmit_pkts(void *tx_queue, struct rte_mbuf 
**tx_pkts,
 */
gdesc = txq->cmd_ring.base + txq->cmd_ring.next2fill;
 
-   /* Skip empty segments */
-   if (unlikely(m_seg->data_len == 0))
-   continue;
-
if (copy_size) {
uint64 offset =
(uint64)txq->cmd_ring.next2fill *
@@ -514,6 +514,11 @@ vmxnet3_xmit_pkts(void *tx_queue, struct rte_mbuf 
**tx_pkts,
/* use the right gen for non-SOP desc */
dw2 = txq->cmd_ring.gen << VMXNET3_TXD_GEN_SHIFT;
} while ((m_seg = m_seg->next) != NULL);
+   /* We must have executed the complete preceding loop at least
+* once without skipping an empty segment, as we can't have
+* a packet with only empty segments.
+* Thus, tbi and gdesc have been initialized.
+*/
 
/* set the last buf_info for the pkt */
tbi->m = txm;
-- 
2.11.0



Re: [PATCH v2] net/vmxnet3: fix a missing vmxnet3 register command

2024-04-22 Thread Ronak Doshi
Basically it will just provide incorrect information. With the enum being
misaligned due to missing command, GET_DCR0_REG and GET_MAX_CAPABILITIES
will just lead to incorrect commands being issued.

Thanks,
Ronak


On Fri, Apr 19, 2024 at 1:35 AM Ferruh Yigit  wrote:

> On 4/18/2024 7:36 AM, Ronak Doshi wrote:
> > Vmxnet3 uses capability registers to advertise the supported
> > capabilities of UPT device. It uses DCR0_REG command register
> > for this purpose. However, the register command enum misses
> > one command which technically is not used by dpdk vmxnet3
> > driver yet. This can cause issue for commands added later.
> >
> > This patch fixes this issue by adding a reserved
> > command in its place.
> >
> > Fixes: 5241d61bd865 ("net/vmxnet3: support capability registers")
> > Cc: sta...@dpdk.org
> >
> > Signed-off-by: Ronak Doshi 
> > --
> > Change log
> > v2: fixed typo
> > ---
> >  drivers/net/vmxnet3/base/vmxnet3_defs.h | 1 +
> >  1 file changed, 1 insertion(+)
> >
> > diff --git a/drivers/net/vmxnet3/base/vmxnet3_defs.h
> b/drivers/net/vmxnet3/base/vmxnet3_defs.h
> > index 24c235876e..a6bb281d8d 100644
> > --- a/drivers/net/vmxnet3/base/vmxnet3_defs.h
> > +++ b/drivers/net/vmxnet3/base/vmxnet3_defs.h
> > @@ -126,6 +126,7 @@ typedef enum {
> > VMXNET3_CMD_RESERVED7,
> > VMXNET3_CMD_RESERVED8,
> > VMXNET3_CMD_GET_MAX_QUEUES_CONF,
> > +   VMXNET3_CMD_RESERVED11,
> > VMXNET3_CMD_GET_MAX_CAPABILITIES,
> > VMXNET3_CMD_GET_DCR0_REG,
> >  } Vmxnet3_Cmd;
>
> Hi Ronak,
>
> Thank you for the patch.
>
> What is the fixed from user perspective, what is the impact.
>
> I can see two commands effected from missing enum, they are GET_DCR0_REG
> & GET_MAX_CAPABILITIES.
> Was user not able to read capabilities, or get random capabilities, from
> device up until now?
> If so what were these capabilities and how user impacted from missing them?
> Can you please detail the impact more in the commit log?
>
>
>

-- 
This electronic communication and the information and any files transmitted 
with it, or attached to it, are confidential and are intended solely for 
the use of the individual or entity to whom it is addressed and may contain 
information that is confidential, legally privileged, protected by privacy 
laws, or otherwise restricted from disclosure to anyone else. If you are 
not the intended recipient or the person responsible for delivering the 
e-mail to the intended recipient, you are hereby notified that any use, 
copying, distributing, dissemination, forwarding, printing, or copying of 
this e-mail is strictly prohibited. If you received this e-mail in error, 
please return the e-mail to the sender, delete it from your computer, and 
destroy any printed copy of it.


[PATCH v3] net/vmxnet3: fix a missing vmxnet3 register command

2024-04-22 Thread Ronak Doshi
Vmxnet3 uses capability registers to advertise the supported
capabilities of UPT device. It uses DCR0_REG command register
for this purpose. However, the register command enum misses
one command which technically is not used by dpdk vmxnet3
driver yet. This can cause issue for commands added later.
For example, DCR0_REG and MAX_CAPABILITIES register commands
when issued will lead to incorrect command being executed in
the hypervisor. The return values can be unexpected and can
result in some capabilities being disabled and affect vnics
requesting Uniform Passthroguh (UPT) mode.

This patch fixes this issue by adding a reserved
command in its place.

Fixes: 5241d61bd865 ("net/vmxnet3: support capability registers")
Cc: sta...@dpdk.org

Signed-off-by: Ronak Doshi 
--
Change log
 v2: fixed typo
 v3: updated commit message with more information
---
 drivers/net/vmxnet3/base/vmxnet3_defs.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/vmxnet3/base/vmxnet3_defs.h 
b/drivers/net/vmxnet3/base/vmxnet3_defs.h
index 24c235876e..a6bb281d8d 100644
--- a/drivers/net/vmxnet3/base/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/base/vmxnet3_defs.h
@@ -126,6 +126,7 @@ typedef enum {
VMXNET3_CMD_RESERVED7,
VMXNET3_CMD_RESERVED8,
VMXNET3_CMD_GET_MAX_QUEUES_CONF,
+   VMXNET3_CMD_RESERVED11,
VMXNET3_CMD_GET_MAX_CAPABILITIES,
VMXNET3_CMD_GET_DCR0_REG,
 } Vmxnet3_Cmd;
-- 
2.11.0



[PATCH] net/vmxnet3: fix a missing vmxnet3 register command

2024-04-17 Thread Ronak Doshi
Vmxnet3 uses capability registers to advertize the supported
capabilities of UPT device. It uses DCR0_REG command register
for this purpose. However, the register command enum misses
one command which technically is not used by dpdk vmxnet3
driver yet. This can cause issue for commands added later.

This patch fixes this issue by adding a reserved
command in its place.

Fixes: 5241d61bd865 ("net/vmxnet3: support capability registers")
Cc: sta...@dpdk.org

Signed-off-by: Ronak Doshi 
---
 drivers/net/vmxnet3/base/vmxnet3_defs.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/vmxnet3/base/vmxnet3_defs.h 
b/drivers/net/vmxnet3/base/vmxnet3_defs.h
index 24c235876e..a6bb281d8d 100644
--- a/drivers/net/vmxnet3/base/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/base/vmxnet3_defs.h
@@ -126,6 +126,7 @@ typedef enum {
VMXNET3_CMD_RESERVED7,
VMXNET3_CMD_RESERVED8,
VMXNET3_CMD_GET_MAX_QUEUES_CONF,
+   VMXNET3_CMD_RESERVED11,
VMXNET3_CMD_GET_MAX_CAPABILITIES,
VMXNET3_CMD_GET_DCR0_REG,
 } Vmxnet3_Cmd;
-- 
2.11.0



[PATCH v2] net/vmxnet3: fix a missing vmxnet3 register command

2024-04-17 Thread Ronak Doshi
Vmxnet3 uses capability registers to advertise the supported
capabilities of UPT device. It uses DCR0_REG command register
for this purpose. However, the register command enum misses
one command which technically is not used by dpdk vmxnet3
driver yet. This can cause issue for commands added later.

This patch fixes this issue by adding a reserved
command in its place.

Fixes: 5241d61bd865 ("net/vmxnet3: support capability registers")
Cc: sta...@dpdk.org

Signed-off-by: Ronak Doshi 
--
Change log
v2: fixed typo
---
 drivers/net/vmxnet3/base/vmxnet3_defs.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/vmxnet3/base/vmxnet3_defs.h 
b/drivers/net/vmxnet3/base/vmxnet3_defs.h
index 24c235876e..a6bb281d8d 100644
--- a/drivers/net/vmxnet3/base/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/base/vmxnet3_defs.h
@@ -126,6 +126,7 @@ typedef enum {
VMXNET3_CMD_RESERVED7,
VMXNET3_CMD_RESERVED8,
VMXNET3_CMD_GET_MAX_QUEUES_CONF,
+   VMXNET3_CMD_RESERVED11,
VMXNET3_CMD_GET_MAX_CAPABILITIES,
VMXNET3_CMD_GET_DCR0_REG,
 } Vmxnet3_Cmd;
-- 
2.11.0



[PATCH next 0/7] vmxnet3: upgrade to version 7

2023-04-17 Thread Ronak Doshi
vmxnet3 emulation has recently added several new features including
support for uniform passthrough(UPT). To make UPT work vmxnet3 has
to be enhanced as per the new specification. 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 7.
- 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 7 comparison
  and updates Copyright information.

Patch 2:
  This patch adds new capability registers to fine control enablement of
  individual features based on emulation and passthrough.

Patch 3:
  This patch adds support for large passthrough BAR register.

Patch 4:
  This patch introduces new command to set ring buffer sizes to pass this
  information to the hardware.

Patch 5:
  For better performance, hardware has a requirement to limit number of TSO
  descriptors. This patch adds that support.

Patch 6:
  Avoid updating rxprod register when in UPT for performance reasons.

Patch 7:
  With all vmxnet3 version 7 changes incorporated in the vmxnet3 driver,
  with this patch, the driver can configure emulation to run at vmxnet3
  version 7.

Ronak Doshi (7):
  vmxnet3: prepare for version 7 changes
  vmxnet3: add support for capability registers
  vmxnet3: add support for large passthrough BAR register
  vmxnet3: add command to set ring buffer sizes
  vmxnet3: limit number of TXDs used for TSO packet
  vmxnet3: avoid updating rxprod register frequently
  vmxnet3: update to version 7

 drivers/net/vmxnet3/base/vmxnet3_defs.h |  74 +++---
 drivers/net/vmxnet3/vmxnet3_ethdev.c| 106 +++-
 drivers/net/vmxnet3/vmxnet3_ethdev.h|  16 +
 drivers/net/vmxnet3/vmxnet3_ring.h  |   2 +-
 drivers/net/vmxnet3/vmxnet3_rxtx.c  |  48 +++
 lib/ethdev/rte_ethdev.h |   2 +
 6 files changed, 226 insertions(+), 22 deletions(-)

-- 
2.11.0



[PATCH next 2/7] vmxnet3: add support for capability registers

2023-04-17 Thread Ronak Doshi
This patch enhances vmxnet3 to suuport capability registers which
allows it to enable features selectively. The DCR register tracks
the capabilities vmxnet3 device supports. The PTCR register states
the capabilities that the passthrough device supports.

With the help of these registers, vmxnet3 can enable only those
features which the passthrough device supoprts. This allows
smooth trasition to Uniform-Passthrough (UPT) mode if the virtual
nic requests it. If PTCR register returns nothing or error it means
UPT is not being requested and vnic will continue in emulation mode.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 drivers/net/vmxnet3/base/vmxnet3_defs.h | 44 +---
 drivers/net/vmxnet3/vmxnet3_ethdev.c| 71 +
 drivers/net/vmxnet3/vmxnet3_ethdev.h| 11 +
 lib/ethdev/rte_ethdev.h |  2 +
 4 files changed, 123 insertions(+), 5 deletions(-)

diff --git a/drivers/net/vmxnet3/base/vmxnet3_defs.h 
b/drivers/net/vmxnet3/base/vmxnet3_defs.h
index bd6695e69d..759fdb6e4a 100644
--- a/drivers/net/vmxnet3/base/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/base/vmxnet3_defs.h
@@ -26,6 +26,12 @@
 #define VMXNET3_REG_MACH  0x30   /* MAC Address High */
 #define VMXNET3_REG_ICR   0x38   /* Interrupt Cause Register */
 #define VMXNET3_REG_ECR   0x40   /* Event Cause Register */
+#define VMXNET3_REG_DCR   0x48   /* Device capability register,
+ * from 0x48 to 0x80
+ */
+#define VMXNET3_REG_PTCR  0x88   /* Passthru capbility register
+ * from 0x88 to 0xb0
+ */
 
 #define VMXNET3_REG_WSAL  0xF00  /* Wireless Shared Address Lo  */
 #define VMXNET3_REG_WSAH  0xF08  /* Wireless Shared Address Hi  */
@@ -103,11 +109,13 @@ typedef enum {
VMXNET3_CMD_GET_CONF_INTR,
VMXNET3_CMD_GET_ADAPTIVE_RING_INFO,
VMXNET3_CMD_GET_TXDATA_DESC_SIZE,
-   VMXNET3_CMD_RESERVED5,
-   VMXNET3_CMD_RESERVED6,
-   VMXNET3_CMD_RESERVED7,
-   VMXNET3_CMD_RESERVED8,
-   VMXNET3_CMD_GET_MAX_QUEUES_CONF,
+   VMXNET3_CMD_RESERVED5,
+   VMXNET3_CMD_RESERVED6,
+   VMXNET3_CMD_RESERVED7,
+   VMXNET3_CMD_RESERVED8,
+   VMXNET3_CMD_GET_MAX_QUEUES_CONF,
+   VMXNET3_CMD_GET_MAX_CAPABILITIES,
+   VMXNET3_CMD_GET_DCR0_REG,
 } Vmxnet3_Cmd;
 
 /* Adaptive Ring Info Flags */
@@ -877,4 +885,30 @@ do {\
 
 #define VMXNET3_DID_PASSTHRU0x
 
+#define VMXNET3_DCR_ERROR  31   /* error when bit 31 
of DCR is set */
+#define VMXNET3_CAP_UDP_RSS0/* bit 0 of DCR 0 */
+#define VMXNET3_CAP_ESP_RSS_IPV4   1/* bit 1 of DCR 0 */
+#define VMXNET3_CAP_GENEVE_CHECKSUM_OFFLOAD2/* bit 2 of DCR 0 */
+#define VMXNET3_CAP_GENEVE_TSO 3/* bit 3 of DCR 0 */
+#define VMXNET3_CAP_VXLAN_CHECKSUM_OFFLOAD 4/* bit 4 of DCR 0 */
+#define VMXNET3_CAP_VXLAN_TSO  5/* bit 5 of DCR 0 */
+#define VMXNET3_CAP_GENEVE_OUTER_CHECKSUM_OFFLOAD  6/* bit 6 of DCR 0 */
+#define VMXNET3_CAP_VXLAN_OUTER_CHECKSUM_OFFLOAD   7/* bit 7 of DCR 0 */
+#define VMXNET3_CAP_PKT_STEERING_IPV4  8/* bit 8 of DCR 0 */
+#define VMXNET3_CAP_VERSION_4_MAX  
VMXNET3_CAP_PKT_STEERING_IPV4
+#define VMXNET3_CAP_ESP_RSS_IPV6   9/* bit 9 of DCR 0 */
+#define VMXNET3_CAP_VERSION_5_MAX  VMXNET3_CAP_ESP_RSS_IPV6
+#define VMXNET3_CAP_ESP_OVER_UDP_RSS   10   /* bit 10 of DCR 0 */
+#define VMXNET3_CAP_INNER_RSS  11   /* bit 11 of DCR 0 */
+#define VMXNET3_CAP_INNER_ESP_RSS  12   /* bit 12 of DCR 0 */
+#define VMXNET3_CAP_CRC32_HASH_FUNC13   /* bit 13 of DCR 0 */
+#define VMXNET3_CAP_VERSION_6_MAX  VMXNET3_CAP_CRC32_HASH_FUNC
+#define VMXNET3_CAP_OAM_FILTER 14   /* bit 14 of DCR 0 */
+#define VMXNET3_CAP_ESP_QS 15   /* bit 15 of DCR 0 */
+#define VMXNET3_CAP_LARGE_BAR  16   /* bit 16 of DCR 0 */
+#define VMXNET3_CAP_OOORX_COMP 17   /* bit 17 of DCR 0 */
+#define VMXNET3_CAP_VERSION_7_MAX  18
+/* when new capability is introduced, update VMXNET3_CAP_MAX */
+#define VMXNET3_CAP_MAXVMXNET3_CAP_VERSION_7_MAX
+
 #endif /* _VMXNET3_DEFS_H_ */
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c 
b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index fd946dec5c..8d656ffaf8 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -299,6 +299,61 @@ eth_vmxnet3_txdata_get(struct vmxnet3_hw *hw)
sizeof(struct Vmxnet3_TxDataDesc) : txdata_desc_size;
 }
 
+static int
+eth_vmxnet3_setup_capabilities(struct vmxnet3_hw *hw,
+  struct rte_eth_dev *eth_dev)
+{
+   uint32_t dcr, ptcr, value;
+   struct rte_pci_device *pci_dev

[PATCH next 4/7] vmxnet3: add command to set ring buffer sizes

2023-04-17 Thread Ronak Doshi
This patch adds a new command to set ring buffer sizes. This is
required to pass the buffer size information to passthrough devices.
Also, ring sizes are round down to power of 2.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 drivers/net/vmxnet3/base/vmxnet3_defs.h | 15 +++
 drivers/net/vmxnet3/vmxnet3_ethdev.c| 18 ++
 drivers/net/vmxnet3/vmxnet3_ethdev.h|  1 +
 drivers/net/vmxnet3/vmxnet3_rxtx.c  |  7 +++
 4 files changed, 41 insertions(+)

diff --git a/drivers/net/vmxnet3/base/vmxnet3_defs.h 
b/drivers/net/vmxnet3/base/vmxnet3_defs.h
index 27f35a0062..d8cc295b08 100644
--- a/drivers/net/vmxnet3/base/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/base/vmxnet3_defs.h
@@ -105,6 +105,9 @@ typedef enum {
VMXNET3_CMD_RESERVED4,
VMXNET3_CMD_REGISTER_MEMREGS,
VMXNET3_CMD_SET_RSS_FIELDS,
+   VMXNET3_CMD_RESERVED9,
+   VMXNET3_CMD_RESERVED10,
+   VMXNET3_CMD_SET_RING_BUFFER_SIZE,
 
VMXNET3_CMD_FIRST_GET = 0xF00D,
VMXNET3_CMD_GET_QUEUE_STATUS = VMXNET3_CMD_FIRST_GET,
@@ -822,6 +825,17 @@ typedef enum Vmxnet3_RSSField {
VMXNET3_RSS_FIELDS_ESPIP6 = 0x0020,
 } Vmxnet3_RSSField;
 
+typedef
+#include "vmware_pack_begin.h"
+struct Vmxnet3_RingBufferSize {
+   __le16  ring1BufSizeType0;
+   __le16  ring1BufSizeType1;
+   __le16  ring2BufSizeType1;
+   __le16  pad;
+}
+#include "vmware_pack_end.h"
+Vmxnet3_RingBufferSize;
+
 /*
  * If the command data <= 16 bytes, use the shared memory direcly.
  * Otherwise, use the variable length configuration descriptor.
@@ -832,6 +846,7 @@ union Vmxnet3_CmdInfo {
Vmxnet3_VariableLenConfDesc varConf;
Vmxnet3_SetPolling  setPolling;
Vmxnet3_RSSFieldsetRSSFields;
+   Vmxnet3_RingBufferSize  ringBufSize;
__le16  reserved[2];
__le64  data[2];
 }
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c 
b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index a04a16a3e0..72ccd0f7fc 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -1018,6 +1018,22 @@ vmxnet3_setup_driver_shared(struct rte_eth_dev *dev)
return VMXNET3_SUCCESS;
 }
 
+static void
+vmxnet3_init_bufsize(struct vmxnet3_hw *hw)
+{
+   struct Vmxnet3_DriverShared *shared = hw->shared;
+   union Vmxnet3_CmdInfo *cmd_info = &shared->cu.cmdInfo;
+
+   if (!VMXNET3_VERSION_GE_7(hw))
+   return;
+
+   cmd_info->ringBufSize.ring1BufSizeType0 = hw->rxdata_buf_size;
+   cmd_info->ringBufSize.ring1BufSizeType1 = 0;
+   cmd_info->ringBufSize.ring2BufSizeType1 = hw->rxdata_buf_size;
+   VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD,
+  VMXNET3_CMD_SET_RING_BUFFER_SIZE);
+}
+
 /*
  * Configure device link speed and setup link.
  * Must be called after eth_vmxnet3_dev_init. Other wise it might fail
@@ -1101,6 +1117,8 @@ vmxnet3_dev_start(struct rte_eth_dev *dev)
return ret;
}
 
+   vmxnet3_init_bufsize(hw);
+
hw->adapter_stopped = FALSE;
 
/* Setting proper Rx Mode and issue Rx Mode Update command */
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.h 
b/drivers/net/vmxnet3/vmxnet3_ethdev.h
index cabd83e7e1..2b3e2c4caa 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.h
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.h
@@ -96,6 +96,7 @@ struct vmxnet3_hw {
 
uint16_t txdata_desc_size; /* tx data ring buffer size */
uint16_t rxdata_desc_size; /* rx data ring buffer size */
+   uint16_t rxdata_buf_size; /* rx data buffer size */
 
uint8_t num_intrs;
 
diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c 
b/drivers/net/vmxnet3/vmxnet3_rxtx.c
index 83daac02c4..e31878ecab 100644
--- a/drivers/net/vmxnet3/vmxnet3_rxtx.c
+++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c
@@ -1113,6 +1113,8 @@ vmxnet3_dev_tx_queue_setup(struct rte_eth_dev *dev,
return -EINVAL;
} else {
ring->size = nb_desc;
+   if (VMXNET3_VERSION_GE_7(hw))
+   ring->size = rte_align32prevpow2(nb_desc);
ring->size &= ~VMXNET3_RING_SIZE_MASK;
}
comp_ring->size = data_ring->size = ring->size;
@@ -1193,6 +1195,9 @@ vmxnet3_dev_rx_queue_setup(struct rte_eth_dev *dev,
}
 
rxq->mp = mp;
+   /* Remember buffer size for initialization in dev start. */
+   hw->rxdata_buf_size =
+   rte_pktmbuf_data_room_size(mp) - RTE_PKTMBUF_HEADROOM;
rxq->queue_id = queue_idx;
rxq->port_id = dev->data->port_id;
rxq->shared = NULL; /* set in vmxnet3_setup_driver_shared() */
@@ -1217,6 +1222,8 @@ vmxnet3_dev_rx_queue_setup(struct rte_eth_dev *dev,
return -EINVAL;
} else {
ring0->size = nb_desc;
+   if (VMXNET3_VERSION_GE_7(hw))
+   r

[PATCH next 5/7] vmxnet3: limit number of TXDs used for TSO packet

2023-04-17 Thread Ronak Doshi
Currently, vmxnet3 does not have a limit on number of descriptors
used for a TSO packet. However, with UPT, for hardware performance
reasons, this patch limits the number of transmit descriptors to 24
for a TSO packet.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 drivers/net/vmxnet3/base/vmxnet3_defs.h |  2 ++
 drivers/net/vmxnet3/vmxnet3_rxtx.c  | 18 ++
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/drivers/net/vmxnet3/base/vmxnet3_defs.h 
b/drivers/net/vmxnet3/base/vmxnet3_defs.h
index d8cc295b08..24c235876e 100644
--- a/drivers/net/vmxnet3/base/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/base/vmxnet3_defs.h
@@ -419,6 +419,8 @@ typedef union Vmxnet3_GenericDesc {
 
 /* max # of tx descs for a non-tso pkt */
 #define VMXNET3_MAX_TXD_PER_PKT 16
+/* max # of tx descs for a tso pkt */
+#define VMXNET3_MAX_TSO_TXD_PER_PKT 24
 
 /* Max size of a single rx buffer */
 #define VMXNET3_MAX_RX_BUF_SIZE  ((1 << 14) - 1)
diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c 
b/drivers/net/vmxnet3/vmxnet3_rxtx.c
index e31878ecab..7bbae4177e 100644
--- a/drivers/net/vmxnet3/vmxnet3_rxtx.c
+++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c
@@ -364,6 +364,14 @@ vmxnet3_prep_pkts(__rte_unused void *tx_queue, struct 
rte_mbuf **tx_pkts,
rte_errno = EINVAL;
return i;
}
+   /* TSO packet cannot occupy more than
+* VMXNET3_MAX_TSO_TXD_PER_PKT TX descriptors.
+*/
+   if ((ol_flags & RTE_MBUF_F_TX_TCP_SEG) != 0 &&
+   m->nb_segs > VMXNET3_MAX_TSO_TXD_PER_PKT) {
+   rte_errno = EINVAL;
+   return i;
+   }
 
/* check that only supported TX offloads are requested. */
if ((ol_flags & VMXNET3_TX_OFFLOAD_NOTSUP_MASK) != 0 ||
@@ -444,10 +452,12 @@ vmxnet3_xmit_pkts(void *tx_queue, struct rte_mbuf 
**tx_pkts,
continue;
}
 
-   /* Drop non-TSO packet that is excessively fragmented */
-   if (unlikely(!tso && count > VMXNET3_MAX_TXD_PER_PKT)) {
-   PMD_TX_LOG(ERR, "Non-TSO packet cannot occupy more than 
%d tx "
-  "descriptors. Packet dropped.", 
VMXNET3_MAX_TXD_PER_PKT);
+   /* Drop non-TSO or TSO packet that is excessively fragmented */
+   if (unlikely((!tso && count > VMXNET3_MAX_TXD_PER_PKT) ||
+(tso && count > VMXNET3_MAX_TSO_TXD_PER_PKT))) {
+   PMD_TX_LOG(ERR, "Non-TSO or TSO packet cannot occupy 
more than "
+  "%d or %d tx descriptors respectively. 
Packet dropped.",
+  VMXNET3_MAX_TXD_PER_PKT, 
VMXNET3_MAX_TSO_TXD_PER_PKT);
txq->stats.drop_too_many_segs++;
txq->stats.drop_total++;
rte_pktmbuf_free(txm);
-- 
2.11.0



[PATCH next 6/7] vmxnet3: avoid updating rxprod register frequently

2023-04-17 Thread Ronak Doshi
When UPT is enabled, the driver updates rxprod register to
let the device know that it has processed the received packets
and new buffers are available. However, updating it too
frequently can lead to reduced performance.

This patch adds code to avoid updating the register frequently.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 drivers/net/vmxnet3/vmxnet3_rxtx.c | 14 +-
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c 
b/drivers/net/vmxnet3/vmxnet3_rxtx.c
index 7bbae4177e..39ad0726cb 100644
--- a/drivers/net/vmxnet3/vmxnet3_rxtx.c
+++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c
@@ -1007,7 +1007,8 @@ vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf 
**rx_pkts, uint16_t nb_pkts)
 
/* It's time to renew descriptors */
vmxnet3_renew_desc(rxq, ring_idx, newm);
-   if (unlikely(rxq->shared->ctrl.updateRxProd)) {
+   if (unlikely(rxq->shared->ctrl.updateRxProd &&
+(rxq->cmd_ring[ring_idx].next2fill & 0xf) == 0)) {
VMXNET3_WRITE_BAR0_REG(hw, hw->rx_prod_offset[ring_idx] 
+
   (rxq->queue_id * 
VMXNET3_REG_ALIGN),
   
rxq->cmd_ring[ring_idx].next2fill);
@@ -1027,18 +1028,21 @@ vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf 
**rx_pkts, uint16_t nb_pkts)
 
if (unlikely(nb_rxd == 0)) {
uint32_t avail;
+   uint32_t posted = 0;
for (ring_idx = 0; ring_idx < VMXNET3_RX_CMDRING_SIZE; 
ring_idx++) {
avail = 
vmxnet3_cmd_ring_desc_avail(&rxq->cmd_ring[ring_idx]);
if (unlikely(avail > 0)) {
/* try to alloc new buf and renew descriptors */
-   vmxnet3_post_rx_bufs(rxq, ring_idx);
+   if (vmxnet3_post_rx_bufs(rxq, ring_idx) > 0)
+   posted |= (1 << ring_idx);
}
}
if (unlikely(rxq->shared->ctrl.updateRxProd)) {
for (ring_idx = 0; ring_idx < VMXNET3_RX_CMDRING_SIZE; 
ring_idx++) {
-   VMXNET3_WRITE_BAR0_REG(hw, 
hw->rx_prod_offset[ring_idx] +
-  (rxq->queue_id * 
VMXNET3_REG_ALIGN),
-  
rxq->cmd_ring[ring_idx].next2fill);
+   if (posted & (1 << ring_idx))
+   VMXNET3_WRITE_BAR0_REG(hw, 
hw->rx_prod_offset[ring_idx] +
+  (rxq->queue_id * 
VMXNET3_REG_ALIGN),
+  
rxq->cmd_ring[ring_idx].next2fill);
}
}
}
-- 
2.11.0



[PATCH next 7/7] vmxnet3: update to version 7

2023-04-17 Thread Ronak Doshi
With all vmxnet3 version 7 changes incorporated in the vmxnet3 driver,
the driver can configure emulation to run at vmxnet3 version 7, provided
the emulation advertises support for version 7.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 drivers/net/vmxnet3/vmxnet3_ethdev.c | 6 +-
 drivers/net/vmxnet3/vmxnet3_ring.h   | 2 +-
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c 
b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index 72ccd0f7fc..a9250f8206 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -410,7 +410,11 @@ eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev)
/* Check h/w version compatibility with driver. */
ver = VMXNET3_READ_BAR1_REG(hw, VMXNET3_REG_VRRS);
 
-   if (ver & (1 << VMXNET3_REV_6)) {
+   if (ver & (1 << VMXNET3_REV_7)) {
+   VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_VRRS,
+  1 << VMXNET3_REV_7);
+   hw->version = VMXNET3_REV_7 + 1;
+   } else if (ver & (1 << VMXNET3_REV_6)) {
VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_VRRS,
   1 << VMXNET3_REV_6);
hw->version = VMXNET3_REV_6 + 1;
diff --git a/drivers/net/vmxnet3/vmxnet3_ring.h 
b/drivers/net/vmxnet3/vmxnet3_ring.h
index 50992349d8..948762db90 100644
--- a/drivers/net/vmxnet3/vmxnet3_ring.h
+++ b/drivers/net/vmxnet3/vmxnet3_ring.h
@@ -7,7 +7,7 @@
 
 #define VMXNET3_RX_CMDRING_SIZE 2
 
-#define VMXNET3_DRIVER_VERSION_NUM 0x01012000
+#define VMXNET3_DRIVER_VERSION_NUM 0x01013000
 
 /* Default ring size */
 #define VMXNET3_DEF_TX_RING_SIZE 512
-- 
2.11.0



[PATCH next 1/7] vmxnet3: prepare for version 7 changes

2023-04-17 Thread Ronak Doshi
vmxnet3 is currently at version 6 and this patch initiates the
preparation to accommodate changes for upto version 7. Introduced
utility macros for vmxnet3 version 7 comparison.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 drivers/net/vmxnet3/vmxnet3_ethdev.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.h 
b/drivers/net/vmxnet3/vmxnet3_ethdev.h
index 5a303717b1..fc976707fd 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.h
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.h
@@ -124,6 +124,7 @@ struct vmxnet3_hw {
UPT1_RxStats  snapshot_rx_stats[VMXNET3_MAX_RX_QUEUES];
 };
 
+#define VMXNET3_REV_7  6   /* Vmxnet3 Rev. 7 */
 #define VMXNET3_REV_6  5   /* Vmxnet3 Rev. 6 */
 #define VMXNET3_REV_5  4   /* Vmxnet3 Rev. 5 */
 #define VMXNET3_REV_4  3   /* Vmxnet3 Rev. 4 */
@@ -131,6 +132,7 @@ struct vmxnet3_hw {
 #define VMXNET3_REV_2  1   /* Vmxnet3 Rev. 2 */
 #define VMXNET3_REV_1  0   /* Vmxnet3 Rev. 1 */
 
+#define VMXNET3_VERSION_GE_7(hw) ((hw)->version >= VMXNET3_REV_7 + 1)
 #define VMXNET3_VERSION_GE_6(hw) ((hw)->version >= VMXNET3_REV_6 + 1)
 #define VMXNET3_VERSION_GE_5(hw) ((hw)->version >= VMXNET3_REV_5 + 1)
 #define VMXNET3_VERSION_GE_4(hw) ((hw)->version >= VMXNET3_REV_4 + 1)
-- 
2.11.0



[PATCH next 3/7] vmxnet3: add support for large passthrough BAR register

2023-04-17 Thread Ronak Doshi
For vmxnet3 to work in UPT mode, the BAR sizes have been increased.
The PT page has been extended to 2 pages and also includes OOB pages
as a part of PT BAR. This patch enhances vmxnet3 to use appropriate
BAR offsets based on the capability registered. To use new offsets,
VMXNET3_CAP_LARGE_BAR needs to be set by the device. If it is not set
then the device will use legacy PT page layout.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 drivers/net/vmxnet3/base/vmxnet3_defs.h | 13 +++--
 drivers/net/vmxnet3/vmxnet3_ethdev.c| 11 +++
 drivers/net/vmxnet3/vmxnet3_ethdev.h|  2 ++
 drivers/net/vmxnet3/vmxnet3_rxtx.c  | 13 +++--
 4 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/drivers/net/vmxnet3/base/vmxnet3_defs.h 
b/drivers/net/vmxnet3/base/vmxnet3_defs.h
index 759fdb6e4a..27f35a0062 100644
--- a/drivers/net/vmxnet3/base/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/base/vmxnet3_defs.h
@@ -43,8 +43,16 @@
 #define VMXNET3_REG_RXPROD   0x800 /* Rx Producer Index for ring 1 */
 #define VMXNET3_REG_RXPROD2  0xA00 /* Rx Producer Index for ring 2 */
 
-#define VMXNET3_PT_REG_SIZE 4096/* BAR 0 */
-#define VMXNET3_VD_REG_SIZE 4096/* BAR 1 */
+/* For Large PT BAR, the following offset to DB register */
+#define VMXNET3_REG_LB_TXPROD   0x1000 /* Tx Producer Index */
+#define VMXNET3_REG_LB_RXPROD   0x1400 /* Rx Producer Index for ring 1 */
+#define VMXNET3_REG_LB_RXPROD2  0x1800 /* Rx Producer Index for ring 2 */
+
+#define VMXNET3_PT_REG_SIZE 4096   /* BAR 0 */
+#define VMXNET3_LARGE_PT_REG_SIZE   8192   /* large PT pages */
+#define VMXNET3_VD_REG_SIZE 4096   /* BAR 1 */
+#define VMXNET3_LARGE_BAR0_REG_SIZE (4096 * 4096)  /* LARGE BAR 0 */
+#define VMXNET3_OOB_REG_SIZE(4094 * 4096)  /* OOB pages */
 
 /*
  * The two Vmxnet3 MMIO Register PCI BARs (BAR 0 at offset 10h and BAR 1 at
@@ -56,6 +64,7 @@
  * VMXNET3_MSIX_BAR_SIZE is defined in "vmxnet3Int.h"
  */
 #define VMXNET3_PHYSMEM_PAGES   4
+#define VMXNET3_PHYSMEM_LB_PAGES 4099 /* 4096 + 1 + 2 */
 
 #define VMXNET3_REG_ALIGN   8  /* All registers are 8-byte aligned. */
 #define VMXNET3_REG_ALIGN_MASK  0x7
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c 
b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index 8d656ffaf8..a04a16a3e0 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -456,6 +456,17 @@ eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev)
hw->uptv2_enabled = TRUE;
eth_vmxnet3_setup_capabilities(hw, eth_dev);
}
+
+   if (hw->used_DCR_capabilities[0] & (1 << VMXNET3_CAP_LARGE_BAR)) {
+   hw->tx_prod_offset = VMXNET3_REG_LB_TXPROD;
+   hw->rx_prod_offset[0] = VMXNET3_REG_LB_RXPROD;
+   hw->rx_prod_offset[1] = VMXNET3_REG_LB_RXPROD2;
+   } else {
+   hw->tx_prod_offset = VMXNET3_REG_TXPROD;
+   hw->rx_prod_offset[0] = VMXNET3_REG_RXPROD;
+   hw->rx_prod_offset[1] = VMXNET3_REG_RXPROD2;
+   }
+
/* Getting MAC Address */
mac_lo = VMXNET3_READ_BAR1_REG(hw, VMXNET3_REG_MACL);
mac_hi = VMXNET3_READ_BAR1_REG(hw, VMXNET3_REG_MACH);
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.h 
b/drivers/net/vmxnet3/vmxnet3_ethdev.h
index 1bbf2b4465..cabd83e7e1 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.h
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.h
@@ -122,6 +122,8 @@ struct vmxnet3_hw {
UPT1_RxStats  saved_rx_stats[VMXNET3_EXT_MAX_RX_QUEUES];
UPT1_TxStats  snapshot_tx_stats[VMXNET3_MAX_TX_QUEUES];
UPT1_RxStats  snapshot_rx_stats[VMXNET3_MAX_RX_QUEUES];
+   uint16_t  tx_prod_offset;
+   uint16_t  rx_prod_offset[2];
/* device capability bit map */
uint32_t  DCR_capabilities[8];
/* pass-through capability bit map */
diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c 
b/drivers/net/vmxnet3/vmxnet3_rxtx.c
index a875ffec07..83daac02c4 100644
--- a/drivers/net/vmxnet3/vmxnet3_rxtx.c
+++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c
@@ -57,8 +57,6 @@
 #defineVMXNET3_TX_OFFLOAD_NOTSUP_MASK  \
(RTE_MBUF_F_TX_OFFLOAD_MASK ^ VMXNET3_TX_OFFLOAD_MASK)
 
-static const uint32_t rxprod_reg[2] = {VMXNET3_REG_RXPROD, 
VMXNET3_REG_RXPROD2};
-
 static int vmxnet3_post_rx_bufs(vmxnet3_rx_queue_t*, uint8_t);
 static void vmxnet3_tq_tx_complete(vmxnet3_tx_queue_t *);
 #ifdef RTE_LIBRTE_VMXNET3_DEBUG_DRIVER_NOT_USED
@@ -577,7 +575,7 @@ vmxnet3_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
if (deferred >= rte_le_to_cpu_32(txq_ctrl->txThreshold)) {
txq_ctrl->txNumDeferred = 0;
/* Notify vSwitch that packets are available. */
-   VMXNET3_WRITE_BAR0_REG(hw, (VMXNET3_REG_TXPROD + txq->queue_id 
* VMXNET3_REG_ALIGN),
+   VMXNET3_WRITE_BAR0_REG(hw, 

Re: [PATCH next 4/7] vmxnet3: add command to set ring buffer sizes

2023-04-26 Thread Ronak Doshi


On 4/26/23, 9:58 AM, "Ferruh Yigit" mailto:ferruh.yi...@amd.com>> wrote:

> As far as I can see these "vmware_pack_begin.h" & "vmware_pack_end.h"
> has only file license comment, and I can see this is used in a few other
> type declaration.
>
> What is the reasoning behind using these headers?

This has been the case since driver was added to dpdk. The information is 
present in README.
I did not want to change the format being used for the declarations in the 
driver.

Thanks, 
Ronak 





Re: [PATCH next 0/7] vmxnet3: upgrade to version 7

2023-04-26 Thread Ronak Doshi

> On 4/26/23, 11:16 AM, "Ferruh Yigit" mailto:ferruh.yi...@amd.com>> wrote:
>
> btw, while checking the driver documentation, it seems it is not updated
> for a while, the paper it refers is old.
> Do you have any newer version of documentation to reference?

I don’t think we have any other document for perf, but let me update the 
document with some
details regarding features supported. Also, I will update release notes for 
these patches.

Thanks, 
Ronak



[PATCH v2 next 0/7] net/vmxnet3: upgrade to version 7

2023-04-26 Thread Ronak Doshi
vmxnet3 emulation has recently added several new features including
support for uniform passthrough(UPT). To make UPT work vmxnet3 has
to be enhanced as per the new specification. 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 7.
- 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 7 comparison
  and updates Copyright information.

Patch 2:
  This patch adds new capability registers to fine control enablement of
  individual features based on emulation and passthrough.

Patch 3:
  This patch adds support for large passthrough BAR register.

Patch 4:
  This patch introduces new command to set ring buffer sizes to pass this
  information to the hardware.

Patch 5:
  For better performance, hardware has a requirement to limit number of TSO
  descriptors. This patch adds that support.

Patch 6:
  Avoid updating rxprod register when in UPT for performance reasons.

Patch 7:
  With all vmxnet3 version 7 changes incorporated in the vmxnet3 driver,
  with this patch, the driver can configure emulation to run at vmxnet3
  version 7.

Changes in v2:
- modified the title to include "net/"
- addressed checkpatch complaints and some typo in patch commits
- removed RTE_ETH_DEV_CAPA_PASS_THRU as it was specific to vmxnet3
- added new features information in release notes
- updated feature related information in vmxnet3 driver documentation

Ronak Doshi (7):
  net/vmxnet3: prepare for version 7 changes
  net/vmxnet3: add support for capability registers
  net/vmxnet3: add support for large passthrough BAR register
  net/vmxnet3: add command to set ring buffer sizes
  net/vmxnet3: limit number of TXDs used for TSO packet
  net/vmxnet3: avoid updating rxprod register frequently
  net/vmxnet3: update to version 7

 doc/guides/nics/vmxnet3.rst | 26 +
 doc/guides/rel_notes/release_23_07.rst  |  6 +++
 drivers/net/vmxnet3/base/vmxnet3_defs.h | 74 ++---
 drivers/net/vmxnet3/vmxnet3_ethdev.c| 95 -
 drivers/net/vmxnet3/vmxnet3_ethdev.h| 16 ++
 drivers/net/vmxnet3/vmxnet3_ring.h  |  2 +-
 drivers/net/vmxnet3/vmxnet3_rxtx.c  | 48 -
 7 files changed, 245 insertions(+), 22 deletions(-)

-- 
2.11.0



[PATCH v2 next 1/7] net/vmxnet3: prepare for version 7 changes

2023-04-26 Thread Ronak Doshi
vmxnet3 is currently at version 6 and this patch initiates the
preparation to accommodate changes for up to version 7. Introduced
utility macros for vmxnet3 version 7 comparison.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 drivers/net/vmxnet3/vmxnet3_ethdev.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.h 
b/drivers/net/vmxnet3/vmxnet3_ethdev.h
index 5a303717b1..fc976707fd 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.h
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.h
@@ -124,6 +124,7 @@ struct vmxnet3_hw {
UPT1_RxStats  snapshot_rx_stats[VMXNET3_MAX_RX_QUEUES];
 };
 
+#define VMXNET3_REV_7  6   /* Vmxnet3 Rev. 7 */
 #define VMXNET3_REV_6  5   /* Vmxnet3 Rev. 6 */
 #define VMXNET3_REV_5  4   /* Vmxnet3 Rev. 5 */
 #define VMXNET3_REV_4  3   /* Vmxnet3 Rev. 4 */
@@ -131,6 +132,7 @@ struct vmxnet3_hw {
 #define VMXNET3_REV_2  1   /* Vmxnet3 Rev. 2 */
 #define VMXNET3_REV_1  0   /* Vmxnet3 Rev. 1 */
 
+#define VMXNET3_VERSION_GE_7(hw) ((hw)->version >= VMXNET3_REV_7 + 1)
 #define VMXNET3_VERSION_GE_6(hw) ((hw)->version >= VMXNET3_REV_6 + 1)
 #define VMXNET3_VERSION_GE_5(hw) ((hw)->version >= VMXNET3_REV_5 + 1)
 #define VMXNET3_VERSION_GE_4(hw) ((hw)->version >= VMXNET3_REV_4 + 1)
-- 
2.11.0



[PATCH v2 next 2/7] net/vmxnet3: add support for capability registers

2023-04-26 Thread Ronak Doshi
This patch enhances vmxnet3 to support capability registers which
allows it to enable features selectively. The DCR register tracks
the capabilities vmxnet3 device supports. The PTCR register states
the capabilities that the passthrough device supports.

With the help of these registers, vmxnet3 can enable only those
features which the passthrough device supports. This allows
smooth transition to Uniform-Passthrough (UPT) mode if the virtual
NIC requests it. If PTCR register returns nothing or error it means
UPT is not being requested and vnic will continue in emulation mode.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 drivers/net/vmxnet3/base/vmxnet3_defs.h | 44 +---
 drivers/net/vmxnet3/vmxnet3_ethdev.c| 60 +
 drivers/net/vmxnet3/vmxnet3_ethdev.h| 11 ++
 3 files changed, 110 insertions(+), 5 deletions(-)

diff --git a/drivers/net/vmxnet3/base/vmxnet3_defs.h 
b/drivers/net/vmxnet3/base/vmxnet3_defs.h
index bd6695e69d..759fdb6e4a 100644
--- a/drivers/net/vmxnet3/base/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/base/vmxnet3_defs.h
@@ -26,6 +26,12 @@
 #define VMXNET3_REG_MACH  0x30   /* MAC Address High */
 #define VMXNET3_REG_ICR   0x38   /* Interrupt Cause Register */
 #define VMXNET3_REG_ECR   0x40   /* Event Cause Register */
+#define VMXNET3_REG_DCR   0x48   /* Device capability register,
+ * from 0x48 to 0x80
+ */
+#define VMXNET3_REG_PTCR  0x88   /* Passthru capbility register
+ * from 0x88 to 0xb0
+ */
 
 #define VMXNET3_REG_WSAL  0xF00  /* Wireless Shared Address Lo  */
 #define VMXNET3_REG_WSAH  0xF08  /* Wireless Shared Address Hi  */
@@ -103,11 +109,13 @@ typedef enum {
VMXNET3_CMD_GET_CONF_INTR,
VMXNET3_CMD_GET_ADAPTIVE_RING_INFO,
VMXNET3_CMD_GET_TXDATA_DESC_SIZE,
-   VMXNET3_CMD_RESERVED5,
-   VMXNET3_CMD_RESERVED6,
-   VMXNET3_CMD_RESERVED7,
-   VMXNET3_CMD_RESERVED8,
-   VMXNET3_CMD_GET_MAX_QUEUES_CONF,
+   VMXNET3_CMD_RESERVED5,
+   VMXNET3_CMD_RESERVED6,
+   VMXNET3_CMD_RESERVED7,
+   VMXNET3_CMD_RESERVED8,
+   VMXNET3_CMD_GET_MAX_QUEUES_CONF,
+   VMXNET3_CMD_GET_MAX_CAPABILITIES,
+   VMXNET3_CMD_GET_DCR0_REG,
 } Vmxnet3_Cmd;
 
 /* Adaptive Ring Info Flags */
@@ -877,4 +885,30 @@ do {\
 
 #define VMXNET3_DID_PASSTHRU0x
 
+#define VMXNET3_DCR_ERROR  31   /* error when bit 31 
of DCR is set */
+#define VMXNET3_CAP_UDP_RSS0/* bit 0 of DCR 0 */
+#define VMXNET3_CAP_ESP_RSS_IPV4   1/* bit 1 of DCR 0 */
+#define VMXNET3_CAP_GENEVE_CHECKSUM_OFFLOAD2/* bit 2 of DCR 0 */
+#define VMXNET3_CAP_GENEVE_TSO 3/* bit 3 of DCR 0 */
+#define VMXNET3_CAP_VXLAN_CHECKSUM_OFFLOAD 4/* bit 4 of DCR 0 */
+#define VMXNET3_CAP_VXLAN_TSO  5/* bit 5 of DCR 0 */
+#define VMXNET3_CAP_GENEVE_OUTER_CHECKSUM_OFFLOAD  6/* bit 6 of DCR 0 */
+#define VMXNET3_CAP_VXLAN_OUTER_CHECKSUM_OFFLOAD   7/* bit 7 of DCR 0 */
+#define VMXNET3_CAP_PKT_STEERING_IPV4  8/* bit 8 of DCR 0 */
+#define VMXNET3_CAP_VERSION_4_MAX  
VMXNET3_CAP_PKT_STEERING_IPV4
+#define VMXNET3_CAP_ESP_RSS_IPV6   9/* bit 9 of DCR 0 */
+#define VMXNET3_CAP_VERSION_5_MAX  VMXNET3_CAP_ESP_RSS_IPV6
+#define VMXNET3_CAP_ESP_OVER_UDP_RSS   10   /* bit 10 of DCR 0 */
+#define VMXNET3_CAP_INNER_RSS  11   /* bit 11 of DCR 0 */
+#define VMXNET3_CAP_INNER_ESP_RSS  12   /* bit 12 of DCR 0 */
+#define VMXNET3_CAP_CRC32_HASH_FUNC13   /* bit 13 of DCR 0 */
+#define VMXNET3_CAP_VERSION_6_MAX  VMXNET3_CAP_CRC32_HASH_FUNC
+#define VMXNET3_CAP_OAM_FILTER 14   /* bit 14 of DCR 0 */
+#define VMXNET3_CAP_ESP_QS 15   /* bit 15 of DCR 0 */
+#define VMXNET3_CAP_LARGE_BAR  16   /* bit 16 of DCR 0 */
+#define VMXNET3_CAP_OOORX_COMP 17   /* bit 17 of DCR 0 */
+#define VMXNET3_CAP_VERSION_7_MAX  18
+/* when new capability is introduced, update VMXNET3_CAP_MAX */
+#define VMXNET3_CAP_MAXVMXNET3_CAP_VERSION_7_MAX
+
 #endif /* _VMXNET3_DEFS_H_ */
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c 
b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index fd946dec5c..05b6d54cb9 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -299,6 +299,61 @@ eth_vmxnet3_txdata_get(struct vmxnet3_hw *hw)
sizeof(struct Vmxnet3_TxDataDesc) : txdata_desc_size;
 }
 
+static int
+eth_vmxnet3_setup_capabilities(struct vmxnet3_hw *hw,
+  struct rte_eth_dev *eth_dev)
+{
+   uint32_t dcr, ptcr, value;
+   struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev

[PATCH v2 next 3/7] net/vmxnet3: add support for large passthrough BAR register

2023-04-26 Thread Ronak Doshi
For vmxnet3 to work in UPT mode, the BAR sizes have been increased.
The PT page has been extended to 2 pages and also includes OOB pages
as a part of PT BAR. This patch enhances vmxnet3 to use appropriate
BAR offsets based on the capability registered. To use new offsets,
VMXNET3_CAP_LARGE_BAR needs to be set by the device. If it is not set
then the device will use legacy PT page layout.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 drivers/net/vmxnet3/base/vmxnet3_defs.h | 13 +++--
 drivers/net/vmxnet3/vmxnet3_ethdev.c| 11 +++
 drivers/net/vmxnet3/vmxnet3_ethdev.h|  2 ++
 drivers/net/vmxnet3/vmxnet3_rxtx.c  | 13 +++--
 4 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/drivers/net/vmxnet3/base/vmxnet3_defs.h 
b/drivers/net/vmxnet3/base/vmxnet3_defs.h
index 759fdb6e4a..27f35a0062 100644
--- a/drivers/net/vmxnet3/base/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/base/vmxnet3_defs.h
@@ -43,8 +43,16 @@
 #define VMXNET3_REG_RXPROD   0x800 /* Rx Producer Index for ring 1 */
 #define VMXNET3_REG_RXPROD2  0xA00 /* Rx Producer Index for ring 2 */
 
-#define VMXNET3_PT_REG_SIZE 4096/* BAR 0 */
-#define VMXNET3_VD_REG_SIZE 4096/* BAR 1 */
+/* For Large PT BAR, the following offset to DB register */
+#define VMXNET3_REG_LB_TXPROD   0x1000 /* Tx Producer Index */
+#define VMXNET3_REG_LB_RXPROD   0x1400 /* Rx Producer Index for ring 1 */
+#define VMXNET3_REG_LB_RXPROD2  0x1800 /* Rx Producer Index for ring 2 */
+
+#define VMXNET3_PT_REG_SIZE 4096   /* BAR 0 */
+#define VMXNET3_LARGE_PT_REG_SIZE   8192   /* large PT pages */
+#define VMXNET3_VD_REG_SIZE 4096   /* BAR 1 */
+#define VMXNET3_LARGE_BAR0_REG_SIZE (4096 * 4096)  /* LARGE BAR 0 */
+#define VMXNET3_OOB_REG_SIZE(4094 * 4096)  /* OOB pages */
 
 /*
  * The two Vmxnet3 MMIO Register PCI BARs (BAR 0 at offset 10h and BAR 1 at
@@ -56,6 +64,7 @@
  * VMXNET3_MSIX_BAR_SIZE is defined in "vmxnet3Int.h"
  */
 #define VMXNET3_PHYSMEM_PAGES   4
+#define VMXNET3_PHYSMEM_LB_PAGES 4099 /* 4096 + 1 + 2 */
 
 #define VMXNET3_REG_ALIGN   8  /* All registers are 8-byte aligned. */
 #define VMXNET3_REG_ALIGN_MASK  0x7
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c 
b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index 05b6d54cb9..62c7e048f5 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -456,6 +456,17 @@ eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev)
hw->uptv2_enabled = TRUE;
eth_vmxnet3_setup_capabilities(hw, eth_dev);
}
+
+   if (hw->used_DCR_capabilities[0] & (1 << VMXNET3_CAP_LARGE_BAR)) {
+   hw->tx_prod_offset = VMXNET3_REG_LB_TXPROD;
+   hw->rx_prod_offset[0] = VMXNET3_REG_LB_RXPROD;
+   hw->rx_prod_offset[1] = VMXNET3_REG_LB_RXPROD2;
+   } else {
+   hw->tx_prod_offset = VMXNET3_REG_TXPROD;
+   hw->rx_prod_offset[0] = VMXNET3_REG_RXPROD;
+   hw->rx_prod_offset[1] = VMXNET3_REG_RXPROD2;
+   }
+
/* Getting MAC Address */
mac_lo = VMXNET3_READ_BAR1_REG(hw, VMXNET3_REG_MACL);
mac_hi = VMXNET3_READ_BAR1_REG(hw, VMXNET3_REG_MACH);
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.h 
b/drivers/net/vmxnet3/vmxnet3_ethdev.h
index 1bbf2b4465..cabd83e7e1 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.h
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.h
@@ -122,6 +122,8 @@ struct vmxnet3_hw {
UPT1_RxStats  saved_rx_stats[VMXNET3_EXT_MAX_RX_QUEUES];
UPT1_TxStats  snapshot_tx_stats[VMXNET3_MAX_TX_QUEUES];
UPT1_RxStats  snapshot_rx_stats[VMXNET3_MAX_RX_QUEUES];
+   uint16_t  tx_prod_offset;
+   uint16_t  rx_prod_offset[2];
/* device capability bit map */
uint32_t  DCR_capabilities[8];
/* pass-through capability bit map */
diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c 
b/drivers/net/vmxnet3/vmxnet3_rxtx.c
index a875ffec07..83daac02c4 100644
--- a/drivers/net/vmxnet3/vmxnet3_rxtx.c
+++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c
@@ -57,8 +57,6 @@
 #defineVMXNET3_TX_OFFLOAD_NOTSUP_MASK  \
(RTE_MBUF_F_TX_OFFLOAD_MASK ^ VMXNET3_TX_OFFLOAD_MASK)
 
-static const uint32_t rxprod_reg[2] = {VMXNET3_REG_RXPROD, 
VMXNET3_REG_RXPROD2};
-
 static int vmxnet3_post_rx_bufs(vmxnet3_rx_queue_t*, uint8_t);
 static void vmxnet3_tq_tx_complete(vmxnet3_tx_queue_t *);
 #ifdef RTE_LIBRTE_VMXNET3_DEBUG_DRIVER_NOT_USED
@@ -577,7 +575,7 @@ vmxnet3_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
if (deferred >= rte_le_to_cpu_32(txq_ctrl->txThreshold)) {
txq_ctrl->txNumDeferred = 0;
/* Notify vSwitch that packets are available. */
-   VMXNET3_WRITE_BAR0_REG(hw, (VMXNET3_REG_TXPROD + txq->queue_id 
* VMXNET3_REG_ALIGN),
+   VMXNET3_WRITE_BAR0_REG(hw, 

[PATCH v2 next 5/7] net/vmxnet3: limit number of TXDs used for TSO packet

2023-04-26 Thread Ronak Doshi
Currently, vmxnet3 does not have a limit on number of descriptors
used for a TSO packet. However, with UPT, for hardware performance
reasons, this patch limits the number of transmit descriptors to 24
for a TSO packet.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 drivers/net/vmxnet3/base/vmxnet3_defs.h |  2 ++
 drivers/net/vmxnet3/vmxnet3_rxtx.c  | 18 ++
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/drivers/net/vmxnet3/base/vmxnet3_defs.h 
b/drivers/net/vmxnet3/base/vmxnet3_defs.h
index d8cc295b08..24c235876e 100644
--- a/drivers/net/vmxnet3/base/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/base/vmxnet3_defs.h
@@ -419,6 +419,8 @@ typedef union Vmxnet3_GenericDesc {
 
 /* max # of tx descs for a non-tso pkt */
 #define VMXNET3_MAX_TXD_PER_PKT 16
+/* max # of tx descs for a tso pkt */
+#define VMXNET3_MAX_TSO_TXD_PER_PKT 24
 
 /* Max size of a single rx buffer */
 #define VMXNET3_MAX_RX_BUF_SIZE  ((1 << 14) - 1)
diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c 
b/drivers/net/vmxnet3/vmxnet3_rxtx.c
index e31878ecab..7bbae4177e 100644
--- a/drivers/net/vmxnet3/vmxnet3_rxtx.c
+++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c
@@ -364,6 +364,14 @@ vmxnet3_prep_pkts(__rte_unused void *tx_queue, struct 
rte_mbuf **tx_pkts,
rte_errno = EINVAL;
return i;
}
+   /* TSO packet cannot occupy more than
+* VMXNET3_MAX_TSO_TXD_PER_PKT TX descriptors.
+*/
+   if ((ol_flags & RTE_MBUF_F_TX_TCP_SEG) != 0 &&
+   m->nb_segs > VMXNET3_MAX_TSO_TXD_PER_PKT) {
+   rte_errno = EINVAL;
+   return i;
+   }
 
/* check that only supported TX offloads are requested. */
if ((ol_flags & VMXNET3_TX_OFFLOAD_NOTSUP_MASK) != 0 ||
@@ -444,10 +452,12 @@ vmxnet3_xmit_pkts(void *tx_queue, struct rte_mbuf 
**tx_pkts,
continue;
}
 
-   /* Drop non-TSO packet that is excessively fragmented */
-   if (unlikely(!tso && count > VMXNET3_MAX_TXD_PER_PKT)) {
-   PMD_TX_LOG(ERR, "Non-TSO packet cannot occupy more than 
%d tx "
-  "descriptors. Packet dropped.", 
VMXNET3_MAX_TXD_PER_PKT);
+   /* Drop non-TSO or TSO packet that is excessively fragmented */
+   if (unlikely((!tso && count > VMXNET3_MAX_TXD_PER_PKT) ||
+(tso && count > VMXNET3_MAX_TSO_TXD_PER_PKT))) {
+   PMD_TX_LOG(ERR, "Non-TSO or TSO packet cannot occupy 
more than "
+  "%d or %d tx descriptors respectively. 
Packet dropped.",
+  VMXNET3_MAX_TXD_PER_PKT, 
VMXNET3_MAX_TSO_TXD_PER_PKT);
txq->stats.drop_too_many_segs++;
txq->stats.drop_total++;
rte_pktmbuf_free(txm);
-- 
2.11.0



[PATCH v2 next 6/7] net/vmxnet3: avoid updating rxprod register frequently

2023-04-26 Thread Ronak Doshi
When UPT is enabled, the driver updates rxprod register to
let the device know that it has processed the received packets
and new buffers are available. However, updating it too
frequently can lead to reduced performance.

This patch adds code to avoid updating the register frequently.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 drivers/net/vmxnet3/vmxnet3_rxtx.c | 14 +-
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c 
b/drivers/net/vmxnet3/vmxnet3_rxtx.c
index 7bbae4177e..39ad0726cb 100644
--- a/drivers/net/vmxnet3/vmxnet3_rxtx.c
+++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c
@@ -1007,7 +1007,8 @@ vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf 
**rx_pkts, uint16_t nb_pkts)
 
/* It's time to renew descriptors */
vmxnet3_renew_desc(rxq, ring_idx, newm);
-   if (unlikely(rxq->shared->ctrl.updateRxProd)) {
+   if (unlikely(rxq->shared->ctrl.updateRxProd &&
+(rxq->cmd_ring[ring_idx].next2fill & 0xf) == 0)) {
VMXNET3_WRITE_BAR0_REG(hw, hw->rx_prod_offset[ring_idx] 
+
   (rxq->queue_id * 
VMXNET3_REG_ALIGN),
   
rxq->cmd_ring[ring_idx].next2fill);
@@ -1027,18 +1028,21 @@ vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf 
**rx_pkts, uint16_t nb_pkts)
 
if (unlikely(nb_rxd == 0)) {
uint32_t avail;
+   uint32_t posted = 0;
for (ring_idx = 0; ring_idx < VMXNET3_RX_CMDRING_SIZE; 
ring_idx++) {
avail = 
vmxnet3_cmd_ring_desc_avail(&rxq->cmd_ring[ring_idx]);
if (unlikely(avail > 0)) {
/* try to alloc new buf and renew descriptors */
-   vmxnet3_post_rx_bufs(rxq, ring_idx);
+   if (vmxnet3_post_rx_bufs(rxq, ring_idx) > 0)
+   posted |= (1 << ring_idx);
}
}
if (unlikely(rxq->shared->ctrl.updateRxProd)) {
for (ring_idx = 0; ring_idx < VMXNET3_RX_CMDRING_SIZE; 
ring_idx++) {
-   VMXNET3_WRITE_BAR0_REG(hw, 
hw->rx_prod_offset[ring_idx] +
-  (rxq->queue_id * 
VMXNET3_REG_ALIGN),
-  
rxq->cmd_ring[ring_idx].next2fill);
+   if (posted & (1 << ring_idx))
+   VMXNET3_WRITE_BAR0_REG(hw, 
hw->rx_prod_offset[ring_idx] +
+  (rxq->queue_id * 
VMXNET3_REG_ALIGN),
+  
rxq->cmd_ring[ring_idx].next2fill);
}
}
}
-- 
2.11.0



[PATCH v2 next 4/7] net/vmxnet3: add command to set ring buffer sizes

2023-04-26 Thread Ronak Doshi
This patch adds a new command to set ring buffer sizes. This is
required to pass the buffer size information to passthrough devices.
Also, ring sizes are round down to power of 2.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 drivers/net/vmxnet3/base/vmxnet3_defs.h | 15 +++
 drivers/net/vmxnet3/vmxnet3_ethdev.c| 18 ++
 drivers/net/vmxnet3/vmxnet3_ethdev.h|  1 +
 drivers/net/vmxnet3/vmxnet3_rxtx.c  |  7 +++
 4 files changed, 41 insertions(+)

diff --git a/drivers/net/vmxnet3/base/vmxnet3_defs.h 
b/drivers/net/vmxnet3/base/vmxnet3_defs.h
index 27f35a0062..d8cc295b08 100644
--- a/drivers/net/vmxnet3/base/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/base/vmxnet3_defs.h
@@ -105,6 +105,9 @@ typedef enum {
VMXNET3_CMD_RESERVED4,
VMXNET3_CMD_REGISTER_MEMREGS,
VMXNET3_CMD_SET_RSS_FIELDS,
+   VMXNET3_CMD_RESERVED9,
+   VMXNET3_CMD_RESERVED10,
+   VMXNET3_CMD_SET_RING_BUFFER_SIZE,
 
VMXNET3_CMD_FIRST_GET = 0xF00D,
VMXNET3_CMD_GET_QUEUE_STATUS = VMXNET3_CMD_FIRST_GET,
@@ -822,6 +825,17 @@ typedef enum Vmxnet3_RSSField {
VMXNET3_RSS_FIELDS_ESPIP6 = 0x0020,
 } Vmxnet3_RSSField;
 
+typedef
+#include "vmware_pack_begin.h"
+struct Vmxnet3_RingBufferSize {
+   __le16  ring1BufSizeType0;
+   __le16  ring1BufSizeType1;
+   __le16  ring2BufSizeType1;
+   __le16  pad;
+}
+#include "vmware_pack_end.h"
+Vmxnet3_RingBufferSize;
+
 /*
  * If the command data <= 16 bytes, use the shared memory direcly.
  * Otherwise, use the variable length configuration descriptor.
@@ -832,6 +846,7 @@ union Vmxnet3_CmdInfo {
Vmxnet3_VariableLenConfDesc varConf;
Vmxnet3_SetPolling  setPolling;
Vmxnet3_RSSFieldsetRSSFields;
+   Vmxnet3_RingBufferSize  ringBufSize;
__le16  reserved[2];
__le64  data[2];
 }
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c 
b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index 62c7e048f5..b9cf007429 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -1018,6 +1018,22 @@ vmxnet3_setup_driver_shared(struct rte_eth_dev *dev)
return VMXNET3_SUCCESS;
 }
 
+static void
+vmxnet3_init_bufsize(struct vmxnet3_hw *hw)
+{
+   struct Vmxnet3_DriverShared *shared = hw->shared;
+   union Vmxnet3_CmdInfo *cmd_info = &shared->cu.cmdInfo;
+
+   if (!VMXNET3_VERSION_GE_7(hw))
+   return;
+
+   cmd_info->ringBufSize.ring1BufSizeType0 = hw->rxdata_buf_size;
+   cmd_info->ringBufSize.ring1BufSizeType1 = 0;
+   cmd_info->ringBufSize.ring2BufSizeType1 = hw->rxdata_buf_size;
+   VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD,
+  VMXNET3_CMD_SET_RING_BUFFER_SIZE);
+}
+
 /*
  * Configure device link speed and setup link.
  * Must be called after eth_vmxnet3_dev_init. Other wise it might fail
@@ -1101,6 +1117,8 @@ vmxnet3_dev_start(struct rte_eth_dev *dev)
return ret;
}
 
+   vmxnet3_init_bufsize(hw);
+
hw->adapter_stopped = FALSE;
 
/* Setting proper Rx Mode and issue Rx Mode Update command */
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.h 
b/drivers/net/vmxnet3/vmxnet3_ethdev.h
index cabd83e7e1..2b3e2c4caa 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.h
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.h
@@ -96,6 +96,7 @@ struct vmxnet3_hw {
 
uint16_t txdata_desc_size; /* tx data ring buffer size */
uint16_t rxdata_desc_size; /* rx data ring buffer size */
+   uint16_t rxdata_buf_size; /* rx data buffer size */
 
uint8_t num_intrs;
 
diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c 
b/drivers/net/vmxnet3/vmxnet3_rxtx.c
index 83daac02c4..e31878ecab 100644
--- a/drivers/net/vmxnet3/vmxnet3_rxtx.c
+++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c
@@ -1113,6 +1113,8 @@ vmxnet3_dev_tx_queue_setup(struct rte_eth_dev *dev,
return -EINVAL;
} else {
ring->size = nb_desc;
+   if (VMXNET3_VERSION_GE_7(hw))
+   ring->size = rte_align32prevpow2(nb_desc);
ring->size &= ~VMXNET3_RING_SIZE_MASK;
}
comp_ring->size = data_ring->size = ring->size;
@@ -1193,6 +1195,9 @@ vmxnet3_dev_rx_queue_setup(struct rte_eth_dev *dev,
}
 
rxq->mp = mp;
+   /* Remember buffer size for initialization in dev start. */
+   hw->rxdata_buf_size =
+   rte_pktmbuf_data_room_size(mp) - RTE_PKTMBUF_HEADROOM;
rxq->queue_id = queue_idx;
rxq->port_id = dev->data->port_id;
rxq->shared = NULL; /* set in vmxnet3_setup_driver_shared() */
@@ -1217,6 +1222,8 @@ vmxnet3_dev_rx_queue_setup(struct rte_eth_dev *dev,
return -EINVAL;
} else {
ring0->size = nb_desc;
+   if (VMXNET3_VERSION_GE_7(hw))
+   r

[PATCH v2 next 7/7] net/vmxnet3: update to version 7

2023-04-26 Thread Ronak Doshi
With all vmxnet3 version 7 changes incorporated in the vmxnet3 driver,
the driver can configure emulation to run at vmxnet3 version 7, provided
the emulation advertises support for version 7.

Signed-off-by: Ronak Doshi 
Acked-by: Jochen Behrens 
---
 doc/guides/nics/vmxnet3.rst| 26 ++
 doc/guides/rel_notes/release_23_07.rst |  6 ++
 drivers/net/vmxnet3/vmxnet3_ethdev.c   |  6 +-
 drivers/net/vmxnet3/vmxnet3_ring.h |  2 +-
 4 files changed, 38 insertions(+), 2 deletions(-)

diff --git a/doc/guides/nics/vmxnet3.rst b/doc/guides/nics/vmxnet3.rst
index 190cf91a47..d96e296530 100644
--- a/doc/guides/nics/vmxnet3.rst
+++ b/doc/guides/nics/vmxnet3.rst
@@ -67,6 +67,32 @@ There are several options available for filtering packets at 
VMXNET3 device leve
 
 *   VLAN tag based filtering without load balancing - SUPPORTED
 
+#.  Vmxnet3 versions and associated features.
+
+Vmxnet3 version is tied to corresponding ESXi hardware version and each
+version defines a set of compatible features.
+
+* Vmxnet3 version 7, hw ver 19
+  This version adds support for Uniform Passthrough(UPT).
+
+* Vmxnet3 version 6, hw ver 17
+  This version enhanced vmxnet3 to support queues up to 32 and also
+  removed power-of-two limitations on the queues.
+
+* Vmxnet3 version 5, hw ver 15
+  Features not related to dpdk vmxnet3 PMD.
+
+* Vmxnet3 version 4, hw ver 14
+  This version adds supoprt for UDP and ESP RSS
+
+* Vmxnet3 version 3, hw ver 13
+  This version added performance enhancement features such as
+  configurable Tx data ring, Receive Data Ring, and the ability
+  to register memory regions.
+
+* Vmxnet3 version 2, hw ver 11
+  This version adds support for Large Receive offload (LRO).
+
 .. note::
 
 
diff --git a/doc/guides/rel_notes/release_23_07.rst 
b/doc/guides/rel_notes/release_23_07.rst
index a9b1293689..907a06cd62 100644
--- a/doc/guides/rel_notes/release_23_07.rst
+++ b/doc/guides/rel_notes/release_23_07.rst
@@ -55,6 +55,12 @@ New Features
  Also, make sure to start the actual text at the margin.
  ===
 
+   * **Added vmxnet3 version 7 support.**
+
+ Added support for vmxnet3 version 7 which includes support
+ for uniform passthrough(UPT). The patches also add support
+ for new capability registers, large passthru BAR and some
+ performance enhancements for UPT.
 
 Removed Items
 -
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c 
b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index b9cf007429..41073e9798 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -410,7 +410,11 @@ eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev)
/* Check h/w version compatibility with driver. */
ver = VMXNET3_READ_BAR1_REG(hw, VMXNET3_REG_VRRS);
 
-   if (ver & (1 << VMXNET3_REV_6)) {
+   if (ver & (1 << VMXNET3_REV_7)) {
+   VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_VRRS,
+  1 << VMXNET3_REV_7);
+   hw->version = VMXNET3_REV_7 + 1;
+   } else if (ver & (1 << VMXNET3_REV_6)) {
VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_VRRS,
   1 << VMXNET3_REV_6);
hw->version = VMXNET3_REV_6 + 1;
diff --git a/drivers/net/vmxnet3/vmxnet3_ring.h 
b/drivers/net/vmxnet3/vmxnet3_ring.h
index 50992349d8..948762db90 100644
--- a/drivers/net/vmxnet3/vmxnet3_ring.h
+++ b/drivers/net/vmxnet3/vmxnet3_ring.h
@@ -7,7 +7,7 @@
 
 #define VMXNET3_RX_CMDRING_SIZE 2
 
-#define VMXNET3_DRIVER_VERSION_NUM 0x01012000
+#define VMXNET3_DRIVER_VERSION_NUM 0x01013000
 
 /* Default ring size */
 #define VMXNET3_DEF_TX_RING_SIZE 512
-- 
2.11.0