DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH 00/13] ENETC PMD basic features and bug fixes
@ 2019-04-08 11:22 Gagandeep Singh
  2019-04-08 11:22 ` Gagandeep Singh
                   ` (14 more replies)
  0 siblings, 15 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

* support added for MTU, jumbo frame, queue start/stop, promiscuous,
  multicast, crc offload, RX checksum validation and basic stats
* some bug fixes

Gagandeep Singh (13):
  net/enetc: support physical addressing mode
  net/enetc: fix SMMU unhandled context fault
  net/enetc: use correct buffer allocation API
  net/enetc: set interface mode for SXGMII
  net/enetc: add statistics APIs
  net/enetc: replace register read/write macros with functions
  net/enetc: remove forward declarations
  net/enetc: enable promiscuous and allmulticast feature
  net/enetc: add MTU update and jumbo frames support
  net/enetc: enable Rx-Tx queue start/stop feature
  net/enetc: enable CRC offload feature
  net/enetc: enable Rx checksum offload validation
  net/enetc: fix crash at high speed traffic

 doc/guides/nics/enetc.rst          |   7 +
 doc/guides/nics/features/enetc.ini |   9 +
 drivers/net/enetc/base/enetc_hw.h  |  53 ++-
 drivers/net/enetc/enetc.h          |  13 +-
 drivers/net/enetc/enetc_ethdev.c   | 739 +++++++++++++++++++++++++------------
 drivers/net/enetc/enetc_rxtx.c     | 128 ++++++-
 6 files changed, 685 insertions(+), 264 deletions(-)

-- 
1.9.1

^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 00/13] ENETC PMD basic features and bug fixes
  2019-04-08 11:22 [dpdk-dev] [PATCH 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
@ 2019-04-08 11:22 ` Gagandeep Singh
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 01/13] net/enetc: support physical addressing mode Gagandeep Singh
                   ` (13 subsequent siblings)
  14 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

* support added for MTU, jumbo frame, queue start/stop, promiscuous,
  multicast, crc offload, RX checksum validation and basic stats
* some bug fixes

Gagandeep Singh (13):
  net/enetc: support physical addressing mode
  net/enetc: fix SMMU unhandled context fault
  net/enetc: use correct buffer allocation API
  net/enetc: set interface mode for SXGMII
  net/enetc: add statistics APIs
  net/enetc: replace register read/write macros with functions
  net/enetc: remove forward declarations
  net/enetc: enable promiscuous and allmulticast feature
  net/enetc: add MTU update and jumbo frames support
  net/enetc: enable Rx-Tx queue start/stop feature
  net/enetc: enable CRC offload feature
  net/enetc: enable Rx checksum offload validation
  net/enetc: fix crash at high speed traffic

 doc/guides/nics/enetc.rst          |   7 +
 doc/guides/nics/features/enetc.ini |   9 +
 drivers/net/enetc/base/enetc_hw.h  |  53 ++-
 drivers/net/enetc/enetc.h          |  13 +-
 drivers/net/enetc/enetc_ethdev.c   | 739 +++++++++++++++++++++++++------------
 drivers/net/enetc/enetc_rxtx.c     | 128 ++++++-
 6 files changed, 685 insertions(+), 264 deletions(-)

-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 01/13] net/enetc: support physical addressing mode
  2019-04-08 11:22 [dpdk-dev] [PATCH 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
  2019-04-08 11:22 ` Gagandeep Singh
@ 2019-04-08 11:22 ` Gagandeep Singh
  2019-04-08 11:22   ` Gagandeep Singh
  2019-04-08 13:16   ` Ferruh Yigit
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 02/13] net/enetc: fix SMMU unhandled context fault Gagandeep Singh
                   ` (12 subsequent siblings)
  14 siblings, 2 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Support added for physical addressing mode and
change driver flags to don't care.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 22 ++++++++++++----------
 drivers/net/enetc/enetc_rxtx.c   |  6 +++---
 2 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 023fe75..7a9a97d 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #include <stdbool.h>
@@ -334,14 +334,15 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
 {
 	int idx = tx_ring->index;
-	uintptr_t base_addr;
 	uint32_t tbmr;
+	phys_addr_t bd_address;
 
-	base_addr = (uintptr_t)tx_ring->bd_base;
+	bd_address = (phys_addr_t)
+		     rte_mem_virt2iova((const void *)tx_ring->bd_base);
 	enetc_txbdr_wr(hw, idx, ENETC_TBBAR0,
-		       lower_32_bits((uint64_t)base_addr));
+		       lower_32_bits((uint64_t)bd_address));
 	enetc_txbdr_wr(hw, idx, ENETC_TBBAR1,
-		       upper_32_bits((uint64_t)base_addr));
+		       upper_32_bits((uint64_t)bd_address));
 	enetc_txbdr_wr(hw, idx, ENETC_TBLENR,
 		       ENETC_RTBLENR_LEN(tx_ring->bd_count));
 
@@ -478,14 +479,15 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		  struct rte_mempool *mb_pool)
 {
 	int idx = rx_ring->index;
-	uintptr_t base_addr;
 	uint16_t buf_size;
+	phys_addr_t bd_address;
 
-	base_addr = (uintptr_t)rx_ring->bd_base;
+	bd_address = (phys_addr_t)
+		     rte_mem_virt2iova((const void *)rx_ring->bd_base);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBAR0,
-		       lower_32_bits((uint64_t)base_addr));
+		       lower_32_bits((uint64_t)bd_address));
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBAR1,
-		       upper_32_bits((uint64_t)base_addr));
+		       upper_32_bits((uint64_t)bd_address));
 	enetc_rxbdr_wr(hw, idx, ENETC_RBLENR,
 		       ENETC_RTBLENR_LEN(rx_ring->bd_count));
 
@@ -612,7 +614,7 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 
 static struct rte_pci_driver rte_enetc_pmd = {
 	.id_table = pci_id_enetc_map,
-	.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_IOVA_AS_VA,
+	.drv_flags = RTE_PCI_DRV_NEED_MAPPING,
 	.probe = enetc_pci_probe,
 	.remove = enetc_pci_remove,
 };
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 631e243..a31a387 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #include <stdbool.h>
@@ -64,7 +64,7 @@
 		txbd->buf_len = txbd->frm_len;
 		txbd->flags = rte_cpu_to_le_16(ENETC_TXBD_FLAGS_F);
 		txbd->addr = (uint64_t)(uintptr_t)
-		rte_cpu_to_le_64((size_t)tx_swbd->buffer_addr->buf_addr +
+		rte_cpu_to_le_64((size_t)tx_swbd->buffer_addr->buf_iova +
 				 tx_swbd->buffer_addr->data_off);
 		i++;
 		start++;
@@ -91,7 +91,7 @@
 		rx_swbd->buffer_addr =
 			rte_cpu_to_le_64(rte_mbuf_raw_alloc(rx_ring->mb_pool));
 		rxbd->w.addr = (uint64_t)(uintptr_t)
-			       rx_swbd->buffer_addr->buf_addr +
+			       rx_swbd->buffer_addr->buf_iova +
 			       rx_swbd->buffer_addr->data_off;
 		/* clear 'R" as well */
 		rxbd->r.lstatus = 0;
-- 
1.9.1

^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 01/13] net/enetc: support physical addressing mode
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 01/13] net/enetc: support physical addressing mode Gagandeep Singh
@ 2019-04-08 11:22   ` Gagandeep Singh
  2019-04-08 13:16   ` Ferruh Yigit
  1 sibling, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Support added for physical addressing mode and
change driver flags to don't care.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 22 ++++++++++++----------
 drivers/net/enetc/enetc_rxtx.c   |  6 +++---
 2 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 023fe75..7a9a97d 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #include <stdbool.h>
@@ -334,14 +334,15 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
 {
 	int idx = tx_ring->index;
-	uintptr_t base_addr;
 	uint32_t tbmr;
+	phys_addr_t bd_address;
 
-	base_addr = (uintptr_t)tx_ring->bd_base;
+	bd_address = (phys_addr_t)
+		     rte_mem_virt2iova((const void *)tx_ring->bd_base);
 	enetc_txbdr_wr(hw, idx, ENETC_TBBAR0,
-		       lower_32_bits((uint64_t)base_addr));
+		       lower_32_bits((uint64_t)bd_address));
 	enetc_txbdr_wr(hw, idx, ENETC_TBBAR1,
-		       upper_32_bits((uint64_t)base_addr));
+		       upper_32_bits((uint64_t)bd_address));
 	enetc_txbdr_wr(hw, idx, ENETC_TBLENR,
 		       ENETC_RTBLENR_LEN(tx_ring->bd_count));
 
@@ -478,14 +479,15 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		  struct rte_mempool *mb_pool)
 {
 	int idx = rx_ring->index;
-	uintptr_t base_addr;
 	uint16_t buf_size;
+	phys_addr_t bd_address;
 
-	base_addr = (uintptr_t)rx_ring->bd_base;
+	bd_address = (phys_addr_t)
+		     rte_mem_virt2iova((const void *)rx_ring->bd_base);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBAR0,
-		       lower_32_bits((uint64_t)base_addr));
+		       lower_32_bits((uint64_t)bd_address));
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBAR1,
-		       upper_32_bits((uint64_t)base_addr));
+		       upper_32_bits((uint64_t)bd_address));
 	enetc_rxbdr_wr(hw, idx, ENETC_RBLENR,
 		       ENETC_RTBLENR_LEN(rx_ring->bd_count));
 
@@ -612,7 +614,7 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 
 static struct rte_pci_driver rte_enetc_pmd = {
 	.id_table = pci_id_enetc_map,
-	.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_IOVA_AS_VA,
+	.drv_flags = RTE_PCI_DRV_NEED_MAPPING,
 	.probe = enetc_pci_probe,
 	.remove = enetc_pci_remove,
 };
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 631e243..a31a387 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #include <stdbool.h>
@@ -64,7 +64,7 @@
 		txbd->buf_len = txbd->frm_len;
 		txbd->flags = rte_cpu_to_le_16(ENETC_TXBD_FLAGS_F);
 		txbd->addr = (uint64_t)(uintptr_t)
-		rte_cpu_to_le_64((size_t)tx_swbd->buffer_addr->buf_addr +
+		rte_cpu_to_le_64((size_t)tx_swbd->buffer_addr->buf_iova +
 				 tx_swbd->buffer_addr->data_off);
 		i++;
 		start++;
@@ -91,7 +91,7 @@
 		rx_swbd->buffer_addr =
 			rte_cpu_to_le_64(rte_mbuf_raw_alloc(rx_ring->mb_pool));
 		rxbd->w.addr = (uint64_t)(uintptr_t)
-			       rx_swbd->buffer_addr->buf_addr +
+			       rx_swbd->buffer_addr->buf_iova +
 			       rx_swbd->buffer_addr->data_off;
 		/* clear 'R" as well */
 		rxbd->r.lstatus = 0;
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 02/13] net/enetc: fix SMMU unhandled context fault
  2019-04-08 11:22 [dpdk-dev] [PATCH 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
  2019-04-08 11:22 ` Gagandeep Singh
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 01/13] net/enetc: support physical addressing mode Gagandeep Singh
@ 2019-04-08 11:22 ` Gagandeep Singh
  2019-04-08 11:22   ` Gagandeep Singh
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 03/13] net/enetc: use correct buffer allocation API Gagandeep Singh
                   ` (11 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

First configure ring with BDs properly then enable
the ring.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: g.singh@nxp.com

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 7a9a97d..f1807b9 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -492,15 +492,15 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		       ENETC_RTBLENR_LEN(rx_ring->bd_count));
 
 	rx_ring->mb_pool = mb_pool;
-	/* enable ring */
-	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
-	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 	rx_ring->rcir = (void *)((size_t)hw->reg +
 			ENETC_BDR(RX, idx, ENETC_RBCIR));
 	enetc_refill_rx_ring(rx_ring, (enetc_bd_unused(rx_ring)));
 	buf_size = (uint16_t)(rte_pktmbuf_data_room_size(rx_ring->mb_pool) -
 		   RTE_PKTMBUF_HEADROOM);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBSR, buf_size);
+	/* enable ring */
+	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
+	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 }
 
 static int
-- 
1.9.1

^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 02/13] net/enetc: fix SMMU unhandled context fault
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 02/13] net/enetc: fix SMMU unhandled context fault Gagandeep Singh
@ 2019-04-08 11:22   ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

First configure ring with BDs properly then enable
the ring.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: g.singh@nxp.com

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 7a9a97d..f1807b9 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -492,15 +492,15 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		       ENETC_RTBLENR_LEN(rx_ring->bd_count));
 
 	rx_ring->mb_pool = mb_pool;
-	/* enable ring */
-	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
-	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 	rx_ring->rcir = (void *)((size_t)hw->reg +
 			ENETC_BDR(RX, idx, ENETC_RBCIR));
 	enetc_refill_rx_ring(rx_ring, (enetc_bd_unused(rx_ring)));
 	buf_size = (uint16_t)(rte_pktmbuf_data_room_size(rx_ring->mb_pool) -
 		   RTE_PKTMBUF_HEADROOM);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBSR, buf_size);
+	/* enable ring */
+	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
+	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 }
 
 static int
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 03/13] net/enetc: use correct buffer allocation API
  2019-04-08 11:22 [dpdk-dev] [PATCH 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                   ` (2 preceding siblings ...)
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 02/13] net/enetc: fix SMMU unhandled context fault Gagandeep Singh
@ 2019-04-08 11:22 ` Gagandeep Singh
  2019-04-08 11:22   ` Gagandeep Singh
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 04/13] net/enetc: set interface mode for SXGMII Gagandeep Singh
                   ` (10 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

rte_pktmbuf_alloc API should be used to allocate mbuf
instead of rte_pktmbuf_raw_alloc to avoid use of stale mbuf
information.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: g.singh@nxp.com

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_rxtx.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index a31a387..90d6979 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -89,7 +89,7 @@
 	rxbd = ENETC_RXBD(*rx_ring, i);
 	for (j = 0; j < buff_cnt; j++) {
 		rx_swbd->buffer_addr =
-			rte_cpu_to_le_64(rte_mbuf_raw_alloc(rx_ring->mb_pool));
+			rte_cpu_to_le_64(rte_pktmbuf_alloc(rx_ring->mb_pool));
 		rxbd->w.addr = (uint64_t)(uintptr_t)
 			       rx_swbd->buffer_addr->buf_iova +
 			       rx_swbd->buffer_addr->data_off;
-- 
1.9.1

^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 03/13] net/enetc: use correct buffer allocation API
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 03/13] net/enetc: use correct buffer allocation API Gagandeep Singh
@ 2019-04-08 11:22   ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

rte_pktmbuf_alloc API should be used to allocate mbuf
instead of rte_pktmbuf_raw_alloc to avoid use of stale mbuf
information.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: g.singh@nxp.com

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_rxtx.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index a31a387..90d6979 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -89,7 +89,7 @@
 	rxbd = ENETC_RXBD(*rx_ring, i);
 	for (j = 0; j < buff_cnt; j++) {
 		rx_swbd->buffer_addr =
-			rte_cpu_to_le_64(rte_mbuf_raw_alloc(rx_ring->mb_pool));
+			rte_cpu_to_le_64(rte_pktmbuf_alloc(rx_ring->mb_pool));
 		rxbd->w.addr = (uint64_t)(uintptr_t)
 			       rx_swbd->buffer_addr->buf_iova +
 			       rx_swbd->buffer_addr->data_off;
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 04/13] net/enetc: set interface mode for SXGMII
  2019-04-08 11:22 [dpdk-dev] [PATCH 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                   ` (3 preceding siblings ...)
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 03/13] net/enetc: use correct buffer allocation API Gagandeep Singh
@ 2019-04-08 11:22 ` Gagandeep Singh
  2019-04-08 11:22   ` Gagandeep Singh
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 05/13] net/enetc: add statistics APIs Gagandeep Singh
                   ` (9 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Support for SXGMII port has been enabled. It will
depends on boot loader information passed through IERB.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/base/enetc_hw.h | 13 ++++++++++++-
 drivers/net/enetc/enetc_ethdev.c  | 11 +++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index f36fa11..e3738a6 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #ifndef _ENETC_HW_H_
@@ -84,6 +84,12 @@
 #define ENETC_PSIPMAR1(n)		(0x00104 + (n) * 0x20)
 #define ENETC_PCAPR0			0x00900
 #define ENETC_PCAPR1			0x00904
+#define ENETC_PM0_IF_MODE		0x8300
+#define ENETC_PM1_IF_MODE		0x9300
+#define ENETC_PMO_IFM_RG		BIT(2)
+#define ENETC_PM0_IFM_RLP		(BIT(5) | BIT(11))
+#define ENETC_PM0_IFM_RGAUTO		(BIT(15) | ENETC_PMO_IFM_RG | BIT(1))
+#define ENETC_PM0_IFM_XGMII		BIT(12)
 
 #define ENETC_PV0CFGR(n)		(0x00920 + (n) * 0x10)
 #define ENETC_PVCFGR_SET_TXBDR(val)	((val) & 0xff)
@@ -109,6 +115,11 @@
 #define ENETC_G_EIPBRR0			0x00bf8
 #define ENETC_G_EIPBRR1			0x00bfc
 
+
+/* MAC Counters */
+#define ENETC_G_EPFBLPR(n)		(0xd00 + 4 * (n))
+#define ENETC_G_EPFBLPR1_XGMII		0x80000000
+
 /* general register accessors */
 #define enetc_rd_reg(reg)	rte_read32((void *)(reg))
 #define enetc_wr_reg(reg, val)	rte_write32((val), (void *)(reg))
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index f1807b9..91e9692 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -139,6 +139,17 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
 			val | ENETC_PMR_EN);
 
+	/* set auto-speed for RGMII */
+	if (enetc_port_rd(&hw->hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
+		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+	}
+	if (enetc_global_rd(&hw->hw,
+			    ENETC_G_EPFBLPR(1)) == ENETC_G_EPFBLPR1_XGMII) {
+		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_XGMII);
+	}
+
 	return 0;
 }
 
-- 
1.9.1

^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 04/13] net/enetc: set interface mode for SXGMII
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 04/13] net/enetc: set interface mode for SXGMII Gagandeep Singh
@ 2019-04-08 11:22   ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Support for SXGMII port has been enabled. It will
depends on boot loader information passed through IERB.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/base/enetc_hw.h | 13 ++++++++++++-
 drivers/net/enetc/enetc_ethdev.c  | 11 +++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index f36fa11..e3738a6 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #ifndef _ENETC_HW_H_
@@ -84,6 +84,12 @@
 #define ENETC_PSIPMAR1(n)		(0x00104 + (n) * 0x20)
 #define ENETC_PCAPR0			0x00900
 #define ENETC_PCAPR1			0x00904
+#define ENETC_PM0_IF_MODE		0x8300
+#define ENETC_PM1_IF_MODE		0x9300
+#define ENETC_PMO_IFM_RG		BIT(2)
+#define ENETC_PM0_IFM_RLP		(BIT(5) | BIT(11))
+#define ENETC_PM0_IFM_RGAUTO		(BIT(15) | ENETC_PMO_IFM_RG | BIT(1))
+#define ENETC_PM0_IFM_XGMII		BIT(12)
 
 #define ENETC_PV0CFGR(n)		(0x00920 + (n) * 0x10)
 #define ENETC_PVCFGR_SET_TXBDR(val)	((val) & 0xff)
@@ -109,6 +115,11 @@
 #define ENETC_G_EIPBRR0			0x00bf8
 #define ENETC_G_EIPBRR1			0x00bfc
 
+
+/* MAC Counters */
+#define ENETC_G_EPFBLPR(n)		(0xd00 + 4 * (n))
+#define ENETC_G_EPFBLPR1_XGMII		0x80000000
+
 /* general register accessors */
 #define enetc_rd_reg(reg)	rte_read32((void *)(reg))
 #define enetc_wr_reg(reg, val)	rte_write32((val), (void *)(reg))
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index f1807b9..91e9692 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -139,6 +139,17 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
 			val | ENETC_PMR_EN);
 
+	/* set auto-speed for RGMII */
+	if (enetc_port_rd(&hw->hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
+		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+	}
+	if (enetc_global_rd(&hw->hw,
+			    ENETC_G_EPFBLPR(1)) == ENETC_G_EPFBLPR1_XGMII) {
+		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_XGMII);
+	}
+
 	return 0;
 }
 
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 05/13] net/enetc: add statistics APIs
  2019-04-08 11:22 [dpdk-dev] [PATCH 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                   ` (4 preceding siblings ...)
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 04/13] net/enetc: set interface mode for SXGMII Gagandeep Singh
@ 2019-04-08 11:22 ` Gagandeep Singh
  2019-04-08 11:22   ` Gagandeep Singh
  2019-04-08 11:35   ` David Marchand
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 06/13] net/enetc: replace register read/write macros with functions Gagandeep Singh
                   ` (8 subsequent siblings)
  14 siblings, 2 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Add basic statistics APIs enetc_stats_get
and enetc_stats_reset.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  1 +
 drivers/net/enetc/base/enetc_hw.h  | 27 +++++++++++++++++++++-
 drivers/net/enetc/enetc_ethdev.c   | 46 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 74 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 8038bf2..9f575d2 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -46,6 +46,7 @@ ENETC Features
 
 - Link Status
 - Packet type information
+- Basic stats
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 69476a2..d8bd567 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -6,6 +6,7 @@
 [Features]
 Packet type parsing  = Y
 Link status          = Y
+Basic stats          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index e3738a6..3f0a2a9 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -115,8 +115,33 @@
 #define ENETC_G_EIPBRR0			0x00bf8
 #define ENETC_G_EIPBRR1			0x00bfc
 
-
 /* MAC Counters */
+/* Config register to reset counters*/
+#define ENETC_PM0_STAT_CONFIG		0x080E0
+/* Receive frames counter without error */
+#define ENETC_PM0_RFRM			0x08120
+/* Receive packets counter, good + bad */
+#define ENETC_PM0_RPKT			0x08160
+/* Received octets, good + bad */
+#define ENETC_PM0_REOCT			0x08120
+/* Transmit octets, good + bad */
+#define ENETC_PM0_TEOCT			0x08200
+/* Transmit frames counter without error */
+#define ENETC_PM0_TFRM			0x08220
+/* Transmit packets counter, good + bad */
+#define ENETC_PM0_TPKT			0x08260
+/* Dropped not Truncated packets counter */
+#define ENETC_PM0_RDRNTP		0x081C8
+/* Dropped + trucated packets counter */
+#define ENETC_PM0_RDRP			0x08158
+/* Receive packets error counter */
+#define ENETC_PM0_RERR			0x08138
+/* Transmit packets error counter */
+#define ENETC_PM0_TERR			0x08238
+
+/* Stats Reset Bit*/
+#define ENETC_CLEAR_STATS		BIT(2)
+
 #define ENETC_G_EPFBLPR(n)		(0xd00 + 4 * (n))
 #define ENETC_G_EPFBLPR1_XGMII		0x80000000
 
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 91e9692..99c2ce7 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -29,6 +29,9 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		const struct rte_eth_txconf *tx_conf);
 static void enetc_tx_queue_release(void *txq);
 static const uint32_t *enetc_supported_ptypes_get(struct rte_eth_dev *dev);
+static int enetc_stats_get(struct rte_eth_dev *dev,
+		struct rte_eth_stats *stats);
+static void enetc_stats_reset(struct rte_eth_dev *dev);
 
 /*
  * The set of PCI devices this driver supports
@@ -46,6 +49,8 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	.dev_stop             = enetc_dev_stop,
 	.dev_close            = enetc_dev_close,
 	.link_update          = enetc_link_update,
+	.stats_get            = enetc_stats_get,
+	.stats_reset          = enetc_stats_reset,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
@@ -608,6 +613,47 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	rte_free(rx_ring);
 }
 
+static
+int enetc_stats_get(struct rte_eth_dev *dev,
+		    struct rte_eth_stats *stats)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	if (stats == NULL)
+		return -1;
+
+	memset(stats, 0, sizeof(struct rte_eth_stats));
+
+	/* Total received packets, bad + good, if we want to get counters of
+	 * only good received packets then use ENETC_PM0_RFRM,
+	 * ENETC_PM0_TFRM registers.
+	 */
+	stats->ipackets = enetc_port_rd(enetc_hw, ENETC_PM0_RPKT);
+	stats->opackets = enetc_port_rd(enetc_hw, ENETC_PM0_TPKT);
+	stats->ibytes =  enetc_port_rd(enetc_hw, ENETC_PM0_REOCT);
+	stats->obytes = enetc_port_rd(enetc_hw, ENETC_PM0_TEOCT);
+	/* Dropped + Truncated packets, use ENETC_PM0_RDRNTP for without
+	 * truncated packets
+	 */
+	stats->imissed = enetc_port_rd(enetc_hw, ENETC_PM0_RDRP);
+	stats->ierrors = enetc_port_rd(enetc_hw, ENETC_PM0_RERR);
+	stats->oerrors = enetc_port_rd(enetc_hw, ENETC_PM0_TERR);
+
+	return 0;
+}
+
+static void
+enetc_stats_reset(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	enetc_port_wr(enetc_hw, ENETC_PM0_STAT_CONFIG, ENETC_CLEAR_STATS);
+}
+
 static int
 enetc_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 			   struct rte_pci_device *pci_dev)
-- 
1.9.1

^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 05/13] net/enetc: add statistics APIs
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 05/13] net/enetc: add statistics APIs Gagandeep Singh
@ 2019-04-08 11:22   ` Gagandeep Singh
  2019-04-08 11:35   ` David Marchand
  1 sibling, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Add basic statistics APIs enetc_stats_get
and enetc_stats_reset.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  1 +
 drivers/net/enetc/base/enetc_hw.h  | 27 +++++++++++++++++++++-
 drivers/net/enetc/enetc_ethdev.c   | 46 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 74 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 8038bf2..9f575d2 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -46,6 +46,7 @@ ENETC Features
 
 - Link Status
 - Packet type information
+- Basic stats
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 69476a2..d8bd567 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -6,6 +6,7 @@
 [Features]
 Packet type parsing  = Y
 Link status          = Y
+Basic stats          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index e3738a6..3f0a2a9 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -115,8 +115,33 @@
 #define ENETC_G_EIPBRR0			0x00bf8
 #define ENETC_G_EIPBRR1			0x00bfc
 
-
 /* MAC Counters */
+/* Config register to reset counters*/
+#define ENETC_PM0_STAT_CONFIG		0x080E0
+/* Receive frames counter without error */
+#define ENETC_PM0_RFRM			0x08120
+/* Receive packets counter, good + bad */
+#define ENETC_PM0_RPKT			0x08160
+/* Received octets, good + bad */
+#define ENETC_PM0_REOCT			0x08120
+/* Transmit octets, good + bad */
+#define ENETC_PM0_TEOCT			0x08200
+/* Transmit frames counter without error */
+#define ENETC_PM0_TFRM			0x08220
+/* Transmit packets counter, good + bad */
+#define ENETC_PM0_TPKT			0x08260
+/* Dropped not Truncated packets counter */
+#define ENETC_PM0_RDRNTP		0x081C8
+/* Dropped + trucated packets counter */
+#define ENETC_PM0_RDRP			0x08158
+/* Receive packets error counter */
+#define ENETC_PM0_RERR			0x08138
+/* Transmit packets error counter */
+#define ENETC_PM0_TERR			0x08238
+
+/* Stats Reset Bit*/
+#define ENETC_CLEAR_STATS		BIT(2)
+
 #define ENETC_G_EPFBLPR(n)		(0xd00 + 4 * (n))
 #define ENETC_G_EPFBLPR1_XGMII		0x80000000
 
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 91e9692..99c2ce7 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -29,6 +29,9 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		const struct rte_eth_txconf *tx_conf);
 static void enetc_tx_queue_release(void *txq);
 static const uint32_t *enetc_supported_ptypes_get(struct rte_eth_dev *dev);
+static int enetc_stats_get(struct rte_eth_dev *dev,
+		struct rte_eth_stats *stats);
+static void enetc_stats_reset(struct rte_eth_dev *dev);
 
 /*
  * The set of PCI devices this driver supports
@@ -46,6 +49,8 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	.dev_stop             = enetc_dev_stop,
 	.dev_close            = enetc_dev_close,
 	.link_update          = enetc_link_update,
+	.stats_get            = enetc_stats_get,
+	.stats_reset          = enetc_stats_reset,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
@@ -608,6 +613,47 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	rte_free(rx_ring);
 }
 
+static
+int enetc_stats_get(struct rte_eth_dev *dev,
+		    struct rte_eth_stats *stats)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	if (stats == NULL)
+		return -1;
+
+	memset(stats, 0, sizeof(struct rte_eth_stats));
+
+	/* Total received packets, bad + good, if we want to get counters of
+	 * only good received packets then use ENETC_PM0_RFRM,
+	 * ENETC_PM0_TFRM registers.
+	 */
+	stats->ipackets = enetc_port_rd(enetc_hw, ENETC_PM0_RPKT);
+	stats->opackets = enetc_port_rd(enetc_hw, ENETC_PM0_TPKT);
+	stats->ibytes =  enetc_port_rd(enetc_hw, ENETC_PM0_REOCT);
+	stats->obytes = enetc_port_rd(enetc_hw, ENETC_PM0_TEOCT);
+	/* Dropped + Truncated packets, use ENETC_PM0_RDRNTP for without
+	 * truncated packets
+	 */
+	stats->imissed = enetc_port_rd(enetc_hw, ENETC_PM0_RDRP);
+	stats->ierrors = enetc_port_rd(enetc_hw, ENETC_PM0_RERR);
+	stats->oerrors = enetc_port_rd(enetc_hw, ENETC_PM0_TERR);
+
+	return 0;
+}
+
+static void
+enetc_stats_reset(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	enetc_port_wr(enetc_hw, ENETC_PM0_STAT_CONFIG, ENETC_CLEAR_STATS);
+}
+
 static int
 enetc_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 			   struct rte_pci_device *pci_dev)
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 06/13] net/enetc: replace register read/write macros with functions
  2019-04-08 11:22 [dpdk-dev] [PATCH 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                   ` (5 preceding siblings ...)
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 05/13] net/enetc: add statistics APIs Gagandeep Singh
@ 2019-04-08 11:22 ` Gagandeep Singh
  2019-04-08 11:22   ` Gagandeep Singh
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 07/13] net/enetc: remove forward declarations Gagandeep Singh
                   ` (7 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Replacing read-write macros with already available
read-write functions.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc.h        |  7 +----
 drivers/net/enetc/enetc_ethdev.c | 61 ++++++++++++++++++++--------------------
 2 files changed, 31 insertions(+), 37 deletions(-)

diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index 0e80d1c..56454dc 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #ifndef _ENETC_H_
@@ -86,11 +86,6 @@ struct enetc_eth_adapter {
 #define ENETC_DEV_PRIVATE_TO_INTR(adapter) \
 	(&((struct enetc_eth_adapter *)adapter)->intr)
 
-#define ENETC_GET_HW_ADDR(reg, addr) ((void *)(((size_t)reg) + (addr)))
-#define ENETC_REG_READ(addr) (*(uint32_t *)addr)
-#define ENETC_REG_WRITE(addr, val) (*(uint32_t *)addr = val)
-#define ENETC_REG_WRITE_RELAXED(addr, val) (*(uint32_t *)addr = val)
-
 /*
  * RX/TX ENETC function prototypes
  */
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 99c2ce7..d403d7a 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -131,28 +131,31 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	uint32_t val;
 
 	PMD_INIT_FUNC_TRACE();
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-			     ENETC_PM0_CMD_CFG));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PM0_CMD_CFG),
-			val | ENETC_PM0_TX_EN | ENETC_PM0_RX_EN);
+	val = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+	enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG,
+		      val | ENETC_PM0_TX_EN | ENETC_PM0_RX_EN);
 
 	/* Enable port */
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
-			val | ENETC_PMR_EN);
+	val = enetc_port_rd(enetc_hw, ENETC_PMR);
+	enetc_port_wr(enetc_hw, ENETC_PMR, val | ENETC_PMR_EN);
 
 	/* set auto-speed for RGMII */
-	if (enetc_port_rd(&hw->hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
-		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_RGAUTO);
-		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+	if (enetc_port_rd(enetc_hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
+		enetc_port_wr(enetc_hw, ENETC_PM0_IF_MODE,
+			      ENETC_PM0_IFM_RGAUTO);
+		enetc_port_wr(enetc_hw, ENETC_PM1_IF_MODE,
+			      ENETC_PM0_IFM_RGAUTO);
 	}
-	if (enetc_global_rd(&hw->hw,
+	if (enetc_global_rd(enetc_hw,
 			    ENETC_G_EPFBLPR(1)) == ENETC_G_EPFBLPR1_XGMII) {
-		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_XGMII);
-		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(enetc_hw, ENETC_PM0_IF_MODE,
+			      ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(enetc_hw, ENETC_PM1_IF_MODE,
+			      ENETC_PM0_IFM_XGMII);
 	}
 
 	return 0;
@@ -163,18 +166,17 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	uint32_t val;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Disable port */
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
-			val & (~ENETC_PMR_EN));
-
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-			     ENETC_PM0_CMD_CFG));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PM0_CMD_CFG),
-			val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
+	val = enetc_port_rd(enetc_hw, ENETC_PMR);
+	enetc_port_wr(enetc_hw, ENETC_PMR, val & (~ENETC_PMR_EN));
+
+	val = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+	enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG,
+		      val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
 }
 
 static void
@@ -221,6 +223,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	struct rte_eth_link link;
 	uint32_t status;
 
@@ -228,8 +231,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 
 	memset(&link, 0, sizeof(link));
 
-	status = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-				ENETC_PM0_STATUS));
+	status = enetc_port_rd(enetc_hw, ENETC_PM0_STATUS);
 
 	if (status & ENETC_LINK_MODE)
 		link.link_duplex = ETH_LINK_FULL_DUPLEX;
@@ -262,6 +264,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 enetc_hardware_init(struct enetc_eth_hw *hw)
 {
 	uint32_t psipmr = 0;
+	struct enetc_hw *enetc_hw = &hw->hw;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Calculating and storing the base HW addresses */
@@ -269,8 +272,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 	hw->hw.global = (void *)((size_t)hw->hw.reg + ENETC_GLOBAL_BASE);
 
 	/* Enabling Station Interface */
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.reg, ENETC_SIMR),
-					  ENETC_SIMR_EN);
+	enetc_wr(enetc_hw, ENETC_SIMR, ENETC_SIMR_EN);
 
 	/* Setting to accept broadcast packets for each inetrface */
 	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0) |
@@ -280,14 +282,11 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 	psipmr |= ENETC_PSIPMR_SET_UP(2) | ENETC_PSIPMR_SET_MP(2) |
 		  ENETC_PSIPMR_SET_VLAN_MP(2);
 
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMR),
-			psipmr);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
 
 	/* Enabling broadcast address */
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMAR0(0)),
-			0xFFFFFFFF);
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMAR1(0)),
-			0xFFFF << 16);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMAR0(0), 0xFFFFFFFF);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMAR1(0), 0xFFFF << 16);
 
 	return 0;
 }
-- 
1.9.1

^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 06/13] net/enetc: replace register read/write macros with functions
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 06/13] net/enetc: replace register read/write macros with functions Gagandeep Singh
@ 2019-04-08 11:22   ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Replacing read-write macros with already available
read-write functions.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc.h        |  7 +----
 drivers/net/enetc/enetc_ethdev.c | 61 ++++++++++++++++++++--------------------
 2 files changed, 31 insertions(+), 37 deletions(-)

diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index 0e80d1c..56454dc 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #ifndef _ENETC_H_
@@ -86,11 +86,6 @@ struct enetc_eth_adapter {
 #define ENETC_DEV_PRIVATE_TO_INTR(adapter) \
 	(&((struct enetc_eth_adapter *)adapter)->intr)
 
-#define ENETC_GET_HW_ADDR(reg, addr) ((void *)(((size_t)reg) + (addr)))
-#define ENETC_REG_READ(addr) (*(uint32_t *)addr)
-#define ENETC_REG_WRITE(addr, val) (*(uint32_t *)addr = val)
-#define ENETC_REG_WRITE_RELAXED(addr, val) (*(uint32_t *)addr = val)
-
 /*
  * RX/TX ENETC function prototypes
  */
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 99c2ce7..d403d7a 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -131,28 +131,31 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	uint32_t val;
 
 	PMD_INIT_FUNC_TRACE();
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-			     ENETC_PM0_CMD_CFG));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PM0_CMD_CFG),
-			val | ENETC_PM0_TX_EN | ENETC_PM0_RX_EN);
+	val = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+	enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG,
+		      val | ENETC_PM0_TX_EN | ENETC_PM0_RX_EN);
 
 	/* Enable port */
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
-			val | ENETC_PMR_EN);
+	val = enetc_port_rd(enetc_hw, ENETC_PMR);
+	enetc_port_wr(enetc_hw, ENETC_PMR, val | ENETC_PMR_EN);
 
 	/* set auto-speed for RGMII */
-	if (enetc_port_rd(&hw->hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
-		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_RGAUTO);
-		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+	if (enetc_port_rd(enetc_hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
+		enetc_port_wr(enetc_hw, ENETC_PM0_IF_MODE,
+			      ENETC_PM0_IFM_RGAUTO);
+		enetc_port_wr(enetc_hw, ENETC_PM1_IF_MODE,
+			      ENETC_PM0_IFM_RGAUTO);
 	}
-	if (enetc_global_rd(&hw->hw,
+	if (enetc_global_rd(enetc_hw,
 			    ENETC_G_EPFBLPR(1)) == ENETC_G_EPFBLPR1_XGMII) {
-		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_XGMII);
-		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(enetc_hw, ENETC_PM0_IF_MODE,
+			      ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(enetc_hw, ENETC_PM1_IF_MODE,
+			      ENETC_PM0_IFM_XGMII);
 	}
 
 	return 0;
@@ -163,18 +166,17 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	uint32_t val;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Disable port */
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
-			val & (~ENETC_PMR_EN));
-
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-			     ENETC_PM0_CMD_CFG));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PM0_CMD_CFG),
-			val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
+	val = enetc_port_rd(enetc_hw, ENETC_PMR);
+	enetc_port_wr(enetc_hw, ENETC_PMR, val & (~ENETC_PMR_EN));
+
+	val = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+	enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG,
+		      val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
 }
 
 static void
@@ -221,6 +223,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	struct rte_eth_link link;
 	uint32_t status;
 
@@ -228,8 +231,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 
 	memset(&link, 0, sizeof(link));
 
-	status = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-				ENETC_PM0_STATUS));
+	status = enetc_port_rd(enetc_hw, ENETC_PM0_STATUS);
 
 	if (status & ENETC_LINK_MODE)
 		link.link_duplex = ETH_LINK_FULL_DUPLEX;
@@ -262,6 +264,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 enetc_hardware_init(struct enetc_eth_hw *hw)
 {
 	uint32_t psipmr = 0;
+	struct enetc_hw *enetc_hw = &hw->hw;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Calculating and storing the base HW addresses */
@@ -269,8 +272,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 	hw->hw.global = (void *)((size_t)hw->hw.reg + ENETC_GLOBAL_BASE);
 
 	/* Enabling Station Interface */
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.reg, ENETC_SIMR),
-					  ENETC_SIMR_EN);
+	enetc_wr(enetc_hw, ENETC_SIMR, ENETC_SIMR_EN);
 
 	/* Setting to accept broadcast packets for each inetrface */
 	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0) |
@@ -280,14 +282,11 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 	psipmr |= ENETC_PSIPMR_SET_UP(2) | ENETC_PSIPMR_SET_MP(2) |
 		  ENETC_PSIPMR_SET_VLAN_MP(2);
 
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMR),
-			psipmr);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
 
 	/* Enabling broadcast address */
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMAR0(0)),
-			0xFFFFFFFF);
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMAR1(0)),
-			0xFFFF << 16);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMAR0(0), 0xFFFFFFFF);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMAR1(0), 0xFFFF << 16);
 
 	return 0;
 }
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 07/13] net/enetc: remove forward declarations
  2019-04-08 11:22 [dpdk-dev] [PATCH 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                   ` (6 preceding siblings ...)
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 06/13] net/enetc: replace register read/write macros with functions Gagandeep Singh
@ 2019-04-08 11:22 ` Gagandeep Singh
  2019-04-08 11:22   ` Gagandeep Singh
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 08/13] net/enetc: enable promiscuous and allmulticast feature Gagandeep Singh
                   ` (6 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Remove unneeded forward declarations and re-order the code.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 237 ++++++++++++++++++---------------------
 1 file changed, 107 insertions(+), 130 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index d403d7a..f8b9510 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -10,115 +10,6 @@
 
 int enetc_logtype_pmd;
 
-/* Functions Prototypes */
-static int enetc_dev_configure(struct rte_eth_dev *dev);
-static int enetc_dev_start(struct rte_eth_dev *dev);
-static void enetc_dev_stop(struct rte_eth_dev *dev);
-static void enetc_dev_close(struct rte_eth_dev *dev);
-static void enetc_dev_infos_get(struct rte_eth_dev *dev,
-				struct rte_eth_dev_info *dev_info);
-static int enetc_link_update(struct rte_eth_dev *dev, int wait_to_complete);
-static int enetc_hardware_init(struct enetc_eth_hw *hw);
-static int enetc_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id,
-		uint16_t nb_rx_desc, unsigned int socket_id,
-		const struct rte_eth_rxconf *rx_conf,
-		struct rte_mempool *mb_pool);
-static void enetc_rx_queue_release(void *rxq);
-static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
-		uint16_t nb_tx_desc, unsigned int socket_id,
-		const struct rte_eth_txconf *tx_conf);
-static void enetc_tx_queue_release(void *txq);
-static const uint32_t *enetc_supported_ptypes_get(struct rte_eth_dev *dev);
-static int enetc_stats_get(struct rte_eth_dev *dev,
-		struct rte_eth_stats *stats);
-static void enetc_stats_reset(struct rte_eth_dev *dev);
-
-/*
- * The set of PCI devices this driver supports
- */
-static const struct rte_pci_id pci_id_enetc_map[] = {
-	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID) },
-	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID_VF) },
-	{ .vendor_id = 0, /* sentinel */ },
-};
-
-/* Features supported by this driver */
-static const struct eth_dev_ops enetc_ops = {
-	.dev_configure        = enetc_dev_configure,
-	.dev_start            = enetc_dev_start,
-	.dev_stop             = enetc_dev_stop,
-	.dev_close            = enetc_dev_close,
-	.link_update          = enetc_link_update,
-	.stats_get            = enetc_stats_get,
-	.stats_reset          = enetc_stats_reset,
-	.dev_infos_get        = enetc_dev_infos_get,
-	.rx_queue_setup       = enetc_rx_queue_setup,
-	.rx_queue_release     = enetc_rx_queue_release,
-	.tx_queue_setup       = enetc_tx_queue_setup,
-	.tx_queue_release     = enetc_tx_queue_release,
-	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
-};
-
-/**
- * Initialisation of the enetc device
- *
- * @param eth_dev
- *   - Pointer to the structure rte_eth_dev
- *
- * @return
- *   - On success, zero.
- *   - On failure, negative value.
- */
-static int
-enetc_dev_init(struct rte_eth_dev *eth_dev)
-{
-	int error = 0;
-	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
-	struct enetc_eth_hw *hw =
-		ENETC_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
-
-	PMD_INIT_FUNC_TRACE();
-	eth_dev->dev_ops = &enetc_ops;
-	eth_dev->rx_pkt_burst = &enetc_recv_pkts;
-	eth_dev->tx_pkt_burst = &enetc_xmit_pkts;
-
-	/* Retrieving and storing the HW base address of device */
-	hw->hw.reg = (void *)pci_dev->mem_resource[0].addr;
-	hw->device_id = pci_dev->id.device_id;
-
-	error = enetc_hardware_init(hw);
-	if (error != 0) {
-		ENETC_PMD_ERR("Hardware initialization failed");
-		return -1;
-	}
-
-	/* Allocate memory for storing MAC addresses */
-	eth_dev->data->mac_addrs = rte_zmalloc("enetc_eth", ETHER_ADDR_LEN, 0);
-	if (!eth_dev->data->mac_addrs) {
-		ENETC_PMD_ERR("Failed to allocate %d bytes needed to "
-			      "store MAC addresses",
-			      ETHER_ADDR_LEN * 1);
-		error = -ENOMEM;
-		return -1;
-	}
-
-	/* Copy the permanent MAC address */
-	ether_addr_copy((struct ether_addr *)hw->mac.addr,
-			&eth_dev->data->mac_addrs[0]);
-
-	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
-			eth_dev->data->port_id, pci_dev->id.vendor_id,
-			pci_dev->id.device_id);
-	return 0;
-}
-
-static int
-enetc_dev_uninit(struct rte_eth_dev *eth_dev __rte_unused)
-{
-	PMD_INIT_FUNC_TRACE();
-	return 0;
-}
-
 static int
 enetc_dev_configure(struct rte_eth_dev *dev __rte_unused)
 {
@@ -179,27 +70,6 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 		      val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
 }
 
-static void
-enetc_dev_close(struct rte_eth_dev *dev)
-{
-	uint16_t i;
-
-	PMD_INIT_FUNC_TRACE();
-	enetc_dev_stop(dev);
-
-	for (i = 0; i < dev->data->nb_rx_queues; i++) {
-		enetc_rx_queue_release(dev->data->rx_queues[i]);
-		dev->data->rx_queues[i] = NULL;
-	}
-	dev->data->nb_rx_queues = 0;
-
-	for (i = 0; i < dev->data->nb_tx_queues; i++) {
-		enetc_tx_queue_release(dev->data->tx_queues[i]);
-		dev->data->tx_queues[i] = NULL;
-	}
-	dev->data->nb_tx_queues = 0;
-}
-
 static const uint32_t *
 enetc_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)
 {
@@ -653,6 +523,113 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	enetc_port_wr(enetc_hw, ENETC_PM0_STAT_CONFIG, ENETC_CLEAR_STATS);
 }
 
+static void
+enetc_dev_close(struct rte_eth_dev *dev)
+{
+	uint16_t i;
+
+	PMD_INIT_FUNC_TRACE();
+	enetc_dev_stop(dev);
+
+	for (i = 0; i < dev->data->nb_rx_queues; i++) {
+		enetc_rx_queue_release(dev->data->rx_queues[i]);
+		dev->data->rx_queues[i] = NULL;
+	}
+	dev->data->nb_rx_queues = 0;
+
+	for (i = 0; i < dev->data->nb_tx_queues; i++) {
+		enetc_tx_queue_release(dev->data->tx_queues[i]);
+		dev->data->tx_queues[i] = NULL;
+	}
+	dev->data->nb_tx_queues = 0;
+}
+
+/*
+ * The set of PCI devices this driver supports
+ */
+static const struct rte_pci_id pci_id_enetc_map[] = {
+	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID) },
+	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID_VF) },
+	{ .vendor_id = 0, /* sentinel */ },
+};
+
+/* Features supported by this driver */
+static const struct eth_dev_ops enetc_ops = {
+	.dev_configure        = enetc_dev_configure,
+	.dev_start            = enetc_dev_start,
+	.dev_stop             = enetc_dev_stop,
+	.dev_close            = enetc_dev_close,
+	.link_update          = enetc_link_update,
+	.stats_get            = enetc_stats_get,
+	.stats_reset          = enetc_stats_reset,
+	.dev_infos_get        = enetc_dev_infos_get,
+	.rx_queue_setup       = enetc_rx_queue_setup,
+	.rx_queue_release     = enetc_rx_queue_release,
+	.tx_queue_setup       = enetc_tx_queue_setup,
+	.tx_queue_release     = enetc_tx_queue_release,
+	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
+};
+
+/**
+ * Initialisation of the enetc device
+ *
+ * @param eth_dev
+ *   - Pointer to the structure rte_eth_dev
+ *
+ * @return
+ *   - On success, zero.
+ *   - On failure, negative value.
+ */
+static int
+enetc_dev_init(struct rte_eth_dev *eth_dev)
+{
+	int error = 0;
+	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
+
+	PMD_INIT_FUNC_TRACE();
+	eth_dev->dev_ops = &enetc_ops;
+	eth_dev->rx_pkt_burst = &enetc_recv_pkts;
+	eth_dev->tx_pkt_burst = &enetc_xmit_pkts;
+
+	/* Retrieving and storing the HW base address of device */
+	hw->hw.reg = (void *)pci_dev->mem_resource[0].addr;
+	hw->device_id = pci_dev->id.device_id;
+
+	error = enetc_hardware_init(hw);
+	if (error != 0) {
+		ENETC_PMD_ERR("Hardware initialization failed");
+		return -1;
+	}
+
+	/* Allocate memory for storing MAC addresses */
+	eth_dev->data->mac_addrs = rte_zmalloc("enetc_eth", ETHER_ADDR_LEN, 0);
+	if (!eth_dev->data->mac_addrs) {
+		ENETC_PMD_ERR("Failed to allocate %d bytes needed to "
+			      "store MAC addresses",
+			      ETHER_ADDR_LEN * 1);
+		error = -ENOMEM;
+		return -1;
+	}
+
+	/* Copy the permanent MAC address */
+	ether_addr_copy((struct ether_addr *)hw->mac.addr,
+			&eth_dev->data->mac_addrs[0]);
+
+	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
+			eth_dev->data->port_id, pci_dev->id.vendor_id,
+			pci_dev->id.device_id);
+	return 0;
+}
+
+static int
+enetc_dev_uninit(struct rte_eth_dev *eth_dev __rte_unused)
+{
+	PMD_INIT_FUNC_TRACE();
+	return 0;
+}
+
 static int
 enetc_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 			   struct rte_pci_device *pci_dev)
-- 
1.9.1

^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 07/13] net/enetc: remove forward declarations
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 07/13] net/enetc: remove forward declarations Gagandeep Singh
@ 2019-04-08 11:22   ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Remove unneeded forward declarations and re-order the code.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 237 ++++++++++++++++++---------------------
 1 file changed, 107 insertions(+), 130 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index d403d7a..f8b9510 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -10,115 +10,6 @@
 
 int enetc_logtype_pmd;
 
-/* Functions Prototypes */
-static int enetc_dev_configure(struct rte_eth_dev *dev);
-static int enetc_dev_start(struct rte_eth_dev *dev);
-static void enetc_dev_stop(struct rte_eth_dev *dev);
-static void enetc_dev_close(struct rte_eth_dev *dev);
-static void enetc_dev_infos_get(struct rte_eth_dev *dev,
-				struct rte_eth_dev_info *dev_info);
-static int enetc_link_update(struct rte_eth_dev *dev, int wait_to_complete);
-static int enetc_hardware_init(struct enetc_eth_hw *hw);
-static int enetc_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id,
-		uint16_t nb_rx_desc, unsigned int socket_id,
-		const struct rte_eth_rxconf *rx_conf,
-		struct rte_mempool *mb_pool);
-static void enetc_rx_queue_release(void *rxq);
-static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
-		uint16_t nb_tx_desc, unsigned int socket_id,
-		const struct rte_eth_txconf *tx_conf);
-static void enetc_tx_queue_release(void *txq);
-static const uint32_t *enetc_supported_ptypes_get(struct rte_eth_dev *dev);
-static int enetc_stats_get(struct rte_eth_dev *dev,
-		struct rte_eth_stats *stats);
-static void enetc_stats_reset(struct rte_eth_dev *dev);
-
-/*
- * The set of PCI devices this driver supports
- */
-static const struct rte_pci_id pci_id_enetc_map[] = {
-	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID) },
-	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID_VF) },
-	{ .vendor_id = 0, /* sentinel */ },
-};
-
-/* Features supported by this driver */
-static const struct eth_dev_ops enetc_ops = {
-	.dev_configure        = enetc_dev_configure,
-	.dev_start            = enetc_dev_start,
-	.dev_stop             = enetc_dev_stop,
-	.dev_close            = enetc_dev_close,
-	.link_update          = enetc_link_update,
-	.stats_get            = enetc_stats_get,
-	.stats_reset          = enetc_stats_reset,
-	.dev_infos_get        = enetc_dev_infos_get,
-	.rx_queue_setup       = enetc_rx_queue_setup,
-	.rx_queue_release     = enetc_rx_queue_release,
-	.tx_queue_setup       = enetc_tx_queue_setup,
-	.tx_queue_release     = enetc_tx_queue_release,
-	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
-};
-
-/**
- * Initialisation of the enetc device
- *
- * @param eth_dev
- *   - Pointer to the structure rte_eth_dev
- *
- * @return
- *   - On success, zero.
- *   - On failure, negative value.
- */
-static int
-enetc_dev_init(struct rte_eth_dev *eth_dev)
-{
-	int error = 0;
-	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
-	struct enetc_eth_hw *hw =
-		ENETC_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
-
-	PMD_INIT_FUNC_TRACE();
-	eth_dev->dev_ops = &enetc_ops;
-	eth_dev->rx_pkt_burst = &enetc_recv_pkts;
-	eth_dev->tx_pkt_burst = &enetc_xmit_pkts;
-
-	/* Retrieving and storing the HW base address of device */
-	hw->hw.reg = (void *)pci_dev->mem_resource[0].addr;
-	hw->device_id = pci_dev->id.device_id;
-
-	error = enetc_hardware_init(hw);
-	if (error != 0) {
-		ENETC_PMD_ERR("Hardware initialization failed");
-		return -1;
-	}
-
-	/* Allocate memory for storing MAC addresses */
-	eth_dev->data->mac_addrs = rte_zmalloc("enetc_eth", ETHER_ADDR_LEN, 0);
-	if (!eth_dev->data->mac_addrs) {
-		ENETC_PMD_ERR("Failed to allocate %d bytes needed to "
-			      "store MAC addresses",
-			      ETHER_ADDR_LEN * 1);
-		error = -ENOMEM;
-		return -1;
-	}
-
-	/* Copy the permanent MAC address */
-	ether_addr_copy((struct ether_addr *)hw->mac.addr,
-			&eth_dev->data->mac_addrs[0]);
-
-	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
-			eth_dev->data->port_id, pci_dev->id.vendor_id,
-			pci_dev->id.device_id);
-	return 0;
-}
-
-static int
-enetc_dev_uninit(struct rte_eth_dev *eth_dev __rte_unused)
-{
-	PMD_INIT_FUNC_TRACE();
-	return 0;
-}
-
 static int
 enetc_dev_configure(struct rte_eth_dev *dev __rte_unused)
 {
@@ -179,27 +70,6 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 		      val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
 }
 
-static void
-enetc_dev_close(struct rte_eth_dev *dev)
-{
-	uint16_t i;
-
-	PMD_INIT_FUNC_TRACE();
-	enetc_dev_stop(dev);
-
-	for (i = 0; i < dev->data->nb_rx_queues; i++) {
-		enetc_rx_queue_release(dev->data->rx_queues[i]);
-		dev->data->rx_queues[i] = NULL;
-	}
-	dev->data->nb_rx_queues = 0;
-
-	for (i = 0; i < dev->data->nb_tx_queues; i++) {
-		enetc_tx_queue_release(dev->data->tx_queues[i]);
-		dev->data->tx_queues[i] = NULL;
-	}
-	dev->data->nb_tx_queues = 0;
-}
-
 static const uint32_t *
 enetc_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)
 {
@@ -653,6 +523,113 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	enetc_port_wr(enetc_hw, ENETC_PM0_STAT_CONFIG, ENETC_CLEAR_STATS);
 }
 
+static void
+enetc_dev_close(struct rte_eth_dev *dev)
+{
+	uint16_t i;
+
+	PMD_INIT_FUNC_TRACE();
+	enetc_dev_stop(dev);
+
+	for (i = 0; i < dev->data->nb_rx_queues; i++) {
+		enetc_rx_queue_release(dev->data->rx_queues[i]);
+		dev->data->rx_queues[i] = NULL;
+	}
+	dev->data->nb_rx_queues = 0;
+
+	for (i = 0; i < dev->data->nb_tx_queues; i++) {
+		enetc_tx_queue_release(dev->data->tx_queues[i]);
+		dev->data->tx_queues[i] = NULL;
+	}
+	dev->data->nb_tx_queues = 0;
+}
+
+/*
+ * The set of PCI devices this driver supports
+ */
+static const struct rte_pci_id pci_id_enetc_map[] = {
+	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID) },
+	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID_VF) },
+	{ .vendor_id = 0, /* sentinel */ },
+};
+
+/* Features supported by this driver */
+static const struct eth_dev_ops enetc_ops = {
+	.dev_configure        = enetc_dev_configure,
+	.dev_start            = enetc_dev_start,
+	.dev_stop             = enetc_dev_stop,
+	.dev_close            = enetc_dev_close,
+	.link_update          = enetc_link_update,
+	.stats_get            = enetc_stats_get,
+	.stats_reset          = enetc_stats_reset,
+	.dev_infos_get        = enetc_dev_infos_get,
+	.rx_queue_setup       = enetc_rx_queue_setup,
+	.rx_queue_release     = enetc_rx_queue_release,
+	.tx_queue_setup       = enetc_tx_queue_setup,
+	.tx_queue_release     = enetc_tx_queue_release,
+	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
+};
+
+/**
+ * Initialisation of the enetc device
+ *
+ * @param eth_dev
+ *   - Pointer to the structure rte_eth_dev
+ *
+ * @return
+ *   - On success, zero.
+ *   - On failure, negative value.
+ */
+static int
+enetc_dev_init(struct rte_eth_dev *eth_dev)
+{
+	int error = 0;
+	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
+
+	PMD_INIT_FUNC_TRACE();
+	eth_dev->dev_ops = &enetc_ops;
+	eth_dev->rx_pkt_burst = &enetc_recv_pkts;
+	eth_dev->tx_pkt_burst = &enetc_xmit_pkts;
+
+	/* Retrieving and storing the HW base address of device */
+	hw->hw.reg = (void *)pci_dev->mem_resource[0].addr;
+	hw->device_id = pci_dev->id.device_id;
+
+	error = enetc_hardware_init(hw);
+	if (error != 0) {
+		ENETC_PMD_ERR("Hardware initialization failed");
+		return -1;
+	}
+
+	/* Allocate memory for storing MAC addresses */
+	eth_dev->data->mac_addrs = rte_zmalloc("enetc_eth", ETHER_ADDR_LEN, 0);
+	if (!eth_dev->data->mac_addrs) {
+		ENETC_PMD_ERR("Failed to allocate %d bytes needed to "
+			      "store MAC addresses",
+			      ETHER_ADDR_LEN * 1);
+		error = -ENOMEM;
+		return -1;
+	}
+
+	/* Copy the permanent MAC address */
+	ether_addr_copy((struct ether_addr *)hw->mac.addr,
+			&eth_dev->data->mac_addrs[0]);
+
+	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
+			eth_dev->data->port_id, pci_dev->id.vendor_id,
+			pci_dev->id.device_id);
+	return 0;
+}
+
+static int
+enetc_dev_uninit(struct rte_eth_dev *eth_dev __rte_unused)
+{
+	PMD_INIT_FUNC_TRACE();
+	return 0;
+}
+
 static int
 enetc_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 			   struct rte_pci_device *pci_dev)
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 08/13] net/enetc: enable promiscuous and allmulticast feature
  2019-04-08 11:22 [dpdk-dev] [PATCH 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                   ` (7 preceding siblings ...)
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 07/13] net/enetc: remove forward declarations Gagandeep Singh
@ 2019-04-08 11:22 ` Gagandeep Singh
  2019-04-08 11:22   ` Gagandeep Singh
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 09/13] net/enetc: add MTU update and jumbo frames support Gagandeep Singh
                   ` (5 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Promiscuous and allmulticast enable/disable APIs added.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  2 +
 doc/guides/nics/features/enetc.ini |  2 +
 drivers/net/enetc/base/enetc_hw.h  |  3 +-
 drivers/net/enetc/enetc_ethdev.c   | 90 ++++++++++++++++++++++++++++++++------
 4 files changed, 81 insertions(+), 16 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 9f575d2..ab13211 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -47,6 +47,8 @@ ENETC Features
 - Link Status
 - Packet type information
 - Basic stats
+- Promiscuous
+- Multicast
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index d8bd567..6b7bbfb 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -7,6 +7,8 @@
 Packet type parsing  = Y
 Link status          = Y
 Basic stats          = Y
+Promiscuous mode     = Y
+Allmulticast mode    = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 3f0a2a9..90a383a 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -78,8 +78,7 @@
 #define ENETC_PSR			0x00004 /* RO */
 #define ENETC_PSIPMR			0x00018
 #define ENETC_PSIPMR_SET_UP(n)		(0x1 << (n)) /* n = SI index */
-#define ENETC_PSIPMR_SET_MP(n)		(0x1 << ((n) + 8))
-#define ENETC_PSIPMR_SET_VLAN_MP(n)	(0x1 << ((n) + 16))
+#define ENETC_PSIPMR_SET_MP(n)		(0x1 << ((n) + 16))
 #define ENETC_PSIPMAR0(n)		(0x00100 + (n) * 0x20)
 #define ENETC_PSIPMAR1(n)		(0x00104 + (n) * 0x20)
 #define ENETC_PCAPR0			0x00900
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index f8b9510..0bb3b2c 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -133,8 +133,8 @@
 static int
 enetc_hardware_init(struct enetc_eth_hw *hw)
 {
-	uint32_t psipmr = 0;
 	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t *mac = (uint32_t *)hw->mac.addr;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Calculating and storing the base HW addresses */
@@ -144,19 +144,9 @@
 	/* Enabling Station Interface */
 	enetc_wr(enetc_hw, ENETC_SIMR, ENETC_SIMR_EN);
 
-	/* Setting to accept broadcast packets for each inetrface */
-	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0) |
-		  ENETC_PSIPMR_SET_VLAN_MP(0);
-	psipmr |= ENETC_PSIPMR_SET_UP(1) | ENETC_PSIPMR_SET_MP(1) |
-		  ENETC_PSIPMR_SET_VLAN_MP(1);
-	psipmr |= ENETC_PSIPMR_SET_UP(2) | ENETC_PSIPMR_SET_MP(2) |
-		  ENETC_PSIPMR_SET_VLAN_MP(2);
-
-	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
-
-	/* Enabling broadcast address */
-	enetc_port_wr(enetc_hw, ENETC_PSIPMAR0(0), 0xFFFFFFFF);
-	enetc_port_wr(enetc_hw, ENETC_PSIPMAR1(0), 0xFFFF << 16);
+	*mac = (uint32_t)enetc_port_rd(enetc_hw, ENETC_PSIPMAR0(0));
+	mac++;
+	*mac = (uint16_t)enetc_port_rd(enetc_hw, ENETC_PSIPMAR1(0));
 
 	return 0;
 }
@@ -544,6 +534,74 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	dev->data->nb_tx_queues = 0;
 }
 
+static void
+enetc_promiscuous_enable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+
+	/* Setting to enable promiscuous mode*/
+	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0);
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_promiscuous_disable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	/* Setting to disable promiscuous mode for SI0*/
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+	psipmr &= (~ENETC_PSIPMR_SET_UP(0));
+
+	if (dev->data->all_multicast == 0)
+		psipmr &= (~ENETC_PSIPMR_SET_MP(0));
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_allmulticast_enable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+
+	/* Setting to enable allmulticast mode for SI0*/
+	psipmr |= ENETC_PSIPMR_SET_MP(0);
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_allmulticast_disable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	if (dev->data->promiscuous == 1)
+		return; /* must remain in all_multicast mode */
+
+	/* Setting to disable all multicast mode for SI0*/
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR) &
+			       ~(ENETC_PSIPMR_SET_MP(0));
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -562,6 +620,10 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	.link_update          = enetc_link_update,
 	.stats_get            = enetc_stats_get,
 	.stats_reset          = enetc_stats_reset,
+	.promiscuous_enable   = enetc_promiscuous_enable,
+	.promiscuous_disable  = enetc_promiscuous_disable,
+	.allmulticast_enable  = enetc_allmulticast_enable,
+	.allmulticast_disable = enetc_allmulticast_disable,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
-- 
1.9.1

^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 08/13] net/enetc: enable promiscuous and allmulticast feature
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 08/13] net/enetc: enable promiscuous and allmulticast feature Gagandeep Singh
@ 2019-04-08 11:22   ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Promiscuous and allmulticast enable/disable APIs added.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  2 +
 doc/guides/nics/features/enetc.ini |  2 +
 drivers/net/enetc/base/enetc_hw.h  |  3 +-
 drivers/net/enetc/enetc_ethdev.c   | 90 ++++++++++++++++++++++++++++++++------
 4 files changed, 81 insertions(+), 16 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 9f575d2..ab13211 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -47,6 +47,8 @@ ENETC Features
 - Link Status
 - Packet type information
 - Basic stats
+- Promiscuous
+- Multicast
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index d8bd567..6b7bbfb 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -7,6 +7,8 @@
 Packet type parsing  = Y
 Link status          = Y
 Basic stats          = Y
+Promiscuous mode     = Y
+Allmulticast mode    = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 3f0a2a9..90a383a 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -78,8 +78,7 @@
 #define ENETC_PSR			0x00004 /* RO */
 #define ENETC_PSIPMR			0x00018
 #define ENETC_PSIPMR_SET_UP(n)		(0x1 << (n)) /* n = SI index */
-#define ENETC_PSIPMR_SET_MP(n)		(0x1 << ((n) + 8))
-#define ENETC_PSIPMR_SET_VLAN_MP(n)	(0x1 << ((n) + 16))
+#define ENETC_PSIPMR_SET_MP(n)		(0x1 << ((n) + 16))
 #define ENETC_PSIPMAR0(n)		(0x00100 + (n) * 0x20)
 #define ENETC_PSIPMAR1(n)		(0x00104 + (n) * 0x20)
 #define ENETC_PCAPR0			0x00900
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index f8b9510..0bb3b2c 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -133,8 +133,8 @@
 static int
 enetc_hardware_init(struct enetc_eth_hw *hw)
 {
-	uint32_t psipmr = 0;
 	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t *mac = (uint32_t *)hw->mac.addr;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Calculating and storing the base HW addresses */
@@ -144,19 +144,9 @@
 	/* Enabling Station Interface */
 	enetc_wr(enetc_hw, ENETC_SIMR, ENETC_SIMR_EN);
 
-	/* Setting to accept broadcast packets for each inetrface */
-	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0) |
-		  ENETC_PSIPMR_SET_VLAN_MP(0);
-	psipmr |= ENETC_PSIPMR_SET_UP(1) | ENETC_PSIPMR_SET_MP(1) |
-		  ENETC_PSIPMR_SET_VLAN_MP(1);
-	psipmr |= ENETC_PSIPMR_SET_UP(2) | ENETC_PSIPMR_SET_MP(2) |
-		  ENETC_PSIPMR_SET_VLAN_MP(2);
-
-	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
-
-	/* Enabling broadcast address */
-	enetc_port_wr(enetc_hw, ENETC_PSIPMAR0(0), 0xFFFFFFFF);
-	enetc_port_wr(enetc_hw, ENETC_PSIPMAR1(0), 0xFFFF << 16);
+	*mac = (uint32_t)enetc_port_rd(enetc_hw, ENETC_PSIPMAR0(0));
+	mac++;
+	*mac = (uint16_t)enetc_port_rd(enetc_hw, ENETC_PSIPMAR1(0));
 
 	return 0;
 }
@@ -544,6 +534,74 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	dev->data->nb_tx_queues = 0;
 }
 
+static void
+enetc_promiscuous_enable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+
+	/* Setting to enable promiscuous mode*/
+	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0);
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_promiscuous_disable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	/* Setting to disable promiscuous mode for SI0*/
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+	psipmr &= (~ENETC_PSIPMR_SET_UP(0));
+
+	if (dev->data->all_multicast == 0)
+		psipmr &= (~ENETC_PSIPMR_SET_MP(0));
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_allmulticast_enable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+
+	/* Setting to enable allmulticast mode for SI0*/
+	psipmr |= ENETC_PSIPMR_SET_MP(0);
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_allmulticast_disable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	if (dev->data->promiscuous == 1)
+		return; /* must remain in all_multicast mode */
+
+	/* Setting to disable all multicast mode for SI0*/
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR) &
+			       ~(ENETC_PSIPMR_SET_MP(0));
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -562,6 +620,10 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	.link_update          = enetc_link_update,
 	.stats_get            = enetc_stats_get,
 	.stats_reset          = enetc_stats_reset,
+	.promiscuous_enable   = enetc_promiscuous_enable,
+	.promiscuous_disable  = enetc_promiscuous_disable,
+	.allmulticast_enable  = enetc_allmulticast_enable,
+	.allmulticast_disable = enetc_allmulticast_disable,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 09/13] net/enetc: add MTU update and jumbo frames support
  2019-04-08 11:22 [dpdk-dev] [PATCH 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                   ` (8 preceding siblings ...)
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 08/13] net/enetc: enable promiscuous and allmulticast feature Gagandeep Singh
@ 2019-04-08 11:22 ` Gagandeep Singh
  2019-04-08 11:22   ` Gagandeep Singh
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 10/13] net/enetc: enable Rx-Tx queue start/stop feature Gagandeep Singh
                   ` (4 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Enable the jumbo frames and mtu update feature.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  2 +
 drivers/net/enetc/base/enetc_hw.h  |  6 ++-
 drivers/net/enetc/enetc.h          |  5 +++
 drivers/net/enetc/enetc_ethdev.c   | 86 ++++++++++++++++++++++++++++++++++----
 5 files changed, 91 insertions(+), 9 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index ab13211..eeb0752 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -49,6 +49,7 @@ ENETC Features
 - Basic stats
 - Promiscuous
 - Multicast
+- Jumbo packets
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 6b7bbfb..0eed2cb 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -9,6 +9,8 @@ Link status          = Y
 Basic stats          = Y
 Promiscuous mode     = Y
 Allmulticast mode    = Y
+MTU update           = Y
+Jumbo frame          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 90a383a..2eb1df3 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -99,7 +99,11 @@
 #define ENETC_PM0_RX_EN			BIT(1)
 
 #define ENETC_PM0_MAXFRM		0x08014
-#define ENETC_SET_MAXFRM(val)		((val) << 16)
+#define ENETC_SET_TX_MTU(val)		((val) << 16)
+#define ENETC_SET_MAXFRM(val)		((val) & 0xffff)
+#define ENETC_PTXMBAR			0x0608
+/* n = TC index [0..7] */
+#define ENETC_PTCMSDUR(n)		(0x2020 + (n) * 4)
 
 #define ENETC_PM0_STATUS		0x08304
 #define ENETC_LINK_MODE			0x0000000000080000ULL
diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index 56454dc..e494eb8 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -24,6 +24,11 @@
 /* BD ALIGN */
 #define BD_ALIGN       8
 
+/* minimum frame size supported */
+#define ENETC_MAC_MINFRM_SIZE	68
+/* maximum frame size supported */
+#define ENETC_MAC_MAXFRM_SIZE	9600
+
 /*
  * upper_32_bits - return bits 32-63 of a number
  * @n: the number we're accessing
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 0bb3b2c..4428678 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -11,13 +11,6 @@
 int enetc_logtype_pmd;
 
 static int
-enetc_dev_configure(struct rte_eth_dev *dev __rte_unused)
-{
-	PMD_INIT_FUNC_TRACE();
-	return 0;
-}
-
-static int
 enetc_dev_start(struct rte_eth_dev *dev)
 {
 	struct enetc_eth_hw *hw =
@@ -168,7 +161,8 @@
 	};
 	dev_info->max_rx_queues = MAX_RX_RINGS;
 	dev_info->max_tx_queues = MAX_TX_RINGS;
-	dev_info->max_rx_pktlen = 1500;
+	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
+	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_JUMBO_FRAME;
 }
 
 static int
@@ -602,6 +596,76 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
 }
 
+static int
+enetc_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
+
+	/* check that mtu is within the allowed range */
+	if (mtu < ENETC_MAC_MINFRM_SIZE || frame_size > ENETC_MAC_MAXFRM_SIZE)
+		return -EINVAL;
+
+	/*
+	 * Refuse mtu that requires the support of scattered packets
+	 * when this feature has not been enabled before.
+	 */
+	if (dev->data->min_rx_buf_size &&
+		!dev->data->scattered_rx && frame_size >
+		dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM) {
+		ENETC_PMD_ERR("SG not enabled, will not fit in one buffer");
+		return -EINVAL;
+	}
+
+	if (frame_size > ETHER_MAX_LEN)
+		dev->data->dev_conf.rxmode.offloads &=
+						DEV_RX_OFFLOAD_JUMBO_FRAME;
+	else
+		dev->data->dev_conf.rxmode.offloads &=
+						~DEV_RX_OFFLOAD_JUMBO_FRAME;
+
+	enetc_port_wr(enetc_hw, ENETC_PTCMSDUR(0), ENETC_MAC_MAXFRM_SIZE);
+	enetc_port_wr(enetc_hw, ENETC_PTXMBAR, 2 * ENETC_MAC_MAXFRM_SIZE);
+
+	dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
+
+	/*setting the MTU*/
+	enetc_port_wr(enetc_hw, ENETC_PM0_MAXFRM, ENETC_SET_MAXFRM(frame_size) |
+		      ENETC_SET_TX_MTU(ENETC_MAC_MAXFRM_SIZE));
+
+	return 0;
+}
+
+static int
+enetc_dev_configure(struct rte_eth_dev *dev)
+{
+	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
+	uint64_t rx_offloads = eth_conf->rxmode.offloads;
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	PMD_INIT_FUNC_TRACE();
+
+	if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
+		uint32_t max_len;
+
+		max_len = dev->data->dev_conf.rxmode.max_rx_pkt_len;
+
+		enetc_port_wr(enetc_hw, ENETC_PM0_MAXFRM,
+			      ENETC_SET_MAXFRM(max_len));
+		enetc_port_wr(enetc_hw, ENETC_PTCMSDUR(0),
+			      ENETC_MAC_MAXFRM_SIZE);
+		enetc_port_wr(enetc_hw, ENETC_PTXMBAR,
+			      2 * ENETC_MAC_MAXFRM_SIZE);
+		dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
+	}
+
+	return 0;
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -625,6 +689,7 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	.allmulticast_enable  = enetc_allmulticast_enable,
 	.allmulticast_disable = enetc_allmulticast_disable,
 	.dev_infos_get        = enetc_dev_infos_get,
+	.mtu_set              = enetc_mtu_set,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
 	.tx_queue_setup       = enetc_tx_queue_setup,
@@ -679,6 +744,11 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	ether_addr_copy((struct ether_addr *)hw->mac.addr,
 			&eth_dev->data->mac_addrs[0]);
 
+	/* Set MTU */
+	enetc_port_wr(&hw->hw, ENETC_PM0_MAXFRM,
+		      ENETC_SET_MAXFRM(ETHER_MAX_LEN));
+	eth_dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
+
 	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
 			eth_dev->data->port_id, pci_dev->id.vendor_id,
 			pci_dev->id.device_id);
-- 
1.9.1

^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 09/13] net/enetc: add MTU update and jumbo frames support
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 09/13] net/enetc: add MTU update and jumbo frames support Gagandeep Singh
@ 2019-04-08 11:22   ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Enable the jumbo frames and mtu update feature.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  2 +
 drivers/net/enetc/base/enetc_hw.h  |  6 ++-
 drivers/net/enetc/enetc.h          |  5 +++
 drivers/net/enetc/enetc_ethdev.c   | 86 ++++++++++++++++++++++++++++++++++----
 5 files changed, 91 insertions(+), 9 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index ab13211..eeb0752 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -49,6 +49,7 @@ ENETC Features
 - Basic stats
 - Promiscuous
 - Multicast
+- Jumbo packets
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 6b7bbfb..0eed2cb 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -9,6 +9,8 @@ Link status          = Y
 Basic stats          = Y
 Promiscuous mode     = Y
 Allmulticast mode    = Y
+MTU update           = Y
+Jumbo frame          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 90a383a..2eb1df3 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -99,7 +99,11 @@
 #define ENETC_PM0_RX_EN			BIT(1)
 
 #define ENETC_PM0_MAXFRM		0x08014
-#define ENETC_SET_MAXFRM(val)		((val) << 16)
+#define ENETC_SET_TX_MTU(val)		((val) << 16)
+#define ENETC_SET_MAXFRM(val)		((val) & 0xffff)
+#define ENETC_PTXMBAR			0x0608
+/* n = TC index [0..7] */
+#define ENETC_PTCMSDUR(n)		(0x2020 + (n) * 4)
 
 #define ENETC_PM0_STATUS		0x08304
 #define ENETC_LINK_MODE			0x0000000000080000ULL
diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index 56454dc..e494eb8 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -24,6 +24,11 @@
 /* BD ALIGN */
 #define BD_ALIGN       8
 
+/* minimum frame size supported */
+#define ENETC_MAC_MINFRM_SIZE	68
+/* maximum frame size supported */
+#define ENETC_MAC_MAXFRM_SIZE	9600
+
 /*
  * upper_32_bits - return bits 32-63 of a number
  * @n: the number we're accessing
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 0bb3b2c..4428678 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -11,13 +11,6 @@
 int enetc_logtype_pmd;
 
 static int
-enetc_dev_configure(struct rte_eth_dev *dev __rte_unused)
-{
-	PMD_INIT_FUNC_TRACE();
-	return 0;
-}
-
-static int
 enetc_dev_start(struct rte_eth_dev *dev)
 {
 	struct enetc_eth_hw *hw =
@@ -168,7 +161,8 @@
 	};
 	dev_info->max_rx_queues = MAX_RX_RINGS;
 	dev_info->max_tx_queues = MAX_TX_RINGS;
-	dev_info->max_rx_pktlen = 1500;
+	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
+	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_JUMBO_FRAME;
 }
 
 static int
@@ -602,6 +596,76 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
 }
 
+static int
+enetc_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
+
+	/* check that mtu is within the allowed range */
+	if (mtu < ENETC_MAC_MINFRM_SIZE || frame_size > ENETC_MAC_MAXFRM_SIZE)
+		return -EINVAL;
+
+	/*
+	 * Refuse mtu that requires the support of scattered packets
+	 * when this feature has not been enabled before.
+	 */
+	if (dev->data->min_rx_buf_size &&
+		!dev->data->scattered_rx && frame_size >
+		dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM) {
+		ENETC_PMD_ERR("SG not enabled, will not fit in one buffer");
+		return -EINVAL;
+	}
+
+	if (frame_size > ETHER_MAX_LEN)
+		dev->data->dev_conf.rxmode.offloads &=
+						DEV_RX_OFFLOAD_JUMBO_FRAME;
+	else
+		dev->data->dev_conf.rxmode.offloads &=
+						~DEV_RX_OFFLOAD_JUMBO_FRAME;
+
+	enetc_port_wr(enetc_hw, ENETC_PTCMSDUR(0), ENETC_MAC_MAXFRM_SIZE);
+	enetc_port_wr(enetc_hw, ENETC_PTXMBAR, 2 * ENETC_MAC_MAXFRM_SIZE);
+
+	dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
+
+	/*setting the MTU*/
+	enetc_port_wr(enetc_hw, ENETC_PM0_MAXFRM, ENETC_SET_MAXFRM(frame_size) |
+		      ENETC_SET_TX_MTU(ENETC_MAC_MAXFRM_SIZE));
+
+	return 0;
+}
+
+static int
+enetc_dev_configure(struct rte_eth_dev *dev)
+{
+	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
+	uint64_t rx_offloads = eth_conf->rxmode.offloads;
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	PMD_INIT_FUNC_TRACE();
+
+	if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
+		uint32_t max_len;
+
+		max_len = dev->data->dev_conf.rxmode.max_rx_pkt_len;
+
+		enetc_port_wr(enetc_hw, ENETC_PM0_MAXFRM,
+			      ENETC_SET_MAXFRM(max_len));
+		enetc_port_wr(enetc_hw, ENETC_PTCMSDUR(0),
+			      ENETC_MAC_MAXFRM_SIZE);
+		enetc_port_wr(enetc_hw, ENETC_PTXMBAR,
+			      2 * ENETC_MAC_MAXFRM_SIZE);
+		dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
+	}
+
+	return 0;
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -625,6 +689,7 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	.allmulticast_enable  = enetc_allmulticast_enable,
 	.allmulticast_disable = enetc_allmulticast_disable,
 	.dev_infos_get        = enetc_dev_infos_get,
+	.mtu_set              = enetc_mtu_set,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
 	.tx_queue_setup       = enetc_tx_queue_setup,
@@ -679,6 +744,11 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	ether_addr_copy((struct ether_addr *)hw->mac.addr,
 			&eth_dev->data->mac_addrs[0]);
 
+	/* Set MTU */
+	enetc_port_wr(&hw->hw, ENETC_PM0_MAXFRM,
+		      ENETC_SET_MAXFRM(ETHER_MAX_LEN));
+	eth_dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
+
 	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
 			eth_dev->data->port_id, pci_dev->id.vendor_id,
 			pci_dev->id.device_id);
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 10/13] net/enetc: enable Rx-Tx queue start/stop feature
  2019-04-08 11:22 [dpdk-dev] [PATCH 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                   ` (9 preceding siblings ...)
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 09/13] net/enetc: add MTU update and jumbo frames support Gagandeep Singh
@ 2019-04-08 11:22 ` Gagandeep Singh
  2019-04-08 11:22   ` Gagandeep Singh
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 11/13] net/enetc: enable CRC offload feature Gagandeep Singh
                   ` (3 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Rx and Tx queue start-stop and deferred queue start
features enabled.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |   2 +
 doc/guides/nics/features/enetc.ini |   1 +
 drivers/net/enetc/enetc_ethdev.c   | 185 ++++++++++++++++++++++++++-----------
 3 files changed, 134 insertions(+), 54 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index eeb0752..26d61f6 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -50,6 +50,8 @@ ENETC Features
 - Promiscuous
 - Multicast
 - Jumbo packets
+- Queue Start/Stop
+- Deferred Queue Start
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 0eed2cb..bd901fa 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -11,6 +11,7 @@ Promiscuous mode     = Y
 Allmulticast mode    = Y
 MTU update           = Y
 Jumbo frame          = Y
+Queue start/stop     = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 4428678..db23276 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -203,7 +203,6 @@
 enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
 {
 	int idx = tx_ring->index;
-	uint32_t tbmr;
 	phys_addr_t bd_address;
 
 	bd_address = (phys_addr_t)
@@ -215,9 +214,6 @@
 	enetc_txbdr_wr(hw, idx, ENETC_TBLENR,
 		       ENETC_RTBLENR_LEN(tx_ring->bd_count));
 
-	tbmr = ENETC_TBMR_EN;
-	/* enable ring */
-	enetc_txbdr_wr(hw, idx, ENETC_TBMR, tbmr);
 	enetc_txbdr_wr(hw, idx, ENETC_TBCIR, 0);
 	enetc_txbdr_wr(hw, idx, ENETC_TBCISR, 0);
 	tx_ring->tcir = (void *)((size_t)hw->reg +
@@ -227,16 +223,22 @@
 }
 
 static int
-enetc_alloc_tx_resources(struct rte_eth_dev *dev,
-			 uint16_t queue_idx,
-			 uint16_t nb_desc)
+enetc_tx_queue_setup(struct rte_eth_dev *dev,
+		     uint16_t queue_idx,
+		     uint16_t nb_desc,
+		     unsigned int socket_id __rte_unused,
+		     const struct rte_eth_txconf *tx_conf)
 {
-	int err;
+	int err = 0;
 	struct enetc_bdr *tx_ring;
 	struct rte_eth_dev_data *data = dev->data;
 	struct enetc_eth_adapter *priv =
 			ENETC_DEV_PRIVATE(data->dev_private);
 
+	PMD_INIT_FUNC_TRACE();
+	if (nb_desc > MAX_BD_COUNT)
+		return -1;
+
 	tx_ring = rte_zmalloc(NULL, sizeof(struct enetc_bdr), 0);
 	if (tx_ring == NULL) {
 		ENETC_PMD_ERR("Failed to allocate TX ring memory");
@@ -253,6 +255,17 @@
 	enetc_setup_txbdr(&priv->hw.hw, tx_ring);
 	data->tx_queues[queue_idx] = tx_ring;
 
+	if (!tx_conf->tx_deferred_start) {
+		/* enable ring */
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index,
+			       ENETC_TBMR, ENETC_TBMR_EN);
+		dev->data->tx_queue_state[tx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STARTED;
+	} else {
+		dev->data->tx_queue_state[tx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
 	return 0;
 fail:
 	rte_free(tx_ring);
@@ -260,24 +273,6 @@
 	return err;
 }
 
-static int
-enetc_tx_queue_setup(struct rte_eth_dev *dev,
-		     uint16_t queue_idx,
-		     uint16_t nb_desc,
-		     unsigned int socket_id __rte_unused,
-		     const struct rte_eth_txconf *tx_conf __rte_unused)
-{
-	int err = 0;
-
-	PMD_INIT_FUNC_TRACE();
-	if (nb_desc > MAX_BD_COUNT)
-		return -1;
-
-	err = enetc_alloc_tx_resources(dev, queue_idx, nb_desc);
-
-	return err;
-}
-
 static void
 enetc_tx_queue_release(void *txq)
 {
@@ -367,23 +362,27 @@
 	buf_size = (uint16_t)(rte_pktmbuf_data_room_size(rx_ring->mb_pool) -
 		   RTE_PKTMBUF_HEADROOM);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBSR, buf_size);
-	/* enable ring */
-	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 }
 
 static int
-enetc_alloc_rx_resources(struct rte_eth_dev *dev,
-			 uint16_t rx_queue_id,
-			 uint16_t nb_rx_desc,
-			 struct rte_mempool *mb_pool)
+enetc_rx_queue_setup(struct rte_eth_dev *dev,
+		     uint16_t rx_queue_id,
+		     uint16_t nb_rx_desc,
+		     unsigned int socket_id __rte_unused,
+		     const struct rte_eth_rxconf *rx_conf,
+		     struct rte_mempool *mb_pool)
 {
-	int err;
+	int err = 0;
 	struct enetc_bdr *rx_ring;
 	struct rte_eth_dev_data *data =  dev->data;
 	struct enetc_eth_adapter *adapter =
 			ENETC_DEV_PRIVATE(data->dev_private);
 
+	PMD_INIT_FUNC_TRACE();
+	if (nb_rx_desc > MAX_BD_COUNT)
+		return -1;
+
 	rx_ring = rte_zmalloc(NULL, sizeof(struct enetc_bdr), 0);
 	if (rx_ring == NULL) {
 		ENETC_PMD_ERR("Failed to allocate RX ring memory");
@@ -400,6 +399,17 @@
 	enetc_setup_rxbdr(&adapter->hw.hw, rx_ring, mb_pool);
 	data->rx_queues[rx_queue_id] = rx_ring;
 
+	if (!rx_conf->rx_deferred_start) {
+		/* enable ring */
+		enetc_rxbdr_wr(&adapter->hw.hw, rx_ring->index, ENETC_RBMR,
+			       ENETC_RBMR_EN);
+		dev->data->rx_queue_state[rx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STARTED;
+	} else {
+		dev->data->rx_queue_state[rx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
 	return 0;
 fail:
 	rte_free(rx_ring);
@@ -407,27 +417,6 @@
 	return err;
 }
 
-static int
-enetc_rx_queue_setup(struct rte_eth_dev *dev,
-		     uint16_t rx_queue_id,
-		     uint16_t nb_rx_desc,
-		     unsigned int socket_id __rte_unused,
-		     const struct rte_eth_rxconf *rx_conf __rte_unused,
-		     struct rte_mempool *mb_pool)
-{
-	int err = 0;
-
-	PMD_INIT_FUNC_TRACE();
-	if (nb_rx_desc > MAX_BD_COUNT)
-		return -1;
-
-	err = enetc_alloc_rx_resources(dev, rx_queue_id,
-				       nb_rx_desc,
-				       mb_pool);
-
-	return err;
-}
-
 static void
 enetc_rx_queue_release(void *rxq)
 {
@@ -666,6 +655,90 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	return 0;
 }
 
+static int
+enetc_rx_queue_start(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *rx_ring;
+	uint32_t rx_data;
+
+	rx_ring = dev->data->rx_queues[qidx];
+	if (dev->data->rx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STOPPED) {
+		rx_data = enetc_rxbdr_rd(&priv->hw.hw, rx_ring->index,
+					 ENETC_RBMR);
+		rx_data = rx_data | ENETC_RBMR_EN;
+		enetc_rxbdr_wr(&priv->hw.hw, rx_ring->index, ENETC_RBMR,
+			       rx_data);
+		dev->data->rx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STARTED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_rx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *rx_ring;
+	uint32_t rx_data;
+
+	rx_ring = dev->data->rx_queues[qidx];
+	if (dev->data->rx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STARTED) {
+		rx_data = enetc_rxbdr_rd(&priv->hw.hw, rx_ring->index,
+					 ENETC_RBMR);
+		rx_data = rx_data & (~ENETC_RBMR_EN);
+		enetc_rxbdr_wr(&priv->hw.hw, rx_ring->index, ENETC_RBMR,
+			       rx_data);
+		dev->data->rx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_tx_queue_start(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *tx_ring;
+	uint32_t tx_data;
+
+	tx_ring = dev->data->tx_queues[qidx];
+	if (dev->data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STOPPED) {
+		tx_data = enetc_txbdr_rd(&priv->hw.hw, tx_ring->index,
+					 ENETC_TBMR);
+		tx_data = tx_data | ENETC_TBMR_EN;
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index, ENETC_TBMR,
+			       tx_data);
+		dev->data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STARTED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_tx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *tx_ring;
+	uint32_t tx_data;
+
+	tx_ring = dev->data->tx_queues[qidx];
+	if (dev->data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STARTED) {
+		tx_data = enetc_txbdr_rd(&priv->hw.hw, tx_ring->index,
+					 ENETC_TBMR);
+		tx_data = tx_data & (~ENETC_TBMR_EN);
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index, ENETC_TBMR,
+			       tx_data);
+		dev->data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
+	return 0;
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -691,8 +764,12 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.mtu_set              = enetc_mtu_set,
 	.rx_queue_setup       = enetc_rx_queue_setup,
+	.rx_queue_start       = enetc_rx_queue_start,
+	.rx_queue_stop        = enetc_rx_queue_stop,
 	.rx_queue_release     = enetc_rx_queue_release,
 	.tx_queue_setup       = enetc_tx_queue_setup,
+	.tx_queue_start       = enetc_tx_queue_start,
+	.tx_queue_stop        = enetc_tx_queue_stop,
 	.tx_queue_release     = enetc_tx_queue_release,
 	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
 };
-- 
1.9.1

^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 10/13] net/enetc: enable Rx-Tx queue start/stop feature
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 10/13] net/enetc: enable Rx-Tx queue start/stop feature Gagandeep Singh
@ 2019-04-08 11:22   ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Rx and Tx queue start-stop and deferred queue start
features enabled.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |   2 +
 doc/guides/nics/features/enetc.ini |   1 +
 drivers/net/enetc/enetc_ethdev.c   | 185 ++++++++++++++++++++++++++-----------
 3 files changed, 134 insertions(+), 54 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index eeb0752..26d61f6 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -50,6 +50,8 @@ ENETC Features
 - Promiscuous
 - Multicast
 - Jumbo packets
+- Queue Start/Stop
+- Deferred Queue Start
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 0eed2cb..bd901fa 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -11,6 +11,7 @@ Promiscuous mode     = Y
 Allmulticast mode    = Y
 MTU update           = Y
 Jumbo frame          = Y
+Queue start/stop     = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 4428678..db23276 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -203,7 +203,6 @@
 enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
 {
 	int idx = tx_ring->index;
-	uint32_t tbmr;
 	phys_addr_t bd_address;
 
 	bd_address = (phys_addr_t)
@@ -215,9 +214,6 @@
 	enetc_txbdr_wr(hw, idx, ENETC_TBLENR,
 		       ENETC_RTBLENR_LEN(tx_ring->bd_count));
 
-	tbmr = ENETC_TBMR_EN;
-	/* enable ring */
-	enetc_txbdr_wr(hw, idx, ENETC_TBMR, tbmr);
 	enetc_txbdr_wr(hw, idx, ENETC_TBCIR, 0);
 	enetc_txbdr_wr(hw, idx, ENETC_TBCISR, 0);
 	tx_ring->tcir = (void *)((size_t)hw->reg +
@@ -227,16 +223,22 @@
 }
 
 static int
-enetc_alloc_tx_resources(struct rte_eth_dev *dev,
-			 uint16_t queue_idx,
-			 uint16_t nb_desc)
+enetc_tx_queue_setup(struct rte_eth_dev *dev,
+		     uint16_t queue_idx,
+		     uint16_t nb_desc,
+		     unsigned int socket_id __rte_unused,
+		     const struct rte_eth_txconf *tx_conf)
 {
-	int err;
+	int err = 0;
 	struct enetc_bdr *tx_ring;
 	struct rte_eth_dev_data *data = dev->data;
 	struct enetc_eth_adapter *priv =
 			ENETC_DEV_PRIVATE(data->dev_private);
 
+	PMD_INIT_FUNC_TRACE();
+	if (nb_desc > MAX_BD_COUNT)
+		return -1;
+
 	tx_ring = rte_zmalloc(NULL, sizeof(struct enetc_bdr), 0);
 	if (tx_ring == NULL) {
 		ENETC_PMD_ERR("Failed to allocate TX ring memory");
@@ -253,6 +255,17 @@
 	enetc_setup_txbdr(&priv->hw.hw, tx_ring);
 	data->tx_queues[queue_idx] = tx_ring;
 
+	if (!tx_conf->tx_deferred_start) {
+		/* enable ring */
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index,
+			       ENETC_TBMR, ENETC_TBMR_EN);
+		dev->data->tx_queue_state[tx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STARTED;
+	} else {
+		dev->data->tx_queue_state[tx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
 	return 0;
 fail:
 	rte_free(tx_ring);
@@ -260,24 +273,6 @@
 	return err;
 }
 
-static int
-enetc_tx_queue_setup(struct rte_eth_dev *dev,
-		     uint16_t queue_idx,
-		     uint16_t nb_desc,
-		     unsigned int socket_id __rte_unused,
-		     const struct rte_eth_txconf *tx_conf __rte_unused)
-{
-	int err = 0;
-
-	PMD_INIT_FUNC_TRACE();
-	if (nb_desc > MAX_BD_COUNT)
-		return -1;
-
-	err = enetc_alloc_tx_resources(dev, queue_idx, nb_desc);
-
-	return err;
-}
-
 static void
 enetc_tx_queue_release(void *txq)
 {
@@ -367,23 +362,27 @@
 	buf_size = (uint16_t)(rte_pktmbuf_data_room_size(rx_ring->mb_pool) -
 		   RTE_PKTMBUF_HEADROOM);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBSR, buf_size);
-	/* enable ring */
-	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 }
 
 static int
-enetc_alloc_rx_resources(struct rte_eth_dev *dev,
-			 uint16_t rx_queue_id,
-			 uint16_t nb_rx_desc,
-			 struct rte_mempool *mb_pool)
+enetc_rx_queue_setup(struct rte_eth_dev *dev,
+		     uint16_t rx_queue_id,
+		     uint16_t nb_rx_desc,
+		     unsigned int socket_id __rte_unused,
+		     const struct rte_eth_rxconf *rx_conf,
+		     struct rte_mempool *mb_pool)
 {
-	int err;
+	int err = 0;
 	struct enetc_bdr *rx_ring;
 	struct rte_eth_dev_data *data =  dev->data;
 	struct enetc_eth_adapter *adapter =
 			ENETC_DEV_PRIVATE(data->dev_private);
 
+	PMD_INIT_FUNC_TRACE();
+	if (nb_rx_desc > MAX_BD_COUNT)
+		return -1;
+
 	rx_ring = rte_zmalloc(NULL, sizeof(struct enetc_bdr), 0);
 	if (rx_ring == NULL) {
 		ENETC_PMD_ERR("Failed to allocate RX ring memory");
@@ -400,6 +399,17 @@
 	enetc_setup_rxbdr(&adapter->hw.hw, rx_ring, mb_pool);
 	data->rx_queues[rx_queue_id] = rx_ring;
 
+	if (!rx_conf->rx_deferred_start) {
+		/* enable ring */
+		enetc_rxbdr_wr(&adapter->hw.hw, rx_ring->index, ENETC_RBMR,
+			       ENETC_RBMR_EN);
+		dev->data->rx_queue_state[rx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STARTED;
+	} else {
+		dev->data->rx_queue_state[rx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
 	return 0;
 fail:
 	rte_free(rx_ring);
@@ -407,27 +417,6 @@
 	return err;
 }
 
-static int
-enetc_rx_queue_setup(struct rte_eth_dev *dev,
-		     uint16_t rx_queue_id,
-		     uint16_t nb_rx_desc,
-		     unsigned int socket_id __rte_unused,
-		     const struct rte_eth_rxconf *rx_conf __rte_unused,
-		     struct rte_mempool *mb_pool)
-{
-	int err = 0;
-
-	PMD_INIT_FUNC_TRACE();
-	if (nb_rx_desc > MAX_BD_COUNT)
-		return -1;
-
-	err = enetc_alloc_rx_resources(dev, rx_queue_id,
-				       nb_rx_desc,
-				       mb_pool);
-
-	return err;
-}
-
 static void
 enetc_rx_queue_release(void *rxq)
 {
@@ -666,6 +655,90 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	return 0;
 }
 
+static int
+enetc_rx_queue_start(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *rx_ring;
+	uint32_t rx_data;
+
+	rx_ring = dev->data->rx_queues[qidx];
+	if (dev->data->rx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STOPPED) {
+		rx_data = enetc_rxbdr_rd(&priv->hw.hw, rx_ring->index,
+					 ENETC_RBMR);
+		rx_data = rx_data | ENETC_RBMR_EN;
+		enetc_rxbdr_wr(&priv->hw.hw, rx_ring->index, ENETC_RBMR,
+			       rx_data);
+		dev->data->rx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STARTED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_rx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *rx_ring;
+	uint32_t rx_data;
+
+	rx_ring = dev->data->rx_queues[qidx];
+	if (dev->data->rx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STARTED) {
+		rx_data = enetc_rxbdr_rd(&priv->hw.hw, rx_ring->index,
+					 ENETC_RBMR);
+		rx_data = rx_data & (~ENETC_RBMR_EN);
+		enetc_rxbdr_wr(&priv->hw.hw, rx_ring->index, ENETC_RBMR,
+			       rx_data);
+		dev->data->rx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_tx_queue_start(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *tx_ring;
+	uint32_t tx_data;
+
+	tx_ring = dev->data->tx_queues[qidx];
+	if (dev->data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STOPPED) {
+		tx_data = enetc_txbdr_rd(&priv->hw.hw, tx_ring->index,
+					 ENETC_TBMR);
+		tx_data = tx_data | ENETC_TBMR_EN;
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index, ENETC_TBMR,
+			       tx_data);
+		dev->data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STARTED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_tx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *tx_ring;
+	uint32_t tx_data;
+
+	tx_ring = dev->data->tx_queues[qidx];
+	if (dev->data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STARTED) {
+		tx_data = enetc_txbdr_rd(&priv->hw.hw, tx_ring->index,
+					 ENETC_TBMR);
+		tx_data = tx_data & (~ENETC_TBMR_EN);
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index, ENETC_TBMR,
+			       tx_data);
+		dev->data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
+	return 0;
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -691,8 +764,12 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.mtu_set              = enetc_mtu_set,
 	.rx_queue_setup       = enetc_rx_queue_setup,
+	.rx_queue_start       = enetc_rx_queue_start,
+	.rx_queue_stop        = enetc_rx_queue_stop,
 	.rx_queue_release     = enetc_rx_queue_release,
 	.tx_queue_setup       = enetc_tx_queue_setup,
+	.tx_queue_start       = enetc_tx_queue_start,
+	.tx_queue_stop        = enetc_tx_queue_stop,
 	.tx_queue_release     = enetc_tx_queue_release,
 	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
 };
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 11/13] net/enetc: enable CRC offload feature
  2019-04-08 11:22 [dpdk-dev] [PATCH 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                   ` (10 preceding siblings ...)
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 10/13] net/enetc: enable Rx-Tx queue start/stop feature Gagandeep Singh
@ 2019-04-08 11:22 ` Gagandeep Singh
  2019-04-08 11:22   ` Gagandeep Singh
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 12/13] net/enetc: enable Rx checksum offload validation Gagandeep Singh
                   ` (2 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

CRC offload keep feature supported

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  1 +
 drivers/net/enetc/base/enetc_hw.h  |  1 +
 drivers/net/enetc/enetc.h          |  1 +
 drivers/net/enetc/enetc_ethdev.c   | 20 +++++++++++++++++---
 drivers/net/enetc/enetc_rxtx.c     |  6 ++++--
 6 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 26d61f6..2620460 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -52,6 +52,7 @@ ENETC Features
 - Jumbo packets
 - Queue Start/Stop
 - Deferred Queue Start
+- CRC offload
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index bd901fa..101dc0a 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -12,6 +12,7 @@ Allmulticast mode    = Y
 MTU update           = Y
 Jumbo frame          = Y
 Queue start/stop     = Y
+CRC offload          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 2eb1df3..261ad15 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -97,6 +97,7 @@
 #define ENETC_PM0_CMD_CFG		0x08008
 #define ENETC_PM0_TX_EN			BIT(0)
 #define ENETC_PM0_RX_EN			BIT(1)
+#define ENETC_PM0_CRC			BIT(6)
 
 #define ENETC_PM0_MAXFRM		0x08014
 #define ENETC_SET_TX_MTU(val)		((val) << 16)
diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index e494eb8..8c830a5 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -69,6 +69,7 @@ struct enetc_bdr {
 		void *tcisr; /* Tx */
 		int next_to_alloc; /* Rx */
 	};
+	uint8_t	crc_len; /* 0 if CRC stripped, 4 otherwise */
 };
 
 /*
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index db23276..a59a030 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -162,7 +162,9 @@
 	dev_info->max_rx_queues = MAX_RX_RINGS;
 	dev_info->max_tx_queues = MAX_TX_RINGS;
 	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
-	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_JUMBO_FRAME;
+	dev_info->rx_offload_capa =
+		(DEV_RX_OFFLOAD_KEEP_CRC |
+		 DEV_RX_OFFLOAD_JUMBO_FRAME);
 }
 
 static int
@@ -378,6 +380,7 @@
 	struct rte_eth_dev_data *data =  dev->data;
 	struct enetc_eth_adapter *adapter =
 			ENETC_DEV_PRIVATE(data->dev_private);
+	uint64_t rx_offloads = data->dev_conf.rxmode.offloads;
 
 	PMD_INIT_FUNC_TRACE();
 	if (nb_rx_desc > MAX_BD_COUNT)
@@ -410,6 +413,9 @@
 			       RTE_ETH_QUEUE_STATE_STOPPED;
 	}
 
+	rx_ring->crc_len = (uint8_t)((rx_offloads & DEV_RX_OFFLOAD_KEEP_CRC) ?
+				     ETHER_CRC_LEN : 0);
+
 	return 0;
 fail:
 	rte_free(rx_ring);
@@ -630,11 +636,11 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 static int
 enetc_dev_configure(struct rte_eth_dev *dev)
 {
-	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
-	uint64_t rx_offloads = eth_conf->rxmode.offloads;
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct enetc_hw *enetc_hw = &hw->hw;
+	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
+	uint64_t rx_offloads = eth_conf->rxmode.offloads;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -652,6 +658,14 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 		dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
 	}
 
+	if (rx_offloads & DEV_RX_OFFLOAD_KEEP_CRC) {
+		int config;
+
+		config = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+		config |= ENETC_PM0_CRC;
+		enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG, config);
+	}
+
 	return 0;
 }
 
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 90d6979..7497a47 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -207,8 +207,10 @@ static inline void __attribute__((hot))
 		if (!bd_status)
 			break;
 
-		rx_swbd->buffer_addr->pkt_len = rxbd->r.buf_len;
-		rx_swbd->buffer_addr->data_len = rxbd->r.buf_len;
+		rx_swbd->buffer_addr->pkt_len = rxbd->r.buf_len -
+						rx_ring->crc_len;
+		rx_swbd->buffer_addr->data_len = rxbd->r.buf_len -
+						 rx_ring->crc_len;
 		rx_swbd->buffer_addr->hash.rss = rxbd->r.rss_hash;
 		rx_swbd->buffer_addr->ol_flags = 0;
 		enetc_dev_rx_parse(rx_swbd->buffer_addr,
-- 
1.9.1

^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 11/13] net/enetc: enable CRC offload feature
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 11/13] net/enetc: enable CRC offload feature Gagandeep Singh
@ 2019-04-08 11:22   ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

CRC offload keep feature supported

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  1 +
 drivers/net/enetc/base/enetc_hw.h  |  1 +
 drivers/net/enetc/enetc.h          |  1 +
 drivers/net/enetc/enetc_ethdev.c   | 20 +++++++++++++++++---
 drivers/net/enetc/enetc_rxtx.c     |  6 ++++--
 6 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 26d61f6..2620460 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -52,6 +52,7 @@ ENETC Features
 - Jumbo packets
 - Queue Start/Stop
 - Deferred Queue Start
+- CRC offload
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index bd901fa..101dc0a 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -12,6 +12,7 @@ Allmulticast mode    = Y
 MTU update           = Y
 Jumbo frame          = Y
 Queue start/stop     = Y
+CRC offload          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 2eb1df3..261ad15 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -97,6 +97,7 @@
 #define ENETC_PM0_CMD_CFG		0x08008
 #define ENETC_PM0_TX_EN			BIT(0)
 #define ENETC_PM0_RX_EN			BIT(1)
+#define ENETC_PM0_CRC			BIT(6)
 
 #define ENETC_PM0_MAXFRM		0x08014
 #define ENETC_SET_TX_MTU(val)		((val) << 16)
diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index e494eb8..8c830a5 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -69,6 +69,7 @@ struct enetc_bdr {
 		void *tcisr; /* Tx */
 		int next_to_alloc; /* Rx */
 	};
+	uint8_t	crc_len; /* 0 if CRC stripped, 4 otherwise */
 };
 
 /*
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index db23276..a59a030 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -162,7 +162,9 @@
 	dev_info->max_rx_queues = MAX_RX_RINGS;
 	dev_info->max_tx_queues = MAX_TX_RINGS;
 	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
-	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_JUMBO_FRAME;
+	dev_info->rx_offload_capa =
+		(DEV_RX_OFFLOAD_KEEP_CRC |
+		 DEV_RX_OFFLOAD_JUMBO_FRAME);
 }
 
 static int
@@ -378,6 +380,7 @@
 	struct rte_eth_dev_data *data =  dev->data;
 	struct enetc_eth_adapter *adapter =
 			ENETC_DEV_PRIVATE(data->dev_private);
+	uint64_t rx_offloads = data->dev_conf.rxmode.offloads;
 
 	PMD_INIT_FUNC_TRACE();
 	if (nb_rx_desc > MAX_BD_COUNT)
@@ -410,6 +413,9 @@
 			       RTE_ETH_QUEUE_STATE_STOPPED;
 	}
 
+	rx_ring->crc_len = (uint8_t)((rx_offloads & DEV_RX_OFFLOAD_KEEP_CRC) ?
+				     ETHER_CRC_LEN : 0);
+
 	return 0;
 fail:
 	rte_free(rx_ring);
@@ -630,11 +636,11 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 static int
 enetc_dev_configure(struct rte_eth_dev *dev)
 {
-	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
-	uint64_t rx_offloads = eth_conf->rxmode.offloads;
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct enetc_hw *enetc_hw = &hw->hw;
+	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
+	uint64_t rx_offloads = eth_conf->rxmode.offloads;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -652,6 +658,14 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 		dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
 	}
 
+	if (rx_offloads & DEV_RX_OFFLOAD_KEEP_CRC) {
+		int config;
+
+		config = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+		config |= ENETC_PM0_CRC;
+		enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG, config);
+	}
+
 	return 0;
 }
 
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 90d6979..7497a47 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -207,8 +207,10 @@ static inline void __attribute__((hot))
 		if (!bd_status)
 			break;
 
-		rx_swbd->buffer_addr->pkt_len = rxbd->r.buf_len;
-		rx_swbd->buffer_addr->data_len = rxbd->r.buf_len;
+		rx_swbd->buffer_addr->pkt_len = rxbd->r.buf_len -
+						rx_ring->crc_len;
+		rx_swbd->buffer_addr->data_len = rxbd->r.buf_len -
+						 rx_ring->crc_len;
 		rx_swbd->buffer_addr->hash.rss = rxbd->r.rss_hash;
 		rx_swbd->buffer_addr->ol_flags = 0;
 		enetc_dev_rx_parse(rx_swbd->buffer_addr,
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 12/13] net/enetc: enable Rx checksum offload validation
  2019-04-08 11:22 [dpdk-dev] [PATCH 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                   ` (11 preceding siblings ...)
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 11/13] net/enetc: enable CRC offload feature Gagandeep Singh
@ 2019-04-08 11:22 ` Gagandeep Singh
  2019-04-08 11:22   ` Gagandeep Singh
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 13/13] net/enetc: fix crash at high speed traffic Gagandeep Singh
  2019-04-12  7:04 ` [dpdk-dev] [PATCH v2 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Checksum Validation on Rx is supported.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/features/enetc.ini |   2 +
 drivers/net/enetc/base/enetc_hw.h  |   5 ++
 drivers/net/enetc/enetc_ethdev.c   |  15 +++++-
 drivers/net/enetc/enetc_rxtx.c     | 107 ++++++++++++++++++++++++++++++++-----
 4 files changed, 115 insertions(+), 14 deletions(-)

diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 101dc0a..39a5201 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -13,6 +13,8 @@ MTU update           = Y
 Jumbo frame          = Y
 Queue start/stop     = Y
 CRC offload          = Y
+L3 checksum offload  = P
+L4 checksum offload  = P
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 261ad15..ff2bda5 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -99,6 +99,10 @@
 #define ENETC_PM0_RX_EN			BIT(1)
 #define ENETC_PM0_CRC			BIT(6)
 
+#define ENETC_PAR_PORT_CFG		0x03050
+#define L3_CKSUM			BIT(0)
+#define L4_CKSUM			BIT(1)
+
 #define ENETC_PM0_MAXFRM		0x08014
 #define ENETC_SET_TX_MTU(val)		((val) << 16)
 #define ENETC_SET_MAXFRM(val)		((val) & 0xffff)
@@ -182,6 +186,7 @@
 #define ENETC_TXBD_FLAGS_F		BIT(15)
 
 /* ENETC Parsed values (Little Endian) */
+#define ENETC_PARSE_ERROR		0x8000
 #define ENETC_PKT_TYPE_ETHER            0x0060
 #define ENETC_PKT_TYPE_IPV4             0x0000
 #define ENETC_PKT_TYPE_IPV6             0x0020
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index a59a030..6b49fd4 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -163,7 +163,10 @@
 	dev_info->max_tx_queues = MAX_TX_RINGS;
 	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
 	dev_info->rx_offload_capa =
-		(DEV_RX_OFFLOAD_KEEP_CRC |
+		(DEV_RX_OFFLOAD_IPV4_CKSUM |
+		 DEV_RX_OFFLOAD_UDP_CKSUM |
+		 DEV_RX_OFFLOAD_TCP_CKSUM |
+		 DEV_RX_OFFLOAD_KEEP_CRC |
 		 DEV_RX_OFFLOAD_JUMBO_FRAME);
 }
 
@@ -641,6 +644,7 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	struct enetc_hw *enetc_hw = &hw->hw;
 	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
 	uint64_t rx_offloads = eth_conf->rxmode.offloads;
+	uint32_t checksum = L3_CKSUM | L4_CKSUM;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -666,6 +670,15 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 		enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG, config);
 	}
 
+	if (rx_offloads & DEV_RX_OFFLOAD_IPV4_CKSUM)
+		checksum &= ~L3_CKSUM;
+
+	if (rx_offloads & (DEV_RX_OFFLOAD_UDP_CKSUM | DEV_RX_OFFLOAD_TCP_CKSUM))
+		checksum &= ~L4_CKSUM;
+
+	enetc_port_wr(enetc_hw, ENETC_PAR_PORT_CFG, checksum);
+
+
 	return 0;
 }
 
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 7497a47..ed39665 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -114,69 +114,150 @@
 	return j;
 }
 
+static inline void enetc_slow_parsing(struct rte_mbuf *m,
+				     uint64_t parse_results)
+{
+	m->ol_flags &= ~(PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD);
+
+	switch (parse_results) {
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4;
+		m->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6;
+		m->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_TCP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_TCP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_TCP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_TCP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_UDP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_UDP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_UDP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_UDP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_SCTP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_SCTP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_SCTP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_SCTP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_ICMP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_ICMP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_ICMP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_ICMP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	/* More switch cases can be added */
+	default:
+		m->packet_type = RTE_PTYPE_UNKNOWN;
+		m->ol_flags |= PKT_RX_IP_CKSUM_UNKNOWN |
+			       PKT_RX_L4_CKSUM_UNKNOWN;
+	}
+}
+
 
 static inline void __attribute__((hot))
 enetc_dev_rx_parse(struct rte_mbuf *m, uint16_t parse_results)
 {
 	ENETC_PMD_DP_DEBUG("parse summary = 0x%x   ", parse_results);
+	m->ol_flags |= PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD;
 
-	m->packet_type = RTE_PTYPE_UNKNOWN;
 	switch (parse_results) {
 	case ENETC_PKT_TYPE_ETHER:
 		m->packet_type = RTE_PTYPE_L2_ETHER;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_TCP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_TCP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_TCP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_TCP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_UDP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_UDP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_UDP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_UDP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_SCTP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_SCTP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_SCTP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_SCTP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_ICMP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_ICMP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_ICMP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_ICMP;
-		break;
+		return;
 	/* More switch cases can be added */
 	default:
-		m->packet_type = RTE_PTYPE_UNKNOWN;
+		enetc_slow_parsing(m, parse_results);
 	}
+
 }
 
 static int
-- 
1.9.1

^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 12/13] net/enetc: enable Rx checksum offload validation
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 12/13] net/enetc: enable Rx checksum offload validation Gagandeep Singh
@ 2019-04-08 11:22   ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Checksum Validation on Rx is supported.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/features/enetc.ini |   2 +
 drivers/net/enetc/base/enetc_hw.h  |   5 ++
 drivers/net/enetc/enetc_ethdev.c   |  15 +++++-
 drivers/net/enetc/enetc_rxtx.c     | 107 ++++++++++++++++++++++++++++++++-----
 4 files changed, 115 insertions(+), 14 deletions(-)

diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 101dc0a..39a5201 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -13,6 +13,8 @@ MTU update           = Y
 Jumbo frame          = Y
 Queue start/stop     = Y
 CRC offload          = Y
+L3 checksum offload  = P
+L4 checksum offload  = P
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 261ad15..ff2bda5 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -99,6 +99,10 @@
 #define ENETC_PM0_RX_EN			BIT(1)
 #define ENETC_PM0_CRC			BIT(6)
 
+#define ENETC_PAR_PORT_CFG		0x03050
+#define L3_CKSUM			BIT(0)
+#define L4_CKSUM			BIT(1)
+
 #define ENETC_PM0_MAXFRM		0x08014
 #define ENETC_SET_TX_MTU(val)		((val) << 16)
 #define ENETC_SET_MAXFRM(val)		((val) & 0xffff)
@@ -182,6 +186,7 @@
 #define ENETC_TXBD_FLAGS_F		BIT(15)
 
 /* ENETC Parsed values (Little Endian) */
+#define ENETC_PARSE_ERROR		0x8000
 #define ENETC_PKT_TYPE_ETHER            0x0060
 #define ENETC_PKT_TYPE_IPV4             0x0000
 #define ENETC_PKT_TYPE_IPV6             0x0020
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index a59a030..6b49fd4 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -163,7 +163,10 @@
 	dev_info->max_tx_queues = MAX_TX_RINGS;
 	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
 	dev_info->rx_offload_capa =
-		(DEV_RX_OFFLOAD_KEEP_CRC |
+		(DEV_RX_OFFLOAD_IPV4_CKSUM |
+		 DEV_RX_OFFLOAD_UDP_CKSUM |
+		 DEV_RX_OFFLOAD_TCP_CKSUM |
+		 DEV_RX_OFFLOAD_KEEP_CRC |
 		 DEV_RX_OFFLOAD_JUMBO_FRAME);
 }
 
@@ -641,6 +644,7 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	struct enetc_hw *enetc_hw = &hw->hw;
 	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
 	uint64_t rx_offloads = eth_conf->rxmode.offloads;
+	uint32_t checksum = L3_CKSUM | L4_CKSUM;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -666,6 +670,15 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 		enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG, config);
 	}
 
+	if (rx_offloads & DEV_RX_OFFLOAD_IPV4_CKSUM)
+		checksum &= ~L3_CKSUM;
+
+	if (rx_offloads & (DEV_RX_OFFLOAD_UDP_CKSUM | DEV_RX_OFFLOAD_TCP_CKSUM))
+		checksum &= ~L4_CKSUM;
+
+	enetc_port_wr(enetc_hw, ENETC_PAR_PORT_CFG, checksum);
+
+
 	return 0;
 }
 
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 7497a47..ed39665 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -114,69 +114,150 @@
 	return j;
 }
 
+static inline void enetc_slow_parsing(struct rte_mbuf *m,
+				     uint64_t parse_results)
+{
+	m->ol_flags &= ~(PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD);
+
+	switch (parse_results) {
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4;
+		m->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6;
+		m->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_TCP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_TCP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_TCP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_TCP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_UDP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_UDP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_UDP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_UDP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_SCTP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_SCTP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_SCTP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_SCTP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_ICMP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_ICMP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_ICMP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_ICMP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	/* More switch cases can be added */
+	default:
+		m->packet_type = RTE_PTYPE_UNKNOWN;
+		m->ol_flags |= PKT_RX_IP_CKSUM_UNKNOWN |
+			       PKT_RX_L4_CKSUM_UNKNOWN;
+	}
+}
+
 
 static inline void __attribute__((hot))
 enetc_dev_rx_parse(struct rte_mbuf *m, uint16_t parse_results)
 {
 	ENETC_PMD_DP_DEBUG("parse summary = 0x%x   ", parse_results);
+	m->ol_flags |= PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD;
 
-	m->packet_type = RTE_PTYPE_UNKNOWN;
 	switch (parse_results) {
 	case ENETC_PKT_TYPE_ETHER:
 		m->packet_type = RTE_PTYPE_L2_ETHER;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_TCP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_TCP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_TCP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_TCP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_UDP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_UDP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_UDP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_UDP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_SCTP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_SCTP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_SCTP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_SCTP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_ICMP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_ICMP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_ICMP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_ICMP;
-		break;
+		return;
 	/* More switch cases can be added */
 	default:
-		m->packet_type = RTE_PTYPE_UNKNOWN;
+		enetc_slow_parsing(m, parse_results);
 	}
+
 }
 
 static int
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 13/13] net/enetc: fix crash at high speed traffic
  2019-04-08 11:22 [dpdk-dev] [PATCH 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                   ` (12 preceding siblings ...)
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 12/13] net/enetc: enable Rx checksum offload validation Gagandeep Singh
@ 2019-04-08 11:22 ` Gagandeep Singh
  2019-04-08 11:22   ` Gagandeep Singh
  2019-04-12  7:04 ` [dpdk-dev] [PATCH v2 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

On xmit side, there should be a check whether BD ring
has free BDs available before transmit a packet to avoid
data corruption and buffer leak issue.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: g.singh@nxp.com

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_rxtx.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index ed39665..baf5d27 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -49,11 +49,16 @@
 		uint16_t nb_pkts)
 {
 	struct enetc_swbd *tx_swbd;
-	int i, start;
+	int i, start, bds_to_use;
 	struct enetc_tx_bd *txbd;
 	struct enetc_bdr *tx_ring = (struct enetc_bdr *)tx_queue;
 
 	i = tx_ring->next_to_use;
+
+	bds_to_use = enetc_bd_unused(tx_ring);
+	if (bds_to_use < nb_pkts)
+		nb_pkts = bds_to_use;
+
 	start = 0;
 	while (nb_pkts--) {
 		enetc_clean_tx_ring(tx_ring);
-- 
1.9.1

^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH 13/13] net/enetc: fix crash at high speed traffic
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 13/13] net/enetc: fix crash at high speed traffic Gagandeep Singh
@ 2019-04-08 11:22   ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-08 11:22 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

On xmit side, there should be a check whether BD ring
has free BDs available before transmit a packet to avoid
data corruption and buffer leak issue.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: g.singh@nxp.com

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_rxtx.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index ed39665..baf5d27 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -49,11 +49,16 @@
 		uint16_t nb_pkts)
 {
 	struct enetc_swbd *tx_swbd;
-	int i, start;
+	int i, start, bds_to_use;
 	struct enetc_tx_bd *txbd;
 	struct enetc_bdr *tx_ring = (struct enetc_bdr *)tx_queue;
 
 	i = tx_ring->next_to_use;
+
+	bds_to_use = enetc_bd_unused(tx_ring);
+	if (bds_to_use < nb_pkts)
+		nb_pkts = bds_to_use;
+
 	start = 0;
 	while (nb_pkts--) {
 		enetc_clean_tx_ring(tx_ring);
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* Re: [dpdk-dev] [PATCH 05/13] net/enetc: add statistics APIs
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 05/13] net/enetc: add statistics APIs Gagandeep Singh
  2019-04-08 11:22   ` Gagandeep Singh
@ 2019-04-08 11:35   ` David Marchand
  2019-04-08 11:35     ` David Marchand
  2019-04-10 11:18     ` [dpdk-dev] [EXT] " Gagandeep Singh
  1 sibling, 2 replies; 126+ messages in thread
From: David Marchand @ 2019-04-08 11:35 UTC (permalink / raw)
  To: Gagandeep Singh; +Cc: dev, ferruh.yigit

On Mon, Apr 8, 2019 at 1:23 PM Gagandeep Singh <G.Singh@nxp.com> wrote:

> +static
> +int enetc_stats_get(struct rte_eth_dev *dev,
> +                   struct rte_eth_stats *stats)
> +{
> +       struct enetc_eth_hw *hw =
> +               ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
> +       struct enetc_hw *enetc_hw = &hw->hw;
> +
> +       if (stats == NULL)
> +               return -1;
>
+
> +       memset(stats, 0, sizeof(struct rte_eth_stats));
>

Both the check and the memset are unneeded.
https://git.dpdk.org/dpdk/tree/lib/librte_ethdev/rte_ethdev.c?h=v19.05-rc1#n1969


-- 
David Marchand

^ permalink raw reply	[flat|nested] 126+ messages in thread

* Re: [dpdk-dev] [PATCH 05/13] net/enetc: add statistics APIs
  2019-04-08 11:35   ` David Marchand
@ 2019-04-08 11:35     ` David Marchand
  2019-04-10 11:18     ` [dpdk-dev] [EXT] " Gagandeep Singh
  1 sibling, 0 replies; 126+ messages in thread
From: David Marchand @ 2019-04-08 11:35 UTC (permalink / raw)
  To: Gagandeep Singh; +Cc: dev, ferruh.yigit

On Mon, Apr 8, 2019 at 1:23 PM Gagandeep Singh <G.Singh@nxp.com> wrote:

> +static
> +int enetc_stats_get(struct rte_eth_dev *dev,
> +                   struct rte_eth_stats *stats)
> +{
> +       struct enetc_eth_hw *hw =
> +               ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
> +       struct enetc_hw *enetc_hw = &hw->hw;
> +
> +       if (stats == NULL)
> +               return -1;
>
+
> +       memset(stats, 0, sizeof(struct rte_eth_stats));
>

Both the check and the memset are unneeded.
https://git.dpdk.org/dpdk/tree/lib/librte_ethdev/rte_ethdev.c?h=v19.05-rc1#n1969


-- 
David Marchand

^ permalink raw reply	[flat|nested] 126+ messages in thread

* Re: [dpdk-dev] [PATCH 01/13] net/enetc: support physical addressing mode
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 01/13] net/enetc: support physical addressing mode Gagandeep Singh
  2019-04-08 11:22   ` Gagandeep Singh
@ 2019-04-08 13:16   ` Ferruh Yigit
  2019-04-08 13:16     ` Ferruh Yigit
  1 sibling, 1 reply; 126+ messages in thread
From: Ferruh Yigit @ 2019-04-08 13:16 UTC (permalink / raw)
  To: Gagandeep Singh, dev

On 4/8/2019 12:22 PM, Gagandeep Singh wrote:
> Support added for physical addressing mode and
> change driver flags to don't care.
> 
> Signed-off-by: Gagandeep Singh <g.singh@nxp.com>

Hi Gagandeep,

Since the patchset has been sent after RC1, I assume it is for 19.08. Can you
please mark patch title as 19.08 to not confuse with current release?

Thanks,
ferruh

^ permalink raw reply	[flat|nested] 126+ messages in thread

* Re: [dpdk-dev] [PATCH 01/13] net/enetc: support physical addressing mode
  2019-04-08 13:16   ` Ferruh Yigit
@ 2019-04-08 13:16     ` Ferruh Yigit
  0 siblings, 0 replies; 126+ messages in thread
From: Ferruh Yigit @ 2019-04-08 13:16 UTC (permalink / raw)
  To: Gagandeep Singh, dev

On 4/8/2019 12:22 PM, Gagandeep Singh wrote:
> Support added for physical addressing mode and
> change driver flags to don't care.
> 
> Signed-off-by: Gagandeep Singh <g.singh@nxp.com>

Hi Gagandeep,

Since the patchset has been sent after RC1, I assume it is for 19.08. Can you
please mark patch title as 19.08 to not confuse with current release?

Thanks,
ferruh


^ permalink raw reply	[flat|nested] 126+ messages in thread

* Re: [dpdk-dev] [EXT] Re: [PATCH 05/13] net/enetc: add statistics APIs
  2019-04-08 11:35   ` David Marchand
  2019-04-08 11:35     ` David Marchand
@ 2019-04-10 11:18     ` Gagandeep Singh
  2019-04-10 11:18       ` Gagandeep Singh
  1 sibling, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-10 11:18 UTC (permalink / raw)
  To: David Marchand; +Cc: dev, ferruh.yigit

Hi David,

I will incorporate your comments in v2.

Thanks,
Gagan

From: David Marchand <david.marchand@redhat.com>
Sent: Monday, April 8, 2019 5:06 PM
To: Gagandeep Singh <G.Singh@nxp.com>
Cc: dev@dpdk.org; ferruh.yigit@intel.com
Subject: [EXT] Re: [dpdk-dev] [PATCH 05/13] net/enetc: add statistics APIs


On Mon, Apr 8, 2019 at 1:23 PM Gagandeep Singh <G.Singh@nxp.com<mailto:G.Singh@nxp.com>> wrote:
+static
+int enetc_stats_get(struct rte_eth_dev *dev,
+                   struct rte_eth_stats *stats)
+{
+       struct enetc_eth_hw *hw =
+               ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       struct enetc_hw *enetc_hw = &hw->hw;
+
+       if (stats == NULL)
+               return -1;
+
+       memset(stats, 0, sizeof(struct rte_eth_stats));

Both the check and the memset are unneeded.
https://git.dpdk.org/dpdk/tree/lib/librte_ethdev/rte_ethdev.c?h=v19.05-rc1#n1969<https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgit.dpdk.org%2Fdpdk%2Ftree%2Flib%2Flibrte_ethdev%2Frte_ethdev.c%3Fh%3Dv19.05-rc1%23n1969&data=02%7C01%7CG.Singh%40nxp.com%7C803f77a628b944a3118308d6bc165532%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0%7C636903201440478754&sdata=Kc5hyTHdcOdAqPOTB%2ByClbzmclebaXJhZXcSMg0Q0RE%3D&reserved=0>


--
David Marchand

^ permalink raw reply	[flat|nested] 126+ messages in thread

* Re: [dpdk-dev] [EXT] Re: [PATCH 05/13] net/enetc: add statistics APIs
  2019-04-10 11:18     ` [dpdk-dev] [EXT] " Gagandeep Singh
@ 2019-04-10 11:18       ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-10 11:18 UTC (permalink / raw)
  To: David Marchand; +Cc: dev, ferruh.yigit

Hi David,

I will incorporate your comments in v2.

Thanks,
Gagan

From: David Marchand <david.marchand@redhat.com>
Sent: Monday, April 8, 2019 5:06 PM
To: Gagandeep Singh <G.Singh@nxp.com>
Cc: dev@dpdk.org; ferruh.yigit@intel.com
Subject: [EXT] Re: [dpdk-dev] [PATCH 05/13] net/enetc: add statistics APIs


On Mon, Apr 8, 2019 at 1:23 PM Gagandeep Singh <G.Singh@nxp.com<mailto:G.Singh@nxp.com>> wrote:
+static
+int enetc_stats_get(struct rte_eth_dev *dev,
+                   struct rte_eth_stats *stats)
+{
+       struct enetc_eth_hw *hw =
+               ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       struct enetc_hw *enetc_hw = &hw->hw;
+
+       if (stats == NULL)
+               return -1;
+
+       memset(stats, 0, sizeof(struct rte_eth_stats));

Both the check and the memset are unneeded.
https://git.dpdk.org/dpdk/tree/lib/librte_ethdev/rte_ethdev.c?h=v19.05-rc1#n1969<https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgit.dpdk.org%2Fdpdk%2Ftree%2Flib%2Flibrte_ethdev%2Frte_ethdev.c%3Fh%3Dv19.05-rc1%23n1969&data=02%7C01%7CG.Singh%40nxp.com%7C803f77a628b944a3118308d6bc165532%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0%7C636903201440478754&sdata=Kc5hyTHdcOdAqPOTB%2ByClbzmclebaXJhZXcSMg0Q0RE%3D&reserved=0>


--
David Marchand

^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 00/13] ENETC PMD basic features and bug fixes
  2019-04-08 11:22 [dpdk-dev] [PATCH 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                   ` (13 preceding siblings ...)
  2019-04-08 11:22 ` [dpdk-dev] [PATCH 13/13] net/enetc: fix crash at high speed traffic Gagandeep Singh
@ 2019-04-12  7:04 ` Gagandeep Singh
  2019-04-12  7:04   ` Gagandeep Singh
                     ` (14 more replies)
  14 siblings, 15 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

V1 log:
* support added for MTU, jumbo frame, queue start/stop, promiscuous,
  multicast, crc offload, RX checksum validation, basic stats
* some bug fixes

V2 change-log:
* remove unneeded code from stats get
* fix big endian compilation

Gagandeep Singh (13):
  net/enetc: support physical addressing mode
  net/enetc: fix SMMU unhandled context fault
  net/enetc: use correct buffer allocation API
  net/enetc: set interface mode for SXGMII
  net/enetc: add basic statistics
  net/enetc: replace register read/write macros with functions
  net/enetc: remove forward declarations
  net/enetc: enable promiscuous and allmulticast feature
  net/enetc: add MTU update and jumbo frames support
  net/enetc: enable Rx-Tx queue start/stop feature
  net/enetc: enable CRC offload feature
  net/enetc: enable Rx checksum offload validation
  net/enetc: fix crash at high speed traffic

 doc/guides/nics/enetc.rst          |   7 +
 doc/guides/nics/features/enetc.ini |   9 +
 drivers/net/enetc/base/enetc_hw.h  |  53 ++-
 drivers/net/enetc/enetc.h          |  13 +-
 drivers/net/enetc/enetc_ethdev.c   | 734 +++++++++++++++++++++++++------------
 drivers/net/enetc/enetc_rxtx.c     | 131 +++++--
 6 files changed, 682 insertions(+), 265 deletions(-)

-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 00/13] ENETC PMD basic features and bug fixes
  2019-04-12  7:04 ` [dpdk-dev] [PATCH v2 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
@ 2019-04-12  7:04   ` Gagandeep Singh
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 01/13] net/enetc: support physical addressing mode Gagandeep Singh
                     ` (13 subsequent siblings)
  14 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

V1 log:
* support added for MTU, jumbo frame, queue start/stop, promiscuous,
  multicast, crc offload, RX checksum validation, basic stats
* some bug fixes

V2 change-log:
* remove unneeded code from stats get
* fix big endian compilation

Gagandeep Singh (13):
  net/enetc: support physical addressing mode
  net/enetc: fix SMMU unhandled context fault
  net/enetc: use correct buffer allocation API
  net/enetc: set interface mode for SXGMII
  net/enetc: add basic statistics
  net/enetc: replace register read/write macros with functions
  net/enetc: remove forward declarations
  net/enetc: enable promiscuous and allmulticast feature
  net/enetc: add MTU update and jumbo frames support
  net/enetc: enable Rx-Tx queue start/stop feature
  net/enetc: enable CRC offload feature
  net/enetc: enable Rx checksum offload validation
  net/enetc: fix crash at high speed traffic

 doc/guides/nics/enetc.rst          |   7 +
 doc/guides/nics/features/enetc.ini |   9 +
 drivers/net/enetc/base/enetc_hw.h  |  53 ++-
 drivers/net/enetc/enetc.h          |  13 +-
 drivers/net/enetc/enetc_ethdev.c   | 734 +++++++++++++++++++++++++------------
 drivers/net/enetc/enetc_rxtx.c     | 131 +++++--
 6 files changed, 682 insertions(+), 265 deletions(-)

-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 01/13] net/enetc: support physical addressing mode
  2019-04-12  7:04 ` [dpdk-dev] [PATCH v2 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
  2019-04-12  7:04   ` Gagandeep Singh
@ 2019-04-12  7:04   ` Gagandeep Singh
  2019-04-12  7:04     ` Gagandeep Singh
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 02/13] net/enetc: fix SMMU unhandled context fault Gagandeep Singh
                     ` (12 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

Support added for physical addressing mode and
change driver flags to don't care.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 22 ++++++++++++----------
 drivers/net/enetc/enetc_rxtx.c   |  6 +++---
 2 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 023fe75..7a9a97d 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #include <stdbool.h>
@@ -334,14 +334,15 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
 {
 	int idx = tx_ring->index;
-	uintptr_t base_addr;
 	uint32_t tbmr;
+	phys_addr_t bd_address;
 
-	base_addr = (uintptr_t)tx_ring->bd_base;
+	bd_address = (phys_addr_t)
+		     rte_mem_virt2iova((const void *)tx_ring->bd_base);
 	enetc_txbdr_wr(hw, idx, ENETC_TBBAR0,
-		       lower_32_bits((uint64_t)base_addr));
+		       lower_32_bits((uint64_t)bd_address));
 	enetc_txbdr_wr(hw, idx, ENETC_TBBAR1,
-		       upper_32_bits((uint64_t)base_addr));
+		       upper_32_bits((uint64_t)bd_address));
 	enetc_txbdr_wr(hw, idx, ENETC_TBLENR,
 		       ENETC_RTBLENR_LEN(tx_ring->bd_count));
 
@@ -478,14 +479,15 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		  struct rte_mempool *mb_pool)
 {
 	int idx = rx_ring->index;
-	uintptr_t base_addr;
 	uint16_t buf_size;
+	phys_addr_t bd_address;
 
-	base_addr = (uintptr_t)rx_ring->bd_base;
+	bd_address = (phys_addr_t)
+		     rte_mem_virt2iova((const void *)rx_ring->bd_base);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBAR0,
-		       lower_32_bits((uint64_t)base_addr));
+		       lower_32_bits((uint64_t)bd_address));
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBAR1,
-		       upper_32_bits((uint64_t)base_addr));
+		       upper_32_bits((uint64_t)bd_address));
 	enetc_rxbdr_wr(hw, idx, ENETC_RBLENR,
 		       ENETC_RTBLENR_LEN(rx_ring->bd_count));
 
@@ -612,7 +614,7 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 
 static struct rte_pci_driver rte_enetc_pmd = {
 	.id_table = pci_id_enetc_map,
-	.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_IOVA_AS_VA,
+	.drv_flags = RTE_PCI_DRV_NEED_MAPPING,
 	.probe = enetc_pci_probe,
 	.remove = enetc_pci_remove,
 };
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 631e243..a31a387 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #include <stdbool.h>
@@ -64,7 +64,7 @@
 		txbd->buf_len = txbd->frm_len;
 		txbd->flags = rte_cpu_to_le_16(ENETC_TXBD_FLAGS_F);
 		txbd->addr = (uint64_t)(uintptr_t)
-		rte_cpu_to_le_64((size_t)tx_swbd->buffer_addr->buf_addr +
+		rte_cpu_to_le_64((size_t)tx_swbd->buffer_addr->buf_iova +
 				 tx_swbd->buffer_addr->data_off);
 		i++;
 		start++;
@@ -91,7 +91,7 @@
 		rx_swbd->buffer_addr =
 			rte_cpu_to_le_64(rte_mbuf_raw_alloc(rx_ring->mb_pool));
 		rxbd->w.addr = (uint64_t)(uintptr_t)
-			       rx_swbd->buffer_addr->buf_addr +
+			       rx_swbd->buffer_addr->buf_iova +
 			       rx_swbd->buffer_addr->data_off;
 		/* clear 'R" as well */
 		rxbd->r.lstatus = 0;
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 01/13] net/enetc: support physical addressing mode
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 01/13] net/enetc: support physical addressing mode Gagandeep Singh
@ 2019-04-12  7:04     ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

Support added for physical addressing mode and
change driver flags to don't care.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 22 ++++++++++++----------
 drivers/net/enetc/enetc_rxtx.c   |  6 +++---
 2 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 023fe75..7a9a97d 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #include <stdbool.h>
@@ -334,14 +334,15 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
 {
 	int idx = tx_ring->index;
-	uintptr_t base_addr;
 	uint32_t tbmr;
+	phys_addr_t bd_address;
 
-	base_addr = (uintptr_t)tx_ring->bd_base;
+	bd_address = (phys_addr_t)
+		     rte_mem_virt2iova((const void *)tx_ring->bd_base);
 	enetc_txbdr_wr(hw, idx, ENETC_TBBAR0,
-		       lower_32_bits((uint64_t)base_addr));
+		       lower_32_bits((uint64_t)bd_address));
 	enetc_txbdr_wr(hw, idx, ENETC_TBBAR1,
-		       upper_32_bits((uint64_t)base_addr));
+		       upper_32_bits((uint64_t)bd_address));
 	enetc_txbdr_wr(hw, idx, ENETC_TBLENR,
 		       ENETC_RTBLENR_LEN(tx_ring->bd_count));
 
@@ -478,14 +479,15 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		  struct rte_mempool *mb_pool)
 {
 	int idx = rx_ring->index;
-	uintptr_t base_addr;
 	uint16_t buf_size;
+	phys_addr_t bd_address;
 
-	base_addr = (uintptr_t)rx_ring->bd_base;
+	bd_address = (phys_addr_t)
+		     rte_mem_virt2iova((const void *)rx_ring->bd_base);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBAR0,
-		       lower_32_bits((uint64_t)base_addr));
+		       lower_32_bits((uint64_t)bd_address));
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBAR1,
-		       upper_32_bits((uint64_t)base_addr));
+		       upper_32_bits((uint64_t)bd_address));
 	enetc_rxbdr_wr(hw, idx, ENETC_RBLENR,
 		       ENETC_RTBLENR_LEN(rx_ring->bd_count));
 
@@ -612,7 +614,7 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 
 static struct rte_pci_driver rte_enetc_pmd = {
 	.id_table = pci_id_enetc_map,
-	.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_IOVA_AS_VA,
+	.drv_flags = RTE_PCI_DRV_NEED_MAPPING,
 	.probe = enetc_pci_probe,
 	.remove = enetc_pci_remove,
 };
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 631e243..a31a387 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #include <stdbool.h>
@@ -64,7 +64,7 @@
 		txbd->buf_len = txbd->frm_len;
 		txbd->flags = rte_cpu_to_le_16(ENETC_TXBD_FLAGS_F);
 		txbd->addr = (uint64_t)(uintptr_t)
-		rte_cpu_to_le_64((size_t)tx_swbd->buffer_addr->buf_addr +
+		rte_cpu_to_le_64((size_t)tx_swbd->buffer_addr->buf_iova +
 				 tx_swbd->buffer_addr->data_off);
 		i++;
 		start++;
@@ -91,7 +91,7 @@
 		rx_swbd->buffer_addr =
 			rte_cpu_to_le_64(rte_mbuf_raw_alloc(rx_ring->mb_pool));
 		rxbd->w.addr = (uint64_t)(uintptr_t)
-			       rx_swbd->buffer_addr->buf_addr +
+			       rx_swbd->buffer_addr->buf_iova +
 			       rx_swbd->buffer_addr->data_off;
 		/* clear 'R" as well */
 		rxbd->r.lstatus = 0;
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 02/13] net/enetc: fix SMMU unhandled context fault
  2019-04-12  7:04 ` [dpdk-dev] [PATCH v2 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
  2019-04-12  7:04   ` Gagandeep Singh
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 01/13] net/enetc: support physical addressing mode Gagandeep Singh
@ 2019-04-12  7:04   ` Gagandeep Singh
  2019-04-12  7:04     ` Gagandeep Singh
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 03/13] net/enetc: use correct buffer allocation API Gagandeep Singh
                     ` (11 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

First configure ring with BDs properly then enable
the ring.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: g.singh@nxp.com

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 7a9a97d..f1807b9 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -492,15 +492,15 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		       ENETC_RTBLENR_LEN(rx_ring->bd_count));
 
 	rx_ring->mb_pool = mb_pool;
-	/* enable ring */
-	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
-	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 	rx_ring->rcir = (void *)((size_t)hw->reg +
 			ENETC_BDR(RX, idx, ENETC_RBCIR));
 	enetc_refill_rx_ring(rx_ring, (enetc_bd_unused(rx_ring)));
 	buf_size = (uint16_t)(rte_pktmbuf_data_room_size(rx_ring->mb_pool) -
 		   RTE_PKTMBUF_HEADROOM);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBSR, buf_size);
+	/* enable ring */
+	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
+	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 }
 
 static int
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 02/13] net/enetc: fix SMMU unhandled context fault
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 02/13] net/enetc: fix SMMU unhandled context fault Gagandeep Singh
@ 2019-04-12  7:04     ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

First configure ring with BDs properly then enable
the ring.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: g.singh@nxp.com

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 7a9a97d..f1807b9 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -492,15 +492,15 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		       ENETC_RTBLENR_LEN(rx_ring->bd_count));
 
 	rx_ring->mb_pool = mb_pool;
-	/* enable ring */
-	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
-	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 	rx_ring->rcir = (void *)((size_t)hw->reg +
 			ENETC_BDR(RX, idx, ENETC_RBCIR));
 	enetc_refill_rx_ring(rx_ring, (enetc_bd_unused(rx_ring)));
 	buf_size = (uint16_t)(rte_pktmbuf_data_room_size(rx_ring->mb_pool) -
 		   RTE_PKTMBUF_HEADROOM);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBSR, buf_size);
+	/* enable ring */
+	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
+	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 }
 
 static int
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 03/13] net/enetc: use correct buffer allocation API
  2019-04-12  7:04 ` [dpdk-dev] [PATCH v2 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                     ` (2 preceding siblings ...)
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 02/13] net/enetc: fix SMMU unhandled context fault Gagandeep Singh
@ 2019-04-12  7:04   ` Gagandeep Singh
  2019-04-12  7:04     ` Gagandeep Singh
  2019-04-12  8:37     ` Thomas Monjalon
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 04/13] net/enetc: set interface mode for SXGMII Gagandeep Singh
                     ` (10 subsequent siblings)
  14 siblings, 2 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

rte_pktmbuf_alloc API should be used to allocate mbuf
instead of rte_pktmbuf_raw_alloc to avoid use of stale mbuf
information.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: g.singh@nxp.com

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_rxtx.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index a31a387..42f16ca 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -88,8 +88,9 @@
 	rx_swbd = &rx_ring->q_swbd[i];
 	rxbd = ENETC_RXBD(*rx_ring, i);
 	for (j = 0; j < buff_cnt; j++) {
-		rx_swbd->buffer_addr =
-			rte_cpu_to_le_64(rte_mbuf_raw_alloc(rx_ring->mb_pool));
+		rx_swbd->buffer_addr = (void *)(uintptr_t)
+			rte_cpu_to_le_64((uint64_t)(uintptr_t)
+					rte_pktmbuf_alloc(rx_ring->mb_pool));
 		rxbd->w.addr = (uint64_t)(uintptr_t)
 			       rx_swbd->buffer_addr->buf_iova +
 			       rx_swbd->buffer_addr->data_off;
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 03/13] net/enetc: use correct buffer allocation API
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 03/13] net/enetc: use correct buffer allocation API Gagandeep Singh
@ 2019-04-12  7:04     ` Gagandeep Singh
  2019-04-12  8:37     ` Thomas Monjalon
  1 sibling, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

rte_pktmbuf_alloc API should be used to allocate mbuf
instead of rte_pktmbuf_raw_alloc to avoid use of stale mbuf
information.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: g.singh@nxp.com

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_rxtx.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index a31a387..42f16ca 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -88,8 +88,9 @@
 	rx_swbd = &rx_ring->q_swbd[i];
 	rxbd = ENETC_RXBD(*rx_ring, i);
 	for (j = 0; j < buff_cnt; j++) {
-		rx_swbd->buffer_addr =
-			rte_cpu_to_le_64(rte_mbuf_raw_alloc(rx_ring->mb_pool));
+		rx_swbd->buffer_addr = (void *)(uintptr_t)
+			rte_cpu_to_le_64((uint64_t)(uintptr_t)
+					rte_pktmbuf_alloc(rx_ring->mb_pool));
 		rxbd->w.addr = (uint64_t)(uintptr_t)
 			       rx_swbd->buffer_addr->buf_iova +
 			       rx_swbd->buffer_addr->data_off;
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 04/13] net/enetc: set interface mode for SXGMII
  2019-04-12  7:04 ` [dpdk-dev] [PATCH v2 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                     ` (3 preceding siblings ...)
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 03/13] net/enetc: use correct buffer allocation API Gagandeep Singh
@ 2019-04-12  7:04   ` Gagandeep Singh
  2019-04-12  7:04     ` Gagandeep Singh
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 05/13] net/enetc: add basic statistics Gagandeep Singh
                     ` (9 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

Support for SXGMII port has been enabled. It will
depends on boot loader information passed through IERB.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/base/enetc_hw.h | 13 ++++++++++++-
 drivers/net/enetc/enetc_ethdev.c  | 11 +++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index f36fa11..e3738a6 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #ifndef _ENETC_HW_H_
@@ -84,6 +84,12 @@
 #define ENETC_PSIPMAR1(n)		(0x00104 + (n) * 0x20)
 #define ENETC_PCAPR0			0x00900
 #define ENETC_PCAPR1			0x00904
+#define ENETC_PM0_IF_MODE		0x8300
+#define ENETC_PM1_IF_MODE		0x9300
+#define ENETC_PMO_IFM_RG		BIT(2)
+#define ENETC_PM0_IFM_RLP		(BIT(5) | BIT(11))
+#define ENETC_PM0_IFM_RGAUTO		(BIT(15) | ENETC_PMO_IFM_RG | BIT(1))
+#define ENETC_PM0_IFM_XGMII		BIT(12)
 
 #define ENETC_PV0CFGR(n)		(0x00920 + (n) * 0x10)
 #define ENETC_PVCFGR_SET_TXBDR(val)	((val) & 0xff)
@@ -109,6 +115,11 @@
 #define ENETC_G_EIPBRR0			0x00bf8
 #define ENETC_G_EIPBRR1			0x00bfc
 
+
+/* MAC Counters */
+#define ENETC_G_EPFBLPR(n)		(0xd00 + 4 * (n))
+#define ENETC_G_EPFBLPR1_XGMII		0x80000000
+
 /* general register accessors */
 #define enetc_rd_reg(reg)	rte_read32((void *)(reg))
 #define enetc_wr_reg(reg, val)	rte_write32((val), (void *)(reg))
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index f1807b9..91e9692 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -139,6 +139,17 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
 			val | ENETC_PMR_EN);
 
+	/* set auto-speed for RGMII */
+	if (enetc_port_rd(&hw->hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
+		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+	}
+	if (enetc_global_rd(&hw->hw,
+			    ENETC_G_EPFBLPR(1)) == ENETC_G_EPFBLPR1_XGMII) {
+		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_XGMII);
+	}
+
 	return 0;
 }
 
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 04/13] net/enetc: set interface mode for SXGMII
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 04/13] net/enetc: set interface mode for SXGMII Gagandeep Singh
@ 2019-04-12  7:04     ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

Support for SXGMII port has been enabled. It will
depends on boot loader information passed through IERB.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/base/enetc_hw.h | 13 ++++++++++++-
 drivers/net/enetc/enetc_ethdev.c  | 11 +++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index f36fa11..e3738a6 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #ifndef _ENETC_HW_H_
@@ -84,6 +84,12 @@
 #define ENETC_PSIPMAR1(n)		(0x00104 + (n) * 0x20)
 #define ENETC_PCAPR0			0x00900
 #define ENETC_PCAPR1			0x00904
+#define ENETC_PM0_IF_MODE		0x8300
+#define ENETC_PM1_IF_MODE		0x9300
+#define ENETC_PMO_IFM_RG		BIT(2)
+#define ENETC_PM0_IFM_RLP		(BIT(5) | BIT(11))
+#define ENETC_PM0_IFM_RGAUTO		(BIT(15) | ENETC_PMO_IFM_RG | BIT(1))
+#define ENETC_PM0_IFM_XGMII		BIT(12)
 
 #define ENETC_PV0CFGR(n)		(0x00920 + (n) * 0x10)
 #define ENETC_PVCFGR_SET_TXBDR(val)	((val) & 0xff)
@@ -109,6 +115,11 @@
 #define ENETC_G_EIPBRR0			0x00bf8
 #define ENETC_G_EIPBRR1			0x00bfc
 
+
+/* MAC Counters */
+#define ENETC_G_EPFBLPR(n)		(0xd00 + 4 * (n))
+#define ENETC_G_EPFBLPR1_XGMII		0x80000000
+
 /* general register accessors */
 #define enetc_rd_reg(reg)	rte_read32((void *)(reg))
 #define enetc_wr_reg(reg, val)	rte_write32((val), (void *)(reg))
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index f1807b9..91e9692 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -139,6 +139,17 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
 			val | ENETC_PMR_EN);
 
+	/* set auto-speed for RGMII */
+	if (enetc_port_rd(&hw->hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
+		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+	}
+	if (enetc_global_rd(&hw->hw,
+			    ENETC_G_EPFBLPR(1)) == ENETC_G_EPFBLPR1_XGMII) {
+		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_XGMII);
+	}
+
 	return 0;
 }
 
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 05/13] net/enetc: add basic statistics
  2019-04-12  7:04 ` [dpdk-dev] [PATCH v2 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                     ` (4 preceding siblings ...)
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 04/13] net/enetc: set interface mode for SXGMII Gagandeep Singh
@ 2019-04-12  7:04   ` Gagandeep Singh
  2019-04-12  7:04     ` Gagandeep Singh
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 06/13] net/enetc: replace register read/write macros with functions Gagandeep Singh
                     ` (8 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

Enable basic statistics APIs enetc_stats_get
and enetc_stats_reset.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  1 +
 drivers/net/enetc/base/enetc_hw.h  | 27 ++++++++++++++++++++++++-
 drivers/net/enetc/enetc_ethdev.c   | 41 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 69 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 8038bf2..9f575d2 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -46,6 +46,7 @@ ENETC Features
 
 - Link Status
 - Packet type information
+- Basic stats
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 69476a2..d8bd567 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -6,6 +6,7 @@
 [Features]
 Packet type parsing  = Y
 Link status          = Y
+Basic stats          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index e3738a6..3f0a2a9 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -115,8 +115,33 @@
 #define ENETC_G_EIPBRR0			0x00bf8
 #define ENETC_G_EIPBRR1			0x00bfc
 
-
 /* MAC Counters */
+/* Config register to reset counters*/
+#define ENETC_PM0_STAT_CONFIG		0x080E0
+/* Receive frames counter without error */
+#define ENETC_PM0_RFRM			0x08120
+/* Receive packets counter, good + bad */
+#define ENETC_PM0_RPKT			0x08160
+/* Received octets, good + bad */
+#define ENETC_PM0_REOCT			0x08120
+/* Transmit octets, good + bad */
+#define ENETC_PM0_TEOCT			0x08200
+/* Transmit frames counter without error */
+#define ENETC_PM0_TFRM			0x08220
+/* Transmit packets counter, good + bad */
+#define ENETC_PM0_TPKT			0x08260
+/* Dropped not Truncated packets counter */
+#define ENETC_PM0_RDRNTP		0x081C8
+/* Dropped + trucated packets counter */
+#define ENETC_PM0_RDRP			0x08158
+/* Receive packets error counter */
+#define ENETC_PM0_RERR			0x08138
+/* Transmit packets error counter */
+#define ENETC_PM0_TERR			0x08238
+
+/* Stats Reset Bit*/
+#define ENETC_CLEAR_STATS		BIT(2)
+
 #define ENETC_G_EPFBLPR(n)		(0xd00 + 4 * (n))
 #define ENETC_G_EPFBLPR1_XGMII		0x80000000
 
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 91e9692..10b2b39 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -29,6 +29,9 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		const struct rte_eth_txconf *tx_conf);
 static void enetc_tx_queue_release(void *txq);
 static const uint32_t *enetc_supported_ptypes_get(struct rte_eth_dev *dev);
+static int enetc_stats_get(struct rte_eth_dev *dev,
+		struct rte_eth_stats *stats);
+static void enetc_stats_reset(struct rte_eth_dev *dev);
 
 /*
  * The set of PCI devices this driver supports
@@ -46,6 +49,8 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	.dev_stop             = enetc_dev_stop,
 	.dev_close            = enetc_dev_close,
 	.link_update          = enetc_link_update,
+	.stats_get            = enetc_stats_get,
+	.stats_reset          = enetc_stats_reset,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
@@ -608,6 +613,42 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	rte_free(rx_ring);
 }
 
+static
+int enetc_stats_get(struct rte_eth_dev *dev,
+		    struct rte_eth_stats *stats)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	/* Total received packets, bad + good, if we want to get counters of
+	 * only good received packets then use ENETC_PM0_RFRM,
+	 * ENETC_PM0_TFRM registers.
+	 */
+	stats->ipackets = enetc_port_rd(enetc_hw, ENETC_PM0_RPKT);
+	stats->opackets = enetc_port_rd(enetc_hw, ENETC_PM0_TPKT);
+	stats->ibytes =  enetc_port_rd(enetc_hw, ENETC_PM0_REOCT);
+	stats->obytes = enetc_port_rd(enetc_hw, ENETC_PM0_TEOCT);
+	/* Dropped + Truncated packets, use ENETC_PM0_RDRNTP for without
+	 * truncated packets
+	 */
+	stats->imissed = enetc_port_rd(enetc_hw, ENETC_PM0_RDRP);
+	stats->ierrors = enetc_port_rd(enetc_hw, ENETC_PM0_RERR);
+	stats->oerrors = enetc_port_rd(enetc_hw, ENETC_PM0_TERR);
+
+	return 0;
+}
+
+static void
+enetc_stats_reset(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	enetc_port_wr(enetc_hw, ENETC_PM0_STAT_CONFIG, ENETC_CLEAR_STATS);
+}
+
 static int
 enetc_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 			   struct rte_pci_device *pci_dev)
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 05/13] net/enetc: add basic statistics
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 05/13] net/enetc: add basic statistics Gagandeep Singh
@ 2019-04-12  7:04     ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

Enable basic statistics APIs enetc_stats_get
and enetc_stats_reset.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  1 +
 drivers/net/enetc/base/enetc_hw.h  | 27 ++++++++++++++++++++++++-
 drivers/net/enetc/enetc_ethdev.c   | 41 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 69 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 8038bf2..9f575d2 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -46,6 +46,7 @@ ENETC Features
 
 - Link Status
 - Packet type information
+- Basic stats
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 69476a2..d8bd567 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -6,6 +6,7 @@
 [Features]
 Packet type parsing  = Y
 Link status          = Y
+Basic stats          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index e3738a6..3f0a2a9 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -115,8 +115,33 @@
 #define ENETC_G_EIPBRR0			0x00bf8
 #define ENETC_G_EIPBRR1			0x00bfc
 
-
 /* MAC Counters */
+/* Config register to reset counters*/
+#define ENETC_PM0_STAT_CONFIG		0x080E0
+/* Receive frames counter without error */
+#define ENETC_PM0_RFRM			0x08120
+/* Receive packets counter, good + bad */
+#define ENETC_PM0_RPKT			0x08160
+/* Received octets, good + bad */
+#define ENETC_PM0_REOCT			0x08120
+/* Transmit octets, good + bad */
+#define ENETC_PM0_TEOCT			0x08200
+/* Transmit frames counter without error */
+#define ENETC_PM0_TFRM			0x08220
+/* Transmit packets counter, good + bad */
+#define ENETC_PM0_TPKT			0x08260
+/* Dropped not Truncated packets counter */
+#define ENETC_PM0_RDRNTP		0x081C8
+/* Dropped + trucated packets counter */
+#define ENETC_PM0_RDRP			0x08158
+/* Receive packets error counter */
+#define ENETC_PM0_RERR			0x08138
+/* Transmit packets error counter */
+#define ENETC_PM0_TERR			0x08238
+
+/* Stats Reset Bit*/
+#define ENETC_CLEAR_STATS		BIT(2)
+
 #define ENETC_G_EPFBLPR(n)		(0xd00 + 4 * (n))
 #define ENETC_G_EPFBLPR1_XGMII		0x80000000
 
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 91e9692..10b2b39 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -29,6 +29,9 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		const struct rte_eth_txconf *tx_conf);
 static void enetc_tx_queue_release(void *txq);
 static const uint32_t *enetc_supported_ptypes_get(struct rte_eth_dev *dev);
+static int enetc_stats_get(struct rte_eth_dev *dev,
+		struct rte_eth_stats *stats);
+static void enetc_stats_reset(struct rte_eth_dev *dev);
 
 /*
  * The set of PCI devices this driver supports
@@ -46,6 +49,8 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	.dev_stop             = enetc_dev_stop,
 	.dev_close            = enetc_dev_close,
 	.link_update          = enetc_link_update,
+	.stats_get            = enetc_stats_get,
+	.stats_reset          = enetc_stats_reset,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
@@ -608,6 +613,42 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	rte_free(rx_ring);
 }
 
+static
+int enetc_stats_get(struct rte_eth_dev *dev,
+		    struct rte_eth_stats *stats)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	/* Total received packets, bad + good, if we want to get counters of
+	 * only good received packets then use ENETC_PM0_RFRM,
+	 * ENETC_PM0_TFRM registers.
+	 */
+	stats->ipackets = enetc_port_rd(enetc_hw, ENETC_PM0_RPKT);
+	stats->opackets = enetc_port_rd(enetc_hw, ENETC_PM0_TPKT);
+	stats->ibytes =  enetc_port_rd(enetc_hw, ENETC_PM0_REOCT);
+	stats->obytes = enetc_port_rd(enetc_hw, ENETC_PM0_TEOCT);
+	/* Dropped + Truncated packets, use ENETC_PM0_RDRNTP for without
+	 * truncated packets
+	 */
+	stats->imissed = enetc_port_rd(enetc_hw, ENETC_PM0_RDRP);
+	stats->ierrors = enetc_port_rd(enetc_hw, ENETC_PM0_RERR);
+	stats->oerrors = enetc_port_rd(enetc_hw, ENETC_PM0_TERR);
+
+	return 0;
+}
+
+static void
+enetc_stats_reset(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	enetc_port_wr(enetc_hw, ENETC_PM0_STAT_CONFIG, ENETC_CLEAR_STATS);
+}
+
 static int
 enetc_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 			   struct rte_pci_device *pci_dev)
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 06/13] net/enetc: replace register read/write macros with functions
  2019-04-12  7:04 ` [dpdk-dev] [PATCH v2 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                     ` (5 preceding siblings ...)
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 05/13] net/enetc: add basic statistics Gagandeep Singh
@ 2019-04-12  7:04   ` Gagandeep Singh
  2019-04-12  7:04     ` Gagandeep Singh
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 07/13] net/enetc: remove forward declarations Gagandeep Singh
                     ` (7 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

Replacing read-write macros with already available
read-write functions.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc.h        |  7 +----
 drivers/net/enetc/enetc_ethdev.c | 61 ++++++++++++++++++++--------------------
 2 files changed, 31 insertions(+), 37 deletions(-)

diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index 0e80d1c..56454dc 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #ifndef _ENETC_H_
@@ -86,11 +86,6 @@ struct enetc_eth_adapter {
 #define ENETC_DEV_PRIVATE_TO_INTR(adapter) \
 	(&((struct enetc_eth_adapter *)adapter)->intr)
 
-#define ENETC_GET_HW_ADDR(reg, addr) ((void *)(((size_t)reg) + (addr)))
-#define ENETC_REG_READ(addr) (*(uint32_t *)addr)
-#define ENETC_REG_WRITE(addr, val) (*(uint32_t *)addr = val)
-#define ENETC_REG_WRITE_RELAXED(addr, val) (*(uint32_t *)addr = val)
-
 /*
  * RX/TX ENETC function prototypes
  */
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 10b2b39..2d8c4e6 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -131,28 +131,31 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	uint32_t val;
 
 	PMD_INIT_FUNC_TRACE();
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-			     ENETC_PM0_CMD_CFG));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PM0_CMD_CFG),
-			val | ENETC_PM0_TX_EN | ENETC_PM0_RX_EN);
+	val = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+	enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG,
+		      val | ENETC_PM0_TX_EN | ENETC_PM0_RX_EN);
 
 	/* Enable port */
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
-			val | ENETC_PMR_EN);
+	val = enetc_port_rd(enetc_hw, ENETC_PMR);
+	enetc_port_wr(enetc_hw, ENETC_PMR, val | ENETC_PMR_EN);
 
 	/* set auto-speed for RGMII */
-	if (enetc_port_rd(&hw->hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
-		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_RGAUTO);
-		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+	if (enetc_port_rd(enetc_hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
+		enetc_port_wr(enetc_hw, ENETC_PM0_IF_MODE,
+			      ENETC_PM0_IFM_RGAUTO);
+		enetc_port_wr(enetc_hw, ENETC_PM1_IF_MODE,
+			      ENETC_PM0_IFM_RGAUTO);
 	}
-	if (enetc_global_rd(&hw->hw,
+	if (enetc_global_rd(enetc_hw,
 			    ENETC_G_EPFBLPR(1)) == ENETC_G_EPFBLPR1_XGMII) {
-		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_XGMII);
-		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(enetc_hw, ENETC_PM0_IF_MODE,
+			      ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(enetc_hw, ENETC_PM1_IF_MODE,
+			      ENETC_PM0_IFM_XGMII);
 	}
 
 	return 0;
@@ -163,18 +166,17 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	uint32_t val;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Disable port */
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
-			val & (~ENETC_PMR_EN));
-
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-			     ENETC_PM0_CMD_CFG));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PM0_CMD_CFG),
-			val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
+	val = enetc_port_rd(enetc_hw, ENETC_PMR);
+	enetc_port_wr(enetc_hw, ENETC_PMR, val & (~ENETC_PMR_EN));
+
+	val = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+	enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG,
+		      val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
 }
 
 static void
@@ -221,6 +223,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	struct rte_eth_link link;
 	uint32_t status;
 
@@ -228,8 +231,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 
 	memset(&link, 0, sizeof(link));
 
-	status = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-				ENETC_PM0_STATUS));
+	status = enetc_port_rd(enetc_hw, ENETC_PM0_STATUS);
 
 	if (status & ENETC_LINK_MODE)
 		link.link_duplex = ETH_LINK_FULL_DUPLEX;
@@ -262,6 +264,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 enetc_hardware_init(struct enetc_eth_hw *hw)
 {
 	uint32_t psipmr = 0;
+	struct enetc_hw *enetc_hw = &hw->hw;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Calculating and storing the base HW addresses */
@@ -269,8 +272,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 	hw->hw.global = (void *)((size_t)hw->hw.reg + ENETC_GLOBAL_BASE);
 
 	/* Enabling Station Interface */
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.reg, ENETC_SIMR),
-					  ENETC_SIMR_EN);
+	enetc_wr(enetc_hw, ENETC_SIMR, ENETC_SIMR_EN);
 
 	/* Setting to accept broadcast packets for each inetrface */
 	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0) |
@@ -280,14 +282,11 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 	psipmr |= ENETC_PSIPMR_SET_UP(2) | ENETC_PSIPMR_SET_MP(2) |
 		  ENETC_PSIPMR_SET_VLAN_MP(2);
 
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMR),
-			psipmr);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
 
 	/* Enabling broadcast address */
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMAR0(0)),
-			0xFFFFFFFF);
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMAR1(0)),
-			0xFFFF << 16);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMAR0(0), 0xFFFFFFFF);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMAR1(0), 0xFFFF << 16);
 
 	return 0;
 }
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 06/13] net/enetc: replace register read/write macros with functions
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 06/13] net/enetc: replace register read/write macros with functions Gagandeep Singh
@ 2019-04-12  7:04     ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

Replacing read-write macros with already available
read-write functions.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc.h        |  7 +----
 drivers/net/enetc/enetc_ethdev.c | 61 ++++++++++++++++++++--------------------
 2 files changed, 31 insertions(+), 37 deletions(-)

diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index 0e80d1c..56454dc 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #ifndef _ENETC_H_
@@ -86,11 +86,6 @@ struct enetc_eth_adapter {
 #define ENETC_DEV_PRIVATE_TO_INTR(adapter) \
 	(&((struct enetc_eth_adapter *)adapter)->intr)
 
-#define ENETC_GET_HW_ADDR(reg, addr) ((void *)(((size_t)reg) + (addr)))
-#define ENETC_REG_READ(addr) (*(uint32_t *)addr)
-#define ENETC_REG_WRITE(addr, val) (*(uint32_t *)addr = val)
-#define ENETC_REG_WRITE_RELAXED(addr, val) (*(uint32_t *)addr = val)
-
 /*
  * RX/TX ENETC function prototypes
  */
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 10b2b39..2d8c4e6 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -131,28 +131,31 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	uint32_t val;
 
 	PMD_INIT_FUNC_TRACE();
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-			     ENETC_PM0_CMD_CFG));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PM0_CMD_CFG),
-			val | ENETC_PM0_TX_EN | ENETC_PM0_RX_EN);
+	val = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+	enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG,
+		      val | ENETC_PM0_TX_EN | ENETC_PM0_RX_EN);
 
 	/* Enable port */
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
-			val | ENETC_PMR_EN);
+	val = enetc_port_rd(enetc_hw, ENETC_PMR);
+	enetc_port_wr(enetc_hw, ENETC_PMR, val | ENETC_PMR_EN);
 
 	/* set auto-speed for RGMII */
-	if (enetc_port_rd(&hw->hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
-		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_RGAUTO);
-		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+	if (enetc_port_rd(enetc_hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
+		enetc_port_wr(enetc_hw, ENETC_PM0_IF_MODE,
+			      ENETC_PM0_IFM_RGAUTO);
+		enetc_port_wr(enetc_hw, ENETC_PM1_IF_MODE,
+			      ENETC_PM0_IFM_RGAUTO);
 	}
-	if (enetc_global_rd(&hw->hw,
+	if (enetc_global_rd(enetc_hw,
 			    ENETC_G_EPFBLPR(1)) == ENETC_G_EPFBLPR1_XGMII) {
-		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_XGMII);
-		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(enetc_hw, ENETC_PM0_IF_MODE,
+			      ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(enetc_hw, ENETC_PM1_IF_MODE,
+			      ENETC_PM0_IFM_XGMII);
 	}
 
 	return 0;
@@ -163,18 +166,17 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	uint32_t val;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Disable port */
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
-			val & (~ENETC_PMR_EN));
-
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-			     ENETC_PM0_CMD_CFG));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PM0_CMD_CFG),
-			val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
+	val = enetc_port_rd(enetc_hw, ENETC_PMR);
+	enetc_port_wr(enetc_hw, ENETC_PMR, val & (~ENETC_PMR_EN));
+
+	val = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+	enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG,
+		      val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
 }
 
 static void
@@ -221,6 +223,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	struct rte_eth_link link;
 	uint32_t status;
 
@@ -228,8 +231,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 
 	memset(&link, 0, sizeof(link));
 
-	status = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-				ENETC_PM0_STATUS));
+	status = enetc_port_rd(enetc_hw, ENETC_PM0_STATUS);
 
 	if (status & ENETC_LINK_MODE)
 		link.link_duplex = ETH_LINK_FULL_DUPLEX;
@@ -262,6 +264,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 enetc_hardware_init(struct enetc_eth_hw *hw)
 {
 	uint32_t psipmr = 0;
+	struct enetc_hw *enetc_hw = &hw->hw;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Calculating and storing the base HW addresses */
@@ -269,8 +272,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 	hw->hw.global = (void *)((size_t)hw->hw.reg + ENETC_GLOBAL_BASE);
 
 	/* Enabling Station Interface */
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.reg, ENETC_SIMR),
-					  ENETC_SIMR_EN);
+	enetc_wr(enetc_hw, ENETC_SIMR, ENETC_SIMR_EN);
 
 	/* Setting to accept broadcast packets for each inetrface */
 	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0) |
@@ -280,14 +282,11 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 	psipmr |= ENETC_PSIPMR_SET_UP(2) | ENETC_PSIPMR_SET_MP(2) |
 		  ENETC_PSIPMR_SET_VLAN_MP(2);
 
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMR),
-			psipmr);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
 
 	/* Enabling broadcast address */
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMAR0(0)),
-			0xFFFFFFFF);
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMAR1(0)),
-			0xFFFF << 16);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMAR0(0), 0xFFFFFFFF);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMAR1(0), 0xFFFF << 16);
 
 	return 0;
 }
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 07/13] net/enetc: remove forward declarations
  2019-04-12  7:04 ` [dpdk-dev] [PATCH v2 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                     ` (6 preceding siblings ...)
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 06/13] net/enetc: replace register read/write macros with functions Gagandeep Singh
@ 2019-04-12  7:04   ` Gagandeep Singh
  2019-04-12  7:04     ` Gagandeep Singh
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 08/13] net/enetc: enable promiscuous and allmulticast feature Gagandeep Singh
                     ` (6 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

Remove unneeded forward declarations and re-order the code.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 237 ++++++++++++++++++---------------------
 1 file changed, 107 insertions(+), 130 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 2d8c4e6..d0f9e2b 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -10,115 +10,6 @@
 
 int enetc_logtype_pmd;
 
-/* Functions Prototypes */
-static int enetc_dev_configure(struct rte_eth_dev *dev);
-static int enetc_dev_start(struct rte_eth_dev *dev);
-static void enetc_dev_stop(struct rte_eth_dev *dev);
-static void enetc_dev_close(struct rte_eth_dev *dev);
-static void enetc_dev_infos_get(struct rte_eth_dev *dev,
-				struct rte_eth_dev_info *dev_info);
-static int enetc_link_update(struct rte_eth_dev *dev, int wait_to_complete);
-static int enetc_hardware_init(struct enetc_eth_hw *hw);
-static int enetc_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id,
-		uint16_t nb_rx_desc, unsigned int socket_id,
-		const struct rte_eth_rxconf *rx_conf,
-		struct rte_mempool *mb_pool);
-static void enetc_rx_queue_release(void *rxq);
-static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
-		uint16_t nb_tx_desc, unsigned int socket_id,
-		const struct rte_eth_txconf *tx_conf);
-static void enetc_tx_queue_release(void *txq);
-static const uint32_t *enetc_supported_ptypes_get(struct rte_eth_dev *dev);
-static int enetc_stats_get(struct rte_eth_dev *dev,
-		struct rte_eth_stats *stats);
-static void enetc_stats_reset(struct rte_eth_dev *dev);
-
-/*
- * The set of PCI devices this driver supports
- */
-static const struct rte_pci_id pci_id_enetc_map[] = {
-	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID) },
-	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID_VF) },
-	{ .vendor_id = 0, /* sentinel */ },
-};
-
-/* Features supported by this driver */
-static const struct eth_dev_ops enetc_ops = {
-	.dev_configure        = enetc_dev_configure,
-	.dev_start            = enetc_dev_start,
-	.dev_stop             = enetc_dev_stop,
-	.dev_close            = enetc_dev_close,
-	.link_update          = enetc_link_update,
-	.stats_get            = enetc_stats_get,
-	.stats_reset          = enetc_stats_reset,
-	.dev_infos_get        = enetc_dev_infos_get,
-	.rx_queue_setup       = enetc_rx_queue_setup,
-	.rx_queue_release     = enetc_rx_queue_release,
-	.tx_queue_setup       = enetc_tx_queue_setup,
-	.tx_queue_release     = enetc_tx_queue_release,
-	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
-};
-
-/**
- * Initialisation of the enetc device
- *
- * @param eth_dev
- *   - Pointer to the structure rte_eth_dev
- *
- * @return
- *   - On success, zero.
- *   - On failure, negative value.
- */
-static int
-enetc_dev_init(struct rte_eth_dev *eth_dev)
-{
-	int error = 0;
-	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
-	struct enetc_eth_hw *hw =
-		ENETC_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
-
-	PMD_INIT_FUNC_TRACE();
-	eth_dev->dev_ops = &enetc_ops;
-	eth_dev->rx_pkt_burst = &enetc_recv_pkts;
-	eth_dev->tx_pkt_burst = &enetc_xmit_pkts;
-
-	/* Retrieving and storing the HW base address of device */
-	hw->hw.reg = (void *)pci_dev->mem_resource[0].addr;
-	hw->device_id = pci_dev->id.device_id;
-
-	error = enetc_hardware_init(hw);
-	if (error != 0) {
-		ENETC_PMD_ERR("Hardware initialization failed");
-		return -1;
-	}
-
-	/* Allocate memory for storing MAC addresses */
-	eth_dev->data->mac_addrs = rte_zmalloc("enetc_eth", ETHER_ADDR_LEN, 0);
-	if (!eth_dev->data->mac_addrs) {
-		ENETC_PMD_ERR("Failed to allocate %d bytes needed to "
-			      "store MAC addresses",
-			      ETHER_ADDR_LEN * 1);
-		error = -ENOMEM;
-		return -1;
-	}
-
-	/* Copy the permanent MAC address */
-	ether_addr_copy((struct ether_addr *)hw->mac.addr,
-			&eth_dev->data->mac_addrs[0]);
-
-	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
-			eth_dev->data->port_id, pci_dev->id.vendor_id,
-			pci_dev->id.device_id);
-	return 0;
-}
-
-static int
-enetc_dev_uninit(struct rte_eth_dev *eth_dev __rte_unused)
-{
-	PMD_INIT_FUNC_TRACE();
-	return 0;
-}
-
 static int
 enetc_dev_configure(struct rte_eth_dev *dev __rte_unused)
 {
@@ -179,27 +70,6 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 		      val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
 }
 
-static void
-enetc_dev_close(struct rte_eth_dev *dev)
-{
-	uint16_t i;
-
-	PMD_INIT_FUNC_TRACE();
-	enetc_dev_stop(dev);
-
-	for (i = 0; i < dev->data->nb_rx_queues; i++) {
-		enetc_rx_queue_release(dev->data->rx_queues[i]);
-		dev->data->rx_queues[i] = NULL;
-	}
-	dev->data->nb_rx_queues = 0;
-
-	for (i = 0; i < dev->data->nb_tx_queues; i++) {
-		enetc_tx_queue_release(dev->data->tx_queues[i]);
-		dev->data->tx_queues[i] = NULL;
-	}
-	dev->data->nb_tx_queues = 0;
-}
-
 static const uint32_t *
 enetc_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)
 {
@@ -648,6 +518,113 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	enetc_port_wr(enetc_hw, ENETC_PM0_STAT_CONFIG, ENETC_CLEAR_STATS);
 }
 
+static void
+enetc_dev_close(struct rte_eth_dev *dev)
+{
+	uint16_t i;
+
+	PMD_INIT_FUNC_TRACE();
+	enetc_dev_stop(dev);
+
+	for (i = 0; i < dev->data->nb_rx_queues; i++) {
+		enetc_rx_queue_release(dev->data->rx_queues[i]);
+		dev->data->rx_queues[i] = NULL;
+	}
+	dev->data->nb_rx_queues = 0;
+
+	for (i = 0; i < dev->data->nb_tx_queues; i++) {
+		enetc_tx_queue_release(dev->data->tx_queues[i]);
+		dev->data->tx_queues[i] = NULL;
+	}
+	dev->data->nb_tx_queues = 0;
+}
+
+/*
+ * The set of PCI devices this driver supports
+ */
+static const struct rte_pci_id pci_id_enetc_map[] = {
+	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID) },
+	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID_VF) },
+	{ .vendor_id = 0, /* sentinel */ },
+};
+
+/* Features supported by this driver */
+static const struct eth_dev_ops enetc_ops = {
+	.dev_configure        = enetc_dev_configure,
+	.dev_start            = enetc_dev_start,
+	.dev_stop             = enetc_dev_stop,
+	.dev_close            = enetc_dev_close,
+	.link_update          = enetc_link_update,
+	.stats_get            = enetc_stats_get,
+	.stats_reset          = enetc_stats_reset,
+	.dev_infos_get        = enetc_dev_infos_get,
+	.rx_queue_setup       = enetc_rx_queue_setup,
+	.rx_queue_release     = enetc_rx_queue_release,
+	.tx_queue_setup       = enetc_tx_queue_setup,
+	.tx_queue_release     = enetc_tx_queue_release,
+	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
+};
+
+/**
+ * Initialisation of the enetc device
+ *
+ * @param eth_dev
+ *   - Pointer to the structure rte_eth_dev
+ *
+ * @return
+ *   - On success, zero.
+ *   - On failure, negative value.
+ */
+static int
+enetc_dev_init(struct rte_eth_dev *eth_dev)
+{
+	int error = 0;
+	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
+
+	PMD_INIT_FUNC_TRACE();
+	eth_dev->dev_ops = &enetc_ops;
+	eth_dev->rx_pkt_burst = &enetc_recv_pkts;
+	eth_dev->tx_pkt_burst = &enetc_xmit_pkts;
+
+	/* Retrieving and storing the HW base address of device */
+	hw->hw.reg = (void *)pci_dev->mem_resource[0].addr;
+	hw->device_id = pci_dev->id.device_id;
+
+	error = enetc_hardware_init(hw);
+	if (error != 0) {
+		ENETC_PMD_ERR("Hardware initialization failed");
+		return -1;
+	}
+
+	/* Allocate memory for storing MAC addresses */
+	eth_dev->data->mac_addrs = rte_zmalloc("enetc_eth", ETHER_ADDR_LEN, 0);
+	if (!eth_dev->data->mac_addrs) {
+		ENETC_PMD_ERR("Failed to allocate %d bytes needed to "
+			      "store MAC addresses",
+			      ETHER_ADDR_LEN * 1);
+		error = -ENOMEM;
+		return -1;
+	}
+
+	/* Copy the permanent MAC address */
+	ether_addr_copy((struct ether_addr *)hw->mac.addr,
+			&eth_dev->data->mac_addrs[0]);
+
+	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
+			eth_dev->data->port_id, pci_dev->id.vendor_id,
+			pci_dev->id.device_id);
+	return 0;
+}
+
+static int
+enetc_dev_uninit(struct rte_eth_dev *eth_dev __rte_unused)
+{
+	PMD_INIT_FUNC_TRACE();
+	return 0;
+}
+
 static int
 enetc_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 			   struct rte_pci_device *pci_dev)
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 07/13] net/enetc: remove forward declarations
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 07/13] net/enetc: remove forward declarations Gagandeep Singh
@ 2019-04-12  7:04     ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

Remove unneeded forward declarations and re-order the code.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 237 ++++++++++++++++++---------------------
 1 file changed, 107 insertions(+), 130 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 2d8c4e6..d0f9e2b 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -10,115 +10,6 @@
 
 int enetc_logtype_pmd;
 
-/* Functions Prototypes */
-static int enetc_dev_configure(struct rte_eth_dev *dev);
-static int enetc_dev_start(struct rte_eth_dev *dev);
-static void enetc_dev_stop(struct rte_eth_dev *dev);
-static void enetc_dev_close(struct rte_eth_dev *dev);
-static void enetc_dev_infos_get(struct rte_eth_dev *dev,
-				struct rte_eth_dev_info *dev_info);
-static int enetc_link_update(struct rte_eth_dev *dev, int wait_to_complete);
-static int enetc_hardware_init(struct enetc_eth_hw *hw);
-static int enetc_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id,
-		uint16_t nb_rx_desc, unsigned int socket_id,
-		const struct rte_eth_rxconf *rx_conf,
-		struct rte_mempool *mb_pool);
-static void enetc_rx_queue_release(void *rxq);
-static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
-		uint16_t nb_tx_desc, unsigned int socket_id,
-		const struct rte_eth_txconf *tx_conf);
-static void enetc_tx_queue_release(void *txq);
-static const uint32_t *enetc_supported_ptypes_get(struct rte_eth_dev *dev);
-static int enetc_stats_get(struct rte_eth_dev *dev,
-		struct rte_eth_stats *stats);
-static void enetc_stats_reset(struct rte_eth_dev *dev);
-
-/*
- * The set of PCI devices this driver supports
- */
-static const struct rte_pci_id pci_id_enetc_map[] = {
-	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID) },
-	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID_VF) },
-	{ .vendor_id = 0, /* sentinel */ },
-};
-
-/* Features supported by this driver */
-static const struct eth_dev_ops enetc_ops = {
-	.dev_configure        = enetc_dev_configure,
-	.dev_start            = enetc_dev_start,
-	.dev_stop             = enetc_dev_stop,
-	.dev_close            = enetc_dev_close,
-	.link_update          = enetc_link_update,
-	.stats_get            = enetc_stats_get,
-	.stats_reset          = enetc_stats_reset,
-	.dev_infos_get        = enetc_dev_infos_get,
-	.rx_queue_setup       = enetc_rx_queue_setup,
-	.rx_queue_release     = enetc_rx_queue_release,
-	.tx_queue_setup       = enetc_tx_queue_setup,
-	.tx_queue_release     = enetc_tx_queue_release,
-	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
-};
-
-/**
- * Initialisation of the enetc device
- *
- * @param eth_dev
- *   - Pointer to the structure rte_eth_dev
- *
- * @return
- *   - On success, zero.
- *   - On failure, negative value.
- */
-static int
-enetc_dev_init(struct rte_eth_dev *eth_dev)
-{
-	int error = 0;
-	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
-	struct enetc_eth_hw *hw =
-		ENETC_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
-
-	PMD_INIT_FUNC_TRACE();
-	eth_dev->dev_ops = &enetc_ops;
-	eth_dev->rx_pkt_burst = &enetc_recv_pkts;
-	eth_dev->tx_pkt_burst = &enetc_xmit_pkts;
-
-	/* Retrieving and storing the HW base address of device */
-	hw->hw.reg = (void *)pci_dev->mem_resource[0].addr;
-	hw->device_id = pci_dev->id.device_id;
-
-	error = enetc_hardware_init(hw);
-	if (error != 0) {
-		ENETC_PMD_ERR("Hardware initialization failed");
-		return -1;
-	}
-
-	/* Allocate memory for storing MAC addresses */
-	eth_dev->data->mac_addrs = rte_zmalloc("enetc_eth", ETHER_ADDR_LEN, 0);
-	if (!eth_dev->data->mac_addrs) {
-		ENETC_PMD_ERR("Failed to allocate %d bytes needed to "
-			      "store MAC addresses",
-			      ETHER_ADDR_LEN * 1);
-		error = -ENOMEM;
-		return -1;
-	}
-
-	/* Copy the permanent MAC address */
-	ether_addr_copy((struct ether_addr *)hw->mac.addr,
-			&eth_dev->data->mac_addrs[0]);
-
-	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
-			eth_dev->data->port_id, pci_dev->id.vendor_id,
-			pci_dev->id.device_id);
-	return 0;
-}
-
-static int
-enetc_dev_uninit(struct rte_eth_dev *eth_dev __rte_unused)
-{
-	PMD_INIT_FUNC_TRACE();
-	return 0;
-}
-
 static int
 enetc_dev_configure(struct rte_eth_dev *dev __rte_unused)
 {
@@ -179,27 +70,6 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 		      val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
 }
 
-static void
-enetc_dev_close(struct rte_eth_dev *dev)
-{
-	uint16_t i;
-
-	PMD_INIT_FUNC_TRACE();
-	enetc_dev_stop(dev);
-
-	for (i = 0; i < dev->data->nb_rx_queues; i++) {
-		enetc_rx_queue_release(dev->data->rx_queues[i]);
-		dev->data->rx_queues[i] = NULL;
-	}
-	dev->data->nb_rx_queues = 0;
-
-	for (i = 0; i < dev->data->nb_tx_queues; i++) {
-		enetc_tx_queue_release(dev->data->tx_queues[i]);
-		dev->data->tx_queues[i] = NULL;
-	}
-	dev->data->nb_tx_queues = 0;
-}
-
 static const uint32_t *
 enetc_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)
 {
@@ -648,6 +518,113 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	enetc_port_wr(enetc_hw, ENETC_PM0_STAT_CONFIG, ENETC_CLEAR_STATS);
 }
 
+static void
+enetc_dev_close(struct rte_eth_dev *dev)
+{
+	uint16_t i;
+
+	PMD_INIT_FUNC_TRACE();
+	enetc_dev_stop(dev);
+
+	for (i = 0; i < dev->data->nb_rx_queues; i++) {
+		enetc_rx_queue_release(dev->data->rx_queues[i]);
+		dev->data->rx_queues[i] = NULL;
+	}
+	dev->data->nb_rx_queues = 0;
+
+	for (i = 0; i < dev->data->nb_tx_queues; i++) {
+		enetc_tx_queue_release(dev->data->tx_queues[i]);
+		dev->data->tx_queues[i] = NULL;
+	}
+	dev->data->nb_tx_queues = 0;
+}
+
+/*
+ * The set of PCI devices this driver supports
+ */
+static const struct rte_pci_id pci_id_enetc_map[] = {
+	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID) },
+	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID_VF) },
+	{ .vendor_id = 0, /* sentinel */ },
+};
+
+/* Features supported by this driver */
+static const struct eth_dev_ops enetc_ops = {
+	.dev_configure        = enetc_dev_configure,
+	.dev_start            = enetc_dev_start,
+	.dev_stop             = enetc_dev_stop,
+	.dev_close            = enetc_dev_close,
+	.link_update          = enetc_link_update,
+	.stats_get            = enetc_stats_get,
+	.stats_reset          = enetc_stats_reset,
+	.dev_infos_get        = enetc_dev_infos_get,
+	.rx_queue_setup       = enetc_rx_queue_setup,
+	.rx_queue_release     = enetc_rx_queue_release,
+	.tx_queue_setup       = enetc_tx_queue_setup,
+	.tx_queue_release     = enetc_tx_queue_release,
+	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
+};
+
+/**
+ * Initialisation of the enetc device
+ *
+ * @param eth_dev
+ *   - Pointer to the structure rte_eth_dev
+ *
+ * @return
+ *   - On success, zero.
+ *   - On failure, negative value.
+ */
+static int
+enetc_dev_init(struct rte_eth_dev *eth_dev)
+{
+	int error = 0;
+	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
+
+	PMD_INIT_FUNC_TRACE();
+	eth_dev->dev_ops = &enetc_ops;
+	eth_dev->rx_pkt_burst = &enetc_recv_pkts;
+	eth_dev->tx_pkt_burst = &enetc_xmit_pkts;
+
+	/* Retrieving and storing the HW base address of device */
+	hw->hw.reg = (void *)pci_dev->mem_resource[0].addr;
+	hw->device_id = pci_dev->id.device_id;
+
+	error = enetc_hardware_init(hw);
+	if (error != 0) {
+		ENETC_PMD_ERR("Hardware initialization failed");
+		return -1;
+	}
+
+	/* Allocate memory for storing MAC addresses */
+	eth_dev->data->mac_addrs = rte_zmalloc("enetc_eth", ETHER_ADDR_LEN, 0);
+	if (!eth_dev->data->mac_addrs) {
+		ENETC_PMD_ERR("Failed to allocate %d bytes needed to "
+			      "store MAC addresses",
+			      ETHER_ADDR_LEN * 1);
+		error = -ENOMEM;
+		return -1;
+	}
+
+	/* Copy the permanent MAC address */
+	ether_addr_copy((struct ether_addr *)hw->mac.addr,
+			&eth_dev->data->mac_addrs[0]);
+
+	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
+			eth_dev->data->port_id, pci_dev->id.vendor_id,
+			pci_dev->id.device_id);
+	return 0;
+}
+
+static int
+enetc_dev_uninit(struct rte_eth_dev *eth_dev __rte_unused)
+{
+	PMD_INIT_FUNC_TRACE();
+	return 0;
+}
+
 static int
 enetc_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 			   struct rte_pci_device *pci_dev)
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 08/13] net/enetc: enable promiscuous and allmulticast feature
  2019-04-12  7:04 ` [dpdk-dev] [PATCH v2 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                     ` (7 preceding siblings ...)
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 07/13] net/enetc: remove forward declarations Gagandeep Singh
@ 2019-04-12  7:04   ` Gagandeep Singh
  2019-04-12  7:04     ` Gagandeep Singh
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 09/13] net/enetc: add MTU update and jumbo frames support Gagandeep Singh
                     ` (5 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

Promiscuous and allmulticast enable/disable APIs added.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  2 +
 doc/guides/nics/features/enetc.ini |  2 +
 drivers/net/enetc/base/enetc_hw.h  |  3 +-
 drivers/net/enetc/enetc_ethdev.c   | 90 ++++++++++++++++++++++++++++++++------
 4 files changed, 81 insertions(+), 16 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 9f575d2..ab13211 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -47,6 +47,8 @@ ENETC Features
 - Link Status
 - Packet type information
 - Basic stats
+- Promiscuous
+- Multicast
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index d8bd567..6b7bbfb 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -7,6 +7,8 @@
 Packet type parsing  = Y
 Link status          = Y
 Basic stats          = Y
+Promiscuous mode     = Y
+Allmulticast mode    = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 3f0a2a9..90a383a 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -78,8 +78,7 @@
 #define ENETC_PSR			0x00004 /* RO */
 #define ENETC_PSIPMR			0x00018
 #define ENETC_PSIPMR_SET_UP(n)		(0x1 << (n)) /* n = SI index */
-#define ENETC_PSIPMR_SET_MP(n)		(0x1 << ((n) + 8))
-#define ENETC_PSIPMR_SET_VLAN_MP(n)	(0x1 << ((n) + 16))
+#define ENETC_PSIPMR_SET_MP(n)		(0x1 << ((n) + 16))
 #define ENETC_PSIPMAR0(n)		(0x00100 + (n) * 0x20)
 #define ENETC_PSIPMAR1(n)		(0x00104 + (n) * 0x20)
 #define ENETC_PCAPR0			0x00900
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index d0f9e2b..a7dddc5 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -133,8 +133,8 @@
 static int
 enetc_hardware_init(struct enetc_eth_hw *hw)
 {
-	uint32_t psipmr = 0;
 	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t *mac = (uint32_t *)hw->mac.addr;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Calculating and storing the base HW addresses */
@@ -144,19 +144,9 @@
 	/* Enabling Station Interface */
 	enetc_wr(enetc_hw, ENETC_SIMR, ENETC_SIMR_EN);
 
-	/* Setting to accept broadcast packets for each inetrface */
-	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0) |
-		  ENETC_PSIPMR_SET_VLAN_MP(0);
-	psipmr |= ENETC_PSIPMR_SET_UP(1) | ENETC_PSIPMR_SET_MP(1) |
-		  ENETC_PSIPMR_SET_VLAN_MP(1);
-	psipmr |= ENETC_PSIPMR_SET_UP(2) | ENETC_PSIPMR_SET_MP(2) |
-		  ENETC_PSIPMR_SET_VLAN_MP(2);
-
-	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
-
-	/* Enabling broadcast address */
-	enetc_port_wr(enetc_hw, ENETC_PSIPMAR0(0), 0xFFFFFFFF);
-	enetc_port_wr(enetc_hw, ENETC_PSIPMAR1(0), 0xFFFF << 16);
+	*mac = (uint32_t)enetc_port_rd(enetc_hw, ENETC_PSIPMAR0(0));
+	mac++;
+	*mac = (uint16_t)enetc_port_rd(enetc_hw, ENETC_PSIPMAR1(0));
 
 	return 0;
 }
@@ -539,6 +529,74 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	dev->data->nb_tx_queues = 0;
 }
 
+static void
+enetc_promiscuous_enable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+
+	/* Setting to enable promiscuous mode*/
+	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0);
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_promiscuous_disable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	/* Setting to disable promiscuous mode for SI0*/
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+	psipmr &= (~ENETC_PSIPMR_SET_UP(0));
+
+	if (dev->data->all_multicast == 0)
+		psipmr &= (~ENETC_PSIPMR_SET_MP(0));
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_allmulticast_enable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+
+	/* Setting to enable allmulticast mode for SI0*/
+	psipmr |= ENETC_PSIPMR_SET_MP(0);
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_allmulticast_disable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	if (dev->data->promiscuous == 1)
+		return; /* must remain in all_multicast mode */
+
+	/* Setting to disable all multicast mode for SI0*/
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR) &
+			       ~(ENETC_PSIPMR_SET_MP(0));
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -557,6 +615,10 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	.link_update          = enetc_link_update,
 	.stats_get            = enetc_stats_get,
 	.stats_reset          = enetc_stats_reset,
+	.promiscuous_enable   = enetc_promiscuous_enable,
+	.promiscuous_disable  = enetc_promiscuous_disable,
+	.allmulticast_enable  = enetc_allmulticast_enable,
+	.allmulticast_disable = enetc_allmulticast_disable,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 08/13] net/enetc: enable promiscuous and allmulticast feature
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 08/13] net/enetc: enable promiscuous and allmulticast feature Gagandeep Singh
@ 2019-04-12  7:04     ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

Promiscuous and allmulticast enable/disable APIs added.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  2 +
 doc/guides/nics/features/enetc.ini |  2 +
 drivers/net/enetc/base/enetc_hw.h  |  3 +-
 drivers/net/enetc/enetc_ethdev.c   | 90 ++++++++++++++++++++++++++++++++------
 4 files changed, 81 insertions(+), 16 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 9f575d2..ab13211 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -47,6 +47,8 @@ ENETC Features
 - Link Status
 - Packet type information
 - Basic stats
+- Promiscuous
+- Multicast
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index d8bd567..6b7bbfb 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -7,6 +7,8 @@
 Packet type parsing  = Y
 Link status          = Y
 Basic stats          = Y
+Promiscuous mode     = Y
+Allmulticast mode    = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 3f0a2a9..90a383a 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -78,8 +78,7 @@
 #define ENETC_PSR			0x00004 /* RO */
 #define ENETC_PSIPMR			0x00018
 #define ENETC_PSIPMR_SET_UP(n)		(0x1 << (n)) /* n = SI index */
-#define ENETC_PSIPMR_SET_MP(n)		(0x1 << ((n) + 8))
-#define ENETC_PSIPMR_SET_VLAN_MP(n)	(0x1 << ((n) + 16))
+#define ENETC_PSIPMR_SET_MP(n)		(0x1 << ((n) + 16))
 #define ENETC_PSIPMAR0(n)		(0x00100 + (n) * 0x20)
 #define ENETC_PSIPMAR1(n)		(0x00104 + (n) * 0x20)
 #define ENETC_PCAPR0			0x00900
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index d0f9e2b..a7dddc5 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -133,8 +133,8 @@
 static int
 enetc_hardware_init(struct enetc_eth_hw *hw)
 {
-	uint32_t psipmr = 0;
 	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t *mac = (uint32_t *)hw->mac.addr;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Calculating and storing the base HW addresses */
@@ -144,19 +144,9 @@
 	/* Enabling Station Interface */
 	enetc_wr(enetc_hw, ENETC_SIMR, ENETC_SIMR_EN);
 
-	/* Setting to accept broadcast packets for each inetrface */
-	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0) |
-		  ENETC_PSIPMR_SET_VLAN_MP(0);
-	psipmr |= ENETC_PSIPMR_SET_UP(1) | ENETC_PSIPMR_SET_MP(1) |
-		  ENETC_PSIPMR_SET_VLAN_MP(1);
-	psipmr |= ENETC_PSIPMR_SET_UP(2) | ENETC_PSIPMR_SET_MP(2) |
-		  ENETC_PSIPMR_SET_VLAN_MP(2);
-
-	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
-
-	/* Enabling broadcast address */
-	enetc_port_wr(enetc_hw, ENETC_PSIPMAR0(0), 0xFFFFFFFF);
-	enetc_port_wr(enetc_hw, ENETC_PSIPMAR1(0), 0xFFFF << 16);
+	*mac = (uint32_t)enetc_port_rd(enetc_hw, ENETC_PSIPMAR0(0));
+	mac++;
+	*mac = (uint16_t)enetc_port_rd(enetc_hw, ENETC_PSIPMAR1(0));
 
 	return 0;
 }
@@ -539,6 +529,74 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	dev->data->nb_tx_queues = 0;
 }
 
+static void
+enetc_promiscuous_enable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+
+	/* Setting to enable promiscuous mode*/
+	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0);
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_promiscuous_disable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	/* Setting to disable promiscuous mode for SI0*/
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+	psipmr &= (~ENETC_PSIPMR_SET_UP(0));
+
+	if (dev->data->all_multicast == 0)
+		psipmr &= (~ENETC_PSIPMR_SET_MP(0));
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_allmulticast_enable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+
+	/* Setting to enable allmulticast mode for SI0*/
+	psipmr |= ENETC_PSIPMR_SET_MP(0);
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_allmulticast_disable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	if (dev->data->promiscuous == 1)
+		return; /* must remain in all_multicast mode */
+
+	/* Setting to disable all multicast mode for SI0*/
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR) &
+			       ~(ENETC_PSIPMR_SET_MP(0));
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -557,6 +615,10 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	.link_update          = enetc_link_update,
 	.stats_get            = enetc_stats_get,
 	.stats_reset          = enetc_stats_reset,
+	.promiscuous_enable   = enetc_promiscuous_enable,
+	.promiscuous_disable  = enetc_promiscuous_disable,
+	.allmulticast_enable  = enetc_allmulticast_enable,
+	.allmulticast_disable = enetc_allmulticast_disable,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 09/13] net/enetc: add MTU update and jumbo frames support
  2019-04-12  7:04 ` [dpdk-dev] [PATCH v2 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                     ` (8 preceding siblings ...)
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 08/13] net/enetc: enable promiscuous and allmulticast feature Gagandeep Singh
@ 2019-04-12  7:04   ` Gagandeep Singh
  2019-04-12  7:04     ` Gagandeep Singh
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 10/13] net/enetc: enable Rx-Tx queue start/stop feature Gagandeep Singh
                     ` (4 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

Enable the jumbo frames and mtu update feature.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  2 +
 drivers/net/enetc/base/enetc_hw.h  |  6 ++-
 drivers/net/enetc/enetc.h          |  5 +++
 drivers/net/enetc/enetc_ethdev.c   | 86 ++++++++++++++++++++++++++++++++++----
 5 files changed, 91 insertions(+), 9 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index ab13211..eeb0752 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -49,6 +49,7 @@ ENETC Features
 - Basic stats
 - Promiscuous
 - Multicast
+- Jumbo packets
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 6b7bbfb..0eed2cb 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -9,6 +9,8 @@ Link status          = Y
 Basic stats          = Y
 Promiscuous mode     = Y
 Allmulticast mode    = Y
+MTU update           = Y
+Jumbo frame          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 90a383a..2eb1df3 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -99,7 +99,11 @@
 #define ENETC_PM0_RX_EN			BIT(1)
 
 #define ENETC_PM0_MAXFRM		0x08014
-#define ENETC_SET_MAXFRM(val)		((val) << 16)
+#define ENETC_SET_TX_MTU(val)		((val) << 16)
+#define ENETC_SET_MAXFRM(val)		((val) & 0xffff)
+#define ENETC_PTXMBAR			0x0608
+/* n = TC index [0..7] */
+#define ENETC_PTCMSDUR(n)		(0x2020 + (n) * 4)
 
 #define ENETC_PM0_STATUS		0x08304
 #define ENETC_LINK_MODE			0x0000000000080000ULL
diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index 56454dc..e494eb8 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -24,6 +24,11 @@
 /* BD ALIGN */
 #define BD_ALIGN       8
 
+/* minimum frame size supported */
+#define ENETC_MAC_MINFRM_SIZE	68
+/* maximum frame size supported */
+#define ENETC_MAC_MAXFRM_SIZE	9600
+
 /*
  * upper_32_bits - return bits 32-63 of a number
  * @n: the number we're accessing
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index a7dddc5..66cbf74 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -11,13 +11,6 @@
 int enetc_logtype_pmd;
 
 static int
-enetc_dev_configure(struct rte_eth_dev *dev __rte_unused)
-{
-	PMD_INIT_FUNC_TRACE();
-	return 0;
-}
-
-static int
 enetc_dev_start(struct rte_eth_dev *dev)
 {
 	struct enetc_eth_hw *hw =
@@ -168,7 +161,8 @@
 	};
 	dev_info->max_rx_queues = MAX_RX_RINGS;
 	dev_info->max_tx_queues = MAX_TX_RINGS;
-	dev_info->max_rx_pktlen = 1500;
+	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
+	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_JUMBO_FRAME;
 }
 
 static int
@@ -597,6 +591,76 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
 }
 
+static int
+enetc_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
+
+	/* check that mtu is within the allowed range */
+	if (mtu < ENETC_MAC_MINFRM_SIZE || frame_size > ENETC_MAC_MAXFRM_SIZE)
+		return -EINVAL;
+
+	/*
+	 * Refuse mtu that requires the support of scattered packets
+	 * when this feature has not been enabled before.
+	 */
+	if (dev->data->min_rx_buf_size &&
+		!dev->data->scattered_rx && frame_size >
+		dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM) {
+		ENETC_PMD_ERR("SG not enabled, will not fit in one buffer");
+		return -EINVAL;
+	}
+
+	if (frame_size > ETHER_MAX_LEN)
+		dev->data->dev_conf.rxmode.offloads &=
+						DEV_RX_OFFLOAD_JUMBO_FRAME;
+	else
+		dev->data->dev_conf.rxmode.offloads &=
+						~DEV_RX_OFFLOAD_JUMBO_FRAME;
+
+	enetc_port_wr(enetc_hw, ENETC_PTCMSDUR(0), ENETC_MAC_MAXFRM_SIZE);
+	enetc_port_wr(enetc_hw, ENETC_PTXMBAR, 2 * ENETC_MAC_MAXFRM_SIZE);
+
+	dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
+
+	/*setting the MTU*/
+	enetc_port_wr(enetc_hw, ENETC_PM0_MAXFRM, ENETC_SET_MAXFRM(frame_size) |
+		      ENETC_SET_TX_MTU(ENETC_MAC_MAXFRM_SIZE));
+
+	return 0;
+}
+
+static int
+enetc_dev_configure(struct rte_eth_dev *dev)
+{
+	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
+	uint64_t rx_offloads = eth_conf->rxmode.offloads;
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	PMD_INIT_FUNC_TRACE();
+
+	if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
+		uint32_t max_len;
+
+		max_len = dev->data->dev_conf.rxmode.max_rx_pkt_len;
+
+		enetc_port_wr(enetc_hw, ENETC_PM0_MAXFRM,
+			      ENETC_SET_MAXFRM(max_len));
+		enetc_port_wr(enetc_hw, ENETC_PTCMSDUR(0),
+			      ENETC_MAC_MAXFRM_SIZE);
+		enetc_port_wr(enetc_hw, ENETC_PTXMBAR,
+			      2 * ENETC_MAC_MAXFRM_SIZE);
+		dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
+	}
+
+	return 0;
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -620,6 +684,7 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	.allmulticast_enable  = enetc_allmulticast_enable,
 	.allmulticast_disable = enetc_allmulticast_disable,
 	.dev_infos_get        = enetc_dev_infos_get,
+	.mtu_set              = enetc_mtu_set,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
 	.tx_queue_setup       = enetc_tx_queue_setup,
@@ -674,6 +739,11 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	ether_addr_copy((struct ether_addr *)hw->mac.addr,
 			&eth_dev->data->mac_addrs[0]);
 
+	/* Set MTU */
+	enetc_port_wr(&hw->hw, ENETC_PM0_MAXFRM,
+		      ENETC_SET_MAXFRM(ETHER_MAX_LEN));
+	eth_dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
+
 	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
 			eth_dev->data->port_id, pci_dev->id.vendor_id,
 			pci_dev->id.device_id);
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 09/13] net/enetc: add MTU update and jumbo frames support
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 09/13] net/enetc: add MTU update and jumbo frames support Gagandeep Singh
@ 2019-04-12  7:04     ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

Enable the jumbo frames and mtu update feature.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  2 +
 drivers/net/enetc/base/enetc_hw.h  |  6 ++-
 drivers/net/enetc/enetc.h          |  5 +++
 drivers/net/enetc/enetc_ethdev.c   | 86 ++++++++++++++++++++++++++++++++++----
 5 files changed, 91 insertions(+), 9 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index ab13211..eeb0752 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -49,6 +49,7 @@ ENETC Features
 - Basic stats
 - Promiscuous
 - Multicast
+- Jumbo packets
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 6b7bbfb..0eed2cb 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -9,6 +9,8 @@ Link status          = Y
 Basic stats          = Y
 Promiscuous mode     = Y
 Allmulticast mode    = Y
+MTU update           = Y
+Jumbo frame          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 90a383a..2eb1df3 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -99,7 +99,11 @@
 #define ENETC_PM0_RX_EN			BIT(1)
 
 #define ENETC_PM0_MAXFRM		0x08014
-#define ENETC_SET_MAXFRM(val)		((val) << 16)
+#define ENETC_SET_TX_MTU(val)		((val) << 16)
+#define ENETC_SET_MAXFRM(val)		((val) & 0xffff)
+#define ENETC_PTXMBAR			0x0608
+/* n = TC index [0..7] */
+#define ENETC_PTCMSDUR(n)		(0x2020 + (n) * 4)
 
 #define ENETC_PM0_STATUS		0x08304
 #define ENETC_LINK_MODE			0x0000000000080000ULL
diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index 56454dc..e494eb8 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -24,6 +24,11 @@
 /* BD ALIGN */
 #define BD_ALIGN       8
 
+/* minimum frame size supported */
+#define ENETC_MAC_MINFRM_SIZE	68
+/* maximum frame size supported */
+#define ENETC_MAC_MAXFRM_SIZE	9600
+
 /*
  * upper_32_bits - return bits 32-63 of a number
  * @n: the number we're accessing
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index a7dddc5..66cbf74 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -11,13 +11,6 @@
 int enetc_logtype_pmd;
 
 static int
-enetc_dev_configure(struct rte_eth_dev *dev __rte_unused)
-{
-	PMD_INIT_FUNC_TRACE();
-	return 0;
-}
-
-static int
 enetc_dev_start(struct rte_eth_dev *dev)
 {
 	struct enetc_eth_hw *hw =
@@ -168,7 +161,8 @@
 	};
 	dev_info->max_rx_queues = MAX_RX_RINGS;
 	dev_info->max_tx_queues = MAX_TX_RINGS;
-	dev_info->max_rx_pktlen = 1500;
+	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
+	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_JUMBO_FRAME;
 }
 
 static int
@@ -597,6 +591,76 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
 }
 
+static int
+enetc_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
+
+	/* check that mtu is within the allowed range */
+	if (mtu < ENETC_MAC_MINFRM_SIZE || frame_size > ENETC_MAC_MAXFRM_SIZE)
+		return -EINVAL;
+
+	/*
+	 * Refuse mtu that requires the support of scattered packets
+	 * when this feature has not been enabled before.
+	 */
+	if (dev->data->min_rx_buf_size &&
+		!dev->data->scattered_rx && frame_size >
+		dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM) {
+		ENETC_PMD_ERR("SG not enabled, will not fit in one buffer");
+		return -EINVAL;
+	}
+
+	if (frame_size > ETHER_MAX_LEN)
+		dev->data->dev_conf.rxmode.offloads &=
+						DEV_RX_OFFLOAD_JUMBO_FRAME;
+	else
+		dev->data->dev_conf.rxmode.offloads &=
+						~DEV_RX_OFFLOAD_JUMBO_FRAME;
+
+	enetc_port_wr(enetc_hw, ENETC_PTCMSDUR(0), ENETC_MAC_MAXFRM_SIZE);
+	enetc_port_wr(enetc_hw, ENETC_PTXMBAR, 2 * ENETC_MAC_MAXFRM_SIZE);
+
+	dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
+
+	/*setting the MTU*/
+	enetc_port_wr(enetc_hw, ENETC_PM0_MAXFRM, ENETC_SET_MAXFRM(frame_size) |
+		      ENETC_SET_TX_MTU(ENETC_MAC_MAXFRM_SIZE));
+
+	return 0;
+}
+
+static int
+enetc_dev_configure(struct rte_eth_dev *dev)
+{
+	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
+	uint64_t rx_offloads = eth_conf->rxmode.offloads;
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	PMD_INIT_FUNC_TRACE();
+
+	if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
+		uint32_t max_len;
+
+		max_len = dev->data->dev_conf.rxmode.max_rx_pkt_len;
+
+		enetc_port_wr(enetc_hw, ENETC_PM0_MAXFRM,
+			      ENETC_SET_MAXFRM(max_len));
+		enetc_port_wr(enetc_hw, ENETC_PTCMSDUR(0),
+			      ENETC_MAC_MAXFRM_SIZE);
+		enetc_port_wr(enetc_hw, ENETC_PTXMBAR,
+			      2 * ENETC_MAC_MAXFRM_SIZE);
+		dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
+	}
+
+	return 0;
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -620,6 +684,7 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	.allmulticast_enable  = enetc_allmulticast_enable,
 	.allmulticast_disable = enetc_allmulticast_disable,
 	.dev_infos_get        = enetc_dev_infos_get,
+	.mtu_set              = enetc_mtu_set,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
 	.tx_queue_setup       = enetc_tx_queue_setup,
@@ -674,6 +739,11 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	ether_addr_copy((struct ether_addr *)hw->mac.addr,
 			&eth_dev->data->mac_addrs[0]);
 
+	/* Set MTU */
+	enetc_port_wr(&hw->hw, ENETC_PM0_MAXFRM,
+		      ENETC_SET_MAXFRM(ETHER_MAX_LEN));
+	eth_dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
+
 	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
 			eth_dev->data->port_id, pci_dev->id.vendor_id,
 			pci_dev->id.device_id);
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 10/13] net/enetc: enable Rx-Tx queue start/stop feature
  2019-04-12  7:04 ` [dpdk-dev] [PATCH v2 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                     ` (9 preceding siblings ...)
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 09/13] net/enetc: add MTU update and jumbo frames support Gagandeep Singh
@ 2019-04-12  7:04   ` Gagandeep Singh
  2019-04-12  7:04     ` Gagandeep Singh
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 11/13] net/enetc: enable CRC offload feature Gagandeep Singh
                     ` (3 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

Rx and Tx queue start-stop and deferred queue start
features enabled.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |   2 +
 doc/guides/nics/features/enetc.ini |   1 +
 drivers/net/enetc/enetc_ethdev.c   | 185 ++++++++++++++++++++++++++-----------
 3 files changed, 134 insertions(+), 54 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index eeb0752..26d61f6 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -50,6 +50,8 @@ ENETC Features
 - Promiscuous
 - Multicast
 - Jumbo packets
+- Queue Start/Stop
+- Deferred Queue Start
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 0eed2cb..bd901fa 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -11,6 +11,7 @@ Promiscuous mode     = Y
 Allmulticast mode    = Y
 MTU update           = Y
 Jumbo frame          = Y
+Queue start/stop     = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 66cbf74..ff9301e 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -203,7 +203,6 @@
 enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
 {
 	int idx = tx_ring->index;
-	uint32_t tbmr;
 	phys_addr_t bd_address;
 
 	bd_address = (phys_addr_t)
@@ -215,9 +214,6 @@
 	enetc_txbdr_wr(hw, idx, ENETC_TBLENR,
 		       ENETC_RTBLENR_LEN(tx_ring->bd_count));
 
-	tbmr = ENETC_TBMR_EN;
-	/* enable ring */
-	enetc_txbdr_wr(hw, idx, ENETC_TBMR, tbmr);
 	enetc_txbdr_wr(hw, idx, ENETC_TBCIR, 0);
 	enetc_txbdr_wr(hw, idx, ENETC_TBCISR, 0);
 	tx_ring->tcir = (void *)((size_t)hw->reg +
@@ -227,16 +223,22 @@
 }
 
 static int
-enetc_alloc_tx_resources(struct rte_eth_dev *dev,
-			 uint16_t queue_idx,
-			 uint16_t nb_desc)
+enetc_tx_queue_setup(struct rte_eth_dev *dev,
+		     uint16_t queue_idx,
+		     uint16_t nb_desc,
+		     unsigned int socket_id __rte_unused,
+		     const struct rte_eth_txconf *tx_conf)
 {
-	int err;
+	int err = 0;
 	struct enetc_bdr *tx_ring;
 	struct rte_eth_dev_data *data = dev->data;
 	struct enetc_eth_adapter *priv =
 			ENETC_DEV_PRIVATE(data->dev_private);
 
+	PMD_INIT_FUNC_TRACE();
+	if (nb_desc > MAX_BD_COUNT)
+		return -1;
+
 	tx_ring = rte_zmalloc(NULL, sizeof(struct enetc_bdr), 0);
 	if (tx_ring == NULL) {
 		ENETC_PMD_ERR("Failed to allocate TX ring memory");
@@ -253,6 +255,17 @@
 	enetc_setup_txbdr(&priv->hw.hw, tx_ring);
 	data->tx_queues[queue_idx] = tx_ring;
 
+	if (!tx_conf->tx_deferred_start) {
+		/* enable ring */
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index,
+			       ENETC_TBMR, ENETC_TBMR_EN);
+		dev->data->tx_queue_state[tx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STARTED;
+	} else {
+		dev->data->tx_queue_state[tx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
 	return 0;
 fail:
 	rte_free(tx_ring);
@@ -260,24 +273,6 @@
 	return err;
 }
 
-static int
-enetc_tx_queue_setup(struct rte_eth_dev *dev,
-		     uint16_t queue_idx,
-		     uint16_t nb_desc,
-		     unsigned int socket_id __rte_unused,
-		     const struct rte_eth_txconf *tx_conf __rte_unused)
-{
-	int err = 0;
-
-	PMD_INIT_FUNC_TRACE();
-	if (nb_desc > MAX_BD_COUNT)
-		return -1;
-
-	err = enetc_alloc_tx_resources(dev, queue_idx, nb_desc);
-
-	return err;
-}
-
 static void
 enetc_tx_queue_release(void *txq)
 {
@@ -367,23 +362,27 @@
 	buf_size = (uint16_t)(rte_pktmbuf_data_room_size(rx_ring->mb_pool) -
 		   RTE_PKTMBUF_HEADROOM);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBSR, buf_size);
-	/* enable ring */
-	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 }
 
 static int
-enetc_alloc_rx_resources(struct rte_eth_dev *dev,
-			 uint16_t rx_queue_id,
-			 uint16_t nb_rx_desc,
-			 struct rte_mempool *mb_pool)
+enetc_rx_queue_setup(struct rte_eth_dev *dev,
+		     uint16_t rx_queue_id,
+		     uint16_t nb_rx_desc,
+		     unsigned int socket_id __rte_unused,
+		     const struct rte_eth_rxconf *rx_conf,
+		     struct rte_mempool *mb_pool)
 {
-	int err;
+	int err = 0;
 	struct enetc_bdr *rx_ring;
 	struct rte_eth_dev_data *data =  dev->data;
 	struct enetc_eth_adapter *adapter =
 			ENETC_DEV_PRIVATE(data->dev_private);
 
+	PMD_INIT_FUNC_TRACE();
+	if (nb_rx_desc > MAX_BD_COUNT)
+		return -1;
+
 	rx_ring = rte_zmalloc(NULL, sizeof(struct enetc_bdr), 0);
 	if (rx_ring == NULL) {
 		ENETC_PMD_ERR("Failed to allocate RX ring memory");
@@ -400,6 +399,17 @@
 	enetc_setup_rxbdr(&adapter->hw.hw, rx_ring, mb_pool);
 	data->rx_queues[rx_queue_id] = rx_ring;
 
+	if (!rx_conf->rx_deferred_start) {
+		/* enable ring */
+		enetc_rxbdr_wr(&adapter->hw.hw, rx_ring->index, ENETC_RBMR,
+			       ENETC_RBMR_EN);
+		dev->data->rx_queue_state[rx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STARTED;
+	} else {
+		dev->data->rx_queue_state[rx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
 	return 0;
 fail:
 	rte_free(rx_ring);
@@ -407,27 +417,6 @@
 	return err;
 }
 
-static int
-enetc_rx_queue_setup(struct rte_eth_dev *dev,
-		     uint16_t rx_queue_id,
-		     uint16_t nb_rx_desc,
-		     unsigned int socket_id __rte_unused,
-		     const struct rte_eth_rxconf *rx_conf __rte_unused,
-		     struct rte_mempool *mb_pool)
-{
-	int err = 0;
-
-	PMD_INIT_FUNC_TRACE();
-	if (nb_rx_desc > MAX_BD_COUNT)
-		return -1;
-
-	err = enetc_alloc_rx_resources(dev, rx_queue_id,
-				       nb_rx_desc,
-				       mb_pool);
-
-	return err;
-}
-
 static void
 enetc_rx_queue_release(void *rxq)
 {
@@ -661,6 +650,90 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	return 0;
 }
 
+static int
+enetc_rx_queue_start(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *rx_ring;
+	uint32_t rx_data;
+
+	rx_ring = dev->data->rx_queues[qidx];
+	if (dev->data->rx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STOPPED) {
+		rx_data = enetc_rxbdr_rd(&priv->hw.hw, rx_ring->index,
+					 ENETC_RBMR);
+		rx_data = rx_data | ENETC_RBMR_EN;
+		enetc_rxbdr_wr(&priv->hw.hw, rx_ring->index, ENETC_RBMR,
+			       rx_data);
+		dev->data->rx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STARTED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_rx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *rx_ring;
+	uint32_t rx_data;
+
+	rx_ring = dev->data->rx_queues[qidx];
+	if (dev->data->rx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STARTED) {
+		rx_data = enetc_rxbdr_rd(&priv->hw.hw, rx_ring->index,
+					 ENETC_RBMR);
+		rx_data = rx_data & (~ENETC_RBMR_EN);
+		enetc_rxbdr_wr(&priv->hw.hw, rx_ring->index, ENETC_RBMR,
+			       rx_data);
+		dev->data->rx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_tx_queue_start(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *tx_ring;
+	uint32_t tx_data;
+
+	tx_ring = dev->data->tx_queues[qidx];
+	if (dev->data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STOPPED) {
+		tx_data = enetc_txbdr_rd(&priv->hw.hw, tx_ring->index,
+					 ENETC_TBMR);
+		tx_data = tx_data | ENETC_TBMR_EN;
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index, ENETC_TBMR,
+			       tx_data);
+		dev->data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STARTED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_tx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *tx_ring;
+	uint32_t tx_data;
+
+	tx_ring = dev->data->tx_queues[qidx];
+	if (dev->data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STARTED) {
+		tx_data = enetc_txbdr_rd(&priv->hw.hw, tx_ring->index,
+					 ENETC_TBMR);
+		tx_data = tx_data & (~ENETC_TBMR_EN);
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index, ENETC_TBMR,
+			       tx_data);
+		dev->data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
+	return 0;
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -686,8 +759,12 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.mtu_set              = enetc_mtu_set,
 	.rx_queue_setup       = enetc_rx_queue_setup,
+	.rx_queue_start       = enetc_rx_queue_start,
+	.rx_queue_stop        = enetc_rx_queue_stop,
 	.rx_queue_release     = enetc_rx_queue_release,
 	.tx_queue_setup       = enetc_tx_queue_setup,
+	.tx_queue_start       = enetc_tx_queue_start,
+	.tx_queue_stop        = enetc_tx_queue_stop,
 	.tx_queue_release     = enetc_tx_queue_release,
 	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
 };
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 10/13] net/enetc: enable Rx-Tx queue start/stop feature
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 10/13] net/enetc: enable Rx-Tx queue start/stop feature Gagandeep Singh
@ 2019-04-12  7:04     ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

Rx and Tx queue start-stop and deferred queue start
features enabled.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |   2 +
 doc/guides/nics/features/enetc.ini |   1 +
 drivers/net/enetc/enetc_ethdev.c   | 185 ++++++++++++++++++++++++++-----------
 3 files changed, 134 insertions(+), 54 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index eeb0752..26d61f6 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -50,6 +50,8 @@ ENETC Features
 - Promiscuous
 - Multicast
 - Jumbo packets
+- Queue Start/Stop
+- Deferred Queue Start
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 0eed2cb..bd901fa 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -11,6 +11,7 @@ Promiscuous mode     = Y
 Allmulticast mode    = Y
 MTU update           = Y
 Jumbo frame          = Y
+Queue start/stop     = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 66cbf74..ff9301e 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -203,7 +203,6 @@
 enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
 {
 	int idx = tx_ring->index;
-	uint32_t tbmr;
 	phys_addr_t bd_address;
 
 	bd_address = (phys_addr_t)
@@ -215,9 +214,6 @@
 	enetc_txbdr_wr(hw, idx, ENETC_TBLENR,
 		       ENETC_RTBLENR_LEN(tx_ring->bd_count));
 
-	tbmr = ENETC_TBMR_EN;
-	/* enable ring */
-	enetc_txbdr_wr(hw, idx, ENETC_TBMR, tbmr);
 	enetc_txbdr_wr(hw, idx, ENETC_TBCIR, 0);
 	enetc_txbdr_wr(hw, idx, ENETC_TBCISR, 0);
 	tx_ring->tcir = (void *)((size_t)hw->reg +
@@ -227,16 +223,22 @@
 }
 
 static int
-enetc_alloc_tx_resources(struct rte_eth_dev *dev,
-			 uint16_t queue_idx,
-			 uint16_t nb_desc)
+enetc_tx_queue_setup(struct rte_eth_dev *dev,
+		     uint16_t queue_idx,
+		     uint16_t nb_desc,
+		     unsigned int socket_id __rte_unused,
+		     const struct rte_eth_txconf *tx_conf)
 {
-	int err;
+	int err = 0;
 	struct enetc_bdr *tx_ring;
 	struct rte_eth_dev_data *data = dev->data;
 	struct enetc_eth_adapter *priv =
 			ENETC_DEV_PRIVATE(data->dev_private);
 
+	PMD_INIT_FUNC_TRACE();
+	if (nb_desc > MAX_BD_COUNT)
+		return -1;
+
 	tx_ring = rte_zmalloc(NULL, sizeof(struct enetc_bdr), 0);
 	if (tx_ring == NULL) {
 		ENETC_PMD_ERR("Failed to allocate TX ring memory");
@@ -253,6 +255,17 @@
 	enetc_setup_txbdr(&priv->hw.hw, tx_ring);
 	data->tx_queues[queue_idx] = tx_ring;
 
+	if (!tx_conf->tx_deferred_start) {
+		/* enable ring */
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index,
+			       ENETC_TBMR, ENETC_TBMR_EN);
+		dev->data->tx_queue_state[tx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STARTED;
+	} else {
+		dev->data->tx_queue_state[tx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
 	return 0;
 fail:
 	rte_free(tx_ring);
@@ -260,24 +273,6 @@
 	return err;
 }
 
-static int
-enetc_tx_queue_setup(struct rte_eth_dev *dev,
-		     uint16_t queue_idx,
-		     uint16_t nb_desc,
-		     unsigned int socket_id __rte_unused,
-		     const struct rte_eth_txconf *tx_conf __rte_unused)
-{
-	int err = 0;
-
-	PMD_INIT_FUNC_TRACE();
-	if (nb_desc > MAX_BD_COUNT)
-		return -1;
-
-	err = enetc_alloc_tx_resources(dev, queue_idx, nb_desc);
-
-	return err;
-}
-
 static void
 enetc_tx_queue_release(void *txq)
 {
@@ -367,23 +362,27 @@
 	buf_size = (uint16_t)(rte_pktmbuf_data_room_size(rx_ring->mb_pool) -
 		   RTE_PKTMBUF_HEADROOM);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBSR, buf_size);
-	/* enable ring */
-	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 }
 
 static int
-enetc_alloc_rx_resources(struct rte_eth_dev *dev,
-			 uint16_t rx_queue_id,
-			 uint16_t nb_rx_desc,
-			 struct rte_mempool *mb_pool)
+enetc_rx_queue_setup(struct rte_eth_dev *dev,
+		     uint16_t rx_queue_id,
+		     uint16_t nb_rx_desc,
+		     unsigned int socket_id __rte_unused,
+		     const struct rte_eth_rxconf *rx_conf,
+		     struct rte_mempool *mb_pool)
 {
-	int err;
+	int err = 0;
 	struct enetc_bdr *rx_ring;
 	struct rte_eth_dev_data *data =  dev->data;
 	struct enetc_eth_adapter *adapter =
 			ENETC_DEV_PRIVATE(data->dev_private);
 
+	PMD_INIT_FUNC_TRACE();
+	if (nb_rx_desc > MAX_BD_COUNT)
+		return -1;
+
 	rx_ring = rte_zmalloc(NULL, sizeof(struct enetc_bdr), 0);
 	if (rx_ring == NULL) {
 		ENETC_PMD_ERR("Failed to allocate RX ring memory");
@@ -400,6 +399,17 @@
 	enetc_setup_rxbdr(&adapter->hw.hw, rx_ring, mb_pool);
 	data->rx_queues[rx_queue_id] = rx_ring;
 
+	if (!rx_conf->rx_deferred_start) {
+		/* enable ring */
+		enetc_rxbdr_wr(&adapter->hw.hw, rx_ring->index, ENETC_RBMR,
+			       ENETC_RBMR_EN);
+		dev->data->rx_queue_state[rx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STARTED;
+	} else {
+		dev->data->rx_queue_state[rx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
 	return 0;
 fail:
 	rte_free(rx_ring);
@@ -407,27 +417,6 @@
 	return err;
 }
 
-static int
-enetc_rx_queue_setup(struct rte_eth_dev *dev,
-		     uint16_t rx_queue_id,
-		     uint16_t nb_rx_desc,
-		     unsigned int socket_id __rte_unused,
-		     const struct rte_eth_rxconf *rx_conf __rte_unused,
-		     struct rte_mempool *mb_pool)
-{
-	int err = 0;
-
-	PMD_INIT_FUNC_TRACE();
-	if (nb_rx_desc > MAX_BD_COUNT)
-		return -1;
-
-	err = enetc_alloc_rx_resources(dev, rx_queue_id,
-				       nb_rx_desc,
-				       mb_pool);
-
-	return err;
-}
-
 static void
 enetc_rx_queue_release(void *rxq)
 {
@@ -661,6 +650,90 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	return 0;
 }
 
+static int
+enetc_rx_queue_start(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *rx_ring;
+	uint32_t rx_data;
+
+	rx_ring = dev->data->rx_queues[qidx];
+	if (dev->data->rx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STOPPED) {
+		rx_data = enetc_rxbdr_rd(&priv->hw.hw, rx_ring->index,
+					 ENETC_RBMR);
+		rx_data = rx_data | ENETC_RBMR_EN;
+		enetc_rxbdr_wr(&priv->hw.hw, rx_ring->index, ENETC_RBMR,
+			       rx_data);
+		dev->data->rx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STARTED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_rx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *rx_ring;
+	uint32_t rx_data;
+
+	rx_ring = dev->data->rx_queues[qidx];
+	if (dev->data->rx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STARTED) {
+		rx_data = enetc_rxbdr_rd(&priv->hw.hw, rx_ring->index,
+					 ENETC_RBMR);
+		rx_data = rx_data & (~ENETC_RBMR_EN);
+		enetc_rxbdr_wr(&priv->hw.hw, rx_ring->index, ENETC_RBMR,
+			       rx_data);
+		dev->data->rx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_tx_queue_start(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *tx_ring;
+	uint32_t tx_data;
+
+	tx_ring = dev->data->tx_queues[qidx];
+	if (dev->data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STOPPED) {
+		tx_data = enetc_txbdr_rd(&priv->hw.hw, tx_ring->index,
+					 ENETC_TBMR);
+		tx_data = tx_data | ENETC_TBMR_EN;
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index, ENETC_TBMR,
+			       tx_data);
+		dev->data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STARTED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_tx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *tx_ring;
+	uint32_t tx_data;
+
+	tx_ring = dev->data->tx_queues[qidx];
+	if (dev->data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STARTED) {
+		tx_data = enetc_txbdr_rd(&priv->hw.hw, tx_ring->index,
+					 ENETC_TBMR);
+		tx_data = tx_data & (~ENETC_TBMR_EN);
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index, ENETC_TBMR,
+			       tx_data);
+		dev->data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
+	return 0;
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -686,8 +759,12 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.mtu_set              = enetc_mtu_set,
 	.rx_queue_setup       = enetc_rx_queue_setup,
+	.rx_queue_start       = enetc_rx_queue_start,
+	.rx_queue_stop        = enetc_rx_queue_stop,
 	.rx_queue_release     = enetc_rx_queue_release,
 	.tx_queue_setup       = enetc_tx_queue_setup,
+	.tx_queue_start       = enetc_tx_queue_start,
+	.tx_queue_stop        = enetc_tx_queue_stop,
 	.tx_queue_release     = enetc_tx_queue_release,
 	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
 };
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 11/13] net/enetc: enable CRC offload feature
  2019-04-12  7:04 ` [dpdk-dev] [PATCH v2 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                     ` (10 preceding siblings ...)
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 10/13] net/enetc: enable Rx-Tx queue start/stop feature Gagandeep Singh
@ 2019-04-12  7:04   ` Gagandeep Singh
  2019-04-12  7:04     ` Gagandeep Singh
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 12/13] net/enetc: enable Rx checksum offload validation Gagandeep Singh
                     ` (2 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

CRC offload keep feature supported

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  1 +
 drivers/net/enetc/base/enetc_hw.h  |  1 +
 drivers/net/enetc/enetc.h          |  1 +
 drivers/net/enetc/enetc_ethdev.c   | 20 +++++++++++++++++---
 drivers/net/enetc/enetc_rxtx.c     |  6 ++++--
 6 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 26d61f6..2620460 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -52,6 +52,7 @@ ENETC Features
 - Jumbo packets
 - Queue Start/Stop
 - Deferred Queue Start
+- CRC offload
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index bd901fa..101dc0a 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -12,6 +12,7 @@ Allmulticast mode    = Y
 MTU update           = Y
 Jumbo frame          = Y
 Queue start/stop     = Y
+CRC offload          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 2eb1df3..261ad15 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -97,6 +97,7 @@
 #define ENETC_PM0_CMD_CFG		0x08008
 #define ENETC_PM0_TX_EN			BIT(0)
 #define ENETC_PM0_RX_EN			BIT(1)
+#define ENETC_PM0_CRC			BIT(6)
 
 #define ENETC_PM0_MAXFRM		0x08014
 #define ENETC_SET_TX_MTU(val)		((val) << 16)
diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index e494eb8..8c830a5 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -69,6 +69,7 @@ struct enetc_bdr {
 		void *tcisr; /* Tx */
 		int next_to_alloc; /* Rx */
 	};
+	uint8_t	crc_len; /* 0 if CRC stripped, 4 otherwise */
 };
 
 /*
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index ff9301e..ffae8ae 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -162,7 +162,9 @@
 	dev_info->max_rx_queues = MAX_RX_RINGS;
 	dev_info->max_tx_queues = MAX_TX_RINGS;
 	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
-	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_JUMBO_FRAME;
+	dev_info->rx_offload_capa =
+		(DEV_RX_OFFLOAD_KEEP_CRC |
+		 DEV_RX_OFFLOAD_JUMBO_FRAME);
 }
 
 static int
@@ -378,6 +380,7 @@
 	struct rte_eth_dev_data *data =  dev->data;
 	struct enetc_eth_adapter *adapter =
 			ENETC_DEV_PRIVATE(data->dev_private);
+	uint64_t rx_offloads = data->dev_conf.rxmode.offloads;
 
 	PMD_INIT_FUNC_TRACE();
 	if (nb_rx_desc > MAX_BD_COUNT)
@@ -410,6 +413,9 @@
 			       RTE_ETH_QUEUE_STATE_STOPPED;
 	}
 
+	rx_ring->crc_len = (uint8_t)((rx_offloads & DEV_RX_OFFLOAD_KEEP_CRC) ?
+				     ETHER_CRC_LEN : 0);
+
 	return 0;
 fail:
 	rte_free(rx_ring);
@@ -625,11 +631,11 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 static int
 enetc_dev_configure(struct rte_eth_dev *dev)
 {
-	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
-	uint64_t rx_offloads = eth_conf->rxmode.offloads;
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct enetc_hw *enetc_hw = &hw->hw;
+	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
+	uint64_t rx_offloads = eth_conf->rxmode.offloads;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -647,6 +653,14 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 		dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
 	}
 
+	if (rx_offloads & DEV_RX_OFFLOAD_KEEP_CRC) {
+		int config;
+
+		config = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+		config |= ENETC_PM0_CRC;
+		enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG, config);
+	}
+
 	return 0;
 }
 
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 42f16ca..4a758d2 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -208,8 +208,10 @@ static inline void __attribute__((hot))
 		if (!bd_status)
 			break;
 
-		rx_swbd->buffer_addr->pkt_len = rxbd->r.buf_len;
-		rx_swbd->buffer_addr->data_len = rxbd->r.buf_len;
+		rx_swbd->buffer_addr->pkt_len = rxbd->r.buf_len -
+						rx_ring->crc_len;
+		rx_swbd->buffer_addr->data_len = rxbd->r.buf_len -
+						 rx_ring->crc_len;
 		rx_swbd->buffer_addr->hash.rss = rxbd->r.rss_hash;
 		rx_swbd->buffer_addr->ol_flags = 0;
 		enetc_dev_rx_parse(rx_swbd->buffer_addr,
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 11/13] net/enetc: enable CRC offload feature
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 11/13] net/enetc: enable CRC offload feature Gagandeep Singh
@ 2019-04-12  7:04     ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

CRC offload keep feature supported

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  1 +
 drivers/net/enetc/base/enetc_hw.h  |  1 +
 drivers/net/enetc/enetc.h          |  1 +
 drivers/net/enetc/enetc_ethdev.c   | 20 +++++++++++++++++---
 drivers/net/enetc/enetc_rxtx.c     |  6 ++++--
 6 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 26d61f6..2620460 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -52,6 +52,7 @@ ENETC Features
 - Jumbo packets
 - Queue Start/Stop
 - Deferred Queue Start
+- CRC offload
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index bd901fa..101dc0a 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -12,6 +12,7 @@ Allmulticast mode    = Y
 MTU update           = Y
 Jumbo frame          = Y
 Queue start/stop     = Y
+CRC offload          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 2eb1df3..261ad15 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -97,6 +97,7 @@
 #define ENETC_PM0_CMD_CFG		0x08008
 #define ENETC_PM0_TX_EN			BIT(0)
 #define ENETC_PM0_RX_EN			BIT(1)
+#define ENETC_PM0_CRC			BIT(6)
 
 #define ENETC_PM0_MAXFRM		0x08014
 #define ENETC_SET_TX_MTU(val)		((val) << 16)
diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index e494eb8..8c830a5 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -69,6 +69,7 @@ struct enetc_bdr {
 		void *tcisr; /* Tx */
 		int next_to_alloc; /* Rx */
 	};
+	uint8_t	crc_len; /* 0 if CRC stripped, 4 otherwise */
 };
 
 /*
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index ff9301e..ffae8ae 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -162,7 +162,9 @@
 	dev_info->max_rx_queues = MAX_RX_RINGS;
 	dev_info->max_tx_queues = MAX_TX_RINGS;
 	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
-	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_JUMBO_FRAME;
+	dev_info->rx_offload_capa =
+		(DEV_RX_OFFLOAD_KEEP_CRC |
+		 DEV_RX_OFFLOAD_JUMBO_FRAME);
 }
 
 static int
@@ -378,6 +380,7 @@
 	struct rte_eth_dev_data *data =  dev->data;
 	struct enetc_eth_adapter *adapter =
 			ENETC_DEV_PRIVATE(data->dev_private);
+	uint64_t rx_offloads = data->dev_conf.rxmode.offloads;
 
 	PMD_INIT_FUNC_TRACE();
 	if (nb_rx_desc > MAX_BD_COUNT)
@@ -410,6 +413,9 @@
 			       RTE_ETH_QUEUE_STATE_STOPPED;
 	}
 
+	rx_ring->crc_len = (uint8_t)((rx_offloads & DEV_RX_OFFLOAD_KEEP_CRC) ?
+				     ETHER_CRC_LEN : 0);
+
 	return 0;
 fail:
 	rte_free(rx_ring);
@@ -625,11 +631,11 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 static int
 enetc_dev_configure(struct rte_eth_dev *dev)
 {
-	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
-	uint64_t rx_offloads = eth_conf->rxmode.offloads;
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct enetc_hw *enetc_hw = &hw->hw;
+	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
+	uint64_t rx_offloads = eth_conf->rxmode.offloads;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -647,6 +653,14 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 		dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
 	}
 
+	if (rx_offloads & DEV_RX_OFFLOAD_KEEP_CRC) {
+		int config;
+
+		config = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+		config |= ENETC_PM0_CRC;
+		enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG, config);
+	}
+
 	return 0;
 }
 
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 42f16ca..4a758d2 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -208,8 +208,10 @@ static inline void __attribute__((hot))
 		if (!bd_status)
 			break;
 
-		rx_swbd->buffer_addr->pkt_len = rxbd->r.buf_len;
-		rx_swbd->buffer_addr->data_len = rxbd->r.buf_len;
+		rx_swbd->buffer_addr->pkt_len = rxbd->r.buf_len -
+						rx_ring->crc_len;
+		rx_swbd->buffer_addr->data_len = rxbd->r.buf_len -
+						 rx_ring->crc_len;
 		rx_swbd->buffer_addr->hash.rss = rxbd->r.rss_hash;
 		rx_swbd->buffer_addr->ol_flags = 0;
 		enetc_dev_rx_parse(rx_swbd->buffer_addr,
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 12/13] net/enetc: enable Rx checksum offload validation
  2019-04-12  7:04 ` [dpdk-dev] [PATCH v2 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                     ` (11 preceding siblings ...)
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 11/13] net/enetc: enable CRC offload feature Gagandeep Singh
@ 2019-04-12  7:04   ` Gagandeep Singh
  2019-04-12  7:04     ` Gagandeep Singh
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 13/13] net/enetc: fix crash at high speed traffic Gagandeep Singh
  2019-04-12 11:01   ` [dpdk-dev] [PATCH v3 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

Checksum Validation on Rx is supported.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/features/enetc.ini |   2 +
 drivers/net/enetc/base/enetc_hw.h  |   5 ++
 drivers/net/enetc/enetc_ethdev.c   |  15 +++++-
 drivers/net/enetc/enetc_rxtx.c     | 107 ++++++++++++++++++++++++++++++++-----
 4 files changed, 115 insertions(+), 14 deletions(-)

diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 101dc0a..39a5201 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -13,6 +13,8 @@ MTU update           = Y
 Jumbo frame          = Y
 Queue start/stop     = Y
 CRC offload          = Y
+L3 checksum offload  = P
+L4 checksum offload  = P
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 261ad15..ff2bda5 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -99,6 +99,10 @@
 #define ENETC_PM0_RX_EN			BIT(1)
 #define ENETC_PM0_CRC			BIT(6)
 
+#define ENETC_PAR_PORT_CFG		0x03050
+#define L3_CKSUM			BIT(0)
+#define L4_CKSUM			BIT(1)
+
 #define ENETC_PM0_MAXFRM		0x08014
 #define ENETC_SET_TX_MTU(val)		((val) << 16)
 #define ENETC_SET_MAXFRM(val)		((val) & 0xffff)
@@ -182,6 +186,7 @@
 #define ENETC_TXBD_FLAGS_F		BIT(15)
 
 /* ENETC Parsed values (Little Endian) */
+#define ENETC_PARSE_ERROR		0x8000
 #define ENETC_PKT_TYPE_ETHER            0x0060
 #define ENETC_PKT_TYPE_IPV4             0x0000
 #define ENETC_PKT_TYPE_IPV6             0x0020
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index ffae8ae..362e074 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -163,7 +163,10 @@
 	dev_info->max_tx_queues = MAX_TX_RINGS;
 	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
 	dev_info->rx_offload_capa =
-		(DEV_RX_OFFLOAD_KEEP_CRC |
+		(DEV_RX_OFFLOAD_IPV4_CKSUM |
+		 DEV_RX_OFFLOAD_UDP_CKSUM |
+		 DEV_RX_OFFLOAD_TCP_CKSUM |
+		 DEV_RX_OFFLOAD_KEEP_CRC |
 		 DEV_RX_OFFLOAD_JUMBO_FRAME);
 }
 
@@ -636,6 +639,7 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	struct enetc_hw *enetc_hw = &hw->hw;
 	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
 	uint64_t rx_offloads = eth_conf->rxmode.offloads;
+	uint32_t checksum = L3_CKSUM | L4_CKSUM;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -661,6 +665,15 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 		enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG, config);
 	}
 
+	if (rx_offloads & DEV_RX_OFFLOAD_IPV4_CKSUM)
+		checksum &= ~L3_CKSUM;
+
+	if (rx_offloads & (DEV_RX_OFFLOAD_UDP_CKSUM | DEV_RX_OFFLOAD_TCP_CKSUM))
+		checksum &= ~L4_CKSUM;
+
+	enetc_port_wr(enetc_hw, ENETC_PAR_PORT_CFG, checksum);
+
+
 	return 0;
 }
 
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 4a758d2..0ce7dbe 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -115,69 +115,150 @@
 	return j;
 }
 
+static inline void enetc_slow_parsing(struct rte_mbuf *m,
+				     uint64_t parse_results)
+{
+	m->ol_flags &= ~(PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD);
+
+	switch (parse_results) {
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4;
+		m->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6;
+		m->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_TCP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_TCP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_TCP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_TCP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_UDP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_UDP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_UDP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_UDP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_SCTP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_SCTP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_SCTP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_SCTP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_ICMP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_ICMP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_ICMP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_ICMP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	/* More switch cases can be added */
+	default:
+		m->packet_type = RTE_PTYPE_UNKNOWN;
+		m->ol_flags |= PKT_RX_IP_CKSUM_UNKNOWN |
+			       PKT_RX_L4_CKSUM_UNKNOWN;
+	}
+}
+
 
 static inline void __attribute__((hot))
 enetc_dev_rx_parse(struct rte_mbuf *m, uint16_t parse_results)
 {
 	ENETC_PMD_DP_DEBUG("parse summary = 0x%x   ", parse_results);
+	m->ol_flags |= PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD;
 
-	m->packet_type = RTE_PTYPE_UNKNOWN;
 	switch (parse_results) {
 	case ENETC_PKT_TYPE_ETHER:
 		m->packet_type = RTE_PTYPE_L2_ETHER;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_TCP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_TCP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_TCP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_TCP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_UDP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_UDP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_UDP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_UDP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_SCTP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_SCTP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_SCTP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_SCTP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_ICMP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_ICMP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_ICMP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_ICMP;
-		break;
+		return;
 	/* More switch cases can be added */
 	default:
-		m->packet_type = RTE_PTYPE_UNKNOWN;
+		enetc_slow_parsing(m, parse_results);
 	}
+
 }
 
 static int
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 12/13] net/enetc: enable Rx checksum offload validation
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 12/13] net/enetc: enable Rx checksum offload validation Gagandeep Singh
@ 2019-04-12  7:04     ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

Checksum Validation on Rx is supported.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/features/enetc.ini |   2 +
 drivers/net/enetc/base/enetc_hw.h  |   5 ++
 drivers/net/enetc/enetc_ethdev.c   |  15 +++++-
 drivers/net/enetc/enetc_rxtx.c     | 107 ++++++++++++++++++++++++++++++++-----
 4 files changed, 115 insertions(+), 14 deletions(-)

diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 101dc0a..39a5201 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -13,6 +13,8 @@ MTU update           = Y
 Jumbo frame          = Y
 Queue start/stop     = Y
 CRC offload          = Y
+L3 checksum offload  = P
+L4 checksum offload  = P
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 261ad15..ff2bda5 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -99,6 +99,10 @@
 #define ENETC_PM0_RX_EN			BIT(1)
 #define ENETC_PM0_CRC			BIT(6)
 
+#define ENETC_PAR_PORT_CFG		0x03050
+#define L3_CKSUM			BIT(0)
+#define L4_CKSUM			BIT(1)
+
 #define ENETC_PM0_MAXFRM		0x08014
 #define ENETC_SET_TX_MTU(val)		((val) << 16)
 #define ENETC_SET_MAXFRM(val)		((val) & 0xffff)
@@ -182,6 +186,7 @@
 #define ENETC_TXBD_FLAGS_F		BIT(15)
 
 /* ENETC Parsed values (Little Endian) */
+#define ENETC_PARSE_ERROR		0x8000
 #define ENETC_PKT_TYPE_ETHER            0x0060
 #define ENETC_PKT_TYPE_IPV4             0x0000
 #define ENETC_PKT_TYPE_IPV6             0x0020
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index ffae8ae..362e074 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -163,7 +163,10 @@
 	dev_info->max_tx_queues = MAX_TX_RINGS;
 	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
 	dev_info->rx_offload_capa =
-		(DEV_RX_OFFLOAD_KEEP_CRC |
+		(DEV_RX_OFFLOAD_IPV4_CKSUM |
+		 DEV_RX_OFFLOAD_UDP_CKSUM |
+		 DEV_RX_OFFLOAD_TCP_CKSUM |
+		 DEV_RX_OFFLOAD_KEEP_CRC |
 		 DEV_RX_OFFLOAD_JUMBO_FRAME);
 }
 
@@ -636,6 +639,7 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	struct enetc_hw *enetc_hw = &hw->hw;
 	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
 	uint64_t rx_offloads = eth_conf->rxmode.offloads;
+	uint32_t checksum = L3_CKSUM | L4_CKSUM;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -661,6 +665,15 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 		enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG, config);
 	}
 
+	if (rx_offloads & DEV_RX_OFFLOAD_IPV4_CKSUM)
+		checksum &= ~L3_CKSUM;
+
+	if (rx_offloads & (DEV_RX_OFFLOAD_UDP_CKSUM | DEV_RX_OFFLOAD_TCP_CKSUM))
+		checksum &= ~L4_CKSUM;
+
+	enetc_port_wr(enetc_hw, ENETC_PAR_PORT_CFG, checksum);
+
+
 	return 0;
 }
 
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 4a758d2..0ce7dbe 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -115,69 +115,150 @@
 	return j;
 }
 
+static inline void enetc_slow_parsing(struct rte_mbuf *m,
+				     uint64_t parse_results)
+{
+	m->ol_flags &= ~(PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD);
+
+	switch (parse_results) {
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4;
+		m->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6;
+		m->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_TCP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_TCP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_TCP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_TCP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_UDP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_UDP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_UDP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_UDP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_SCTP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_SCTP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_SCTP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_SCTP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_ICMP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_ICMP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_ICMP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_ICMP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	/* More switch cases can be added */
+	default:
+		m->packet_type = RTE_PTYPE_UNKNOWN;
+		m->ol_flags |= PKT_RX_IP_CKSUM_UNKNOWN |
+			       PKT_RX_L4_CKSUM_UNKNOWN;
+	}
+}
+
 
 static inline void __attribute__((hot))
 enetc_dev_rx_parse(struct rte_mbuf *m, uint16_t parse_results)
 {
 	ENETC_PMD_DP_DEBUG("parse summary = 0x%x   ", parse_results);
+	m->ol_flags |= PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD;
 
-	m->packet_type = RTE_PTYPE_UNKNOWN;
 	switch (parse_results) {
 	case ENETC_PKT_TYPE_ETHER:
 		m->packet_type = RTE_PTYPE_L2_ETHER;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_TCP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_TCP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_TCP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_TCP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_UDP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_UDP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_UDP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_UDP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_SCTP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_SCTP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_SCTP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_SCTP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_ICMP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_ICMP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_ICMP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_ICMP;
-		break;
+		return;
 	/* More switch cases can be added */
 	default:
-		m->packet_type = RTE_PTYPE_UNKNOWN;
+		enetc_slow_parsing(m, parse_results);
 	}
+
 }
 
 static int
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 13/13] net/enetc: fix crash at high speed traffic
  2019-04-12  7:04 ` [dpdk-dev] [PATCH v2 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                     ` (12 preceding siblings ...)
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 12/13] net/enetc: enable Rx checksum offload validation Gagandeep Singh
@ 2019-04-12  7:04   ` Gagandeep Singh
  2019-04-12  7:04     ` Gagandeep Singh
  2019-04-12 11:01   ` [dpdk-dev] [PATCH v3 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

On xmit side, there should be a check whether BD ring
has free BDs available before transmit a packet to avoid
data corruption and buffer leak issue.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: g.singh@nxp.com

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_rxtx.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 0ce7dbe..81b0ef3 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -49,11 +49,16 @@
 		uint16_t nb_pkts)
 {
 	struct enetc_swbd *tx_swbd;
-	int i, start;
+	int i, start, bds_to_use;
 	struct enetc_tx_bd *txbd;
 	struct enetc_bdr *tx_ring = (struct enetc_bdr *)tx_queue;
 
 	i = tx_ring->next_to_use;
+
+	bds_to_use = enetc_bd_unused(tx_ring);
+	if (bds_to_use < nb_pkts)
+		nb_pkts = bds_to_use;
+
 	start = 0;
 	while (nb_pkts--) {
 		enetc_clean_tx_ring(tx_ring);
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v2 13/13] net/enetc: fix crash at high speed traffic
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 13/13] net/enetc: fix crash at high speed traffic Gagandeep Singh
@ 2019-04-12  7:04     ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  7:04 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: thomas, Gagandeep Singh

On xmit side, there should be a check whether BD ring
has free BDs available before transmit a packet to avoid
data corruption and buffer leak issue.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: g.singh@nxp.com

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_rxtx.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 0ce7dbe..81b0ef3 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -49,11 +49,16 @@
 		uint16_t nb_pkts)
 {
 	struct enetc_swbd *tx_swbd;
-	int i, start;
+	int i, start, bds_to_use;
 	struct enetc_tx_bd *txbd;
 	struct enetc_bdr *tx_ring = (struct enetc_bdr *)tx_queue;
 
 	i = tx_ring->next_to_use;
+
+	bds_to_use = enetc_bd_unused(tx_ring);
+	if (bds_to_use < nb_pkts)
+		nb_pkts = bds_to_use;
+
 	start = 0;
 	while (nb_pkts--) {
 		enetc_clean_tx_ring(tx_ring);
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* Re: [dpdk-dev] [PATCH v2 03/13] net/enetc: use correct buffer allocation API
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 03/13] net/enetc: use correct buffer allocation API Gagandeep Singh
  2019-04-12  7:04     ` Gagandeep Singh
@ 2019-04-12  8:37     ` Thomas Monjalon
  2019-04-12  8:37       ` Thomas Monjalon
  2019-04-12  8:50       ` [dpdk-dev] [EXT] " Gagandeep Singh
  1 sibling, 2 replies; 126+ messages in thread
From: Thomas Monjalon @ 2019-04-12  8:37 UTC (permalink / raw)
  To: Gagandeep Singh; +Cc: dev, ferruh.yigit

12/04/2019 09:04, Gagandeep Singh:
> rte_pktmbuf_alloc API should be used to allocate mbuf
> instead of rte_pktmbuf_raw_alloc to avoid use of stale mbuf
> information.
> 
> Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
> Cc: g.singh@nxp.com

You should mention it is also fixing big endian compilation.

^ permalink raw reply	[flat|nested] 126+ messages in thread

* Re: [dpdk-dev] [PATCH v2 03/13] net/enetc: use correct buffer allocation API
  2019-04-12  8:37     ` Thomas Monjalon
@ 2019-04-12  8:37       ` Thomas Monjalon
  2019-04-12  8:50       ` [dpdk-dev] [EXT] " Gagandeep Singh
  1 sibling, 0 replies; 126+ messages in thread
From: Thomas Monjalon @ 2019-04-12  8:37 UTC (permalink / raw)
  To: Gagandeep Singh; +Cc: dev, ferruh.yigit

12/04/2019 09:04, Gagandeep Singh:
> rte_pktmbuf_alloc API should be used to allocate mbuf
> instead of rte_pktmbuf_raw_alloc to avoid use of stale mbuf
> information.
> 
> Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
> Cc: g.singh@nxp.com

You should mention it is also fixing big endian compilation.




^ permalink raw reply	[flat|nested] 126+ messages in thread

* Re: [dpdk-dev] [EXT] Re: [PATCH v2 03/13] net/enetc: use correct buffer allocation API
  2019-04-12  8:37     ` Thomas Monjalon
  2019-04-12  8:37       ` Thomas Monjalon
@ 2019-04-12  8:50       ` Gagandeep Singh
  2019-04-12  8:50         ` Gagandeep Singh
  1 sibling, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  8:50 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, ferruh.yigit



> -----Original Message-----
> From: Thomas Monjalon <thomas@monjalon.net>
> Sent: Friday, April 12, 2019 2:08 PM
> To: Gagandeep Singh <G.Singh@nxp.com>
> Cc: dev@dpdk.org; ferruh.yigit@intel.com> 
> 
> 12/04/2019 09:04, Gagandeep Singh:
> > rte_pktmbuf_alloc API should be used to allocate mbuf
> > instead of rte_pktmbuf_raw_alloc to avoid use of stale mbuf
> > information.
> >
> > Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
> > Cc: g.singh@nxp.com
> 
> You should mention it is also fixing big endian compilation.
> 
> 
Ok, I'll do that.

Thanks,
Gagandeep Singh

^ permalink raw reply	[flat|nested] 126+ messages in thread

* Re: [dpdk-dev] [EXT] Re: [PATCH v2 03/13] net/enetc: use correct buffer allocation API
  2019-04-12  8:50       ` [dpdk-dev] [EXT] " Gagandeep Singh
@ 2019-04-12  8:50         ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12  8:50 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, ferruh.yigit



> -----Original Message-----
> From: Thomas Monjalon <thomas@monjalon.net>
> Sent: Friday, April 12, 2019 2:08 PM
> To: Gagandeep Singh <G.Singh@nxp.com>
> Cc: dev@dpdk.org; ferruh.yigit@intel.com> 
> 
> 12/04/2019 09:04, Gagandeep Singh:
> > rte_pktmbuf_alloc API should be used to allocate mbuf
> > instead of rte_pktmbuf_raw_alloc to avoid use of stale mbuf
> > information.
> >
> > Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
> > Cc: g.singh@nxp.com
> 
> You should mention it is also fixing big endian compilation.
> 
> 
Ok, I'll do that.

Thanks,
Gagandeep Singh


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 00/13] ENETC PMD basic features and bug fixes
  2019-04-12  7:04 ` [dpdk-dev] [PATCH v2 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                     ` (13 preceding siblings ...)
  2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 13/13] net/enetc: fix crash at high speed traffic Gagandeep Singh
@ 2019-04-12 11:01   ` Gagandeep Singh
  2019-04-12 11:01     ` Gagandeep Singh
                       ` (14 more replies)
  14 siblings, 15 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

V1 log:
 * support added for MTU, jumbo frame, queue start/stop, promiscuous,
   multicast, crc offload, RX checksum validation, basic stats
 * some bug fixes

V2 change-log:
 * remove unneeded code from stats get
 * fix big endian compilation

v3 change-log:
 * commit message updated for 03/13 patch
 * add stable to Cc for fixes

Gagandeep Singh (13):
  net/enetc: support physical addressing mode
  net/enetc: fix SMMU unhandled context fault
  net/enetc: fix big endian build and correct buffer allocation
  net/enetc: set interface mode for SXGMII
  net/enetc: add basic statistics
  net/enetc: replace register read/write macros with functions
  net/enetc: remove forward declarations
  net/enetc: enable promiscuous and allmulticast feature
  net/enetc: add MTU update and jumbo frames support
  net/enetc: enable Rx-Tx queue start/stop feature
  net/enetc: enable CRC offload feature
  net/enetc: enable Rx checksum offload validation
  net/enetc: fix crash at high speed traffic

 doc/guides/nics/enetc.rst          |   7 +
 doc/guides/nics/features/enetc.ini |   9 +
 drivers/net/enetc/base/enetc_hw.h  |  53 ++-
 drivers/net/enetc/enetc.h          |  13 +-
 drivers/net/enetc/enetc_ethdev.c   | 734 +++++++++++++++++++++++++------------
 drivers/net/enetc/enetc_rxtx.c     | 131 +++++--
 6 files changed, 682 insertions(+), 265 deletions(-)

-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 00/13] ENETC PMD basic features and bug fixes
  2019-04-12 11:01   ` [dpdk-dev] [PATCH v3 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
@ 2019-04-12 11:01     ` Gagandeep Singh
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 01/13] net/enetc: support physical addressing mode Gagandeep Singh
                       ` (13 subsequent siblings)
  14 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

V1 log:
 * support added for MTU, jumbo frame, queue start/stop, promiscuous,
   multicast, crc offload, RX checksum validation, basic stats
 * some bug fixes

V2 change-log:
 * remove unneeded code from stats get
 * fix big endian compilation

v3 change-log:
 * commit message updated for 03/13 patch
 * add stable to Cc for fixes

Gagandeep Singh (13):
  net/enetc: support physical addressing mode
  net/enetc: fix SMMU unhandled context fault
  net/enetc: fix big endian build and correct buffer allocation
  net/enetc: set interface mode for SXGMII
  net/enetc: add basic statistics
  net/enetc: replace register read/write macros with functions
  net/enetc: remove forward declarations
  net/enetc: enable promiscuous and allmulticast feature
  net/enetc: add MTU update and jumbo frames support
  net/enetc: enable Rx-Tx queue start/stop feature
  net/enetc: enable CRC offload feature
  net/enetc: enable Rx checksum offload validation
  net/enetc: fix crash at high speed traffic

 doc/guides/nics/enetc.rst          |   7 +
 doc/guides/nics/features/enetc.ini |   9 +
 drivers/net/enetc/base/enetc_hw.h  |  53 ++-
 drivers/net/enetc/enetc.h          |  13 +-
 drivers/net/enetc/enetc_ethdev.c   | 734 +++++++++++++++++++++++++------------
 drivers/net/enetc/enetc_rxtx.c     | 131 +++++--
 6 files changed, 682 insertions(+), 265 deletions(-)

-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 01/13] net/enetc: support physical addressing mode
  2019-04-12 11:01   ` [dpdk-dev] [PATCH v3 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
  2019-04-12 11:01     ` Gagandeep Singh
@ 2019-04-12 11:01     ` Gagandeep Singh
  2019-04-12 11:01       ` Gagandeep Singh
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 02/13] net/enetc: fix SMMU unhandled context fault Gagandeep Singh
                       ` (12 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Support added for physical addressing mode and
change driver flags to don't care.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 22 ++++++++++++----------
 drivers/net/enetc/enetc_rxtx.c   |  6 +++---
 2 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 023fe75..7a9a97d 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #include <stdbool.h>
@@ -334,14 +334,15 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
 {
 	int idx = tx_ring->index;
-	uintptr_t base_addr;
 	uint32_t tbmr;
+	phys_addr_t bd_address;
 
-	base_addr = (uintptr_t)tx_ring->bd_base;
+	bd_address = (phys_addr_t)
+		     rte_mem_virt2iova((const void *)tx_ring->bd_base);
 	enetc_txbdr_wr(hw, idx, ENETC_TBBAR0,
-		       lower_32_bits((uint64_t)base_addr));
+		       lower_32_bits((uint64_t)bd_address));
 	enetc_txbdr_wr(hw, idx, ENETC_TBBAR1,
-		       upper_32_bits((uint64_t)base_addr));
+		       upper_32_bits((uint64_t)bd_address));
 	enetc_txbdr_wr(hw, idx, ENETC_TBLENR,
 		       ENETC_RTBLENR_LEN(tx_ring->bd_count));
 
@@ -478,14 +479,15 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		  struct rte_mempool *mb_pool)
 {
 	int idx = rx_ring->index;
-	uintptr_t base_addr;
 	uint16_t buf_size;
+	phys_addr_t bd_address;
 
-	base_addr = (uintptr_t)rx_ring->bd_base;
+	bd_address = (phys_addr_t)
+		     rte_mem_virt2iova((const void *)rx_ring->bd_base);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBAR0,
-		       lower_32_bits((uint64_t)base_addr));
+		       lower_32_bits((uint64_t)bd_address));
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBAR1,
-		       upper_32_bits((uint64_t)base_addr));
+		       upper_32_bits((uint64_t)bd_address));
 	enetc_rxbdr_wr(hw, idx, ENETC_RBLENR,
 		       ENETC_RTBLENR_LEN(rx_ring->bd_count));
 
@@ -612,7 +614,7 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 
 static struct rte_pci_driver rte_enetc_pmd = {
 	.id_table = pci_id_enetc_map,
-	.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_IOVA_AS_VA,
+	.drv_flags = RTE_PCI_DRV_NEED_MAPPING,
 	.probe = enetc_pci_probe,
 	.remove = enetc_pci_remove,
 };
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 631e243..a31a387 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #include <stdbool.h>
@@ -64,7 +64,7 @@
 		txbd->buf_len = txbd->frm_len;
 		txbd->flags = rte_cpu_to_le_16(ENETC_TXBD_FLAGS_F);
 		txbd->addr = (uint64_t)(uintptr_t)
-		rte_cpu_to_le_64((size_t)tx_swbd->buffer_addr->buf_addr +
+		rte_cpu_to_le_64((size_t)tx_swbd->buffer_addr->buf_iova +
 				 tx_swbd->buffer_addr->data_off);
 		i++;
 		start++;
@@ -91,7 +91,7 @@
 		rx_swbd->buffer_addr =
 			rte_cpu_to_le_64(rte_mbuf_raw_alloc(rx_ring->mb_pool));
 		rxbd->w.addr = (uint64_t)(uintptr_t)
-			       rx_swbd->buffer_addr->buf_addr +
+			       rx_swbd->buffer_addr->buf_iova +
 			       rx_swbd->buffer_addr->data_off;
 		/* clear 'R" as well */
 		rxbd->r.lstatus = 0;
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 01/13] net/enetc: support physical addressing mode
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 01/13] net/enetc: support physical addressing mode Gagandeep Singh
@ 2019-04-12 11:01       ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Support added for physical addressing mode and
change driver flags to don't care.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 22 ++++++++++++----------
 drivers/net/enetc/enetc_rxtx.c   |  6 +++---
 2 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 023fe75..7a9a97d 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #include <stdbool.h>
@@ -334,14 +334,15 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
 {
 	int idx = tx_ring->index;
-	uintptr_t base_addr;
 	uint32_t tbmr;
+	phys_addr_t bd_address;
 
-	base_addr = (uintptr_t)tx_ring->bd_base;
+	bd_address = (phys_addr_t)
+		     rte_mem_virt2iova((const void *)tx_ring->bd_base);
 	enetc_txbdr_wr(hw, idx, ENETC_TBBAR0,
-		       lower_32_bits((uint64_t)base_addr));
+		       lower_32_bits((uint64_t)bd_address));
 	enetc_txbdr_wr(hw, idx, ENETC_TBBAR1,
-		       upper_32_bits((uint64_t)base_addr));
+		       upper_32_bits((uint64_t)bd_address));
 	enetc_txbdr_wr(hw, idx, ENETC_TBLENR,
 		       ENETC_RTBLENR_LEN(tx_ring->bd_count));
 
@@ -478,14 +479,15 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		  struct rte_mempool *mb_pool)
 {
 	int idx = rx_ring->index;
-	uintptr_t base_addr;
 	uint16_t buf_size;
+	phys_addr_t bd_address;
 
-	base_addr = (uintptr_t)rx_ring->bd_base;
+	bd_address = (phys_addr_t)
+		     rte_mem_virt2iova((const void *)rx_ring->bd_base);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBAR0,
-		       lower_32_bits((uint64_t)base_addr));
+		       lower_32_bits((uint64_t)bd_address));
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBAR1,
-		       upper_32_bits((uint64_t)base_addr));
+		       upper_32_bits((uint64_t)bd_address));
 	enetc_rxbdr_wr(hw, idx, ENETC_RBLENR,
 		       ENETC_RTBLENR_LEN(rx_ring->bd_count));
 
@@ -612,7 +614,7 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 
 static struct rte_pci_driver rte_enetc_pmd = {
 	.id_table = pci_id_enetc_map,
-	.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_IOVA_AS_VA,
+	.drv_flags = RTE_PCI_DRV_NEED_MAPPING,
 	.probe = enetc_pci_probe,
 	.remove = enetc_pci_remove,
 };
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 631e243..a31a387 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #include <stdbool.h>
@@ -64,7 +64,7 @@
 		txbd->buf_len = txbd->frm_len;
 		txbd->flags = rte_cpu_to_le_16(ENETC_TXBD_FLAGS_F);
 		txbd->addr = (uint64_t)(uintptr_t)
-		rte_cpu_to_le_64((size_t)tx_swbd->buffer_addr->buf_addr +
+		rte_cpu_to_le_64((size_t)tx_swbd->buffer_addr->buf_iova +
 				 tx_swbd->buffer_addr->data_off);
 		i++;
 		start++;
@@ -91,7 +91,7 @@
 		rx_swbd->buffer_addr =
 			rte_cpu_to_le_64(rte_mbuf_raw_alloc(rx_ring->mb_pool));
 		rxbd->w.addr = (uint64_t)(uintptr_t)
-			       rx_swbd->buffer_addr->buf_addr +
+			       rx_swbd->buffer_addr->buf_iova +
 			       rx_swbd->buffer_addr->data_off;
 		/* clear 'R" as well */
 		rxbd->r.lstatus = 0;
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 02/13] net/enetc: fix SMMU unhandled context fault
  2019-04-12 11:01   ` [dpdk-dev] [PATCH v3 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
  2019-04-12 11:01     ` Gagandeep Singh
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 01/13] net/enetc: support physical addressing mode Gagandeep Singh
@ 2019-04-12 11:01     ` Gagandeep Singh
  2019-04-12 11:01       ` Gagandeep Singh
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 03/13] net/enetc: fix big endian build and correct buffer allocation Gagandeep Singh
                       ` (11 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh, stable

First configure ring with BDs properly then enable
the ring.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: stable@dpdk.org

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 7a9a97d..f1807b9 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -492,15 +492,15 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		       ENETC_RTBLENR_LEN(rx_ring->bd_count));
 
 	rx_ring->mb_pool = mb_pool;
-	/* enable ring */
-	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
-	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 	rx_ring->rcir = (void *)((size_t)hw->reg +
 			ENETC_BDR(RX, idx, ENETC_RBCIR));
 	enetc_refill_rx_ring(rx_ring, (enetc_bd_unused(rx_ring)));
 	buf_size = (uint16_t)(rte_pktmbuf_data_room_size(rx_ring->mb_pool) -
 		   RTE_PKTMBUF_HEADROOM);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBSR, buf_size);
+	/* enable ring */
+	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
+	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 }
 
 static int
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 02/13] net/enetc: fix SMMU unhandled context fault
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 02/13] net/enetc: fix SMMU unhandled context fault Gagandeep Singh
@ 2019-04-12 11:01       ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh, stable

First configure ring with BDs properly then enable
the ring.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: stable@dpdk.org

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 7a9a97d..f1807b9 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -492,15 +492,15 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		       ENETC_RTBLENR_LEN(rx_ring->bd_count));
 
 	rx_ring->mb_pool = mb_pool;
-	/* enable ring */
-	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
-	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 	rx_ring->rcir = (void *)((size_t)hw->reg +
 			ENETC_BDR(RX, idx, ENETC_RBCIR));
 	enetc_refill_rx_ring(rx_ring, (enetc_bd_unused(rx_ring)));
 	buf_size = (uint16_t)(rte_pktmbuf_data_room_size(rx_ring->mb_pool) -
 		   RTE_PKTMBUF_HEADROOM);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBSR, buf_size);
+	/* enable ring */
+	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
+	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 }
 
 static int
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 03/13] net/enetc: fix big endian build and correct buffer allocation
  2019-04-12 11:01   ` [dpdk-dev] [PATCH v3 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                       ` (2 preceding siblings ...)
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 02/13] net/enetc: fix SMMU unhandled context fault Gagandeep Singh
@ 2019-04-12 11:01     ` Gagandeep Singh
  2019-04-12 11:01       ` Gagandeep Singh
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 04/13] net/enetc: set interface mode for SXGMII Gagandeep Singh
                       ` (10 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh, thomas, stable

There was an error at rte_constant_bswap64 while compiling
with big endian toolchain. so fixing it by adding type cast.

Also, rte_pktmbuf_alloc API should be used to allocate mbuf
instead of rte_pktmbuf_raw_alloc to avoid use of stale mbuf
information.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: thomas@monjalon.net
Cc: stable@dpdk.org

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_rxtx.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index a31a387..42f16ca 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -88,8 +88,9 @@
 	rx_swbd = &rx_ring->q_swbd[i];
 	rxbd = ENETC_RXBD(*rx_ring, i);
 	for (j = 0; j < buff_cnt; j++) {
-		rx_swbd->buffer_addr =
-			rte_cpu_to_le_64(rte_mbuf_raw_alloc(rx_ring->mb_pool));
+		rx_swbd->buffer_addr = (void *)(uintptr_t)
+			rte_cpu_to_le_64((uint64_t)(uintptr_t)
+					rte_pktmbuf_alloc(rx_ring->mb_pool));
 		rxbd->w.addr = (uint64_t)(uintptr_t)
 			       rx_swbd->buffer_addr->buf_iova +
 			       rx_swbd->buffer_addr->data_off;
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 03/13] net/enetc: fix big endian build and correct buffer allocation
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 03/13] net/enetc: fix big endian build and correct buffer allocation Gagandeep Singh
@ 2019-04-12 11:01       ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh, thomas, stable

There was an error at rte_constant_bswap64 while compiling
with big endian toolchain. so fixing it by adding type cast.

Also, rte_pktmbuf_alloc API should be used to allocate mbuf
instead of rte_pktmbuf_raw_alloc to avoid use of stale mbuf
information.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: thomas@monjalon.net
Cc: stable@dpdk.org

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_rxtx.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index a31a387..42f16ca 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -88,8 +88,9 @@
 	rx_swbd = &rx_ring->q_swbd[i];
 	rxbd = ENETC_RXBD(*rx_ring, i);
 	for (j = 0; j < buff_cnt; j++) {
-		rx_swbd->buffer_addr =
-			rte_cpu_to_le_64(rte_mbuf_raw_alloc(rx_ring->mb_pool));
+		rx_swbd->buffer_addr = (void *)(uintptr_t)
+			rte_cpu_to_le_64((uint64_t)(uintptr_t)
+					rte_pktmbuf_alloc(rx_ring->mb_pool));
 		rxbd->w.addr = (uint64_t)(uintptr_t)
 			       rx_swbd->buffer_addr->buf_iova +
 			       rx_swbd->buffer_addr->data_off;
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 04/13] net/enetc: set interface mode for SXGMII
  2019-04-12 11:01   ` [dpdk-dev] [PATCH v3 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                       ` (3 preceding siblings ...)
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 03/13] net/enetc: fix big endian build and correct buffer allocation Gagandeep Singh
@ 2019-04-12 11:01     ` Gagandeep Singh
  2019-04-12 11:01       ` Gagandeep Singh
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 05/13] net/enetc: add basic statistics Gagandeep Singh
                       ` (9 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Support for SXGMII port has been enabled. It will
depends on boot loader information passed through IERB.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/base/enetc_hw.h | 13 ++++++++++++-
 drivers/net/enetc/enetc_ethdev.c  | 11 +++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index f36fa11..e3738a6 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #ifndef _ENETC_HW_H_
@@ -84,6 +84,12 @@
 #define ENETC_PSIPMAR1(n)		(0x00104 + (n) * 0x20)
 #define ENETC_PCAPR0			0x00900
 #define ENETC_PCAPR1			0x00904
+#define ENETC_PM0_IF_MODE		0x8300
+#define ENETC_PM1_IF_MODE		0x9300
+#define ENETC_PMO_IFM_RG		BIT(2)
+#define ENETC_PM0_IFM_RLP		(BIT(5) | BIT(11))
+#define ENETC_PM0_IFM_RGAUTO		(BIT(15) | ENETC_PMO_IFM_RG | BIT(1))
+#define ENETC_PM0_IFM_XGMII		BIT(12)
 
 #define ENETC_PV0CFGR(n)		(0x00920 + (n) * 0x10)
 #define ENETC_PVCFGR_SET_TXBDR(val)	((val) & 0xff)
@@ -109,6 +115,11 @@
 #define ENETC_G_EIPBRR0			0x00bf8
 #define ENETC_G_EIPBRR1			0x00bfc
 
+
+/* MAC Counters */
+#define ENETC_G_EPFBLPR(n)		(0xd00 + 4 * (n))
+#define ENETC_G_EPFBLPR1_XGMII		0x80000000
+
 /* general register accessors */
 #define enetc_rd_reg(reg)	rte_read32((void *)(reg))
 #define enetc_wr_reg(reg, val)	rte_write32((val), (void *)(reg))
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index f1807b9..91e9692 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -139,6 +139,17 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
 			val | ENETC_PMR_EN);
 
+	/* set auto-speed for RGMII */
+	if (enetc_port_rd(&hw->hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
+		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+	}
+	if (enetc_global_rd(&hw->hw,
+			    ENETC_G_EPFBLPR(1)) == ENETC_G_EPFBLPR1_XGMII) {
+		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_XGMII);
+	}
+
 	return 0;
 }
 
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 04/13] net/enetc: set interface mode for SXGMII
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 04/13] net/enetc: set interface mode for SXGMII Gagandeep Singh
@ 2019-04-12 11:01       ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Support for SXGMII port has been enabled. It will
depends on boot loader information passed through IERB.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/base/enetc_hw.h | 13 ++++++++++++-
 drivers/net/enetc/enetc_ethdev.c  | 11 +++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index f36fa11..e3738a6 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #ifndef _ENETC_HW_H_
@@ -84,6 +84,12 @@
 #define ENETC_PSIPMAR1(n)		(0x00104 + (n) * 0x20)
 #define ENETC_PCAPR0			0x00900
 #define ENETC_PCAPR1			0x00904
+#define ENETC_PM0_IF_MODE		0x8300
+#define ENETC_PM1_IF_MODE		0x9300
+#define ENETC_PMO_IFM_RG		BIT(2)
+#define ENETC_PM0_IFM_RLP		(BIT(5) | BIT(11))
+#define ENETC_PM0_IFM_RGAUTO		(BIT(15) | ENETC_PMO_IFM_RG | BIT(1))
+#define ENETC_PM0_IFM_XGMII		BIT(12)
 
 #define ENETC_PV0CFGR(n)		(0x00920 + (n) * 0x10)
 #define ENETC_PVCFGR_SET_TXBDR(val)	((val) & 0xff)
@@ -109,6 +115,11 @@
 #define ENETC_G_EIPBRR0			0x00bf8
 #define ENETC_G_EIPBRR1			0x00bfc
 
+
+/* MAC Counters */
+#define ENETC_G_EPFBLPR(n)		(0xd00 + 4 * (n))
+#define ENETC_G_EPFBLPR1_XGMII		0x80000000
+
 /* general register accessors */
 #define enetc_rd_reg(reg)	rte_read32((void *)(reg))
 #define enetc_wr_reg(reg, val)	rte_write32((val), (void *)(reg))
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index f1807b9..91e9692 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -139,6 +139,17 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
 			val | ENETC_PMR_EN);
 
+	/* set auto-speed for RGMII */
+	if (enetc_port_rd(&hw->hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
+		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+	}
+	if (enetc_global_rd(&hw->hw,
+			    ENETC_G_EPFBLPR(1)) == ENETC_G_EPFBLPR1_XGMII) {
+		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_XGMII);
+	}
+
 	return 0;
 }
 
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 05/13] net/enetc: add basic statistics
  2019-04-12 11:01   ` [dpdk-dev] [PATCH v3 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                       ` (4 preceding siblings ...)
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 04/13] net/enetc: set interface mode for SXGMII Gagandeep Singh
@ 2019-04-12 11:01     ` Gagandeep Singh
  2019-04-12 11:01       ` Gagandeep Singh
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 06/13] net/enetc: replace register read/write macros with functions Gagandeep Singh
                       ` (8 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Enable basic statistics APIs enetc_stats_get
and enetc_stats_reset.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  1 +
 drivers/net/enetc/base/enetc_hw.h  | 27 ++++++++++++++++++++++++-
 drivers/net/enetc/enetc_ethdev.c   | 41 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 69 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 8038bf2..9f575d2 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -46,6 +46,7 @@ ENETC Features
 
 - Link Status
 - Packet type information
+- Basic stats
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 69476a2..d8bd567 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -6,6 +6,7 @@
 [Features]
 Packet type parsing  = Y
 Link status          = Y
+Basic stats          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index e3738a6..3f0a2a9 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -115,8 +115,33 @@
 #define ENETC_G_EIPBRR0			0x00bf8
 #define ENETC_G_EIPBRR1			0x00bfc
 
-
 /* MAC Counters */
+/* Config register to reset counters*/
+#define ENETC_PM0_STAT_CONFIG		0x080E0
+/* Receive frames counter without error */
+#define ENETC_PM0_RFRM			0x08120
+/* Receive packets counter, good + bad */
+#define ENETC_PM0_RPKT			0x08160
+/* Received octets, good + bad */
+#define ENETC_PM0_REOCT			0x08120
+/* Transmit octets, good + bad */
+#define ENETC_PM0_TEOCT			0x08200
+/* Transmit frames counter without error */
+#define ENETC_PM0_TFRM			0x08220
+/* Transmit packets counter, good + bad */
+#define ENETC_PM0_TPKT			0x08260
+/* Dropped not Truncated packets counter */
+#define ENETC_PM0_RDRNTP		0x081C8
+/* Dropped + trucated packets counter */
+#define ENETC_PM0_RDRP			0x08158
+/* Receive packets error counter */
+#define ENETC_PM0_RERR			0x08138
+/* Transmit packets error counter */
+#define ENETC_PM0_TERR			0x08238
+
+/* Stats Reset Bit*/
+#define ENETC_CLEAR_STATS		BIT(2)
+
 #define ENETC_G_EPFBLPR(n)		(0xd00 + 4 * (n))
 #define ENETC_G_EPFBLPR1_XGMII		0x80000000
 
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 91e9692..10b2b39 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -29,6 +29,9 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		const struct rte_eth_txconf *tx_conf);
 static void enetc_tx_queue_release(void *txq);
 static const uint32_t *enetc_supported_ptypes_get(struct rte_eth_dev *dev);
+static int enetc_stats_get(struct rte_eth_dev *dev,
+		struct rte_eth_stats *stats);
+static void enetc_stats_reset(struct rte_eth_dev *dev);
 
 /*
  * The set of PCI devices this driver supports
@@ -46,6 +49,8 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	.dev_stop             = enetc_dev_stop,
 	.dev_close            = enetc_dev_close,
 	.link_update          = enetc_link_update,
+	.stats_get            = enetc_stats_get,
+	.stats_reset          = enetc_stats_reset,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
@@ -608,6 +613,42 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	rte_free(rx_ring);
 }
 
+static
+int enetc_stats_get(struct rte_eth_dev *dev,
+		    struct rte_eth_stats *stats)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	/* Total received packets, bad + good, if we want to get counters of
+	 * only good received packets then use ENETC_PM0_RFRM,
+	 * ENETC_PM0_TFRM registers.
+	 */
+	stats->ipackets = enetc_port_rd(enetc_hw, ENETC_PM0_RPKT);
+	stats->opackets = enetc_port_rd(enetc_hw, ENETC_PM0_TPKT);
+	stats->ibytes =  enetc_port_rd(enetc_hw, ENETC_PM0_REOCT);
+	stats->obytes = enetc_port_rd(enetc_hw, ENETC_PM0_TEOCT);
+	/* Dropped + Truncated packets, use ENETC_PM0_RDRNTP for without
+	 * truncated packets
+	 */
+	stats->imissed = enetc_port_rd(enetc_hw, ENETC_PM0_RDRP);
+	stats->ierrors = enetc_port_rd(enetc_hw, ENETC_PM0_RERR);
+	stats->oerrors = enetc_port_rd(enetc_hw, ENETC_PM0_TERR);
+
+	return 0;
+}
+
+static void
+enetc_stats_reset(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	enetc_port_wr(enetc_hw, ENETC_PM0_STAT_CONFIG, ENETC_CLEAR_STATS);
+}
+
 static int
 enetc_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 			   struct rte_pci_device *pci_dev)
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 05/13] net/enetc: add basic statistics
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 05/13] net/enetc: add basic statistics Gagandeep Singh
@ 2019-04-12 11:01       ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Enable basic statistics APIs enetc_stats_get
and enetc_stats_reset.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  1 +
 drivers/net/enetc/base/enetc_hw.h  | 27 ++++++++++++++++++++++++-
 drivers/net/enetc/enetc_ethdev.c   | 41 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 69 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 8038bf2..9f575d2 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -46,6 +46,7 @@ ENETC Features
 
 - Link Status
 - Packet type information
+- Basic stats
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 69476a2..d8bd567 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -6,6 +6,7 @@
 [Features]
 Packet type parsing  = Y
 Link status          = Y
+Basic stats          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index e3738a6..3f0a2a9 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -115,8 +115,33 @@
 #define ENETC_G_EIPBRR0			0x00bf8
 #define ENETC_G_EIPBRR1			0x00bfc
 
-
 /* MAC Counters */
+/* Config register to reset counters*/
+#define ENETC_PM0_STAT_CONFIG		0x080E0
+/* Receive frames counter without error */
+#define ENETC_PM0_RFRM			0x08120
+/* Receive packets counter, good + bad */
+#define ENETC_PM0_RPKT			0x08160
+/* Received octets, good + bad */
+#define ENETC_PM0_REOCT			0x08120
+/* Transmit octets, good + bad */
+#define ENETC_PM0_TEOCT			0x08200
+/* Transmit frames counter without error */
+#define ENETC_PM0_TFRM			0x08220
+/* Transmit packets counter, good + bad */
+#define ENETC_PM0_TPKT			0x08260
+/* Dropped not Truncated packets counter */
+#define ENETC_PM0_RDRNTP		0x081C8
+/* Dropped + trucated packets counter */
+#define ENETC_PM0_RDRP			0x08158
+/* Receive packets error counter */
+#define ENETC_PM0_RERR			0x08138
+/* Transmit packets error counter */
+#define ENETC_PM0_TERR			0x08238
+
+/* Stats Reset Bit*/
+#define ENETC_CLEAR_STATS		BIT(2)
+
 #define ENETC_G_EPFBLPR(n)		(0xd00 + 4 * (n))
 #define ENETC_G_EPFBLPR1_XGMII		0x80000000
 
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 91e9692..10b2b39 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -29,6 +29,9 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		const struct rte_eth_txconf *tx_conf);
 static void enetc_tx_queue_release(void *txq);
 static const uint32_t *enetc_supported_ptypes_get(struct rte_eth_dev *dev);
+static int enetc_stats_get(struct rte_eth_dev *dev,
+		struct rte_eth_stats *stats);
+static void enetc_stats_reset(struct rte_eth_dev *dev);
 
 /*
  * The set of PCI devices this driver supports
@@ -46,6 +49,8 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	.dev_stop             = enetc_dev_stop,
 	.dev_close            = enetc_dev_close,
 	.link_update          = enetc_link_update,
+	.stats_get            = enetc_stats_get,
+	.stats_reset          = enetc_stats_reset,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
@@ -608,6 +613,42 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	rte_free(rx_ring);
 }
 
+static
+int enetc_stats_get(struct rte_eth_dev *dev,
+		    struct rte_eth_stats *stats)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	/* Total received packets, bad + good, if we want to get counters of
+	 * only good received packets then use ENETC_PM0_RFRM,
+	 * ENETC_PM0_TFRM registers.
+	 */
+	stats->ipackets = enetc_port_rd(enetc_hw, ENETC_PM0_RPKT);
+	stats->opackets = enetc_port_rd(enetc_hw, ENETC_PM0_TPKT);
+	stats->ibytes =  enetc_port_rd(enetc_hw, ENETC_PM0_REOCT);
+	stats->obytes = enetc_port_rd(enetc_hw, ENETC_PM0_TEOCT);
+	/* Dropped + Truncated packets, use ENETC_PM0_RDRNTP for without
+	 * truncated packets
+	 */
+	stats->imissed = enetc_port_rd(enetc_hw, ENETC_PM0_RDRP);
+	stats->ierrors = enetc_port_rd(enetc_hw, ENETC_PM0_RERR);
+	stats->oerrors = enetc_port_rd(enetc_hw, ENETC_PM0_TERR);
+
+	return 0;
+}
+
+static void
+enetc_stats_reset(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	enetc_port_wr(enetc_hw, ENETC_PM0_STAT_CONFIG, ENETC_CLEAR_STATS);
+}
+
 static int
 enetc_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 			   struct rte_pci_device *pci_dev)
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 06/13] net/enetc: replace register read/write macros with functions
  2019-04-12 11:01   ` [dpdk-dev] [PATCH v3 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                       ` (5 preceding siblings ...)
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 05/13] net/enetc: add basic statistics Gagandeep Singh
@ 2019-04-12 11:01     ` Gagandeep Singh
  2019-04-12 11:01       ` Gagandeep Singh
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 07/13] net/enetc: remove forward declarations Gagandeep Singh
                       ` (7 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Replacing read-write macros with already available
read-write functions.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc.h        |  7 +----
 drivers/net/enetc/enetc_ethdev.c | 61 ++++++++++++++++++++--------------------
 2 files changed, 31 insertions(+), 37 deletions(-)

diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index 0e80d1c..56454dc 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #ifndef _ENETC_H_
@@ -86,11 +86,6 @@ struct enetc_eth_adapter {
 #define ENETC_DEV_PRIVATE_TO_INTR(adapter) \
 	(&((struct enetc_eth_adapter *)adapter)->intr)
 
-#define ENETC_GET_HW_ADDR(reg, addr) ((void *)(((size_t)reg) + (addr)))
-#define ENETC_REG_READ(addr) (*(uint32_t *)addr)
-#define ENETC_REG_WRITE(addr, val) (*(uint32_t *)addr = val)
-#define ENETC_REG_WRITE_RELAXED(addr, val) (*(uint32_t *)addr = val)
-
 /*
  * RX/TX ENETC function prototypes
  */
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 10b2b39..2d8c4e6 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -131,28 +131,31 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	uint32_t val;
 
 	PMD_INIT_FUNC_TRACE();
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-			     ENETC_PM0_CMD_CFG));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PM0_CMD_CFG),
-			val | ENETC_PM0_TX_EN | ENETC_PM0_RX_EN);
+	val = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+	enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG,
+		      val | ENETC_PM0_TX_EN | ENETC_PM0_RX_EN);
 
 	/* Enable port */
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
-			val | ENETC_PMR_EN);
+	val = enetc_port_rd(enetc_hw, ENETC_PMR);
+	enetc_port_wr(enetc_hw, ENETC_PMR, val | ENETC_PMR_EN);
 
 	/* set auto-speed for RGMII */
-	if (enetc_port_rd(&hw->hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
-		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_RGAUTO);
-		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+	if (enetc_port_rd(enetc_hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
+		enetc_port_wr(enetc_hw, ENETC_PM0_IF_MODE,
+			      ENETC_PM0_IFM_RGAUTO);
+		enetc_port_wr(enetc_hw, ENETC_PM1_IF_MODE,
+			      ENETC_PM0_IFM_RGAUTO);
 	}
-	if (enetc_global_rd(&hw->hw,
+	if (enetc_global_rd(enetc_hw,
 			    ENETC_G_EPFBLPR(1)) == ENETC_G_EPFBLPR1_XGMII) {
-		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_XGMII);
-		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(enetc_hw, ENETC_PM0_IF_MODE,
+			      ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(enetc_hw, ENETC_PM1_IF_MODE,
+			      ENETC_PM0_IFM_XGMII);
 	}
 
 	return 0;
@@ -163,18 +166,17 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	uint32_t val;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Disable port */
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
-			val & (~ENETC_PMR_EN));
-
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-			     ENETC_PM0_CMD_CFG));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PM0_CMD_CFG),
-			val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
+	val = enetc_port_rd(enetc_hw, ENETC_PMR);
+	enetc_port_wr(enetc_hw, ENETC_PMR, val & (~ENETC_PMR_EN));
+
+	val = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+	enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG,
+		      val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
 }
 
 static void
@@ -221,6 +223,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	struct rte_eth_link link;
 	uint32_t status;
 
@@ -228,8 +231,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 
 	memset(&link, 0, sizeof(link));
 
-	status = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-				ENETC_PM0_STATUS));
+	status = enetc_port_rd(enetc_hw, ENETC_PM0_STATUS);
 
 	if (status & ENETC_LINK_MODE)
 		link.link_duplex = ETH_LINK_FULL_DUPLEX;
@@ -262,6 +264,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 enetc_hardware_init(struct enetc_eth_hw *hw)
 {
 	uint32_t psipmr = 0;
+	struct enetc_hw *enetc_hw = &hw->hw;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Calculating and storing the base HW addresses */
@@ -269,8 +272,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 	hw->hw.global = (void *)((size_t)hw->hw.reg + ENETC_GLOBAL_BASE);
 
 	/* Enabling Station Interface */
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.reg, ENETC_SIMR),
-					  ENETC_SIMR_EN);
+	enetc_wr(enetc_hw, ENETC_SIMR, ENETC_SIMR_EN);
 
 	/* Setting to accept broadcast packets for each inetrface */
 	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0) |
@@ -280,14 +282,11 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 	psipmr |= ENETC_PSIPMR_SET_UP(2) | ENETC_PSIPMR_SET_MP(2) |
 		  ENETC_PSIPMR_SET_VLAN_MP(2);
 
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMR),
-			psipmr);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
 
 	/* Enabling broadcast address */
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMAR0(0)),
-			0xFFFFFFFF);
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMAR1(0)),
-			0xFFFF << 16);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMAR0(0), 0xFFFFFFFF);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMAR1(0), 0xFFFF << 16);
 
 	return 0;
 }
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 06/13] net/enetc: replace register read/write macros with functions
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 06/13] net/enetc: replace register read/write macros with functions Gagandeep Singh
@ 2019-04-12 11:01       ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Replacing read-write macros with already available
read-write functions.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc.h        |  7 +----
 drivers/net/enetc/enetc_ethdev.c | 61 ++++++++++++++++++++--------------------
 2 files changed, 31 insertions(+), 37 deletions(-)

diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index 0e80d1c..56454dc 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #ifndef _ENETC_H_
@@ -86,11 +86,6 @@ struct enetc_eth_adapter {
 #define ENETC_DEV_PRIVATE_TO_INTR(adapter) \
 	(&((struct enetc_eth_adapter *)adapter)->intr)
 
-#define ENETC_GET_HW_ADDR(reg, addr) ((void *)(((size_t)reg) + (addr)))
-#define ENETC_REG_READ(addr) (*(uint32_t *)addr)
-#define ENETC_REG_WRITE(addr, val) (*(uint32_t *)addr = val)
-#define ENETC_REG_WRITE_RELAXED(addr, val) (*(uint32_t *)addr = val)
-
 /*
  * RX/TX ENETC function prototypes
  */
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 10b2b39..2d8c4e6 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -131,28 +131,31 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	uint32_t val;
 
 	PMD_INIT_FUNC_TRACE();
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-			     ENETC_PM0_CMD_CFG));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PM0_CMD_CFG),
-			val | ENETC_PM0_TX_EN | ENETC_PM0_RX_EN);
+	val = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+	enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG,
+		      val | ENETC_PM0_TX_EN | ENETC_PM0_RX_EN);
 
 	/* Enable port */
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
-			val | ENETC_PMR_EN);
+	val = enetc_port_rd(enetc_hw, ENETC_PMR);
+	enetc_port_wr(enetc_hw, ENETC_PMR, val | ENETC_PMR_EN);
 
 	/* set auto-speed for RGMII */
-	if (enetc_port_rd(&hw->hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
-		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_RGAUTO);
-		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+	if (enetc_port_rd(enetc_hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
+		enetc_port_wr(enetc_hw, ENETC_PM0_IF_MODE,
+			      ENETC_PM0_IFM_RGAUTO);
+		enetc_port_wr(enetc_hw, ENETC_PM1_IF_MODE,
+			      ENETC_PM0_IFM_RGAUTO);
 	}
-	if (enetc_global_rd(&hw->hw,
+	if (enetc_global_rd(enetc_hw,
 			    ENETC_G_EPFBLPR(1)) == ENETC_G_EPFBLPR1_XGMII) {
-		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_XGMII);
-		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(enetc_hw, ENETC_PM0_IF_MODE,
+			      ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(enetc_hw, ENETC_PM1_IF_MODE,
+			      ENETC_PM0_IFM_XGMII);
 	}
 
 	return 0;
@@ -163,18 +166,17 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	uint32_t val;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Disable port */
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
-			val & (~ENETC_PMR_EN));
-
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-			     ENETC_PM0_CMD_CFG));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PM0_CMD_CFG),
-			val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
+	val = enetc_port_rd(enetc_hw, ENETC_PMR);
+	enetc_port_wr(enetc_hw, ENETC_PMR, val & (~ENETC_PMR_EN));
+
+	val = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+	enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG,
+		      val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
 }
 
 static void
@@ -221,6 +223,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	struct rte_eth_link link;
 	uint32_t status;
 
@@ -228,8 +231,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 
 	memset(&link, 0, sizeof(link));
 
-	status = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-				ENETC_PM0_STATUS));
+	status = enetc_port_rd(enetc_hw, ENETC_PM0_STATUS);
 
 	if (status & ENETC_LINK_MODE)
 		link.link_duplex = ETH_LINK_FULL_DUPLEX;
@@ -262,6 +264,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 enetc_hardware_init(struct enetc_eth_hw *hw)
 {
 	uint32_t psipmr = 0;
+	struct enetc_hw *enetc_hw = &hw->hw;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Calculating and storing the base HW addresses */
@@ -269,8 +272,7 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 	hw->hw.global = (void *)((size_t)hw->hw.reg + ENETC_GLOBAL_BASE);
 
 	/* Enabling Station Interface */
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.reg, ENETC_SIMR),
-					  ENETC_SIMR_EN);
+	enetc_wr(enetc_hw, ENETC_SIMR, ENETC_SIMR_EN);
 
 	/* Setting to accept broadcast packets for each inetrface */
 	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0) |
@@ -280,14 +282,11 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 	psipmr |= ENETC_PSIPMR_SET_UP(2) | ENETC_PSIPMR_SET_MP(2) |
 		  ENETC_PSIPMR_SET_VLAN_MP(2);
 
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMR),
-			psipmr);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
 
 	/* Enabling broadcast address */
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMAR0(0)),
-			0xFFFFFFFF);
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMAR1(0)),
-			0xFFFF << 16);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMAR0(0), 0xFFFFFFFF);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMAR1(0), 0xFFFF << 16);
 
 	return 0;
 }
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 07/13] net/enetc: remove forward declarations
  2019-04-12 11:01   ` [dpdk-dev] [PATCH v3 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                       ` (6 preceding siblings ...)
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 06/13] net/enetc: replace register read/write macros with functions Gagandeep Singh
@ 2019-04-12 11:01     ` Gagandeep Singh
  2019-04-12 11:01       ` Gagandeep Singh
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 08/13] net/enetc: enable promiscuous and allmulticast feature Gagandeep Singh
                       ` (6 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Remove unneeded forward declarations and re-order the code.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 237 ++++++++++++++++++---------------------
 1 file changed, 107 insertions(+), 130 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 2d8c4e6..d0f9e2b 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -10,115 +10,6 @@
 
 int enetc_logtype_pmd;
 
-/* Functions Prototypes */
-static int enetc_dev_configure(struct rte_eth_dev *dev);
-static int enetc_dev_start(struct rte_eth_dev *dev);
-static void enetc_dev_stop(struct rte_eth_dev *dev);
-static void enetc_dev_close(struct rte_eth_dev *dev);
-static void enetc_dev_infos_get(struct rte_eth_dev *dev,
-				struct rte_eth_dev_info *dev_info);
-static int enetc_link_update(struct rte_eth_dev *dev, int wait_to_complete);
-static int enetc_hardware_init(struct enetc_eth_hw *hw);
-static int enetc_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id,
-		uint16_t nb_rx_desc, unsigned int socket_id,
-		const struct rte_eth_rxconf *rx_conf,
-		struct rte_mempool *mb_pool);
-static void enetc_rx_queue_release(void *rxq);
-static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
-		uint16_t nb_tx_desc, unsigned int socket_id,
-		const struct rte_eth_txconf *tx_conf);
-static void enetc_tx_queue_release(void *txq);
-static const uint32_t *enetc_supported_ptypes_get(struct rte_eth_dev *dev);
-static int enetc_stats_get(struct rte_eth_dev *dev,
-		struct rte_eth_stats *stats);
-static void enetc_stats_reset(struct rte_eth_dev *dev);
-
-/*
- * The set of PCI devices this driver supports
- */
-static const struct rte_pci_id pci_id_enetc_map[] = {
-	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID) },
-	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID_VF) },
-	{ .vendor_id = 0, /* sentinel */ },
-};
-
-/* Features supported by this driver */
-static const struct eth_dev_ops enetc_ops = {
-	.dev_configure        = enetc_dev_configure,
-	.dev_start            = enetc_dev_start,
-	.dev_stop             = enetc_dev_stop,
-	.dev_close            = enetc_dev_close,
-	.link_update          = enetc_link_update,
-	.stats_get            = enetc_stats_get,
-	.stats_reset          = enetc_stats_reset,
-	.dev_infos_get        = enetc_dev_infos_get,
-	.rx_queue_setup       = enetc_rx_queue_setup,
-	.rx_queue_release     = enetc_rx_queue_release,
-	.tx_queue_setup       = enetc_tx_queue_setup,
-	.tx_queue_release     = enetc_tx_queue_release,
-	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
-};
-
-/**
- * Initialisation of the enetc device
- *
- * @param eth_dev
- *   - Pointer to the structure rte_eth_dev
- *
- * @return
- *   - On success, zero.
- *   - On failure, negative value.
- */
-static int
-enetc_dev_init(struct rte_eth_dev *eth_dev)
-{
-	int error = 0;
-	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
-	struct enetc_eth_hw *hw =
-		ENETC_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
-
-	PMD_INIT_FUNC_TRACE();
-	eth_dev->dev_ops = &enetc_ops;
-	eth_dev->rx_pkt_burst = &enetc_recv_pkts;
-	eth_dev->tx_pkt_burst = &enetc_xmit_pkts;
-
-	/* Retrieving and storing the HW base address of device */
-	hw->hw.reg = (void *)pci_dev->mem_resource[0].addr;
-	hw->device_id = pci_dev->id.device_id;
-
-	error = enetc_hardware_init(hw);
-	if (error != 0) {
-		ENETC_PMD_ERR("Hardware initialization failed");
-		return -1;
-	}
-
-	/* Allocate memory for storing MAC addresses */
-	eth_dev->data->mac_addrs = rte_zmalloc("enetc_eth", ETHER_ADDR_LEN, 0);
-	if (!eth_dev->data->mac_addrs) {
-		ENETC_PMD_ERR("Failed to allocate %d bytes needed to "
-			      "store MAC addresses",
-			      ETHER_ADDR_LEN * 1);
-		error = -ENOMEM;
-		return -1;
-	}
-
-	/* Copy the permanent MAC address */
-	ether_addr_copy((struct ether_addr *)hw->mac.addr,
-			&eth_dev->data->mac_addrs[0]);
-
-	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
-			eth_dev->data->port_id, pci_dev->id.vendor_id,
-			pci_dev->id.device_id);
-	return 0;
-}
-
-static int
-enetc_dev_uninit(struct rte_eth_dev *eth_dev __rte_unused)
-{
-	PMD_INIT_FUNC_TRACE();
-	return 0;
-}
-
 static int
 enetc_dev_configure(struct rte_eth_dev *dev __rte_unused)
 {
@@ -179,27 +70,6 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 		      val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
 }
 
-static void
-enetc_dev_close(struct rte_eth_dev *dev)
-{
-	uint16_t i;
-
-	PMD_INIT_FUNC_TRACE();
-	enetc_dev_stop(dev);
-
-	for (i = 0; i < dev->data->nb_rx_queues; i++) {
-		enetc_rx_queue_release(dev->data->rx_queues[i]);
-		dev->data->rx_queues[i] = NULL;
-	}
-	dev->data->nb_rx_queues = 0;
-
-	for (i = 0; i < dev->data->nb_tx_queues; i++) {
-		enetc_tx_queue_release(dev->data->tx_queues[i]);
-		dev->data->tx_queues[i] = NULL;
-	}
-	dev->data->nb_tx_queues = 0;
-}
-
 static const uint32_t *
 enetc_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)
 {
@@ -648,6 +518,113 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	enetc_port_wr(enetc_hw, ENETC_PM0_STAT_CONFIG, ENETC_CLEAR_STATS);
 }
 
+static void
+enetc_dev_close(struct rte_eth_dev *dev)
+{
+	uint16_t i;
+
+	PMD_INIT_FUNC_TRACE();
+	enetc_dev_stop(dev);
+
+	for (i = 0; i < dev->data->nb_rx_queues; i++) {
+		enetc_rx_queue_release(dev->data->rx_queues[i]);
+		dev->data->rx_queues[i] = NULL;
+	}
+	dev->data->nb_rx_queues = 0;
+
+	for (i = 0; i < dev->data->nb_tx_queues; i++) {
+		enetc_tx_queue_release(dev->data->tx_queues[i]);
+		dev->data->tx_queues[i] = NULL;
+	}
+	dev->data->nb_tx_queues = 0;
+}
+
+/*
+ * The set of PCI devices this driver supports
+ */
+static const struct rte_pci_id pci_id_enetc_map[] = {
+	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID) },
+	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID_VF) },
+	{ .vendor_id = 0, /* sentinel */ },
+};
+
+/* Features supported by this driver */
+static const struct eth_dev_ops enetc_ops = {
+	.dev_configure        = enetc_dev_configure,
+	.dev_start            = enetc_dev_start,
+	.dev_stop             = enetc_dev_stop,
+	.dev_close            = enetc_dev_close,
+	.link_update          = enetc_link_update,
+	.stats_get            = enetc_stats_get,
+	.stats_reset          = enetc_stats_reset,
+	.dev_infos_get        = enetc_dev_infos_get,
+	.rx_queue_setup       = enetc_rx_queue_setup,
+	.rx_queue_release     = enetc_rx_queue_release,
+	.tx_queue_setup       = enetc_tx_queue_setup,
+	.tx_queue_release     = enetc_tx_queue_release,
+	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
+};
+
+/**
+ * Initialisation of the enetc device
+ *
+ * @param eth_dev
+ *   - Pointer to the structure rte_eth_dev
+ *
+ * @return
+ *   - On success, zero.
+ *   - On failure, negative value.
+ */
+static int
+enetc_dev_init(struct rte_eth_dev *eth_dev)
+{
+	int error = 0;
+	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
+
+	PMD_INIT_FUNC_TRACE();
+	eth_dev->dev_ops = &enetc_ops;
+	eth_dev->rx_pkt_burst = &enetc_recv_pkts;
+	eth_dev->tx_pkt_burst = &enetc_xmit_pkts;
+
+	/* Retrieving and storing the HW base address of device */
+	hw->hw.reg = (void *)pci_dev->mem_resource[0].addr;
+	hw->device_id = pci_dev->id.device_id;
+
+	error = enetc_hardware_init(hw);
+	if (error != 0) {
+		ENETC_PMD_ERR("Hardware initialization failed");
+		return -1;
+	}
+
+	/* Allocate memory for storing MAC addresses */
+	eth_dev->data->mac_addrs = rte_zmalloc("enetc_eth", ETHER_ADDR_LEN, 0);
+	if (!eth_dev->data->mac_addrs) {
+		ENETC_PMD_ERR("Failed to allocate %d bytes needed to "
+			      "store MAC addresses",
+			      ETHER_ADDR_LEN * 1);
+		error = -ENOMEM;
+		return -1;
+	}
+
+	/* Copy the permanent MAC address */
+	ether_addr_copy((struct ether_addr *)hw->mac.addr,
+			&eth_dev->data->mac_addrs[0]);
+
+	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
+			eth_dev->data->port_id, pci_dev->id.vendor_id,
+			pci_dev->id.device_id);
+	return 0;
+}
+
+static int
+enetc_dev_uninit(struct rte_eth_dev *eth_dev __rte_unused)
+{
+	PMD_INIT_FUNC_TRACE();
+	return 0;
+}
+
 static int
 enetc_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 			   struct rte_pci_device *pci_dev)
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 07/13] net/enetc: remove forward declarations
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 07/13] net/enetc: remove forward declarations Gagandeep Singh
@ 2019-04-12 11:01       ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Remove unneeded forward declarations and re-order the code.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 237 ++++++++++++++++++---------------------
 1 file changed, 107 insertions(+), 130 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 2d8c4e6..d0f9e2b 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -10,115 +10,6 @@
 
 int enetc_logtype_pmd;
 
-/* Functions Prototypes */
-static int enetc_dev_configure(struct rte_eth_dev *dev);
-static int enetc_dev_start(struct rte_eth_dev *dev);
-static void enetc_dev_stop(struct rte_eth_dev *dev);
-static void enetc_dev_close(struct rte_eth_dev *dev);
-static void enetc_dev_infos_get(struct rte_eth_dev *dev,
-				struct rte_eth_dev_info *dev_info);
-static int enetc_link_update(struct rte_eth_dev *dev, int wait_to_complete);
-static int enetc_hardware_init(struct enetc_eth_hw *hw);
-static int enetc_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id,
-		uint16_t nb_rx_desc, unsigned int socket_id,
-		const struct rte_eth_rxconf *rx_conf,
-		struct rte_mempool *mb_pool);
-static void enetc_rx_queue_release(void *rxq);
-static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
-		uint16_t nb_tx_desc, unsigned int socket_id,
-		const struct rte_eth_txconf *tx_conf);
-static void enetc_tx_queue_release(void *txq);
-static const uint32_t *enetc_supported_ptypes_get(struct rte_eth_dev *dev);
-static int enetc_stats_get(struct rte_eth_dev *dev,
-		struct rte_eth_stats *stats);
-static void enetc_stats_reset(struct rte_eth_dev *dev);
-
-/*
- * The set of PCI devices this driver supports
- */
-static const struct rte_pci_id pci_id_enetc_map[] = {
-	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID) },
-	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID_VF) },
-	{ .vendor_id = 0, /* sentinel */ },
-};
-
-/* Features supported by this driver */
-static const struct eth_dev_ops enetc_ops = {
-	.dev_configure        = enetc_dev_configure,
-	.dev_start            = enetc_dev_start,
-	.dev_stop             = enetc_dev_stop,
-	.dev_close            = enetc_dev_close,
-	.link_update          = enetc_link_update,
-	.stats_get            = enetc_stats_get,
-	.stats_reset          = enetc_stats_reset,
-	.dev_infos_get        = enetc_dev_infos_get,
-	.rx_queue_setup       = enetc_rx_queue_setup,
-	.rx_queue_release     = enetc_rx_queue_release,
-	.tx_queue_setup       = enetc_tx_queue_setup,
-	.tx_queue_release     = enetc_tx_queue_release,
-	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
-};
-
-/**
- * Initialisation of the enetc device
- *
- * @param eth_dev
- *   - Pointer to the structure rte_eth_dev
- *
- * @return
- *   - On success, zero.
- *   - On failure, negative value.
- */
-static int
-enetc_dev_init(struct rte_eth_dev *eth_dev)
-{
-	int error = 0;
-	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
-	struct enetc_eth_hw *hw =
-		ENETC_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
-
-	PMD_INIT_FUNC_TRACE();
-	eth_dev->dev_ops = &enetc_ops;
-	eth_dev->rx_pkt_burst = &enetc_recv_pkts;
-	eth_dev->tx_pkt_burst = &enetc_xmit_pkts;
-
-	/* Retrieving and storing the HW base address of device */
-	hw->hw.reg = (void *)pci_dev->mem_resource[0].addr;
-	hw->device_id = pci_dev->id.device_id;
-
-	error = enetc_hardware_init(hw);
-	if (error != 0) {
-		ENETC_PMD_ERR("Hardware initialization failed");
-		return -1;
-	}
-
-	/* Allocate memory for storing MAC addresses */
-	eth_dev->data->mac_addrs = rte_zmalloc("enetc_eth", ETHER_ADDR_LEN, 0);
-	if (!eth_dev->data->mac_addrs) {
-		ENETC_PMD_ERR("Failed to allocate %d bytes needed to "
-			      "store MAC addresses",
-			      ETHER_ADDR_LEN * 1);
-		error = -ENOMEM;
-		return -1;
-	}
-
-	/* Copy the permanent MAC address */
-	ether_addr_copy((struct ether_addr *)hw->mac.addr,
-			&eth_dev->data->mac_addrs[0]);
-
-	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
-			eth_dev->data->port_id, pci_dev->id.vendor_id,
-			pci_dev->id.device_id);
-	return 0;
-}
-
-static int
-enetc_dev_uninit(struct rte_eth_dev *eth_dev __rte_unused)
-{
-	PMD_INIT_FUNC_TRACE();
-	return 0;
-}
-
 static int
 enetc_dev_configure(struct rte_eth_dev *dev __rte_unused)
 {
@@ -179,27 +70,6 @@ static int enetc_stats_get(struct rte_eth_dev *dev,
 		      val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
 }
 
-static void
-enetc_dev_close(struct rte_eth_dev *dev)
-{
-	uint16_t i;
-
-	PMD_INIT_FUNC_TRACE();
-	enetc_dev_stop(dev);
-
-	for (i = 0; i < dev->data->nb_rx_queues; i++) {
-		enetc_rx_queue_release(dev->data->rx_queues[i]);
-		dev->data->rx_queues[i] = NULL;
-	}
-	dev->data->nb_rx_queues = 0;
-
-	for (i = 0; i < dev->data->nb_tx_queues; i++) {
-		enetc_tx_queue_release(dev->data->tx_queues[i]);
-		dev->data->tx_queues[i] = NULL;
-	}
-	dev->data->nb_tx_queues = 0;
-}
-
 static const uint32_t *
 enetc_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)
 {
@@ -648,6 +518,113 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	enetc_port_wr(enetc_hw, ENETC_PM0_STAT_CONFIG, ENETC_CLEAR_STATS);
 }
 
+static void
+enetc_dev_close(struct rte_eth_dev *dev)
+{
+	uint16_t i;
+
+	PMD_INIT_FUNC_TRACE();
+	enetc_dev_stop(dev);
+
+	for (i = 0; i < dev->data->nb_rx_queues; i++) {
+		enetc_rx_queue_release(dev->data->rx_queues[i]);
+		dev->data->rx_queues[i] = NULL;
+	}
+	dev->data->nb_rx_queues = 0;
+
+	for (i = 0; i < dev->data->nb_tx_queues; i++) {
+		enetc_tx_queue_release(dev->data->tx_queues[i]);
+		dev->data->tx_queues[i] = NULL;
+	}
+	dev->data->nb_tx_queues = 0;
+}
+
+/*
+ * The set of PCI devices this driver supports
+ */
+static const struct rte_pci_id pci_id_enetc_map[] = {
+	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID) },
+	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID_VF) },
+	{ .vendor_id = 0, /* sentinel */ },
+};
+
+/* Features supported by this driver */
+static const struct eth_dev_ops enetc_ops = {
+	.dev_configure        = enetc_dev_configure,
+	.dev_start            = enetc_dev_start,
+	.dev_stop             = enetc_dev_stop,
+	.dev_close            = enetc_dev_close,
+	.link_update          = enetc_link_update,
+	.stats_get            = enetc_stats_get,
+	.stats_reset          = enetc_stats_reset,
+	.dev_infos_get        = enetc_dev_infos_get,
+	.rx_queue_setup       = enetc_rx_queue_setup,
+	.rx_queue_release     = enetc_rx_queue_release,
+	.tx_queue_setup       = enetc_tx_queue_setup,
+	.tx_queue_release     = enetc_tx_queue_release,
+	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
+};
+
+/**
+ * Initialisation of the enetc device
+ *
+ * @param eth_dev
+ *   - Pointer to the structure rte_eth_dev
+ *
+ * @return
+ *   - On success, zero.
+ *   - On failure, negative value.
+ */
+static int
+enetc_dev_init(struct rte_eth_dev *eth_dev)
+{
+	int error = 0;
+	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
+
+	PMD_INIT_FUNC_TRACE();
+	eth_dev->dev_ops = &enetc_ops;
+	eth_dev->rx_pkt_burst = &enetc_recv_pkts;
+	eth_dev->tx_pkt_burst = &enetc_xmit_pkts;
+
+	/* Retrieving and storing the HW base address of device */
+	hw->hw.reg = (void *)pci_dev->mem_resource[0].addr;
+	hw->device_id = pci_dev->id.device_id;
+
+	error = enetc_hardware_init(hw);
+	if (error != 0) {
+		ENETC_PMD_ERR("Hardware initialization failed");
+		return -1;
+	}
+
+	/* Allocate memory for storing MAC addresses */
+	eth_dev->data->mac_addrs = rte_zmalloc("enetc_eth", ETHER_ADDR_LEN, 0);
+	if (!eth_dev->data->mac_addrs) {
+		ENETC_PMD_ERR("Failed to allocate %d bytes needed to "
+			      "store MAC addresses",
+			      ETHER_ADDR_LEN * 1);
+		error = -ENOMEM;
+		return -1;
+	}
+
+	/* Copy the permanent MAC address */
+	ether_addr_copy((struct ether_addr *)hw->mac.addr,
+			&eth_dev->data->mac_addrs[0]);
+
+	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
+			eth_dev->data->port_id, pci_dev->id.vendor_id,
+			pci_dev->id.device_id);
+	return 0;
+}
+
+static int
+enetc_dev_uninit(struct rte_eth_dev *eth_dev __rte_unused)
+{
+	PMD_INIT_FUNC_TRACE();
+	return 0;
+}
+
 static int
 enetc_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 			   struct rte_pci_device *pci_dev)
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 08/13] net/enetc: enable promiscuous and allmulticast feature
  2019-04-12 11:01   ` [dpdk-dev] [PATCH v3 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                       ` (7 preceding siblings ...)
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 07/13] net/enetc: remove forward declarations Gagandeep Singh
@ 2019-04-12 11:01     ` Gagandeep Singh
  2019-04-12 11:01       ` Gagandeep Singh
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 09/13] net/enetc: add MTU update and jumbo frames support Gagandeep Singh
                       ` (5 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Promiscuous and allmulticast enable/disable APIs added.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  2 +
 doc/guides/nics/features/enetc.ini |  2 +
 drivers/net/enetc/base/enetc_hw.h  |  3 +-
 drivers/net/enetc/enetc_ethdev.c   | 90 ++++++++++++++++++++++++++++++++------
 4 files changed, 81 insertions(+), 16 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 9f575d2..ab13211 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -47,6 +47,8 @@ ENETC Features
 - Link Status
 - Packet type information
 - Basic stats
+- Promiscuous
+- Multicast
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index d8bd567..6b7bbfb 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -7,6 +7,8 @@
 Packet type parsing  = Y
 Link status          = Y
 Basic stats          = Y
+Promiscuous mode     = Y
+Allmulticast mode    = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 3f0a2a9..90a383a 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -78,8 +78,7 @@
 #define ENETC_PSR			0x00004 /* RO */
 #define ENETC_PSIPMR			0x00018
 #define ENETC_PSIPMR_SET_UP(n)		(0x1 << (n)) /* n = SI index */
-#define ENETC_PSIPMR_SET_MP(n)		(0x1 << ((n) + 8))
-#define ENETC_PSIPMR_SET_VLAN_MP(n)	(0x1 << ((n) + 16))
+#define ENETC_PSIPMR_SET_MP(n)		(0x1 << ((n) + 16))
 #define ENETC_PSIPMAR0(n)		(0x00100 + (n) * 0x20)
 #define ENETC_PSIPMAR1(n)		(0x00104 + (n) * 0x20)
 #define ENETC_PCAPR0			0x00900
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index d0f9e2b..a7dddc5 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -133,8 +133,8 @@
 static int
 enetc_hardware_init(struct enetc_eth_hw *hw)
 {
-	uint32_t psipmr = 0;
 	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t *mac = (uint32_t *)hw->mac.addr;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Calculating and storing the base HW addresses */
@@ -144,19 +144,9 @@
 	/* Enabling Station Interface */
 	enetc_wr(enetc_hw, ENETC_SIMR, ENETC_SIMR_EN);
 
-	/* Setting to accept broadcast packets for each inetrface */
-	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0) |
-		  ENETC_PSIPMR_SET_VLAN_MP(0);
-	psipmr |= ENETC_PSIPMR_SET_UP(1) | ENETC_PSIPMR_SET_MP(1) |
-		  ENETC_PSIPMR_SET_VLAN_MP(1);
-	psipmr |= ENETC_PSIPMR_SET_UP(2) | ENETC_PSIPMR_SET_MP(2) |
-		  ENETC_PSIPMR_SET_VLAN_MP(2);
-
-	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
-
-	/* Enabling broadcast address */
-	enetc_port_wr(enetc_hw, ENETC_PSIPMAR0(0), 0xFFFFFFFF);
-	enetc_port_wr(enetc_hw, ENETC_PSIPMAR1(0), 0xFFFF << 16);
+	*mac = (uint32_t)enetc_port_rd(enetc_hw, ENETC_PSIPMAR0(0));
+	mac++;
+	*mac = (uint16_t)enetc_port_rd(enetc_hw, ENETC_PSIPMAR1(0));
 
 	return 0;
 }
@@ -539,6 +529,74 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	dev->data->nb_tx_queues = 0;
 }
 
+static void
+enetc_promiscuous_enable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+
+	/* Setting to enable promiscuous mode*/
+	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0);
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_promiscuous_disable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	/* Setting to disable promiscuous mode for SI0*/
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+	psipmr &= (~ENETC_PSIPMR_SET_UP(0));
+
+	if (dev->data->all_multicast == 0)
+		psipmr &= (~ENETC_PSIPMR_SET_MP(0));
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_allmulticast_enable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+
+	/* Setting to enable allmulticast mode for SI0*/
+	psipmr |= ENETC_PSIPMR_SET_MP(0);
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_allmulticast_disable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	if (dev->data->promiscuous == 1)
+		return; /* must remain in all_multicast mode */
+
+	/* Setting to disable all multicast mode for SI0*/
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR) &
+			       ~(ENETC_PSIPMR_SET_MP(0));
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -557,6 +615,10 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	.link_update          = enetc_link_update,
 	.stats_get            = enetc_stats_get,
 	.stats_reset          = enetc_stats_reset,
+	.promiscuous_enable   = enetc_promiscuous_enable,
+	.promiscuous_disable  = enetc_promiscuous_disable,
+	.allmulticast_enable  = enetc_allmulticast_enable,
+	.allmulticast_disable = enetc_allmulticast_disable,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 08/13] net/enetc: enable promiscuous and allmulticast feature
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 08/13] net/enetc: enable promiscuous and allmulticast feature Gagandeep Singh
@ 2019-04-12 11:01       ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Promiscuous and allmulticast enable/disable APIs added.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  2 +
 doc/guides/nics/features/enetc.ini |  2 +
 drivers/net/enetc/base/enetc_hw.h  |  3 +-
 drivers/net/enetc/enetc_ethdev.c   | 90 ++++++++++++++++++++++++++++++++------
 4 files changed, 81 insertions(+), 16 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 9f575d2..ab13211 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -47,6 +47,8 @@ ENETC Features
 - Link Status
 - Packet type information
 - Basic stats
+- Promiscuous
+- Multicast
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index d8bd567..6b7bbfb 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -7,6 +7,8 @@
 Packet type parsing  = Y
 Link status          = Y
 Basic stats          = Y
+Promiscuous mode     = Y
+Allmulticast mode    = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 3f0a2a9..90a383a 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -78,8 +78,7 @@
 #define ENETC_PSR			0x00004 /* RO */
 #define ENETC_PSIPMR			0x00018
 #define ENETC_PSIPMR_SET_UP(n)		(0x1 << (n)) /* n = SI index */
-#define ENETC_PSIPMR_SET_MP(n)		(0x1 << ((n) + 8))
-#define ENETC_PSIPMR_SET_VLAN_MP(n)	(0x1 << ((n) + 16))
+#define ENETC_PSIPMR_SET_MP(n)		(0x1 << ((n) + 16))
 #define ENETC_PSIPMAR0(n)		(0x00100 + (n) * 0x20)
 #define ENETC_PSIPMAR1(n)		(0x00104 + (n) * 0x20)
 #define ENETC_PCAPR0			0x00900
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index d0f9e2b..a7dddc5 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -133,8 +133,8 @@
 static int
 enetc_hardware_init(struct enetc_eth_hw *hw)
 {
-	uint32_t psipmr = 0;
 	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t *mac = (uint32_t *)hw->mac.addr;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Calculating and storing the base HW addresses */
@@ -144,19 +144,9 @@
 	/* Enabling Station Interface */
 	enetc_wr(enetc_hw, ENETC_SIMR, ENETC_SIMR_EN);
 
-	/* Setting to accept broadcast packets for each inetrface */
-	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0) |
-		  ENETC_PSIPMR_SET_VLAN_MP(0);
-	psipmr |= ENETC_PSIPMR_SET_UP(1) | ENETC_PSIPMR_SET_MP(1) |
-		  ENETC_PSIPMR_SET_VLAN_MP(1);
-	psipmr |= ENETC_PSIPMR_SET_UP(2) | ENETC_PSIPMR_SET_MP(2) |
-		  ENETC_PSIPMR_SET_VLAN_MP(2);
-
-	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
-
-	/* Enabling broadcast address */
-	enetc_port_wr(enetc_hw, ENETC_PSIPMAR0(0), 0xFFFFFFFF);
-	enetc_port_wr(enetc_hw, ENETC_PSIPMAR1(0), 0xFFFF << 16);
+	*mac = (uint32_t)enetc_port_rd(enetc_hw, ENETC_PSIPMAR0(0));
+	mac++;
+	*mac = (uint16_t)enetc_port_rd(enetc_hw, ENETC_PSIPMAR1(0));
 
 	return 0;
 }
@@ -539,6 +529,74 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	dev->data->nb_tx_queues = 0;
 }
 
+static void
+enetc_promiscuous_enable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+
+	/* Setting to enable promiscuous mode*/
+	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0);
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_promiscuous_disable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	/* Setting to disable promiscuous mode for SI0*/
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+	psipmr &= (~ENETC_PSIPMR_SET_UP(0));
+
+	if (dev->data->all_multicast == 0)
+		psipmr &= (~ENETC_PSIPMR_SET_MP(0));
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_allmulticast_enable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+
+	/* Setting to enable allmulticast mode for SI0*/
+	psipmr |= ENETC_PSIPMR_SET_MP(0);
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_allmulticast_disable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	if (dev->data->promiscuous == 1)
+		return; /* must remain in all_multicast mode */
+
+	/* Setting to disable all multicast mode for SI0*/
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR) &
+			       ~(ENETC_PSIPMR_SET_MP(0));
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -557,6 +615,10 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	.link_update          = enetc_link_update,
 	.stats_get            = enetc_stats_get,
 	.stats_reset          = enetc_stats_reset,
+	.promiscuous_enable   = enetc_promiscuous_enable,
+	.promiscuous_disable  = enetc_promiscuous_disable,
+	.allmulticast_enable  = enetc_allmulticast_enable,
+	.allmulticast_disable = enetc_allmulticast_disable,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 09/13] net/enetc: add MTU update and jumbo frames support
  2019-04-12 11:01   ` [dpdk-dev] [PATCH v3 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                       ` (8 preceding siblings ...)
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 08/13] net/enetc: enable promiscuous and allmulticast feature Gagandeep Singh
@ 2019-04-12 11:01     ` Gagandeep Singh
  2019-04-12 11:01       ` Gagandeep Singh
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 10/13] net/enetc: enable Rx-Tx queue start/stop feature Gagandeep Singh
                       ` (4 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Enable the jumbo frames and mtu update feature.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  2 +
 drivers/net/enetc/base/enetc_hw.h  |  6 ++-
 drivers/net/enetc/enetc.h          |  5 +++
 drivers/net/enetc/enetc_ethdev.c   | 86 ++++++++++++++++++++++++++++++++++----
 5 files changed, 91 insertions(+), 9 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index ab13211..eeb0752 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -49,6 +49,7 @@ ENETC Features
 - Basic stats
 - Promiscuous
 - Multicast
+- Jumbo packets
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 6b7bbfb..0eed2cb 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -9,6 +9,8 @@ Link status          = Y
 Basic stats          = Y
 Promiscuous mode     = Y
 Allmulticast mode    = Y
+MTU update           = Y
+Jumbo frame          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 90a383a..2eb1df3 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -99,7 +99,11 @@
 #define ENETC_PM0_RX_EN			BIT(1)
 
 #define ENETC_PM0_MAXFRM		0x08014
-#define ENETC_SET_MAXFRM(val)		((val) << 16)
+#define ENETC_SET_TX_MTU(val)		((val) << 16)
+#define ENETC_SET_MAXFRM(val)		((val) & 0xffff)
+#define ENETC_PTXMBAR			0x0608
+/* n = TC index [0..7] */
+#define ENETC_PTCMSDUR(n)		(0x2020 + (n) * 4)
 
 #define ENETC_PM0_STATUS		0x08304
 #define ENETC_LINK_MODE			0x0000000000080000ULL
diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index 56454dc..e494eb8 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -24,6 +24,11 @@
 /* BD ALIGN */
 #define BD_ALIGN       8
 
+/* minimum frame size supported */
+#define ENETC_MAC_MINFRM_SIZE	68
+/* maximum frame size supported */
+#define ENETC_MAC_MAXFRM_SIZE	9600
+
 /*
  * upper_32_bits - return bits 32-63 of a number
  * @n: the number we're accessing
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index a7dddc5..66cbf74 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -11,13 +11,6 @@
 int enetc_logtype_pmd;
 
 static int
-enetc_dev_configure(struct rte_eth_dev *dev __rte_unused)
-{
-	PMD_INIT_FUNC_TRACE();
-	return 0;
-}
-
-static int
 enetc_dev_start(struct rte_eth_dev *dev)
 {
 	struct enetc_eth_hw *hw =
@@ -168,7 +161,8 @@
 	};
 	dev_info->max_rx_queues = MAX_RX_RINGS;
 	dev_info->max_tx_queues = MAX_TX_RINGS;
-	dev_info->max_rx_pktlen = 1500;
+	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
+	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_JUMBO_FRAME;
 }
 
 static int
@@ -597,6 +591,76 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
 }
 
+static int
+enetc_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
+
+	/* check that mtu is within the allowed range */
+	if (mtu < ENETC_MAC_MINFRM_SIZE || frame_size > ENETC_MAC_MAXFRM_SIZE)
+		return -EINVAL;
+
+	/*
+	 * Refuse mtu that requires the support of scattered packets
+	 * when this feature has not been enabled before.
+	 */
+	if (dev->data->min_rx_buf_size &&
+		!dev->data->scattered_rx && frame_size >
+		dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM) {
+		ENETC_PMD_ERR("SG not enabled, will not fit in one buffer");
+		return -EINVAL;
+	}
+
+	if (frame_size > ETHER_MAX_LEN)
+		dev->data->dev_conf.rxmode.offloads &=
+						DEV_RX_OFFLOAD_JUMBO_FRAME;
+	else
+		dev->data->dev_conf.rxmode.offloads &=
+						~DEV_RX_OFFLOAD_JUMBO_FRAME;
+
+	enetc_port_wr(enetc_hw, ENETC_PTCMSDUR(0), ENETC_MAC_MAXFRM_SIZE);
+	enetc_port_wr(enetc_hw, ENETC_PTXMBAR, 2 * ENETC_MAC_MAXFRM_SIZE);
+
+	dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
+
+	/*setting the MTU*/
+	enetc_port_wr(enetc_hw, ENETC_PM0_MAXFRM, ENETC_SET_MAXFRM(frame_size) |
+		      ENETC_SET_TX_MTU(ENETC_MAC_MAXFRM_SIZE));
+
+	return 0;
+}
+
+static int
+enetc_dev_configure(struct rte_eth_dev *dev)
+{
+	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
+	uint64_t rx_offloads = eth_conf->rxmode.offloads;
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	PMD_INIT_FUNC_TRACE();
+
+	if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
+		uint32_t max_len;
+
+		max_len = dev->data->dev_conf.rxmode.max_rx_pkt_len;
+
+		enetc_port_wr(enetc_hw, ENETC_PM0_MAXFRM,
+			      ENETC_SET_MAXFRM(max_len));
+		enetc_port_wr(enetc_hw, ENETC_PTCMSDUR(0),
+			      ENETC_MAC_MAXFRM_SIZE);
+		enetc_port_wr(enetc_hw, ENETC_PTXMBAR,
+			      2 * ENETC_MAC_MAXFRM_SIZE);
+		dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
+	}
+
+	return 0;
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -620,6 +684,7 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	.allmulticast_enable  = enetc_allmulticast_enable,
 	.allmulticast_disable = enetc_allmulticast_disable,
 	.dev_infos_get        = enetc_dev_infos_get,
+	.mtu_set              = enetc_mtu_set,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
 	.tx_queue_setup       = enetc_tx_queue_setup,
@@ -674,6 +739,11 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	ether_addr_copy((struct ether_addr *)hw->mac.addr,
 			&eth_dev->data->mac_addrs[0]);
 
+	/* Set MTU */
+	enetc_port_wr(&hw->hw, ENETC_PM0_MAXFRM,
+		      ENETC_SET_MAXFRM(ETHER_MAX_LEN));
+	eth_dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
+
 	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
 			eth_dev->data->port_id, pci_dev->id.vendor_id,
 			pci_dev->id.device_id);
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 09/13] net/enetc: add MTU update and jumbo frames support
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 09/13] net/enetc: add MTU update and jumbo frames support Gagandeep Singh
@ 2019-04-12 11:01       ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Enable the jumbo frames and mtu update feature.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  2 +
 drivers/net/enetc/base/enetc_hw.h  |  6 ++-
 drivers/net/enetc/enetc.h          |  5 +++
 drivers/net/enetc/enetc_ethdev.c   | 86 ++++++++++++++++++++++++++++++++++----
 5 files changed, 91 insertions(+), 9 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index ab13211..eeb0752 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -49,6 +49,7 @@ ENETC Features
 - Basic stats
 - Promiscuous
 - Multicast
+- Jumbo packets
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 6b7bbfb..0eed2cb 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -9,6 +9,8 @@ Link status          = Y
 Basic stats          = Y
 Promiscuous mode     = Y
 Allmulticast mode    = Y
+MTU update           = Y
+Jumbo frame          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 90a383a..2eb1df3 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -99,7 +99,11 @@
 #define ENETC_PM0_RX_EN			BIT(1)
 
 #define ENETC_PM0_MAXFRM		0x08014
-#define ENETC_SET_MAXFRM(val)		((val) << 16)
+#define ENETC_SET_TX_MTU(val)		((val) << 16)
+#define ENETC_SET_MAXFRM(val)		((val) & 0xffff)
+#define ENETC_PTXMBAR			0x0608
+/* n = TC index [0..7] */
+#define ENETC_PTCMSDUR(n)		(0x2020 + (n) * 4)
 
 #define ENETC_PM0_STATUS		0x08304
 #define ENETC_LINK_MODE			0x0000000000080000ULL
diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index 56454dc..e494eb8 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -24,6 +24,11 @@
 /* BD ALIGN */
 #define BD_ALIGN       8
 
+/* minimum frame size supported */
+#define ENETC_MAC_MINFRM_SIZE	68
+/* maximum frame size supported */
+#define ENETC_MAC_MAXFRM_SIZE	9600
+
 /*
  * upper_32_bits - return bits 32-63 of a number
  * @n: the number we're accessing
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index a7dddc5..66cbf74 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -11,13 +11,6 @@
 int enetc_logtype_pmd;
 
 static int
-enetc_dev_configure(struct rte_eth_dev *dev __rte_unused)
-{
-	PMD_INIT_FUNC_TRACE();
-	return 0;
-}
-
-static int
 enetc_dev_start(struct rte_eth_dev *dev)
 {
 	struct enetc_eth_hw *hw =
@@ -168,7 +161,8 @@
 	};
 	dev_info->max_rx_queues = MAX_RX_RINGS;
 	dev_info->max_tx_queues = MAX_TX_RINGS;
-	dev_info->max_rx_pktlen = 1500;
+	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
+	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_JUMBO_FRAME;
 }
 
 static int
@@ -597,6 +591,76 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
 }
 
+static int
+enetc_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
+
+	/* check that mtu is within the allowed range */
+	if (mtu < ENETC_MAC_MINFRM_SIZE || frame_size > ENETC_MAC_MAXFRM_SIZE)
+		return -EINVAL;
+
+	/*
+	 * Refuse mtu that requires the support of scattered packets
+	 * when this feature has not been enabled before.
+	 */
+	if (dev->data->min_rx_buf_size &&
+		!dev->data->scattered_rx && frame_size >
+		dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM) {
+		ENETC_PMD_ERR("SG not enabled, will not fit in one buffer");
+		return -EINVAL;
+	}
+
+	if (frame_size > ETHER_MAX_LEN)
+		dev->data->dev_conf.rxmode.offloads &=
+						DEV_RX_OFFLOAD_JUMBO_FRAME;
+	else
+		dev->data->dev_conf.rxmode.offloads &=
+						~DEV_RX_OFFLOAD_JUMBO_FRAME;
+
+	enetc_port_wr(enetc_hw, ENETC_PTCMSDUR(0), ENETC_MAC_MAXFRM_SIZE);
+	enetc_port_wr(enetc_hw, ENETC_PTXMBAR, 2 * ENETC_MAC_MAXFRM_SIZE);
+
+	dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
+
+	/*setting the MTU*/
+	enetc_port_wr(enetc_hw, ENETC_PM0_MAXFRM, ENETC_SET_MAXFRM(frame_size) |
+		      ENETC_SET_TX_MTU(ENETC_MAC_MAXFRM_SIZE));
+
+	return 0;
+}
+
+static int
+enetc_dev_configure(struct rte_eth_dev *dev)
+{
+	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
+	uint64_t rx_offloads = eth_conf->rxmode.offloads;
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	PMD_INIT_FUNC_TRACE();
+
+	if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
+		uint32_t max_len;
+
+		max_len = dev->data->dev_conf.rxmode.max_rx_pkt_len;
+
+		enetc_port_wr(enetc_hw, ENETC_PM0_MAXFRM,
+			      ENETC_SET_MAXFRM(max_len));
+		enetc_port_wr(enetc_hw, ENETC_PTCMSDUR(0),
+			      ENETC_MAC_MAXFRM_SIZE);
+		enetc_port_wr(enetc_hw, ENETC_PTXMBAR,
+			      2 * ENETC_MAC_MAXFRM_SIZE);
+		dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
+	}
+
+	return 0;
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -620,6 +684,7 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	.allmulticast_enable  = enetc_allmulticast_enable,
 	.allmulticast_disable = enetc_allmulticast_disable,
 	.dev_infos_get        = enetc_dev_infos_get,
+	.mtu_set              = enetc_mtu_set,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
 	.tx_queue_setup       = enetc_tx_queue_setup,
@@ -674,6 +739,11 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	ether_addr_copy((struct ether_addr *)hw->mac.addr,
 			&eth_dev->data->mac_addrs[0]);
 
+	/* Set MTU */
+	enetc_port_wr(&hw->hw, ENETC_PM0_MAXFRM,
+		      ENETC_SET_MAXFRM(ETHER_MAX_LEN));
+	eth_dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
+
 	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
 			eth_dev->data->port_id, pci_dev->id.vendor_id,
 			pci_dev->id.device_id);
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 10/13] net/enetc: enable Rx-Tx queue start/stop feature
  2019-04-12 11:01   ` [dpdk-dev] [PATCH v3 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                       ` (9 preceding siblings ...)
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 09/13] net/enetc: add MTU update and jumbo frames support Gagandeep Singh
@ 2019-04-12 11:01     ` Gagandeep Singh
  2019-04-12 11:01       ` Gagandeep Singh
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 11/13] net/enetc: enable CRC offload feature Gagandeep Singh
                       ` (3 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Rx and Tx queue start-stop and deferred queue start
features enabled.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |   2 +
 doc/guides/nics/features/enetc.ini |   1 +
 drivers/net/enetc/enetc_ethdev.c   | 185 ++++++++++++++++++++++++++-----------
 3 files changed, 134 insertions(+), 54 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index eeb0752..26d61f6 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -50,6 +50,8 @@ ENETC Features
 - Promiscuous
 - Multicast
 - Jumbo packets
+- Queue Start/Stop
+- Deferred Queue Start
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 0eed2cb..bd901fa 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -11,6 +11,7 @@ Promiscuous mode     = Y
 Allmulticast mode    = Y
 MTU update           = Y
 Jumbo frame          = Y
+Queue start/stop     = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 66cbf74..ff9301e 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -203,7 +203,6 @@
 enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
 {
 	int idx = tx_ring->index;
-	uint32_t tbmr;
 	phys_addr_t bd_address;
 
 	bd_address = (phys_addr_t)
@@ -215,9 +214,6 @@
 	enetc_txbdr_wr(hw, idx, ENETC_TBLENR,
 		       ENETC_RTBLENR_LEN(tx_ring->bd_count));
 
-	tbmr = ENETC_TBMR_EN;
-	/* enable ring */
-	enetc_txbdr_wr(hw, idx, ENETC_TBMR, tbmr);
 	enetc_txbdr_wr(hw, idx, ENETC_TBCIR, 0);
 	enetc_txbdr_wr(hw, idx, ENETC_TBCISR, 0);
 	tx_ring->tcir = (void *)((size_t)hw->reg +
@@ -227,16 +223,22 @@
 }
 
 static int
-enetc_alloc_tx_resources(struct rte_eth_dev *dev,
-			 uint16_t queue_idx,
-			 uint16_t nb_desc)
+enetc_tx_queue_setup(struct rte_eth_dev *dev,
+		     uint16_t queue_idx,
+		     uint16_t nb_desc,
+		     unsigned int socket_id __rte_unused,
+		     const struct rte_eth_txconf *tx_conf)
 {
-	int err;
+	int err = 0;
 	struct enetc_bdr *tx_ring;
 	struct rte_eth_dev_data *data = dev->data;
 	struct enetc_eth_adapter *priv =
 			ENETC_DEV_PRIVATE(data->dev_private);
 
+	PMD_INIT_FUNC_TRACE();
+	if (nb_desc > MAX_BD_COUNT)
+		return -1;
+
 	tx_ring = rte_zmalloc(NULL, sizeof(struct enetc_bdr), 0);
 	if (tx_ring == NULL) {
 		ENETC_PMD_ERR("Failed to allocate TX ring memory");
@@ -253,6 +255,17 @@
 	enetc_setup_txbdr(&priv->hw.hw, tx_ring);
 	data->tx_queues[queue_idx] = tx_ring;
 
+	if (!tx_conf->tx_deferred_start) {
+		/* enable ring */
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index,
+			       ENETC_TBMR, ENETC_TBMR_EN);
+		dev->data->tx_queue_state[tx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STARTED;
+	} else {
+		dev->data->tx_queue_state[tx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
 	return 0;
 fail:
 	rte_free(tx_ring);
@@ -260,24 +273,6 @@
 	return err;
 }
 
-static int
-enetc_tx_queue_setup(struct rte_eth_dev *dev,
-		     uint16_t queue_idx,
-		     uint16_t nb_desc,
-		     unsigned int socket_id __rte_unused,
-		     const struct rte_eth_txconf *tx_conf __rte_unused)
-{
-	int err = 0;
-
-	PMD_INIT_FUNC_TRACE();
-	if (nb_desc > MAX_BD_COUNT)
-		return -1;
-
-	err = enetc_alloc_tx_resources(dev, queue_idx, nb_desc);
-
-	return err;
-}
-
 static void
 enetc_tx_queue_release(void *txq)
 {
@@ -367,23 +362,27 @@
 	buf_size = (uint16_t)(rte_pktmbuf_data_room_size(rx_ring->mb_pool) -
 		   RTE_PKTMBUF_HEADROOM);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBSR, buf_size);
-	/* enable ring */
-	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 }
 
 static int
-enetc_alloc_rx_resources(struct rte_eth_dev *dev,
-			 uint16_t rx_queue_id,
-			 uint16_t nb_rx_desc,
-			 struct rte_mempool *mb_pool)
+enetc_rx_queue_setup(struct rte_eth_dev *dev,
+		     uint16_t rx_queue_id,
+		     uint16_t nb_rx_desc,
+		     unsigned int socket_id __rte_unused,
+		     const struct rte_eth_rxconf *rx_conf,
+		     struct rte_mempool *mb_pool)
 {
-	int err;
+	int err = 0;
 	struct enetc_bdr *rx_ring;
 	struct rte_eth_dev_data *data =  dev->data;
 	struct enetc_eth_adapter *adapter =
 			ENETC_DEV_PRIVATE(data->dev_private);
 
+	PMD_INIT_FUNC_TRACE();
+	if (nb_rx_desc > MAX_BD_COUNT)
+		return -1;
+
 	rx_ring = rte_zmalloc(NULL, sizeof(struct enetc_bdr), 0);
 	if (rx_ring == NULL) {
 		ENETC_PMD_ERR("Failed to allocate RX ring memory");
@@ -400,6 +399,17 @@
 	enetc_setup_rxbdr(&adapter->hw.hw, rx_ring, mb_pool);
 	data->rx_queues[rx_queue_id] = rx_ring;
 
+	if (!rx_conf->rx_deferred_start) {
+		/* enable ring */
+		enetc_rxbdr_wr(&adapter->hw.hw, rx_ring->index, ENETC_RBMR,
+			       ENETC_RBMR_EN);
+		dev->data->rx_queue_state[rx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STARTED;
+	} else {
+		dev->data->rx_queue_state[rx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
 	return 0;
 fail:
 	rte_free(rx_ring);
@@ -407,27 +417,6 @@
 	return err;
 }
 
-static int
-enetc_rx_queue_setup(struct rte_eth_dev *dev,
-		     uint16_t rx_queue_id,
-		     uint16_t nb_rx_desc,
-		     unsigned int socket_id __rte_unused,
-		     const struct rte_eth_rxconf *rx_conf __rte_unused,
-		     struct rte_mempool *mb_pool)
-{
-	int err = 0;
-
-	PMD_INIT_FUNC_TRACE();
-	if (nb_rx_desc > MAX_BD_COUNT)
-		return -1;
-
-	err = enetc_alloc_rx_resources(dev, rx_queue_id,
-				       nb_rx_desc,
-				       mb_pool);
-
-	return err;
-}
-
 static void
 enetc_rx_queue_release(void *rxq)
 {
@@ -661,6 +650,90 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	return 0;
 }
 
+static int
+enetc_rx_queue_start(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *rx_ring;
+	uint32_t rx_data;
+
+	rx_ring = dev->data->rx_queues[qidx];
+	if (dev->data->rx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STOPPED) {
+		rx_data = enetc_rxbdr_rd(&priv->hw.hw, rx_ring->index,
+					 ENETC_RBMR);
+		rx_data = rx_data | ENETC_RBMR_EN;
+		enetc_rxbdr_wr(&priv->hw.hw, rx_ring->index, ENETC_RBMR,
+			       rx_data);
+		dev->data->rx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STARTED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_rx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *rx_ring;
+	uint32_t rx_data;
+
+	rx_ring = dev->data->rx_queues[qidx];
+	if (dev->data->rx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STARTED) {
+		rx_data = enetc_rxbdr_rd(&priv->hw.hw, rx_ring->index,
+					 ENETC_RBMR);
+		rx_data = rx_data & (~ENETC_RBMR_EN);
+		enetc_rxbdr_wr(&priv->hw.hw, rx_ring->index, ENETC_RBMR,
+			       rx_data);
+		dev->data->rx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_tx_queue_start(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *tx_ring;
+	uint32_t tx_data;
+
+	tx_ring = dev->data->tx_queues[qidx];
+	if (dev->data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STOPPED) {
+		tx_data = enetc_txbdr_rd(&priv->hw.hw, tx_ring->index,
+					 ENETC_TBMR);
+		tx_data = tx_data | ENETC_TBMR_EN;
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index, ENETC_TBMR,
+			       tx_data);
+		dev->data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STARTED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_tx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *tx_ring;
+	uint32_t tx_data;
+
+	tx_ring = dev->data->tx_queues[qidx];
+	if (dev->data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STARTED) {
+		tx_data = enetc_txbdr_rd(&priv->hw.hw, tx_ring->index,
+					 ENETC_TBMR);
+		tx_data = tx_data & (~ENETC_TBMR_EN);
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index, ENETC_TBMR,
+			       tx_data);
+		dev->data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
+	return 0;
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -686,8 +759,12 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.mtu_set              = enetc_mtu_set,
 	.rx_queue_setup       = enetc_rx_queue_setup,
+	.rx_queue_start       = enetc_rx_queue_start,
+	.rx_queue_stop        = enetc_rx_queue_stop,
 	.rx_queue_release     = enetc_rx_queue_release,
 	.tx_queue_setup       = enetc_tx_queue_setup,
+	.tx_queue_start       = enetc_tx_queue_start,
+	.tx_queue_stop        = enetc_tx_queue_stop,
 	.tx_queue_release     = enetc_tx_queue_release,
 	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
 };
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 10/13] net/enetc: enable Rx-Tx queue start/stop feature
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 10/13] net/enetc: enable Rx-Tx queue start/stop feature Gagandeep Singh
@ 2019-04-12 11:01       ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Rx and Tx queue start-stop and deferred queue start
features enabled.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |   2 +
 doc/guides/nics/features/enetc.ini |   1 +
 drivers/net/enetc/enetc_ethdev.c   | 185 ++++++++++++++++++++++++++-----------
 3 files changed, 134 insertions(+), 54 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index eeb0752..26d61f6 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -50,6 +50,8 @@ ENETC Features
 - Promiscuous
 - Multicast
 - Jumbo packets
+- Queue Start/Stop
+- Deferred Queue Start
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 0eed2cb..bd901fa 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -11,6 +11,7 @@ Promiscuous mode     = Y
 Allmulticast mode    = Y
 MTU update           = Y
 Jumbo frame          = Y
+Queue start/stop     = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 66cbf74..ff9301e 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -203,7 +203,6 @@
 enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
 {
 	int idx = tx_ring->index;
-	uint32_t tbmr;
 	phys_addr_t bd_address;
 
 	bd_address = (phys_addr_t)
@@ -215,9 +214,6 @@
 	enetc_txbdr_wr(hw, idx, ENETC_TBLENR,
 		       ENETC_RTBLENR_LEN(tx_ring->bd_count));
 
-	tbmr = ENETC_TBMR_EN;
-	/* enable ring */
-	enetc_txbdr_wr(hw, idx, ENETC_TBMR, tbmr);
 	enetc_txbdr_wr(hw, idx, ENETC_TBCIR, 0);
 	enetc_txbdr_wr(hw, idx, ENETC_TBCISR, 0);
 	tx_ring->tcir = (void *)((size_t)hw->reg +
@@ -227,16 +223,22 @@
 }
 
 static int
-enetc_alloc_tx_resources(struct rte_eth_dev *dev,
-			 uint16_t queue_idx,
-			 uint16_t nb_desc)
+enetc_tx_queue_setup(struct rte_eth_dev *dev,
+		     uint16_t queue_idx,
+		     uint16_t nb_desc,
+		     unsigned int socket_id __rte_unused,
+		     const struct rte_eth_txconf *tx_conf)
 {
-	int err;
+	int err = 0;
 	struct enetc_bdr *tx_ring;
 	struct rte_eth_dev_data *data = dev->data;
 	struct enetc_eth_adapter *priv =
 			ENETC_DEV_PRIVATE(data->dev_private);
 
+	PMD_INIT_FUNC_TRACE();
+	if (nb_desc > MAX_BD_COUNT)
+		return -1;
+
 	tx_ring = rte_zmalloc(NULL, sizeof(struct enetc_bdr), 0);
 	if (tx_ring == NULL) {
 		ENETC_PMD_ERR("Failed to allocate TX ring memory");
@@ -253,6 +255,17 @@
 	enetc_setup_txbdr(&priv->hw.hw, tx_ring);
 	data->tx_queues[queue_idx] = tx_ring;
 
+	if (!tx_conf->tx_deferred_start) {
+		/* enable ring */
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index,
+			       ENETC_TBMR, ENETC_TBMR_EN);
+		dev->data->tx_queue_state[tx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STARTED;
+	} else {
+		dev->data->tx_queue_state[tx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
 	return 0;
 fail:
 	rte_free(tx_ring);
@@ -260,24 +273,6 @@
 	return err;
 }
 
-static int
-enetc_tx_queue_setup(struct rte_eth_dev *dev,
-		     uint16_t queue_idx,
-		     uint16_t nb_desc,
-		     unsigned int socket_id __rte_unused,
-		     const struct rte_eth_txconf *tx_conf __rte_unused)
-{
-	int err = 0;
-
-	PMD_INIT_FUNC_TRACE();
-	if (nb_desc > MAX_BD_COUNT)
-		return -1;
-
-	err = enetc_alloc_tx_resources(dev, queue_idx, nb_desc);
-
-	return err;
-}
-
 static void
 enetc_tx_queue_release(void *txq)
 {
@@ -367,23 +362,27 @@
 	buf_size = (uint16_t)(rte_pktmbuf_data_room_size(rx_ring->mb_pool) -
 		   RTE_PKTMBUF_HEADROOM);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBSR, buf_size);
-	/* enable ring */
-	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 }
 
 static int
-enetc_alloc_rx_resources(struct rte_eth_dev *dev,
-			 uint16_t rx_queue_id,
-			 uint16_t nb_rx_desc,
-			 struct rte_mempool *mb_pool)
+enetc_rx_queue_setup(struct rte_eth_dev *dev,
+		     uint16_t rx_queue_id,
+		     uint16_t nb_rx_desc,
+		     unsigned int socket_id __rte_unused,
+		     const struct rte_eth_rxconf *rx_conf,
+		     struct rte_mempool *mb_pool)
 {
-	int err;
+	int err = 0;
 	struct enetc_bdr *rx_ring;
 	struct rte_eth_dev_data *data =  dev->data;
 	struct enetc_eth_adapter *adapter =
 			ENETC_DEV_PRIVATE(data->dev_private);
 
+	PMD_INIT_FUNC_TRACE();
+	if (nb_rx_desc > MAX_BD_COUNT)
+		return -1;
+
 	rx_ring = rte_zmalloc(NULL, sizeof(struct enetc_bdr), 0);
 	if (rx_ring == NULL) {
 		ENETC_PMD_ERR("Failed to allocate RX ring memory");
@@ -400,6 +399,17 @@
 	enetc_setup_rxbdr(&adapter->hw.hw, rx_ring, mb_pool);
 	data->rx_queues[rx_queue_id] = rx_ring;
 
+	if (!rx_conf->rx_deferred_start) {
+		/* enable ring */
+		enetc_rxbdr_wr(&adapter->hw.hw, rx_ring->index, ENETC_RBMR,
+			       ENETC_RBMR_EN);
+		dev->data->rx_queue_state[rx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STARTED;
+	} else {
+		dev->data->rx_queue_state[rx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
 	return 0;
 fail:
 	rte_free(rx_ring);
@@ -407,27 +417,6 @@
 	return err;
 }
 
-static int
-enetc_rx_queue_setup(struct rte_eth_dev *dev,
-		     uint16_t rx_queue_id,
-		     uint16_t nb_rx_desc,
-		     unsigned int socket_id __rte_unused,
-		     const struct rte_eth_rxconf *rx_conf __rte_unused,
-		     struct rte_mempool *mb_pool)
-{
-	int err = 0;
-
-	PMD_INIT_FUNC_TRACE();
-	if (nb_rx_desc > MAX_BD_COUNT)
-		return -1;
-
-	err = enetc_alloc_rx_resources(dev, rx_queue_id,
-				       nb_rx_desc,
-				       mb_pool);
-
-	return err;
-}
-
 static void
 enetc_rx_queue_release(void *rxq)
 {
@@ -661,6 +650,90 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	return 0;
 }
 
+static int
+enetc_rx_queue_start(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *rx_ring;
+	uint32_t rx_data;
+
+	rx_ring = dev->data->rx_queues[qidx];
+	if (dev->data->rx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STOPPED) {
+		rx_data = enetc_rxbdr_rd(&priv->hw.hw, rx_ring->index,
+					 ENETC_RBMR);
+		rx_data = rx_data | ENETC_RBMR_EN;
+		enetc_rxbdr_wr(&priv->hw.hw, rx_ring->index, ENETC_RBMR,
+			       rx_data);
+		dev->data->rx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STARTED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_rx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *rx_ring;
+	uint32_t rx_data;
+
+	rx_ring = dev->data->rx_queues[qidx];
+	if (dev->data->rx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STARTED) {
+		rx_data = enetc_rxbdr_rd(&priv->hw.hw, rx_ring->index,
+					 ENETC_RBMR);
+		rx_data = rx_data & (~ENETC_RBMR_EN);
+		enetc_rxbdr_wr(&priv->hw.hw, rx_ring->index, ENETC_RBMR,
+			       rx_data);
+		dev->data->rx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_tx_queue_start(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *tx_ring;
+	uint32_t tx_data;
+
+	tx_ring = dev->data->tx_queues[qidx];
+	if (dev->data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STOPPED) {
+		tx_data = enetc_txbdr_rd(&priv->hw.hw, tx_ring->index,
+					 ENETC_TBMR);
+		tx_data = tx_data | ENETC_TBMR_EN;
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index, ENETC_TBMR,
+			       tx_data);
+		dev->data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STARTED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_tx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *tx_ring;
+	uint32_t tx_data;
+
+	tx_ring = dev->data->tx_queues[qidx];
+	if (dev->data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STARTED) {
+		tx_data = enetc_txbdr_rd(&priv->hw.hw, tx_ring->index,
+					 ENETC_TBMR);
+		tx_data = tx_data & (~ENETC_TBMR_EN);
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index, ENETC_TBMR,
+			       tx_data);
+		dev->data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
+	return 0;
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -686,8 +759,12 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.mtu_set              = enetc_mtu_set,
 	.rx_queue_setup       = enetc_rx_queue_setup,
+	.rx_queue_start       = enetc_rx_queue_start,
+	.rx_queue_stop        = enetc_rx_queue_stop,
 	.rx_queue_release     = enetc_rx_queue_release,
 	.tx_queue_setup       = enetc_tx_queue_setup,
+	.tx_queue_start       = enetc_tx_queue_start,
+	.tx_queue_stop        = enetc_tx_queue_stop,
 	.tx_queue_release     = enetc_tx_queue_release,
 	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
 };
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 11/13] net/enetc: enable CRC offload feature
  2019-04-12 11:01   ` [dpdk-dev] [PATCH v3 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                       ` (10 preceding siblings ...)
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 10/13] net/enetc: enable Rx-Tx queue start/stop feature Gagandeep Singh
@ 2019-04-12 11:01     ` Gagandeep Singh
  2019-04-12 11:01       ` Gagandeep Singh
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 12/13] net/enetc: enable Rx checksum offload validation Gagandeep Singh
                       ` (2 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

CRC offload keep feature supported

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  1 +
 drivers/net/enetc/base/enetc_hw.h  |  1 +
 drivers/net/enetc/enetc.h          |  1 +
 drivers/net/enetc/enetc_ethdev.c   | 20 +++++++++++++++++---
 drivers/net/enetc/enetc_rxtx.c     |  6 ++++--
 6 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 26d61f6..2620460 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -52,6 +52,7 @@ ENETC Features
 - Jumbo packets
 - Queue Start/Stop
 - Deferred Queue Start
+- CRC offload
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index bd901fa..101dc0a 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -12,6 +12,7 @@ Allmulticast mode    = Y
 MTU update           = Y
 Jumbo frame          = Y
 Queue start/stop     = Y
+CRC offload          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 2eb1df3..261ad15 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -97,6 +97,7 @@
 #define ENETC_PM0_CMD_CFG		0x08008
 #define ENETC_PM0_TX_EN			BIT(0)
 #define ENETC_PM0_RX_EN			BIT(1)
+#define ENETC_PM0_CRC			BIT(6)
 
 #define ENETC_PM0_MAXFRM		0x08014
 #define ENETC_SET_TX_MTU(val)		((val) << 16)
diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index e494eb8..8c830a5 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -69,6 +69,7 @@ struct enetc_bdr {
 		void *tcisr; /* Tx */
 		int next_to_alloc; /* Rx */
 	};
+	uint8_t	crc_len; /* 0 if CRC stripped, 4 otherwise */
 };
 
 /*
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index ff9301e..ffae8ae 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -162,7 +162,9 @@
 	dev_info->max_rx_queues = MAX_RX_RINGS;
 	dev_info->max_tx_queues = MAX_TX_RINGS;
 	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
-	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_JUMBO_FRAME;
+	dev_info->rx_offload_capa =
+		(DEV_RX_OFFLOAD_KEEP_CRC |
+		 DEV_RX_OFFLOAD_JUMBO_FRAME);
 }
 
 static int
@@ -378,6 +380,7 @@
 	struct rte_eth_dev_data *data =  dev->data;
 	struct enetc_eth_adapter *adapter =
 			ENETC_DEV_PRIVATE(data->dev_private);
+	uint64_t rx_offloads = data->dev_conf.rxmode.offloads;
 
 	PMD_INIT_FUNC_TRACE();
 	if (nb_rx_desc > MAX_BD_COUNT)
@@ -410,6 +413,9 @@
 			       RTE_ETH_QUEUE_STATE_STOPPED;
 	}
 
+	rx_ring->crc_len = (uint8_t)((rx_offloads & DEV_RX_OFFLOAD_KEEP_CRC) ?
+				     ETHER_CRC_LEN : 0);
+
 	return 0;
 fail:
 	rte_free(rx_ring);
@@ -625,11 +631,11 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 static int
 enetc_dev_configure(struct rte_eth_dev *dev)
 {
-	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
-	uint64_t rx_offloads = eth_conf->rxmode.offloads;
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct enetc_hw *enetc_hw = &hw->hw;
+	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
+	uint64_t rx_offloads = eth_conf->rxmode.offloads;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -647,6 +653,14 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 		dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
 	}
 
+	if (rx_offloads & DEV_RX_OFFLOAD_KEEP_CRC) {
+		int config;
+
+		config = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+		config |= ENETC_PM0_CRC;
+		enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG, config);
+	}
+
 	return 0;
 }
 
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 42f16ca..4a758d2 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -208,8 +208,10 @@ static inline void __attribute__((hot))
 		if (!bd_status)
 			break;
 
-		rx_swbd->buffer_addr->pkt_len = rxbd->r.buf_len;
-		rx_swbd->buffer_addr->data_len = rxbd->r.buf_len;
+		rx_swbd->buffer_addr->pkt_len = rxbd->r.buf_len -
+						rx_ring->crc_len;
+		rx_swbd->buffer_addr->data_len = rxbd->r.buf_len -
+						 rx_ring->crc_len;
 		rx_swbd->buffer_addr->hash.rss = rxbd->r.rss_hash;
 		rx_swbd->buffer_addr->ol_flags = 0;
 		enetc_dev_rx_parse(rx_swbd->buffer_addr,
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 11/13] net/enetc: enable CRC offload feature
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 11/13] net/enetc: enable CRC offload feature Gagandeep Singh
@ 2019-04-12 11:01       ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

CRC offload keep feature supported

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  1 +
 drivers/net/enetc/base/enetc_hw.h  |  1 +
 drivers/net/enetc/enetc.h          |  1 +
 drivers/net/enetc/enetc_ethdev.c   | 20 +++++++++++++++++---
 drivers/net/enetc/enetc_rxtx.c     |  6 ++++--
 6 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 26d61f6..2620460 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -52,6 +52,7 @@ ENETC Features
 - Jumbo packets
 - Queue Start/Stop
 - Deferred Queue Start
+- CRC offload
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index bd901fa..101dc0a 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -12,6 +12,7 @@ Allmulticast mode    = Y
 MTU update           = Y
 Jumbo frame          = Y
 Queue start/stop     = Y
+CRC offload          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 2eb1df3..261ad15 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -97,6 +97,7 @@
 #define ENETC_PM0_CMD_CFG		0x08008
 #define ENETC_PM0_TX_EN			BIT(0)
 #define ENETC_PM0_RX_EN			BIT(1)
+#define ENETC_PM0_CRC			BIT(6)
 
 #define ENETC_PM0_MAXFRM		0x08014
 #define ENETC_SET_TX_MTU(val)		((val) << 16)
diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index e494eb8..8c830a5 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -69,6 +69,7 @@ struct enetc_bdr {
 		void *tcisr; /* Tx */
 		int next_to_alloc; /* Rx */
 	};
+	uint8_t	crc_len; /* 0 if CRC stripped, 4 otherwise */
 };
 
 /*
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index ff9301e..ffae8ae 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -162,7 +162,9 @@
 	dev_info->max_rx_queues = MAX_RX_RINGS;
 	dev_info->max_tx_queues = MAX_TX_RINGS;
 	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
-	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_JUMBO_FRAME;
+	dev_info->rx_offload_capa =
+		(DEV_RX_OFFLOAD_KEEP_CRC |
+		 DEV_RX_OFFLOAD_JUMBO_FRAME);
 }
 
 static int
@@ -378,6 +380,7 @@
 	struct rte_eth_dev_data *data =  dev->data;
 	struct enetc_eth_adapter *adapter =
 			ENETC_DEV_PRIVATE(data->dev_private);
+	uint64_t rx_offloads = data->dev_conf.rxmode.offloads;
 
 	PMD_INIT_FUNC_TRACE();
 	if (nb_rx_desc > MAX_BD_COUNT)
@@ -410,6 +413,9 @@
 			       RTE_ETH_QUEUE_STATE_STOPPED;
 	}
 
+	rx_ring->crc_len = (uint8_t)((rx_offloads & DEV_RX_OFFLOAD_KEEP_CRC) ?
+				     ETHER_CRC_LEN : 0);
+
 	return 0;
 fail:
 	rte_free(rx_ring);
@@ -625,11 +631,11 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 static int
 enetc_dev_configure(struct rte_eth_dev *dev)
 {
-	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
-	uint64_t rx_offloads = eth_conf->rxmode.offloads;
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct enetc_hw *enetc_hw = &hw->hw;
+	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
+	uint64_t rx_offloads = eth_conf->rxmode.offloads;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -647,6 +653,14 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 		dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
 	}
 
+	if (rx_offloads & DEV_RX_OFFLOAD_KEEP_CRC) {
+		int config;
+
+		config = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+		config |= ENETC_PM0_CRC;
+		enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG, config);
+	}
+
 	return 0;
 }
 
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 42f16ca..4a758d2 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -208,8 +208,10 @@ static inline void __attribute__((hot))
 		if (!bd_status)
 			break;
 
-		rx_swbd->buffer_addr->pkt_len = rxbd->r.buf_len;
-		rx_swbd->buffer_addr->data_len = rxbd->r.buf_len;
+		rx_swbd->buffer_addr->pkt_len = rxbd->r.buf_len -
+						rx_ring->crc_len;
+		rx_swbd->buffer_addr->data_len = rxbd->r.buf_len -
+						 rx_ring->crc_len;
 		rx_swbd->buffer_addr->hash.rss = rxbd->r.rss_hash;
 		rx_swbd->buffer_addr->ol_flags = 0;
 		enetc_dev_rx_parse(rx_swbd->buffer_addr,
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 12/13] net/enetc: enable Rx checksum offload validation
  2019-04-12 11:01   ` [dpdk-dev] [PATCH v3 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                       ` (11 preceding siblings ...)
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 11/13] net/enetc: enable CRC offload feature Gagandeep Singh
@ 2019-04-12 11:01     ` Gagandeep Singh
  2019-04-12 11:01       ` Gagandeep Singh
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 13/13] net/enetc: fix crash at high speed traffic Gagandeep Singh
  2019-04-12 12:28     ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Checksum Validation on Rx is supported.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/features/enetc.ini |   2 +
 drivers/net/enetc/base/enetc_hw.h  |   5 ++
 drivers/net/enetc/enetc_ethdev.c   |  15 +++++-
 drivers/net/enetc/enetc_rxtx.c     | 107 ++++++++++++++++++++++++++++++++-----
 4 files changed, 115 insertions(+), 14 deletions(-)

diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 101dc0a..39a5201 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -13,6 +13,8 @@ MTU update           = Y
 Jumbo frame          = Y
 Queue start/stop     = Y
 CRC offload          = Y
+L3 checksum offload  = P
+L4 checksum offload  = P
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 261ad15..ff2bda5 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -99,6 +99,10 @@
 #define ENETC_PM0_RX_EN			BIT(1)
 #define ENETC_PM0_CRC			BIT(6)
 
+#define ENETC_PAR_PORT_CFG		0x03050
+#define L3_CKSUM			BIT(0)
+#define L4_CKSUM			BIT(1)
+
 #define ENETC_PM0_MAXFRM		0x08014
 #define ENETC_SET_TX_MTU(val)		((val) << 16)
 #define ENETC_SET_MAXFRM(val)		((val) & 0xffff)
@@ -182,6 +186,7 @@
 #define ENETC_TXBD_FLAGS_F		BIT(15)
 
 /* ENETC Parsed values (Little Endian) */
+#define ENETC_PARSE_ERROR		0x8000
 #define ENETC_PKT_TYPE_ETHER            0x0060
 #define ENETC_PKT_TYPE_IPV4             0x0000
 #define ENETC_PKT_TYPE_IPV6             0x0020
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index ffae8ae..362e074 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -163,7 +163,10 @@
 	dev_info->max_tx_queues = MAX_TX_RINGS;
 	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
 	dev_info->rx_offload_capa =
-		(DEV_RX_OFFLOAD_KEEP_CRC |
+		(DEV_RX_OFFLOAD_IPV4_CKSUM |
+		 DEV_RX_OFFLOAD_UDP_CKSUM |
+		 DEV_RX_OFFLOAD_TCP_CKSUM |
+		 DEV_RX_OFFLOAD_KEEP_CRC |
 		 DEV_RX_OFFLOAD_JUMBO_FRAME);
 }
 
@@ -636,6 +639,7 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	struct enetc_hw *enetc_hw = &hw->hw;
 	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
 	uint64_t rx_offloads = eth_conf->rxmode.offloads;
+	uint32_t checksum = L3_CKSUM | L4_CKSUM;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -661,6 +665,15 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 		enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG, config);
 	}
 
+	if (rx_offloads & DEV_RX_OFFLOAD_IPV4_CKSUM)
+		checksum &= ~L3_CKSUM;
+
+	if (rx_offloads & (DEV_RX_OFFLOAD_UDP_CKSUM | DEV_RX_OFFLOAD_TCP_CKSUM))
+		checksum &= ~L4_CKSUM;
+
+	enetc_port_wr(enetc_hw, ENETC_PAR_PORT_CFG, checksum);
+
+
 	return 0;
 }
 
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 4a758d2..0ce7dbe 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -115,69 +115,150 @@
 	return j;
 }
 
+static inline void enetc_slow_parsing(struct rte_mbuf *m,
+				     uint64_t parse_results)
+{
+	m->ol_flags &= ~(PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD);
+
+	switch (parse_results) {
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4;
+		m->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6;
+		m->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_TCP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_TCP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_TCP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_TCP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_UDP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_UDP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_UDP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_UDP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_SCTP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_SCTP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_SCTP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_SCTP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_ICMP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_ICMP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_ICMP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_ICMP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	/* More switch cases can be added */
+	default:
+		m->packet_type = RTE_PTYPE_UNKNOWN;
+		m->ol_flags |= PKT_RX_IP_CKSUM_UNKNOWN |
+			       PKT_RX_L4_CKSUM_UNKNOWN;
+	}
+}
+
 
 static inline void __attribute__((hot))
 enetc_dev_rx_parse(struct rte_mbuf *m, uint16_t parse_results)
 {
 	ENETC_PMD_DP_DEBUG("parse summary = 0x%x   ", parse_results);
+	m->ol_flags |= PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD;
 
-	m->packet_type = RTE_PTYPE_UNKNOWN;
 	switch (parse_results) {
 	case ENETC_PKT_TYPE_ETHER:
 		m->packet_type = RTE_PTYPE_L2_ETHER;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_TCP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_TCP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_TCP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_TCP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_UDP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_UDP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_UDP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_UDP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_SCTP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_SCTP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_SCTP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_SCTP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_ICMP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_ICMP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_ICMP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_ICMP;
-		break;
+		return;
 	/* More switch cases can be added */
 	default:
-		m->packet_type = RTE_PTYPE_UNKNOWN;
+		enetc_slow_parsing(m, parse_results);
 	}
+
 }
 
 static int
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 12/13] net/enetc: enable Rx checksum offload validation
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 12/13] net/enetc: enable Rx checksum offload validation Gagandeep Singh
@ 2019-04-12 11:01       ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Checksum Validation on Rx is supported.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/features/enetc.ini |   2 +
 drivers/net/enetc/base/enetc_hw.h  |   5 ++
 drivers/net/enetc/enetc_ethdev.c   |  15 +++++-
 drivers/net/enetc/enetc_rxtx.c     | 107 ++++++++++++++++++++++++++++++++-----
 4 files changed, 115 insertions(+), 14 deletions(-)

diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 101dc0a..39a5201 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -13,6 +13,8 @@ MTU update           = Y
 Jumbo frame          = Y
 Queue start/stop     = Y
 CRC offload          = Y
+L3 checksum offload  = P
+L4 checksum offload  = P
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 261ad15..ff2bda5 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -99,6 +99,10 @@
 #define ENETC_PM0_RX_EN			BIT(1)
 #define ENETC_PM0_CRC			BIT(6)
 
+#define ENETC_PAR_PORT_CFG		0x03050
+#define L3_CKSUM			BIT(0)
+#define L4_CKSUM			BIT(1)
+
 #define ENETC_PM0_MAXFRM		0x08014
 #define ENETC_SET_TX_MTU(val)		((val) << 16)
 #define ENETC_SET_MAXFRM(val)		((val) & 0xffff)
@@ -182,6 +186,7 @@
 #define ENETC_TXBD_FLAGS_F		BIT(15)
 
 /* ENETC Parsed values (Little Endian) */
+#define ENETC_PARSE_ERROR		0x8000
 #define ENETC_PKT_TYPE_ETHER            0x0060
 #define ENETC_PKT_TYPE_IPV4             0x0000
 #define ENETC_PKT_TYPE_IPV6             0x0020
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index ffae8ae..362e074 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -163,7 +163,10 @@
 	dev_info->max_tx_queues = MAX_TX_RINGS;
 	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
 	dev_info->rx_offload_capa =
-		(DEV_RX_OFFLOAD_KEEP_CRC |
+		(DEV_RX_OFFLOAD_IPV4_CKSUM |
+		 DEV_RX_OFFLOAD_UDP_CKSUM |
+		 DEV_RX_OFFLOAD_TCP_CKSUM |
+		 DEV_RX_OFFLOAD_KEEP_CRC |
 		 DEV_RX_OFFLOAD_JUMBO_FRAME);
 }
 
@@ -636,6 +639,7 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	struct enetc_hw *enetc_hw = &hw->hw;
 	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
 	uint64_t rx_offloads = eth_conf->rxmode.offloads;
+	uint32_t checksum = L3_CKSUM | L4_CKSUM;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -661,6 +665,15 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 		enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG, config);
 	}
 
+	if (rx_offloads & DEV_RX_OFFLOAD_IPV4_CKSUM)
+		checksum &= ~L3_CKSUM;
+
+	if (rx_offloads & (DEV_RX_OFFLOAD_UDP_CKSUM | DEV_RX_OFFLOAD_TCP_CKSUM))
+		checksum &= ~L4_CKSUM;
+
+	enetc_port_wr(enetc_hw, ENETC_PAR_PORT_CFG, checksum);
+
+
 	return 0;
 }
 
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 4a758d2..0ce7dbe 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -115,69 +115,150 @@
 	return j;
 }
 
+static inline void enetc_slow_parsing(struct rte_mbuf *m,
+				     uint64_t parse_results)
+{
+	m->ol_flags &= ~(PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD);
+
+	switch (parse_results) {
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4;
+		m->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6;
+		m->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_TCP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_TCP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_TCP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_TCP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_UDP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_UDP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_UDP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_UDP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_SCTP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_SCTP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_SCTP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_SCTP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_ICMP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_ICMP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_ICMP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_ICMP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	/* More switch cases can be added */
+	default:
+		m->packet_type = RTE_PTYPE_UNKNOWN;
+		m->ol_flags |= PKT_RX_IP_CKSUM_UNKNOWN |
+			       PKT_RX_L4_CKSUM_UNKNOWN;
+	}
+}
+
 
 static inline void __attribute__((hot))
 enetc_dev_rx_parse(struct rte_mbuf *m, uint16_t parse_results)
 {
 	ENETC_PMD_DP_DEBUG("parse summary = 0x%x   ", parse_results);
+	m->ol_flags |= PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD;
 
-	m->packet_type = RTE_PTYPE_UNKNOWN;
 	switch (parse_results) {
 	case ENETC_PKT_TYPE_ETHER:
 		m->packet_type = RTE_PTYPE_L2_ETHER;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_TCP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_TCP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_TCP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_TCP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_UDP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_UDP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_UDP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_UDP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_SCTP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_SCTP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_SCTP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_SCTP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_ICMP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_ICMP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_ICMP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_ICMP;
-		break;
+		return;
 	/* More switch cases can be added */
 	default:
-		m->packet_type = RTE_PTYPE_UNKNOWN;
+		enetc_slow_parsing(m, parse_results);
 	}
+
 }
 
 static int
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 13/13] net/enetc: fix crash at high speed traffic
  2019-04-12 11:01   ` [dpdk-dev] [PATCH v3 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                       ` (12 preceding siblings ...)
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 12/13] net/enetc: enable Rx checksum offload validation Gagandeep Singh
@ 2019-04-12 11:01     ` Gagandeep Singh
  2019-04-12 11:01       ` Gagandeep Singh
  2019-04-12 12:28     ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh, stable

On xmit side, there should be a check whether BD ring
has free BDs available before transmit a packet to avoid
data corruption and buffer leak issue.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: stable@dpdk.org

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_rxtx.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 0ce7dbe..81b0ef3 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -49,11 +49,16 @@
 		uint16_t nb_pkts)
 {
 	struct enetc_swbd *tx_swbd;
-	int i, start;
+	int i, start, bds_to_use;
 	struct enetc_tx_bd *txbd;
 	struct enetc_bdr *tx_ring = (struct enetc_bdr *)tx_queue;
 
 	i = tx_ring->next_to_use;
+
+	bds_to_use = enetc_bd_unused(tx_ring);
+	if (bds_to_use < nb_pkts)
+		nb_pkts = bds_to_use;
+
 	start = 0;
 	while (nb_pkts--) {
 		enetc_clean_tx_ring(tx_ring);
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v3 13/13] net/enetc: fix crash at high speed traffic
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 13/13] net/enetc: fix crash at high speed traffic Gagandeep Singh
@ 2019-04-12 11:01       ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 11:01 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh, stable

On xmit side, there should be a check whether BD ring
has free BDs available before transmit a packet to avoid
data corruption and buffer leak issue.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: stable@dpdk.org

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_rxtx.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 0ce7dbe..81b0ef3 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -49,11 +49,16 @@
 		uint16_t nb_pkts)
 {
 	struct enetc_swbd *tx_swbd;
-	int i, start;
+	int i, start, bds_to_use;
 	struct enetc_tx_bd *txbd;
 	struct enetc_bdr *tx_ring = (struct enetc_bdr *)tx_queue;
 
 	i = tx_ring->next_to_use;
+
+	bds_to_use = enetc_bd_unused(tx_ring);
+	if (bds_to_use < nb_pkts)
+		nb_pkts = bds_to_use;
+
 	start = 0;
 	while (nb_pkts--) {
 		enetc_clean_tx_ring(tx_ring);
-- 
1.9.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes
  2019-04-12 11:01   ` [dpdk-dev] [PATCH v3 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                       ` (13 preceding siblings ...)
  2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 13/13] net/enetc: fix crash at high speed traffic Gagandeep Singh
@ 2019-04-12 12:28     ` Gagandeep Singh
  2019-04-12 12:28       ` Gagandeep Singh
                         ` (14 more replies)
  14 siblings, 15 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:28 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

*V1 log:
 * support added for MTU, jumbo frame, queue start/stop, promiscuous,
   multicast, crc offload, RX checksum validation, basic stats
 * some bug fixes

V2 change-log:
 * remove unneeded code from stats get
 * fix big endian compilation

v3 change-log:
 * commit message updated for 03/13 patch
 * add stable to Cc for fixes

v4 change-log:
 * Removed checkpatch errors for CRLF

Gagandeep Singh (13):
  net/enetc: support physical addressing mode
  net/enetc: fix SMMU unhandled context fault
  net/enetc: fix big endian build and correct buffer allocation
  net/enetc: set interface mode for SXGMII
  net/enetc: add basic statistics
  net/enetc: replace register read/write macros with functions
  net/enetc: remove forward declarations
  net/enetc: enable promiscuous and allmulticast feature
  net/enetc: add MTU update and jumbo frames support
  net/enetc: enable Rx-Tx queue start/stop feature
  net/enetc: enable CRC offload feature
  net/enetc: enable Rx checksum offload validation
  net/enetc: fix crash at high speed traffic

 doc/guides/nics/enetc.rst          |   7 +
 doc/guides/nics/features/enetc.ini |   9 +
 drivers/net/enetc/base/enetc_hw.h  |  53 ++-
 drivers/net/enetc/enetc.h          |  13 +-
 drivers/net/enetc/enetc_ethdev.c   | 734 ++++++++++++++++++++---------
 drivers/net/enetc/enetc_rxtx.c     | 131 ++++-
 6 files changed, 682 insertions(+), 265 deletions(-)

-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes
  2019-04-12 12:28     ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
@ 2019-04-12 12:28       ` Gagandeep Singh
  2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 01/13] net/enetc: support physical addressing mode Gagandeep Singh
                         ` (13 subsequent siblings)
  14 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:28 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

*V1 log:
 * support added for MTU, jumbo frame, queue start/stop, promiscuous,
   multicast, crc offload, RX checksum validation, basic stats
 * some bug fixes

V2 change-log:
 * remove unneeded code from stats get
 * fix big endian compilation

v3 change-log:
 * commit message updated for 03/13 patch
 * add stable to Cc for fixes

v4 change-log:
 * Removed checkpatch errors for CRLF

Gagandeep Singh (13):
  net/enetc: support physical addressing mode
  net/enetc: fix SMMU unhandled context fault
  net/enetc: fix big endian build and correct buffer allocation
  net/enetc: set interface mode for SXGMII
  net/enetc: add basic statistics
  net/enetc: replace register read/write macros with functions
  net/enetc: remove forward declarations
  net/enetc: enable promiscuous and allmulticast feature
  net/enetc: add MTU update and jumbo frames support
  net/enetc: enable Rx-Tx queue start/stop feature
  net/enetc: enable CRC offload feature
  net/enetc: enable Rx checksum offload validation
  net/enetc: fix crash at high speed traffic

 doc/guides/nics/enetc.rst          |   7 +
 doc/guides/nics/features/enetc.ini |   9 +
 drivers/net/enetc/base/enetc_hw.h  |  53 ++-
 drivers/net/enetc/enetc.h          |  13 +-
 drivers/net/enetc/enetc_ethdev.c   | 734 ++++++++++++++++++++---------
 drivers/net/enetc/enetc_rxtx.c     | 131 ++++-
 6 files changed, 682 insertions(+), 265 deletions(-)

-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 01/13] net/enetc: support physical addressing mode
  2019-04-12 12:28     ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
  2019-04-12 12:28       ` Gagandeep Singh
@ 2019-04-12 12:28       ` Gagandeep Singh
  2019-04-12 12:28         ` Gagandeep Singh
  2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 02/13] net/enetc: fix SMMU unhandled context fault Gagandeep Singh
                         ` (12 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:28 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Support added for physical addressing mode and
change driver flags to don't care.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 22 ++++++++++++----------
 drivers/net/enetc/enetc_rxtx.c   |  6 +++---
 2 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 023fe7517..7a9a97deb 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #include <stdbool.h>
@@ -334,14 +334,15 @@ static void
 enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
 {
 	int idx = tx_ring->index;
-	uintptr_t base_addr;
 	uint32_t tbmr;
+	phys_addr_t bd_address;
 
-	base_addr = (uintptr_t)tx_ring->bd_base;
+	bd_address = (phys_addr_t)
+		     rte_mem_virt2iova((const void *)tx_ring->bd_base);
 	enetc_txbdr_wr(hw, idx, ENETC_TBBAR0,
-		       lower_32_bits((uint64_t)base_addr));
+		       lower_32_bits((uint64_t)bd_address));
 	enetc_txbdr_wr(hw, idx, ENETC_TBBAR1,
-		       upper_32_bits((uint64_t)base_addr));
+		       upper_32_bits((uint64_t)bd_address));
 	enetc_txbdr_wr(hw, idx, ENETC_TBLENR,
 		       ENETC_RTBLENR_LEN(tx_ring->bd_count));
 
@@ -478,14 +479,15 @@ enetc_setup_rxbdr(struct enetc_hw *hw, struct enetc_bdr *rx_ring,
 		  struct rte_mempool *mb_pool)
 {
 	int idx = rx_ring->index;
-	uintptr_t base_addr;
 	uint16_t buf_size;
+	phys_addr_t bd_address;
 
-	base_addr = (uintptr_t)rx_ring->bd_base;
+	bd_address = (phys_addr_t)
+		     rte_mem_virt2iova((const void *)rx_ring->bd_base);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBAR0,
-		       lower_32_bits((uint64_t)base_addr));
+		       lower_32_bits((uint64_t)bd_address));
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBAR1,
-		       upper_32_bits((uint64_t)base_addr));
+		       upper_32_bits((uint64_t)bd_address));
 	enetc_rxbdr_wr(hw, idx, ENETC_RBLENR,
 		       ENETC_RTBLENR_LEN(rx_ring->bd_count));
 
@@ -612,7 +614,7 @@ enetc_pci_remove(struct rte_pci_device *pci_dev)
 
 static struct rte_pci_driver rte_enetc_pmd = {
 	.id_table = pci_id_enetc_map,
-	.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_IOVA_AS_VA,
+	.drv_flags = RTE_PCI_DRV_NEED_MAPPING,
 	.probe = enetc_pci_probe,
 	.remove = enetc_pci_remove,
 };
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 631e2430d..a31a38725 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #include <stdbool.h>
@@ -64,7 +64,7 @@ enetc_xmit_pkts(void *tx_queue,
 		txbd->buf_len = txbd->frm_len;
 		txbd->flags = rte_cpu_to_le_16(ENETC_TXBD_FLAGS_F);
 		txbd->addr = (uint64_t)(uintptr_t)
-		rte_cpu_to_le_64((size_t)tx_swbd->buffer_addr->buf_addr +
+		rte_cpu_to_le_64((size_t)tx_swbd->buffer_addr->buf_iova +
 				 tx_swbd->buffer_addr->data_off);
 		i++;
 		start++;
@@ -91,7 +91,7 @@ enetc_refill_rx_ring(struct enetc_bdr *rx_ring, const int buff_cnt)
 		rx_swbd->buffer_addr =
 			rte_cpu_to_le_64(rte_mbuf_raw_alloc(rx_ring->mb_pool));
 		rxbd->w.addr = (uint64_t)(uintptr_t)
-			       rx_swbd->buffer_addr->buf_addr +
+			       rx_swbd->buffer_addr->buf_iova +
 			       rx_swbd->buffer_addr->data_off;
 		/* clear 'R" as well */
 		rxbd->r.lstatus = 0;
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 01/13] net/enetc: support physical addressing mode
  2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 01/13] net/enetc: support physical addressing mode Gagandeep Singh
@ 2019-04-12 12:28         ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:28 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Support added for physical addressing mode and
change driver flags to don't care.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 22 ++++++++++++----------
 drivers/net/enetc/enetc_rxtx.c   |  6 +++---
 2 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 023fe7517..7a9a97deb 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #include <stdbool.h>
@@ -334,14 +334,15 @@ static void
 enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
 {
 	int idx = tx_ring->index;
-	uintptr_t base_addr;
 	uint32_t tbmr;
+	phys_addr_t bd_address;
 
-	base_addr = (uintptr_t)tx_ring->bd_base;
+	bd_address = (phys_addr_t)
+		     rte_mem_virt2iova((const void *)tx_ring->bd_base);
 	enetc_txbdr_wr(hw, idx, ENETC_TBBAR0,
-		       lower_32_bits((uint64_t)base_addr));
+		       lower_32_bits((uint64_t)bd_address));
 	enetc_txbdr_wr(hw, idx, ENETC_TBBAR1,
-		       upper_32_bits((uint64_t)base_addr));
+		       upper_32_bits((uint64_t)bd_address));
 	enetc_txbdr_wr(hw, idx, ENETC_TBLENR,
 		       ENETC_RTBLENR_LEN(tx_ring->bd_count));
 
@@ -478,14 +479,15 @@ enetc_setup_rxbdr(struct enetc_hw *hw, struct enetc_bdr *rx_ring,
 		  struct rte_mempool *mb_pool)
 {
 	int idx = rx_ring->index;
-	uintptr_t base_addr;
 	uint16_t buf_size;
+	phys_addr_t bd_address;
 
-	base_addr = (uintptr_t)rx_ring->bd_base;
+	bd_address = (phys_addr_t)
+		     rte_mem_virt2iova((const void *)rx_ring->bd_base);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBAR0,
-		       lower_32_bits((uint64_t)base_addr));
+		       lower_32_bits((uint64_t)bd_address));
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBAR1,
-		       upper_32_bits((uint64_t)base_addr));
+		       upper_32_bits((uint64_t)bd_address));
 	enetc_rxbdr_wr(hw, idx, ENETC_RBLENR,
 		       ENETC_RTBLENR_LEN(rx_ring->bd_count));
 
@@ -612,7 +614,7 @@ enetc_pci_remove(struct rte_pci_device *pci_dev)
 
 static struct rte_pci_driver rte_enetc_pmd = {
 	.id_table = pci_id_enetc_map,
-	.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_IOVA_AS_VA,
+	.drv_flags = RTE_PCI_DRV_NEED_MAPPING,
 	.probe = enetc_pci_probe,
 	.remove = enetc_pci_remove,
 };
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 631e2430d..a31a38725 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #include <stdbool.h>
@@ -64,7 +64,7 @@ enetc_xmit_pkts(void *tx_queue,
 		txbd->buf_len = txbd->frm_len;
 		txbd->flags = rte_cpu_to_le_16(ENETC_TXBD_FLAGS_F);
 		txbd->addr = (uint64_t)(uintptr_t)
-		rte_cpu_to_le_64((size_t)tx_swbd->buffer_addr->buf_addr +
+		rte_cpu_to_le_64((size_t)tx_swbd->buffer_addr->buf_iova +
 				 tx_swbd->buffer_addr->data_off);
 		i++;
 		start++;
@@ -91,7 +91,7 @@ enetc_refill_rx_ring(struct enetc_bdr *rx_ring, const int buff_cnt)
 		rx_swbd->buffer_addr =
 			rte_cpu_to_le_64(rte_mbuf_raw_alloc(rx_ring->mb_pool));
 		rxbd->w.addr = (uint64_t)(uintptr_t)
-			       rx_swbd->buffer_addr->buf_addr +
+			       rx_swbd->buffer_addr->buf_iova +
 			       rx_swbd->buffer_addr->data_off;
 		/* clear 'R" as well */
 		rxbd->r.lstatus = 0;
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 02/13] net/enetc: fix SMMU unhandled context fault
  2019-04-12 12:28     ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
  2019-04-12 12:28       ` Gagandeep Singh
  2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 01/13] net/enetc: support physical addressing mode Gagandeep Singh
@ 2019-04-12 12:28       ` Gagandeep Singh
  2019-04-12 12:28         ` Gagandeep Singh
  2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 03/13] net/enetc: fix big endian build and correct buffer allocation Gagandeep Singh
                         ` (11 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:28 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh, stable

First configure ring with BDs properly then enable
the ring.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: stable@dpdk.org

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 7a9a97deb..f1807b901 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -492,15 +492,15 @@ enetc_setup_rxbdr(struct enetc_hw *hw, struct enetc_bdr *rx_ring,
 		       ENETC_RTBLENR_LEN(rx_ring->bd_count));
 
 	rx_ring->mb_pool = mb_pool;
-	/* enable ring */
-	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
-	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 	rx_ring->rcir = (void *)((size_t)hw->reg +
 			ENETC_BDR(RX, idx, ENETC_RBCIR));
 	enetc_refill_rx_ring(rx_ring, (enetc_bd_unused(rx_ring)));
 	buf_size = (uint16_t)(rte_pktmbuf_data_room_size(rx_ring->mb_pool) -
 		   RTE_PKTMBUF_HEADROOM);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBSR, buf_size);
+	/* enable ring */
+	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
+	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 }
 
 static int
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 02/13] net/enetc: fix SMMU unhandled context fault
  2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 02/13] net/enetc: fix SMMU unhandled context fault Gagandeep Singh
@ 2019-04-12 12:28         ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:28 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh, stable

First configure ring with BDs properly then enable
the ring.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: stable@dpdk.org

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 7a9a97deb..f1807b901 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -492,15 +492,15 @@ enetc_setup_rxbdr(struct enetc_hw *hw, struct enetc_bdr *rx_ring,
 		       ENETC_RTBLENR_LEN(rx_ring->bd_count));
 
 	rx_ring->mb_pool = mb_pool;
-	/* enable ring */
-	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
-	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 	rx_ring->rcir = (void *)((size_t)hw->reg +
 			ENETC_BDR(RX, idx, ENETC_RBCIR));
 	enetc_refill_rx_ring(rx_ring, (enetc_bd_unused(rx_ring)));
 	buf_size = (uint16_t)(rte_pktmbuf_data_room_size(rx_ring->mb_pool) -
 		   RTE_PKTMBUF_HEADROOM);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBSR, buf_size);
+	/* enable ring */
+	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
+	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 }
 
 static int
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 03/13] net/enetc: fix big endian build and correct buffer allocation
  2019-04-12 12:28     ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                         ` (2 preceding siblings ...)
  2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 02/13] net/enetc: fix SMMU unhandled context fault Gagandeep Singh
@ 2019-04-12 12:28       ` Gagandeep Singh
  2019-04-12 12:28         ` Gagandeep Singh
  2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 04/13] net/enetc: set interface mode for SXGMII Gagandeep Singh
                         ` (10 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:28 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh, stable

There was an error at rte_constant_bswap64 while compiling
with big endian toolchain. so fixing it by adding type cast.

Also, rte_pktmbuf_alloc API should be used to allocate mbuf
instead of rte_pktmbuf_raw_alloc to avoid use of stale mbuf
information.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: stable@dpdk.org

Suggested-by: Thomas Monjalon <thomas@monjalon.net>
Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_rxtx.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index a31a38725..42f16cab1 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -88,8 +88,9 @@ enetc_refill_rx_ring(struct enetc_bdr *rx_ring, const int buff_cnt)
 	rx_swbd = &rx_ring->q_swbd[i];
 	rxbd = ENETC_RXBD(*rx_ring, i);
 	for (j = 0; j < buff_cnt; j++) {
-		rx_swbd->buffer_addr =
-			rte_cpu_to_le_64(rte_mbuf_raw_alloc(rx_ring->mb_pool));
+		rx_swbd->buffer_addr = (void *)(uintptr_t)
+			rte_cpu_to_le_64((uint64_t)(uintptr_t)
+					rte_pktmbuf_alloc(rx_ring->mb_pool));
 		rxbd->w.addr = (uint64_t)(uintptr_t)
 			       rx_swbd->buffer_addr->buf_iova +
 			       rx_swbd->buffer_addr->data_off;
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 03/13] net/enetc: fix big endian build and correct buffer allocation
  2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 03/13] net/enetc: fix big endian build and correct buffer allocation Gagandeep Singh
@ 2019-04-12 12:28         ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:28 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh, stable

There was an error at rte_constant_bswap64 while compiling
with big endian toolchain. so fixing it by adding type cast.

Also, rte_pktmbuf_alloc API should be used to allocate mbuf
instead of rte_pktmbuf_raw_alloc to avoid use of stale mbuf
information.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: stable@dpdk.org

Suggested-by: Thomas Monjalon <thomas@monjalon.net>
Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_rxtx.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index a31a38725..42f16cab1 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -88,8 +88,9 @@ enetc_refill_rx_ring(struct enetc_bdr *rx_ring, const int buff_cnt)
 	rx_swbd = &rx_ring->q_swbd[i];
 	rxbd = ENETC_RXBD(*rx_ring, i);
 	for (j = 0; j < buff_cnt; j++) {
-		rx_swbd->buffer_addr =
-			rte_cpu_to_le_64(rte_mbuf_raw_alloc(rx_ring->mb_pool));
+		rx_swbd->buffer_addr = (void *)(uintptr_t)
+			rte_cpu_to_le_64((uint64_t)(uintptr_t)
+					rte_pktmbuf_alloc(rx_ring->mb_pool));
 		rxbd->w.addr = (uint64_t)(uintptr_t)
 			       rx_swbd->buffer_addr->buf_iova +
 			       rx_swbd->buffer_addr->data_off;
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 04/13] net/enetc: set interface mode for SXGMII
  2019-04-12 12:28     ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                         ` (3 preceding siblings ...)
  2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 03/13] net/enetc: fix big endian build and correct buffer allocation Gagandeep Singh
@ 2019-04-12 12:28       ` Gagandeep Singh
  2019-04-12 12:28         ` Gagandeep Singh
  2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 05/13] net/enetc: add basic statistics Gagandeep Singh
                         ` (9 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:28 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Support for SXGMII port has been enabled. It will
depends on boot loader information passed through IERB.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/base/enetc_hw.h | 13 ++++++++++++-
 drivers/net/enetc/enetc_ethdev.c  | 11 +++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index f36fa11e0..e3738a695 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #ifndef _ENETC_HW_H_
@@ -84,6 +84,12 @@ enum enetc_bdr_type {TX, RX};
 #define ENETC_PSIPMAR1(n)		(0x00104 + (n) * 0x20)
 #define ENETC_PCAPR0			0x00900
 #define ENETC_PCAPR1			0x00904
+#define ENETC_PM0_IF_MODE		0x8300
+#define ENETC_PM1_IF_MODE		0x9300
+#define ENETC_PMO_IFM_RG		BIT(2)
+#define ENETC_PM0_IFM_RLP		(BIT(5) | BIT(11))
+#define ENETC_PM0_IFM_RGAUTO		(BIT(15) | ENETC_PMO_IFM_RG | BIT(1))
+#define ENETC_PM0_IFM_XGMII		BIT(12)
 
 #define ENETC_PV0CFGR(n)		(0x00920 + (n) * 0x10)
 #define ENETC_PVCFGR_SET_TXBDR(val)	((val) & 0xff)
@@ -109,6 +115,11 @@ enum enetc_bdr_type {TX, RX};
 #define ENETC_G_EIPBRR0			0x00bf8
 #define ENETC_G_EIPBRR1			0x00bfc
 
+
+/* MAC Counters */
+#define ENETC_G_EPFBLPR(n)		(0xd00 + 4 * (n))
+#define ENETC_G_EPFBLPR1_XGMII		0x80000000
+
 /* general register accessors */
 #define enetc_rd_reg(reg)	rte_read32((void *)(reg))
 #define enetc_wr_reg(reg, val)	rte_write32((val), (void *)(reg))
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index f1807b901..91e9692d6 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -139,6 +139,17 @@ enetc_dev_start(struct rte_eth_dev *dev)
 	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
 			val | ENETC_PMR_EN);
 
+	/* set auto-speed for RGMII */
+	if (enetc_port_rd(&hw->hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
+		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+	}
+	if (enetc_global_rd(&hw->hw,
+			    ENETC_G_EPFBLPR(1)) == ENETC_G_EPFBLPR1_XGMII) {
+		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_XGMII);
+	}
+
 	return 0;
 }
 
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 04/13] net/enetc: set interface mode for SXGMII
  2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 04/13] net/enetc: set interface mode for SXGMII Gagandeep Singh
@ 2019-04-12 12:28         ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:28 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Support for SXGMII port has been enabled. It will
depends on boot loader information passed through IERB.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/base/enetc_hw.h | 13 ++++++++++++-
 drivers/net/enetc/enetc_ethdev.c  | 11 +++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index f36fa11e0..e3738a695 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #ifndef _ENETC_HW_H_
@@ -84,6 +84,12 @@ enum enetc_bdr_type {TX, RX};
 #define ENETC_PSIPMAR1(n)		(0x00104 + (n) * 0x20)
 #define ENETC_PCAPR0			0x00900
 #define ENETC_PCAPR1			0x00904
+#define ENETC_PM0_IF_MODE		0x8300
+#define ENETC_PM1_IF_MODE		0x9300
+#define ENETC_PMO_IFM_RG		BIT(2)
+#define ENETC_PM0_IFM_RLP		(BIT(5) | BIT(11))
+#define ENETC_PM0_IFM_RGAUTO		(BIT(15) | ENETC_PMO_IFM_RG | BIT(1))
+#define ENETC_PM0_IFM_XGMII		BIT(12)
 
 #define ENETC_PV0CFGR(n)		(0x00920 + (n) * 0x10)
 #define ENETC_PVCFGR_SET_TXBDR(val)	((val) & 0xff)
@@ -109,6 +115,11 @@ enum enetc_bdr_type {TX, RX};
 #define ENETC_G_EIPBRR0			0x00bf8
 #define ENETC_G_EIPBRR1			0x00bfc
 
+
+/* MAC Counters */
+#define ENETC_G_EPFBLPR(n)		(0xd00 + 4 * (n))
+#define ENETC_G_EPFBLPR1_XGMII		0x80000000
+
 /* general register accessors */
 #define enetc_rd_reg(reg)	rte_read32((void *)(reg))
 #define enetc_wr_reg(reg, val)	rte_write32((val), (void *)(reg))
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index f1807b901..91e9692d6 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -139,6 +139,17 @@ enetc_dev_start(struct rte_eth_dev *dev)
 	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
 			val | ENETC_PMR_EN);
 
+	/* set auto-speed for RGMII */
+	if (enetc_port_rd(&hw->hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
+		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+	}
+	if (enetc_global_rd(&hw->hw,
+			    ENETC_G_EPFBLPR(1)) == ENETC_G_EPFBLPR1_XGMII) {
+		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_XGMII);
+	}
+
 	return 0;
 }
 
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 05/13] net/enetc: add basic statistics
  2019-04-12 12:28     ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                         ` (4 preceding siblings ...)
  2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 04/13] net/enetc: set interface mode for SXGMII Gagandeep Singh
@ 2019-04-12 12:28       ` Gagandeep Singh
  2019-04-12 12:28         ` Gagandeep Singh
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 06/13] net/enetc: replace register read/write macros with functions Gagandeep Singh
                         ` (8 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:28 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Enable basic statistics APIs enetc_stats_get
and enetc_stats_reset.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  1 +
 drivers/net/enetc/base/enetc_hw.h  | 27 +++++++++++++++++++-
 drivers/net/enetc/enetc_ethdev.c   | 41 ++++++++++++++++++++++++++++++
 4 files changed, 69 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 8038bf205..9f575d27f 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -46,6 +46,7 @@ ENETC Features
 
 - Link Status
 - Packet type information
+- Basic stats
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 69476a2a1..d8bd5679d 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -6,6 +6,7 @@
 [Features]
 Packet type parsing  = Y
 Link status          = Y
+Basic stats          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index e3738a695..3f0a2a9a3 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -115,8 +115,33 @@ enum enetc_bdr_type {TX, RX};
 #define ENETC_G_EIPBRR0			0x00bf8
 #define ENETC_G_EIPBRR1			0x00bfc
 
-
 /* MAC Counters */
+/* Config register to reset counters*/
+#define ENETC_PM0_STAT_CONFIG		0x080E0
+/* Receive frames counter without error */
+#define ENETC_PM0_RFRM			0x08120
+/* Receive packets counter, good + bad */
+#define ENETC_PM0_RPKT			0x08160
+/* Received octets, good + bad */
+#define ENETC_PM0_REOCT			0x08120
+/* Transmit octets, good + bad */
+#define ENETC_PM0_TEOCT			0x08200
+/* Transmit frames counter without error */
+#define ENETC_PM0_TFRM			0x08220
+/* Transmit packets counter, good + bad */
+#define ENETC_PM0_TPKT			0x08260
+/* Dropped not Truncated packets counter */
+#define ENETC_PM0_RDRNTP		0x081C8
+/* Dropped + trucated packets counter */
+#define ENETC_PM0_RDRP			0x08158
+/* Receive packets error counter */
+#define ENETC_PM0_RERR			0x08138
+/* Transmit packets error counter */
+#define ENETC_PM0_TERR			0x08238
+
+/* Stats Reset Bit*/
+#define ENETC_CLEAR_STATS		BIT(2)
+
 #define ENETC_G_EPFBLPR(n)		(0xd00 + 4 * (n))
 #define ENETC_G_EPFBLPR1_XGMII		0x80000000
 
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 91e9692d6..10b2b396d 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -29,6 +29,9 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		const struct rte_eth_txconf *tx_conf);
 static void enetc_tx_queue_release(void *txq);
 static const uint32_t *enetc_supported_ptypes_get(struct rte_eth_dev *dev);
+static int enetc_stats_get(struct rte_eth_dev *dev,
+		struct rte_eth_stats *stats);
+static void enetc_stats_reset(struct rte_eth_dev *dev);
 
 /*
  * The set of PCI devices this driver supports
@@ -46,6 +49,8 @@ static const struct eth_dev_ops enetc_ops = {
 	.dev_stop             = enetc_dev_stop,
 	.dev_close            = enetc_dev_close,
 	.link_update          = enetc_link_update,
+	.stats_get            = enetc_stats_get,
+	.stats_reset          = enetc_stats_reset,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
@@ -608,6 +613,42 @@ enetc_rx_queue_release(void *rxq)
 	rte_free(rx_ring);
 }
 
+static
+int enetc_stats_get(struct rte_eth_dev *dev,
+		    struct rte_eth_stats *stats)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	/* Total received packets, bad + good, if we want to get counters of
+	 * only good received packets then use ENETC_PM0_RFRM,
+	 * ENETC_PM0_TFRM registers.
+	 */
+	stats->ipackets = enetc_port_rd(enetc_hw, ENETC_PM0_RPKT);
+	stats->opackets = enetc_port_rd(enetc_hw, ENETC_PM0_TPKT);
+	stats->ibytes =  enetc_port_rd(enetc_hw, ENETC_PM0_REOCT);
+	stats->obytes = enetc_port_rd(enetc_hw, ENETC_PM0_TEOCT);
+	/* Dropped + Truncated packets, use ENETC_PM0_RDRNTP for without
+	 * truncated packets
+	 */
+	stats->imissed = enetc_port_rd(enetc_hw, ENETC_PM0_RDRP);
+	stats->ierrors = enetc_port_rd(enetc_hw, ENETC_PM0_RERR);
+	stats->oerrors = enetc_port_rd(enetc_hw, ENETC_PM0_TERR);
+
+	return 0;
+}
+
+static void
+enetc_stats_reset(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	enetc_port_wr(enetc_hw, ENETC_PM0_STAT_CONFIG, ENETC_CLEAR_STATS);
+}
+
 static int
 enetc_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 			   struct rte_pci_device *pci_dev)
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 05/13] net/enetc: add basic statistics
  2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 05/13] net/enetc: add basic statistics Gagandeep Singh
@ 2019-04-12 12:28         ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:28 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Enable basic statistics APIs enetc_stats_get
and enetc_stats_reset.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  1 +
 drivers/net/enetc/base/enetc_hw.h  | 27 +++++++++++++++++++-
 drivers/net/enetc/enetc_ethdev.c   | 41 ++++++++++++++++++++++++++++++
 4 files changed, 69 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 8038bf205..9f575d27f 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -46,6 +46,7 @@ ENETC Features
 
 - Link Status
 - Packet type information
+- Basic stats
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 69476a2a1..d8bd5679d 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -6,6 +6,7 @@
 [Features]
 Packet type parsing  = Y
 Link status          = Y
+Basic stats          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index e3738a695..3f0a2a9a3 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -115,8 +115,33 @@ enum enetc_bdr_type {TX, RX};
 #define ENETC_G_EIPBRR0			0x00bf8
 #define ENETC_G_EIPBRR1			0x00bfc
 
-
 /* MAC Counters */
+/* Config register to reset counters*/
+#define ENETC_PM0_STAT_CONFIG		0x080E0
+/* Receive frames counter without error */
+#define ENETC_PM0_RFRM			0x08120
+/* Receive packets counter, good + bad */
+#define ENETC_PM0_RPKT			0x08160
+/* Received octets, good + bad */
+#define ENETC_PM0_REOCT			0x08120
+/* Transmit octets, good + bad */
+#define ENETC_PM0_TEOCT			0x08200
+/* Transmit frames counter without error */
+#define ENETC_PM0_TFRM			0x08220
+/* Transmit packets counter, good + bad */
+#define ENETC_PM0_TPKT			0x08260
+/* Dropped not Truncated packets counter */
+#define ENETC_PM0_RDRNTP		0x081C8
+/* Dropped + trucated packets counter */
+#define ENETC_PM0_RDRP			0x08158
+/* Receive packets error counter */
+#define ENETC_PM0_RERR			0x08138
+/* Transmit packets error counter */
+#define ENETC_PM0_TERR			0x08238
+
+/* Stats Reset Bit*/
+#define ENETC_CLEAR_STATS		BIT(2)
+
 #define ENETC_G_EPFBLPR(n)		(0xd00 + 4 * (n))
 #define ENETC_G_EPFBLPR1_XGMII		0x80000000
 
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 91e9692d6..10b2b396d 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -29,6 +29,9 @@ static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		const struct rte_eth_txconf *tx_conf);
 static void enetc_tx_queue_release(void *txq);
 static const uint32_t *enetc_supported_ptypes_get(struct rte_eth_dev *dev);
+static int enetc_stats_get(struct rte_eth_dev *dev,
+		struct rte_eth_stats *stats);
+static void enetc_stats_reset(struct rte_eth_dev *dev);
 
 /*
  * The set of PCI devices this driver supports
@@ -46,6 +49,8 @@ static const struct eth_dev_ops enetc_ops = {
 	.dev_stop             = enetc_dev_stop,
 	.dev_close            = enetc_dev_close,
 	.link_update          = enetc_link_update,
+	.stats_get            = enetc_stats_get,
+	.stats_reset          = enetc_stats_reset,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
@@ -608,6 +613,42 @@ enetc_rx_queue_release(void *rxq)
 	rte_free(rx_ring);
 }
 
+static
+int enetc_stats_get(struct rte_eth_dev *dev,
+		    struct rte_eth_stats *stats)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	/* Total received packets, bad + good, if we want to get counters of
+	 * only good received packets then use ENETC_PM0_RFRM,
+	 * ENETC_PM0_TFRM registers.
+	 */
+	stats->ipackets = enetc_port_rd(enetc_hw, ENETC_PM0_RPKT);
+	stats->opackets = enetc_port_rd(enetc_hw, ENETC_PM0_TPKT);
+	stats->ibytes =  enetc_port_rd(enetc_hw, ENETC_PM0_REOCT);
+	stats->obytes = enetc_port_rd(enetc_hw, ENETC_PM0_TEOCT);
+	/* Dropped + Truncated packets, use ENETC_PM0_RDRNTP for without
+	 * truncated packets
+	 */
+	stats->imissed = enetc_port_rd(enetc_hw, ENETC_PM0_RDRP);
+	stats->ierrors = enetc_port_rd(enetc_hw, ENETC_PM0_RERR);
+	stats->oerrors = enetc_port_rd(enetc_hw, ENETC_PM0_TERR);
+
+	return 0;
+}
+
+static void
+enetc_stats_reset(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	enetc_port_wr(enetc_hw, ENETC_PM0_STAT_CONFIG, ENETC_CLEAR_STATS);
+}
+
 static int
 enetc_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 			   struct rte_pci_device *pci_dev)
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 06/13] net/enetc: replace register read/write macros with functions
  2019-04-12 12:28     ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                         ` (5 preceding siblings ...)
  2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 05/13] net/enetc: add basic statistics Gagandeep Singh
@ 2019-04-12 12:29       ` Gagandeep Singh
  2019-04-12 12:29         ` Gagandeep Singh
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 07/13] net/enetc: remove forward declarations Gagandeep Singh
                         ` (7 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:29 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Replacing read-write macros with already available
read-write functions.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc.h        |  7 +---
 drivers/net/enetc/enetc_ethdev.c | 61 ++++++++++++++++----------------
 2 files changed, 31 insertions(+), 37 deletions(-)

diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index 0e80d1c5b..56454dc9d 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #ifndef _ENETC_H_
@@ -86,11 +86,6 @@ struct enetc_eth_adapter {
 #define ENETC_DEV_PRIVATE_TO_INTR(adapter) \
 	(&((struct enetc_eth_adapter *)adapter)->intr)
 
-#define ENETC_GET_HW_ADDR(reg, addr) ((void *)(((size_t)reg) + (addr)))
-#define ENETC_REG_READ(addr) (*(uint32_t *)addr)
-#define ENETC_REG_WRITE(addr, val) (*(uint32_t *)addr = val)
-#define ENETC_REG_WRITE_RELAXED(addr, val) (*(uint32_t *)addr = val)
-
 /*
  * RX/TX ENETC function prototypes
  */
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 10b2b396d..2d8c4e604 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -131,28 +131,31 @@ enetc_dev_start(struct rte_eth_dev *dev)
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	uint32_t val;
 
 	PMD_INIT_FUNC_TRACE();
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-			     ENETC_PM0_CMD_CFG));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PM0_CMD_CFG),
-			val | ENETC_PM0_TX_EN | ENETC_PM0_RX_EN);
+	val = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+	enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG,
+		      val | ENETC_PM0_TX_EN | ENETC_PM0_RX_EN);
 
 	/* Enable port */
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
-			val | ENETC_PMR_EN);
+	val = enetc_port_rd(enetc_hw, ENETC_PMR);
+	enetc_port_wr(enetc_hw, ENETC_PMR, val | ENETC_PMR_EN);
 
 	/* set auto-speed for RGMII */
-	if (enetc_port_rd(&hw->hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
-		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_RGAUTO);
-		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+	if (enetc_port_rd(enetc_hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
+		enetc_port_wr(enetc_hw, ENETC_PM0_IF_MODE,
+			      ENETC_PM0_IFM_RGAUTO);
+		enetc_port_wr(enetc_hw, ENETC_PM1_IF_MODE,
+			      ENETC_PM0_IFM_RGAUTO);
 	}
-	if (enetc_global_rd(&hw->hw,
+	if (enetc_global_rd(enetc_hw,
 			    ENETC_G_EPFBLPR(1)) == ENETC_G_EPFBLPR1_XGMII) {
-		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_XGMII);
-		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(enetc_hw, ENETC_PM0_IF_MODE,
+			      ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(enetc_hw, ENETC_PM1_IF_MODE,
+			      ENETC_PM0_IFM_XGMII);
 	}
 
 	return 0;
@@ -163,18 +166,17 @@ enetc_dev_stop(struct rte_eth_dev *dev)
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	uint32_t val;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Disable port */
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
-			val & (~ENETC_PMR_EN));
-
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-			     ENETC_PM0_CMD_CFG));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PM0_CMD_CFG),
-			val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
+	val = enetc_port_rd(enetc_hw, ENETC_PMR);
+	enetc_port_wr(enetc_hw, ENETC_PMR, val & (~ENETC_PMR_EN));
+
+	val = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+	enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG,
+		      val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
 }
 
 static void
@@ -221,6 +223,7 @@ enetc_link_update(struct rte_eth_dev *dev, int wait_to_complete __rte_unused)
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	struct rte_eth_link link;
 	uint32_t status;
 
@@ -228,8 +231,7 @@ enetc_link_update(struct rte_eth_dev *dev, int wait_to_complete __rte_unused)
 
 	memset(&link, 0, sizeof(link));
 
-	status = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-				ENETC_PM0_STATUS));
+	status = enetc_port_rd(enetc_hw, ENETC_PM0_STATUS);
 
 	if (status & ENETC_LINK_MODE)
 		link.link_duplex = ETH_LINK_FULL_DUPLEX;
@@ -262,6 +264,7 @@ static int
 enetc_hardware_init(struct enetc_eth_hw *hw)
 {
 	uint32_t psipmr = 0;
+	struct enetc_hw *enetc_hw = &hw->hw;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Calculating and storing the base HW addresses */
@@ -269,8 +272,7 @@ enetc_hardware_init(struct enetc_eth_hw *hw)
 	hw->hw.global = (void *)((size_t)hw->hw.reg + ENETC_GLOBAL_BASE);
 
 	/* Enabling Station Interface */
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.reg, ENETC_SIMR),
-					  ENETC_SIMR_EN);
+	enetc_wr(enetc_hw, ENETC_SIMR, ENETC_SIMR_EN);
 
 	/* Setting to accept broadcast packets for each inetrface */
 	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0) |
@@ -280,14 +282,11 @@ enetc_hardware_init(struct enetc_eth_hw *hw)
 	psipmr |= ENETC_PSIPMR_SET_UP(2) | ENETC_PSIPMR_SET_MP(2) |
 		  ENETC_PSIPMR_SET_VLAN_MP(2);
 
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMR),
-			psipmr);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
 
 	/* Enabling broadcast address */
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMAR0(0)),
-			0xFFFFFFFF);
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMAR1(0)),
-			0xFFFF << 16);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMAR0(0), 0xFFFFFFFF);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMAR1(0), 0xFFFF << 16);
 
 	return 0;
 }
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 06/13] net/enetc: replace register read/write macros with functions
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 06/13] net/enetc: replace register read/write macros with functions Gagandeep Singh
@ 2019-04-12 12:29         ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:29 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Replacing read-write macros with already available
read-write functions.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc.h        |  7 +---
 drivers/net/enetc/enetc_ethdev.c | 61 ++++++++++++++++----------------
 2 files changed, 31 insertions(+), 37 deletions(-)

diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index 0e80d1c5b..56454dc9d 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018-2019 NXP
  */
 
 #ifndef _ENETC_H_
@@ -86,11 +86,6 @@ struct enetc_eth_adapter {
 #define ENETC_DEV_PRIVATE_TO_INTR(adapter) \
 	(&((struct enetc_eth_adapter *)adapter)->intr)
 
-#define ENETC_GET_HW_ADDR(reg, addr) ((void *)(((size_t)reg) + (addr)))
-#define ENETC_REG_READ(addr) (*(uint32_t *)addr)
-#define ENETC_REG_WRITE(addr, val) (*(uint32_t *)addr = val)
-#define ENETC_REG_WRITE_RELAXED(addr, val) (*(uint32_t *)addr = val)
-
 /*
  * RX/TX ENETC function prototypes
  */
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 10b2b396d..2d8c4e604 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -131,28 +131,31 @@ enetc_dev_start(struct rte_eth_dev *dev)
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	uint32_t val;
 
 	PMD_INIT_FUNC_TRACE();
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-			     ENETC_PM0_CMD_CFG));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PM0_CMD_CFG),
-			val | ENETC_PM0_TX_EN | ENETC_PM0_RX_EN);
+	val = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+	enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG,
+		      val | ENETC_PM0_TX_EN | ENETC_PM0_RX_EN);
 
 	/* Enable port */
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
-			val | ENETC_PMR_EN);
+	val = enetc_port_rd(enetc_hw, ENETC_PMR);
+	enetc_port_wr(enetc_hw, ENETC_PMR, val | ENETC_PMR_EN);
 
 	/* set auto-speed for RGMII */
-	if (enetc_port_rd(&hw->hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
-		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_RGAUTO);
-		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_RGAUTO);
+	if (enetc_port_rd(enetc_hw, ENETC_PM0_IF_MODE) & ENETC_PMO_IFM_RG) {
+		enetc_port_wr(enetc_hw, ENETC_PM0_IF_MODE,
+			      ENETC_PM0_IFM_RGAUTO);
+		enetc_port_wr(enetc_hw, ENETC_PM1_IF_MODE,
+			      ENETC_PM0_IFM_RGAUTO);
 	}
-	if (enetc_global_rd(&hw->hw,
+	if (enetc_global_rd(enetc_hw,
 			    ENETC_G_EPFBLPR(1)) == ENETC_G_EPFBLPR1_XGMII) {
-		enetc_port_wr(&hw->hw, ENETC_PM0_IF_MODE, ENETC_PM0_IFM_XGMII);
-		enetc_port_wr(&hw->hw, ENETC_PM1_IF_MODE, ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(enetc_hw, ENETC_PM0_IF_MODE,
+			      ENETC_PM0_IFM_XGMII);
+		enetc_port_wr(enetc_hw, ENETC_PM1_IF_MODE,
+			      ENETC_PM0_IFM_XGMII);
 	}
 
 	return 0;
@@ -163,18 +166,17 @@ enetc_dev_stop(struct rte_eth_dev *dev)
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	uint32_t val;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Disable port */
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PMR),
-			val & (~ENETC_PMR_EN));
-
-	val = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-			     ENETC_PM0_CMD_CFG));
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PM0_CMD_CFG),
-			val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
+	val = enetc_port_rd(enetc_hw, ENETC_PMR);
+	enetc_port_wr(enetc_hw, ENETC_PMR, val & (~ENETC_PMR_EN));
+
+	val = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+	enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG,
+		      val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
 }
 
 static void
@@ -221,6 +223,7 @@ enetc_link_update(struct rte_eth_dev *dev, int wait_to_complete __rte_unused)
 {
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
 	struct rte_eth_link link;
 	uint32_t status;
 
@@ -228,8 +231,7 @@ enetc_link_update(struct rte_eth_dev *dev, int wait_to_complete __rte_unused)
 
 	memset(&link, 0, sizeof(link));
 
-	status = ENETC_REG_READ(ENETC_GET_HW_ADDR(hw->hw.port,
-				ENETC_PM0_STATUS));
+	status = enetc_port_rd(enetc_hw, ENETC_PM0_STATUS);
 
 	if (status & ENETC_LINK_MODE)
 		link.link_duplex = ETH_LINK_FULL_DUPLEX;
@@ -262,6 +264,7 @@ static int
 enetc_hardware_init(struct enetc_eth_hw *hw)
 {
 	uint32_t psipmr = 0;
+	struct enetc_hw *enetc_hw = &hw->hw;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Calculating and storing the base HW addresses */
@@ -269,8 +272,7 @@ enetc_hardware_init(struct enetc_eth_hw *hw)
 	hw->hw.global = (void *)((size_t)hw->hw.reg + ENETC_GLOBAL_BASE);
 
 	/* Enabling Station Interface */
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.reg, ENETC_SIMR),
-					  ENETC_SIMR_EN);
+	enetc_wr(enetc_hw, ENETC_SIMR, ENETC_SIMR_EN);
 
 	/* Setting to accept broadcast packets for each inetrface */
 	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0) |
@@ -280,14 +282,11 @@ enetc_hardware_init(struct enetc_eth_hw *hw)
 	psipmr |= ENETC_PSIPMR_SET_UP(2) | ENETC_PSIPMR_SET_MP(2) |
 		  ENETC_PSIPMR_SET_VLAN_MP(2);
 
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMR),
-			psipmr);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
 
 	/* Enabling broadcast address */
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMAR0(0)),
-			0xFFFFFFFF);
-	ENETC_REG_WRITE(ENETC_GET_HW_ADDR(hw->hw.port, ENETC_PSIPMAR1(0)),
-			0xFFFF << 16);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMAR0(0), 0xFFFFFFFF);
+	enetc_port_wr(enetc_hw, ENETC_PSIPMAR1(0), 0xFFFF << 16);
 
 	return 0;
 }
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 07/13] net/enetc: remove forward declarations
  2019-04-12 12:28     ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                         ` (6 preceding siblings ...)
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 06/13] net/enetc: replace register read/write macros with functions Gagandeep Singh
@ 2019-04-12 12:29       ` Gagandeep Singh
  2019-04-12 12:29         ` Gagandeep Singh
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 08/13] net/enetc: enable promiscuous and allmulticast feature Gagandeep Singh
                         ` (6 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:29 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Remove unneeded forward declarations and re-order the code.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 237 ++++++++++++++-----------------
 1 file changed, 107 insertions(+), 130 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 2d8c4e604..d0f9e2b35 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -10,115 +10,6 @@
 
 int enetc_logtype_pmd;
 
-/* Functions Prototypes */
-static int enetc_dev_configure(struct rte_eth_dev *dev);
-static int enetc_dev_start(struct rte_eth_dev *dev);
-static void enetc_dev_stop(struct rte_eth_dev *dev);
-static void enetc_dev_close(struct rte_eth_dev *dev);
-static void enetc_dev_infos_get(struct rte_eth_dev *dev,
-				struct rte_eth_dev_info *dev_info);
-static int enetc_link_update(struct rte_eth_dev *dev, int wait_to_complete);
-static int enetc_hardware_init(struct enetc_eth_hw *hw);
-static int enetc_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id,
-		uint16_t nb_rx_desc, unsigned int socket_id,
-		const struct rte_eth_rxconf *rx_conf,
-		struct rte_mempool *mb_pool);
-static void enetc_rx_queue_release(void *rxq);
-static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
-		uint16_t nb_tx_desc, unsigned int socket_id,
-		const struct rte_eth_txconf *tx_conf);
-static void enetc_tx_queue_release(void *txq);
-static const uint32_t *enetc_supported_ptypes_get(struct rte_eth_dev *dev);
-static int enetc_stats_get(struct rte_eth_dev *dev,
-		struct rte_eth_stats *stats);
-static void enetc_stats_reset(struct rte_eth_dev *dev);
-
-/*
- * The set of PCI devices this driver supports
- */
-static const struct rte_pci_id pci_id_enetc_map[] = {
-	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID) },
-	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID_VF) },
-	{ .vendor_id = 0, /* sentinel */ },
-};
-
-/* Features supported by this driver */
-static const struct eth_dev_ops enetc_ops = {
-	.dev_configure        = enetc_dev_configure,
-	.dev_start            = enetc_dev_start,
-	.dev_stop             = enetc_dev_stop,
-	.dev_close            = enetc_dev_close,
-	.link_update          = enetc_link_update,
-	.stats_get            = enetc_stats_get,
-	.stats_reset          = enetc_stats_reset,
-	.dev_infos_get        = enetc_dev_infos_get,
-	.rx_queue_setup       = enetc_rx_queue_setup,
-	.rx_queue_release     = enetc_rx_queue_release,
-	.tx_queue_setup       = enetc_tx_queue_setup,
-	.tx_queue_release     = enetc_tx_queue_release,
-	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
-};
-
-/**
- * Initialisation of the enetc device
- *
- * @param eth_dev
- *   - Pointer to the structure rte_eth_dev
- *
- * @return
- *   - On success, zero.
- *   - On failure, negative value.
- */
-static int
-enetc_dev_init(struct rte_eth_dev *eth_dev)
-{
-	int error = 0;
-	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
-	struct enetc_eth_hw *hw =
-		ENETC_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
-
-	PMD_INIT_FUNC_TRACE();
-	eth_dev->dev_ops = &enetc_ops;
-	eth_dev->rx_pkt_burst = &enetc_recv_pkts;
-	eth_dev->tx_pkt_burst = &enetc_xmit_pkts;
-
-	/* Retrieving and storing the HW base address of device */
-	hw->hw.reg = (void *)pci_dev->mem_resource[0].addr;
-	hw->device_id = pci_dev->id.device_id;
-
-	error = enetc_hardware_init(hw);
-	if (error != 0) {
-		ENETC_PMD_ERR("Hardware initialization failed");
-		return -1;
-	}
-
-	/* Allocate memory for storing MAC addresses */
-	eth_dev->data->mac_addrs = rte_zmalloc("enetc_eth", ETHER_ADDR_LEN, 0);
-	if (!eth_dev->data->mac_addrs) {
-		ENETC_PMD_ERR("Failed to allocate %d bytes needed to "
-			      "store MAC addresses",
-			      ETHER_ADDR_LEN * 1);
-		error = -ENOMEM;
-		return -1;
-	}
-
-	/* Copy the permanent MAC address */
-	ether_addr_copy((struct ether_addr *)hw->mac.addr,
-			&eth_dev->data->mac_addrs[0]);
-
-	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
-			eth_dev->data->port_id, pci_dev->id.vendor_id,
-			pci_dev->id.device_id);
-	return 0;
-}
-
-static int
-enetc_dev_uninit(struct rte_eth_dev *eth_dev __rte_unused)
-{
-	PMD_INIT_FUNC_TRACE();
-	return 0;
-}
-
 static int
 enetc_dev_configure(struct rte_eth_dev *dev __rte_unused)
 {
@@ -179,27 +70,6 @@ enetc_dev_stop(struct rte_eth_dev *dev)
 		      val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
 }
 
-static void
-enetc_dev_close(struct rte_eth_dev *dev)
-{
-	uint16_t i;
-
-	PMD_INIT_FUNC_TRACE();
-	enetc_dev_stop(dev);
-
-	for (i = 0; i < dev->data->nb_rx_queues; i++) {
-		enetc_rx_queue_release(dev->data->rx_queues[i]);
-		dev->data->rx_queues[i] = NULL;
-	}
-	dev->data->nb_rx_queues = 0;
-
-	for (i = 0; i < dev->data->nb_tx_queues; i++) {
-		enetc_tx_queue_release(dev->data->tx_queues[i]);
-		dev->data->tx_queues[i] = NULL;
-	}
-	dev->data->nb_tx_queues = 0;
-}
-
 static const uint32_t *
 enetc_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)
 {
@@ -648,6 +518,113 @@ enetc_stats_reset(struct rte_eth_dev *dev)
 	enetc_port_wr(enetc_hw, ENETC_PM0_STAT_CONFIG, ENETC_CLEAR_STATS);
 }
 
+static void
+enetc_dev_close(struct rte_eth_dev *dev)
+{
+	uint16_t i;
+
+	PMD_INIT_FUNC_TRACE();
+	enetc_dev_stop(dev);
+
+	for (i = 0; i < dev->data->nb_rx_queues; i++) {
+		enetc_rx_queue_release(dev->data->rx_queues[i]);
+		dev->data->rx_queues[i] = NULL;
+	}
+	dev->data->nb_rx_queues = 0;
+
+	for (i = 0; i < dev->data->nb_tx_queues; i++) {
+		enetc_tx_queue_release(dev->data->tx_queues[i]);
+		dev->data->tx_queues[i] = NULL;
+	}
+	dev->data->nb_tx_queues = 0;
+}
+
+/*
+ * The set of PCI devices this driver supports
+ */
+static const struct rte_pci_id pci_id_enetc_map[] = {
+	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID) },
+	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID_VF) },
+	{ .vendor_id = 0, /* sentinel */ },
+};
+
+/* Features supported by this driver */
+static const struct eth_dev_ops enetc_ops = {
+	.dev_configure        = enetc_dev_configure,
+	.dev_start            = enetc_dev_start,
+	.dev_stop             = enetc_dev_stop,
+	.dev_close            = enetc_dev_close,
+	.link_update          = enetc_link_update,
+	.stats_get            = enetc_stats_get,
+	.stats_reset          = enetc_stats_reset,
+	.dev_infos_get        = enetc_dev_infos_get,
+	.rx_queue_setup       = enetc_rx_queue_setup,
+	.rx_queue_release     = enetc_rx_queue_release,
+	.tx_queue_setup       = enetc_tx_queue_setup,
+	.tx_queue_release     = enetc_tx_queue_release,
+	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
+};
+
+/**
+ * Initialisation of the enetc device
+ *
+ * @param eth_dev
+ *   - Pointer to the structure rte_eth_dev
+ *
+ * @return
+ *   - On success, zero.
+ *   - On failure, negative value.
+ */
+static int
+enetc_dev_init(struct rte_eth_dev *eth_dev)
+{
+	int error = 0;
+	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
+
+	PMD_INIT_FUNC_TRACE();
+	eth_dev->dev_ops = &enetc_ops;
+	eth_dev->rx_pkt_burst = &enetc_recv_pkts;
+	eth_dev->tx_pkt_burst = &enetc_xmit_pkts;
+
+	/* Retrieving and storing the HW base address of device */
+	hw->hw.reg = (void *)pci_dev->mem_resource[0].addr;
+	hw->device_id = pci_dev->id.device_id;
+
+	error = enetc_hardware_init(hw);
+	if (error != 0) {
+		ENETC_PMD_ERR("Hardware initialization failed");
+		return -1;
+	}
+
+	/* Allocate memory for storing MAC addresses */
+	eth_dev->data->mac_addrs = rte_zmalloc("enetc_eth", ETHER_ADDR_LEN, 0);
+	if (!eth_dev->data->mac_addrs) {
+		ENETC_PMD_ERR("Failed to allocate %d bytes needed to "
+			      "store MAC addresses",
+			      ETHER_ADDR_LEN * 1);
+		error = -ENOMEM;
+		return -1;
+	}
+
+	/* Copy the permanent MAC address */
+	ether_addr_copy((struct ether_addr *)hw->mac.addr,
+			&eth_dev->data->mac_addrs[0]);
+
+	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
+			eth_dev->data->port_id, pci_dev->id.vendor_id,
+			pci_dev->id.device_id);
+	return 0;
+}
+
+static int
+enetc_dev_uninit(struct rte_eth_dev *eth_dev __rte_unused)
+{
+	PMD_INIT_FUNC_TRACE();
+	return 0;
+}
+
 static int
 enetc_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 			   struct rte_pci_device *pci_dev)
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 07/13] net/enetc: remove forward declarations
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 07/13] net/enetc: remove forward declarations Gagandeep Singh
@ 2019-04-12 12:29         ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:29 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Remove unneeded forward declarations and re-order the code.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_ethdev.c | 237 ++++++++++++++-----------------
 1 file changed, 107 insertions(+), 130 deletions(-)

diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 2d8c4e604..d0f9e2b35 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -10,115 +10,6 @@
 
 int enetc_logtype_pmd;
 
-/* Functions Prototypes */
-static int enetc_dev_configure(struct rte_eth_dev *dev);
-static int enetc_dev_start(struct rte_eth_dev *dev);
-static void enetc_dev_stop(struct rte_eth_dev *dev);
-static void enetc_dev_close(struct rte_eth_dev *dev);
-static void enetc_dev_infos_get(struct rte_eth_dev *dev,
-				struct rte_eth_dev_info *dev_info);
-static int enetc_link_update(struct rte_eth_dev *dev, int wait_to_complete);
-static int enetc_hardware_init(struct enetc_eth_hw *hw);
-static int enetc_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id,
-		uint16_t nb_rx_desc, unsigned int socket_id,
-		const struct rte_eth_rxconf *rx_conf,
-		struct rte_mempool *mb_pool);
-static void enetc_rx_queue_release(void *rxq);
-static int enetc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
-		uint16_t nb_tx_desc, unsigned int socket_id,
-		const struct rte_eth_txconf *tx_conf);
-static void enetc_tx_queue_release(void *txq);
-static const uint32_t *enetc_supported_ptypes_get(struct rte_eth_dev *dev);
-static int enetc_stats_get(struct rte_eth_dev *dev,
-		struct rte_eth_stats *stats);
-static void enetc_stats_reset(struct rte_eth_dev *dev);
-
-/*
- * The set of PCI devices this driver supports
- */
-static const struct rte_pci_id pci_id_enetc_map[] = {
-	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID) },
-	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID_VF) },
-	{ .vendor_id = 0, /* sentinel */ },
-};
-
-/* Features supported by this driver */
-static const struct eth_dev_ops enetc_ops = {
-	.dev_configure        = enetc_dev_configure,
-	.dev_start            = enetc_dev_start,
-	.dev_stop             = enetc_dev_stop,
-	.dev_close            = enetc_dev_close,
-	.link_update          = enetc_link_update,
-	.stats_get            = enetc_stats_get,
-	.stats_reset          = enetc_stats_reset,
-	.dev_infos_get        = enetc_dev_infos_get,
-	.rx_queue_setup       = enetc_rx_queue_setup,
-	.rx_queue_release     = enetc_rx_queue_release,
-	.tx_queue_setup       = enetc_tx_queue_setup,
-	.tx_queue_release     = enetc_tx_queue_release,
-	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
-};
-
-/**
- * Initialisation of the enetc device
- *
- * @param eth_dev
- *   - Pointer to the structure rte_eth_dev
- *
- * @return
- *   - On success, zero.
- *   - On failure, negative value.
- */
-static int
-enetc_dev_init(struct rte_eth_dev *eth_dev)
-{
-	int error = 0;
-	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
-	struct enetc_eth_hw *hw =
-		ENETC_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
-
-	PMD_INIT_FUNC_TRACE();
-	eth_dev->dev_ops = &enetc_ops;
-	eth_dev->rx_pkt_burst = &enetc_recv_pkts;
-	eth_dev->tx_pkt_burst = &enetc_xmit_pkts;
-
-	/* Retrieving and storing the HW base address of device */
-	hw->hw.reg = (void *)pci_dev->mem_resource[0].addr;
-	hw->device_id = pci_dev->id.device_id;
-
-	error = enetc_hardware_init(hw);
-	if (error != 0) {
-		ENETC_PMD_ERR("Hardware initialization failed");
-		return -1;
-	}
-
-	/* Allocate memory for storing MAC addresses */
-	eth_dev->data->mac_addrs = rte_zmalloc("enetc_eth", ETHER_ADDR_LEN, 0);
-	if (!eth_dev->data->mac_addrs) {
-		ENETC_PMD_ERR("Failed to allocate %d bytes needed to "
-			      "store MAC addresses",
-			      ETHER_ADDR_LEN * 1);
-		error = -ENOMEM;
-		return -1;
-	}
-
-	/* Copy the permanent MAC address */
-	ether_addr_copy((struct ether_addr *)hw->mac.addr,
-			&eth_dev->data->mac_addrs[0]);
-
-	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
-			eth_dev->data->port_id, pci_dev->id.vendor_id,
-			pci_dev->id.device_id);
-	return 0;
-}
-
-static int
-enetc_dev_uninit(struct rte_eth_dev *eth_dev __rte_unused)
-{
-	PMD_INIT_FUNC_TRACE();
-	return 0;
-}
-
 static int
 enetc_dev_configure(struct rte_eth_dev *dev __rte_unused)
 {
@@ -179,27 +70,6 @@ enetc_dev_stop(struct rte_eth_dev *dev)
 		      val & (~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN)));
 }
 
-static void
-enetc_dev_close(struct rte_eth_dev *dev)
-{
-	uint16_t i;
-
-	PMD_INIT_FUNC_TRACE();
-	enetc_dev_stop(dev);
-
-	for (i = 0; i < dev->data->nb_rx_queues; i++) {
-		enetc_rx_queue_release(dev->data->rx_queues[i]);
-		dev->data->rx_queues[i] = NULL;
-	}
-	dev->data->nb_rx_queues = 0;
-
-	for (i = 0; i < dev->data->nb_tx_queues; i++) {
-		enetc_tx_queue_release(dev->data->tx_queues[i]);
-		dev->data->tx_queues[i] = NULL;
-	}
-	dev->data->nb_tx_queues = 0;
-}
-
 static const uint32_t *
 enetc_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)
 {
@@ -648,6 +518,113 @@ enetc_stats_reset(struct rte_eth_dev *dev)
 	enetc_port_wr(enetc_hw, ENETC_PM0_STAT_CONFIG, ENETC_CLEAR_STATS);
 }
 
+static void
+enetc_dev_close(struct rte_eth_dev *dev)
+{
+	uint16_t i;
+
+	PMD_INIT_FUNC_TRACE();
+	enetc_dev_stop(dev);
+
+	for (i = 0; i < dev->data->nb_rx_queues; i++) {
+		enetc_rx_queue_release(dev->data->rx_queues[i]);
+		dev->data->rx_queues[i] = NULL;
+	}
+	dev->data->nb_rx_queues = 0;
+
+	for (i = 0; i < dev->data->nb_tx_queues; i++) {
+		enetc_tx_queue_release(dev->data->tx_queues[i]);
+		dev->data->tx_queues[i] = NULL;
+	}
+	dev->data->nb_tx_queues = 0;
+}
+
+/*
+ * The set of PCI devices this driver supports
+ */
+static const struct rte_pci_id pci_id_enetc_map[] = {
+	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID) },
+	{ RTE_PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID_VF) },
+	{ .vendor_id = 0, /* sentinel */ },
+};
+
+/* Features supported by this driver */
+static const struct eth_dev_ops enetc_ops = {
+	.dev_configure        = enetc_dev_configure,
+	.dev_start            = enetc_dev_start,
+	.dev_stop             = enetc_dev_stop,
+	.dev_close            = enetc_dev_close,
+	.link_update          = enetc_link_update,
+	.stats_get            = enetc_stats_get,
+	.stats_reset          = enetc_stats_reset,
+	.dev_infos_get        = enetc_dev_infos_get,
+	.rx_queue_setup       = enetc_rx_queue_setup,
+	.rx_queue_release     = enetc_rx_queue_release,
+	.tx_queue_setup       = enetc_tx_queue_setup,
+	.tx_queue_release     = enetc_tx_queue_release,
+	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
+};
+
+/**
+ * Initialisation of the enetc device
+ *
+ * @param eth_dev
+ *   - Pointer to the structure rte_eth_dev
+ *
+ * @return
+ *   - On success, zero.
+ *   - On failure, negative value.
+ */
+static int
+enetc_dev_init(struct rte_eth_dev *eth_dev)
+{
+	int error = 0;
+	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
+
+	PMD_INIT_FUNC_TRACE();
+	eth_dev->dev_ops = &enetc_ops;
+	eth_dev->rx_pkt_burst = &enetc_recv_pkts;
+	eth_dev->tx_pkt_burst = &enetc_xmit_pkts;
+
+	/* Retrieving and storing the HW base address of device */
+	hw->hw.reg = (void *)pci_dev->mem_resource[0].addr;
+	hw->device_id = pci_dev->id.device_id;
+
+	error = enetc_hardware_init(hw);
+	if (error != 0) {
+		ENETC_PMD_ERR("Hardware initialization failed");
+		return -1;
+	}
+
+	/* Allocate memory for storing MAC addresses */
+	eth_dev->data->mac_addrs = rte_zmalloc("enetc_eth", ETHER_ADDR_LEN, 0);
+	if (!eth_dev->data->mac_addrs) {
+		ENETC_PMD_ERR("Failed to allocate %d bytes needed to "
+			      "store MAC addresses",
+			      ETHER_ADDR_LEN * 1);
+		error = -ENOMEM;
+		return -1;
+	}
+
+	/* Copy the permanent MAC address */
+	ether_addr_copy((struct ether_addr *)hw->mac.addr,
+			&eth_dev->data->mac_addrs[0]);
+
+	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
+			eth_dev->data->port_id, pci_dev->id.vendor_id,
+			pci_dev->id.device_id);
+	return 0;
+}
+
+static int
+enetc_dev_uninit(struct rte_eth_dev *eth_dev __rte_unused)
+{
+	PMD_INIT_FUNC_TRACE();
+	return 0;
+}
+
 static int
 enetc_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 			   struct rte_pci_device *pci_dev)
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 08/13] net/enetc: enable promiscuous and allmulticast feature
  2019-04-12 12:28     ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                         ` (7 preceding siblings ...)
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 07/13] net/enetc: remove forward declarations Gagandeep Singh
@ 2019-04-12 12:29       ` Gagandeep Singh
  2019-04-12 12:29         ` Gagandeep Singh
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 09/13] net/enetc: add MTU update and jumbo frames support Gagandeep Singh
                         ` (5 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:29 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Promiscuous and allmulticast enable/disable APIs added.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  2 +
 doc/guides/nics/features/enetc.ini |  2 +
 drivers/net/enetc/base/enetc_hw.h  |  3 +-
 drivers/net/enetc/enetc_ethdev.c   | 90 +++++++++++++++++++++++++-----
 4 files changed, 81 insertions(+), 16 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 9f575d27f..ab13211a5 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -47,6 +47,8 @@ ENETC Features
 - Link Status
 - Packet type information
 - Basic stats
+- Promiscuous
+- Multicast
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index d8bd5679d..6b7bbfb3d 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -7,6 +7,8 @@
 Packet type parsing  = Y
 Link status          = Y
 Basic stats          = Y
+Promiscuous mode     = Y
+Allmulticast mode    = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 3f0a2a9a3..90a383a8b 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -78,8 +78,7 @@ enum enetc_bdr_type {TX, RX};
 #define ENETC_PSR			0x00004 /* RO */
 #define ENETC_PSIPMR			0x00018
 #define ENETC_PSIPMR_SET_UP(n)		(0x1 << (n)) /* n = SI index */
-#define ENETC_PSIPMR_SET_MP(n)		(0x1 << ((n) + 8))
-#define ENETC_PSIPMR_SET_VLAN_MP(n)	(0x1 << ((n) + 16))
+#define ENETC_PSIPMR_SET_MP(n)		(0x1 << ((n) + 16))
 #define ENETC_PSIPMAR0(n)		(0x00100 + (n) * 0x20)
 #define ENETC_PSIPMAR1(n)		(0x00104 + (n) * 0x20)
 #define ENETC_PCAPR0			0x00900
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index d0f9e2b35..a7dddc5cb 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -133,8 +133,8 @@ enetc_link_update(struct rte_eth_dev *dev, int wait_to_complete __rte_unused)
 static int
 enetc_hardware_init(struct enetc_eth_hw *hw)
 {
-	uint32_t psipmr = 0;
 	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t *mac = (uint32_t *)hw->mac.addr;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Calculating and storing the base HW addresses */
@@ -144,19 +144,9 @@ enetc_hardware_init(struct enetc_eth_hw *hw)
 	/* Enabling Station Interface */
 	enetc_wr(enetc_hw, ENETC_SIMR, ENETC_SIMR_EN);
 
-	/* Setting to accept broadcast packets for each inetrface */
-	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0) |
-		  ENETC_PSIPMR_SET_VLAN_MP(0);
-	psipmr |= ENETC_PSIPMR_SET_UP(1) | ENETC_PSIPMR_SET_MP(1) |
-		  ENETC_PSIPMR_SET_VLAN_MP(1);
-	psipmr |= ENETC_PSIPMR_SET_UP(2) | ENETC_PSIPMR_SET_MP(2) |
-		  ENETC_PSIPMR_SET_VLAN_MP(2);
-
-	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
-
-	/* Enabling broadcast address */
-	enetc_port_wr(enetc_hw, ENETC_PSIPMAR0(0), 0xFFFFFFFF);
-	enetc_port_wr(enetc_hw, ENETC_PSIPMAR1(0), 0xFFFF << 16);
+	*mac = (uint32_t)enetc_port_rd(enetc_hw, ENETC_PSIPMAR0(0));
+	mac++;
+	*mac = (uint16_t)enetc_port_rd(enetc_hw, ENETC_PSIPMAR1(0));
 
 	return 0;
 }
@@ -539,6 +529,74 @@ enetc_dev_close(struct rte_eth_dev *dev)
 	dev->data->nb_tx_queues = 0;
 }
 
+static void
+enetc_promiscuous_enable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+
+	/* Setting to enable promiscuous mode*/
+	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0);
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_promiscuous_disable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	/* Setting to disable promiscuous mode for SI0*/
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+	psipmr &= (~ENETC_PSIPMR_SET_UP(0));
+
+	if (dev->data->all_multicast == 0)
+		psipmr &= (~ENETC_PSIPMR_SET_MP(0));
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_allmulticast_enable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+
+	/* Setting to enable allmulticast mode for SI0*/
+	psipmr |= ENETC_PSIPMR_SET_MP(0);
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_allmulticast_disable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	if (dev->data->promiscuous == 1)
+		return; /* must remain in all_multicast mode */
+
+	/* Setting to disable all multicast mode for SI0*/
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR) &
+			       ~(ENETC_PSIPMR_SET_MP(0));
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -557,6 +615,10 @@ static const struct eth_dev_ops enetc_ops = {
 	.link_update          = enetc_link_update,
 	.stats_get            = enetc_stats_get,
 	.stats_reset          = enetc_stats_reset,
+	.promiscuous_enable   = enetc_promiscuous_enable,
+	.promiscuous_disable  = enetc_promiscuous_disable,
+	.allmulticast_enable  = enetc_allmulticast_enable,
+	.allmulticast_disable = enetc_allmulticast_disable,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 08/13] net/enetc: enable promiscuous and allmulticast feature
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 08/13] net/enetc: enable promiscuous and allmulticast feature Gagandeep Singh
@ 2019-04-12 12:29         ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:29 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Promiscuous and allmulticast enable/disable APIs added.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  2 +
 doc/guides/nics/features/enetc.ini |  2 +
 drivers/net/enetc/base/enetc_hw.h  |  3 +-
 drivers/net/enetc/enetc_ethdev.c   | 90 +++++++++++++++++++++++++-----
 4 files changed, 81 insertions(+), 16 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 9f575d27f..ab13211a5 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -47,6 +47,8 @@ ENETC Features
 - Link Status
 - Packet type information
 - Basic stats
+- Promiscuous
+- Multicast
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index d8bd5679d..6b7bbfb3d 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -7,6 +7,8 @@
 Packet type parsing  = Y
 Link status          = Y
 Basic stats          = Y
+Promiscuous mode     = Y
+Allmulticast mode    = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 3f0a2a9a3..90a383a8b 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -78,8 +78,7 @@ enum enetc_bdr_type {TX, RX};
 #define ENETC_PSR			0x00004 /* RO */
 #define ENETC_PSIPMR			0x00018
 #define ENETC_PSIPMR_SET_UP(n)		(0x1 << (n)) /* n = SI index */
-#define ENETC_PSIPMR_SET_MP(n)		(0x1 << ((n) + 8))
-#define ENETC_PSIPMR_SET_VLAN_MP(n)	(0x1 << ((n) + 16))
+#define ENETC_PSIPMR_SET_MP(n)		(0x1 << ((n) + 16))
 #define ENETC_PSIPMAR0(n)		(0x00100 + (n) * 0x20)
 #define ENETC_PSIPMAR1(n)		(0x00104 + (n) * 0x20)
 #define ENETC_PCAPR0			0x00900
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index d0f9e2b35..a7dddc5cb 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -133,8 +133,8 @@ enetc_link_update(struct rte_eth_dev *dev, int wait_to_complete __rte_unused)
 static int
 enetc_hardware_init(struct enetc_eth_hw *hw)
 {
-	uint32_t psipmr = 0;
 	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t *mac = (uint32_t *)hw->mac.addr;
 
 	PMD_INIT_FUNC_TRACE();
 	/* Calculating and storing the base HW addresses */
@@ -144,19 +144,9 @@ enetc_hardware_init(struct enetc_eth_hw *hw)
 	/* Enabling Station Interface */
 	enetc_wr(enetc_hw, ENETC_SIMR, ENETC_SIMR_EN);
 
-	/* Setting to accept broadcast packets for each inetrface */
-	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0) |
-		  ENETC_PSIPMR_SET_VLAN_MP(0);
-	psipmr |= ENETC_PSIPMR_SET_UP(1) | ENETC_PSIPMR_SET_MP(1) |
-		  ENETC_PSIPMR_SET_VLAN_MP(1);
-	psipmr |= ENETC_PSIPMR_SET_UP(2) | ENETC_PSIPMR_SET_MP(2) |
-		  ENETC_PSIPMR_SET_VLAN_MP(2);
-
-	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
-
-	/* Enabling broadcast address */
-	enetc_port_wr(enetc_hw, ENETC_PSIPMAR0(0), 0xFFFFFFFF);
-	enetc_port_wr(enetc_hw, ENETC_PSIPMAR1(0), 0xFFFF << 16);
+	*mac = (uint32_t)enetc_port_rd(enetc_hw, ENETC_PSIPMAR0(0));
+	mac++;
+	*mac = (uint16_t)enetc_port_rd(enetc_hw, ENETC_PSIPMAR1(0));
 
 	return 0;
 }
@@ -539,6 +529,74 @@ enetc_dev_close(struct rte_eth_dev *dev)
 	dev->data->nb_tx_queues = 0;
 }
 
+static void
+enetc_promiscuous_enable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+
+	/* Setting to enable promiscuous mode*/
+	psipmr |= ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0);
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_promiscuous_disable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	/* Setting to disable promiscuous mode for SI0*/
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+	psipmr &= (~ENETC_PSIPMR_SET_UP(0));
+
+	if (dev->data->all_multicast == 0)
+		psipmr &= (~ENETC_PSIPMR_SET_MP(0));
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_allmulticast_enable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR);
+
+	/* Setting to enable allmulticast mode for SI0*/
+	psipmr |= ENETC_PSIPMR_SET_MP(0);
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
+static void
+enetc_allmulticast_disable(struct rte_eth_dev *dev)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t psipmr = 0;
+
+	if (dev->data->promiscuous == 1)
+		return; /* must remain in all_multicast mode */
+
+	/* Setting to disable all multicast mode for SI0*/
+	psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR) &
+			       ~(ENETC_PSIPMR_SET_MP(0));
+
+	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -557,6 +615,10 @@ static const struct eth_dev_ops enetc_ops = {
 	.link_update          = enetc_link_update,
 	.stats_get            = enetc_stats_get,
 	.stats_reset          = enetc_stats_reset,
+	.promiscuous_enable   = enetc_promiscuous_enable,
+	.promiscuous_disable  = enetc_promiscuous_disable,
+	.allmulticast_enable  = enetc_allmulticast_enable,
+	.allmulticast_disable = enetc_allmulticast_disable,
 	.dev_infos_get        = enetc_dev_infos_get,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 09/13] net/enetc: add MTU update and jumbo frames support
  2019-04-12 12:28     ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                         ` (8 preceding siblings ...)
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 08/13] net/enetc: enable promiscuous and allmulticast feature Gagandeep Singh
@ 2019-04-12 12:29       ` Gagandeep Singh
  2019-04-12 12:29         ` Gagandeep Singh
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 10/13] net/enetc: enable Rx-Tx queue start/stop feature Gagandeep Singh
                         ` (4 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:29 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Enable the jumbo frames and mtu update feature.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  2 +
 drivers/net/enetc/base/enetc_hw.h  |  6 ++-
 drivers/net/enetc/enetc.h          |  5 ++
 drivers/net/enetc/enetc_ethdev.c   | 86 +++++++++++++++++++++++++++---
 5 files changed, 91 insertions(+), 9 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index ab13211a5..eeb07523d 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -49,6 +49,7 @@ ENETC Features
 - Basic stats
 - Promiscuous
 - Multicast
+- Jumbo packets
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 6b7bbfb3d..0eed2cb9b 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -9,6 +9,8 @@ Link status          = Y
 Basic stats          = Y
 Promiscuous mode     = Y
 Allmulticast mode    = Y
+MTU update           = Y
+Jumbo frame          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 90a383a8b..2eb1df30e 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -99,7 +99,11 @@ enum enetc_bdr_type {TX, RX};
 #define ENETC_PM0_RX_EN			BIT(1)
 
 #define ENETC_PM0_MAXFRM		0x08014
-#define ENETC_SET_MAXFRM(val)		((val) << 16)
+#define ENETC_SET_TX_MTU(val)		((val) << 16)
+#define ENETC_SET_MAXFRM(val)		((val) & 0xffff)
+#define ENETC_PTXMBAR			0x0608
+/* n = TC index [0..7] */
+#define ENETC_PTCMSDUR(n)		(0x2020 + (n) * 4)
 
 #define ENETC_PM0_STATUS		0x08304
 #define ENETC_LINK_MODE			0x0000000000080000ULL
diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index 56454dc9d..e494eb8b8 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -24,6 +24,11 @@
 /* BD ALIGN */
 #define BD_ALIGN       8
 
+/* minimum frame size supported */
+#define ENETC_MAC_MINFRM_SIZE	68
+/* maximum frame size supported */
+#define ENETC_MAC_MAXFRM_SIZE	9600
+
 /*
  * upper_32_bits - return bits 32-63 of a number
  * @n: the number we're accessing
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index a7dddc5cb..66cbf74d0 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -10,13 +10,6 @@
 
 int enetc_logtype_pmd;
 
-static int
-enetc_dev_configure(struct rte_eth_dev *dev __rte_unused)
-{
-	PMD_INIT_FUNC_TRACE();
-	return 0;
-}
-
 static int
 enetc_dev_start(struct rte_eth_dev *dev)
 {
@@ -168,7 +161,8 @@ enetc_dev_infos_get(struct rte_eth_dev *dev __rte_unused,
 	};
 	dev_info->max_rx_queues = MAX_RX_RINGS;
 	dev_info->max_tx_queues = MAX_TX_RINGS;
-	dev_info->max_rx_pktlen = 1500;
+	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
+	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_JUMBO_FRAME;
 }
 
 static int
@@ -597,6 +591,76 @@ enetc_allmulticast_disable(struct rte_eth_dev *dev)
 	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
 }
 
+static int
+enetc_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
+
+	/* check that mtu is within the allowed range */
+	if (mtu < ENETC_MAC_MINFRM_SIZE || frame_size > ENETC_MAC_MAXFRM_SIZE)
+		return -EINVAL;
+
+	/*
+	 * Refuse mtu that requires the support of scattered packets
+	 * when this feature has not been enabled before.
+	 */
+	if (dev->data->min_rx_buf_size &&
+		!dev->data->scattered_rx && frame_size >
+		dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM) {
+		ENETC_PMD_ERR("SG not enabled, will not fit in one buffer");
+		return -EINVAL;
+	}
+
+	if (frame_size > ETHER_MAX_LEN)
+		dev->data->dev_conf.rxmode.offloads &=
+						DEV_RX_OFFLOAD_JUMBO_FRAME;
+	else
+		dev->data->dev_conf.rxmode.offloads &=
+						~DEV_RX_OFFLOAD_JUMBO_FRAME;
+
+	enetc_port_wr(enetc_hw, ENETC_PTCMSDUR(0), ENETC_MAC_MAXFRM_SIZE);
+	enetc_port_wr(enetc_hw, ENETC_PTXMBAR, 2 * ENETC_MAC_MAXFRM_SIZE);
+
+	dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
+
+	/*setting the MTU*/
+	enetc_port_wr(enetc_hw, ENETC_PM0_MAXFRM, ENETC_SET_MAXFRM(frame_size) |
+		      ENETC_SET_TX_MTU(ENETC_MAC_MAXFRM_SIZE));
+
+	return 0;
+}
+
+static int
+enetc_dev_configure(struct rte_eth_dev *dev)
+{
+	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
+	uint64_t rx_offloads = eth_conf->rxmode.offloads;
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	PMD_INIT_FUNC_TRACE();
+
+	if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
+		uint32_t max_len;
+
+		max_len = dev->data->dev_conf.rxmode.max_rx_pkt_len;
+
+		enetc_port_wr(enetc_hw, ENETC_PM0_MAXFRM,
+			      ENETC_SET_MAXFRM(max_len));
+		enetc_port_wr(enetc_hw, ENETC_PTCMSDUR(0),
+			      ENETC_MAC_MAXFRM_SIZE);
+		enetc_port_wr(enetc_hw, ENETC_PTXMBAR,
+			      2 * ENETC_MAC_MAXFRM_SIZE);
+		dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
+	}
+
+	return 0;
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -620,6 +684,7 @@ static const struct eth_dev_ops enetc_ops = {
 	.allmulticast_enable  = enetc_allmulticast_enable,
 	.allmulticast_disable = enetc_allmulticast_disable,
 	.dev_infos_get        = enetc_dev_infos_get,
+	.mtu_set              = enetc_mtu_set,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
 	.tx_queue_setup       = enetc_tx_queue_setup,
@@ -674,6 +739,11 @@ enetc_dev_init(struct rte_eth_dev *eth_dev)
 	ether_addr_copy((struct ether_addr *)hw->mac.addr,
 			&eth_dev->data->mac_addrs[0]);
 
+	/* Set MTU */
+	enetc_port_wr(&hw->hw, ENETC_PM0_MAXFRM,
+		      ENETC_SET_MAXFRM(ETHER_MAX_LEN));
+	eth_dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
+
 	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
 			eth_dev->data->port_id, pci_dev->id.vendor_id,
 			pci_dev->id.device_id);
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 09/13] net/enetc: add MTU update and jumbo frames support
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 09/13] net/enetc: add MTU update and jumbo frames support Gagandeep Singh
@ 2019-04-12 12:29         ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:29 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Enable the jumbo frames and mtu update feature.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  2 +
 drivers/net/enetc/base/enetc_hw.h  |  6 ++-
 drivers/net/enetc/enetc.h          |  5 ++
 drivers/net/enetc/enetc_ethdev.c   | 86 +++++++++++++++++++++++++++---
 5 files changed, 91 insertions(+), 9 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index ab13211a5..eeb07523d 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -49,6 +49,7 @@ ENETC Features
 - Basic stats
 - Promiscuous
 - Multicast
+- Jumbo packets
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 6b7bbfb3d..0eed2cb9b 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -9,6 +9,8 @@ Link status          = Y
 Basic stats          = Y
 Promiscuous mode     = Y
 Allmulticast mode    = Y
+MTU update           = Y
+Jumbo frame          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 90a383a8b..2eb1df30e 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -99,7 +99,11 @@ enum enetc_bdr_type {TX, RX};
 #define ENETC_PM0_RX_EN			BIT(1)
 
 #define ENETC_PM0_MAXFRM		0x08014
-#define ENETC_SET_MAXFRM(val)		((val) << 16)
+#define ENETC_SET_TX_MTU(val)		((val) << 16)
+#define ENETC_SET_MAXFRM(val)		((val) & 0xffff)
+#define ENETC_PTXMBAR			0x0608
+/* n = TC index [0..7] */
+#define ENETC_PTCMSDUR(n)		(0x2020 + (n) * 4)
 
 #define ENETC_PM0_STATUS		0x08304
 #define ENETC_LINK_MODE			0x0000000000080000ULL
diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index 56454dc9d..e494eb8b8 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -24,6 +24,11 @@
 /* BD ALIGN */
 #define BD_ALIGN       8
 
+/* minimum frame size supported */
+#define ENETC_MAC_MINFRM_SIZE	68
+/* maximum frame size supported */
+#define ENETC_MAC_MAXFRM_SIZE	9600
+
 /*
  * upper_32_bits - return bits 32-63 of a number
  * @n: the number we're accessing
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index a7dddc5cb..66cbf74d0 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -10,13 +10,6 @@
 
 int enetc_logtype_pmd;
 
-static int
-enetc_dev_configure(struct rte_eth_dev *dev __rte_unused)
-{
-	PMD_INIT_FUNC_TRACE();
-	return 0;
-}
-
 static int
 enetc_dev_start(struct rte_eth_dev *dev)
 {
@@ -168,7 +161,8 @@ enetc_dev_infos_get(struct rte_eth_dev *dev __rte_unused,
 	};
 	dev_info->max_rx_queues = MAX_RX_RINGS;
 	dev_info->max_tx_queues = MAX_TX_RINGS;
-	dev_info->max_rx_pktlen = 1500;
+	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
+	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_JUMBO_FRAME;
 }
 
 static int
@@ -597,6 +591,76 @@ enetc_allmulticast_disable(struct rte_eth_dev *dev)
 	enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
 }
 
+static int
+enetc_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
+{
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+	uint32_t frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
+
+	/* check that mtu is within the allowed range */
+	if (mtu < ENETC_MAC_MINFRM_SIZE || frame_size > ENETC_MAC_MAXFRM_SIZE)
+		return -EINVAL;
+
+	/*
+	 * Refuse mtu that requires the support of scattered packets
+	 * when this feature has not been enabled before.
+	 */
+	if (dev->data->min_rx_buf_size &&
+		!dev->data->scattered_rx && frame_size >
+		dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM) {
+		ENETC_PMD_ERR("SG not enabled, will not fit in one buffer");
+		return -EINVAL;
+	}
+
+	if (frame_size > ETHER_MAX_LEN)
+		dev->data->dev_conf.rxmode.offloads &=
+						DEV_RX_OFFLOAD_JUMBO_FRAME;
+	else
+		dev->data->dev_conf.rxmode.offloads &=
+						~DEV_RX_OFFLOAD_JUMBO_FRAME;
+
+	enetc_port_wr(enetc_hw, ENETC_PTCMSDUR(0), ENETC_MAC_MAXFRM_SIZE);
+	enetc_port_wr(enetc_hw, ENETC_PTXMBAR, 2 * ENETC_MAC_MAXFRM_SIZE);
+
+	dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
+
+	/*setting the MTU*/
+	enetc_port_wr(enetc_hw, ENETC_PM0_MAXFRM, ENETC_SET_MAXFRM(frame_size) |
+		      ENETC_SET_TX_MTU(ENETC_MAC_MAXFRM_SIZE));
+
+	return 0;
+}
+
+static int
+enetc_dev_configure(struct rte_eth_dev *dev)
+{
+	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
+	uint64_t rx_offloads = eth_conf->rxmode.offloads;
+	struct enetc_eth_hw *hw =
+		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct enetc_hw *enetc_hw = &hw->hw;
+
+	PMD_INIT_FUNC_TRACE();
+
+	if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
+		uint32_t max_len;
+
+		max_len = dev->data->dev_conf.rxmode.max_rx_pkt_len;
+
+		enetc_port_wr(enetc_hw, ENETC_PM0_MAXFRM,
+			      ENETC_SET_MAXFRM(max_len));
+		enetc_port_wr(enetc_hw, ENETC_PTCMSDUR(0),
+			      ENETC_MAC_MAXFRM_SIZE);
+		enetc_port_wr(enetc_hw, ENETC_PTXMBAR,
+			      2 * ENETC_MAC_MAXFRM_SIZE);
+		dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
+	}
+
+	return 0;
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -620,6 +684,7 @@ static const struct eth_dev_ops enetc_ops = {
 	.allmulticast_enable  = enetc_allmulticast_enable,
 	.allmulticast_disable = enetc_allmulticast_disable,
 	.dev_infos_get        = enetc_dev_infos_get,
+	.mtu_set              = enetc_mtu_set,
 	.rx_queue_setup       = enetc_rx_queue_setup,
 	.rx_queue_release     = enetc_rx_queue_release,
 	.tx_queue_setup       = enetc_tx_queue_setup,
@@ -674,6 +739,11 @@ enetc_dev_init(struct rte_eth_dev *eth_dev)
 	ether_addr_copy((struct ether_addr *)hw->mac.addr,
 			&eth_dev->data->mac_addrs[0]);
 
+	/* Set MTU */
+	enetc_port_wr(&hw->hw, ENETC_PM0_MAXFRM,
+		      ENETC_SET_MAXFRM(ETHER_MAX_LEN));
+	eth_dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
+
 	ENETC_PMD_DEBUG("port_id %d vendorID=0x%x deviceID=0x%x",
 			eth_dev->data->port_id, pci_dev->id.vendor_id,
 			pci_dev->id.device_id);
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 10/13] net/enetc: enable Rx-Tx queue start/stop feature
  2019-04-12 12:28     ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                         ` (9 preceding siblings ...)
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 09/13] net/enetc: add MTU update and jumbo frames support Gagandeep Singh
@ 2019-04-12 12:29       ` Gagandeep Singh
  2019-04-12 12:29         ` Gagandeep Singh
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 11/13] net/enetc: enable CRC offload feature Gagandeep Singh
                         ` (3 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:29 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Rx and Tx queue start-stop and deferred queue start
features enabled.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |   2 +
 doc/guides/nics/features/enetc.ini |   1 +
 drivers/net/enetc/enetc_ethdev.c   | 185 ++++++++++++++++++++---------
 3 files changed, 134 insertions(+), 54 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index eeb07523d..26d61f67d 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -50,6 +50,8 @@ ENETC Features
 - Promiscuous
 - Multicast
 - Jumbo packets
+- Queue Start/Stop
+- Deferred Queue Start
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 0eed2cb9b..bd901faf4 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -11,6 +11,7 @@ Promiscuous mode     = Y
 Allmulticast mode    = Y
 MTU update           = Y
 Jumbo frame          = Y
+Queue start/stop     = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 66cbf74d0..ff9301e01 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -203,7 +203,6 @@ static void
 enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
 {
 	int idx = tx_ring->index;
-	uint32_t tbmr;
 	phys_addr_t bd_address;
 
 	bd_address = (phys_addr_t)
@@ -215,9 +214,6 @@ enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
 	enetc_txbdr_wr(hw, idx, ENETC_TBLENR,
 		       ENETC_RTBLENR_LEN(tx_ring->bd_count));
 
-	tbmr = ENETC_TBMR_EN;
-	/* enable ring */
-	enetc_txbdr_wr(hw, idx, ENETC_TBMR, tbmr);
 	enetc_txbdr_wr(hw, idx, ENETC_TBCIR, 0);
 	enetc_txbdr_wr(hw, idx, ENETC_TBCISR, 0);
 	tx_ring->tcir = (void *)((size_t)hw->reg +
@@ -227,16 +223,22 @@ enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
 }
 
 static int
-enetc_alloc_tx_resources(struct rte_eth_dev *dev,
-			 uint16_t queue_idx,
-			 uint16_t nb_desc)
+enetc_tx_queue_setup(struct rte_eth_dev *dev,
+		     uint16_t queue_idx,
+		     uint16_t nb_desc,
+		     unsigned int socket_id __rte_unused,
+		     const struct rte_eth_txconf *tx_conf)
 {
-	int err;
+	int err = 0;
 	struct enetc_bdr *tx_ring;
 	struct rte_eth_dev_data *data = dev->data;
 	struct enetc_eth_adapter *priv =
 			ENETC_DEV_PRIVATE(data->dev_private);
 
+	PMD_INIT_FUNC_TRACE();
+	if (nb_desc > MAX_BD_COUNT)
+		return -1;
+
 	tx_ring = rte_zmalloc(NULL, sizeof(struct enetc_bdr), 0);
 	if (tx_ring == NULL) {
 		ENETC_PMD_ERR("Failed to allocate TX ring memory");
@@ -253,6 +255,17 @@ enetc_alloc_tx_resources(struct rte_eth_dev *dev,
 	enetc_setup_txbdr(&priv->hw.hw, tx_ring);
 	data->tx_queues[queue_idx] = tx_ring;
 
+	if (!tx_conf->tx_deferred_start) {
+		/* enable ring */
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index,
+			       ENETC_TBMR, ENETC_TBMR_EN);
+		dev->data->tx_queue_state[tx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STARTED;
+	} else {
+		dev->data->tx_queue_state[tx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
 	return 0;
 fail:
 	rte_free(tx_ring);
@@ -260,24 +273,6 @@ enetc_alloc_tx_resources(struct rte_eth_dev *dev,
 	return err;
 }
 
-static int
-enetc_tx_queue_setup(struct rte_eth_dev *dev,
-		     uint16_t queue_idx,
-		     uint16_t nb_desc,
-		     unsigned int socket_id __rte_unused,
-		     const struct rte_eth_txconf *tx_conf __rte_unused)
-{
-	int err = 0;
-
-	PMD_INIT_FUNC_TRACE();
-	if (nb_desc > MAX_BD_COUNT)
-		return -1;
-
-	err = enetc_alloc_tx_resources(dev, queue_idx, nb_desc);
-
-	return err;
-}
-
 static void
 enetc_tx_queue_release(void *txq)
 {
@@ -367,23 +362,27 @@ enetc_setup_rxbdr(struct enetc_hw *hw, struct enetc_bdr *rx_ring,
 	buf_size = (uint16_t)(rte_pktmbuf_data_room_size(rx_ring->mb_pool) -
 		   RTE_PKTMBUF_HEADROOM);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBSR, buf_size);
-	/* enable ring */
-	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 }
 
 static int
-enetc_alloc_rx_resources(struct rte_eth_dev *dev,
-			 uint16_t rx_queue_id,
-			 uint16_t nb_rx_desc,
-			 struct rte_mempool *mb_pool)
+enetc_rx_queue_setup(struct rte_eth_dev *dev,
+		     uint16_t rx_queue_id,
+		     uint16_t nb_rx_desc,
+		     unsigned int socket_id __rte_unused,
+		     const struct rte_eth_rxconf *rx_conf,
+		     struct rte_mempool *mb_pool)
 {
-	int err;
+	int err = 0;
 	struct enetc_bdr *rx_ring;
 	struct rte_eth_dev_data *data =  dev->data;
 	struct enetc_eth_adapter *adapter =
 			ENETC_DEV_PRIVATE(data->dev_private);
 
+	PMD_INIT_FUNC_TRACE();
+	if (nb_rx_desc > MAX_BD_COUNT)
+		return -1;
+
 	rx_ring = rte_zmalloc(NULL, sizeof(struct enetc_bdr), 0);
 	if (rx_ring == NULL) {
 		ENETC_PMD_ERR("Failed to allocate RX ring memory");
@@ -400,6 +399,17 @@ enetc_alloc_rx_resources(struct rte_eth_dev *dev,
 	enetc_setup_rxbdr(&adapter->hw.hw, rx_ring, mb_pool);
 	data->rx_queues[rx_queue_id] = rx_ring;
 
+	if (!rx_conf->rx_deferred_start) {
+		/* enable ring */
+		enetc_rxbdr_wr(&adapter->hw.hw, rx_ring->index, ENETC_RBMR,
+			       ENETC_RBMR_EN);
+		dev->data->rx_queue_state[rx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STARTED;
+	} else {
+		dev->data->rx_queue_state[rx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
 	return 0;
 fail:
 	rte_free(rx_ring);
@@ -407,27 +417,6 @@ enetc_alloc_rx_resources(struct rte_eth_dev *dev,
 	return err;
 }
 
-static int
-enetc_rx_queue_setup(struct rte_eth_dev *dev,
-		     uint16_t rx_queue_id,
-		     uint16_t nb_rx_desc,
-		     unsigned int socket_id __rte_unused,
-		     const struct rte_eth_rxconf *rx_conf __rte_unused,
-		     struct rte_mempool *mb_pool)
-{
-	int err = 0;
-
-	PMD_INIT_FUNC_TRACE();
-	if (nb_rx_desc > MAX_BD_COUNT)
-		return -1;
-
-	err = enetc_alloc_rx_resources(dev, rx_queue_id,
-				       nb_rx_desc,
-				       mb_pool);
-
-	return err;
-}
-
 static void
 enetc_rx_queue_release(void *rxq)
 {
@@ -661,6 +650,90 @@ enetc_dev_configure(struct rte_eth_dev *dev)
 	return 0;
 }
 
+static int
+enetc_rx_queue_start(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *rx_ring;
+	uint32_t rx_data;
+
+	rx_ring = dev->data->rx_queues[qidx];
+	if (dev->data->rx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STOPPED) {
+		rx_data = enetc_rxbdr_rd(&priv->hw.hw, rx_ring->index,
+					 ENETC_RBMR);
+		rx_data = rx_data | ENETC_RBMR_EN;
+		enetc_rxbdr_wr(&priv->hw.hw, rx_ring->index, ENETC_RBMR,
+			       rx_data);
+		dev->data->rx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STARTED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_rx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *rx_ring;
+	uint32_t rx_data;
+
+	rx_ring = dev->data->rx_queues[qidx];
+	if (dev->data->rx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STARTED) {
+		rx_data = enetc_rxbdr_rd(&priv->hw.hw, rx_ring->index,
+					 ENETC_RBMR);
+		rx_data = rx_data & (~ENETC_RBMR_EN);
+		enetc_rxbdr_wr(&priv->hw.hw, rx_ring->index, ENETC_RBMR,
+			       rx_data);
+		dev->data->rx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_tx_queue_start(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *tx_ring;
+	uint32_t tx_data;
+
+	tx_ring = dev->data->tx_queues[qidx];
+	if (dev->data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STOPPED) {
+		tx_data = enetc_txbdr_rd(&priv->hw.hw, tx_ring->index,
+					 ENETC_TBMR);
+		tx_data = tx_data | ENETC_TBMR_EN;
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index, ENETC_TBMR,
+			       tx_data);
+		dev->data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STARTED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_tx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *tx_ring;
+	uint32_t tx_data;
+
+	tx_ring = dev->data->tx_queues[qidx];
+	if (dev->data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STARTED) {
+		tx_data = enetc_txbdr_rd(&priv->hw.hw, tx_ring->index,
+					 ENETC_TBMR);
+		tx_data = tx_data & (~ENETC_TBMR_EN);
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index, ENETC_TBMR,
+			       tx_data);
+		dev->data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
+	return 0;
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -686,8 +759,12 @@ static const struct eth_dev_ops enetc_ops = {
 	.dev_infos_get        = enetc_dev_infos_get,
 	.mtu_set              = enetc_mtu_set,
 	.rx_queue_setup       = enetc_rx_queue_setup,
+	.rx_queue_start       = enetc_rx_queue_start,
+	.rx_queue_stop        = enetc_rx_queue_stop,
 	.rx_queue_release     = enetc_rx_queue_release,
 	.tx_queue_setup       = enetc_tx_queue_setup,
+	.tx_queue_start       = enetc_tx_queue_start,
+	.tx_queue_stop        = enetc_tx_queue_stop,
 	.tx_queue_release     = enetc_tx_queue_release,
 	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
 };
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 10/13] net/enetc: enable Rx-Tx queue start/stop feature
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 10/13] net/enetc: enable Rx-Tx queue start/stop feature Gagandeep Singh
@ 2019-04-12 12:29         ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:29 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Rx and Tx queue start-stop and deferred queue start
features enabled.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |   2 +
 doc/guides/nics/features/enetc.ini |   1 +
 drivers/net/enetc/enetc_ethdev.c   | 185 ++++++++++++++++++++---------
 3 files changed, 134 insertions(+), 54 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index eeb07523d..26d61f67d 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -50,6 +50,8 @@ ENETC Features
 - Promiscuous
 - Multicast
 - Jumbo packets
+- Queue Start/Stop
+- Deferred Queue Start
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 0eed2cb9b..bd901faf4 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -11,6 +11,7 @@ Promiscuous mode     = Y
 Allmulticast mode    = Y
 MTU update           = Y
 Jumbo frame          = Y
+Queue start/stop     = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index 66cbf74d0..ff9301e01 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -203,7 +203,6 @@ static void
 enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
 {
 	int idx = tx_ring->index;
-	uint32_t tbmr;
 	phys_addr_t bd_address;
 
 	bd_address = (phys_addr_t)
@@ -215,9 +214,6 @@ enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
 	enetc_txbdr_wr(hw, idx, ENETC_TBLENR,
 		       ENETC_RTBLENR_LEN(tx_ring->bd_count));
 
-	tbmr = ENETC_TBMR_EN;
-	/* enable ring */
-	enetc_txbdr_wr(hw, idx, ENETC_TBMR, tbmr);
 	enetc_txbdr_wr(hw, idx, ENETC_TBCIR, 0);
 	enetc_txbdr_wr(hw, idx, ENETC_TBCISR, 0);
 	tx_ring->tcir = (void *)((size_t)hw->reg +
@@ -227,16 +223,22 @@ enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
 }
 
 static int
-enetc_alloc_tx_resources(struct rte_eth_dev *dev,
-			 uint16_t queue_idx,
-			 uint16_t nb_desc)
+enetc_tx_queue_setup(struct rte_eth_dev *dev,
+		     uint16_t queue_idx,
+		     uint16_t nb_desc,
+		     unsigned int socket_id __rte_unused,
+		     const struct rte_eth_txconf *tx_conf)
 {
-	int err;
+	int err = 0;
 	struct enetc_bdr *tx_ring;
 	struct rte_eth_dev_data *data = dev->data;
 	struct enetc_eth_adapter *priv =
 			ENETC_DEV_PRIVATE(data->dev_private);
 
+	PMD_INIT_FUNC_TRACE();
+	if (nb_desc > MAX_BD_COUNT)
+		return -1;
+
 	tx_ring = rte_zmalloc(NULL, sizeof(struct enetc_bdr), 0);
 	if (tx_ring == NULL) {
 		ENETC_PMD_ERR("Failed to allocate TX ring memory");
@@ -253,6 +255,17 @@ enetc_alloc_tx_resources(struct rte_eth_dev *dev,
 	enetc_setup_txbdr(&priv->hw.hw, tx_ring);
 	data->tx_queues[queue_idx] = tx_ring;
 
+	if (!tx_conf->tx_deferred_start) {
+		/* enable ring */
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index,
+			       ENETC_TBMR, ENETC_TBMR_EN);
+		dev->data->tx_queue_state[tx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STARTED;
+	} else {
+		dev->data->tx_queue_state[tx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
 	return 0;
 fail:
 	rte_free(tx_ring);
@@ -260,24 +273,6 @@ enetc_alloc_tx_resources(struct rte_eth_dev *dev,
 	return err;
 }
 
-static int
-enetc_tx_queue_setup(struct rte_eth_dev *dev,
-		     uint16_t queue_idx,
-		     uint16_t nb_desc,
-		     unsigned int socket_id __rte_unused,
-		     const struct rte_eth_txconf *tx_conf __rte_unused)
-{
-	int err = 0;
-
-	PMD_INIT_FUNC_TRACE();
-	if (nb_desc > MAX_BD_COUNT)
-		return -1;
-
-	err = enetc_alloc_tx_resources(dev, queue_idx, nb_desc);
-
-	return err;
-}
-
 static void
 enetc_tx_queue_release(void *txq)
 {
@@ -367,23 +362,27 @@ enetc_setup_rxbdr(struct enetc_hw *hw, struct enetc_bdr *rx_ring,
 	buf_size = (uint16_t)(rte_pktmbuf_data_room_size(rx_ring->mb_pool) -
 		   RTE_PKTMBUF_HEADROOM);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBBSR, buf_size);
-	/* enable ring */
-	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, ENETC_RBMR_EN);
 	enetc_rxbdr_wr(hw, idx, ENETC_RBPIR, 0);
 }
 
 static int
-enetc_alloc_rx_resources(struct rte_eth_dev *dev,
-			 uint16_t rx_queue_id,
-			 uint16_t nb_rx_desc,
-			 struct rte_mempool *mb_pool)
+enetc_rx_queue_setup(struct rte_eth_dev *dev,
+		     uint16_t rx_queue_id,
+		     uint16_t nb_rx_desc,
+		     unsigned int socket_id __rte_unused,
+		     const struct rte_eth_rxconf *rx_conf,
+		     struct rte_mempool *mb_pool)
 {
-	int err;
+	int err = 0;
 	struct enetc_bdr *rx_ring;
 	struct rte_eth_dev_data *data =  dev->data;
 	struct enetc_eth_adapter *adapter =
 			ENETC_DEV_PRIVATE(data->dev_private);
 
+	PMD_INIT_FUNC_TRACE();
+	if (nb_rx_desc > MAX_BD_COUNT)
+		return -1;
+
 	rx_ring = rte_zmalloc(NULL, sizeof(struct enetc_bdr), 0);
 	if (rx_ring == NULL) {
 		ENETC_PMD_ERR("Failed to allocate RX ring memory");
@@ -400,6 +399,17 @@ enetc_alloc_rx_resources(struct rte_eth_dev *dev,
 	enetc_setup_rxbdr(&adapter->hw.hw, rx_ring, mb_pool);
 	data->rx_queues[rx_queue_id] = rx_ring;
 
+	if (!rx_conf->rx_deferred_start) {
+		/* enable ring */
+		enetc_rxbdr_wr(&adapter->hw.hw, rx_ring->index, ENETC_RBMR,
+			       ENETC_RBMR_EN);
+		dev->data->rx_queue_state[rx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STARTED;
+	} else {
+		dev->data->rx_queue_state[rx_ring->index] =
+			       RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
 	return 0;
 fail:
 	rte_free(rx_ring);
@@ -407,27 +417,6 @@ enetc_alloc_rx_resources(struct rte_eth_dev *dev,
 	return err;
 }
 
-static int
-enetc_rx_queue_setup(struct rte_eth_dev *dev,
-		     uint16_t rx_queue_id,
-		     uint16_t nb_rx_desc,
-		     unsigned int socket_id __rte_unused,
-		     const struct rte_eth_rxconf *rx_conf __rte_unused,
-		     struct rte_mempool *mb_pool)
-{
-	int err = 0;
-
-	PMD_INIT_FUNC_TRACE();
-	if (nb_rx_desc > MAX_BD_COUNT)
-		return -1;
-
-	err = enetc_alloc_rx_resources(dev, rx_queue_id,
-				       nb_rx_desc,
-				       mb_pool);
-
-	return err;
-}
-
 static void
 enetc_rx_queue_release(void *rxq)
 {
@@ -661,6 +650,90 @@ enetc_dev_configure(struct rte_eth_dev *dev)
 	return 0;
 }
 
+static int
+enetc_rx_queue_start(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *rx_ring;
+	uint32_t rx_data;
+
+	rx_ring = dev->data->rx_queues[qidx];
+	if (dev->data->rx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STOPPED) {
+		rx_data = enetc_rxbdr_rd(&priv->hw.hw, rx_ring->index,
+					 ENETC_RBMR);
+		rx_data = rx_data | ENETC_RBMR_EN;
+		enetc_rxbdr_wr(&priv->hw.hw, rx_ring->index, ENETC_RBMR,
+			       rx_data);
+		dev->data->rx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STARTED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_rx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *rx_ring;
+	uint32_t rx_data;
+
+	rx_ring = dev->data->rx_queues[qidx];
+	if (dev->data->rx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STARTED) {
+		rx_data = enetc_rxbdr_rd(&priv->hw.hw, rx_ring->index,
+					 ENETC_RBMR);
+		rx_data = rx_data & (~ENETC_RBMR_EN);
+		enetc_rxbdr_wr(&priv->hw.hw, rx_ring->index, ENETC_RBMR,
+			       rx_data);
+		dev->data->rx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_tx_queue_start(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *tx_ring;
+	uint32_t tx_data;
+
+	tx_ring = dev->data->tx_queues[qidx];
+	if (dev->data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STOPPED) {
+		tx_data = enetc_txbdr_rd(&priv->hw.hw, tx_ring->index,
+					 ENETC_TBMR);
+		tx_data = tx_data | ENETC_TBMR_EN;
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index, ENETC_TBMR,
+			       tx_data);
+		dev->data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STARTED;
+	}
+
+	return 0;
+}
+
+static int
+enetc_tx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx)
+{
+	struct enetc_eth_adapter *priv =
+			ENETC_DEV_PRIVATE(dev->data->dev_private);
+	struct enetc_bdr *tx_ring;
+	uint32_t tx_data;
+
+	tx_ring = dev->data->tx_queues[qidx];
+	if (dev->data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STARTED) {
+		tx_data = enetc_txbdr_rd(&priv->hw.hw, tx_ring->index,
+					 ENETC_TBMR);
+		tx_data = tx_data & (~ENETC_TBMR_EN);
+		enetc_txbdr_wr(&priv->hw.hw, tx_ring->index, ENETC_TBMR,
+			       tx_data);
+		dev->data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED;
+	}
+
+	return 0;
+}
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -686,8 +759,12 @@ static const struct eth_dev_ops enetc_ops = {
 	.dev_infos_get        = enetc_dev_infos_get,
 	.mtu_set              = enetc_mtu_set,
 	.rx_queue_setup       = enetc_rx_queue_setup,
+	.rx_queue_start       = enetc_rx_queue_start,
+	.rx_queue_stop        = enetc_rx_queue_stop,
 	.rx_queue_release     = enetc_rx_queue_release,
 	.tx_queue_setup       = enetc_tx_queue_setup,
+	.tx_queue_start       = enetc_tx_queue_start,
+	.tx_queue_stop        = enetc_tx_queue_stop,
 	.tx_queue_release     = enetc_tx_queue_release,
 	.dev_supported_ptypes_get = enetc_supported_ptypes_get,
 };
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 11/13] net/enetc: enable CRC offload feature
  2019-04-12 12:28     ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                         ` (10 preceding siblings ...)
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 10/13] net/enetc: enable Rx-Tx queue start/stop feature Gagandeep Singh
@ 2019-04-12 12:29       ` Gagandeep Singh
  2019-04-12 12:29         ` Gagandeep Singh
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 12/13] net/enetc: enable Rx checksum offload validation Gagandeep Singh
                         ` (2 subsequent siblings)
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:29 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

CRC offload keep feature supported

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  1 +
 drivers/net/enetc/base/enetc_hw.h  |  1 +
 drivers/net/enetc/enetc.h          |  1 +
 drivers/net/enetc/enetc_ethdev.c   | 20 +++++++++++++++++---
 drivers/net/enetc/enetc_rxtx.c     |  6 ++++--
 6 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 26d61f67d..26204601a 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -52,6 +52,7 @@ ENETC Features
 - Jumbo packets
 - Queue Start/Stop
 - Deferred Queue Start
+- CRC offload
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index bd901faf4..101dc0a69 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -12,6 +12,7 @@ Allmulticast mode    = Y
 MTU update           = Y
 Jumbo frame          = Y
 Queue start/stop     = Y
+CRC offload          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 2eb1df30e..261ad157a 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -97,6 +97,7 @@ enum enetc_bdr_type {TX, RX};
 #define ENETC_PM0_CMD_CFG		0x08008
 #define ENETC_PM0_TX_EN			BIT(0)
 #define ENETC_PM0_RX_EN			BIT(1)
+#define ENETC_PM0_CRC			BIT(6)
 
 #define ENETC_PM0_MAXFRM		0x08014
 #define ENETC_SET_TX_MTU(val)		((val) << 16)
diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index e494eb8b8..8c830a5c0 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -69,6 +69,7 @@ struct enetc_bdr {
 		void *tcisr; /* Tx */
 		int next_to_alloc; /* Rx */
 	};
+	uint8_t	crc_len; /* 0 if CRC stripped, 4 otherwise */
 };
 
 /*
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index ff9301e01..ffae8ae25 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -162,7 +162,9 @@ enetc_dev_infos_get(struct rte_eth_dev *dev __rte_unused,
 	dev_info->max_rx_queues = MAX_RX_RINGS;
 	dev_info->max_tx_queues = MAX_TX_RINGS;
 	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
-	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_JUMBO_FRAME;
+	dev_info->rx_offload_capa =
+		(DEV_RX_OFFLOAD_KEEP_CRC |
+		 DEV_RX_OFFLOAD_JUMBO_FRAME);
 }
 
 static int
@@ -378,6 +380,7 @@ enetc_rx_queue_setup(struct rte_eth_dev *dev,
 	struct rte_eth_dev_data *data =  dev->data;
 	struct enetc_eth_adapter *adapter =
 			ENETC_DEV_PRIVATE(data->dev_private);
+	uint64_t rx_offloads = data->dev_conf.rxmode.offloads;
 
 	PMD_INIT_FUNC_TRACE();
 	if (nb_rx_desc > MAX_BD_COUNT)
@@ -410,6 +413,9 @@ enetc_rx_queue_setup(struct rte_eth_dev *dev,
 			       RTE_ETH_QUEUE_STATE_STOPPED;
 	}
 
+	rx_ring->crc_len = (uint8_t)((rx_offloads & DEV_RX_OFFLOAD_KEEP_CRC) ?
+				     ETHER_CRC_LEN : 0);
+
 	return 0;
 fail:
 	rte_free(rx_ring);
@@ -625,11 +631,11 @@ enetc_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 static int
 enetc_dev_configure(struct rte_eth_dev *dev)
 {
-	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
-	uint64_t rx_offloads = eth_conf->rxmode.offloads;
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct enetc_hw *enetc_hw = &hw->hw;
+	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
+	uint64_t rx_offloads = eth_conf->rxmode.offloads;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -647,6 +653,14 @@ enetc_dev_configure(struct rte_eth_dev *dev)
 		dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
 	}
 
+	if (rx_offloads & DEV_RX_OFFLOAD_KEEP_CRC) {
+		int config;
+
+		config = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+		config |= ENETC_PM0_CRC;
+		enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG, config);
+	}
+
 	return 0;
 }
 
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 42f16cab1..4a758d25a 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -208,8 +208,10 @@ enetc_clean_rx_ring(struct enetc_bdr *rx_ring,
 		if (!bd_status)
 			break;
 
-		rx_swbd->buffer_addr->pkt_len = rxbd->r.buf_len;
-		rx_swbd->buffer_addr->data_len = rxbd->r.buf_len;
+		rx_swbd->buffer_addr->pkt_len = rxbd->r.buf_len -
+						rx_ring->crc_len;
+		rx_swbd->buffer_addr->data_len = rxbd->r.buf_len -
+						 rx_ring->crc_len;
 		rx_swbd->buffer_addr->hash.rss = rxbd->r.rss_hash;
 		rx_swbd->buffer_addr->ol_flags = 0;
 		enetc_dev_rx_parse(rx_swbd->buffer_addr,
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 11/13] net/enetc: enable CRC offload feature
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 11/13] net/enetc: enable CRC offload feature Gagandeep Singh
@ 2019-04-12 12:29         ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:29 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

CRC offload keep feature supported

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/enetc.rst          |  1 +
 doc/guides/nics/features/enetc.ini |  1 +
 drivers/net/enetc/base/enetc_hw.h  |  1 +
 drivers/net/enetc/enetc.h          |  1 +
 drivers/net/enetc/enetc_ethdev.c   | 20 +++++++++++++++++---
 drivers/net/enetc/enetc_rxtx.c     |  6 ++++--
 6 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/doc/guides/nics/enetc.rst b/doc/guides/nics/enetc.rst
index 26d61f67d..26204601a 100644
--- a/doc/guides/nics/enetc.rst
+++ b/doc/guides/nics/enetc.rst
@@ -52,6 +52,7 @@ ENETC Features
 - Jumbo packets
 - Queue Start/Stop
 - Deferred Queue Start
+- CRC offload
 
 NIC Driver (PMD)
 ~~~~~~~~~~~~~~~~
diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index bd901faf4..101dc0a69 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -12,6 +12,7 @@ Allmulticast mode    = Y
 MTU update           = Y
 Jumbo frame          = Y
 Queue start/stop     = Y
+CRC offload          = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 2eb1df30e..261ad157a 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -97,6 +97,7 @@ enum enetc_bdr_type {TX, RX};
 #define ENETC_PM0_CMD_CFG		0x08008
 #define ENETC_PM0_TX_EN			BIT(0)
 #define ENETC_PM0_RX_EN			BIT(1)
+#define ENETC_PM0_CRC			BIT(6)
 
 #define ENETC_PM0_MAXFRM		0x08014
 #define ENETC_SET_TX_MTU(val)		((val) << 16)
diff --git a/drivers/net/enetc/enetc.h b/drivers/net/enetc/enetc.h
index e494eb8b8..8c830a5c0 100644
--- a/drivers/net/enetc/enetc.h
+++ b/drivers/net/enetc/enetc.h
@@ -69,6 +69,7 @@ struct enetc_bdr {
 		void *tcisr; /* Tx */
 		int next_to_alloc; /* Rx */
 	};
+	uint8_t	crc_len; /* 0 if CRC stripped, 4 otherwise */
 };
 
 /*
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index ff9301e01..ffae8ae25 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -162,7 +162,9 @@ enetc_dev_infos_get(struct rte_eth_dev *dev __rte_unused,
 	dev_info->max_rx_queues = MAX_RX_RINGS;
 	dev_info->max_tx_queues = MAX_TX_RINGS;
 	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
-	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_JUMBO_FRAME;
+	dev_info->rx_offload_capa =
+		(DEV_RX_OFFLOAD_KEEP_CRC |
+		 DEV_RX_OFFLOAD_JUMBO_FRAME);
 }
 
 static int
@@ -378,6 +380,7 @@ enetc_rx_queue_setup(struct rte_eth_dev *dev,
 	struct rte_eth_dev_data *data =  dev->data;
 	struct enetc_eth_adapter *adapter =
 			ENETC_DEV_PRIVATE(data->dev_private);
+	uint64_t rx_offloads = data->dev_conf.rxmode.offloads;
 
 	PMD_INIT_FUNC_TRACE();
 	if (nb_rx_desc > MAX_BD_COUNT)
@@ -410,6 +413,9 @@ enetc_rx_queue_setup(struct rte_eth_dev *dev,
 			       RTE_ETH_QUEUE_STATE_STOPPED;
 	}
 
+	rx_ring->crc_len = (uint8_t)((rx_offloads & DEV_RX_OFFLOAD_KEEP_CRC) ?
+				     ETHER_CRC_LEN : 0);
+
 	return 0;
 fail:
 	rte_free(rx_ring);
@@ -625,11 +631,11 @@ enetc_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 static int
 enetc_dev_configure(struct rte_eth_dev *dev)
 {
-	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
-	uint64_t rx_offloads = eth_conf->rxmode.offloads;
 	struct enetc_eth_hw *hw =
 		ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct enetc_hw *enetc_hw = &hw->hw;
+	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
+	uint64_t rx_offloads = eth_conf->rxmode.offloads;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -647,6 +653,14 @@ enetc_dev_configure(struct rte_eth_dev *dev)
 		dev->data->mtu = ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN;
 	}
 
+	if (rx_offloads & DEV_RX_OFFLOAD_KEEP_CRC) {
+		int config;
+
+		config = enetc_port_rd(enetc_hw, ENETC_PM0_CMD_CFG);
+		config |= ENETC_PM0_CRC;
+		enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG, config);
+	}
+
 	return 0;
 }
 
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 42f16cab1..4a758d25a 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -208,8 +208,10 @@ enetc_clean_rx_ring(struct enetc_bdr *rx_ring,
 		if (!bd_status)
 			break;
 
-		rx_swbd->buffer_addr->pkt_len = rxbd->r.buf_len;
-		rx_swbd->buffer_addr->data_len = rxbd->r.buf_len;
+		rx_swbd->buffer_addr->pkt_len = rxbd->r.buf_len -
+						rx_ring->crc_len;
+		rx_swbd->buffer_addr->data_len = rxbd->r.buf_len -
+						 rx_ring->crc_len;
 		rx_swbd->buffer_addr->hash.rss = rxbd->r.rss_hash;
 		rx_swbd->buffer_addr->ol_flags = 0;
 		enetc_dev_rx_parse(rx_swbd->buffer_addr,
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 12/13] net/enetc: enable Rx checksum offload validation
  2019-04-12 12:28     ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                         ` (11 preceding siblings ...)
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 11/13] net/enetc: enable CRC offload feature Gagandeep Singh
@ 2019-04-12 12:29       ` Gagandeep Singh
  2019-04-12 12:29         ` Gagandeep Singh
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 13/13] net/enetc: fix crash at high speed traffic Gagandeep Singh
  2019-04-16  7:41       ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Ferruh Yigit
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:29 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Checksum Validation on Rx is supported.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/features/enetc.ini |   2 +
 drivers/net/enetc/base/enetc_hw.h  |   5 ++
 drivers/net/enetc/enetc_ethdev.c   |  15 +++-
 drivers/net/enetc/enetc_rxtx.c     | 107 +++++++++++++++++++++++++----
 4 files changed, 115 insertions(+), 14 deletions(-)

diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 101dc0a69..39a520172 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -13,6 +13,8 @@ MTU update           = Y
 Jumbo frame          = Y
 Queue start/stop     = Y
 CRC offload          = Y
+L3 checksum offload  = P
+L4 checksum offload  = P
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 261ad157a..ff2bda592 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -99,6 +99,10 @@ enum enetc_bdr_type {TX, RX};
 #define ENETC_PM0_RX_EN			BIT(1)
 #define ENETC_PM0_CRC			BIT(6)
 
+#define ENETC_PAR_PORT_CFG		0x03050
+#define L3_CKSUM			BIT(0)
+#define L4_CKSUM			BIT(1)
+
 #define ENETC_PM0_MAXFRM		0x08014
 #define ENETC_SET_TX_MTU(val)		((val) << 16)
 #define ENETC_SET_MAXFRM(val)		((val) & 0xffff)
@@ -182,6 +186,7 @@ enum enetc_bdr_type {TX, RX};
 #define ENETC_TXBD_FLAGS_F		BIT(15)
 
 /* ENETC Parsed values (Little Endian) */
+#define ENETC_PARSE_ERROR		0x8000
 #define ENETC_PKT_TYPE_ETHER            0x0060
 #define ENETC_PKT_TYPE_IPV4             0x0000
 #define ENETC_PKT_TYPE_IPV6             0x0020
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index ffae8ae25..362e0740c 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -163,7 +163,10 @@ enetc_dev_infos_get(struct rte_eth_dev *dev __rte_unused,
 	dev_info->max_tx_queues = MAX_TX_RINGS;
 	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
 	dev_info->rx_offload_capa =
-		(DEV_RX_OFFLOAD_KEEP_CRC |
+		(DEV_RX_OFFLOAD_IPV4_CKSUM |
+		 DEV_RX_OFFLOAD_UDP_CKSUM |
+		 DEV_RX_OFFLOAD_TCP_CKSUM |
+		 DEV_RX_OFFLOAD_KEEP_CRC |
 		 DEV_RX_OFFLOAD_JUMBO_FRAME);
 }
 
@@ -636,6 +639,7 @@ enetc_dev_configure(struct rte_eth_dev *dev)
 	struct enetc_hw *enetc_hw = &hw->hw;
 	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
 	uint64_t rx_offloads = eth_conf->rxmode.offloads;
+	uint32_t checksum = L3_CKSUM | L4_CKSUM;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -661,6 +665,15 @@ enetc_dev_configure(struct rte_eth_dev *dev)
 		enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG, config);
 	}
 
+	if (rx_offloads & DEV_RX_OFFLOAD_IPV4_CKSUM)
+		checksum &= ~L3_CKSUM;
+
+	if (rx_offloads & (DEV_RX_OFFLOAD_UDP_CKSUM | DEV_RX_OFFLOAD_TCP_CKSUM))
+		checksum &= ~L4_CKSUM;
+
+	enetc_port_wr(enetc_hw, ENETC_PAR_PORT_CFG, checksum);
+
+
 	return 0;
 }
 
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 4a758d25a..0ce7dbee7 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -115,69 +115,150 @@ enetc_refill_rx_ring(struct enetc_bdr *rx_ring, const int buff_cnt)
 	return j;
 }
 
+static inline void enetc_slow_parsing(struct rte_mbuf *m,
+				     uint64_t parse_results)
+{
+	m->ol_flags &= ~(PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD);
+
+	switch (parse_results) {
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4;
+		m->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6;
+		m->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_TCP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_TCP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_TCP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_TCP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_UDP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_UDP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_UDP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_UDP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_SCTP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_SCTP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_SCTP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_SCTP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_ICMP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_ICMP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_ICMP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_ICMP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	/* More switch cases can be added */
+	default:
+		m->packet_type = RTE_PTYPE_UNKNOWN;
+		m->ol_flags |= PKT_RX_IP_CKSUM_UNKNOWN |
+			       PKT_RX_L4_CKSUM_UNKNOWN;
+	}
+}
+
 
 static inline void __attribute__((hot))
 enetc_dev_rx_parse(struct rte_mbuf *m, uint16_t parse_results)
 {
 	ENETC_PMD_DP_DEBUG("parse summary = 0x%x   ", parse_results);
+	m->ol_flags |= PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD;
 
-	m->packet_type = RTE_PTYPE_UNKNOWN;
 	switch (parse_results) {
 	case ENETC_PKT_TYPE_ETHER:
 		m->packet_type = RTE_PTYPE_L2_ETHER;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_TCP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_TCP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_TCP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_TCP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_UDP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_UDP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_UDP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_UDP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_SCTP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_SCTP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_SCTP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_SCTP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_ICMP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_ICMP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_ICMP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_ICMP;
-		break;
+		return;
 	/* More switch cases can be added */
 	default:
-		m->packet_type = RTE_PTYPE_UNKNOWN;
+		enetc_slow_parsing(m, parse_results);
 	}
+
 }
 
 static int
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 12/13] net/enetc: enable Rx checksum offload validation
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 12/13] net/enetc: enable Rx checksum offload validation Gagandeep Singh
@ 2019-04-12 12:29         ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:29 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh

Checksum Validation on Rx is supported.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/features/enetc.ini |   2 +
 drivers/net/enetc/base/enetc_hw.h  |   5 ++
 drivers/net/enetc/enetc_ethdev.c   |  15 +++-
 drivers/net/enetc/enetc_rxtx.c     | 107 +++++++++++++++++++++++++----
 4 files changed, 115 insertions(+), 14 deletions(-)

diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 101dc0a69..39a520172 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -13,6 +13,8 @@ MTU update           = Y
 Jumbo frame          = Y
 Queue start/stop     = Y
 CRC offload          = Y
+L3 checksum offload  = P
+L4 checksum offload  = P
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 261ad157a..ff2bda592 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -99,6 +99,10 @@ enum enetc_bdr_type {TX, RX};
 #define ENETC_PM0_RX_EN			BIT(1)
 #define ENETC_PM0_CRC			BIT(6)
 
+#define ENETC_PAR_PORT_CFG		0x03050
+#define L3_CKSUM			BIT(0)
+#define L4_CKSUM			BIT(1)
+
 #define ENETC_PM0_MAXFRM		0x08014
 #define ENETC_SET_TX_MTU(val)		((val) << 16)
 #define ENETC_SET_MAXFRM(val)		((val) & 0xffff)
@@ -182,6 +186,7 @@ enum enetc_bdr_type {TX, RX};
 #define ENETC_TXBD_FLAGS_F		BIT(15)
 
 /* ENETC Parsed values (Little Endian) */
+#define ENETC_PARSE_ERROR		0x8000
 #define ENETC_PKT_TYPE_ETHER            0x0060
 #define ENETC_PKT_TYPE_IPV4             0x0000
 #define ENETC_PKT_TYPE_IPV6             0x0020
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index ffae8ae25..362e0740c 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -163,7 +163,10 @@ enetc_dev_infos_get(struct rte_eth_dev *dev __rte_unused,
 	dev_info->max_tx_queues = MAX_TX_RINGS;
 	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
 	dev_info->rx_offload_capa =
-		(DEV_RX_OFFLOAD_KEEP_CRC |
+		(DEV_RX_OFFLOAD_IPV4_CKSUM |
+		 DEV_RX_OFFLOAD_UDP_CKSUM |
+		 DEV_RX_OFFLOAD_TCP_CKSUM |
+		 DEV_RX_OFFLOAD_KEEP_CRC |
 		 DEV_RX_OFFLOAD_JUMBO_FRAME);
 }
 
@@ -636,6 +639,7 @@ enetc_dev_configure(struct rte_eth_dev *dev)
 	struct enetc_hw *enetc_hw = &hw->hw;
 	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
 	uint64_t rx_offloads = eth_conf->rxmode.offloads;
+	uint32_t checksum = L3_CKSUM | L4_CKSUM;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -661,6 +665,15 @@ enetc_dev_configure(struct rte_eth_dev *dev)
 		enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG, config);
 	}
 
+	if (rx_offloads & DEV_RX_OFFLOAD_IPV4_CKSUM)
+		checksum &= ~L3_CKSUM;
+
+	if (rx_offloads & (DEV_RX_OFFLOAD_UDP_CKSUM | DEV_RX_OFFLOAD_TCP_CKSUM))
+		checksum &= ~L4_CKSUM;
+
+	enetc_port_wr(enetc_hw, ENETC_PAR_PORT_CFG, checksum);
+
+
 	return 0;
 }
 
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 4a758d25a..0ce7dbee7 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -115,69 +115,150 @@ enetc_refill_rx_ring(struct enetc_bdr *rx_ring, const int buff_cnt)
 	return j;
 }
 
+static inline void enetc_slow_parsing(struct rte_mbuf *m,
+				     uint64_t parse_results)
+{
+	m->ol_flags &= ~(PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD);
+
+	switch (parse_results) {
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4;
+		m->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6;
+		m->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_TCP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_TCP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_TCP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_TCP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_UDP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_UDP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_UDP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_UDP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_SCTP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_SCTP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_SCTP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_SCTP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_ICMP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_ICMP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_ICMP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_ICMP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	/* More switch cases can be added */
+	default:
+		m->packet_type = RTE_PTYPE_UNKNOWN;
+		m->ol_flags |= PKT_RX_IP_CKSUM_UNKNOWN |
+			       PKT_RX_L4_CKSUM_UNKNOWN;
+	}
+}
+
 
 static inline void __attribute__((hot))
 enetc_dev_rx_parse(struct rte_mbuf *m, uint16_t parse_results)
 {
 	ENETC_PMD_DP_DEBUG("parse summary = 0x%x   ", parse_results);
+	m->ol_flags |= PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD;
 
-	m->packet_type = RTE_PTYPE_UNKNOWN;
 	switch (parse_results) {
 	case ENETC_PKT_TYPE_ETHER:
 		m->packet_type = RTE_PTYPE_L2_ETHER;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_TCP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_TCP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_TCP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_TCP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_UDP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_UDP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_UDP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_UDP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_SCTP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_SCTP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_SCTP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_SCTP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_ICMP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_ICMP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_ICMP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_ICMP;
-		break;
+		return;
 	/* More switch cases can be added */
 	default:
-		m->packet_type = RTE_PTYPE_UNKNOWN;
+		enetc_slow_parsing(m, parse_results);
 	}
+
 }
 
 static int
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 13/13] net/enetc: fix crash at high speed traffic
  2019-04-12 12:28     ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                         ` (12 preceding siblings ...)
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 12/13] net/enetc: enable Rx checksum offload validation Gagandeep Singh
@ 2019-04-12 12:29       ` Gagandeep Singh
  2019-04-12 12:29         ` Gagandeep Singh
  2019-04-16  7:41       ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Ferruh Yigit
  14 siblings, 1 reply; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:29 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh, stable

On xmit side, there should be a check whether BD ring
has free BDs available before transmit a packet to avoid
data corruption and buffer leak issue.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: stable@dpdk.org

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_rxtx.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 0ce7dbee7..81b0ef3b1 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -49,11 +49,16 @@ enetc_xmit_pkts(void *tx_queue,
 		uint16_t nb_pkts)
 {
 	struct enetc_swbd *tx_swbd;
-	int i, start;
+	int i, start, bds_to_use;
 	struct enetc_tx_bd *txbd;
 	struct enetc_bdr *tx_ring = (struct enetc_bdr *)tx_queue;
 
 	i = tx_ring->next_to_use;
+
+	bds_to_use = enetc_bd_unused(tx_ring);
+	if (bds_to_use < nb_pkts)
+		nb_pkts = bds_to_use;
+
 	start = 0;
 	while (nb_pkts--) {
 		enetc_clean_tx_ring(tx_ring);
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* [dpdk-dev] [PATCH v4 13/13] net/enetc: fix crash at high speed traffic
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 13/13] net/enetc: fix crash at high speed traffic Gagandeep Singh
@ 2019-04-12 12:29         ` Gagandeep Singh
  0 siblings, 0 replies; 126+ messages in thread
From: Gagandeep Singh @ 2019-04-12 12:29 UTC (permalink / raw)
  To: dev, ferruh.yigit; +Cc: Gagandeep Singh, stable

On xmit side, there should be a check whether BD ring
has free BDs available before transmit a packet to avoid
data corruption and buffer leak issue.

Fixes: 469c6111a799 ("net/enetc: enable Rx and Tx")
Cc: stable@dpdk.org

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/net/enetc/enetc_rxtx.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 0ce7dbee7..81b0ef3b1 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -49,11 +49,16 @@ enetc_xmit_pkts(void *tx_queue,
 		uint16_t nb_pkts)
 {
 	struct enetc_swbd *tx_swbd;
-	int i, start;
+	int i, start, bds_to_use;
 	struct enetc_tx_bd *txbd;
 	struct enetc_bdr *tx_ring = (struct enetc_bdr *)tx_queue;
 
 	i = tx_ring->next_to_use;
+
+	bds_to_use = enetc_bd_unused(tx_ring);
+	if (bds_to_use < nb_pkts)
+		nb_pkts = bds_to_use;
+
 	start = 0;
 	while (nb_pkts--) {
 		enetc_clean_tx_ring(tx_ring);
-- 
2.19.1


^ permalink raw reply	[flat|nested] 126+ messages in thread

* Re: [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes
  2019-04-12 12:28     ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
                         ` (13 preceding siblings ...)
  2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 13/13] net/enetc: fix crash at high speed traffic Gagandeep Singh
@ 2019-04-16  7:41       ` Ferruh Yigit
  2019-04-16  7:41         ` Ferruh Yigit
  2019-04-16  8:28         ` Ferruh Yigit
  14 siblings, 2 replies; 126+ messages in thread
From: Ferruh Yigit @ 2019-04-16  7:41 UTC (permalink / raw)
  To: Gagandeep Singh, dev

On 4/12/2019 1:28 PM, Gagandeep Singh wrote:
> *V1 log:
>  * support added for MTU, jumbo frame, queue start/stop, promiscuous,
>    multicast, crc offload, RX checksum validation, basic stats
>  * some bug fixes
> 
> V2 change-log:
>  * remove unneeded code from stats get
>  * fix big endian compilation
> 
> v3 change-log:
>  * commit message updated for 03/13 patch
>  * add stable to Cc for fixes
> 
> v4 change-log:
>  * Removed checkpatch errors for CRLF
> 
> Gagandeep Singh (13):
>   net/enetc: support physical addressing mode
>   net/enetc: fix SMMU unhandled context fault
>   net/enetc: fix big endian build and correct buffer allocation
>   net/enetc: set interface mode for SXGMII
>   net/enetc: add basic statistics
>   net/enetc: replace register read/write macros with functions
>   net/enetc: remove forward declarations
>   net/enetc: enable promiscuous and allmulticast feature
>   net/enetc: add MTU update and jumbo frames support
>   net/enetc: enable Rx-Tx queue start/stop feature
>   net/enetc: enable CRC offload feature
>   net/enetc: enable Rx checksum offload validation
>   net/enetc: fix crash at high speed traffic

Series applied to dpdk-next-net/master, thanks.

^ permalink raw reply	[flat|nested] 126+ messages in thread

* Re: [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes
  2019-04-16  7:41       ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Ferruh Yigit
@ 2019-04-16  7:41         ` Ferruh Yigit
  2019-04-16  8:28         ` Ferruh Yigit
  1 sibling, 0 replies; 126+ messages in thread
From: Ferruh Yigit @ 2019-04-16  7:41 UTC (permalink / raw)
  To: Gagandeep Singh, dev

On 4/12/2019 1:28 PM, Gagandeep Singh wrote:
> *V1 log:
>  * support added for MTU, jumbo frame, queue start/stop, promiscuous,
>    multicast, crc offload, RX checksum validation, basic stats
>  * some bug fixes
> 
> V2 change-log:
>  * remove unneeded code from stats get
>  * fix big endian compilation
> 
> v3 change-log:
>  * commit message updated for 03/13 patch
>  * add stable to Cc for fixes
> 
> v4 change-log:
>  * Removed checkpatch errors for CRLF
> 
> Gagandeep Singh (13):
>   net/enetc: support physical addressing mode
>   net/enetc: fix SMMU unhandled context fault
>   net/enetc: fix big endian build and correct buffer allocation
>   net/enetc: set interface mode for SXGMII
>   net/enetc: add basic statistics
>   net/enetc: replace register read/write macros with functions
>   net/enetc: remove forward declarations
>   net/enetc: enable promiscuous and allmulticast feature
>   net/enetc: add MTU update and jumbo frames support
>   net/enetc: enable Rx-Tx queue start/stop feature
>   net/enetc: enable CRC offload feature
>   net/enetc: enable Rx checksum offload validation
>   net/enetc: fix crash at high speed traffic

Series applied to dpdk-next-net/master, thanks.


^ permalink raw reply	[flat|nested] 126+ messages in thread

* Re: [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes
  2019-04-16  7:41       ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Ferruh Yigit
  2019-04-16  7:41         ` Ferruh Yigit
@ 2019-04-16  8:28         ` Ferruh Yigit
  2019-04-16  8:28           ` Ferruh Yigit
  1 sibling, 1 reply; 126+ messages in thread
From: Ferruh Yigit @ 2019-04-16  8:28 UTC (permalink / raw)
  To: Gagandeep Singh, dev

On 4/16/2019 8:41 AM, Ferruh Yigit wrote:
> On 4/12/2019 1:28 PM, Gagandeep Singh wrote:
>> *V1 log:
>>  * support added for MTU, jumbo frame, queue start/stop, promiscuous,
>>    multicast, crc offload, RX checksum validation, basic stats
>>  * some bug fixes
>>
>> V2 change-log:
>>  * remove unneeded code from stats get
>>  * fix big endian compilation
>>
>> v3 change-log:
>>  * commit message updated for 03/13 patch
>>  * add stable to Cc for fixes
>>
>> v4 change-log:
>>  * Removed checkpatch errors for CRLF
>>
>> Gagandeep Singh (13):
>>   net/enetc: support physical addressing mode
>>   net/enetc: fix SMMU unhandled context fault
>>   net/enetc: fix big endian build and correct buffer allocation
>>   net/enetc: set interface mode for SXGMII
>>   net/enetc: add basic statistics
>>   net/enetc: replace register read/write macros with functions
>>   net/enetc: remove forward declarations
>>   net/enetc: enable promiscuous and allmulticast feature
>>   net/enetc: add MTU update and jumbo frames support
>>   net/enetc: enable Rx-Tx queue start/stop feature
>>   net/enetc: enable CRC offload feature
>>   net/enetc: enable Rx checksum offload validation
>>   net/enetc: fix crash at high speed traffic
> 
> Series applied to dpdk-next-net/master, thanks.
> 

Hi Gagandeep,

Can you please send a release notes update to document the update in the PMD, I
can squash into the patchset if it comes in time.

Thanks,
ferruh

^ permalink raw reply	[flat|nested] 126+ messages in thread

* Re: [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes
  2019-04-16  8:28         ` Ferruh Yigit
@ 2019-04-16  8:28           ` Ferruh Yigit
  0 siblings, 0 replies; 126+ messages in thread
From: Ferruh Yigit @ 2019-04-16  8:28 UTC (permalink / raw)
  To: Gagandeep Singh, dev

On 4/16/2019 8:41 AM, Ferruh Yigit wrote:
> On 4/12/2019 1:28 PM, Gagandeep Singh wrote:
>> *V1 log:
>>  * support added for MTU, jumbo frame, queue start/stop, promiscuous,
>>    multicast, crc offload, RX checksum validation, basic stats
>>  * some bug fixes
>>
>> V2 change-log:
>>  * remove unneeded code from stats get
>>  * fix big endian compilation
>>
>> v3 change-log:
>>  * commit message updated for 03/13 patch
>>  * add stable to Cc for fixes
>>
>> v4 change-log:
>>  * Removed checkpatch errors for CRLF
>>
>> Gagandeep Singh (13):
>>   net/enetc: support physical addressing mode
>>   net/enetc: fix SMMU unhandled context fault
>>   net/enetc: fix big endian build and correct buffer allocation
>>   net/enetc: set interface mode for SXGMII
>>   net/enetc: add basic statistics
>>   net/enetc: replace register read/write macros with functions
>>   net/enetc: remove forward declarations
>>   net/enetc: enable promiscuous and allmulticast feature
>>   net/enetc: add MTU update and jumbo frames support
>>   net/enetc: enable Rx-Tx queue start/stop feature
>>   net/enetc: enable CRC offload feature
>>   net/enetc: enable Rx checksum offload validation
>>   net/enetc: fix crash at high speed traffic
> 
> Series applied to dpdk-next-net/master, thanks.
> 

Hi Gagandeep,

Can you please send a release notes update to document the update in the PMD, I
can squash into the patchset if it comes in time.

Thanks,
ferruh

^ permalink raw reply	[flat|nested] 126+ messages in thread

end of thread, other threads:[~2019-04-16  8:29 UTC | newest]

Thread overview: 126+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-04-08 11:22 [dpdk-dev] [PATCH 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
2019-04-08 11:22 ` Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 01/13] net/enetc: support physical addressing mode Gagandeep Singh
2019-04-08 11:22   ` Gagandeep Singh
2019-04-08 13:16   ` Ferruh Yigit
2019-04-08 13:16     ` Ferruh Yigit
2019-04-08 11:22 ` [dpdk-dev] [PATCH 02/13] net/enetc: fix SMMU unhandled context fault Gagandeep Singh
2019-04-08 11:22   ` Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 03/13] net/enetc: use correct buffer allocation API Gagandeep Singh
2019-04-08 11:22   ` Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 04/13] net/enetc: set interface mode for SXGMII Gagandeep Singh
2019-04-08 11:22   ` Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 05/13] net/enetc: add statistics APIs Gagandeep Singh
2019-04-08 11:22   ` Gagandeep Singh
2019-04-08 11:35   ` David Marchand
2019-04-08 11:35     ` David Marchand
2019-04-10 11:18     ` [dpdk-dev] [EXT] " Gagandeep Singh
2019-04-10 11:18       ` Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 06/13] net/enetc: replace register read/write macros with functions Gagandeep Singh
2019-04-08 11:22   ` Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 07/13] net/enetc: remove forward declarations Gagandeep Singh
2019-04-08 11:22   ` Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 08/13] net/enetc: enable promiscuous and allmulticast feature Gagandeep Singh
2019-04-08 11:22   ` Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 09/13] net/enetc: add MTU update and jumbo frames support Gagandeep Singh
2019-04-08 11:22   ` Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 10/13] net/enetc: enable Rx-Tx queue start/stop feature Gagandeep Singh
2019-04-08 11:22   ` Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 11/13] net/enetc: enable CRC offload feature Gagandeep Singh
2019-04-08 11:22   ` Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 12/13] net/enetc: enable Rx checksum offload validation Gagandeep Singh
2019-04-08 11:22   ` Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 13/13] net/enetc: fix crash at high speed traffic Gagandeep Singh
2019-04-08 11:22   ` Gagandeep Singh
2019-04-12  7:04 ` [dpdk-dev] [PATCH v2 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
2019-04-12  7:04   ` Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 01/13] net/enetc: support physical addressing mode Gagandeep Singh
2019-04-12  7:04     ` Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 02/13] net/enetc: fix SMMU unhandled context fault Gagandeep Singh
2019-04-12  7:04     ` Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 03/13] net/enetc: use correct buffer allocation API Gagandeep Singh
2019-04-12  7:04     ` Gagandeep Singh
2019-04-12  8:37     ` Thomas Monjalon
2019-04-12  8:37       ` Thomas Monjalon
2019-04-12  8:50       ` [dpdk-dev] [EXT] " Gagandeep Singh
2019-04-12  8:50         ` Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 04/13] net/enetc: set interface mode for SXGMII Gagandeep Singh
2019-04-12  7:04     ` Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 05/13] net/enetc: add basic statistics Gagandeep Singh
2019-04-12  7:04     ` Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 06/13] net/enetc: replace register read/write macros with functions Gagandeep Singh
2019-04-12  7:04     ` Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 07/13] net/enetc: remove forward declarations Gagandeep Singh
2019-04-12  7:04     ` Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 08/13] net/enetc: enable promiscuous and allmulticast feature Gagandeep Singh
2019-04-12  7:04     ` Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 09/13] net/enetc: add MTU update and jumbo frames support Gagandeep Singh
2019-04-12  7:04     ` Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 10/13] net/enetc: enable Rx-Tx queue start/stop feature Gagandeep Singh
2019-04-12  7:04     ` Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 11/13] net/enetc: enable CRC offload feature Gagandeep Singh
2019-04-12  7:04     ` Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 12/13] net/enetc: enable Rx checksum offload validation Gagandeep Singh
2019-04-12  7:04     ` Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 13/13] net/enetc: fix crash at high speed traffic Gagandeep Singh
2019-04-12  7:04     ` Gagandeep Singh
2019-04-12 11:01   ` [dpdk-dev] [PATCH v3 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
2019-04-12 11:01     ` Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 01/13] net/enetc: support physical addressing mode Gagandeep Singh
2019-04-12 11:01       ` Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 02/13] net/enetc: fix SMMU unhandled context fault Gagandeep Singh
2019-04-12 11:01       ` Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 03/13] net/enetc: fix big endian build and correct buffer allocation Gagandeep Singh
2019-04-12 11:01       ` Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 04/13] net/enetc: set interface mode for SXGMII Gagandeep Singh
2019-04-12 11:01       ` Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 05/13] net/enetc: add basic statistics Gagandeep Singh
2019-04-12 11:01       ` Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 06/13] net/enetc: replace register read/write macros with functions Gagandeep Singh
2019-04-12 11:01       ` Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 07/13] net/enetc: remove forward declarations Gagandeep Singh
2019-04-12 11:01       ` Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 08/13] net/enetc: enable promiscuous and allmulticast feature Gagandeep Singh
2019-04-12 11:01       ` Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 09/13] net/enetc: add MTU update and jumbo frames support Gagandeep Singh
2019-04-12 11:01       ` Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 10/13] net/enetc: enable Rx-Tx queue start/stop feature Gagandeep Singh
2019-04-12 11:01       ` Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 11/13] net/enetc: enable CRC offload feature Gagandeep Singh
2019-04-12 11:01       ` Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 12/13] net/enetc: enable Rx checksum offload validation Gagandeep Singh
2019-04-12 11:01       ` Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 13/13] net/enetc: fix crash at high speed traffic Gagandeep Singh
2019-04-12 11:01       ` Gagandeep Singh
2019-04-12 12:28     ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
2019-04-12 12:28       ` Gagandeep Singh
2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 01/13] net/enetc: support physical addressing mode Gagandeep Singh
2019-04-12 12:28         ` Gagandeep Singh
2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 02/13] net/enetc: fix SMMU unhandled context fault Gagandeep Singh
2019-04-12 12:28         ` Gagandeep Singh
2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 03/13] net/enetc: fix big endian build and correct buffer allocation Gagandeep Singh
2019-04-12 12:28         ` Gagandeep Singh
2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 04/13] net/enetc: set interface mode for SXGMII Gagandeep Singh
2019-04-12 12:28         ` Gagandeep Singh
2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 05/13] net/enetc: add basic statistics Gagandeep Singh
2019-04-12 12:28         ` Gagandeep Singh
2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 06/13] net/enetc: replace register read/write macros with functions Gagandeep Singh
2019-04-12 12:29         ` Gagandeep Singh
2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 07/13] net/enetc: remove forward declarations Gagandeep Singh
2019-04-12 12:29         ` Gagandeep Singh
2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 08/13] net/enetc: enable promiscuous and allmulticast feature Gagandeep Singh
2019-04-12 12:29         ` Gagandeep Singh
2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 09/13] net/enetc: add MTU update and jumbo frames support Gagandeep Singh
2019-04-12 12:29         ` Gagandeep Singh
2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 10/13] net/enetc: enable Rx-Tx queue start/stop feature Gagandeep Singh
2019-04-12 12:29         ` Gagandeep Singh
2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 11/13] net/enetc: enable CRC offload feature Gagandeep Singh
2019-04-12 12:29         ` Gagandeep Singh
2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 12/13] net/enetc: enable Rx checksum offload validation Gagandeep Singh
2019-04-12 12:29         ` Gagandeep Singh
2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 13/13] net/enetc: fix crash at high speed traffic Gagandeep Singh
2019-04-12 12:29         ` Gagandeep Singh
2019-04-16  7:41       ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Ferruh Yigit
2019-04-16  7:41         ` Ferruh Yigit
2019-04-16  8:28         ` Ferruh Yigit
2019-04-16  8:28           ` Ferruh Yigit

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).