get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 87073,
    "url": "https://patches.dpdk.org/api/patches/87073/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20210122094800.197748-16-jiawenwu@trustnetic.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": "<20210122094800.197748-16-jiawenwu@trustnetic.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210122094800.197748-16-jiawenwu@trustnetic.com",
    "date": "2021-01-22T09:47:55",
    "name": "[v1,15/20] net/txgbe: start and stop VF device",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "7f5c1f06e691944790c837675c6c94aa27dae565",
    "submitter": {
        "id": 1932,
        "url": "https://patches.dpdk.org/api/people/1932/?format=api",
        "name": "Jiawen Wu",
        "email": "jiawenwu@trustnetic.com"
    },
    "delegate": {
        "id": 319,
        "url": "https://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20210122094800.197748-16-jiawenwu@trustnetic.com/mbox/",
    "series": [
        {
            "id": 14902,
            "url": "https://patches.dpdk.org/api/series/14902/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=14902",
            "date": "2021-01-22T09:47:41",
            "name": "net/txgbe: add VF driver support",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/14902/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/87073/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/87073/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 45773A0A0A;\n\tFri, 22 Jan 2021 10:50:16 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 29304140EC1;\n\tFri, 22 Jan 2021 10:48:22 +0100 (CET)",
            "from smtpbgbr2.qq.com (smtpbgbr2.qq.com [54.207.22.56])\n by mails.dpdk.org (Postfix) with ESMTP id 254D9140EA9\n for <dev@dpdk.org>; Fri, 22 Jan 2021 10:48:17 +0100 (CET)",
            "from wxdbg.localdomain.com (unknown [183.129.236.74])\n by esmtp6.qq.com (ESMTP) with\n id ; Fri, 22 Jan 2021 17:48:13 +0800 (CST)"
        ],
        "X-QQ-mid": "bizesmtp9t1611308894t8r1gbsxr",
        "X-QQ-SSF": "01400000002000C0D000B00A0000000",
        "X-QQ-FEAT": "Ude1zx7N41SF8VgcIPKrFSDyZZFhoJ2LS6yC6LECQ2cJDVlDLQyUZdBE9lzAU\n 9lAQ9/a31Vcu5zLZ50at6dlC8Tcq5HIBHn5AIIMbXWlXJOb5bE7Oa3mjN5wsxnvWhnH1tDY\n 8jaeegl9Y3ib/mFo2aSlTITzmvlvPNyb1XboTX6aEU0zIkarIjgum9hecKrDFcbHyaW6u2K\n axpcNUKGPd1HMIJt/AKsabGO3Cw0CYgOCIEng9SN43uwWDFtPPucusNpMWFrcQ8zedW+RHK\n bhUcDEmw9cTfuufI3womXp/Ph8qhJjjAt1shoEOv2YplptpmiXtl6FUUjNU8k/oMc3N755U\n 2kbxgvcpbOxMTGvhxKobOh955qrJQ==",
        "X-QQ-GoodBg": "2",
        "From": "Jiawen Wu <jiawenwu@trustnetic.com>",
        "To": "dev@dpdk.org",
        "Cc": "Jiawen Wu <jiawenwu@trustnetic.com>",
        "Date": "Fri, 22 Jan 2021 17:47:55 +0800",
        "Message-Id": "<20210122094800.197748-16-jiawenwu@trustnetic.com>",
        "X-Mailer": "git-send-email 2.27.0",
        "In-Reply-To": "<20210122094800.197748-1-jiawenwu@trustnetic.com>",
        "References": "<20210122094800.197748-1-jiawenwu@trustnetic.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-QQ-SENDSIZE": "520",
        "Feedback-ID": "bizesmtp:trustnetic.com:qybgforeign:qybgforeign7",
        "X-QQ-Bgrelay": "1",
        "Subject": "[dpdk-dev] [PATCH v1 15/20] net/txgbe: start and stop VF device",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Add support to start, stop and reset VF device.\n\nSigned-off-by: Jiawen Wu <jiawenwu@trustnetic.com>\n---\n drivers/net/txgbe/txgbe_ethdev.h    |   2 +\n drivers/net/txgbe/txgbe_ethdev_vf.c | 176 +++++++++++++++++++++++++++-\n drivers/net/txgbe/txgbe_rxtx.c      |  57 +++++++++\n 3 files changed, 234 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/drivers/net/txgbe/txgbe_ethdev.h b/drivers/net/txgbe/txgbe_ethdev.h\nindex 52ce9c31e..5d4d9434a 100644\n--- a/drivers/net/txgbe/txgbe_ethdev.h\n+++ b/drivers/net/txgbe/txgbe_ethdev.h\n@@ -479,6 +479,8 @@ int txgbevf_dev_rx_init(struct rte_eth_dev *dev);\n \n void txgbevf_dev_tx_init(struct rte_eth_dev *dev);\n \n+void txgbevf_dev_rxtx_start(struct rte_eth_dev *dev);\n+\n uint16_t txgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,\n \t\tuint16_t nb_pkts);\n \ndiff --git a/drivers/net/txgbe/txgbe_ethdev_vf.c b/drivers/net/txgbe/txgbe_ethdev_vf.c\nindex 05e666d57..1ae221167 100644\n--- a/drivers/net/txgbe/txgbe_ethdev_vf.c\n+++ b/drivers/net/txgbe/txgbe_ethdev_vf.c\n@@ -9,6 +9,7 @@\n #include <string.h>\n #include <rte_log.h>\n #include <rte_ethdev_pci.h>\n+#include <rte_alarm.h>\n \n #include \"txgbe_logs.h\"\n #include \"base/txgbe.h\"\n@@ -51,8 +52,10 @@ static int txgbevf_dev_xstats_get(struct rte_eth_dev *dev,\n static int txgbevf_dev_info_get(struct rte_eth_dev *dev,\n \t\t\t\t struct rte_eth_dev_info *dev_info);\n static int  txgbevf_dev_configure(struct rte_eth_dev *dev);\n+static int  txgbevf_dev_start(struct rte_eth_dev *dev);\n static int txgbevf_dev_link_update(struct rte_eth_dev *dev,\n \t\t\t\t   int wait_to_complete);\n+static int txgbevf_dev_stop(struct rte_eth_dev *dev);\n static int txgbevf_dev_close(struct rte_eth_dev *dev);\n static void txgbevf_intr_disable(struct rte_eth_dev *dev);\n static void txgbevf_intr_enable(struct rte_eth_dev *dev);\n@@ -605,18 +608,168 @@ txgbevf_dev_configure(struct rte_eth_dev *dev)\n \treturn 0;\n }\n \n+static int\n+txgbevf_dev_start(struct rte_eth_dev *dev)\n+{\n+\tstruct txgbe_hw *hw = TXGBE_DEV_HW(dev);\n+\tuint32_t intr_vector = 0;\n+\tstruct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);\n+\tstruct rte_intr_handle *intr_handle = &pci_dev->intr_handle;\n+\n+\tint err, mask = 0;\n+\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\t/* Stop the link setup handler before resetting the HW. */\n+\trte_eal_alarm_cancel(txgbe_dev_setup_link_alarm_handler, dev);\n+\n+\terr = hw->mac.reset_hw(hw);\n+\tif (err) {\n+\t\tPMD_INIT_LOG(ERR, \"Unable to reset vf hardware (%d)\", err);\n+\t\treturn err;\n+\t}\n+\thw->mac.get_link_status = true;\n+\n+\t/* negotiate mailbox API version to use with the PF. */\n+\ttxgbevf_negotiate_api(hw);\n+\n+\ttxgbevf_dev_tx_init(dev);\n+\n+\t/* This can fail when allocating mbufs for descriptor rings */\n+\terr = txgbevf_dev_rx_init(dev);\n+\n+\t/**\n+\t * In this case, reuses the MAC address assigned by VF\n+\t * initialization.\n+\t */\n+\tif (err != 0 && err != TXGBE_ERR_INVALID_MAC_ADDR) {\n+\t\tPMD_INIT_LOG(ERR, \"Unable to initialize RX hardware (%d)\", err);\n+\t\ttxgbe_dev_clear_queues(dev);\n+\t\treturn err;\n+\t}\n+\n+\t/* Set vfta */\n+\ttxgbevf_set_vfta_all(dev, 1);\n+\n+\t/* Set HW strip */\n+\tmask = ETH_VLAN_STRIP_MASK | ETH_VLAN_FILTER_MASK |\n+\t\tETH_VLAN_EXTEND_MASK;\n+\terr = txgbevf_vlan_offload_config(dev, mask);\n+\tif (err) {\n+\t\tPMD_INIT_LOG(ERR, \"Unable to set VLAN offload (%d)\", err);\n+\t\ttxgbe_dev_clear_queues(dev);\n+\t\treturn err;\n+\t}\n+\n+\ttxgbevf_dev_rxtx_start(dev);\n+\n+\t/* check and configure queue intr-vector mapping */\n+\tif (rte_intr_cap_multiple(intr_handle) &&\n+\t    dev->data->dev_conf.intr_conf.rxq) {\n+\t\t/* According to datasheet, only vector 0/1/2 can be used,\n+\t\t * now only one vector is used for Rx queue\n+\t\t */\n+\t\tintr_vector = 1;\n+\t\tif (rte_intr_efd_enable(intr_handle, intr_vector))\n+\t\t\treturn -1;\n+\t}\n+\n+\tif (rte_intr_dp_is_en(intr_handle) && !intr_handle->intr_vec) {\n+\t\tintr_handle->intr_vec =\n+\t\t\trte_zmalloc(\"intr_vec\",\n+\t\t\t\t    dev->data->nb_rx_queues * sizeof(int), 0);\n+\t\tif (intr_handle->intr_vec == NULL) {\n+\t\t\tPMD_INIT_LOG(ERR, \"Failed to allocate %d rx_queues\"\n+\t\t\t\t     \" intr_vec\", dev->data->nb_rx_queues);\n+\t\t\treturn -ENOMEM;\n+\t\t}\n+\t}\n+\ttxgbevf_configure_msix(dev);\n+\n+\t/* When a VF port is bound to VFIO-PCI, only miscellaneous interrupt\n+\t * is mapped to VFIO vector 0 in eth_txgbevf_dev_init( ).\n+\t * If previous VFIO interrupt mapping setting in eth_txgbevf_dev_init( )\n+\t * is not cleared, it will fail when following rte_intr_enable( ) tries\n+\t * to map Rx queue interrupt to other VFIO vectors.\n+\t * So clear uio/vfio intr/evevnfd first to avoid failure.\n+\t */\n+\trte_intr_disable(intr_handle);\n+\n+\trte_intr_enable(intr_handle);\n+\n+\t/* Re-enable interrupt for VF */\n+\ttxgbevf_intr_enable(dev);\n+\n+\t/*\n+\t * Update link status right before return, because it may\n+\t * start link configuration process in a separate thread.\n+\t */\n+\ttxgbevf_dev_link_update(dev, 0);\n+\n+\thw->adapter_stopped = false;\n+\n+\treturn 0;\n+}\n+\n+static int\n+txgbevf_dev_stop(struct rte_eth_dev *dev)\n+{\n+\tstruct txgbe_hw *hw = TXGBE_DEV_HW(dev);\n+\tstruct txgbe_adapter *adapter = TXGBE_DEV_ADAPTER(dev);\n+\tstruct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);\n+\tstruct rte_intr_handle *intr_handle = &pci_dev->intr_handle;\n+\n+\tif (hw->adapter_stopped)\n+\t\treturn 0;\n+\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\trte_eal_alarm_cancel(txgbe_dev_setup_link_alarm_handler, dev);\n+\n+\ttxgbevf_intr_disable(dev);\n+\n+\thw->adapter_stopped = 1;\n+\thw->mac.stop_hw(hw);\n+\n+\t/*\n+\t * Clear what we set, but we still keep shadow_vfta to\n+\t * restore after device starts\n+\t */\n+\ttxgbevf_set_vfta_all(dev, 0);\n+\n+\t/* Clear stored conf */\n+\tdev->data->scattered_rx = 0;\n+\n+\ttxgbe_dev_clear_queues(dev);\n+\n+\t/* Clean datapath event and queue/vec mapping */\n+\trte_intr_efd_disable(intr_handle);\n+\tif (intr_handle->intr_vec != NULL) {\n+\t\trte_free(intr_handle->intr_vec);\n+\t\tintr_handle->intr_vec = NULL;\n+\t}\n+\n+\tadapter->rss_reta_updated = 0;\n+\n+\treturn 0;\n+}\n+\n static int\n txgbevf_dev_close(struct rte_eth_dev *dev)\n {\n \tstruct txgbe_hw *hw = TXGBE_DEV_HW(dev);\n \tstruct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);\n \tstruct rte_intr_handle *intr_handle = &pci_dev->intr_handle;\n+\tint ret;\n+\n \tPMD_INIT_FUNC_TRACE();\n \tif (rte_eal_process_type() != RTE_PROC_PRIMARY)\n \t\treturn 0;\n \n \thw->mac.reset_hw(hw);\n \n+\tret = txgbevf_dev_stop(dev);\n+\n \ttxgbe_dev_free_queues(dev);\n \n \t/**\n@@ -640,7 +793,24 @@ txgbevf_dev_close(struct rte_eth_dev *dev)\n \trte_intr_callback_unregister(intr_handle,\n \t\t\t\t     txgbevf_dev_interrupt_handler, dev);\n \n-\treturn 0;\n+\treturn ret;\n+}\n+\n+/*\n+ * Reset VF device\n+ */\n+static int\n+txgbevf_dev_reset(struct rte_eth_dev *dev)\n+{\n+\tint ret;\n+\n+\tret = eth_txgbevf_dev_uninit(dev);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tret = eth_txgbevf_dev_init(dev);\n+\n+\treturn ret;\n }\n \n static void txgbevf_set_vfta_all(struct rte_eth_dev *dev, bool on)\n@@ -1173,12 +1343,16 @@ txgbevf_dev_interrupt_handler(void *param)\n  */\n static const struct eth_dev_ops txgbevf_eth_dev_ops = {\n \t.dev_configure        = txgbevf_dev_configure,\n+\t.dev_start            = txgbevf_dev_start,\n+\t.dev_stop             = txgbevf_dev_stop,\n \t.link_update          = txgbevf_dev_link_update,\n \t.stats_get            = txgbevf_dev_stats_get,\n \t.xstats_get           = txgbevf_dev_xstats_get,\n \t.stats_reset          = txgbevf_dev_stats_reset,\n \t.xstats_reset         = txgbevf_dev_stats_reset,\n \t.xstats_get_names     = txgbevf_dev_xstats_get_names,\n+\t.dev_close            = txgbevf_dev_close,\n+\t.dev_reset\t      = txgbevf_dev_reset,\n \t.promiscuous_enable   = txgbevf_dev_promiscuous_enable,\n \t.promiscuous_disable  = txgbevf_dev_promiscuous_disable,\n \t.allmulticast_enable  = txgbevf_dev_allmulticast_enable,\ndiff --git a/drivers/net/txgbe/txgbe_rxtx.c b/drivers/net/txgbe/txgbe_rxtx.c\nindex 4a6ab16ca..6d596d9e0 100644\n--- a/drivers/net/txgbe/txgbe_rxtx.c\n+++ b/drivers/net/txgbe/txgbe_rxtx.c\n@@ -4938,6 +4938,63 @@ txgbevf_dev_tx_init(struct rte_eth_dev *dev)\n \t}\n }\n \n+/*\n+ * [VF] Start Transmit and Receive Units.\n+ */\n+void __rte_cold\n+txgbevf_dev_rxtx_start(struct rte_eth_dev *dev)\n+{\n+\tstruct txgbe_hw     *hw;\n+\tstruct txgbe_tx_queue *txq;\n+\tstruct txgbe_rx_queue *rxq;\n+\tuint32_t txdctl;\n+\tuint32_t rxdctl;\n+\tuint16_t i;\n+\tint poll_ms;\n+\n+\tPMD_INIT_FUNC_TRACE();\n+\thw = TXGBE_DEV_HW(dev);\n+\n+\tfor (i = 0; i < dev->data->nb_tx_queues; i++) {\n+\t\ttxq = dev->data->tx_queues[i];\n+\t\t/* Setup Transmit Threshold Registers */\n+\t\twr32m(hw, TXGBE_TXCFG(txq->reg_idx),\n+\t\t      TXGBE_TXCFG_HTHRESH_MASK |\n+\t\t      TXGBE_TXCFG_WTHRESH_MASK,\n+\t\t      TXGBE_TXCFG_HTHRESH(txq->hthresh) |\n+\t\t      TXGBE_TXCFG_WTHRESH(txq->wthresh));\n+\t}\n+\n+\tfor (i = 0; i < dev->data->nb_tx_queues; i++) {\n+\t\twr32m(hw, TXGBE_TXCFG(i), TXGBE_TXCFG_ENA, TXGBE_TXCFG_ENA);\n+\n+\t\tpoll_ms = 10;\n+\t\t/* Wait until TX Enable ready */\n+\t\tdo {\n+\t\t\trte_delay_ms(1);\n+\t\t\ttxdctl = rd32(hw, TXGBE_TXCFG(i));\n+\t\t} while (--poll_ms && !(txdctl & TXGBE_TXCFG_ENA));\n+\t\tif (!poll_ms)\n+\t\t\tPMD_INIT_LOG(ERR, \"Could not enable Tx Queue %d\", i);\n+\t}\n+\tfor (i = 0; i < dev->data->nb_rx_queues; i++) {\n+\t\trxq = dev->data->rx_queues[i];\n+\n+\t\twr32m(hw, TXGBE_RXCFG(i), TXGBE_RXCFG_ENA, TXGBE_RXCFG_ENA);\n+\n+\t\t/* Wait until RX Enable ready */\n+\t\tpoll_ms = 10;\n+\t\tdo {\n+\t\t\trte_delay_ms(1);\n+\t\t\trxdctl = rd32(hw, TXGBE_RXCFG(i));\n+\t\t} while (--poll_ms && !(rxdctl & TXGBE_RXCFG_ENA));\n+\t\tif (!poll_ms)\n+\t\t\tPMD_INIT_LOG(ERR, \"Could not enable Rx Queue %d\", i);\n+\t\trte_wmb();\n+\t\twr32(hw, TXGBE_RXWP(i), rxq->nb_rx_desc - 1);\n+\t}\n+}\n+\n int\n txgbe_rss_conf_init(struct txgbe_rte_flow_rss_conf *out,\n \t\t    const struct rte_flow_action_rss *in)\n",
    "prefixes": [
        "v1",
        "15/20"
    ]
}