get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 25021,
    "url": "http://patches.dpdk.org/api/patches/25021/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1496385391-12445-5-git-send-email-wei.zhao1@intel.com/",
    "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": "<1496385391-12445-5-git-send-email-wei.zhao1@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1496385391-12445-5-git-send-email-wei.zhao1@intel.com",
    "date": "2017-06-02T06:36:24",
    "name": "[dpdk-dev,v2,04/11] net/e1000: restore flex type filter",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "8135fbe16b6767f22aca818160287404dd567c7a",
    "submitter": {
        "id": 495,
        "url": "http://patches.dpdk.org/api/people/495/?format=api",
        "name": "Zhao1, Wei",
        "email": "wei.zhao1@intel.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1496385391-12445-5-git-send-email-wei.zhao1@intel.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/25021/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/25021/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 5F47B7D27;\n\tFri,  2 Jun 2017 08:45:44 +0200 (CEST)",
            "from mga06.intel.com (mga06.intel.com [134.134.136.31])\n\tby dpdk.org (Postfix) with ESMTP id 9333F7D18\n\tfor <dev@dpdk.org>; Fri,  2 Jun 2017 08:45:38 +0200 (CEST)",
            "from fmsmga006.fm.intel.com ([10.253.24.20])\n\tby orsmga104.jf.intel.com with ESMTP; 01 Jun 2017 23:45:36 -0700",
            "from dpdk1.bj.intel.com ([172.16.182.84])\n\tby fmsmga006.fm.intel.com with ESMTP; 01 Jun 2017 23:45:33 -0700"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.39,283,1493708400\"; d=\"scan'208\";a=\"110013433\"",
        "From": "Wei Zhao <wei.zhao1@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "wenzhuo.lu@intel.com,\n\tWei Zhao <wei.zhao1@intel.com>",
        "Date": "Fri,  2 Jun 2017 14:36:24 +0800",
        "Message-Id": "<1496385391-12445-5-git-send-email-wei.zhao1@intel.com>",
        "X-Mailer": "git-send-email 2.5.5",
        "In-Reply-To": "<1496385391-12445-1-git-send-email-wei.zhao1@intel.com>",
        "References": "<1495523581-56027-1-git-send-email-wei.zhao1@intel.com>\n\t<1496385391-12445-1-git-send-email-wei.zhao1@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v2 04/11] net/e1000: restore flex type filter",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <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": "Add support for restoring flex type filter in SW.\n\nSigned-off-by: Wei Zhao <wei.zhao1@intel.com>\n---\n drivers/net/e1000/igb_ethdev.c | 189 ++++++++++++++++++++++++++---------------\n 1 file changed, 122 insertions(+), 67 deletions(-)",
    "diff": "diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c\nindex b2346b3..b1988ac 100644\n--- a/drivers/net/e1000/igb_ethdev.c\n+++ b/drivers/net/e1000/igb_ethdev.c\n@@ -786,6 +786,22 @@ static int igb_ntuple_filter_uninit(struct rte_eth_dev *eth_dev)\n \treturn 0;\n }\n \n+/* Remove all flex filters of the device */\n+static int igb_flex_filter_uninit(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct e1000_filter_info *filter_info =\n+\t\tE1000_DEV_PRIVATE_TO_FILTER_INFO(eth_dev->data->dev_private);\n+\tstruct e1000_flex_filter *p_flex;\n+\n+\twhile ((p_flex = TAILQ_FIRST(&filter_info->flex_list))) {\n+\t\tTAILQ_REMOVE(&filter_info->flex_list, p_flex, entries);\n+\t\trte_free(p_flex);\n+\t}\n+\tfilter_info->flex_mask = 0;\n+\n+\treturn 0;\n+}\n+\n static int\n eth_igb_dev_init(struct rte_eth_dev *eth_dev)\n {\n@@ -1004,6 +1020,9 @@ eth_igb_dev_uninit(struct rte_eth_dev *eth_dev)\n \t/* remove all ntuple filters of the device */\n \tigb_ntuple_filter_uninit(eth_dev);\n \n+\t/* remove all flex filters of the device */\n+\tigb_flex_filter_uninit(eth_dev);\n+\n \treturn 0;\n }\n \n@@ -1506,11 +1525,8 @@ static void\n eth_igb_stop(struct rte_eth_dev *dev)\n {\n \tstruct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n-\tstruct e1000_filter_info *filter_info =\n-\t\tE1000_DEV_PRIVATE_TO_FILTER_INFO(dev->data->dev_private);\n \tstruct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);\n \tstruct rte_eth_link link;\n-\tstruct e1000_flex_filter *p_flex;\n \tstruct rte_intr_handle *intr_handle = &pci_dev->intr_handle;\n \n \tigb_intr_disable(hw);\n@@ -1539,13 +1555,6 @@ eth_igb_stop(struct rte_eth_dev *dev)\n \tmemset(&link, 0, sizeof(link));\n \trte_igb_dev_atomic_write_link_status(dev, &link);\n \n-\t/* Remove all flex filters of the device */\n-\twhile ((p_flex = TAILQ_FIRST(&filter_info->flex_list))) {\n-\t\tTAILQ_REMOVE(&filter_info->flex_list, p_flex, entries);\n-\t\trte_free(p_flex);\n-\t}\n-\tfilter_info->flex_mask = 0;\n-\n \tif (!rte_intr_allow_others(intr_handle))\n \t\t/* resume to the default handler */\n \t\trte_intr_callback_register(intr_handle,\n@@ -3910,6 +3919,45 @@ igb_remove_2tuple_filter(struct rte_eth_dev *dev,\n \treturn 0;\n }\n \n+/* inject a igb flex filter to HW */\n+static inline void\n+igb_inject_flex_filter(struct rte_eth_dev *dev,\n+\t\t\t   struct e1000_flex_filter *filter)\n+{\n+\tstruct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\tuint32_t wufc, queueing;\n+\tuint32_t reg_off;\n+\tuint8_t i, j = 0;\n+\n+\twufc = E1000_READ_REG(hw, E1000_WUFC);\n+\tif (filter->index < E1000_MAX_FHFT)\n+\t\treg_off = E1000_FHFT(filter->index);\n+\telse\n+\t\treg_off = E1000_FHFT_EXT(filter->index - E1000_MAX_FHFT);\n+\n+\tE1000_WRITE_REG(hw, E1000_WUFC, wufc | E1000_WUFC_FLEX_HQ |\n+\t\t\t(E1000_WUFC_FLX0 << filter->index));\n+\tqueueing = filter->filter_info.len |\n+\t\t(filter->queue << E1000_FHFT_QUEUEING_QUEUE_SHIFT) |\n+\t\t(filter->filter_info.priority <<\n+\t\t\tE1000_FHFT_QUEUEING_PRIO_SHIFT);\n+\tE1000_WRITE_REG(hw, reg_off + E1000_FHFT_QUEUEING_OFFSET,\n+\t\t\tqueueing);\n+\n+\tfor (i = 0; i < E1000_FLEX_FILTERS_MASK_SIZE; i++) {\n+\t\tE1000_WRITE_REG(hw, reg_off,\n+\t\t\t\tfilter->filter_info.dwords[j]);\n+\t\treg_off += sizeof(uint32_t);\n+\t\tE1000_WRITE_REG(hw, reg_off,\n+\t\t\t\tfilter->filter_info.dwords[++j]);\n+\t\treg_off += sizeof(uint32_t);\n+\t\tE1000_WRITE_REG(hw, reg_off,\n+\t\t\t(uint32_t)filter->filter_info.mask[i]);\n+\t\treg_off += sizeof(uint32_t) * 2;\n+\t\t++j;\n+\t}\n+}\n+\n static inline struct e1000_flex_filter *\n eth_igb_flex_filter_lookup(struct e1000_flex_filter_list *filter_list,\n \t\t\tstruct e1000_flex_filter_info *key)\n@@ -3925,18 +3973,48 @@ eth_igb_flex_filter_lookup(struct e1000_flex_filter_list *filter_list,\n \treturn NULL;\n }\n \n-static int\n+/* remove a flex byte filter\n+ * @param\n+ * dev: Pointer to struct rte_eth_dev.\n+ * filter: the pointer of the filter will be removed.\n+ */\n+static void\n+igb_remove_flex_filter(struct rte_eth_dev *dev,\n+\t\t\tstruct e1000_flex_filter *filter)\n+{\n+\tstruct e1000_filter_info *filter_info =\n+\t\tE1000_DEV_PRIVATE_TO_FILTER_INFO(dev->data->dev_private);\n+\tstruct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\tuint32_t wufc, i;\n+\tuint32_t reg_off;\n+\n+\twufc = E1000_READ_REG(hw, E1000_WUFC);\n+\tif (filter->index < E1000_MAX_FHFT)\n+\t\treg_off = E1000_FHFT(filter->index);\n+\telse\n+\t\treg_off = E1000_FHFT_EXT(filter->index - E1000_MAX_FHFT);\n+\n+\tfor (i = 0; i < E1000_FHFT_SIZE_IN_DWD; i++)\n+\t\tE1000_WRITE_REG(hw, reg_off + i * sizeof(uint32_t), 0);\n+\n+\tE1000_WRITE_REG(hw, E1000_WUFC, wufc &\n+\t\t(~(E1000_WUFC_FLX0 << filter->index)));\n+\n+\tfilter_info->flex_mask &= ~(1 << filter->index);\n+\tTAILQ_REMOVE(&filter_info->flex_list, filter, entries);\n+\trte_free(filter);\n+}\n+\n+int\n eth_igb_add_del_flex_filter(struct rte_eth_dev *dev,\n \t\t\tstruct rte_eth_flex_filter *filter,\n \t\t\tbool add)\n {\n-\tstruct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n \tstruct e1000_filter_info *filter_info =\n \t\tE1000_DEV_PRIVATE_TO_FILTER_INFO(dev->data->dev_private);\n \tstruct e1000_flex_filter *flex_filter, *it;\n-\tuint32_t wufc, queueing, mask;\n-\tuint32_t reg_off;\n-\tuint8_t shift, i, j = 0;\n+\tuint32_t mask;\n+\tuint8_t shift, i;\n \n \tflex_filter = rte_zmalloc(\"e1000_flex_filter\",\n \t\t\tsizeof(struct e1000_flex_filter), 0);\n@@ -3956,15 +4034,20 @@ eth_igb_add_del_flex_filter(struct rte_eth_dev *dev,\n \t\tflex_filter->filter_info.mask[i] = mask;\n \t}\n \n-\twufc = E1000_READ_REG(hw, E1000_WUFC);\n+\tit = eth_igb_flex_filter_lookup(&filter_info->flex_list,\n+\t\t\t\t&flex_filter->filter_info);\n+\tif (it == NULL && !add) {\n+\t\tPMD_DRV_LOG(ERR, \"filter doesn't exist.\");\n+\t\trte_free(flex_filter);\n+\t\treturn -ENOENT;\n+\t}\n+\tif (it != NULL && add) {\n+\t\tPMD_DRV_LOG(ERR, \"filter exists.\");\n+\t\trte_free(flex_filter);\n+\t\treturn -EEXIST;\n+\t}\n \n \tif (add) {\n-\t\tif (eth_igb_flex_filter_lookup(&filter_info->flex_list,\n-\t\t\t\t&flex_filter->filter_info) != NULL) {\n-\t\t\tPMD_DRV_LOG(ERR, \"filter exists.\");\n-\t\t\trte_free(flex_filter);\n-\t\t\treturn -EEXIST;\n-\t\t}\n \t\tflex_filter->queue = filter->queue;\n \t\t/*\n \t\t * look for an unused flex filter index\n@@ -3986,52 +4069,10 @@ eth_igb_add_del_flex_filter(struct rte_eth_dev *dev,\n \t\t\treturn -ENOSYS;\n \t\t}\n \n-\t\tif (flex_filter->index < E1000_MAX_FHFT)\n-\t\t\treg_off = E1000_FHFT(flex_filter->index);\n-\t\telse\n-\t\t\treg_off = E1000_FHFT_EXT(flex_filter->index - E1000_MAX_FHFT);\n-\n-\t\tE1000_WRITE_REG(hw, E1000_WUFC, wufc | E1000_WUFC_FLEX_HQ |\n-\t\t\t\t(E1000_WUFC_FLX0 << flex_filter->index));\n-\t\tqueueing = filter->len |\n-\t\t\t(filter->queue << E1000_FHFT_QUEUEING_QUEUE_SHIFT) |\n-\t\t\t(filter->priority << E1000_FHFT_QUEUEING_PRIO_SHIFT);\n-\t\tE1000_WRITE_REG(hw, reg_off + E1000_FHFT_QUEUEING_OFFSET,\n-\t\t\t\tqueueing);\n-\t\tfor (i = 0; i < E1000_FLEX_FILTERS_MASK_SIZE; i++) {\n-\t\t\tE1000_WRITE_REG(hw, reg_off,\n-\t\t\t\t\tflex_filter->filter_info.dwords[j]);\n-\t\t\treg_off += sizeof(uint32_t);\n-\t\t\tE1000_WRITE_REG(hw, reg_off,\n-\t\t\t\t\tflex_filter->filter_info.dwords[++j]);\n-\t\t\treg_off += sizeof(uint32_t);\n-\t\t\tE1000_WRITE_REG(hw, reg_off,\n-\t\t\t\t(uint32_t)flex_filter->filter_info.mask[i]);\n-\t\t\treg_off += sizeof(uint32_t) * 2;\n-\t\t\t++j;\n-\t\t}\n-\t} else {\n-\t\tit = eth_igb_flex_filter_lookup(&filter_info->flex_list,\n-\t\t\t\t&flex_filter->filter_info);\n-\t\tif (it == NULL) {\n-\t\t\tPMD_DRV_LOG(ERR, \"filter doesn't exist.\");\n-\t\t\trte_free(flex_filter);\n-\t\t\treturn -ENOENT;\n-\t\t}\n+\t\tigb_inject_flex_filter(dev, flex_filter);\n \n-\t\tif (it->index < E1000_MAX_FHFT)\n-\t\t\treg_off = E1000_FHFT(it->index);\n-\t\telse\n-\t\t\treg_off = E1000_FHFT_EXT(it->index - E1000_MAX_FHFT);\n-\n-\t\tfor (i = 0; i < E1000_FHFT_SIZE_IN_DWD; i++)\n-\t\t\tE1000_WRITE_REG(hw, reg_off + i * sizeof(uint32_t), 0);\n-\t\tE1000_WRITE_REG(hw, E1000_WUFC, wufc &\n-\t\t\t(~(E1000_WUFC_FLX0 << it->index)));\n-\n-\t\tfilter_info->flex_mask &= ~(1 << it->index);\n-\t\tTAILQ_REMOVE(&filter_info->flex_list, it, entries);\n-\t\trte_free(it);\n+\t} else {\n+\t\tigb_remove_flex_filter(dev, it);\n \t\trte_free(flex_filter);\n \t}\n \n@@ -5533,6 +5574,19 @@ igb_ethertype_filter_restore(struct rte_eth_dev *dev)\n \t}\n }\n \n+/* restore flex byte filter */\n+static inline void\n+igb_flex_filter_restore(struct rte_eth_dev *dev)\n+{\n+\tstruct e1000_filter_info *filter_info =\n+\t\tE1000_DEV_PRIVATE_TO_FILTER_INFO(dev->data->dev_private);\n+\tstruct e1000_flex_filter *flex_filter;\n+\n+\tTAILQ_FOREACH(flex_filter, &filter_info->flex_list, entries) {\n+\t\tigb_inject_flex_filter(dev, flex_filter);\n+\t}\n+}\n+\n /* restore all types filter */\n static int\n igb_filter_restore(struct rte_eth_dev *dev)\n@@ -5540,6 +5594,7 @@ igb_filter_restore(struct rte_eth_dev *dev)\n \tigb_ntuple_filter_restore(dev);\n \tigb_ethertype_filter_restore(dev);\n \tigb_syn_filter_restore(dev);\n+\tigb_flex_filter_restore(dev);\n \n \treturn 0;\n }\n",
    "prefixes": [
        "dpdk-dev",
        "v2",
        "04/11"
    ]
}