From 23138c4a888001dcac7908cbe023ac2105cfdbc2 Mon Sep 17 00:00:00 2001 From: Ivan Boule Date: Thu, 28 May 2015 17:05:21 +0200 Subject: [PATCH] e1000: add multicast MAC address filtering Support the PMD function "set_mc_addr_list" in the "igb", "igb-vf", and "em" Poll Mode Drivers. Signed-off-by: Ivan Boule --- drivers/net/e1000/em_ethdev.c | 17 +++++++++++++++++ drivers/net/e1000/igb_ethdev.c | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c index 9960c70b98..a306c55331 100644 --- a/drivers/net/e1000/em_ethdev.c +++ b/drivers/net/e1000/em_ethdev.c @@ -116,6 +116,10 @@ static void eth_em_rar_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr, uint32_t index, uint32_t pool); static void eth_em_rar_clear(struct rte_eth_dev *dev, uint32_t index); +static int eth_em_set_mc_addr_list(struct rte_eth_dev *dev, + struct ether_addr *mc_addr_set, + uint32_t nb_mc_addr); + #define EM_FC_PAUSE_TIME 0x0680 #define EM_LINK_UPDATE_CHECK_TIMEOUT 90 /* 9s */ #define EM_LINK_UPDATE_CHECK_INTERVAL 100 /* ms */ @@ -161,6 +165,7 @@ static const struct eth_dev_ops eth_em_ops = { .flow_ctrl_set = eth_em_flow_ctrl_set, .mac_addr_add = eth_em_rar_set, .mac_addr_remove = eth_em_rar_clear, + .set_mc_addr_list = eth_em_set_mc_addr_list, }; /** @@ -1522,6 +1527,18 @@ eth_em_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) return 0; } +static int +eth_em_set_mc_addr_list(struct rte_eth_dev *dev, + struct ether_addr *mc_addr_set, + uint32_t nb_mc_addr) +{ + struct e1000_hw *hw; + + hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private); + e1000_update_mc_addr_list(hw, (u8 *)mc_addr_set, nb_mc_addr); + return 0; +} + struct rte_driver em_pmd_drv = { .type = PMD_PDEV, .init = rte_em_pmd_init, diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c index bd29bc04eb..24c7510087 100644 --- a/drivers/net/e1000/igb_ethdev.c +++ b/drivers/net/e1000/igb_ethdev.c @@ -194,6 +194,10 @@ static int eth_igb_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_op filter_op, void *arg); +static int eth_igb_set_mc_addr_list(struct rte_eth_dev *dev, + struct ether_addr *mc_addr_set, + uint32_t nb_mc_addr); + /* * Define VF Stats MACRO for Non "cleared on read" register */ @@ -269,6 +273,7 @@ static const struct eth_dev_ops eth_igb_ops = { .rss_hash_update = eth_igb_rss_hash_update, .rss_hash_conf_get = eth_igb_rss_hash_conf_get, .filter_ctrl = eth_igb_filter_ctrl, + .set_mc_addr_list = eth_igb_set_mc_addr_list, }; /* @@ -289,6 +294,7 @@ static const struct eth_dev_ops igbvf_eth_dev_ops = { .rx_queue_release = eth_igb_rx_queue_release, .tx_queue_setup = eth_igb_tx_queue_setup, .tx_queue_release = eth_igb_tx_queue_release, + .set_mc_addr_list = eth_igb_set_mc_addr_list, }; /** @@ -3642,6 +3648,18 @@ eth_igb_filter_ctrl(struct rte_eth_dev *dev, return ret; } +static int +eth_igb_set_mc_addr_list(struct rte_eth_dev *dev, + struct ether_addr *mc_addr_set, + uint32_t nb_mc_addr) +{ + struct e1000_hw *hw; + + hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private); + e1000_update_mc_addr_list(hw, (u8 *)mc_addr_set, nb_mc_addr); + return 0; +} + static struct rte_driver pmd_igb_drv = { .type = PMD_PDEV, .init = rte_igb_pmd_init, -- 2.20.1