get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 45212,
    "url": "https://patches.dpdk.org/api/patches/45212/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1537797030-26548-10-git-send-email-arybchenko@solarflare.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": "<1537797030-26548-10-git-send-email-arybchenko@solarflare.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1537797030-26548-10-git-send-email-arybchenko@solarflare.com",
    "date": "2018-09-24T13:50:28",
    "name": "[09/11] net/sfc/base: add accessor to whole link status",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "9307602786ec34da12c4fbb49308519810771bf1",
    "submitter": {
        "id": 607,
        "url": "https://patches.dpdk.org/api/people/607/?format=api",
        "name": "Andrew Rybchenko",
        "email": "arybchenko@solarflare.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/1537797030-26548-10-git-send-email-arybchenko@solarflare.com/mbox/",
    "series": [
        {
            "id": 1467,
            "url": "https://patches.dpdk.org/api/series/1467/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=1467",
            "date": "2018-09-24T13:50:22",
            "name": "net/sfc: update base driver to support 50G and 100G",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/1467/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/45212/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/45212/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 D54625942;\n\tMon, 24 Sep 2018 15:51:13 +0200 (CEST)",
            "from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com\n\t[148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 3D30C1AFF\n\tfor <dev@dpdk.org>; Mon, 24 Sep 2018 15:50:52 +0200 (CEST)",
            "from webmail.solarflare.com (webmail.solarflare.com\n\t[12.187.104.26])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby mx1-us3.ppe-hosted.com (Proofpoint Essentials ESMTP Server) with\n\tESMTPS id\n\tF409DB400B5 for <dev@dpdk.org>; Mon, 24 Sep 2018 13:50:50 +0000 (UTC)",
            "from ocex03.SolarFlarecom.com (10.20.40.36) by\n\tocex03.SolarFlarecom.com (10.20.40.36) with Microsoft SMTP Server\n\t(TLS) id 15.0.1395.4; Mon, 24 Sep 2018 06:50:47 -0700",
            "from opal.uk.solarflarecom.com (10.17.10.1) by\n\tocex03.SolarFlarecom.com (10.20.40.36) with Microsoft SMTP Server\n\t(TLS) id\n\t15.0.1395.4 via Frontend Transport; Mon, 24 Sep 2018 06:50:47 -0700",
            "from ukv-loginhost.uk.solarflarecom.com\n\t(ukv-loginhost.uk.solarflarecom.com [10.17.10.39])\n\tby opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id\n\tw8ODokED014574; Mon, 24 Sep 2018 14:50:46 +0100",
            "from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1])\n\tby ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id\n\tE7BA11626D2; Mon, 24 Sep 2018 14:50:45 +0100 (BST)"
        ],
        "X-Virus-Scanned": "Proofpoint Essentials engine",
        "From": "Andrew Rybchenko <arybchenko@solarflare.com>",
        "To": "<dev@dpdk.org>",
        "CC": "Richard Houldsworth <rhouldsworth@solarflare.com>",
        "Date": "Mon, 24 Sep 2018 14:50:28 +0100",
        "Message-ID": "<1537797030-26548-10-git-send-email-arybchenko@solarflare.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1537797030-26548-1-git-send-email-arybchenko@solarflare.com>",
        "References": "<1537797030-26548-1-git-send-email-arybchenko@solarflare.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-TM-AS-Product-Ver": "SMEX-12.5.0.1300-8.5.1010-24114.005",
        "X-TM-AS-Result": "No-3.113900-4.000000-10",
        "X-TMASE-MatchedRID": "YXgS1C6OPWw1vivz3L6ga8qXjImgj58bGY9Y+ATae1wCSZrAnTS0Bv0h\n\t0riQa/Ett4mrRKhpAWz2/GgebwVtjL39gqF20+WYF6z9HGHKwNtKPIx+MJF9o99RlPzeVuQQi8Y\n\t/1qurmGplCQKHMuDlRH494485lvgv0f9apaWMaFJIcJTn2HkqsWf6wD367VgteE5rgL9o43llln\n\tdVQSPeh/8R0Snge2Se53E4Use+3Eo5XMoR34RFyqDH6drx3JPVWDdWpJMntKhUuWGgN8re8qPFj\n\tJEFr+olwXCBO/GKkVqOhzOa6g8Kraui+bCHzgDWJ23U4Mg9ul27doO2daa5VLJyXwwl1ffM6byW\n\tRDmQISkqHvNloTkwOtBarn5QtcQeXWTSpZJyIpeQ5k+lyzuQVYXXmHr+iJs1sqxYnjga4QY83Fq\n\t7f38GK0XAdmaT51YyaGdQKtwO1Wc=",
        "X-TM-AS-User-Approved-Sender": "No",
        "X-TM-AS-User-Blocked-Sender": "No",
        "X-TMASE-Result": "10--3.113900-4.000000",
        "X-TMASE-Version": "SMEX-12.5.0.1300-8.5.1010-24114.005",
        "X-MDID": "1537797051-mLTo1B0nbmoR",
        "Subject": "[dpdk-dev] [PATCH 09/11] net/sfc/base: add accessor to whole link\n\tstatus",
        "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: Richard Houldsworth <rhouldsworth@solarflare.com>\n\nAdd a function which makes an MCDI GET_LINK request and\npackages up the results. Currently, the get-link function\nis triggered from several entry points which then pass\non or store selected parts of the data. When the driver\nneeds to obtain the current link state, it is more\nefficient to do this in a single call.\n\nSigned-off-by: Richard Houldsworth <rhouldsworth@solarflare.com>\nSigned-off-by: Andrew Rybchenko <arybchenko@solarflare.com>\n---\n drivers/net/sfc/base/ef10_impl.h | 10 +++-------\n drivers/net/sfc/base/ef10_mac.c  |  6 +++---\n drivers/net/sfc/base/ef10_nic.c  |  4 ++--\n drivers/net/sfc/base/ef10_phy.c  | 24 ++++++++++++++++--------\n drivers/net/sfc/base/efx.h       | 15 +++++++++++++++\n drivers/net/sfc/base/efx_impl.h  |  2 +-\n drivers/net/sfc/base/efx_phy.c   | 30 ++++++++++++++++++++++++++----\n 7 files changed, 66 insertions(+), 25 deletions(-)",
    "diff": "diff --git a/drivers/net/sfc/base/ef10_impl.h b/drivers/net/sfc/base/ef10_impl.h\nindex e43e26e68..f971063a1 100644\n--- a/drivers/net/sfc/base/ef10_impl.h\n+++ b/drivers/net/sfc/base/ef10_impl.h\n@@ -593,11 +593,7 @@ ef10_nvram_buffer_finish(\n /* PHY */\n \n typedef struct ef10_link_state_s {\n-\tuint32_t\t\tels_adv_cap_mask;\n-\tuint32_t\t\tels_lp_cap_mask;\n-\tunsigned int\t\tels_fcntl;\n-\tefx_phy_fec_type_t\tels_fec;\n-\tefx_link_mode_t\t\tels_link_mode;\n+\tefx_phy_link_state_t\tepls;\n #if EFSYS_OPT_LOOPBACK\n \tefx_loopback_type_t\tels_loopback;\n #endif\n@@ -634,9 +630,9 @@ ef10_phy_oui_get(\n \t__out\t\tuint32_t *ouip);\n \n extern\t__checkReturn\tefx_rc_t\n-ef10_phy_fec_type_get(\n+ef10_phy_link_state_get(\n \t__in\t\tefx_nic_t *enp,\n-\t__out\t\tefx_phy_fec_type_t *fecp);\n+\t__out\t\tefx_phy_link_state_t *eplsp);\n \n #if EFSYS_OPT_PHY_STATS\n \ndiff --git a/drivers/net/sfc/base/ef10_mac.c b/drivers/net/sfc/base/ef10_mac.c\nindex ab73828f1..9f10f6f79 100644\n--- a/drivers/net/sfc/base/ef10_mac.c\n+++ b/drivers/net/sfc/base/ef10_mac.c\n@@ -22,10 +22,10 @@ ef10_mac_poll(\n \tif ((rc = ef10_phy_get_link(enp, &els)) != 0)\n \t\tgoto fail1;\n \n-\tepp->ep_adv_cap_mask = els.els_adv_cap_mask;\n-\tepp->ep_fcntl = els.els_fcntl;\n+\tepp->ep_adv_cap_mask = els.epls.epls_adv_cap_mask;\n+\tepp->ep_fcntl = els.epls.epls_fcntl;\n \n-\t*link_modep = els.els_link_mode;\n+\t*link_modep = els.epls.epls_link_mode;\n \n \treturn (0);\n \ndiff --git a/drivers/net/sfc/base/ef10_nic.c b/drivers/net/sfc/base/ef10_nic.c\nindex 1b3d60682..50e23b7d4 100644\n--- a/drivers/net/sfc/base/ef10_nic.c\n+++ b/drivers/net/sfc/base/ef10_nic.c\n@@ -1852,8 +1852,8 @@ ef10_nic_board_cfg(\n \t/* Obtain the default PHY advertised capabilities */\n \tif ((rc = ef10_phy_get_link(enp, &els)) != 0)\n \t\tgoto fail7;\n-\tepp->ep_default_adv_cap_mask = els.els_adv_cap_mask;\n-\tepp->ep_adv_cap_mask = els.els_adv_cap_mask;\n+\tepp->ep_default_adv_cap_mask = els.epls.epls_adv_cap_mask;\n+\tepp->ep_adv_cap_mask = els.epls.epls_adv_cap_mask;\n \n \t/* Check capabilities of running datapath firmware */\n \tif ((rc = ef10_get_datapath_caps(enp)) != 0)\ndiff --git a/drivers/net/sfc/base/ef10_phy.c b/drivers/net/sfc/base/ef10_phy.c\nindex ec3600e96..84ccdde5d 100644\n--- a/drivers/net/sfc/base/ef10_phy.c\n+++ b/drivers/net/sfc/base/ef10_phy.c\n@@ -286,9 +286,9 @@ ef10_phy_get_link(\n \t}\n \n \tmcdi_phy_decode_cap(MCDI_OUT_DWORD(req, GET_LINK_OUT_CAP),\n-\t\t\t    &elsp->els_adv_cap_mask);\n+\t\t\t    &elsp->epls.epls_adv_cap_mask);\n \tmcdi_phy_decode_cap(MCDI_OUT_DWORD(req, GET_LINK_OUT_LP_CAP),\n-\t\t\t    &elsp->els_lp_cap_mask);\n+\t\t\t    &elsp->epls.epls_lp_cap_mask);\n \n \tif (req.emr_out_length_used < MC_CMD_GET_LINK_OUT_V2_LEN)\n \t\tfec = MC_CMD_FEC_NONE;\n@@ -298,8 +298,16 @@ ef10_phy_get_link(\n \tmcdi_phy_decode_link_mode(enp, MCDI_OUT_DWORD(req, GET_LINK_OUT_FLAGS),\n \t\t\t    MCDI_OUT_DWORD(req, GET_LINK_OUT_LINK_SPEED),\n \t\t\t    MCDI_OUT_DWORD(req, GET_LINK_OUT_FCNTL),\n-\t\t\t    fec, &elsp->els_link_mode,\n-\t\t\t    &elsp->els_fcntl, &elsp->els_fec);\n+\t\t\t    fec, &elsp->epls.epls_link_mode,\n+\t\t\t    &elsp->epls.epls_fcntl, &elsp->epls.epls_fec);\n+\n+\tif (req.emr_out_length_used < MC_CMD_GET_LINK_OUT_V2_LEN) {\n+\t\telsp->epls.epls_ld_cap_mask = 0;\n+\t} else {\n+\t\tmcdi_phy_decode_cap(MCDI_OUT_DWORD(req, GET_LINK_OUT_V2_LD_CAP),\n+\t\t\t\t    &elsp->epls.epls_ld_cap_mask);\n+\t}\n+\n \n #if EFSYS_OPT_LOOPBACK\n \t/*\n@@ -543,18 +551,18 @@ ef10_phy_oui_get(\n }\n \n \t__checkReturn\tefx_rc_t\n-ef10_phy_fec_type_get(\n+ef10_phy_link_state_get(\n \t__in\t\tefx_nic_t *enp,\n-\t__out\t\tefx_phy_fec_type_t  *fecp)\n+\t__out\t\tefx_phy_link_state_t  *eplsp)\n {\n \tefx_rc_t rc;\n \tef10_link_state_t els;\n \n-\t/* Obtain the active FEC type */\n+\t/* Obtain the active link state */\n \tif ((rc = ef10_phy_get_link(enp, &els)) != 0)\n \t\tgoto fail1;\n \n-\t*fecp = els.els_fec;\n+\t*eplsp = els.epls;\n \n \treturn (0);\n \ndiff --git a/drivers/net/sfc/base/efx.h b/drivers/net/sfc/base/efx.h\nindex 246708f9c..8e10e8934 100644\n--- a/drivers/net/sfc/base/efx.h\n+++ b/drivers/net/sfc/base/efx.h\n@@ -3257,6 +3257,21 @@ efx_phy_fec_type_get(\n \t__in\t\tefx_nic_t *enp,\n \t__out\t\tefx_phy_fec_type_t *typep);\n \n+typedef struct efx_phy_link_state_s {\n+\tuint32_t\t\tepls_adv_cap_mask;\n+\tuint32_t\t\tepls_lp_cap_mask;\n+\tuint32_t\t\tepls_ld_cap_mask;\n+\tunsigned int\t\tepls_fcntl;\n+\tefx_phy_fec_type_t\tepls_fec;\n+\tefx_link_mode_t\t\tepls_link_mode;\n+} efx_phy_link_state_t;\n+\n+extern\t__checkReturn\tefx_rc_t\n+efx_phy_link_state_get(\n+\t__in\t\tefx_nic_t *enp,\n+\t__out\t\tefx_phy_link_state_t  *eplsp);\n+\n+\n #ifdef\t__cplusplus\n }\n #endif\ndiff --git a/drivers/net/sfc/base/efx_impl.h b/drivers/net/sfc/base/efx_impl.h\nindex 9f44d2f64..bad23f819 100644\n--- a/drivers/net/sfc/base/efx_impl.h\n+++ b/drivers/net/sfc/base/efx_impl.h\n@@ -224,7 +224,7 @@ typedef struct efx_phy_ops_s {\n \tefx_rc_t\t(*epo_reconfigure)(efx_nic_t *);\n \tefx_rc_t\t(*epo_verify)(efx_nic_t *);\n \tefx_rc_t\t(*epo_oui_get)(efx_nic_t *, uint32_t *);\n-\tefx_rc_t\t(*epo_fec_type_get)(efx_nic_t *, efx_phy_fec_type_t *);\n+\tefx_rc_t\t(*epo_link_state_get)(efx_nic_t *, efx_phy_link_state_t *);\n #if EFSYS_OPT_PHY_STATS\n \tefx_rc_t\t(*epo_stats_update)(efx_nic_t *, efsys_mem_t *,\n \t\t\t\t\t    uint32_t *);\ndiff --git a/drivers/net/sfc/base/efx_phy.c b/drivers/net/sfc/base/efx_phy.c\nindex 63b89e6a4..36a7bbd3d 100644\n--- a/drivers/net/sfc/base/efx_phy.c\n+++ b/drivers/net/sfc/base/efx_phy.c\n@@ -15,7 +15,7 @@ static const efx_phy_ops_t\t__efx_phy_siena_ops = {\n \tsiena_phy_reconfigure,\t\t/* epo_reconfigure */\n \tsiena_phy_verify,\t\t/* epo_verify */\n \tsiena_phy_oui_get,\t\t/* epo_oui_get */\n-\tNULL,\t\t\t\t/* epo_fec_type_get */\n+\tNULL,\t\t\t\t/* epo_link_state_get */\n #if EFSYS_OPT_PHY_STATS\n \tsiena_phy_stats_update,\t\t/* epo_stats_update */\n #endif\t/* EFSYS_OPT_PHY_STATS */\n@@ -35,7 +35,7 @@ static const efx_phy_ops_t\t__efx_phy_ef10_ops = {\n \tef10_phy_reconfigure,\t\t/* epo_reconfigure */\n \tef10_phy_verify,\t\t/* epo_verify */\n \tef10_phy_oui_get,\t\t/* epo_oui_get */\n-\tef10_phy_fec_type_get,\t\t/* epo_fec_type_get */\n+\tef10_phy_link_state_get,\t/* epo_link_state_get */\n #if EFSYS_OPT_PHY_STATS\n \tef10_phy_stats_update,\t\t/* epo_stats_update */\n #endif\t/* EFSYS_OPT_PHY_STATS */\n@@ -321,19 +321,41 @@ efx_phy_module_get_info(\n efx_phy_fec_type_get(\n \t__in\t\tefx_nic_t *enp,\n \t__out\t\tefx_phy_fec_type_t *typep)\n+{\n+\tefx_rc_t rc;\n+\tefx_phy_link_state_t epls;\n+\n+\tif ((rc = efx_phy_link_state_get(enp, &epls)) != 0)\n+\t\tgoto fail1;\n+\n+\t*typep = epls.epls_fec;\n+\n+\treturn (0);\n+\n+fail1:\n+\tEFSYS_PROBE1(fail1, efx_rc_t, rc);\n+\n+\treturn (rc);\n+}\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_phy_link_state_get(\n+\t__in\t\tefx_nic_t *enp,\n+\t__out\t\tefx_phy_link_state_t *eplsp)\n {\n \tefx_port_t *epp = &(enp->en_port);\n \tconst efx_phy_ops_t *epop = epp->ep_epop;\n \tefx_rc_t rc;\n \n \tEFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);\n+\tEFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);\n \n-\tif (epop->epo_fec_type_get == NULL) {\n+\tif (epop->epo_link_state_get == NULL) {\n \t\trc = ENOTSUP;\n \t\tgoto fail1;\n \t}\n \n-\tif ((rc = epop->epo_fec_type_get(enp, typep)) != 0)\n+\tif ((rc = epop->epo_link_state_get(enp, eplsp)) != 0)\n \t\tgoto fail2;\n \n \treturn (0);\n",
    "prefixes": [
        "09/11"
    ]
}