From patchwork Thu Jan 28 22:23:48 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matej Vido X-Patchwork-Id: 10203 X-Patchwork-Delegate: bruce.richardson@intel.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 7C4AAC4F6; Thu, 28 Jan 2016 23:24:12 +0100 (CET) Received: from office2.cesnet.cz (office2.cesnet.cz [195.113.144.244]) by dpdk.org (Postfix) with ESMTP id 2C591C4F4 for ; Thu, 28 Jan 2016 23:24:11 +0100 (CET) Received: from localhost.localdomain (bband-dyn71.95-103-243.t-com.sk [95.103.243.71]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (No client certificate requested) by office2.cesnet.cz (Postfix) with ESMTPSA id C7C89ED55AC; Thu, 28 Jan 2016 23:24:10 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cesnet.cz; s=office2; t=1454019851; bh=SNGN7EffAiHMoWIjL7qZWOVE3j9TROOAsL9lwZi8mYc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=fLLAM8YFtlIS798FosICtdNW8cVNY0jGd2vYC1H8yjdqNkrDLCIRUyJfcsdEpZ/xk Edq9jRNvShrvHcPVlXLE77A6INv8TSXu2c7MsR4p/YUWC88ldpzPCYBF6YQo+WQDY6 8jqw3N2MwJ9oHriR+ByNyJ12f0fZWzxjXRVhf3Lo= From: Matej Vido To: dev@dpdk.org Date: Thu, 28 Jan 2016 23:23:48 +0100 Message-Id: <1454019829-5908-3-git-send-email-vido@cesnet.cz> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1454019829-5908-1-git-send-email-vido@cesnet.cz> References: <1454019829-5908-1-git-send-email-vido@cesnet.cz> Cc: pus@cesnet.cz, viktorin@rehivetech.com Subject: [dpdk-dev] [PATCH 3/4] szedata2: add functions for enabling/disabling promiscuous, allmulticast modes X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Signed-off-by: Matej Vido --- drivers/net/szedata2/rte_eth_szedata2.c | 45 +++++++++++++++++++++++++++++++ drivers/net/szedata2/rte_eth_szedata2.h | 39 ++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 0 deletions(-) diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c index d8c260b..81c806e 100644 --- a/drivers/net/szedata2/rte_eth_szedata2.c +++ b/drivers/net/szedata2/rte_eth_szedata2.c @@ -1281,6 +1281,42 @@ eth_mac_addr_set(struct rte_eth_dev *dev __rte_unused, { } +static void +eth_promiscuous_enable(struct rte_eth_dev *dev) +{ + volatile struct szedata2_cgmii_ibuf *ibuf = SZEDATA2_PCI_RESOURCE_PTR( + dev, SZEDATA2_CGMII_IBUF_BASE_OFF, + volatile struct szedata2_cgmii_ibuf *); + cgmii_ibuf_mac_mode_write(ibuf, SZEDATA2_MAC_CHMODE_PROMISC); +} + +static void +eth_promiscuous_disable(struct rte_eth_dev *dev) +{ + volatile struct szedata2_cgmii_ibuf *ibuf = SZEDATA2_PCI_RESOURCE_PTR( + dev, SZEDATA2_CGMII_IBUF_BASE_OFF, + volatile struct szedata2_cgmii_ibuf *); + cgmii_ibuf_mac_mode_write(ibuf, SZEDATA2_MAC_CHMODE_ONLY_VALID); +} + +static void +eth_allmulticast_enable(struct rte_eth_dev *dev) +{ + volatile struct szedata2_cgmii_ibuf *ibuf = SZEDATA2_PCI_RESOURCE_PTR( + dev, SZEDATA2_CGMII_IBUF_BASE_OFF, + volatile struct szedata2_cgmii_ibuf *); + cgmii_ibuf_mac_mode_write(ibuf, SZEDATA2_MAC_CHMODE_ALL_MULTICAST); +} + +static void +eth_allmulticast_disable(struct rte_eth_dev *dev) +{ + volatile struct szedata2_cgmii_ibuf *ibuf = SZEDATA2_PCI_RESOURCE_PTR( + dev, SZEDATA2_CGMII_IBUF_BASE_OFF, + volatile struct szedata2_cgmii_ibuf *); + cgmii_ibuf_mac_mode_write(ibuf, SZEDATA2_MAC_CHMODE_ONLY_VALID); +} + static struct eth_dev_ops ops = { .dev_start = eth_dev_start, .dev_stop = eth_dev_stop, @@ -1289,6 +1325,10 @@ static struct eth_dev_ops ops = { .dev_close = eth_dev_close, .dev_configure = eth_dev_configure, .dev_infos_get = eth_dev_info, + .promiscuous_enable = eth_promiscuous_enable, + .promiscuous_disable = eth_promiscuous_disable, + .allmulticast_enable = eth_allmulticast_enable, + .allmulticast_disable = eth_allmulticast_disable, .rx_queue_start = eth_rx_queue_start, .rx_queue_stop = eth_rx_queue_stop, .tx_queue_start = eth_tx_queue_start, @@ -1471,8 +1511,10 @@ rte_szedata2_eth_dev_init(struct rte_eth_dev *dev) (unsigned long long)pci_rsc->len, (unsigned long long)pci_rsc->addr); + /* Get link state */ eth_link_update(dev, 0); + /* Allocate space for one mac address */ data->mac_addrs = rte_zmalloc(data->name, sizeof(struct ether_addr), RTE_CACHE_LINE_SIZE); if (data->mac_addrs == NULL) { @@ -1484,6 +1526,9 @@ rte_szedata2_eth_dev_init(struct rte_eth_dev *dev) ether_addr_copy(ð_addr, data->mac_addrs); + /* At initial state COMBO card is in promiscuous mode so disable it */ + eth_promiscuous_disable(dev); + RTE_LOG(INFO, PMD, "szedata2 device (" PCI_PRI_FMT ") successfully initialized\n", pci_addr->domain, pci_addr->bus, pci_addr->devid, diff --git a/drivers/net/szedata2/rte_eth_szedata2.h b/drivers/net/szedata2/rte_eth_szedata2.h index 39d1c48..522cf47 100644 --- a/drivers/net/szedata2/rte_eth_szedata2.h +++ b/drivers/net/szedata2/rte_eth_szedata2.h @@ -213,6 +213,13 @@ enum szedata2_link_speed { SZEDATA2_LINK_SPEED_100G, }; +enum szedata2_mac_check_mode { + SZEDATA2_MAC_CHMODE_PROMISC = 0x0, + SZEDATA2_MAC_CHMODE_ONLY_VALID = 0x1, + SZEDATA2_MAC_CHMODE_ALL_BROADCAST = 0x2, + SZEDATA2_MAC_CHMODE_ALL_MULTICAST = 0x3, +}; + /* * Structure describes CGMII IBUF address space */ @@ -299,6 +306,38 @@ cgmii_ibuf_is_link_up(volatile struct szedata2_cgmii_ibuf *ibuf) } /* + * @return + * MAC address check mode + */ +static inline enum szedata2_mac_check_mode +cgmii_ibuf_mac_mode_read(volatile struct szedata2_cgmii_ibuf *ibuf) +{ + switch (rte_le_to_cpu_32(ibuf->mac_chmode) & 0x3) { + case 0x0: + return SZEDATA2_MAC_CHMODE_PROMISC; + case 0x1: + return SZEDATA2_MAC_CHMODE_ONLY_VALID; + case 0x2: + return SZEDATA2_MAC_CHMODE_ALL_BROADCAST; + case 0x3: + return SZEDATA2_MAC_CHMODE_ALL_MULTICAST; + default: + return SZEDATA2_MAC_CHMODE_PROMISC; + } +} + +/* + * Writes "mode" in MAC address check mode register. + */ +static inline void +cgmii_ibuf_mac_mode_write(volatile struct szedata2_cgmii_ibuf *ibuf, + enum szedata2_mac_check_mode mode) +{ + ibuf->mac_chmode = rte_cpu_to_le_32( + (rte_le_to_cpu_32(ibuf->mac_chmode) & ~0x3) | mode); +} + +/* * Structure describes CGMII OBUF address space */ struct szedata2_cgmii_obuf {