net/atlantic: implement promisc and allmulti modes
Add support for promiscuous/allmulticast modes configuration. Signed-off-by: Igor Russkikh <igor.russkikh@aquantia.com> Signed-off-by: Pavel Belous <pavel.belous@aquantia.com>
This commit is contained in:
parent
391de3291d
commit
a9ba50efbd
@ -13,6 +13,8 @@ Supported features
|
|||||||
^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
- Base L2 features
|
- Base L2 features
|
||||||
|
- Promiscuous mode
|
||||||
|
- Multicast mode
|
||||||
- Port statistics
|
- Port statistics
|
||||||
- Checksum offload
|
- Checksum offload
|
||||||
- Jumbo Frame upto 16K
|
- Jumbo Frame upto 16K
|
||||||
|
@ -9,6 +9,8 @@ Link status = Y
|
|||||||
Link status event = Y
|
Link status event = Y
|
||||||
Queue start/stop = Y
|
Queue start/stop = Y
|
||||||
Jumbo frame = Y
|
Jumbo frame = Y
|
||||||
|
Promiscuous mode = Y
|
||||||
|
Allmulticast mode = Y
|
||||||
CRC offload = Y
|
CRC offload = Y
|
||||||
L3 checksum offload = Y
|
L3 checksum offload = Y
|
||||||
L4 checksum offload = Y
|
L4 checksum offload = Y
|
||||||
|
@ -22,6 +22,10 @@ static int atl_dev_set_link_up(struct rte_eth_dev *dev);
|
|||||||
static int atl_dev_set_link_down(struct rte_eth_dev *dev);
|
static int atl_dev_set_link_down(struct rte_eth_dev *dev);
|
||||||
static void atl_dev_close(struct rte_eth_dev *dev);
|
static void atl_dev_close(struct rte_eth_dev *dev);
|
||||||
static int atl_dev_reset(struct rte_eth_dev *dev);
|
static int atl_dev_reset(struct rte_eth_dev *dev);
|
||||||
|
static void atl_dev_promiscuous_enable(struct rte_eth_dev *dev);
|
||||||
|
static void atl_dev_promiscuous_disable(struct rte_eth_dev *dev);
|
||||||
|
static void atl_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||||
|
static void atl_dev_allmulticast_disable(struct rte_eth_dev *dev);
|
||||||
static int atl_dev_link_update(struct rte_eth_dev *dev, int wait);
|
static int atl_dev_link_update(struct rte_eth_dev *dev, int wait);
|
||||||
|
|
||||||
static int atl_dev_xstats_get_names(struct rte_eth_dev *dev __rte_unused,
|
static int atl_dev_xstats_get_names(struct rte_eth_dev *dev __rte_unused,
|
||||||
@ -164,6 +168,12 @@ static const struct eth_dev_ops atl_eth_dev_ops = {
|
|||||||
.dev_close = atl_dev_close,
|
.dev_close = atl_dev_close,
|
||||||
.dev_reset = atl_dev_reset,
|
.dev_reset = atl_dev_reset,
|
||||||
|
|
||||||
|
/* PROMISC */
|
||||||
|
.promiscuous_enable = atl_dev_promiscuous_enable,
|
||||||
|
.promiscuous_disable = atl_dev_promiscuous_disable,
|
||||||
|
.allmulticast_enable = atl_dev_allmulticast_enable,
|
||||||
|
.allmulticast_disable = atl_dev_allmulticast_disable,
|
||||||
|
|
||||||
/* Link */
|
/* Link */
|
||||||
.link_update = atl_dev_link_update,
|
.link_update = atl_dev_link_update,
|
||||||
|
|
||||||
@ -812,6 +822,40 @@ atl_dev_link_update(struct rte_eth_dev *dev, int wait __rte_unused)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
atl_dev_promiscuous_enable(struct rte_eth_dev *dev)
|
||||||
|
{
|
||||||
|
struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||||
|
|
||||||
|
hw_atl_rpfl2promiscuous_mode_en_set(hw, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
atl_dev_promiscuous_disable(struct rte_eth_dev *dev)
|
||||||
|
{
|
||||||
|
struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||||
|
|
||||||
|
hw_atl_rpfl2promiscuous_mode_en_set(hw, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
atl_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||||
|
{
|
||||||
|
struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||||
|
|
||||||
|
hw_atl_rpfl2_accept_all_mc_packets_set(hw, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
atl_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||||
|
{
|
||||||
|
struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||||
|
|
||||||
|
if (dev->data->promiscuous == 1)
|
||||||
|
return; /* must remain in all_multicast mode */
|
||||||
|
|
||||||
|
hw_atl_rpfl2_accept_all_mc_packets_set(hw, false);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* It clears the interrupt causes and enables the interrupt.
|
* It clears the interrupt causes and enables the interrupt.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user