get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/3887/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 3887,
    "url": "http://patches.dpdk.org/api/patches/3887/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1425600635-20628-3-git-send-email-stephen@networkplumber.org/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1425600635-20628-3-git-send-email-stephen@networkplumber.org>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1425600635-20628-3-git-send-email-stephen@networkplumber.org",
    "date": "2015-03-06T00:10:27",
    "name": "[dpdk-dev,v3,02/10] vmxnet3: enable VLAN filtering",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "4330d15fa5f23f48d107bfed3fbd903089f1b2df",
    "submitter": {
        "id": 27,
        "url": "http://patches.dpdk.org/api/people/27/?format=api",
        "name": "Stephen Hemminger",
        "email": "stephen@networkplumber.org"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1425600635-20628-3-git-send-email-stephen@networkplumber.org/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/3887/comments/",
    "check": "pending",
    "checks": "http://patches.dpdk.org/api/patches/3887/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id E34305A8A;\n\tFri,  6 Mar 2015 01:10:45 +0100 (CET)",
            "from mail-pa0-f42.google.com (mail-pa0-f42.google.com\n\t[209.85.220.42]) by dpdk.org (Postfix) with ESMTP id 089045A73\n\tfor <dev@dpdk.org>; Fri,  6 Mar 2015 01:10:43 +0100 (CET)",
            "by paceu11 with SMTP id eu11so32794581pac.1\n\tfor <dev@dpdk.org>; Thu, 05 Mar 2015 16:10:43 -0800 (PST)",
            "from urahara.brocade.com\n\t(static-50-53-82-155.bvtn.or.frontiernet.net. [50.53.82.155])\n\tby mx.google.com with ESMTPSA id\n\tms5sm7940550pbb.59.2015.03.05.16.10.42\n\t(version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tThu, 05 Mar 2015 16:10:42 -0800 (PST)"
        ],
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20130820;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=c5XulzRYInbDuE8ghYK2eg0BJ29KTml1G5ZPn762COw=;\n\tb=QMakSzjTpvxpaQ1MSzWbnywwLa7LL/Cvgs/STrLXNWaRGdWG6Z2hL06ECMCT04fVe5\n\tcbqQ20cYwZ7XaAZAYaydPpoPaRziiFWWm0mqx+ecZaD692b8k7S2ayHtyxCNLPqyhhZ2\n\tsa0qLOL/KcomqPKjO8nm7EsaPHz3Lh4+gekQeBD0QgNwJ3JHrHcm6n8LgNtiTIjc02Hc\n\tHPlFX/L2zqTRrlUtlHD7M4E0fMXtsImBOeKaWYEQkHGiapLm0TzI/0Z+TLGv3l1dTEvk\n\ti4/9iyJvcYc+700liyCjHBlzI1njRBxVh5yjoe7XfEjyL9iE97sqIpcvLx6gqRITejC/\n\t2bKg==",
        "X-Gm-Message-State": "ALoCoQn4lR3rgtVVuwr+mOoopvq7S+W+GB4Gj0ATvfrvf0BnZETQyd5+kKMesj5rKsXbJdKaVwxr",
        "X-Received": "by 10.70.44.78 with SMTP id c14mr19968925pdm.113.1425600643230; \n\tThu, 05 Mar 2015 16:10:43 -0800 (PST)",
        "From": "Stephen Hemminger <stephen@networkplumber.org>",
        "To": "Yong Wang <yongwang@vmware.com>",
        "Date": "Thu,  5 Mar 2015 16:10:27 -0800",
        "Message-Id": "<1425600635-20628-3-git-send-email-stephen@networkplumber.org>",
        "X-Mailer": "git-send-email 2.1.4",
        "In-Reply-To": "<1425600635-20628-1-git-send-email-stephen@networkplumber.org>",
        "References": "<1425600635-20628-1-git-send-email-stephen@networkplumber.org>",
        "Cc": "dev@dpdk.org, Stephen Hemminger <shemming@brocade.com>",
        "Subject": "[dpdk-dev] [PATCH v3 02/10] vmxnet3: enable VLAN filtering",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "patches and discussions about DPDK <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Stephen Hemminger <shemming@brocade.com>\n\nSupport the VLAN filter functionality of the VMXNET3 interface.\n\nSigned-off-by: Stephen Hemminger <stephen@networkplumber.org>\n---\n lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c | 105 +++++++++++++++++++++++++++++---\n lib/librte_pmd_vmxnet3/vmxnet3_ethdev.h |   4 +-\n lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c   |  31 +---------\n 3 files changed, 102 insertions(+), 38 deletions(-)",
    "diff": "diff --git a/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c b/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c\nindex 4c882ee..f4c2f12 100644\n--- a/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c\n+++ b/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c\n@@ -87,6 +87,12 @@ static void vmxnet3_dev_stats_get(struct rte_eth_dev *dev,\n \t\t\t\tstruct rte_eth_stats *stats);\n static void vmxnet3_dev_info_get(struct rte_eth_dev *dev,\n \t\t\t\tstruct rte_eth_dev_info *dev_info);\n+static int vmxnet3_dev_vlan_filter_set(struct rte_eth_dev *dev,\n+\t\t\t\t       uint16_t vid, int on);\n+static void vmxnet3_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n+static void vmxnet3_dev_vlan_offload_set_clear(struct rte_eth_dev *dev,\n+\t\t\t\t\t\tint mask, int clear);\n+\n #if PROCESS_SYS_EVENTS == 1\n static void vmxnet3_process_events(struct vmxnet3_hw *);\n #endif\n@@ -113,6 +119,8 @@ static struct eth_dev_ops vmxnet3_eth_dev_ops = {\n \t.link_update          = vmxnet3_dev_link_update,\n \t.stats_get            = vmxnet3_dev_stats_get,\n \t.dev_infos_get        = vmxnet3_dev_info_get,\n+\t.vlan_filter_set      = vmxnet3_dev_vlan_filter_set,\n+\t.vlan_offload_set     = vmxnet3_dev_vlan_offload_set,\n \t.rx_queue_setup       = vmxnet3_dev_rx_queue_setup,\n \t.rx_queue_release     = vmxnet3_dev_rx_queue_release,\n \t.tx_queue_setup       = vmxnet3_dev_tx_queue_setup,\n@@ -398,7 +406,7 @@ vmxnet3_setup_driver_shared(struct rte_eth_dev *dev)\n \tVmxnet3_DSDevRead *devRead = &shared->devRead;\n \tuint32_t *mac_ptr;\n \tuint32_t val, i;\n-\tint ret;\n+\tint ret, mask;\n \n \tshared->magic = VMXNET3_REV1_MAGIC;\n \tdevRead->misc.driverInfo.version = VMXNET3_DRIVER_VERSION_NUM;\n@@ -470,9 +478,6 @@ vmxnet3_setup_driver_shared(struct rte_eth_dev *dev)\n \tif (dev->data->dev_conf.rxmode.hw_ip_checksum)\n \t\tdevRead->misc.uptFeatures |= VMXNET3_F_RXCSUM;\n \n-\tif (dev->data->dev_conf.rxmode.hw_vlan_strip)\n-\t\tdevRead->misc.uptFeatures |= VMXNET3_F_RXVLAN;\n-\n \tif (port_conf.rxmode.mq_mode == ETH_MQ_RX_RSS) {\n \t\tret = vmxnet3_rss_configure(dev);\n \t\tif (ret != VMXNET3_SUCCESS)\n@@ -484,11 +489,14 @@ vmxnet3_setup_driver_shared(struct rte_eth_dev *dev)\n \t\tdevRead->rssConfDesc.confPA  = hw->rss_confPA;\n \t}\n \n-\tif (dev->data->dev_conf.rxmode.hw_vlan_filter) {\n-\t\tret = vmxnet3_vlan_configure(dev);\n-\t\tif (ret != VMXNET3_SUCCESS)\n-\t\t\treturn ret;\n-\t}\n+\tmask = 0;\n+\tif (dev->data->dev_conf.rxmode.hw_vlan_strip)\n+\t\tmask |= ETH_VLAN_STRIP_MASK;\n+\n+\tif (dev->data->dev_conf.rxmode.hw_vlan_filter)\n+\t\tmask |= ETH_VLAN_FILTER_MASK;\n+\n+\tvmxnet3_dev_vlan_offload_set_clear(dev, mask, 1);\n \n \tPMD_INIT_LOG(DEBUG,\n \t\t     \"Writing MAC Address : %02x:%02x:%02x:%02x:%02x:%02x\",\n@@ -720,8 +728,13 @@ static void\n vmxnet3_dev_promiscuous_enable(struct rte_eth_dev *dev)\n {\n \tstruct vmxnet3_hw *hw = dev->data->dev_private;\n+\tuint32_t *vf_table = hw->shared->devRead.rxFilterConf.vfTable;\n \n+\tmemset(vf_table, 0, VMXNET3_VFT_TABLE_SIZE);\n \tvmxnet3_dev_set_rxmode(hw, VMXNET3_RXM_PROMISC, 1);\n+\n+\tVMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD,\n+\t\t\t       VMXNET3_CMD_UPDATE_VLAN_FILTERS);\n }\n \n /* Promiscuous supported only if Vmxnet3_DriverShared is initialized in adapter */\n@@ -729,8 +742,12 @@ static void\n vmxnet3_dev_promiscuous_disable(struct rte_eth_dev *dev)\n {\n \tstruct vmxnet3_hw *hw = dev->data->dev_private;\n+\tuint32_t *vf_table = hw->shared->devRead.rxFilterConf.vfTable;\n \n+\tmemcpy(vf_table, hw->shadow_vfta, VMXNET3_VFT_TABLE_SIZE);\n \tvmxnet3_dev_set_rxmode(hw, VMXNET3_RXM_PROMISC, 0);\n+\tVMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD,\n+\t\t\t       VMXNET3_CMD_UPDATE_VLAN_FILTERS);\n }\n \n /* Allmulticast supported only if Vmxnet3_DriverShared is initialized in adapter */\n@@ -751,6 +768,76 @@ vmxnet3_dev_allmulticast_disable(struct rte_eth_dev *dev)\n \tvmxnet3_dev_set_rxmode(hw, VMXNET3_RXM_ALL_MULTI, 0);\n }\n \n+/* Enable/disable filter on vlan */\n+static int\n+vmxnet3_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vid, int on)\n+{\n+\tstruct vmxnet3_hw *hw = dev->data->dev_private;\n+\tstruct Vmxnet3_RxFilterConf *rxConf = &hw->shared->devRead.rxFilterConf;\n+\tuint32_t *vf_table = rxConf->vfTable;\n+\n+\t/* save state for restore */\n+\tif (on)\n+\t\tVMXNET3_SET_VFTABLE_ENTRY(hw->shadow_vfta, vid);\n+\telse\n+\t\tVMXNET3_CLEAR_VFTABLE_ENTRY(hw->shadow_vfta, vid);\n+\n+\t/* don't change active filter if in promiscious mode */\n+\tif (rxConf->rxMode & VMXNET3_RXM_PROMISC)\n+\t\treturn 0;\n+\n+\t/* set in hardware */\n+\tif (on)\n+\t\tVMXNET3_SET_VFTABLE_ENTRY(vf_table, vid);\n+\telse\n+\t\tVMXNET3_CLEAR_VFTABLE_ENTRY(vf_table, vid);\n+\n+\tVMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD,\n+\t\t\t       VMXNET3_CMD_UPDATE_VLAN_FILTERS);\n+\treturn 0;\n+}\n+\n+static void\n+vmxnet3_dev_vlan_offload_set_clear(struct rte_eth_dev *dev,\n+\t\t\t\t   int mask, int clear)\n+{\n+\tstruct vmxnet3_hw *hw = dev->data->dev_private;\n+\tVmxnet3_DSDevRead *devRead = &hw->shared->devRead;\n+\tuint32_t *vf_table = devRead->rxFilterConf.vfTable;\n+\n+\tif (mask & ETH_VLAN_STRIP_MASK)\n+\t\tdevRead->misc.uptFeatures |= UPT1_F_RXVLAN;\n+\telse\n+\t\tdevRead->misc.uptFeatures &= ~UPT1_F_RXVLAN;\n+\n+\tVMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD,\n+\t\t\t       VMXNET3_CMD_UPDATE_FEATURE);\n+\n+\tif (mask & ETH_VLAN_FILTER_MASK) {\n+\t\tif (clear) {\n+\t\t\tmemset(hw->shadow_vfta, 0,\n+\t\t\t       VMXNET3_VFT_TABLE_SIZE);\n+\t\t\t/* allow untagged pkts */\n+\t\t\tVMXNET3_SET_VFTABLE_ENTRY(hw->shadow_vfta, 0);\n+\t\t}\n+\t\tmemcpy(vf_table, hw->shadow_vfta, VMXNET3_VFT_TABLE_SIZE);\n+\t} else {\n+\t\t/* allow any pkts -- no filtering */\n+\t\tif (clear)\n+\t\t\tmemset(hw->shadow_vfta, 0xff, VMXNET3_VFT_TABLE_SIZE);\n+\t\tmemset(vf_table, 0xff, VMXNET3_VFT_TABLE_SIZE);\n+\t}\n+\n+\tVMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD,\n+\t\t\t       VMXNET3_CMD_UPDATE_VLAN_FILTERS);\n+}\n+\n+static void\n+vmxnet3_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)\n+{\n+\tvmxnet3_dev_vlan_offload_set_clear(dev, mask, 0);\n+}\n+\n #if PROCESS_SYS_EVENTS == 1\n static void\n vmxnet3_process_events(struct vmxnet3_hw *hw)\ndiff --git a/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.h b/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.h\nindex 09993cf..e9d67a7 100644\n--- a/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.h\n+++ b/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.h\n@@ -121,8 +121,11 @@ struct vmxnet3_hw {\n \tVMXNET3_RSSConf\t\t *rss_conf;\n \tuint64_t\t\t\t rss_confPA;\n \tvmxnet3_mf_table_t   *mf_table;\n+\tuint32_t\t      shadow_vfta[VMXNET3_VFT_SIZE];\n };\n \n+#define VMXNET3_VFT_TABLE_SIZE\t   (VMXNET3_VFT_SIZE * sizeof(uint32_t))\n+\n #define VMXNET3_GET_ADDR_LO(reg)   ((uint32_t)(reg))\n #define VMXNET3_GET_ADDR_HI(reg)   ((uint32_t)(((uint64_t)(reg)) >> 32))\n \n@@ -173,7 +176,6 @@ int  vmxnet3_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,\n int vmxnet3_dev_rxtx_init(struct rte_eth_dev *dev);\n \n int vmxnet3_rss_configure(struct rte_eth_dev *dev);\n-int vmxnet3_vlan_configure(struct rte_eth_dev *dev);\n \n uint16_t vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,\n \t\tuint16_t nb_pkts);\ndiff --git a/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c b/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c\nindex 4d8a010..5fe3de5 100644\n--- a/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c\n+++ b/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c\n@@ -738,9 +738,9 @@ vmxnet3_dev_tx_queue_setup(struct rte_eth_dev *dev,\n \t\treturn -EINVAL;\n \t}\n \n-\tif ((tx_conf->txq_flags & ETH_TXQ_FLAGS_NOOFFLOADS) !=\n-\t    ETH_TXQ_FLAGS_NOOFFLOADS) {\n-\t\tPMD_INIT_LOG(ERR, \"TX not support offload function yet\");\n+\tif ((tx_conf->txq_flags & ETH_TXQ_FLAGS_NOXSUMS) !=\n+\t    ETH_TXQ_FLAGS_NOXSUMS) {\n+\t\tPMD_INIT_LOG(ERR, \"TX no support for checksum offload yet\");\n \t\treturn -EINVAL;\n \t}\n \n@@ -1045,28 +1045,3 @@ vmxnet3_rss_configure(struct rte_eth_dev *dev)\n \n \treturn VMXNET3_SUCCESS;\n }\n-\n-/*\n- * Configure VLAN Filter feature\n- */\n-int\n-vmxnet3_vlan_configure(struct rte_eth_dev *dev)\n-{\n-\tuint8_t i;\n-\tstruct vmxnet3_hw *hw = dev->data->dev_private;\n-\tuint32_t *vf_table = hw->shared->devRead.rxFilterConf.vfTable;\n-\n-\tPMD_INIT_FUNC_TRACE();\n-\n-\t/* Verify if this tag is already set */\n-\tfor (i = 0; i < VMXNET3_VFT_SIZE; i++) {\n-\t\t/* Filter all vlan tags out by default */\n-\t\tvf_table[i] = 0;\n-\t\t/* To-Do: Provide another routine in dev_ops for user config */\n-\n-\t\tPMD_INIT_LOG(DEBUG, \"Registering VLAN portid: %\"PRIu8\" tag %u\",\n-\t\t\t\t\tdev->data->port_id, vf_table[i]);\n-\t}\n-\n-\treturn VMXNET3_SUCCESS;\n-}\n",
    "prefixes": [
        "dpdk-dev",
        "v3",
        "02/10"
    ]
}