From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pa0-f52.google.com (mail-pa0-f52.google.com [209.85.220.52]) by dpdk.org (Postfix) with ESMTP id 192945A44 for ; Thu, 9 Jul 2015 20:24:09 +0200 (CEST) Received: by pacgz10 with SMTP id gz10so81056923pac.3 for ; Thu, 09 Jul 2015 11:24:08 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=44fp3YXS+NGGMBwSyVNOAHhaWHAOf4rBUNvl79yyaag=; b=Yl98eoJ8aPwaWA/bbvn4AC/SSfE4jta8hfWmTUqazkoQMW6atfifw6euPAafAeHGLd FuwbD2cSWzr2/U5lRbex6pik9iynoyKVVi9C4mDHWxhfxbJ3kF2YqUgluOp/Gh2rdNLo fd40Vn/uvWLt6OHbzV9MxIq71UhRy2i+mDqKPNwtbeEzIECgq/FKVPFf16JlytxDruXn NiV1pvCcP83hB9Z1qEKDzni1u+hACZnhXk5KgGfYAHZ/pEsLDYHJor2sZ5N8Ti4kgDP9 QUvax4vOyYvg9FRFbDZ7+0A6xHHAPSvqLaxa2q282geFCvTCplw35NfpF9kS5XEAKH+c TYqw== X-Gm-Message-State: ALoCoQk5XFv7GahmSM7y9FvVQDKX2MgF9wgX8BYf14vo1uTHUX9btxBM2Is0gU5Ume0tL0td1I29 X-Received: by 10.70.53.1 with SMTP id x1mr33946693pdo.114.1436466248445; Thu, 09 Jul 2015 11:24:08 -0700 (PDT) Received: from urahara.home.lan (static-50-53-82-155.bvtn.or.frontiernet.net. [50.53.82.155]) by smtp.gmail.com with ESMTPSA id ff10sm6741567pab.13.2015.07.09.11.24.07 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 09 Jul 2015 11:24:07 -0700 (PDT) From: stephen@networkplumber.org X-Google-Original-From: stephen@networplumber.org To: dev@dpdk.org Date: Thu, 9 Jul 2015 11:24:09 -0700 Message-Id: <1436466256-17442-2-git-send-email-stephen@networplumber.org> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1436466256-17442-1-git-send-email-stephen@networplumber.org> References: <1436466256-17442-1-git-send-email-stephen@networplumber.org> Subject: [dpdk-dev] [PATCH 1/8] vmxnet3: enable VLAN filtering 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: , X-List-Received-Date: Thu, 09 Jul 2015 18:24:09 -0000 From: Stephen Hemminger Support the VLAN filter functionality of the VMXNET3 interface. Signed-off-by: Stephen Hemminger --- drivers/net/vmxnet3/vmxnet3_ethdev.c | 105 ++++++++++++++++++++++++++++++++--- drivers/net/vmxnet3/vmxnet3_ethdev.h | 3 +- drivers/net/vmxnet3/vmxnet3_rxtx.c | 31 +---------- 3 files changed, 101 insertions(+), 38 deletions(-) diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c index 59e3122..3caa4c0 100644 --- a/drivers/net/vmxnet3/vmxnet3_ethdev.c +++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c @@ -85,6 +85,12 @@ static void vmxnet3_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats); static void vmxnet3_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info); +static int vmxnet3_dev_vlan_filter_set(struct rte_eth_dev *dev, + uint16_t vid, int on); +static void vmxnet3_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask); +static void vmxnet3_dev_vlan_offload_set_clear(struct rte_eth_dev *dev, + int mask, int clear); + #if PROCESS_SYS_EVENTS == 1 static void vmxnet3_process_events(struct vmxnet3_hw *); #endif @@ -111,6 +117,8 @@ static const struct eth_dev_ops vmxnet3_eth_dev_ops = { .link_update = vmxnet3_dev_link_update, .stats_get = vmxnet3_dev_stats_get, .dev_infos_get = vmxnet3_dev_info_get, + .vlan_filter_set = vmxnet3_dev_vlan_filter_set, + .vlan_offload_set = vmxnet3_dev_vlan_offload_set, .rx_queue_setup = vmxnet3_dev_rx_queue_setup, .rx_queue_release = vmxnet3_dev_rx_queue_release, .tx_queue_setup = vmxnet3_dev_tx_queue_setup, @@ -368,7 +376,7 @@ vmxnet3_setup_driver_shared(struct rte_eth_dev *dev) Vmxnet3_DSDevRead *devRead = &shared->devRead; uint32_t *mac_ptr; uint32_t val, i; - int ret; + int ret, mask; shared->magic = VMXNET3_REV1_MAGIC; devRead->misc.driverInfo.version = VMXNET3_DRIVER_VERSION_NUM; @@ -439,9 +447,6 @@ vmxnet3_setup_driver_shared(struct rte_eth_dev *dev) if (dev->data->dev_conf.rxmode.hw_ip_checksum) devRead->misc.uptFeatures |= VMXNET3_F_RXCSUM; - if (dev->data->dev_conf.rxmode.hw_vlan_strip) - devRead->misc.uptFeatures |= VMXNET3_F_RXVLAN; - if (port_conf.rxmode.mq_mode == ETH_MQ_RX_RSS) { ret = vmxnet3_rss_configure(dev); if (ret != VMXNET3_SUCCESS) @@ -453,11 +458,14 @@ vmxnet3_setup_driver_shared(struct rte_eth_dev *dev) devRead->rssConfDesc.confPA = hw->rss_confPA; } - if (dev->data->dev_conf.rxmode.hw_vlan_filter) { - ret = vmxnet3_vlan_configure(dev); - if (ret != VMXNET3_SUCCESS) - return ret; - } + mask = 0; + if (dev->data->dev_conf.rxmode.hw_vlan_strip) + mask |= ETH_VLAN_STRIP_MASK; + + if (dev->data->dev_conf.rxmode.hw_vlan_filter) + mask |= ETH_VLAN_FILTER_MASK; + + vmxnet3_dev_vlan_offload_set_clear(dev, mask, 1); PMD_INIT_LOG(DEBUG, "Writing MAC Address : %02x:%02x:%02x:%02x:%02x:%02x", @@ -693,8 +701,13 @@ static void vmxnet3_dev_promiscuous_enable(struct rte_eth_dev *dev) { struct vmxnet3_hw *hw = dev->data->dev_private; + uint32_t *vf_table = hw->shared->devRead.rxFilterConf.vfTable; + memset(vf_table, 0, VMXNET3_VFT_TABLE_SIZE); vmxnet3_dev_set_rxmode(hw, VMXNET3_RXM_PROMISC, 1); + + VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD, + VMXNET3_CMD_UPDATE_VLAN_FILTERS); } /* Promiscuous supported only if Vmxnet3_DriverShared is initialized in adapter */ @@ -702,8 +715,12 @@ static void vmxnet3_dev_promiscuous_disable(struct rte_eth_dev *dev) { struct vmxnet3_hw *hw = dev->data->dev_private; + uint32_t *vf_table = hw->shared->devRead.rxFilterConf.vfTable; + memcpy(vf_table, hw->shadow_vfta, VMXNET3_VFT_TABLE_SIZE); vmxnet3_dev_set_rxmode(hw, VMXNET3_RXM_PROMISC, 0); + VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD, + VMXNET3_CMD_UPDATE_VLAN_FILTERS); } /* Allmulticast supported only if Vmxnet3_DriverShared is initialized in adapter */ @@ -724,6 +741,76 @@ vmxnet3_dev_allmulticast_disable(struct rte_eth_dev *dev) vmxnet3_dev_set_rxmode(hw, VMXNET3_RXM_ALL_MULTI, 0); } +/* Enable/disable filter on vlan */ +static int +vmxnet3_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vid, int on) +{ + struct vmxnet3_hw *hw = dev->data->dev_private; + struct Vmxnet3_RxFilterConf *rxConf = &hw->shared->devRead.rxFilterConf; + uint32_t *vf_table = rxConf->vfTable; + + /* save state for restore */ + if (on) + VMXNET3_SET_VFTABLE_ENTRY(hw->shadow_vfta, vid); + else + VMXNET3_CLEAR_VFTABLE_ENTRY(hw->shadow_vfta, vid); + + /* don't change active filter if in promiscious mode */ + if (rxConf->rxMode & VMXNET3_RXM_PROMISC) + return 0; + + /* set in hardware */ + if (on) + VMXNET3_SET_VFTABLE_ENTRY(vf_table, vid); + else + VMXNET3_CLEAR_VFTABLE_ENTRY(vf_table, vid); + + VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD, + VMXNET3_CMD_UPDATE_VLAN_FILTERS); + return 0; +} + +static void +vmxnet3_dev_vlan_offload_set_clear(struct rte_eth_dev *dev, + int mask, int clear) +{ + struct vmxnet3_hw *hw = dev->data->dev_private; + Vmxnet3_DSDevRead *devRead = &hw->shared->devRead; + uint32_t *vf_table = devRead->rxFilterConf.vfTable; + + if (mask & ETH_VLAN_STRIP_MASK) + devRead->misc.uptFeatures |= UPT1_F_RXVLAN; + else + devRead->misc.uptFeatures &= ~UPT1_F_RXVLAN; + + VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD, + VMXNET3_CMD_UPDATE_FEATURE); + + if (mask & ETH_VLAN_FILTER_MASK) { + if (clear) { + memset(hw->shadow_vfta, 0, + VMXNET3_VFT_TABLE_SIZE); + /* allow untagged pkts */ + VMXNET3_SET_VFTABLE_ENTRY(hw->shadow_vfta, 0); + } + memcpy(vf_table, hw->shadow_vfta, VMXNET3_VFT_TABLE_SIZE); + } else { + /* allow any pkts -- no filtering */ + if (clear) + memset(hw->shadow_vfta, 0xff, VMXNET3_VFT_TABLE_SIZE); + memset(vf_table, 0xff, VMXNET3_VFT_TABLE_SIZE); + } + + VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD, + VMXNET3_CMD_UPDATE_VLAN_FILTERS); +} + +static void +vmxnet3_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask) +{ + vmxnet3_dev_vlan_offload_set_clear(dev, mask, 0); +} + #if PROCESS_SYS_EVENTS == 1 static void vmxnet3_process_events(struct vmxnet3_hw *hw) diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.h b/drivers/net/vmxnet3/vmxnet3_ethdev.h index 09993cf..e97e3ca 100644 --- a/drivers/net/vmxnet3/vmxnet3_ethdev.h +++ b/drivers/net/vmxnet3/vmxnet3_ethdev.h @@ -121,6 +121,8 @@ struct vmxnet3_hw { VMXNET3_RSSConf *rss_conf; uint64_t rss_confPA; vmxnet3_mf_table_t *mf_table; + uint32_t shadow_vfta[VMXNET3_VFT_SIZE]; +#define VMXNET3_VFT_TABLE_SIZE (VMXNET3_VFT_SIZE * sizeof(uint32_t)) }; #define VMXNET3_GET_ADDR_LO(reg) ((uint32_t)(reg)) @@ -173,7 +175,6 @@ int vmxnet3_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id, int vmxnet3_dev_rxtx_init(struct rte_eth_dev *dev); int vmxnet3_rss_configure(struct rte_eth_dev *dev); -int vmxnet3_vlan_configure(struct rte_eth_dev *dev); uint16_t vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts); diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c b/drivers/net/vmxnet3/vmxnet3_rxtx.c index a1eac45..14f6c1d 100644 --- a/drivers/net/vmxnet3/vmxnet3_rxtx.c +++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c @@ -737,9 +737,9 @@ vmxnet3_dev_tx_queue_setup(struct rte_eth_dev *dev, return -EINVAL; } - if ((tx_conf->txq_flags & ETH_TXQ_FLAGS_NOOFFLOADS) != - ETH_TXQ_FLAGS_NOOFFLOADS) { - PMD_INIT_LOG(ERR, "TX not support offload function yet"); + if ((tx_conf->txq_flags & ETH_TXQ_FLAGS_NOXSUMS) != + ETH_TXQ_FLAGS_NOXSUMS) { + PMD_INIT_LOG(ERR, "TX no support for checksum offload yet"); return -EINVAL; } @@ -1041,28 +1041,3 @@ vmxnet3_rss_configure(struct rte_eth_dev *dev) return VMXNET3_SUCCESS; } - -/* - * Configure VLAN Filter feature - */ -int -vmxnet3_vlan_configure(struct rte_eth_dev *dev) -{ - uint8_t i; - struct vmxnet3_hw *hw = dev->data->dev_private; - uint32_t *vf_table = hw->shared->devRead.rxFilterConf.vfTable; - - PMD_INIT_FUNC_TRACE(); - - /* Verify if this tag is already set */ - for (i = 0; i < VMXNET3_VFT_SIZE; i++) { - /* Filter all vlan tags out by default */ - vf_table[i] = 0; - /* To-Do: Provide another routine in dev_ops for user config */ - - PMD_INIT_LOG(DEBUG, "Registering VLAN portid: %"PRIu8" tag %u", - dev->data->port_id, vf_table[i]); - } - - return VMXNET3_SUCCESS; -} -- 2.1.4