get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 21039,
    "url": "https://patches.dpdk.org/api/patches/21039/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1488414008-162839-16-git-send-email-allain.legacy@windriver.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": "<1488414008-162839-16-git-send-email-allain.legacy@windriver.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1488414008-162839-16-git-send-email-allain.legacy@windriver.com",
    "date": "2017-03-02T00:20:07",
    "name": "[dpdk-dev,v3,15/16] net/avp: device start and stop operations",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "318d857e851ced8099ea5f686018c5c5edfa73b1",
    "submitter": {
        "id": 679,
        "url": "https://patches.dpdk.org/api/people/679/?format=api",
        "name": "Allain Legacy",
        "email": "allain.legacy@windriver.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/1488414008-162839-16-git-send-email-allain.legacy@windriver.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/21039/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/21039/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 1646FF96E;\n\tThu,  2 Mar 2017 01:21:55 +0100 (CET)",
            "from mail.windriver.com (mail.windriver.com [147.11.1.11])\n\tby dpdk.org (Postfix) with ESMTP id 956652C2B\n\tfor <dev@dpdk.org>; Thu,  2 Mar 2017 01:20:48 +0100 (CET)",
            "from ALA-HCA.corp.ad.wrs.com (ala-hca.corp.ad.wrs.com\n\t[147.11.189.40])\n\tby mail.windriver.com (8.15.2/8.15.1) with ESMTPS id v220KgKD016387\n\t(version=TLSv1 cipher=AES128-SHA bits=128 verify=FAIL);\n\tWed, 1 Mar 2017 16:20:42 -0800 (PST)",
            "from yow-cgts4-lx.wrs.com (128.224.145.137) by\n\tALA-HCA.corp.ad.wrs.com (147.11.189.50) with Microsoft SMTP Server\n\t(TLS) id 14.3.294.0; Wed, 1 Mar 2017 16:20:41 -0800"
        ],
        "From": "Allain Legacy <allain.legacy@windriver.com>",
        "To": "<ferruh.yigit@intel.com>",
        "CC": "<ian.jolliffe@windriver.com>, <jerin.jacob@caviumnetworks.com>,\n\t<stephen@networkplumber.org>, <thomas.monjalon@6wind.com>, <dev@dpdk.org>",
        "Date": "Wed, 1 Mar 2017 19:20:07 -0500",
        "Message-ID": "<1488414008-162839-16-git-send-email-allain.legacy@windriver.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1488414008-162839-1-git-send-email-allain.legacy@windriver.com>",
        "References": "<1488136143-116389-1-git-send-email-allain.legacy@windriver.com>\n\t<1488414008-162839-1-git-send-email-allain.legacy@windriver.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[128.224.145.137]",
        "Subject": "[dpdk-dev] [PATCH v3 15/16] net/avp: device start and stop\n\toperations",
        "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": "Adds support for device start and stop functions.  This allows an\napplication to control the administrative state of an AVP device.  Stopping\nthe device will notify the host application to stop sending packets on that\ndevice's receive queues.\n\nSigned-off-by: Allain Legacy <allain.legacy@windriver.com>\nSigned-off-by: Matt Peters <matt.peters@windriver.com>\n---\n drivers/net/avp/avp_ethdev.c | 145 +++++++++++++++++++++++++++++++++++++++++++\n 1 file changed, 145 insertions(+)",
    "diff": "diff --git a/drivers/net/avp/avp_ethdev.c b/drivers/net/avp/avp_ethdev.c\nindex 2fe1251..660233a 100644\n--- a/drivers/net/avp/avp_ethdev.c\n+++ b/drivers/net/avp/avp_ethdev.c\n@@ -68,6 +68,9 @@ static int avp_dev_create(struct rte_pci_device *pci_dev,\n static int eth_avp_dev_uninit(struct rte_eth_dev *eth_dev);\n \n static int avp_dev_configure(struct rte_eth_dev *dev);\n+static int avp_dev_start(struct rte_eth_dev *dev);\n+static void avp_dev_stop(struct rte_eth_dev *dev);\n+static void avp_dev_close(struct rte_eth_dev *dev);\n static void avp_dev_info_get(struct rte_eth_dev *dev,\n \t\t\t     struct rte_eth_dev_info *dev_info);\n static void avp_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n@@ -157,6 +160,9 @@ static void avp_dev_stats_get(struct rte_eth_dev *dev,\n  */\n static const struct eth_dev_ops avp_eth_dev_ops = {\n \t.dev_configure       = avp_dev_configure,\n+\t.dev_start           = avp_dev_start,\n+\t.dev_stop            = avp_dev_stop,\n+\t.dev_close           = avp_dev_close,\n \t.dev_infos_get       = avp_dev_info_get,\n \t.vlan_offload_set    = avp_vlan_offload_set,\n \t.stats_get           = avp_dev_stats_get,\n@@ -326,6 +332,23 @@ struct avp_queue {\n }\n \n static int\n+avp_dev_ctrl_set_link_state(struct rte_eth_dev *eth_dev, unsigned int state)\n+{\n+\tstruct avp_dev *avp = AVP_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);\n+\tstruct rte_avp_request request;\n+\tint ret;\n+\n+\t/* setup a link state change request */\n+\tmemset(&request, 0, sizeof(request));\n+\trequest.req_id = RTE_AVP_REQ_CFG_NETWORK_IF;\n+\trequest.if_up = state;\n+\n+\tret = avp_dev_process_request(avp, &request);\n+\n+\treturn ret == 0 ? request.result : ret;\n+}\n+\n+static int\n avp_dev_ctrl_set_config(struct rte_eth_dev *eth_dev,\n \t\t\tstruct rte_avp_device_config *config)\n {\n@@ -759,6 +782,31 @@ struct avp_queue {\n }\n \n static int\n+avp_dev_disable_interrupts(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct rte_pci_device *pci_dev = AVP_DEV_TO_PCI(eth_dev);\n+\tvoid *registers = pci_dev->mem_resource[RTE_AVP_PCI_MMIO_BAR].addr;\n+\tint ret;\n+\n+\tif (registers == NULL)\n+\t\treturn 0;\n+\n+\t/* inform the device that all interrupts are disabled */\n+\tAVP_WRITE32(RTE_AVP_NO_INTERRUPTS_MASK,\n+\t\t    RTE_PTR_ADD(registers, RTE_AVP_INTERRUPT_MASK_OFFSET));\n+\n+\t/* enable UIO interrupt handling */\n+\tret = rte_intr_disable(&pci_dev->intr_handle);\n+\tif (ret < 0) {\n+\t\tPMD_DRV_LOG(ERR, \"Failed to enable UIO interrupts, ret=%d\\n\",\n+\t\t\t    ret);\n+\t\treturn ret;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n avp_dev_setup_interrupts(struct rte_eth_dev *eth_dev)\n {\n \tstruct rte_pci_device *pci_dev = AVP_DEV_TO_PCI(eth_dev);\n@@ -1990,6 +2038,103 @@ struct avp_queue {\n \treturn ret;\n }\n \n+static int\n+avp_dev_start(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct avp_dev *avp = AVP_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);\n+\tint ret;\n+\n+\trte_spinlock_lock(&avp->lock);\n+\tif (avp->flags & AVP_F_DETACHED) {\n+\t\tPMD_DRV_LOG(ERR, \"Operation not supported during VM live migration\\n\");\n+\t\tret = -ENOTSUP;\n+\t\tgoto unlock;\n+\t}\n+\n+\t/* disable features that we do not support */\n+\teth_dev->data->dev_conf.rxmode.hw_ip_checksum = 0;\n+\teth_dev->data->dev_conf.rxmode.hw_vlan_filter = 0;\n+\teth_dev->data->dev_conf.rxmode.hw_vlan_extend = 0;\n+\teth_dev->data->dev_conf.rxmode.hw_strip_crc = 0;\n+\n+\t/* update link state */\n+\tret = avp_dev_ctrl_set_link_state(eth_dev, 1);\n+\tif (ret < 0) {\n+\t\tPMD_DRV_LOG(ERR, \"Link state change failed by host, ret=%d\\n\",\n+\t\t\t    ret);\n+\t\tgoto unlock;\n+\t}\n+\n+\t/* remember current link state */\n+\tavp->flags |= AVP_F_LINKUP;\n+\n+\tret = 0;\n+\n+unlock:\n+\trte_spinlock_unlock(&avp->lock);\n+\treturn ret;\n+}\n+\n+static void\n+avp_dev_stop(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct avp_dev *avp = AVP_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);\n+\tint ret;\n+\n+\trte_spinlock_lock(&avp->lock);\n+\tif (avp->flags & AVP_F_DETACHED) {\n+\t\tPMD_DRV_LOG(ERR, \"Operation not supported during VM live migration\\n\");\n+\t\tgoto unlock;\n+\t}\n+\n+\t/* remember current link state */\n+\tavp->flags &= ~AVP_F_LINKUP;\n+\n+\t/* update link state */\n+\tret = avp_dev_ctrl_set_link_state(eth_dev, 0);\n+\tif (ret < 0) {\n+\t\tPMD_DRV_LOG(ERR, \"Link state change failed by host, ret=%d\\n\",\n+\t\t\t    ret);\n+\t\tgoto unlock;\n+\t}\n+\n+unlock:\n+\trte_spinlock_unlock(&avp->lock);\n+}\n+\n+static void\n+avp_dev_close(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct avp_dev *avp = AVP_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);\n+\tint ret;\n+\n+\trte_spinlock_lock(&avp->lock);\n+\tif (avp->flags & AVP_F_DETACHED) {\n+\t\tPMD_DRV_LOG(ERR, \"Operation not supported during VM live migration\\n\");\n+\t\tgoto unlock;\n+\t}\n+\n+\t/* remember current link state */\n+\tavp->flags &= ~AVP_F_LINKUP;\n+\tavp->flags &= ~AVP_F_CONFIGURED;\n+\n+\tret = avp_dev_disable_interrupts(eth_dev);\n+\tif (ret < 0) {\n+\t\tPMD_DRV_LOG(ERR, \"Failed to disable interrupts\\n\");\n+\t\t/* continue */\n+\t}\n+\n+\t/* update device state */\n+\tret = avp_dev_ctrl_shutdown(eth_dev);\n+\tif (ret < 0) {\n+\t\tPMD_DRV_LOG(ERR, \"Device shutdown failed by host, ret=%d\\n\",\n+\t\t\t    ret);\n+\t\tgoto unlock;\n+\t}\n+\n+unlock:\n+\trte_spinlock_unlock(&avp->lock);\n+}\n \n static int\n avp_dev_link_update(struct rte_eth_dev *eth_dev,\n",
    "prefixes": [
        "dpdk-dev",
        "v3",
        "15/16"
    ]
}