get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 16930,
    "url": "https://patches.dpdk.org/api/patches/16930/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1478250651-37307-1-git-send-email-qiming.yang@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": "<1478250651-37307-1-git-send-email-qiming.yang@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1478250651-37307-1-git-send-email-qiming.yang@intel.com",
    "date": "2016-11-04T09:10:50",
    "name": "[dpdk-dev,v4,1/2] net/i40e: fix link status change interrupt",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "d39161aaac04dc3fbb5926b436b224c384c29fa7",
    "submitter": {
        "id": 522,
        "url": "https://patches.dpdk.org/api/people/522/?format=api",
        "name": "Qiming Yang",
        "email": "qiming.yang@intel.com"
    },
    "delegate": {
        "id": 10,
        "url": "https://patches.dpdk.org/api/users/10/?format=api",
        "username": "bruce",
        "first_name": "Bruce",
        "last_name": "Richardson",
        "email": "bruce.richardson@intel.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1478250651-37307-1-git-send-email-qiming.yang@intel.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/16930/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/16930/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 3C24E2B8C;\n\tFri,  4 Nov 2016 10:13:50 +0100 (CET)",
            "from mga07.intel.com (mga07.intel.com [134.134.136.100])\n\tby dpdk.org (Postfix) with ESMTP id 801D8293C\n\tfor <dev@dpdk.org>; Fri,  4 Nov 2016 10:13:47 +0100 (CET)",
            "from orsmga004.jf.intel.com ([10.7.209.38])\n\tby orsmga105.jf.intel.com with ESMTP; 04 Nov 2016 02:13:46 -0700",
            "from dpdk1.bj.intel.com ([172.16.182.84])\n\tby orsmga004.jf.intel.com with ESMTP; 04 Nov 2016 02:13:44 -0700"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.31,442,1473145200\"; d=\"scan'208\";a=\"27711662\"",
        "From": "Qiming Yang <qiming.yang@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "jingjing.wu@intel.com, bruce.richardson@intel.com,\n\tQiming Yang <qiming.yang@intel.com>",
        "Date": "Fri,  4 Nov 2016 17:10:50 +0800",
        "Message-Id": "<1478250651-37307-1-git-send-email-qiming.yang@intel.com>",
        "X-Mailer": "git-send-email 2.5.5",
        "In-Reply-To": "<1477628339-5816-2-git-send-email-qiming.yang@intel.com>",
        "References": "<1477628339-5816-2-git-send-email-qiming.yang@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v4 1/2] net/i40e: fix link status change interrupt",
        "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": "Previously, link status interrupt in i40e is achieved by checking\nLINK_STAT_CHANGE_MASK in PFINT_ICR0 register which is provided only\nfor diagnostic use. Instead, drivers need to get the link status\nchange notification by using LSE (Link Status Event).\n\nThis patch enables LSE and calls LSC callback when the event is\nreceived. This patch also removes the processing on\nLINK_STAT_CHANGE_MASK.\n\nFixes: 4861cde46116 (\"i40e: new poll mode driver\")\n\nSigned-off-by: Qiming Yang <qiming.yang@intel.com>\nAcked-by: Jingjing Wu <jingjing.wu@intel.com>\n---\n v3 changes:\n * resolved the conflict with other changes, rework based\n  on version: 16.11-rc2\n\n drivers/net/i40e/i40e_ethdev.c | 96 +++++++++---------------------------------\n 1 file changed, 19 insertions(+), 77 deletions(-)",
    "diff": "diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c\nindex bb81b15..078c581 100644\n--- a/drivers/net/i40e/i40e_ethdev.c\n+++ b/drivers/net/i40e/i40e_ethdev.c\n@@ -108,7 +108,6 @@\n \t\tI40E_PFINT_ICR0_ENA_GRST_MASK | \\\n \t\tI40E_PFINT_ICR0_ENA_PCI_EXCEPTION_MASK | \\\n \t\tI40E_PFINT_ICR0_ENA_STORM_DETECT_MASK | \\\n-\t\tI40E_PFINT_ICR0_ENA_LINK_STAT_CHANGE_MASK | \\\n \t\tI40E_PFINT_ICR0_ENA_HMC_ERR_MASK | \\\n \t\tI40E_PFINT_ICR0_ENA_PE_CRITERR_MASK | \\\n \t\tI40E_PFINT_ICR0_ENA_VFLR_MASK | \\\n@@ -1777,6 +1776,16 @@ i40e_dev_start(struct rte_eth_dev *dev)\n \t\tif (dev->data->dev_conf.intr_conf.lsc != 0)\n \t\t\tPMD_INIT_LOG(INFO, \"lsc won't enable because of\"\n \t\t\t\t     \" no intr multiplex\\n\");\n+\t} else if (dev->data->dev_conf.intr_conf.lsc != 0) {\n+\t\tret = i40e_aq_set_phy_int_mask(hw,\n+\t\t\t\t\t       ~(I40E_AQ_EVENT_LINK_UPDOWN |\n+\t\t\t\t\t       I40E_AQ_EVENT_MODULE_QUAL_FAIL |\n+\t\t\t\t\t       I40E_AQ_EVENT_MEDIA_NA), NULL);\n+\t\tif (ret != I40E_SUCCESS)\n+\t\t\tPMD_DRV_LOG(WARNING, \"Fail to set phy mask\");\n+\n+\t\t/* Call get_link_info aq commond to enable LSE */\n+\t\ti40e_dev_link_update(dev, 0);\n \t}\n \n \t/* enable uio intr after callback register */\n@@ -1995,6 +2004,7 @@ i40e_dev_link_update(struct rte_eth_dev *dev,\n \tstruct rte_eth_link link, old;\n \tint status;\n \tunsigned rep_cnt = MAX_REPEAT_TIME;\n+\tbool enable_lse = dev->data->dev_conf.intr_conf.lsc ? true : false;\n \n \tmemset(&link, 0, sizeof(link));\n \tmemset(&old, 0, sizeof(old));\n@@ -2003,7 +2013,8 @@ i40e_dev_link_update(struct rte_eth_dev *dev,\n \n \tdo {\n \t\t/* Get link status information from hardware */\n-\t\tstatus = i40e_aq_get_link_info(hw, false, &link_status, NULL);\n+\t\tstatus = i40e_aq_get_link_info(hw, enable_lse,\n+\t\t\t\t\t\t&link_status, NULL);\n \t\tif (status != I40E_SUCCESS) {\n \t\t\tlink.link_speed = ETH_SPEED_NUM_100M;\n \t\t\tlink.link_duplex = ETH_LINK_FULL_DUPLEX;\n@@ -5465,6 +5476,12 @@ i40e_dev_handle_aq_msg(struct rte_eth_dev *dev)\n \t\t\t\t\tinfo.msg_buf,\n \t\t\t\t\tinfo.msg_len);\n \t\t\tbreak;\n+\t\tcase i40e_aqc_opc_get_link_status:\n+\t\t\tret = i40e_dev_link_update(dev, 0);\n+\t\t\tif (!ret)\n+\t\t\t\t_rte_eth_dev_callback_process(dev,\n+\t\t\t\t\tRTE_ETH_EVENT_INTR_LSC, NULL);\n+\t\t\tbreak;\n \t\tdefault:\n \t\t\tPMD_DRV_LOG(ERR, \"Request %u is not supported yet\",\n \t\t\t\t    opcode);\n@@ -5474,57 +5491,6 @@ i40e_dev_handle_aq_msg(struct rte_eth_dev *dev)\n \trte_free(info.msg_buf);\n }\n \n-/*\n- * Interrupt handler is registered as the alarm callback for handling LSC\n- * interrupt in a definite of time, in order to wait the NIC into a stable\n- * state. Currently it waits 1 sec in i40e for the link up interrupt, and\n- * no need for link down interrupt.\n- */\n-static void\n-i40e_dev_interrupt_delayed_handler(void *param)\n-{\n-\tstruct rte_eth_dev *dev = (struct rte_eth_dev *)param;\n-\tstruct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n-\tuint32_t icr0;\n-\n-\t/* read interrupt causes again */\n-\ticr0 = I40E_READ_REG(hw, I40E_PFINT_ICR0);\n-\n-#ifdef RTE_LIBRTE_I40E_DEBUG_DRIVER\n-\tif (icr0 & I40E_PFINT_ICR0_ECC_ERR_MASK)\n-\t\tPMD_DRV_LOG(ERR, \"ICR0: unrecoverable ECC error\\n\");\n-\tif (icr0 & I40E_PFINT_ICR0_MAL_DETECT_MASK)\n-\t\tPMD_DRV_LOG(ERR, \"ICR0: malicious programming detected\\n\");\n-\tif (icr0 & I40E_PFINT_ICR0_GRST_MASK)\n-\t\tPMD_DRV_LOG(INFO, \"ICR0: global reset requested\\n\");\n-\tif (icr0 & I40E_PFINT_ICR0_PCI_EXCEPTION_MASK)\n-\t\tPMD_DRV_LOG(INFO, \"ICR0: PCI exception\\n activated\\n\");\n-\tif (icr0 & I40E_PFINT_ICR0_STORM_DETECT_MASK)\n-\t\tPMD_DRV_LOG(INFO, \"ICR0: a change in the storm control \"\n-\t\t\t\t\t\t\t\t\"state\\n\");\n-\tif (icr0 & I40E_PFINT_ICR0_HMC_ERR_MASK)\n-\t\tPMD_DRV_LOG(ERR, \"ICR0: HMC error\\n\");\n-\tif (icr0 & I40E_PFINT_ICR0_PE_CRITERR_MASK)\n-\t\tPMD_DRV_LOG(ERR, \"ICR0: protocol engine critical error\\n\");\n-#endif /* RTE_LIBRTE_I40E_DEBUG_DRIVER */\n-\n-\tif (icr0 & I40E_PFINT_ICR0_VFLR_MASK) {\n-\t\tPMD_DRV_LOG(INFO, \"INT:VF reset detected\\n\");\n-\t\ti40e_dev_handle_vfr_event(dev);\n-\t}\n-\tif (icr0 & I40E_PFINT_ICR0_ADMINQ_MASK) {\n-\t\tPMD_DRV_LOG(INFO, \"INT:ADMINQ event\\n\");\n-\t\ti40e_dev_handle_aq_msg(dev);\n-\t}\n-\n-\t/* handle the link up interrupt in an alarm callback */\n-\ti40e_dev_link_update(dev, 0);\n-\t_rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, NULL);\n-\n-\ti40e_pf_enable_irq0(hw);\n-\trte_intr_enable(&(dev->pci_dev->intr_handle));\n-}\n-\n /**\n  * Interrupt handler triggered by NIC  for handling\n  * specific interrupt.\n@@ -5582,30 +5548,6 @@ i40e_dev_interrupt_handler(__rte_unused struct rte_intr_handle *handle,\n \t\ti40e_dev_handle_aq_msg(dev);\n \t}\n \n-\t/* Link Status Change interrupt */\n-\tif (icr0 & I40E_PFINT_ICR0_LINK_STAT_CHANGE_MASK) {\n-#define I40E_US_PER_SECOND 1000000\n-\t\tstruct rte_eth_link link;\n-\n-\t\tPMD_DRV_LOG(INFO, \"ICR0: link status changed\\n\");\n-\t\tmemset(&link, 0, sizeof(link));\n-\t\trte_i40e_dev_atomic_read_link_status(dev, &link);\n-\t\ti40e_dev_link_update(dev, 0);\n-\n-\t\t/*\n-\t\t * For link up interrupt, it needs to wait 1 second to let the\n-\t\t * hardware be a stable state. Otherwise several consecutive\n-\t\t * interrupts can be observed.\n-\t\t * For link down interrupt, no need to wait.\n-\t\t */\n-\t\tif (!link.link_status && rte_eal_alarm_set(I40E_US_PER_SECOND,\n-\t\t\ti40e_dev_interrupt_delayed_handler, (void *)dev) >= 0)\n-\t\t\treturn;\n-\t\telse\n-\t\t\t_rte_eth_dev_callback_process(dev,\n-\t\t\t\tRTE_ETH_EVENT_INTR_LSC, NULL);\n-\t}\n-\n done:\n \t/* Enable interrupt */\n \ti40e_pf_enable_irq0(hw);\n",
    "prefixes": [
        "dpdk-dev",
        "v4",
        "1/2"
    ]
}