get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 57803,
    "url": "http://patches.dpdk.org/api/patches/57803/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20190822055400.30119-13-ajit.khaparde@broadcom.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": "<20190822055400.30119-13-ajit.khaparde@broadcom.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20190822055400.30119-13-ajit.khaparde@broadcom.com",
    "date": "2019-08-22T05:53:59",
    "name": "[12/13] net/bnxt: add support for FW reset",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "8068cd1c5f40b087ab6fb64259c7e0f87b71d8da",
    "submitter": {
        "id": 501,
        "url": "http://patches.dpdk.org/api/people/501/?format=api",
        "name": "Ajit Khaparde",
        "email": "ajit.khaparde@broadcom.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/20190822055400.30119-13-ajit.khaparde@broadcom.com/mbox/",
    "series": [
        {
            "id": 6099,
            "url": "http://patches.dpdk.org/api/series/6099/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=6099",
            "date": "2019-08-22T05:53:47",
            "name": "bnxt patchset to support device error recovery",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/6099/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/57803/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/57803/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 [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id C06D31BF74;\n\tThu, 22 Aug 2019 07:54:34 +0200 (CEST)",
            "from rnd-relay.smtp.broadcom.com (rnd-relay.smtp.broadcom.com\n\t[192.19.229.170]) by dpdk.org (Postfix) with ESMTP id C49851BF35\n\tfor <dev@dpdk.org>; Thu, 22 Aug 2019 07:54:09 +0200 (CEST)",
            "from nis-sj1-27.broadcom.com (nis-sj1-27.lvn.broadcom.net\n\t[10.75.144.136])\n\tby rnd-relay.smtp.broadcom.com (Postfix) with ESMTP id 0BD0030C211;\n\tWed, 21 Aug 2019 22:54:06 -0700 (PDT)",
            "from localhost.localdomain (unknown [10.230.30.225])\n\tby nis-sj1-27.broadcom.com (Postfix) with ESMTP id 9C865AC076C;\n\tWed, 21 Aug 2019 22:54:05 -0700 (PDT)"
        ],
        "DKIM-Filter": "OpenDKIM Filter v2.10.3 rnd-relay.smtp.broadcom.com 0BD0030C211",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com;\n\ts=dkimrelay; t=1566453246;\n\tbh=hWrEB7NhwgRgFAExsY2TsX1g6XziUxiFYR9hl82+hSI=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=fMYhjAMX4ICyoK8A5gNOWxjqIQRCcX8yjqXT/tZ3i8+7p/jZOEqXcV5ZjuxH2vaxy\n\tejXlaTTW/Yng42Zz4/NGNdIS0n3x4uGAnIAVr9UshdiEzzrjSaVQu/AQdJ50ciFPiR\n\tobnB/GCs/Ab4pnQ3iZZg6Z+Ah28PZTBIOgsiCxo0=",
        "From": "Ajit Khaparde <ajit.khaparde@broadcom.com>",
        "To": "dev@dpdk.org",
        "Cc": "ferruh.yigit@intel.com, Kalesh AP <kalesh-anakkur.purayil@broadcom.com>, \n\tSomnath Kotur <somnath.kotur@broadcom.com>",
        "Date": "Wed, 21 Aug 2019 22:53:59 -0700",
        "Message-Id": "<20190822055400.30119-13-ajit.khaparde@broadcom.com>",
        "X-Mailer": "git-send-email 2.20.1 (Apple Git-117)",
        "In-Reply-To": "<20190822055400.30119-1-ajit.khaparde@broadcom.com>",
        "References": "<20190822055400.30119-1-ajit.khaparde@broadcom.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH 12/13] net/bnxt: add support for FW reset",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<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\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>\n\nAdded code to perform FW_RESET. When the driver detects error in FW,\nit has to initiate the recovery by resetting the cores. FW advertise\nthe method to do a core reset, reset register offsets and values\nto perform reset in response of HWRM_ERROR_RECOVERY_QCFG command.\n\nThere are 2 ways to recover from the error.\n1. Master function issues core resets to recover from error.\n2. Master function detects chimp dead condition and notify the Kong\n   processor about the chimp dead case through FW_RESET HWRM command.\n   Kong Processor send an RESET_NOTIFY async event with\n   REASON_CODE_FW_EXCEPTION_FATAL to all the PF’s/VF’s that\n   chimp is dead and it is going to reset the chimp.\n\nSigned-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>\nReviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>\nReviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>\n---\n drivers/net/bnxt/bnxt.h        |   1 +\n drivers/net/bnxt/bnxt_ethdev.c | 103 ++++++++++++++++++++++++++++++++-\n drivers/net/bnxt/bnxt_hwrm.c   |  26 +++++++++\n drivers/net/bnxt/bnxt_hwrm.h   |   1 +\n 4 files changed, 130 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h\nindex edaef7897..9ea84ec2f 100644\n--- a/drivers/net/bnxt/bnxt.h\n+++ b/drivers/net/bnxt/bnxt.h\n@@ -389,6 +389,7 @@ struct bnxt_error_recovery_info {\n #define BNXT_FW_STATUS_REG_OFF(reg)\t((reg) & ~BNXT_FW_STATUS_REG_TYPE_MASK)\n \n #define BNXT_GRCP_WINDOW_2_BASE\t\t0x2000\n+#define BNXT_GRCP_WINDOW_3_BASE\t\t0x3000\n \n #define BNXT_HWRM_SHORT_REQ_LEN\t\tsizeof(struct hwrm_short_input)\n struct bnxt {\ndiff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c\nindex e7b0b44c4..095395dae 100644\n--- a/drivers/net/bnxt/bnxt_ethdev.c\n+++ b/drivers/net/bnxt/bnxt_ethdev.c\n@@ -3499,6 +3499,19 @@ static const struct eth_dev_ops bnxt_dev_ops = {\n \t.timesync_read_tx_timestamp = bnxt_timesync_read_tx_timestamp,\n };\n \n+static uint32_t bnxt_map_reset_regs(struct bnxt *bp, uint32_t reg)\n+{\n+\tuint32_t offset;\n+\n+\t/* Only pre-map the reset GRC registers using window 3 */\n+\trte_write32(reg & 0xfffff000, (uint8_t *)bp->bar0 +\n+\t\t    BNXT_GRCPF_REG_WINDOW_BASE_OUT + 8);\n+\n+\toffset = BNXT_GRCP_WINDOW_3_BASE + (reg & 0xffc);\n+\n+\treturn offset;\n+}\n+\n int bnxt_map_fw_health_status_regs(struct bnxt *bp)\n {\n \tstruct bnxt_error_recovery_info *info = bp->recovery_info;\n@@ -3542,6 +3555,34 @@ static void bnxt_unmap_fw_health_status_regs(struct bnxt *bp)\n \t\t    BNXT_GRCPF_REG_WINDOW_BASE_OUT + 4);\n }\n \n+static void bnxt_write_fw_reset_reg(struct bnxt *bp, uint32_t index)\n+{\n+\tstruct bnxt_error_recovery_info *info = bp->recovery_info;\n+\tuint32_t delay = info->delay_after_reset[index];\n+\tuint32_t val = info->reset_reg_val[index];\n+\tuint32_t reg = info->reset_reg[index];\n+\tuint32_t type, offset;\n+\n+\ttype = BNXT_FW_STATUS_REG_TYPE(reg);\n+\toffset = BNXT_FW_STATUS_REG_OFF(reg);\n+\n+\tswitch (type) {\n+\tcase BNXT_FW_STATUS_REG_TYPE_CFG:\n+\t\trte_pci_write_config(bp->pdev, &val, sizeof(val), offset);\n+\t\tbreak;\n+\tcase BNXT_FW_STATUS_REG_TYPE_GRC:\n+\t\toffset = bnxt_map_reset_regs(bp, offset);\n+\t\trte_write32(val, (uint8_t *)bp->bar0 + offset);\n+\t\tbreak;\n+\tcase BNXT_FW_STATUS_REG_TYPE_BAR0:\n+\t\trte_write32(val, (uint8_t *)bp->bar0 + offset);\n+\t\tbreak;\n+\t}\n+\t/* wait on a specific interval of time until core reset is complete */\n+\tif (delay)\n+\t\trte_delay_ms(delay);\n+}\n+\n static void bnxt_dev_cleanup(struct bnxt *bp)\n {\n \tbnxt_set_hwrm_link_config(bp, false);\n@@ -3636,6 +3677,58 @@ uint32_t bnxt_read_fw_status_reg(struct bnxt *bp, uint32_t index)\n \treturn val;\n }\n \n+static int bnxt_fw_reset_all(struct bnxt *bp)\n+{\n+\tstruct bnxt_error_recovery_info *info = bp->recovery_info;\n+\tuint32_t i;\n+\tint rc = 0;\n+\n+\tif (info->flags & BNXT_FLAG_ERROR_RECOVERY_HOST) {\n+\t\t/* Reset through master function driver */\n+\t\tfor (i = 0; i < info->reg_array_cnt; i++)\n+\t\t\tbnxt_write_fw_reset_reg(bp, i);\n+\t\t/* Wait for time specified by FW after triggering reset */\n+\t\trte_delay_ms(info->master_func_wait_period_after_reset);\n+\t} else if (info->flags & BNXT_FLAG_ERROR_RECOVERY_CO_CPU) {\n+\t\t/* Reset with the help of Kong processor */\n+\t\trc = bnxt_hwrm_fw_reset(bp);\n+\t\tif (rc)\n+\t\t\tPMD_DRV_LOG(ERR, \"Failed to reset FW\\n\");\n+\t}\n+\n+\treturn rc;\n+}\n+\n+static void bnxt_fw_reset_cb(void *arg)\n+{\n+\tstruct bnxt *bp = arg;\n+\tstruct bnxt_error_recovery_info *info = bp->recovery_info;\n+\tint rc = 0;\n+\n+\t/* Only Master function can do FW reset */\n+\tif (bnxt_is_master_func(bp) &&\n+\t    bnxt_is_recovery_enabled(bp)) {\n+\t\trc = bnxt_fw_reset_all(bp);\n+\t\tif (rc) {\n+\t\t\tPMD_DRV_LOG(ERR, \"Adapter recovery failed\\n\");\n+\t\t\treturn;\n+\t\t}\n+\t}\n+\n+\t/* if recovery method is ERROR_RECOVERY_CO_CPU, KONG will send\n+\t * EXCEPTION_FATAL_ASYNC event to all the functions\n+\t * (including MASTER FUNC). After receiving this Async, all the active\n+\t * drivers should treat this case as FW initiated recovery\n+\t */\n+\tif (info->flags & BNXT_FLAG_ERROR_RECOVERY_HOST) {\n+\t\tbp->fw_reset_min_msecs = BNXT_MIN_FW_READY_TIMEOUT;\n+\t\tbp->fw_reset_max_msecs = BNXT_MAX_FW_RESET_TIMEOUT;\n+\n+\t\t/* To recover from error */\n+\t\tbnxt_dev_reset_and_resume(bp);\n+\t}\n+}\n+\n /* Driver should poll FW heartbeat, reset_counter with the frequency\n  * advertised by FW in HWRM_ERROR_RECOVERY_QCFG.\n  * When the driver detects heartbeat stop or change in reset_counter,\n@@ -3648,7 +3741,7 @@ static void bnxt_check_fw_health(void *arg)\n {\n \tstruct bnxt *bp = arg;\n \tstruct bnxt_error_recovery_info *info = bp->recovery_info;\n-\tuint32_t val = 0;\n+\tuint32_t val = 0, wait_msec;\n \n \tif (!info || !bnxt_is_recovery_enabled(bp) ||\n \t    is_bnxt_in_error(bp))\n@@ -3676,6 +3769,14 @@ static void bnxt_check_fw_health(void *arg)\n \tbp->flags |= BNXT_FLAG_FW_RESET;\n \n \tPMD_DRV_LOG(ERR, \"Detected FW dead condition\\n\");\n+\n+\tif (bnxt_is_master_func(bp))\n+\t\twait_msec = info->master_func_wait_period;\n+\telse\n+\t\twait_msec = info->normal_func_wait_period;\n+\n+\trte_eal_alarm_set(US_PER_MS * wait_msec,\n+\t\t\t  bnxt_fw_reset_cb, (void *)bp);\n }\n \n void bnxt_schedule_fw_health_check(struct bnxt *bp)\ndiff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c\nindex 350e867bf..bd2cc01e1 100644\n--- a/drivers/net/bnxt/bnxt_hwrm.c\n+++ b/drivers/net/bnxt/bnxt_hwrm.c\n@@ -4782,3 +4782,29 @@ int bnxt_hwrm_error_recovery_qcfg(struct bnxt *bp)\n \t}\n \treturn rc;\n }\n+\n+int bnxt_hwrm_fw_reset(struct bnxt *bp)\n+{\n+\tstruct hwrm_fw_reset_output *resp = bp->hwrm_cmd_resp_addr;\n+\tstruct hwrm_fw_reset_input req = {0};\n+\tint rc;\n+\n+\tif (!BNXT_PF(bp))\n+\t\treturn -EOPNOTSUPP;\n+\n+\tHWRM_PREP(req, FW_RESET, BNXT_USE_KONG(bp));\n+\n+\treq.embedded_proc_type =\n+\t\tHWRM_FW_RESET_INPUT_EMBEDDED_PROC_TYPE_CHIP;\n+\treq.selfrst_status =\n+\t\tHWRM_FW_RESET_INPUT_SELFRST_STATUS_SELFRSTASAP;\n+\treq.flags = HWRM_FW_RESET_INPUT_FLAGS_RESET_GRACEFUL;\n+\n+\trc = bnxt_hwrm_send_message(bp, &req, sizeof(req),\n+\t\t\t\t    BNXT_USE_KONG(bp));\n+\n+\tHWRM_CHECK_RESULT();\n+\tHWRM_UNLOCK();\n+\n+\treturn rc;\n+}\ndiff --git a/drivers/net/bnxt/bnxt_hwrm.h b/drivers/net/bnxt/bnxt_hwrm.h\nindex 44e335507..db25ad591 100644\n--- a/drivers/net/bnxt/bnxt_hwrm.h\n+++ b/drivers/net/bnxt/bnxt_hwrm.h\n@@ -205,4 +205,5 @@ int bnxt_hwrm_tunnel_redirect_info(struct bnxt *bp, uint8_t tun_type,\n int bnxt_hwrm_set_mac(struct bnxt *bp);\n int bnxt_hwrm_if_change(struct bnxt *bp, bool state);\n int bnxt_hwrm_error_recovery_qcfg(struct bnxt *bp);\n+int bnxt_hwrm_fw_reset(struct bnxt *bp);\n #endif\n",
    "prefixes": [
        "12/13"
    ]
}