From b83372a03045458ecec9bdb6fca463bf326de751 Mon Sep 17 00:00:00 2001 From: Jiawen Wu Date: Thu, 21 Oct 2021 17:50:09 +0800 Subject: [PATCH] net/ngbe: support device promiscuous and allmulticast mode Support to enable/disable promiscuous and allmulticast mode for a port. Signed-off-by: Jiawen Wu --- doc/guides/nics/features/ngbe.ini | 2 + doc/guides/nics/ngbe.rst | 2 + drivers/net/ngbe/ngbe_ethdev.c | 63 +++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/doc/guides/nics/features/ngbe.ini b/doc/guides/nics/features/ngbe.ini index dd98838441..90e2a38bfb 100644 --- a/doc/guides/nics/features/ngbe.ini +++ b/doc/guides/nics/features/ngbe.ini @@ -12,6 +12,8 @@ Burst mode info = Y MTU update = Y Scattered Rx = Y TSO = Y +Promiscuous mode = Y +Allmulticast mode = Y VLAN filter = Y CRC offload = Y VLAN offload = Y diff --git a/doc/guides/nics/ngbe.rst b/doc/guides/nics/ngbe.rst index a180acbea3..2a92f91e9f 100644 --- a/doc/guides/nics/ngbe.rst +++ b/doc/guides/nics/ngbe.rst @@ -16,6 +16,8 @@ Features - Checksum offload - VLAN/QinQ stripping and inserting - TSO offload +- Promiscuous mode +- Multicast mode - Port hardware statistics - Jumbo frames - Link state information diff --git a/drivers/net/ngbe/ngbe_ethdev.c b/drivers/net/ngbe/ngbe_ethdev.c index d369cfb6dd..0e588eecce 100644 --- a/drivers/net/ngbe/ngbe_ethdev.c +++ b/drivers/net/ngbe/ngbe_ethdev.c @@ -1745,6 +1745,65 @@ ngbe_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete) return ngbe_dev_link_update_share(dev, wait_to_complete); } +static int +ngbe_dev_promiscuous_enable(struct rte_eth_dev *dev) +{ + struct ngbe_hw *hw = ngbe_dev_hw(dev); + uint32_t fctrl; + + fctrl = rd32(hw, NGBE_PSRCTL); + fctrl |= (NGBE_PSRCTL_UCP | NGBE_PSRCTL_MCP); + wr32(hw, NGBE_PSRCTL, fctrl); + + return 0; +} + +static int +ngbe_dev_promiscuous_disable(struct rte_eth_dev *dev) +{ + struct ngbe_hw *hw = ngbe_dev_hw(dev); + uint32_t fctrl; + + fctrl = rd32(hw, NGBE_PSRCTL); + fctrl &= (~NGBE_PSRCTL_UCP); + if (dev->data->all_multicast == 1) + fctrl |= NGBE_PSRCTL_MCP; + else + fctrl &= (~NGBE_PSRCTL_MCP); + wr32(hw, NGBE_PSRCTL, fctrl); + + return 0; +} + +static int +ngbe_dev_allmulticast_enable(struct rte_eth_dev *dev) +{ + struct ngbe_hw *hw = ngbe_dev_hw(dev); + uint32_t fctrl; + + fctrl = rd32(hw, NGBE_PSRCTL); + fctrl |= NGBE_PSRCTL_MCP; + wr32(hw, NGBE_PSRCTL, fctrl); + + return 0; +} + +static int +ngbe_dev_allmulticast_disable(struct rte_eth_dev *dev) +{ + struct ngbe_hw *hw = ngbe_dev_hw(dev); + uint32_t fctrl; + + if (dev->data->promiscuous == 1) + return 0; /* must remain in all_multicast mode */ + + fctrl = rd32(hw, NGBE_PSRCTL); + fctrl &= (~NGBE_PSRCTL_MCP); + wr32(hw, NGBE_PSRCTL, fctrl); + + return 0; +} + /** * It clears the interrupt causes and enables the interrupt. * It will be called once only during NIC initialized. @@ -2169,6 +2228,10 @@ static const struct eth_dev_ops ngbe_eth_dev_ops = { .dev_stop = ngbe_dev_stop, .dev_close = ngbe_dev_close, .dev_reset = ngbe_dev_reset, + .promiscuous_enable = ngbe_dev_promiscuous_enable, + .promiscuous_disable = ngbe_dev_promiscuous_disable, + .allmulticast_enable = ngbe_dev_allmulticast_enable, + .allmulticast_disable = ngbe_dev_allmulticast_disable, .link_update = ngbe_dev_link_update, .stats_get = ngbe_dev_stats_get, .xstats_get = ngbe_dev_xstats_get, -- 2.39.5