get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 17125,
    "url": "https://patches.dpdk.org/api/patches/17125/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1479740470-6723-30-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": "<1479740470-6723-30-git-send-email-arybchenko@solarflare.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1479740470-6723-30-git-send-email-arybchenko@solarflare.com",
    "date": "2016-11-21T15:00:43",
    "name": "[dpdk-dev,29/56] net/sfc: import libefx licensing support",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "281a764cb635953354cde50151c6b464e14e3dbb",
    "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/1479740470-6723-30-git-send-email-arybchenko@solarflare.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/17125/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/17125/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 35EFAD508;\n\tMon, 21 Nov 2016 16:03:07 +0100 (CET)",
            "from nbfkord-smmo02.seg.att.com (nbfkord-smmo02.seg.att.com\n\t[209.65.160.78]) by dpdk.org (Postfix) with ESMTP id B2C71377A\n\tfor <dev@dpdk.org>; Mon, 21 Nov 2016 16:01:34 +0100 (CET)",
            "from unknown [12.187.104.26]\n\tby nbfkord-smmo02.seg.att.com(mxl_mta-7.2.4-7) with SMTP id\n\te4c03385.0.1541294.00-2341.3424212.nbfkord-smmo02.seg.att.com\n\t(envelope-from <arybchenko@solarflare.com>); \n\tMon, 21 Nov 2016 15:01:34 +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.1044.25; Mon, 21 Nov 2016 07:01:21 -0800",
            "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.1044.25 via Frontend Transport; Mon, 21 Nov 2016 07:01:21 -0800",
            "from uklogin.uk.solarflarecom.com (uklogin.uk.solarflarecom.com\n\t[10.17.10.10])\n\tby opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id\n\tuALF1K60007185 for <dev@dpdk.org>; Mon, 21 Nov 2016 15:01:20 GMT",
            "from uklogin.uk.solarflarecom.com (localhost.localdomain\n\t[127.0.0.1])\n\tby uklogin.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id\n\tuALF1J3K006765 for <dev@dpdk.org>; Mon, 21 Nov 2016 15:01:20 GMT"
        ],
        "X-MXL-Hash": "58330c4e0693f196-0207e096aa4b3b9f1c7aabd0c44cc02eceb3080c",
        "From": "Andrew Rybchenko <arybchenko@solarflare.com>",
        "To": "<dev@dpdk.org>",
        "Date": "Mon, 21 Nov 2016 15:00:43 +0000",
        "Message-ID": "<1479740470-6723-30-git-send-email-arybchenko@solarflare.com>",
        "X-Mailer": "git-send-email 1.8.2.3",
        "In-Reply-To": "<1479740470-6723-1-git-send-email-arybchenko@solarflare.com>",
        "References": "<1479740470-6723-1-git-send-email-arybchenko@solarflare.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-AnalysisOut": [
            "[v=2.1 cv=UI/baXry c=1 sm=1 tr=0 a=8BlWFWvVlq5taO8ncb8nKg==]",
            "[:17 a=L24OOQBejmoA:10 a=zRKbQ67AAAAA:8 a=xWDzutlWyugFjJyr2]",
            "[QcA:9 a=0rLAHZHktezxoswq:21 a=VSAcBP4S36MyRQt6:21 a=PA03WX]",
            "[8tBzeizutn5_OT:22]"
        ],
        "X-Spam": "[F=0.4789615099; CM=0.500; S=0.478(2015072901)]",
        "X-MAIL-FROM": "<arybchenko@solarflare.com>",
        "X-SOURCE-IP": "[12.187.104.26]",
        "Subject": "[dpdk-dev] [PATCH 29/56] net/sfc: import libefx licensing support",
        "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": "Provide API to deal with licences on SFN7xxx and SFN8xxx\nfamily adapaters.\n\nEFSYS_OPT_LICENSING should be enabled to use it.\n\nFrom Solarflare Communications Inc.\n\nSigned-off-by: Andrew Rybchenko <arybchenko@solarflare.com>\n---\n drivers/net/sfc/efx/base/efx.h       |  145 +++\n drivers/net/sfc/efx/base/efx_check.h |   10 +\n drivers/net/sfc/efx/base/efx_impl.h  |   37 +\n drivers/net/sfc/efx/base/efx_lic.c   | 1751 ++++++++++++++++++++++++++++++++++\n 4 files changed, 1943 insertions(+)\n create mode 100644 drivers/net/sfc/efx/base/efx_lic.c",
    "diff": "diff --git a/drivers/net/sfc/efx/base/efx.h b/drivers/net/sfc/efx/base/efx.h\nindex 8f22eab..f324ee2 100644\n--- a/drivers/net/sfc/efx/base/efx.h\n+++ b/drivers/net/sfc/efx/base/efx.h\n@@ -2349,6 +2349,151 @@ efx_hash_bytes(\n \t__in\t\t\tsize_t length,\n \t__in\t\t\tuint32_t init);\n \n+#if EFSYS_OPT_LICENSING\n+\n+/* LICENSING */\n+\n+typedef struct efx_key_stats_s {\n+\tuint32_t\teks_valid;\n+\tuint32_t\teks_invalid;\n+\tuint32_t\teks_blacklisted;\n+\tuint32_t\teks_unverifiable;\n+\tuint32_t\teks_wrong_node;\n+\tuint32_t\teks_licensed_apps_lo;\n+\tuint32_t\teks_licensed_apps_hi;\n+\tuint32_t\teks_licensed_features_lo;\n+\tuint32_t\teks_licensed_features_hi;\n+} efx_key_stats_t;\n+\n+extern\t__checkReturn\t\tefx_rc_t\n+efx_lic_init(\n+\t__in\t\t\tefx_nic_t *enp);\n+\n+extern\t\t\t\tvoid\n+efx_lic_fini(\n+\t__in\t\t\tefx_nic_t *enp);\n+\n+extern\t__checkReturn\tboolean_t\n+efx_lic_check_support(\n+\t__in\t\t\tefx_nic_t *enp);\n+\n+extern\t__checkReturn\tefx_rc_t\n+efx_lic_update_licenses(\n+\t__in\t\tefx_nic_t *enp);\n+\n+extern\t__checkReturn\tefx_rc_t\n+efx_lic_get_key_stats(\n+\t__in\t\tefx_nic_t *enp,\n+\t__out\t\tefx_key_stats_t *ksp);\n+\n+extern\t__checkReturn\tefx_rc_t\n+efx_lic_app_state(\n+\t__in\t\tefx_nic_t *enp,\n+\t__in\t\tuint64_t app_id,\n+\t__out\t\tboolean_t *licensedp);\n+\n+extern\t__checkReturn\tefx_rc_t\n+efx_lic_get_id(\n+\t__in\t\tefx_nic_t *enp,\n+\t__in\t\tsize_t buffer_size,\n+\t__out\t\tuint32_t *typep,\n+\t__out\t\tsize_t *lengthp,\n+\t__out_opt\tuint8_t *bufferp);\n+\n+\n+extern\t__checkReturn\t\tefx_rc_t\n+efx_lic_find_start(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__out\t\t\tuint32_t *startp\n+\t);\n+\n+extern\t__checkReturn\t\tefx_rc_t\n+efx_lic_find_end(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__out\t\t\tuint32_t *endp\n+\t);\n+\n+extern\t__checkReturn\t__success(return != B_FALSE)\tboolean_t\n+efx_lic_find_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__out\t\t\tuint32_t *startp,\n+\t__out\t\t\tuint32_t *lengthp\n+\t);\n+\n+extern\t__checkReturn\t__success(return != B_FALSE)\tboolean_t\n+efx_lic_validate_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(length)\tcaddr_t keyp,\n+\t__in\t\t\tuint32_t length\n+\t);\n+\n+extern\t__checkReturn\t\tefx_rc_t\n+efx_lic_read_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__in\t\t\tuint32_t length,\n+\t__out_bcount_part(key_max_size, *lengthp)\n+\t\t\t\tcaddr_t keyp,\n+\t__in\t\t\tsize_t key_max_size,\n+\t__out\t\t\tuint32_t *lengthp\n+\t);\n+\n+extern\t__checkReturn\t\tefx_rc_t\n+efx_lic_write_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__in_bcount(length)\tcaddr_t keyp,\n+\t__in\t\t\tuint32_t length,\n+\t__out\t\t\tuint32_t *lengthp\n+\t);\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_delete_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__in\t\t\tuint32_t length,\n+\t__in\t\t\tuint32_t end,\n+\t__out\t\t\tuint32_t *deltap\n+\t);\n+\n+extern\t__checkReturn\t\tefx_rc_t\n+efx_lic_create_partition(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size\n+\t);\n+\n+extern\t__checkReturn\t\tefx_rc_t\n+efx_lic_finish_partition(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size\n+\t);\n+\n+#endif\t/* EFSYS_OPT_LICENSING */\n+\n \n \n #ifdef\t__cplusplus\ndiff --git a/drivers/net/sfc/efx/base/efx_check.h b/drivers/net/sfc/efx/base/efx_check.h\nindex 5ab4df9..c8548c0 100644\n--- a/drivers/net/sfc/efx/base/efx_check.h\n+++ b/drivers/net/sfc/efx/base/efx_check.h\n@@ -319,6 +319,16 @@\n # endif\n #endif /* EFSYS_OPT_BIST */\n \n+#if EFSYS_OPT_LICENSING\n+/* Support MCDI licensing API */\n+# if !EFSYS_OPT_MCDI\n+#  error \"LICENSING requires MCDI\"\n+# endif\n+# if !EFSYS_HAS_UINT64\n+#  error \"LICENSING requires UINT64\"\n+# endif\n+#endif /* EFSYS_OPT_LICENSING */\n+\n #if EFSYS_OPT_ALLOW_UNCONFIGURED_NIC\n /* Support adapters with missing static config (for factory use only) */\n # if !EFSYS_OPT_MEDFORD\ndiff --git a/drivers/net/sfc/efx/base/efx_impl.h b/drivers/net/sfc/efx/base/efx_impl.h\nindex 980f964..3a520a8 100644\n--- a/drivers/net/sfc/efx/base/efx_impl.h\n+++ b/drivers/net/sfc/efx/base/efx_impl.h\n@@ -569,6 +569,39 @@ efx_mcdi_nvram_test(\n \n #endif /* EFSYS_OPT_VPD || EFSYS_OPT_NVRAM */\n \n+#if EFSYS_OPT_LICENSING\n+\n+typedef struct efx_lic_ops_s {\n+\tefx_rc_t\t(*elo_update_licenses)(efx_nic_t *);\n+\tefx_rc_t\t(*elo_get_key_stats)(efx_nic_t *, efx_key_stats_t *);\n+\tefx_rc_t\t(*elo_app_state)(efx_nic_t *, uint64_t, boolean_t *);\n+\tefx_rc_t\t(*elo_get_id)(efx_nic_t *, size_t, uint32_t *,\n+\t\t\t\t      size_t *, uint8_t *);\n+\tefx_rc_t\t(*elo_find_start)\n+\t\t\t\t(efx_nic_t *, caddr_t, size_t, uint32_t *);\n+\tefx_rc_t\t(*elo_find_end)(efx_nic_t *, caddr_t, size_t,\n+\t\t\t\tuint32_t, uint32_t *);\n+\tboolean_t\t(*elo_find_key)(efx_nic_t *, caddr_t, size_t,\n+\t\t\t\tuint32_t, uint32_t *, uint32_t *);\n+\tboolean_t\t(*elo_validate_key)(efx_nic_t *,\n+\t\t\t\tcaddr_t, uint32_t);\n+\tefx_rc_t\t(*elo_read_key)(efx_nic_t *,\n+\t\t\t\tcaddr_t, size_t, uint32_t, uint32_t,\n+\t\t\t\tcaddr_t, size_t, uint32_t *);\n+\tefx_rc_t\t(*elo_write_key)(efx_nic_t *,\n+\t\t\t\tcaddr_t, size_t, uint32_t,\n+\t\t\t\tcaddr_t, uint32_t, uint32_t *);\n+\tefx_rc_t\t(*elo_delete_key)(efx_nic_t *,\n+\t\t\t\tcaddr_t, size_t, uint32_t,\n+\t\t\t\tuint32_t, uint32_t, uint32_t *);\n+\tefx_rc_t\t(*elo_create_partition)(efx_nic_t *,\n+\t\t\t\tcaddr_t, size_t);\n+\tefx_rc_t\t(*elo_finish_partition)(efx_nic_t *,\n+\t\t\t\tcaddr_t, size_t);\n+} efx_lic_ops_t;\n+\n+#endif\n+\n typedef struct efx_drv_cfg_s {\n \tuint32_t\t\tedc_min_vi_count;\n \tuint32_t\t\tedc_max_vi_count;\n@@ -618,6 +651,10 @@ struct efx_nic_s {\n \tuint32_t\t\ten_rss_context;\n #endif\t/* EFSYS_OPT_RX_SCALE */\n \tuint32_t\t\ten_vport_id;\n+#if EFSYS_OPT_LICENSING\n+\tconst efx_lic_ops_t\t*en_elop;\n+\tboolean_t\t\ten_licensing_supported;\n+#endif\n \tunion {\n #if EFSYS_OPT_SIENA\n \t\tstruct {\ndiff --git a/drivers/net/sfc/efx/base/efx_lic.c b/drivers/net/sfc/efx/base/efx_lic.c\nnew file mode 100644\nindex 0000000..2cd05cc\n--- /dev/null\n+++ b/drivers/net/sfc/efx/base/efx_lic.c\n@@ -0,0 +1,1751 @@\n+/*\n+ * Copyright (c) 2009-2016 Solarflare Communications Inc.\n+ * All rights reserved.\n+ *\n+ * Redistribution and use in source and binary forms, with or without\n+ * modification, are permitted provided that the following conditions are met:\n+ *\n+ * 1. Redistributions of source code must retain the above copyright notice,\n+ *    this list of conditions and the following disclaimer.\n+ * 2. Redistributions in binary form must reproduce the above copyright notice,\n+ *    this list of conditions and the following disclaimer in the documentation\n+ *    and/or other materials provided with the distribution.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ *\n+ * The views and conclusions contained in the software and documentation are\n+ * those of the authors and should not be interpreted as representing official\n+ * policies, either expressed or implied, of the FreeBSD Project.\n+ */\n+\n+#include \"efx.h\"\n+#include \"efx_impl.h\"\n+\n+#if EFSYS_OPT_LICENSING\n+\n+#include \"ef10_tlv_layout.h\"\n+\n+#if EFSYS_OPT_SIENA | EFSYS_OPT_HUNTINGTON\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v1v2_find_start(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__out\t\t\tuint32_t *startp\n+\t);\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v1v2_find_end(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__out\t\t\tuint32_t *endp\n+\t);\n+\n+\t__checkReturn\t__success(return != B_FALSE)\tboolean_t\n+efx_lic_v1v2_find_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__out\t\t\tuint32_t *startp,\n+\t__out\t\t\tuint32_t *lengthp\n+\t);\n+\n+\t__checkReturn\t__success(return != B_FALSE)\tboolean_t\n+efx_lic_v1v2_validate_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(length)\tcaddr_t keyp,\n+\t__in\t\t\tuint32_t length\n+\t);\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v1v2_read_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__in\t\t\tuint32_t length,\n+\t__out_bcount_part(key_max_size, *lengthp)\n+\t\t\t\tcaddr_t keyp,\n+\t__in\t\t\tsize_t key_max_size,\n+\t__out\t\t\tuint32_t *lengthp\n+\t);\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v1v2_write_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__in_bcount(length)\tcaddr_t keyp,\n+\t__in\t\t\tuint32_t length,\n+\t__out\t\t\tuint32_t *lengthp\n+\t);\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v1v2_delete_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__in\t\t\tuint32_t length,\n+\t__in\t\t\tuint32_t end,\n+\t__out\t\t\tuint32_t *deltap\n+\t);\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v1v2_create_partition(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size\n+\t);\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v1v2_finish_partition(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size\n+\t);\n+\n+#endif\t/* EFSYS_OPT_HUNTINGTON | EFSYS_OPT_SIENA */\n+\n+\n+#if EFSYS_OPT_SIENA\n+\n+static\t__checkReturn\tefx_rc_t\n+efx_mcdi_fc_license_update_license(\n+\t__in\t\tefx_nic_t *enp);\n+\n+static\t__checkReturn\tefx_rc_t\n+efx_mcdi_fc_license_get_key_stats(\n+\t__in\t\tefx_nic_t *enp,\n+\t__out\t\tefx_key_stats_t *eksp);\n+\n+static const efx_lic_ops_t\t__efx_lic_v1_ops = {\n+\tefx_mcdi_fc_license_update_license,\t/* elo_update_licenses */\n+\tefx_mcdi_fc_license_get_key_stats,\t/* elo_get_key_stats */\n+\tNULL,\t\t\t\t\t/* elo_app_state */\n+\tNULL,\t\t\t\t\t/* elo_get_id */\n+\tefx_lic_v1v2_find_start,\t\t/* elo_find_start */\n+\tefx_lic_v1v2_find_end,\t\t\t/* elo_find_end */\n+\tefx_lic_v1v2_find_key,\t\t\t/* elo_find_key */\n+\tefx_lic_v1v2_validate_key,\t\t/* elo_validate_key */\n+\tefx_lic_v1v2_read_key,\t\t\t/* elo_read_key */\n+\tefx_lic_v1v2_write_key,\t\t\t/* elo_write_key */\n+\tefx_lic_v1v2_delete_key,\t\t/* elo_delete_key */\n+\tefx_lic_v1v2_create_partition,\t\t/* elo_create_partition */\n+\tefx_lic_v1v2_finish_partition,\t\t/* elo_finish_partition */\n+};\n+\n+#endif\t/* EFSYS_OPT_SIENA */\n+\n+#if EFSYS_OPT_HUNTINGTON\n+\n+static\t__checkReturn\tefx_rc_t\n+efx_mcdi_licensing_update_licenses(\n+\t__in\t\tefx_nic_t *enp);\n+\n+static\t__checkReturn\tefx_rc_t\n+efx_mcdi_licensing_get_key_stats(\n+\t__in\t\tefx_nic_t *enp,\n+\t__out\t\tefx_key_stats_t *eksp);\n+\n+static\t__checkReturn\tefx_rc_t\n+efx_mcdi_licensed_app_state(\n+\t__in\t\tefx_nic_t *enp,\n+\t__in\t\tuint64_t app_id,\n+\t__out\t\tboolean_t *licensedp);\n+\n+static const efx_lic_ops_t\t__efx_lic_v2_ops = {\n+\tefx_mcdi_licensing_update_licenses,\t/* elo_update_licenses */\n+\tefx_mcdi_licensing_get_key_stats,\t/* elo_get_key_stats */\n+\tefx_mcdi_licensed_app_state,\t\t/* elo_app_state */\n+\tNULL,\t\t\t\t\t/* elo_get_id */\n+\tefx_lic_v1v2_find_start,\t\t/* elo_find_start */\n+\tefx_lic_v1v2_find_end,\t\t\t/* elo_find_end */\n+\tefx_lic_v1v2_find_key,\t\t\t/* elo_find_key */\n+\tefx_lic_v1v2_validate_key,\t\t/* elo_validate_key */\n+\tefx_lic_v1v2_read_key,\t\t\t/* elo_read_key */\n+\tefx_lic_v1v2_write_key,\t\t\t/* elo_write_key */\n+\tefx_lic_v1v2_delete_key,\t\t/* elo_delete_key */\n+\tefx_lic_v1v2_create_partition,\t\t/* elo_create_partition */\n+\tefx_lic_v1v2_finish_partition,\t\t/* elo_finish_partition */\n+};\n+\n+#endif\t/* EFSYS_OPT_HUNTINGTON */\n+\n+#if EFSYS_OPT_MEDFORD\n+\n+static\t__checkReturn\tefx_rc_t\n+efx_mcdi_licensing_v3_update_licenses(\n+\t__in\t\tefx_nic_t *enp);\n+\n+static\t__checkReturn\tefx_rc_t\n+efx_mcdi_licensing_v3_report_license(\n+\t__in\t\tefx_nic_t *enp,\n+\t__out\t\tefx_key_stats_t *eksp);\n+\n+static\t__checkReturn\tefx_rc_t\n+efx_mcdi_licensing_v3_app_state(\n+\t__in\t\tefx_nic_t *enp,\n+\t__in\t\tuint64_t app_id,\n+\t__out\t\tboolean_t *licensedp);\n+\n+static\t__checkReturn\tefx_rc_t\n+efx_mcdi_licensing_v3_get_id(\n+\t__in\t\tefx_nic_t *enp,\n+\t__in\t\tsize_t buffer_size,\n+\t__out\t\tuint32_t *typep,\n+\t__out\t\tsize_t *lengthp,\n+\t__out_bcount_part_opt(buffer_size, *lengthp)\n+\t\t\tuint8_t *bufferp);\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v3_find_start(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__out\t\t\tuint32_t *startp\n+\t);\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v3_find_end(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__out\t\t\tuint32_t *endp\n+\t);\n+\n+\t__checkReturn\t__success(return != B_FALSE)\tboolean_t\n+efx_lic_v3_find_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__out\t\t\tuint32_t *startp,\n+\t__out\t\t\tuint32_t *lengthp\n+\t);\n+\n+\t__checkReturn\t__success(return != B_FALSE)\tboolean_t\n+efx_lic_v3_validate_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(length)\tcaddr_t keyp,\n+\t__in\t\t\tuint32_t length\n+\t);\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v3_read_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__in\t\t\tuint32_t length,\n+\t__out_bcount_part(key_max_size, *lengthp)\n+\t\t\t\tcaddr_t keyp,\n+\t__in\t\t\tsize_t key_max_size,\n+\t__out\t\t\tuint32_t *lengthp\n+\t);\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v3_write_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__in_bcount(length)\tcaddr_t keyp,\n+\t__in\t\t\tuint32_t length,\n+\t__out\t\t\tuint32_t *lengthp\n+\t);\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v3_delete_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__in\t\t\tuint32_t length,\n+\t__in\t\t\tuint32_t end,\n+\t__out\t\t\tuint32_t *deltap\n+\t);\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v3_create_partition(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size\n+\t);\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v3_finish_partition(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size\n+\t);\n+\n+static const efx_lic_ops_t\t__efx_lic_v3_ops = {\n+\tefx_mcdi_licensing_v3_update_licenses,\t/* elo_update_licenses */\n+\tefx_mcdi_licensing_v3_report_license,\t/* elo_get_key_stats */\n+\tefx_mcdi_licensing_v3_app_state,\t/* elo_app_state */\n+\tefx_mcdi_licensing_v3_get_id,\t\t/* elo_get_id */\n+\tefx_lic_v3_find_start,\t\t\t/* elo_find_start*/\n+\tefx_lic_v3_find_end,\t\t\t/* elo_find_end */\n+\tefx_lic_v3_find_key,\t\t\t/* elo_find_key */\n+\tefx_lic_v3_validate_key,\t\t/* elo_validate_key */\n+\tefx_lic_v3_read_key,\t\t\t/* elo_read_key */\n+\tefx_lic_v3_write_key,\t\t\t/* elo_write_key */\n+\tefx_lic_v3_delete_key,\t\t\t/* elo_delete_key */\n+\tefx_lic_v3_create_partition,\t\t/* elo_create_partition */\n+\tefx_lic_v3_finish_partition,\t\t/* elo_finish_partition */\n+};\n+\n+#endif\t/* EFSYS_OPT_MEDFORD */\n+\n+\n+/* V1 Licensing - used in Siena Modena only */\n+\n+#if EFSYS_OPT_SIENA\n+\n+static\t__checkReturn\tefx_rc_t\n+efx_mcdi_fc_license_update_license(\n+\t__in\t\tefx_nic_t *enp)\n+{\n+\tefx_mcdi_req_t req;\n+\tuint8_t payload[MC_CMD_FC_IN_LICENSE_LEN];\n+\tefx_rc_t rc;\n+\n+\tEFSYS_ASSERT(enp->en_family == EFX_FAMILY_SIENA);\n+\n+\t(void) memset(payload, 0, sizeof (payload));\n+\treq.emr_cmd = MC_CMD_FC;\n+\treq.emr_in_buf = payload;\n+\treq.emr_in_length = MC_CMD_FC_IN_LICENSE_LEN;\n+\treq.emr_out_buf = payload;\n+\treq.emr_out_length = 0;\n+\n+\tMCDI_IN_SET_DWORD(req, FC_IN_CMD,\n+\t    MC_CMD_FC_OP_LICENSE);\n+\n+\tMCDI_IN_SET_DWORD(req, FC_IN_LICENSE_OP,\n+\t    MC_CMD_FC_IN_LICENSE_UPDATE_LICENSE);\n+\n+\tefx_mcdi_execute(enp, &req);\n+\n+\tif (req.emr_rc != 0) {\n+\t\trc = req.emr_rc;\n+\t\tgoto fail1;\n+\t}\n+\n+\tif (req.emr_out_length_used != 0) {\n+\t\trc = EIO;\n+\t\tgoto fail2;\n+\t}\n+\n+\treturn (0);\n+\n+fail2:\n+\tEFSYS_PROBE(fail2);\n+fail1:\n+\tEFSYS_PROBE1(fail1, efx_rc_t, rc);\n+\n+\treturn (rc);\n+}\n+\n+static\t__checkReturn\tefx_rc_t\n+efx_mcdi_fc_license_get_key_stats(\n+\t__in\t\tefx_nic_t *enp,\n+\t__out\t\tefx_key_stats_t *eksp)\n+{\n+\tefx_mcdi_req_t req;\n+\tuint8_t payload[MAX(MC_CMD_FC_IN_LICENSE_LEN,\n+\t\t\t    MC_CMD_FC_OUT_LICENSE_LEN)];\n+\tefx_rc_t rc;\n+\n+\tEFSYS_ASSERT(enp->en_family == EFX_FAMILY_SIENA);\n+\n+\t(void) memset(payload, 0, sizeof (payload));\n+\treq.emr_cmd = MC_CMD_FC;\n+\treq.emr_in_buf = payload;\n+\treq.emr_in_length = MC_CMD_FC_IN_LICENSE_LEN;\n+\treq.emr_out_buf = payload;\n+\treq.emr_out_length = MC_CMD_FC_OUT_LICENSE_LEN;\n+\n+\tMCDI_IN_SET_DWORD(req, FC_IN_CMD,\n+\t    MC_CMD_FC_OP_LICENSE);\n+\n+\tMCDI_IN_SET_DWORD(req, FC_IN_LICENSE_OP,\n+\t    MC_CMD_FC_IN_LICENSE_GET_KEY_STATS);\n+\n+\tefx_mcdi_execute_quiet(enp, &req);\n+\n+\tif (req.emr_rc != 0) {\n+\t\trc = req.emr_rc;\n+\t\tgoto fail1;\n+\t}\n+\n+\tif (req.emr_out_length_used < MC_CMD_FC_OUT_LICENSE_LEN) {\n+\t\trc = EMSGSIZE;\n+\t\tgoto fail2;\n+\t}\n+\n+\teksp->eks_valid =\n+\t\tMCDI_OUT_DWORD(req, FC_OUT_LICENSE_VALID_KEYS);\n+\teksp->eks_invalid =\n+\t\tMCDI_OUT_DWORD(req, FC_OUT_LICENSE_INVALID_KEYS);\n+\teksp->eks_blacklisted =\n+\t\tMCDI_OUT_DWORD(req, FC_OUT_LICENSE_BLACKLISTED_KEYS);\n+\teksp->eks_unverifiable = 0;\n+\teksp->eks_wrong_node = 0;\n+\teksp->eks_licensed_apps_lo = 0;\n+\teksp->eks_licensed_apps_hi = 0;\n+\teksp->eks_licensed_features_lo = 0;\n+\teksp->eks_licensed_features_hi = 0;\n+\n+\treturn (0);\n+\n+fail2:\n+\tEFSYS_PROBE(fail2);\n+fail1:\n+\tEFSYS_PROBE1(fail1, efx_rc_t, rc);\n+\n+\treturn (rc);\n+}\n+\n+#endif\t/* EFSYS_OPT_SIENA */\n+\n+/* V1 and V2 Partition format - based on a 16-bit TLV format */\n+\n+#if EFSYS_OPT_SIENA | EFSYS_OPT_HUNTINGTON\n+\n+/*\n+ * V1/V2 format - defined in SF-108542-TC section 4.2:\n+ *  Type (T):   16bit - revision/HMAC algorithm\n+ *  Length (L): 16bit - value length in bytes\n+ *  Value (V):  L bytes - payload\n+ */\n+#define EFX_LICENSE_V1V2_PAYLOAD_LENGTH_MAX    (256)\n+#define EFX_LICENSE_V1V2_HEADER_LENGTH         (2 * sizeof(uint16_t))\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v1v2_find_start(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__out\t\t\tuint32_t *startp\n+\t)\n+{\n+\t_NOTE(ARGUNUSED(enp, bufferp, buffer_size))\n+\n+\t*startp = 0;\n+\treturn (0);\n+}\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v1v2_find_end(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__out\t\t\tuint32_t *endp\n+\t)\n+{\n+\t_NOTE(ARGUNUSED(enp, bufferp, buffer_size))\n+\n+\t*endp = offset + EFX_LICENSE_V1V2_HEADER_LENGTH;\n+\treturn (0);\n+}\n+\n+\t__checkReturn\t__success(return != B_FALSE)\tboolean_t\n+efx_lic_v1v2_find_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__out\t\t\tuint32_t *startp,\n+\t__out\t\t\tuint32_t *lengthp\n+\t)\n+{\n+\tboolean_t found;\n+\tuint16_t tlv_type;\n+\tuint16_t tlv_length;\n+\n+\t_NOTE(ARGUNUSED(enp))\n+\n+\tif ((size_t)buffer_size - offset < EFX_LICENSE_V1V2_HEADER_LENGTH)\n+\t\tgoto fail1;\n+\n+\ttlv_type = __LE_TO_CPU_16(((uint16_t *)&bufferp[offset])[0]);\n+\ttlv_length = __LE_TO_CPU_16(((uint16_t *)&bufferp[offset])[1]);\n+\tif ((tlv_length > EFX_LICENSE_V1V2_PAYLOAD_LENGTH_MAX) ||\n+\t    (tlv_type == 0 && tlv_length == 0)) {\n+\t\tfound = B_FALSE;\n+\t} else {\n+\t\t*startp = offset;\n+\t\t*lengthp = tlv_length + EFX_LICENSE_V1V2_HEADER_LENGTH;\n+\t\tfound = B_TRUE;\n+\t}\n+\treturn (found);\n+\n+fail1:\n+\tEFSYS_PROBE(fail1);\n+\n+\treturn (B_FALSE);\n+}\n+\n+\t__checkReturn\t__success(return != B_FALSE)\tboolean_t\n+efx_lic_v1v2_validate_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(length)\tcaddr_t keyp,\n+\t__in\t\t\tuint32_t length\n+\t)\n+{\n+\tuint16_t tlv_type;\n+\tuint16_t tlv_length;\n+\n+\t_NOTE(ARGUNUSED(enp))\n+\n+\tif (length < EFX_LICENSE_V1V2_HEADER_LENGTH) {\n+\t\tgoto fail1;\n+\t}\n+\n+\ttlv_type = __LE_TO_CPU_16(((uint16_t *)keyp)[0]);\n+\ttlv_length = __LE_TO_CPU_16(((uint16_t *)keyp)[1]);\n+\n+\tif (tlv_length > EFX_LICENSE_V1V2_PAYLOAD_LENGTH_MAX) {\n+\t\tgoto fail2;\n+\t}\n+\tif (tlv_type == 0) {\n+\t\tgoto fail3;\n+\t}\n+\tif ((tlv_length + EFX_LICENSE_V1V2_HEADER_LENGTH) != length) {\n+\t\tgoto fail4;\n+\t}\n+\n+\treturn (B_TRUE);\n+\n+fail4:\n+\tEFSYS_PROBE(fail4);\n+fail3:\n+\tEFSYS_PROBE(fail3);\n+fail2:\n+\tEFSYS_PROBE(fail2);\n+fail1:\n+\tEFSYS_PROBE(fail1);\n+\n+\treturn (B_FALSE);\n+}\n+\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v1v2_read_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__in\t\t\tuint32_t length,\n+\t__out_bcount_part(key_max_size, *lengthp)\n+\t\t\t\tcaddr_t keyp,\n+\t__in\t\t\tsize_t key_max_size,\n+\t__out\t\t\tuint32_t *lengthp\n+\t)\n+{\n+\tefx_rc_t rc;\n+\n+\t_NOTE(ARGUNUSED(enp))\n+\tEFSYS_ASSERT(length <= (EFX_LICENSE_V1V2_PAYLOAD_LENGTH_MAX +\n+\t    EFX_LICENSE_V1V2_HEADER_LENGTH));\n+\n+\tif (key_max_size < length) {\n+\t\trc = ENOSPC;\n+\t\tgoto fail1;\n+\t}\n+\tmemcpy(keyp, &bufferp[offset], length);\n+\n+\t*lengthp = length;\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_lic_v1v2_write_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__in_bcount(length)\tcaddr_t keyp,\n+\t__in\t\t\tuint32_t length,\n+\t__out\t\t\tuint32_t *lengthp\n+\t)\n+{\n+\tefx_rc_t rc;\n+\n+\t_NOTE(ARGUNUSED(enp))\n+\tEFSYS_ASSERT(length <= (EFX_LICENSE_V1V2_PAYLOAD_LENGTH_MAX +\n+\t    EFX_LICENSE_V1V2_HEADER_LENGTH));\n+\n+\t/* Ensure space for terminator remains */\n+\tif ((offset + length) >\n+\t    (buffer_size - EFX_LICENSE_V1V2_HEADER_LENGTH)) {\n+\t\trc = ENOSPC;\n+\t\tgoto fail1;\n+\t}\n+\n+\tmemcpy(bufferp + offset, keyp, length);\n+\n+\t*lengthp = length;\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_lic_v1v2_delete_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__in\t\t\tuint32_t length,\n+\t__in\t\t\tuint32_t end,\n+\t__out\t\t\tuint32_t *deltap\n+\t)\n+{\n+\tuint32_t move_start = offset + length;\n+\tuint32_t move_length = end - move_start;\n+\n+\t_NOTE(ARGUNUSED(enp))\n+\tEFSYS_ASSERT(end <= buffer_size);\n+\n+\t/* Shift everything after the key down */\n+\tmemmove(bufferp + offset, bufferp + move_start, move_length);\n+\n+\t*deltap = length;\n+\n+\treturn (0);\n+}\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v1v2_create_partition(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size\n+\t)\n+{\n+\t_NOTE(ARGUNUSED(enp))\n+\tEFSYS_ASSERT(EFX_LICENSE_V1V2_HEADER_LENGTH <= buffer_size);\n+\n+\t/* Write terminator */\n+\tmemset(bufferp, '\\0', EFX_LICENSE_V1V2_HEADER_LENGTH);\n+\treturn (0);\n+}\n+\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v1v2_finish_partition(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size\n+\t)\n+{\n+\t_NOTE(ARGUNUSED(enp, bufferp, buffer_size))\n+\n+\treturn (0);\n+}\n+\n+#endif\t/* EFSYS_OPT_HUNTINGTON | EFSYS_OPT_SIENA */\n+\n+\n+/* V2 Licensing - used by Huntington family only. See SF-113611-TC */\n+\n+#if EFSYS_OPT_HUNTINGTON\n+\n+static\t__checkReturn\tefx_rc_t\n+efx_mcdi_licensed_app_state(\n+\t__in\t\tefx_nic_t *enp,\n+\t__in\t\tuint64_t app_id,\n+\t__out\t\tboolean_t *licensedp)\n+{\n+\tefx_mcdi_req_t req;\n+\tuint8_t payload[MAX(MC_CMD_GET_LICENSED_APP_STATE_IN_LEN,\n+\t\t\t    MC_CMD_GET_LICENSED_APP_STATE_OUT_LEN)];\n+\tuint32_t app_state;\n+\tefx_rc_t rc;\n+\n+\tEFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON);\n+\n+\t/* V2 licensing supports 32bit app id only */\n+\tif ((app_id >> 32) != 0) {\n+\t\trc = EINVAL;\n+\t\tgoto fail1;\n+\t}\n+\n+\t(void) memset(payload, 0, sizeof (payload));\n+\treq.emr_cmd = MC_CMD_GET_LICENSED_APP_STATE;\n+\treq.emr_in_buf = payload;\n+\treq.emr_in_length = MC_CMD_GET_LICENSED_APP_STATE_IN_LEN;\n+\treq.emr_out_buf = payload;\n+\treq.emr_out_length = MC_CMD_GET_LICENSED_APP_STATE_OUT_LEN;\n+\n+\tMCDI_IN_SET_DWORD(req, GET_LICENSED_APP_STATE_IN_APP_ID,\n+\t\t    app_id & 0xffffffff);\n+\n+\tefx_mcdi_execute(enp, &req);\n+\n+\tif (req.emr_rc != 0) {\n+\t\trc = req.emr_rc;\n+\t\tgoto fail2;\n+\t}\n+\n+\tif (req.emr_out_length_used < MC_CMD_GET_LICENSED_APP_STATE_OUT_LEN) {\n+\t\trc = EMSGSIZE;\n+\t\tgoto fail3;\n+\t}\n+\n+\tapp_state = (MCDI_OUT_DWORD(req, GET_LICENSED_APP_STATE_OUT_STATE));\n+\tif (app_state != MC_CMD_GET_LICENSED_APP_STATE_OUT_NOT_LICENSED) {\n+\t\t*licensedp = B_TRUE;\n+\t} else {\n+\t\t*licensedp = B_FALSE;\n+\t}\n+\n+\treturn (0);\n+\n+fail3:\n+\tEFSYS_PROBE(fail3);\n+fail2:\n+\tEFSYS_PROBE(fail2);\n+fail1:\n+\tEFSYS_PROBE1(fail1, efx_rc_t, rc);\n+\n+\treturn (rc);\n+}\n+\n+static\t__checkReturn\tefx_rc_t\n+efx_mcdi_licensing_update_licenses(\n+\t__in\t\tefx_nic_t *enp)\n+{\n+\tefx_mcdi_req_t req;\n+\tuint8_t payload[MC_CMD_LICENSING_IN_LEN];\n+\tefx_rc_t rc;\n+\n+\tEFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON);\n+\n+\t(void) memset(payload, 0, sizeof (payload));\n+\treq.emr_cmd = MC_CMD_LICENSING;\n+\treq.emr_in_buf = payload;\n+\treq.emr_in_length = MC_CMD_LICENSING_IN_LEN;\n+\treq.emr_out_buf = payload;\n+\treq.emr_out_length = 0;\n+\n+\tMCDI_IN_SET_DWORD(req, LICENSING_IN_OP,\n+\t    MC_CMD_LICENSING_IN_OP_UPDATE_LICENSE);\n+\n+\tefx_mcdi_execute(enp, &req);\n+\n+\tif (req.emr_rc != 0) {\n+\t\trc = req.emr_rc;\n+\t\tgoto fail1;\n+\t}\n+\n+\tif (req.emr_out_length_used != 0) {\n+\t\trc = EIO;\n+\t\tgoto fail2;\n+\t}\n+\n+\treturn (0);\n+\n+fail2:\n+\tEFSYS_PROBE(fail2);\n+fail1:\n+\tEFSYS_PROBE1(fail1, efx_rc_t, rc);\n+\n+\treturn (rc);\n+}\n+\n+static\t__checkReturn\tefx_rc_t\n+efx_mcdi_licensing_get_key_stats(\n+\t__in\t\tefx_nic_t *enp,\n+\t__out\t\tefx_key_stats_t *eksp)\n+{\n+\tefx_mcdi_req_t req;\n+\tuint8_t payload[MAX(MC_CMD_LICENSING_IN_LEN,\n+\t\t\t    MC_CMD_LICENSING_OUT_LEN)];\n+\tefx_rc_t rc;\n+\n+\tEFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON);\n+\n+\t(void) memset(payload, 0, sizeof (payload));\n+\treq.emr_cmd = MC_CMD_LICENSING;\n+\treq.emr_in_buf = payload;\n+\treq.emr_in_length = MC_CMD_LICENSING_IN_LEN;\n+\treq.emr_out_buf = payload;\n+\treq.emr_out_length = MC_CMD_LICENSING_OUT_LEN;\n+\n+\tMCDI_IN_SET_DWORD(req, LICENSING_IN_OP,\n+\t    MC_CMD_LICENSING_IN_OP_GET_KEY_STATS);\n+\n+\tefx_mcdi_execute(enp, &req);\n+\n+\tif (req.emr_rc != 0) {\n+\t\trc = req.emr_rc;\n+\t\tgoto fail1;\n+\t}\n+\n+\tif (req.emr_out_length_used < MC_CMD_LICENSING_OUT_LEN) {\n+\t\trc = EMSGSIZE;\n+\t\tgoto fail2;\n+\t}\n+\n+\teksp->eks_valid =\n+\t\tMCDI_OUT_DWORD(req, LICENSING_OUT_VALID_APP_KEYS);\n+\teksp->eks_invalid =\n+\t\tMCDI_OUT_DWORD(req, LICENSING_OUT_INVALID_APP_KEYS);\n+\teksp->eks_blacklisted =\n+\t\tMCDI_OUT_DWORD(req, LICENSING_OUT_BLACKLISTED_APP_KEYS);\n+\teksp->eks_unverifiable =\n+\t\tMCDI_OUT_DWORD(req, LICENSING_OUT_UNVERIFIABLE_APP_KEYS);\n+\teksp->eks_wrong_node =\n+\t\tMCDI_OUT_DWORD(req, LICENSING_OUT_WRONG_NODE_APP_KEYS);\n+\teksp->eks_licensed_apps_lo = 0;\n+\teksp->eks_licensed_apps_hi = 0;\n+\teksp->eks_licensed_features_lo = 0;\n+\teksp->eks_licensed_features_hi = 0;\n+\n+\treturn (0);\n+\n+fail2:\n+\tEFSYS_PROBE(fail2);\n+fail1:\n+\tEFSYS_PROBE1(fail1, efx_rc_t, rc);\n+\n+\treturn (rc);\n+}\n+\n+#endif\t/* EFSYS_OPT_HUNTINGTON */\n+\n+/* V3 Licensing - used starting from Medford family. See SF-114884-SW */\n+\n+#if EFSYS_OPT_MEDFORD\n+\n+static\t__checkReturn\tefx_rc_t\n+efx_mcdi_licensing_v3_update_licenses(\n+\t__in\t\tefx_nic_t *enp)\n+{\n+\tefx_mcdi_req_t req;\n+\tuint8_t payload[MC_CMD_LICENSING_V3_IN_LEN];\n+\tefx_rc_t rc;\n+\n+\tEFSYS_ASSERT(enp->en_family == EFX_FAMILY_MEDFORD);\n+\n+\t(void) memset(payload, 0, sizeof (payload));\n+\treq.emr_cmd = MC_CMD_LICENSING_V3;\n+\treq.emr_in_buf = payload;\n+\treq.emr_in_length = MC_CMD_LICENSING_V3_IN_LEN;\n+\treq.emr_out_buf = NULL;\n+\treq.emr_out_length = 0;\n+\n+\tMCDI_IN_SET_DWORD(req, LICENSING_V3_IN_OP,\n+\t    MC_CMD_LICENSING_V3_IN_OP_UPDATE_LICENSE);\n+\n+\tefx_mcdi_execute(enp, &req);\n+\n+\tif (req.emr_rc != 0) {\n+\t\trc = req.emr_rc;\n+\t\tgoto fail1;\n+\t}\n+\n+\treturn (0);\n+\n+fail1:\n+\tEFSYS_PROBE1(fail1, efx_rc_t, rc);\n+\n+\treturn (rc);\n+}\n+\n+static\t__checkReturn\tefx_rc_t\n+efx_mcdi_licensing_v3_report_license(\n+\t__in\t\tefx_nic_t *enp,\n+\t__out\t\tefx_key_stats_t *eksp)\n+{\n+\tefx_mcdi_req_t req;\n+\tuint8_t payload[MAX(MC_CMD_LICENSING_V3_IN_LEN,\n+\t\t\t    MC_CMD_LICENSING_V3_OUT_LEN)];\n+\tefx_rc_t rc;\n+\n+\tEFSYS_ASSERT(enp->en_family == EFX_FAMILY_MEDFORD);\n+\n+\t(void) memset(payload, 0, sizeof (payload));\n+\treq.emr_cmd = MC_CMD_LICENSING_V3;\n+\treq.emr_in_buf = payload;\n+\treq.emr_in_length = MC_CMD_LICENSING_V3_IN_LEN;\n+\treq.emr_out_buf = payload;\n+\treq.emr_out_length = MC_CMD_LICENSING_V3_OUT_LEN;\n+\n+\tMCDI_IN_SET_DWORD(req, LICENSING_V3_IN_OP,\n+\t    MC_CMD_LICENSING_V3_IN_OP_REPORT_LICENSE);\n+\n+\tefx_mcdi_execute_quiet(enp, &req);\n+\n+\tif (req.emr_rc != 0) {\n+\t\trc = req.emr_rc;\n+\t\tgoto fail1;\n+\t}\n+\n+\tif (req.emr_out_length_used < MC_CMD_LICENSING_V3_OUT_LEN) {\n+\t\trc = EMSGSIZE;\n+\t\tgoto fail2;\n+\t}\n+\n+\teksp->eks_valid =\n+\t\tMCDI_OUT_DWORD(req, LICENSING_V3_OUT_VALID_KEYS);\n+\teksp->eks_invalid =\n+\t\tMCDI_OUT_DWORD(req, LICENSING_V3_OUT_INVALID_KEYS);\n+\teksp->eks_blacklisted = 0;\n+\teksp->eks_unverifiable =\n+\t\tMCDI_OUT_DWORD(req, LICENSING_V3_OUT_UNVERIFIABLE_KEYS);\n+\teksp->eks_wrong_node =\n+\t\tMCDI_OUT_DWORD(req, LICENSING_V3_OUT_WRONG_NODE_KEYS);\n+\teksp->eks_licensed_apps_lo =\n+\t\tMCDI_OUT_DWORD(req, LICENSING_V3_OUT_LICENSED_APPS_LO);\n+\teksp->eks_licensed_apps_hi =\n+\t\tMCDI_OUT_DWORD(req, LICENSING_V3_OUT_LICENSED_APPS_HI);\n+\teksp->eks_licensed_features_lo =\n+\t\tMCDI_OUT_DWORD(req, LICENSING_V3_OUT_LICENSED_FEATURES_LO);\n+\teksp->eks_licensed_features_hi =\n+\t\tMCDI_OUT_DWORD(req, LICENSING_V3_OUT_LICENSED_FEATURES_HI);\n+\n+\treturn (0);\n+\n+fail2:\n+\tEFSYS_PROBE(fail2);\n+fail1:\n+\tEFSYS_PROBE1(fail1, efx_rc_t, rc);\n+\n+\treturn (rc);\n+}\n+\n+static\t__checkReturn\tefx_rc_t\n+efx_mcdi_licensing_v3_app_state(\n+\t__in\t\tefx_nic_t *enp,\n+\t__in\t\tuint64_t app_id,\n+\t__out\t\tboolean_t *licensedp)\n+{\n+\tefx_mcdi_req_t req;\n+\tuint8_t payload[MAX(MC_CMD_GET_LICENSED_V3_APP_STATE_IN_LEN,\n+\t\t\t    MC_CMD_GET_LICENSED_V3_APP_STATE_OUT_LEN)];\n+\tuint32_t app_state;\n+\tefx_rc_t rc;\n+\n+\tEFSYS_ASSERT(enp->en_family == EFX_FAMILY_MEDFORD);\n+\n+\t(void) memset(payload, 0, sizeof (payload));\n+\treq.emr_cmd = MC_CMD_GET_LICENSED_V3_APP_STATE;\n+\treq.emr_in_buf = payload;\n+\treq.emr_in_length = MC_CMD_GET_LICENSED_V3_APP_STATE_IN_LEN;\n+\treq.emr_out_buf = payload;\n+\treq.emr_out_length = MC_CMD_GET_LICENSED_V3_APP_STATE_OUT_LEN;\n+\n+\tMCDI_IN_SET_DWORD(req, GET_LICENSED_V3_APP_STATE_IN_APP_ID_LO,\n+\t\t    app_id & 0xffffffff);\n+\tMCDI_IN_SET_DWORD(req, GET_LICENSED_V3_APP_STATE_IN_APP_ID_HI,\n+\t\t    app_id >> 32);\n+\n+\tefx_mcdi_execute(enp, &req);\n+\n+\tif (req.emr_rc != 0) {\n+\t\trc = req.emr_rc;\n+\t\tgoto fail1;\n+\t}\n+\n+\tif (req.emr_out_length_used < MC_CMD_GET_LICENSED_V3_APP_STATE_OUT_LEN) {\n+\t\trc = EMSGSIZE;\n+\t\tgoto fail2;\n+\t}\n+\n+\tapp_state = (MCDI_OUT_DWORD(req, GET_LICENSED_V3_APP_STATE_OUT_STATE));\n+\tif (app_state != MC_CMD_GET_LICENSED_V3_APP_STATE_OUT_NOT_LICENSED) {\n+\t\t*licensedp = B_TRUE;\n+\t} else {\n+\t\t*licensedp = B_FALSE;\n+\t}\n+\n+\treturn (0);\n+\n+fail2:\n+\tEFSYS_PROBE(fail2);\n+fail1:\n+\tEFSYS_PROBE1(fail1, efx_rc_t, rc);\n+\n+\treturn (rc);\n+}\n+\n+static\t__checkReturn\tefx_rc_t\n+efx_mcdi_licensing_v3_get_id(\n+\t__in\t\tefx_nic_t *enp,\n+\t__in\t\tsize_t buffer_size,\n+\t__out\t\tuint32_t *typep,\n+\t__out\t\tsize_t *lengthp,\n+\t__out_bcount_part_opt(buffer_size, *lengthp)\n+\t\t\tuint8_t *bufferp)\n+{\n+\tefx_mcdi_req_t req;\n+\tuint8_t payload[MAX(MC_CMD_LICENSING_GET_ID_V3_IN_LEN,\n+\t\t\t    MC_CMD_LICENSING_GET_ID_V3_OUT_LENMIN)];\n+\tefx_rc_t rc;\n+\n+\treq.emr_cmd = MC_CMD_LICENSING_GET_ID_V3;\n+\n+\tif (bufferp == NULL) {\n+\t\t/* Request id type and length only */\n+\t\treq.emr_in_buf = bufferp;\n+\t\treq.emr_in_length = MC_CMD_LICENSING_GET_ID_V3_IN_LEN;\n+\t\treq.emr_out_buf = bufferp;\n+\t\treq.emr_out_length = MC_CMD_LICENSING_GET_ID_V3_OUT_LENMIN;\n+\t\t(void) memset(payload, 0, sizeof (payload));\n+\t} else {\n+\t\t/* Request full buffer */\n+\t\treq.emr_in_buf = bufferp;\n+\t\treq.emr_in_length = MC_CMD_LICENSING_GET_ID_V3_IN_LEN;\n+\t\treq.emr_out_buf = bufferp;\n+\t\treq.emr_out_length = MIN(buffer_size, MC_CMD_LICENSING_GET_ID_V3_OUT_LENMAX);\n+\t\t(void) memset(bufferp, 0, req.emr_out_length);\n+\t}\n+\n+\tefx_mcdi_execute_quiet(enp, &req);\n+\n+\tif (req.emr_rc != 0) {\n+\t\trc = req.emr_rc;\n+\t\tgoto fail1;\n+\t}\n+\n+\tif (req.emr_out_length_used < MC_CMD_LICENSING_GET_ID_V3_OUT_LENMIN) {\n+\t\trc = EMSGSIZE;\n+\t\tgoto fail2;\n+\t}\n+\n+\t*typep = MCDI_OUT_DWORD(req, LICENSING_GET_ID_V3_OUT_LICENSE_TYPE);\n+\t*lengthp = MCDI_OUT_DWORD(req, LICENSING_GET_ID_V3_OUT_LICENSE_ID_LENGTH);\n+\n+\tif (bufferp == NULL) {\n+\t\t/* modify length requirements to indicate to caller the extra buffering\n+\t\t** needed to read the complete output.\n+\t\t*/\n+\t\t*lengthp += MC_CMD_LICENSING_GET_ID_V3_OUT_LENMIN;\n+\t} else {\n+\t\t/* Shift ID down to start of buffer */\n+\t\tmemmove(bufferp,\n+\t\t    bufferp + MC_CMD_LICENSING_GET_ID_V3_OUT_LICENSE_ID_OFST,\n+\t\t    *lengthp);\n+\t\tmemset(bufferp + (*lengthp), 0,\n+\t\t    MC_CMD_LICENSING_GET_ID_V3_OUT_LICENSE_ID_OFST);\n+\t}\n+\n+\treturn (0);\n+\n+fail2:\n+\tEFSYS_PROBE(fail2);\n+fail1:\n+\tEFSYS_PROBE1(fail1, efx_rc_t, rc);\n+\n+\treturn (rc);\n+}\n+\n+/* V3 format uses Huntington TLV format partition. See SF-108797-SW */\n+#define EFX_LICENSE_V3_KEY_LENGTH_MIN    (64)\n+#define EFX_LICENSE_V3_KEY_LENGTH_MAX    (160)\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v3_find_start(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__out\t\t\tuint32_t *startp\n+\t)\n+{\n+\t_NOTE(ARGUNUSED(enp))\n+\n+\treturn ef10_nvram_buffer_find_item_start(bufferp, buffer_size, startp);\n+}\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v3_find_end(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__out\t\t\tuint32_t *endp\n+\t)\n+{\n+\t_NOTE(ARGUNUSED(enp))\n+\n+\treturn ef10_nvram_buffer_find_end(bufferp, buffer_size, offset, endp);\n+}\n+\n+\t__checkReturn\t__success(return != B_FALSE)\tboolean_t\n+efx_lic_v3_find_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__out\t\t\tuint32_t *startp,\n+\t__out\t\t\tuint32_t *lengthp\n+\t)\n+{\n+\t_NOTE(ARGUNUSED(enp))\n+\n+\treturn ef10_nvram_buffer_find_item(bufferp, buffer_size,\n+\t    offset, startp, lengthp);\n+}\n+\n+\t__checkReturn\t__success(return != B_FALSE)\tboolean_t\n+efx_lic_v3_validate_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(length)\tcaddr_t keyp,\n+\t__in\t\t\tuint32_t length\n+\t)\n+{\n+\t/* Check key is a valid V3 key */\n+\tuint8_t key_type;\n+\tuint8_t key_length;\n+\n+\t_NOTE(ARGUNUSED(enp))\n+\n+\tif (length < EFX_LICENSE_V3_KEY_LENGTH_MIN) {\n+\t\tgoto fail1;\n+\t}\n+\n+\tif (length > EFX_LICENSE_V3_KEY_LENGTH_MAX) {\n+\t\tgoto fail2;\n+\t}\n+\n+\tkey_type = ((uint8_t *)keyp)[0];\n+\tkey_length = ((uint8_t *)keyp)[1];\n+\n+\tif (key_type < 3) {\n+\t\tgoto fail3;\n+\t}\n+\tif (key_length > length) {\n+\t\tgoto fail4;\n+\t}\n+\treturn (B_TRUE);\n+\n+fail4:\n+\tEFSYS_PROBE(fail4);\n+fail3:\n+\tEFSYS_PROBE(fail3);\n+fail2:\n+\tEFSYS_PROBE(fail2);\n+fail1:\n+\tEFSYS_PROBE(fail1);\n+\n+\treturn (B_FALSE);\n+}\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v3_read_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__in\t\t\tuint32_t length,\n+\t__out_bcount_part(key_max_size, *lengthp)\n+\t\t\t\tcaddr_t keyp,\n+\t__in\t\t\tsize_t key_max_size,\n+\t__out\t\t\tuint32_t *lengthp\n+\t)\n+{\n+\t_NOTE(ARGUNUSED(enp))\n+\n+\treturn ef10_nvram_buffer_get_item(bufferp, buffer_size,\n+\t\t    offset, length, keyp, key_max_size, lengthp);\n+}\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v3_write_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__in_bcount(length)\tcaddr_t keyp,\n+\t__in\t\t\tuint32_t length,\n+\t__out\t\t\tuint32_t *lengthp\n+\t)\n+{\n+\t_NOTE(ARGUNUSED(enp))\n+\tEFSYS_ASSERT(length <= EFX_LICENSE_V3_KEY_LENGTH_MAX);\n+\n+\treturn ef10_nvram_buffer_insert_item(bufferp, buffer_size,\n+\t\t    offset, keyp, length, lengthp);\n+}\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_v3_delete_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__in\t\t\tuint32_t length,\n+\t__in\t\t\tuint32_t end,\n+\t__out\t\t\tuint32_t *deltap\n+\t)\n+{\n+\tefx_rc_t rc;\n+\n+\t_NOTE(ARGUNUSED(enp))\n+\n+\tif ((rc = ef10_nvram_buffer_delete_item(bufferp,\n+\t\t\tbuffer_size, offset, length, end)) != 0) {\n+\t\tgoto fail1;\n+\t}\n+\n+\t*deltap = length;\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_lic_v3_create_partition(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size\n+\t)\n+{\n+\tefx_rc_t rc;\n+\n+\t/* Construct empty partition */\n+\tif ((rc = ef10_nvram_buffer_create(enp,\n+\t    NVRAM_PARTITION_TYPE_LICENSE,\n+\t    bufferp, buffer_size)) != 0) {\n+\t\trc = EFAULT;\n+\t\tgoto fail1;\n+\t}\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_lic_v3_finish_partition(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size\n+\t)\n+{\n+\tefx_rc_t rc;\n+\n+\tif ((rc = ef10_nvram_buffer_finish(bufferp,\n+\t\t\tbuffer_size)) != 0) {\n+\t\tgoto fail1;\n+\t}\n+\n+\t/* Validate completed partition */\n+\tif ((rc = ef10_nvram_buffer_validate(enp, NVRAM_PARTITION_TYPE_LICENSE,\n+\t\t\t\t\tbufferp, buffer_size)) != 0) {\n+\t\tgoto fail2;\n+\t}\n+\n+\treturn (0);\n+\n+fail2:\n+\tEFSYS_PROBE(fail2);\n+fail1:\n+\tEFSYS_PROBE1(fail1, efx_rc_t, rc);\n+\n+\treturn (rc);\n+}\n+\n+\n+#endif\t/* EFSYS_OPT_MEDFORD */\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_init(\n+\t__in\t\t\tefx_nic_t *enp)\n+{\n+\tconst efx_lic_ops_t *elop;\n+\tefx_key_stats_t eks;\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+\tEFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_LIC));\n+\n+\tswitch (enp->en_family) {\n+\n+#if EFSYS_OPT_SIENA\n+\tcase EFX_FAMILY_SIENA:\n+\t\telop = &__efx_lic_v1_ops;\n+\t\tbreak;\n+#endif\t/* EFSYS_OPT_SIENA */\n+\n+#if EFSYS_OPT_HUNTINGTON\n+\tcase EFX_FAMILY_HUNTINGTON:\n+\t\telop = &__efx_lic_v2_ops;\n+\t\tbreak;\n+#endif\t/* EFSYS_OPT_HUNTINGTON */\n+\n+#if EFSYS_OPT_MEDFORD\n+\tcase EFX_FAMILY_MEDFORD:\n+\t\telop = &__efx_lic_v3_ops;\n+\t\tbreak;\n+#endif\t/* EFSYS_OPT_MEDFORD */\n+\n+\tdefault:\n+\t\tEFSYS_ASSERT(0);\n+\t\trc = ENOTSUP;\n+\t\tgoto fail1;\n+\t}\n+\n+\tenp->en_elop = elop;\n+\tenp->en_mod_flags |= EFX_MOD_LIC;\n+\n+\t/* Probe for support */\n+\tif (efx_lic_get_key_stats(enp, &eks) == 0) {\n+\t\tenp->en_licensing_supported = B_TRUE;\n+\t} else {\n+\t\tenp->en_licensing_supported = B_FALSE;\n+\t}\n+\n+\treturn (0);\n+\n+fail1:\n+\tEFSYS_PROBE1(fail1, efx_rc_t, rc);\n+\n+\treturn (rc);\n+}\n+\n+extern\t__checkReturn\tboolean_t\n+efx_lic_check_support(\n+\t__in\t\t\tefx_nic_t *enp)\n+{\n+\tEFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);\n+\tEFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);\n+\tEFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);\n+\n+\treturn enp->en_licensing_supported;\n+}\n+\n+\t\t\t\tvoid\n+efx_lic_fini(\n+\t__in\t\t\tefx_nic_t *enp)\n+{\n+\tEFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);\n+\tEFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);\n+\tEFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);\n+\n+\tenp->en_elop = NULL;\n+\tenp->en_mod_flags &= ~EFX_MOD_LIC;\n+}\n+\n+\n+\t__checkReturn\tefx_rc_t\n+efx_lic_update_licenses(\n+\t__in\t\tefx_nic_t *enp)\n+{\n+\tconst efx_lic_ops_t *elop = enp->en_elop;\n+\tefx_rc_t rc;\n+\n+\tEFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);\n+\tEFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);\n+\n+\tif ((rc = elop->elo_update_licenses(enp)) != 0)\n+\t\tgoto fail1;\n+\n+\treturn (0);\n+\n+fail1:\n+\tEFSYS_PROBE1(fail1, efx_rc_t, rc);\n+\n+\treturn (rc);\n+}\n+\n+\t__checkReturn\tefx_rc_t\n+efx_lic_get_key_stats(\n+\t__in\t\tefx_nic_t *enp,\n+\t__out\t\tefx_key_stats_t *eksp)\n+{\n+\tconst efx_lic_ops_t *elop = enp->en_elop;\n+\tefx_rc_t rc;\n+\n+\tEFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);\n+\tEFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);\n+\n+\tif ((rc = elop->elo_get_key_stats(enp, eksp)) != 0)\n+\t\tgoto fail1;\n+\n+\treturn (0);\n+\n+fail1:\n+\tEFSYS_PROBE1(fail1, efx_rc_t, rc);\n+\n+\treturn (rc);\n+}\n+\n+\t__checkReturn\tefx_rc_t\n+efx_lic_app_state(\n+\t__in\t\tefx_nic_t *enp,\n+\t__in\t\tuint64_t app_id,\n+\t__out\t\tboolean_t *licensedp)\n+{\n+\tconst efx_lic_ops_t *elop = enp->en_elop;\n+\tefx_rc_t rc;\n+\n+\tEFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);\n+\tEFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);\n+\n+\tif (elop->elo_app_state == NULL)\n+\t\treturn (ENOTSUP);\n+\n+\tif ((rc = elop->elo_app_state(enp, app_id, licensedp)) != 0)\n+\t\tgoto fail1;\n+\n+\treturn (0);\n+\n+fail1:\n+\tEFSYS_PROBE1(fail1, efx_rc_t, rc);\n+\n+\treturn (rc);\n+}\n+\n+\t__checkReturn\tefx_rc_t\n+efx_lic_get_id(\n+\t__in\t\tefx_nic_t *enp,\n+\t__in\t\tsize_t buffer_size,\n+\t__out\t\tuint32_t *typep,\n+\t__out\t\tsize_t *lengthp,\n+\t__out_opt\tuint8_t *bufferp\n+\t)\n+{\n+\tconst efx_lic_ops_t *elop = enp->en_elop;\n+\tefx_rc_t rc;\n+\n+\tEFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);\n+\tEFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);\n+\n+\tif (elop->elo_get_id == NULL)\n+\t\treturn (ENOTSUP);\n+\n+\tif ((rc = elop->elo_get_id(enp, buffer_size, typep,\n+\t\t\t\t    lengthp, bufferp)) != 0)\n+\t\tgoto fail1;\n+\n+\treturn (0);\n+\n+fail1:\n+\tEFSYS_PROBE1(fail1, efx_rc_t, rc);\n+\n+\treturn (rc);\n+}\n+\n+/* Buffer management API - abstracts varying TLV format used for License partition */\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_find_start(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__out\t\t\tuint32_t *startp\n+\t)\n+{\n+\tconst efx_lic_ops_t *elop = enp->en_elop;\n+\tefx_rc_t rc;\n+\n+\tEFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);\n+\tEFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);\n+\n+\tif ((rc = elop->elo_find_start(enp, bufferp, buffer_size, startp)) != 0)\n+\t\tgoto fail1;\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_lic_find_end(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__out\t\t\tuint32_t *endp\n+\t)\n+{\n+\tconst efx_lic_ops_t *elop = enp->en_elop;\n+\tefx_rc_t rc;\n+\n+\tEFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);\n+\tEFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);\n+\n+\tif ((rc = elop->elo_find_end(enp, bufferp, buffer_size, offset, endp)) != 0)\n+\t\tgoto fail1;\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__success(return != B_FALSE)\tboolean_t\n+efx_lic_find_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__out\t\t\tuint32_t *startp,\n+\t__out\t\t\tuint32_t *lengthp\n+\t)\n+{\n+\tconst efx_lic_ops_t *elop = enp->en_elop;\n+\n+\tEFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);\n+\tEFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);\n+\n+\tEFSYS_ASSERT(bufferp);\n+\tEFSYS_ASSERT(startp);\n+\tEFSYS_ASSERT(lengthp);\n+\n+\treturn (elop->elo_find_key(enp, bufferp, buffer_size, offset,\n+\t\t\t\t    startp, lengthp));\n+}\n+\n+\n+/* Validate that the buffer contains a single key in a recognised format.\n+** An empty or terminator buffer is not accepted as a valid key.\n+*/\n+\t__checkReturn\t__success(return != B_FALSE)\tboolean_t\n+efx_lic_validate_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(length)\tcaddr_t keyp,\n+\t__in\t\t\tuint32_t length\n+\t)\n+{\n+\tconst efx_lic_ops_t *elop = enp->en_elop;\n+\tboolean_t rc;\n+\n+\tEFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);\n+\tEFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);\n+\n+\tif ((rc = elop->elo_validate_key(enp, keyp, length)) == B_FALSE)\n+\t\tgoto fail1;\n+\n+\treturn (B_TRUE);\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_lic_read_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__in\t\t\tuint32_t length,\n+\t__out_bcount_part(key_max_size, *lengthp)\n+\t\t\t\tcaddr_t keyp,\n+\t__in\t\t\tsize_t key_max_size,\n+\t__out\t\t\tuint32_t *lengthp\n+\t)\n+{\n+\tconst efx_lic_ops_t *elop = enp->en_elop;\n+\tefx_rc_t rc;\n+\n+\tEFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);\n+\tEFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);\n+\n+\tif ((rc = elop->elo_read_key(enp, bufferp, buffer_size, offset,\n+\t\t\t\t    length, keyp, key_max_size, lengthp)) != 0)\n+\t\tgoto fail1;\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_lic_write_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__in_bcount(length)\tcaddr_t keyp,\n+\t__in\t\t\tuint32_t length,\n+\t__out\t\t\tuint32_t *lengthp\n+\t)\n+{\n+\tconst efx_lic_ops_t *elop = enp->en_elop;\n+\tefx_rc_t rc;\n+\n+\tEFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);\n+\tEFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);\n+\n+\tif ((rc = elop->elo_write_key(enp, bufferp, buffer_size, offset,\n+\t\t\t\t    keyp, length, lengthp)) != 0)\n+\t\tgoto fail1;\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_lic_delete_key(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size,\n+\t__in\t\t\tuint32_t offset,\n+\t__in\t\t\tuint32_t length,\n+\t__in\t\t\tuint32_t end,\n+\t__out\t\t\tuint32_t *deltap\n+\t)\n+{\n+\tconst efx_lic_ops_t *elop = enp->en_elop;\n+\tefx_rc_t rc;\n+\n+\tEFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);\n+\tEFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);\n+\n+\tif ((rc = elop->elo_delete_key(enp, bufferp, buffer_size, offset,\n+\t\t\t\t    length, end, deltap)) != 0)\n+\t\tgoto fail1;\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_lic_create_partition(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size\n+\t)\n+{\n+\tconst efx_lic_ops_t *elop = enp->en_elop;\n+\tefx_rc_t rc;\n+\n+\tEFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);\n+\tEFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);\n+\n+\tif ((rc = elop->elo_create_partition(enp, bufferp, buffer_size)) != 0)\n+\t\tgoto fail1;\n+\n+\treturn (0);\n+\n+fail1:\n+\tEFSYS_PROBE1(fail1, efx_rc_t, rc);\n+\n+\treturn (rc);\n+}\n+\n+\n+\t__checkReturn\t\tefx_rc_t\n+efx_lic_finish_partition(\n+\t__in\t\t\tefx_nic_t *enp,\n+\t__in_bcount(buffer_size)\n+\t\t\t\tcaddr_t bufferp,\n+\t__in\t\t\tsize_t buffer_size\n+\t)\n+{\n+\tconst efx_lic_ops_t *elop = enp->en_elop;\n+\tefx_rc_t rc;\n+\n+\tEFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);\n+\tEFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);\n+\n+\tif ((rc = elop->elo_finish_partition(enp, bufferp, buffer_size)) != 0)\n+\t\tgoto fail1;\n+\n+\treturn (0);\n+\n+fail1:\n+\tEFSYS_PROBE1(fail1, efx_rc_t, rc);\n+\n+\treturn (rc);\n+}\n+\n+#endif\t/* EFSYS_OPT_LICENSING */\n",
    "prefixes": [
        "dpdk-dev",
        "29/56"
    ]
}