[v4,08/13] net/enetc: enable promiscuous and allmulticast feature
diff mbox series

Message ID 20190412122840.1908-9-g.singh@nxp.com
State Accepted, archived
Delegated to: Ferruh Yigit
Headers show
Series
  • ENETC PMD basic features and bug fixes
Related show

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/Intel-compilation success Compilation OK

Commit Message

Gagandeep Singh April 12, 2019, 12:29 p.m. UTC
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(-)

Patch
diff mbox series

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,