net/enetc: enable promiscuous and allmulticast

Promiscuous and allmulticast enable/disable APIs added.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
This commit is contained in:
Gagandeep Singh 2019-04-12 12:29:03 +00:00 committed by Ferruh Yigit
parent 4b7bc5ee26
commit 4ef1767fa6
5 changed files with 82 additions and 16 deletions

View File

@ -47,6 +47,8 @@ ENETC Features
- Link Status
- Packet type information
- Basic stats
- Promiscuous
- Multicast
NIC Driver (PMD)
~~~~~~~~~~~~~~~~

View File

@ -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

View File

@ -149,6 +149,7 @@ New Features
* Added physical addressing mode support
* Added SXGMII interface support
* Added basic statistics support
* Added promiscuous and allmulticast mode support
* **Updated the QuickAssist Technology PMD.**

View File

@ -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

View File

@ -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,