Promiscuous and allmulticast enable/disable APIs added.

Signed-off-by: Gagandeep Singh <g.si...@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

Reply via email to