get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 6271,
    "url": "https://patches.dpdk.org/api/patches/6271/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1436466256-17442-2-git-send-email-stephen@networplumber.org/",
    "project": {
        "id": 1,
        "url": "https://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": "<1436466256-17442-2-git-send-email-stephen@networplumber.org>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1436466256-17442-2-git-send-email-stephen@networplumber.org",
    "date": "2015-07-09T18:24:09",
    "name": "[dpdk-dev,1/8] vmxnet3: enable VLAN filtering",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "1008a5bb1e8b9edaea7c5b5b30279e2d78458a55",
    "submitter": {
        "id": 27,
        "url": "https://patches.dpdk.org/api/people/27/?format=api",
        "name": "Stephen Hemminger",
        "email": "stephen@networkplumber.org"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1436466256-17442-2-git-send-email-stephen@networplumber.org/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/6271/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/6271/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 80B7D5A99;\n\tThu,  9 Jul 2015 20:24:11 +0200 (CEST)",
            "from mail-pa0-f52.google.com (mail-pa0-f52.google.com\n\t[209.85.220.52]) by dpdk.org (Postfix) with ESMTP id 192945A44\n\tfor <dev@dpdk.org>; Thu,  9 Jul 2015 20:24:09 +0200 (CEST)",
            "by pacgz10 with SMTP id gz10so81056923pac.3\n\tfor <dev@dpdk.org>; Thu, 09 Jul 2015 11:24:08 -0700 (PDT)",
            "from urahara.home.lan (static-50-53-82-155.bvtn.or.frontiernet.net.\n\t[50.53.82.155]) by smtp.gmail.com with ESMTPSA id\n\tff10sm6741567pab.13.2015.07.09.11.24.07\n\t(version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tThu, 09 Jul 2015 11:24:07 -0700 (PDT)"
        ],
        "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=44fp3YXS+NGGMBwSyVNOAHhaWHAOf4rBUNvl79yyaag=;\n\tb=Yl98eoJ8aPwaWA/bbvn4AC/SSfE4jta8hfWmTUqazkoQMW6atfifw6euPAafAeHGLd\n\tFuwbD2cSWzr2/U5lRbex6pik9iynoyKVVi9C4mDHWxhfxbJ3kF2YqUgluOp/Gh2rdNLo\n\tfd40Vn/uvWLt6OHbzV9MxIq71UhRy2i+mDqKPNwtbeEzIECgq/FKVPFf16JlytxDruXn\n\tNiV1pvCcP83hB9Z1qEKDzni1u+hACZnhXk5KgGfYAHZ/pEsLDYHJor2sZ5N8Ti4kgDP9\n\tQUvax4vOyYvg9FRFbDZ7+0A6xHHAPSvqLaxa2q282geFCvTCplw35NfpF9kS5XEAKH+c\n\tTYqw==",
        "X-Gm-Message-State": "ALoCoQk5XFv7GahmSM7y9FvVQDKX2MgF9wgX8BYf14vo1uTHUX9btxBM2Is0gU5Ume0tL0td1I29",
        "X-Received": "by 10.70.53.1 with SMTP id x1mr33946693pdo.114.1436466248445;\n\tThu, 09 Jul 2015 11:24:08 -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 <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 <stephen@networkplumber.org>\n\nSupport the VLAN filter functionality of the VMXNET3 interface.\n\nSigned-off-by: Stephen Hemminger <stephen@networkplumber.org>\n---\n drivers/net/vmxnet3/vmxnet3_ethdev.c | 105 ++++++++++++++++++++++++++++++++---\n drivers/net/vmxnet3/vmxnet3_ethdev.h |   3 +-\n drivers/net/vmxnet3/vmxnet3_rxtx.c   |  31 +----------\n 3 files changed, 101 insertions(+), 38 deletions(-)",
    "diff": "diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c\nindex 59e3122..3caa4c0 100644\n--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c\n+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c\n@@ -85,6 +85,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@@ -111,6 +117,8 @@ static const 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@@ -368,7 +376,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@@ -439,9 +447,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@@ -453,11 +458,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@@ -693,8 +701,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@@ -702,8 +715,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@@ -724,6 +741,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/drivers/net/vmxnet3/vmxnet3_ethdev.h b/drivers/net/vmxnet3/vmxnet3_ethdev.h\nindex 09993cf..e97e3ca 100644\n--- a/drivers/net/vmxnet3/vmxnet3_ethdev.h\n+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.h\n@@ -121,6 +121,8 @@ 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+#define VMXNET3_VFT_TABLE_SIZE \t   (VMXNET3_VFT_SIZE * sizeof(uint32_t))\n };\n \n #define VMXNET3_GET_ADDR_LO(reg)   ((uint32_t)(reg))\n@@ -173,7 +175,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/drivers/net/vmxnet3/vmxnet3_rxtx.c b/drivers/net/vmxnet3/vmxnet3_rxtx.c\nindex a1eac45..14f6c1d 100644\n--- a/drivers/net/vmxnet3/vmxnet3_rxtx.c\n+++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c\n@@ -737,9 +737,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@@ -1041,28 +1041,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",
        "1/8"
    ]
}