get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 8491,
    "url": "https://patches.dpdk.org/api/patches/8491/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1446259484-21070-4-git-send-email-shaopeng.he@intel.com/",
    "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": "<1446259484-21070-4-git-send-email-shaopeng.he@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1446259484-21070-4-git-send-email-shaopeng.he@intel.com",
    "date": "2015-10-31T02:44:43",
    "name": "[dpdk-dev,v4,3/4] fm10k: add VMDQ support in multi-queue configure",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "1f21472f3e338098d98b9b49d68910151c0ffcf2",
    "submitter": {
        "id": 226,
        "url": "https://patches.dpdk.org/api/people/226/?format=api",
        "name": "He, Shaopeng",
        "email": "shaopeng.he@intel.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1446259484-21070-4-git-send-email-shaopeng.he@intel.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/8491/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/8491/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 9F5E78E81;\n\tSat, 31 Oct 2015 03:45:07 +0100 (CET)",
            "from mga09.intel.com (mga09.intel.com [134.134.136.24])\n\tby dpdk.org (Postfix) with ESMTP id 77FD88E76\n\tfor <dev@dpdk.org>; Sat, 31 Oct 2015 03:44:59 +0100 (CET)",
            "from orsmga001.jf.intel.com ([10.7.209.18])\n\tby orsmga102.jf.intel.com with ESMTP; 30 Oct 2015 19:44:59 -0700",
            "from shvmail01.sh.intel.com ([10.239.29.42])\n\tby orsmga001.jf.intel.com with ESMTP; 30 Oct 2015 19:44:58 -0700",
            "from shecgisg004.sh.intel.com (shecgisg004.sh.intel.com\n\t[10.239.29.89])\n\tby shvmail01.sh.intel.com with ESMTP id t9V2iusV027992;\n\tSat, 31 Oct 2015 10:44:56 +0800",
            "from shecgisg004.sh.intel.com (localhost [127.0.0.1])\n\tby shecgisg004.sh.intel.com (8.13.6/8.13.6/SuSE Linux 0.8) with ESMTP\n\tid t9V2irSB021126; Sat, 31 Oct 2015 10:44:55 +0800",
            "(from heshaope@localhost)\n\tby shecgisg004.sh.intel.com (8.13.6/8.13.6/Submit) id t9V2irXg021122; \n\tSat, 31 Oct 2015 10:44:53 +0800"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.20,221,1444719600\"; d=\"scan'208\";a=\"808095168\"",
        "From": "Shaopeng He <shaopeng.he@intel.com>",
        "To": "dev@dpdk.org",
        "Date": "Sat, 31 Oct 2015 10:44:43 +0800",
        "Message-Id": "<1446259484-21070-4-git-send-email-shaopeng.he@intel.com>",
        "X-Mailer": "git-send-email 1.7.4.1",
        "In-Reply-To": "<1446259484-21070-1-git-send-email-shaopeng.he@intel.com>",
        "References": "<1445937709-5445-1-git-send-email-shaopeng.he@intel.com>\n\t<1446259484-21070-1-git-send-email-shaopeng.he@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v4 3/4] fm10k: add VMDQ support in multi-queue\n\tconfigure",
        "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": "Add separate functions to configure VMDQ and RSS.\nUpdate dglort map and logic ports accordingly.\nReset MAC/VLAN filter after VMDQ config was changed.\n\nSigned-off-by: Shaopeng He <shaopeng.he@intel.com>\nAcked-by: Jingjing Wu <jingjing.wu@intel.com>\nAcked-by: Michael Qiu <michael.qiu@intel.com>\n---\n drivers/net/fm10k/fm10k_ethdev.c | 164 +++++++++++++++++++++++++++++++++------\n 1 file changed, 141 insertions(+), 23 deletions(-)",
    "diff": "diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c\nindex 76c050a..941dae7 100644\n--- a/drivers/net/fm10k/fm10k_ethdev.c\n+++ b/drivers/net/fm10k/fm10k_ethdev.c\n@@ -337,8 +337,41 @@ fm10k_dev_configure(struct rte_eth_dev *dev)\n \treturn 0;\n }\n \n+/* fls = find last set bit = 32 minus the number of leading zeros */\n+#ifndef fls\n+#define fls(x) (((x) == 0) ? 0 : (32 - __builtin_clz((x))))\n+#endif\n+\n static void\n-fm10k_dev_mq_rx_configure(struct rte_eth_dev *dev)\n+fm10k_dev_vmdq_rx_configure(struct rte_eth_dev *dev)\n+{\n+\tstruct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\tstruct rte_eth_vmdq_rx_conf *vmdq_conf;\n+\tuint32_t i;\n+\n+\tvmdq_conf = &dev->data->dev_conf.rx_adv_conf.vmdq_rx_conf;\n+\n+\tfor (i = 0; i < vmdq_conf->nb_pool_maps; i++) {\n+\t\tif (!vmdq_conf->pool_map[i].pools)\n+\t\t\tcontinue;\n+\t\tfm10k_mbx_lock(hw);\n+\t\tfm10k_update_vlan(hw, vmdq_conf->pool_map[i].vlan_id, 0, true);\n+\t\tfm10k_mbx_unlock(hw);\n+\t}\n+}\n+\n+static void\n+fm10k_dev_pf_main_vsi_reset(struct rte_eth_dev *dev)\n+{\n+\tstruct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\n+\t/* Add default mac address */\n+\tfm10k_MAC_filter_set(dev, hw->mac.addr, true,\n+\t\tMAIN_VSI_POOL_NUMBER);\n+}\n+\n+static void\n+fm10k_dev_rss_configure(struct rte_eth_dev *dev)\n {\n \tstruct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n \tstruct rte_eth_conf *dev_conf = &dev->data->dev_conf;\n@@ -409,6 +442,78 @@ fm10k_dev_mq_rx_configure(struct rte_eth_dev *dev)\n \tFM10K_WRITE_REG(hw, FM10K_MRQC(0), mrqc);\n }\n \n+static void\n+fm10k_dev_logic_port_update(struct rte_eth_dev *dev,\n+\tuint16_t nb_lport_old, uint16_t nb_lport_new)\n+{\n+\tstruct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\tuint32_t i;\n+\n+\tfm10k_mbx_lock(hw);\n+\t/* Disable previous logic ports */\n+\tif (nb_lport_old)\n+\t\thw->mac.ops.update_lport_state(hw, hw->mac.dglort_map,\n+\t\t\tnb_lport_old, false);\n+\t/* Enable new logic ports */\n+\thw->mac.ops.update_lport_state(hw, hw->mac.dglort_map,\n+\t\tnb_lport_new, true);\n+\tfm10k_mbx_unlock(hw);\n+\n+\tfor (i = 0; i < nb_lport_new; i++) {\n+\t\t/* Set unicast mode by default. App can change\n+\t\t * to other mode in other API func.\n+\t\t */\n+\t\tfm10k_mbx_lock(hw);\n+\t\thw->mac.ops.update_xcast_mode(hw, hw->mac.dglort_map + i,\n+\t\t\tFM10K_XCAST_MODE_NONE);\n+\t\tfm10k_mbx_unlock(hw);\n+\t}\n+}\n+\n+static void\n+fm10k_dev_mq_rx_configure(struct rte_eth_dev *dev)\n+{\n+\tstruct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\tstruct rte_eth_vmdq_rx_conf *vmdq_conf;\n+\tstruct rte_eth_conf *dev_conf = &dev->data->dev_conf;\n+\tstruct fm10k_macvlan_filter_info *macvlan;\n+\tuint16_t nb_queue_pools = 0; /* pool number in configuration */\n+\tuint16_t nb_lport_new, nb_lport_old;\n+\n+\tmacvlan = FM10K_DEV_PRIVATE_TO_MACVLAN(dev->data->dev_private);\n+\tvmdq_conf = &dev->data->dev_conf.rx_adv_conf.vmdq_rx_conf;\n+\n+\tfm10k_dev_rss_configure(dev);\n+\n+\t/* only PF supports VMDQ */\n+\tif (hw->mac.type != fm10k_mac_pf)\n+\t\treturn;\n+\n+\tif (dev_conf->rxmode.mq_mode & ETH_MQ_RX_VMDQ_FLAG)\n+\t\tnb_queue_pools = vmdq_conf->nb_queue_pools;\n+\n+\t/* no pool number change, no need to update logic port and VLAN/MAC */\n+\tif (macvlan->nb_queue_pools == nb_queue_pools)\n+\t\treturn;\n+\n+\tnb_lport_old = macvlan->nb_queue_pools ? macvlan->nb_queue_pools : 1;\n+\tnb_lport_new = nb_queue_pools ? nb_queue_pools : 1;\n+\tfm10k_dev_logic_port_update(dev, nb_lport_old, nb_lport_new);\n+\n+\t/* reset MAC/VLAN as it's based on VMDQ or PF main VSI */\n+\tmemset(dev->data->mac_addrs, 0,\n+\t\tETHER_ADDR_LEN * FM10K_MAX_MACADDR_NUM);\n+\tether_addr_copy((const struct ether_addr *)hw->mac.addr,\n+\t\t&dev->data->mac_addrs[0]);\n+\tmemset(macvlan, 0, sizeof(*macvlan));\n+\tmacvlan->nb_queue_pools = nb_queue_pools;\n+\n+\tif (nb_queue_pools)\n+\t\tfm10k_dev_vmdq_rx_configure(dev);\n+\telse\n+\t\tfm10k_dev_pf_main_vsi_reset(dev);\n+}\n+\n static int\n fm10k_dev_tx_init(struct rte_eth_dev *dev)\n {\n@@ -517,7 +622,7 @@ fm10k_dev_rx_init(struct rte_eth_dev *dev)\n \t\tFM10K_WRITE_FLUSH(hw);\n \t}\n \n-\t/* Configure RSS if applicable */\n+\t/* Configure VMDQ/RSS if applicable */\n \tfm10k_dev_mq_rx_configure(dev);\n \treturn 0;\n }\n@@ -747,10 +852,32 @@ fm10k_dev_allmulticast_disable(struct rte_eth_dev *dev)\n \t\tPMD_INIT_LOG(ERR, \"Failed to disable allmulticast mode\");\n }\n \n-/* fls = find last set bit = 32 minus the number of leading zeros */\n-#ifndef fls\n-#define fls(x) (((x) == 0) ? 0 : (32 - __builtin_clz((x))))\n-#endif\n+static void\n+fm10k_dev_dglort_map_configure(struct rte_eth_dev *dev)\n+{\n+\tstruct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\tuint32_t dglortdec, pool_len, rss_len, i;\n+\tuint16_t nb_queue_pools;\n+\tstruct fm10k_macvlan_filter_info *macvlan;\n+\n+\tmacvlan = FM10K_DEV_PRIVATE_TO_MACVLAN(dev->data->dev_private);\n+\tnb_queue_pools = macvlan->nb_queue_pools;\n+\tpool_len = nb_queue_pools ? fls(nb_queue_pools - 1) : 0;\n+\trss_len = fls(dev->data->nb_rx_queues - 1) - pool_len;\n+\tdglortdec = (rss_len << FM10K_DGLORTDEC_RSSLENGTH_SHIFT) | pool_len;\n+\n+\t/* Establish only MAP 0 as valid */\n+\tFM10K_WRITE_REG(hw, FM10K_DGLORTMAP(0), FM10K_DGLORTMAP_ANY);\n+\n+\t/* Configure VMDQ/RSS DGlort Decoder */\n+\tFM10K_WRITE_REG(hw, FM10K_DGLORTDEC(0), dglortdec);\n+\n+\t/* Invalidate all other GLORT entries */\n+\tfor (i = 1; i < FM10K_DGLORT_COUNT; i++)\n+\t\tFM10K_WRITE_REG(hw, FM10K_DGLORTMAP(i),\n+\t\t\t\tFM10K_DGLORTMAP_NONE);\n+}\n+\n #define BSIZEPKT_ROUNDUP ((1 << FM10K_SRRCTL_BSIZEPKT_SHIFT) - 1)\n static int\n fm10k_dev_start(struct rte_eth_dev *dev)\n@@ -791,20 +918,8 @@ fm10k_dev_start(struct rte_eth_dev *dev)\n \t\treturn diag;\n \t}\n \n-\tif (hw->mac.type == fm10k_mac_pf) {\n-\t\t/* Establish only VSI 0 as valid */\n-\t\tFM10K_WRITE_REG(hw, FM10K_DGLORTMAP(0), FM10K_DGLORTMAP_ANY);\n-\n-\t\t/* Configure RSS bits used in RETA table */\n-\t\tFM10K_WRITE_REG(hw, FM10K_DGLORTDEC(0),\n-\t\t\t\tfls(dev->data->nb_rx_queues - 1) <<\n-\t\t\t\tFM10K_DGLORTDEC_RSSLENGTH_SHIFT);\n-\n-\t\t/* Invalidate all other GLORT entries */\n-\t\tfor (i = 1; i < FM10K_DGLORT_COUNT; i++)\n-\t\t\tFM10K_WRITE_REG(hw, FM10K_DGLORTMAP(i),\n-\t\t\t\t\tFM10K_DGLORTMAP_NONE);\n-\t}\n+\tif (hw->mac.type == fm10k_mac_pf)\n+\t\tfm10k_dev_dglort_map_configure(dev);\n \n \tfor (i = 0; i < dev->data->nb_rx_queues; i++) {\n \t\tstruct fm10k_rx_queue *rxq;\n@@ -838,8 +953,8 @@ fm10k_dev_start(struct rte_eth_dev *dev)\n \t\t}\n \t}\n \n-\t/* Update default vlan */\n-\tif (hw->mac.default_vid && hw->mac.default_vid <= ETHER_MAX_VLAN_ID)\n+\t/* Update default vlan when not in VMDQ mode */\n+\tif (!(dev->data->dev_conf.rxmode.mq_mode & ETH_MQ_RX_VMDQ_FLAG))\n \t\tfm10k_vlan_filter_set(dev, hw->mac.default_vid, true);\n \n \treturn 0;\n@@ -978,7 +1093,10 @@ fm10k_dev_infos_get(struct rte_eth_dev *dev,\n \tdev_info->max_mac_addrs      = FM10K_MAX_MACADDR_NUM;\n \tdev_info->max_hash_mac_addrs = 0;\n \tdev_info->max_vfs            = dev->pci_dev->max_vfs;\n-\tdev_info->max_vmdq_pools     = ETH_64_POOLS;\n+\tdev_info->vmdq_pool_base     = 0;\n+\tdev_info->vmdq_queue_base    = 0;\n+\tdev_info->max_vmdq_pools     = ETH_32_POOLS;\n+\tdev_info->vmdq_queue_num     = FM10K_MAX_QUEUES_PF;\n \tdev_info->rx_offload_capa =\n \t\tDEV_RX_OFFLOAD_VLAN_STRIP |\n \t\tDEV_RX_OFFLOAD_IPV4_CKSUM |\n",
    "prefixes": [
        "dpdk-dev",
        "v4",
        "3/4"
    ]
}