New upstream version 18.11-rc1
[deb_dpdk.git] / drivers / net / sfc / base / efx_lic.c
index 2cd05cc..4081aef 100644 (file)
@@ -1,31 +1,7 @@
-/*
- * Copyright (c) 2009-2016 Solarflare Communications Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
+/* SPDX-License-Identifier: BSD-3-Clause
  *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
- * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are
- * those of the authors and should not be interpreted as representing official
- * policies, either expressed or implied, of the FreeBSD Project.
+ * Copyright (c) 2009-2018 Solarflare Communications Inc.
+ * All rights reserved.
  */
 
 #include "efx.h"
@@ -34,6 +10,9 @@
 #if EFSYS_OPT_LICENSING
 
 #include "ef10_tlv_layout.h"
+#if EFSYS_OPT_SIENA
+#include "efx_regs_mcdi_aoe.h"
+#endif
 
 #if EFSYS_OPT_SIENA | EFSYS_OPT_HUNTINGTON
 
@@ -43,8 +22,7 @@ efx_lic_v1v2_find_start(
        __in_bcount(buffer_size)
                                caddr_t bufferp,
        __in                    size_t buffer_size,
-       __out                   uint32_t *startp
-       );
+       __out                   uint32_t *startp);
 
        __checkReturn           efx_rc_t
 efx_lic_v1v2_find_end(
@@ -53,8 +31,7 @@ efx_lic_v1v2_find_end(
                                caddr_t bufferp,
        __in                    size_t buffer_size,
        __in                    uint32_t offset,
-       __out                   uint32_t *endp
-       );
+       __out                   uint32_t *endp);
 
        __checkReturn   __success(return != B_FALSE)    boolean_t
 efx_lic_v1v2_find_key(
@@ -64,15 +41,13 @@ efx_lic_v1v2_find_key(
        __in                    size_t buffer_size,
        __in                    uint32_t offset,
        __out                   uint32_t *startp,
-       __out                   uint32_t *lengthp
-       );
+       __out                   uint32_t *lengthp);
 
        __checkReturn   __success(return != B_FALSE)    boolean_t
 efx_lic_v1v2_validate_key(
        __in                    efx_nic_t *enp,
        __in_bcount(length)     caddr_t keyp,
-       __in                    uint32_t length
-       );
+       __in                    uint32_t length);
 
        __checkReturn           efx_rc_t
 efx_lic_v1v2_read_key(
@@ -85,8 +60,7 @@ efx_lic_v1v2_read_key(
        __out_bcount_part(key_max_size, *lengthp)
                                caddr_t keyp,
        __in                    size_t key_max_size,
-       __out                   uint32_t *lengthp
-       );
+       __out                   uint32_t *lengthp);
 
        __checkReturn           efx_rc_t
 efx_lic_v1v2_write_key(
@@ -97,8 +71,7 @@ efx_lic_v1v2_write_key(
        __in                    uint32_t offset,
        __in_bcount(length)     caddr_t keyp,
        __in                    uint32_t length,
-       __out                   uint32_t *lengthp
-       );
+       __out                   uint32_t *lengthp);
 
        __checkReturn           efx_rc_t
 efx_lic_v1v2_delete_key(
@@ -109,24 +82,21 @@ efx_lic_v1v2_delete_key(
        __in                    uint32_t offset,
        __in                    uint32_t length,
        __in                    uint32_t end,
-       __out                   uint32_t *deltap
-       );
+       __out                   uint32_t *deltap);
 
        __checkReturn           efx_rc_t
 efx_lic_v1v2_create_partition(
        __in                    efx_nic_t *enp,
        __in_bcount(buffer_size)
                                caddr_t bufferp,
-       __in                    size_t buffer_size
-       );
+       __in                    size_t buffer_size);
 
        __checkReturn           efx_rc_t
 efx_lic_v1v2_finish_partition(
        __in                    efx_nic_t *enp,
        __in_bcount(buffer_size)
                                caddr_t bufferp,
-       __in                    size_t buffer_size
-       );
+       __in                    size_t buffer_size);
 
 #endif /* EFSYS_OPT_HUNTINGTON | EFSYS_OPT_SIENA */
 
@@ -195,7 +165,7 @@ static const efx_lic_ops_t  __efx_lic_v2_ops = {
 
 #endif /* EFSYS_OPT_HUNTINGTON */
 
-#if EFSYS_OPT_MEDFORD
+#if EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
 
 static __checkReturn   efx_rc_t
 efx_mcdi_licensing_v3_update_licenses(
@@ -227,8 +197,7 @@ efx_lic_v3_find_start(
        __in_bcount(buffer_size)
                                caddr_t bufferp,
        __in                    size_t buffer_size,
-       __out                   uint32_t *startp
-       );
+       __out                   uint32_t *startp);
 
        __checkReturn           efx_rc_t
 efx_lic_v3_find_end(
@@ -237,8 +206,7 @@ efx_lic_v3_find_end(
                                caddr_t bufferp,
        __in                    size_t buffer_size,
        __in                    uint32_t offset,
-       __out                   uint32_t *endp
-       );
+       __out                   uint32_t *endp);
 
        __checkReturn   __success(return != B_FALSE)    boolean_t
 efx_lic_v3_find_key(
@@ -248,15 +216,13 @@ efx_lic_v3_find_key(
        __in                    size_t buffer_size,
        __in                    uint32_t offset,
        __out                   uint32_t *startp,
-       __out                   uint32_t *lengthp
-       );
+       __out                   uint32_t *lengthp);
 
        __checkReturn   __success(return != B_FALSE)    boolean_t
 efx_lic_v3_validate_key(
        __in                    efx_nic_t *enp,
        __in_bcount(length)     caddr_t keyp,
-       __in                    uint32_t length
-       );
+       __in                    uint32_t length);
 
        __checkReturn           efx_rc_t
 efx_lic_v3_read_key(
@@ -269,8 +235,7 @@ efx_lic_v3_read_key(
        __out_bcount_part(key_max_size, *lengthp)
                                caddr_t keyp,
        __in                    size_t key_max_size,
-       __out                   uint32_t *lengthp
-       );
+       __out                   uint32_t *lengthp);
 
        __checkReturn           efx_rc_t
 efx_lic_v3_write_key(
@@ -281,8 +246,7 @@ efx_lic_v3_write_key(
        __in                    uint32_t offset,
        __in_bcount(length)     caddr_t keyp,
        __in                    uint32_t length,
-       __out                   uint32_t *lengthp
-       );
+       __out                   uint32_t *lengthp);
 
        __checkReturn           efx_rc_t
 efx_lic_v3_delete_key(
@@ -293,31 +257,28 @@ efx_lic_v3_delete_key(
        __in                    uint32_t offset,
        __in                    uint32_t length,
        __in                    uint32_t end,
-       __out                   uint32_t *deltap
-       );
+       __out                   uint32_t *deltap);
 
        __checkReturn           efx_rc_t
 efx_lic_v3_create_partition(
        __in                    efx_nic_t *enp,
        __in_bcount(buffer_size)
                                caddr_t bufferp,
-       __in                    size_t buffer_size
-       );
+       __in                    size_t buffer_size);
 
        __checkReturn           efx_rc_t
 efx_lic_v3_finish_partition(
        __in                    efx_nic_t *enp,
        __in_bcount(buffer_size)
                                caddr_t bufferp,
-       __in                    size_t buffer_size
-       );
+       __in                    size_t buffer_size);
 
 static const efx_lic_ops_t     __efx_lic_v3_ops = {
        efx_mcdi_licensing_v3_update_licenses,  /* elo_update_licenses */
        efx_mcdi_licensing_v3_report_license,   /* elo_get_key_stats */
        efx_mcdi_licensing_v3_app_state,        /* elo_app_state */
        efx_mcdi_licensing_v3_get_id,           /* elo_get_id */
-       efx_lic_v3_find_start,                  /* elo_find_start*/
+       efx_lic_v3_find_start,                  /* elo_find_start */
        efx_lic_v3_find_end,                    /* elo_find_end */
        efx_lic_v3_find_key,                    /* elo_find_key */
        efx_lic_v3_validate_key,                /* elo_validate_key */
@@ -328,7 +289,7 @@ static const efx_lic_ops_t  __efx_lic_v3_ops = {
        efx_lic_v3_finish_partition,            /* elo_finish_partition */
 };
 
-#endif /* EFSYS_OPT_MEDFORD */
+#endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
 
 
 /* V1 Licensing - used in Siena Modena only */
@@ -340,12 +301,11 @@ efx_mcdi_fc_license_update_license(
        __in            efx_nic_t *enp)
 {
        efx_mcdi_req_t req;
-       uint8_t payload[MC_CMD_FC_IN_LICENSE_LEN];
+       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FC_IN_LICENSE_LEN, 0);
        efx_rc_t rc;
 
        EFSYS_ASSERT(enp->en_family == EFX_FAMILY_SIENA);
 
-       (void) memset(payload, 0, sizeof (payload));
        req.emr_cmd = MC_CMD_FC;
        req.emr_in_buf = payload;
        req.emr_in_length = MC_CMD_FC_IN_LICENSE_LEN;
@@ -386,13 +346,12 @@ efx_mcdi_fc_license_get_key_stats(
        __out           efx_key_stats_t *eksp)
 {
        efx_mcdi_req_t req;
-       uint8_t payload[MAX(MC_CMD_FC_IN_LICENSE_LEN,
-                           MC_CMD_FC_OUT_LICENSE_LEN)];
+       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FC_IN_LICENSE_LEN,
+               MC_CMD_FC_OUT_LICENSE_LEN);
        efx_rc_t rc;
 
        EFSYS_ASSERT(enp->en_family == EFX_FAMILY_SIENA);
 
-       (void) memset(payload, 0, sizeof (payload));
        req.emr_cmd = MC_CMD_FC;
        req.emr_in_buf = payload;
        req.emr_in_length = MC_CMD_FC_IN_LICENSE_LEN;
@@ -452,8 +411,8 @@ fail1:
  *  Length (L): 16bit - value length in bytes
  *  Value (V):  L bytes - payload
  */
-#define EFX_LICENSE_V1V2_PAYLOAD_LENGTH_MAX    (256)
-#define EFX_LICENSE_V1V2_HEADER_LENGTH         (2 * sizeof(uint16_t))
+#define        EFX_LICENSE_V1V2_PAYLOAD_LENGTH_MAX     (256)
+#define        EFX_LICENSE_V1V2_HEADER_LENGTH          (2 * sizeof (uint16_t))
 
        __checkReturn           efx_rc_t
 efx_lic_v1v2_find_start(
@@ -461,8 +420,7 @@ efx_lic_v1v2_find_start(
        __in_bcount(buffer_size)
                                caddr_t bufferp,
        __in                    size_t buffer_size,
-       __out                   uint32_t *startp
-       )
+       __out                   uint32_t *startp)
 {
        _NOTE(ARGUNUSED(enp, bufferp, buffer_size))
 
@@ -477,8 +435,7 @@ efx_lic_v1v2_find_end(
                                caddr_t bufferp,
        __in                    size_t buffer_size,
        __in                    uint32_t offset,
-       __out                   uint32_t *endp
-       )
+       __out                   uint32_t *endp)
 {
        _NOTE(ARGUNUSED(enp, bufferp, buffer_size))
 
@@ -494,8 +451,7 @@ efx_lic_v1v2_find_key(
        __in                    size_t buffer_size,
        __in                    uint32_t offset,
        __out                   uint32_t *startp,
-       __out                   uint32_t *lengthp
-       )
+       __out                   uint32_t *lengthp)
 {
        boolean_t found;
        uint16_t tlv_type;
@@ -519,7 +475,7 @@ efx_lic_v1v2_find_key(
        return (found);
 
 fail1:
-       EFSYS_PROBE(fail1);
+       EFSYS_PROBE1(fail1, boolean_t, B_FALSE);
 
        return (B_FALSE);
 }
@@ -528,8 +484,7 @@ fail1:
 efx_lic_v1v2_validate_key(
        __in                    efx_nic_t *enp,
        __in_bcount(length)     caddr_t keyp,
-       __in                    uint32_t length
-       )
+       __in                    uint32_t length)
 {
        uint16_t tlv_type;
        uint16_t tlv_length;
@@ -562,7 +517,7 @@ fail3:
 fail2:
        EFSYS_PROBE(fail2);
 fail1:
-       EFSYS_PROBE(fail1);
+       EFSYS_PROBE1(fail1, boolean_t, B_FALSE);
 
        return (B_FALSE);
 }
@@ -579,12 +534,11 @@ efx_lic_v1v2_read_key(
        __out_bcount_part(key_max_size, *lengthp)
                                caddr_t keyp,
        __in                    size_t key_max_size,
-       __out                   uint32_t *lengthp
-       )
+       __out                   uint32_t *lengthp)
 {
        efx_rc_t rc;
 
-       _NOTE(ARGUNUSED(enp))
+       _NOTE(ARGUNUSED(enp, buffer_size))
        EFSYS_ASSERT(length <= (EFX_LICENSE_V1V2_PAYLOAD_LENGTH_MAX +
            EFX_LICENSE_V1V2_HEADER_LENGTH));
 
@@ -613,8 +567,7 @@ efx_lic_v1v2_write_key(
        __in                    uint32_t offset,
        __in_bcount(length)     caddr_t keyp,
        __in                    uint32_t length,
-       __out                   uint32_t *lengthp
-       )
+       __out                   uint32_t *lengthp)
 {
        efx_rc_t rc;
 
@@ -650,13 +603,12 @@ efx_lic_v1v2_delete_key(
        __in                    uint32_t offset,
        __in                    uint32_t length,
        __in                    uint32_t end,
-       __out                   uint32_t *deltap
-       )
+       __out                   uint32_t *deltap)
 {
        uint32_t move_start = offset + length;
        uint32_t move_length = end - move_start;
 
-       _NOTE(ARGUNUSED(enp))
+       _NOTE(ARGUNUSED(enp, buffer_size))
        EFSYS_ASSERT(end <= buffer_size);
 
        /* Shift everything after the key down */
@@ -672,10 +624,9 @@ efx_lic_v1v2_create_partition(
        __in                    efx_nic_t *enp,
        __in_bcount(buffer_size)
                                caddr_t bufferp,
-       __in                    size_t buffer_size
-       )
+       __in                    size_t buffer_size)
 {
-       _NOTE(ARGUNUSED(enp))
+       _NOTE(ARGUNUSED(enp, buffer_size))
        EFSYS_ASSERT(EFX_LICENSE_V1V2_HEADER_LENGTH <= buffer_size);
 
        /* Write terminator */
@@ -689,8 +640,7 @@ efx_lic_v1v2_finish_partition(
        __in                    efx_nic_t *enp,
        __in_bcount(buffer_size)
                                caddr_t bufferp,
-       __in                    size_t buffer_size
-       )
+       __in                    size_t buffer_size)
 {
        _NOTE(ARGUNUSED(enp, bufferp, buffer_size))
 
@@ -711,8 +661,8 @@ efx_mcdi_licensed_app_state(
        __out           boolean_t *licensedp)
 {
        efx_mcdi_req_t req;
-       uint8_t payload[MAX(MC_CMD_GET_LICENSED_APP_STATE_IN_LEN,
-                           MC_CMD_GET_LICENSED_APP_STATE_OUT_LEN)];
+       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_GET_LICENSED_APP_STATE_IN_LEN,
+               MC_CMD_GET_LICENSED_APP_STATE_OUT_LEN);
        uint32_t app_state;
        efx_rc_t rc;
 
@@ -724,7 +674,6 @@ efx_mcdi_licensed_app_state(
                goto fail1;
        }
 
-       (void) memset(payload, 0, sizeof (payload));
        req.emr_cmd = MC_CMD_GET_LICENSED_APP_STATE;
        req.emr_in_buf = payload;
        req.emr_in_length = MC_CMD_GET_LICENSED_APP_STATE_IN_LEN;
@@ -770,12 +719,11 @@ efx_mcdi_licensing_update_licenses(
        __in            efx_nic_t *enp)
 {
        efx_mcdi_req_t req;
-       uint8_t payload[MC_CMD_LICENSING_IN_LEN];
+       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_LICENSING_IN_LEN, 0);
        efx_rc_t rc;
 
        EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON);
 
-       (void) memset(payload, 0, sizeof (payload));
        req.emr_cmd = MC_CMD_LICENSING;
        req.emr_in_buf = payload;
        req.emr_in_length = MC_CMD_LICENSING_IN_LEN;
@@ -813,13 +761,12 @@ efx_mcdi_licensing_get_key_stats(
        __out           efx_key_stats_t *eksp)
 {
        efx_mcdi_req_t req;
-       uint8_t payload[MAX(MC_CMD_LICENSING_IN_LEN,
-                           MC_CMD_LICENSING_OUT_LEN)];
+       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_LICENSING_IN_LEN,
+               MC_CMD_LICENSING_OUT_LEN);
        efx_rc_t rc;
 
        EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON);
 
-       (void) memset(payload, 0, sizeof (payload));
        req.emr_cmd = MC_CMD_LICENSING;
        req.emr_in_buf = payload;
        req.emr_in_length = MC_CMD_LICENSING_IN_LEN;
@@ -870,19 +817,19 @@ fail1:
 
 /* V3 Licensing - used starting from Medford family. See SF-114884-SW */
 
-#if EFSYS_OPT_MEDFORD
+#if EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
 
 static __checkReturn   efx_rc_t
 efx_mcdi_licensing_v3_update_licenses(
        __in            efx_nic_t *enp)
 {
        efx_mcdi_req_t req;
-       uint8_t payload[MC_CMD_LICENSING_V3_IN_LEN];
+       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_LICENSING_V3_IN_LEN, 0);
        efx_rc_t rc;
 
-       EFSYS_ASSERT(enp->en_family == EFX_FAMILY_MEDFORD);
+       EFSYS_ASSERT((enp->en_family == EFX_FAMILY_MEDFORD) ||
+           (enp->en_family == EFX_FAMILY_MEDFORD2));
 
-       (void) memset(payload, 0, sizeof (payload));
        req.emr_cmd = MC_CMD_LICENSING_V3;
        req.emr_in_buf = payload;
        req.emr_in_length = MC_CMD_LICENSING_V3_IN_LEN;
@@ -913,13 +860,13 @@ efx_mcdi_licensing_v3_report_license(
        __out           efx_key_stats_t *eksp)
 {
        efx_mcdi_req_t req;
-       uint8_t payload[MAX(MC_CMD_LICENSING_V3_IN_LEN,
-                           MC_CMD_LICENSING_V3_OUT_LEN)];
+       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_LICENSING_V3_IN_LEN,
+               MC_CMD_LICENSING_V3_OUT_LEN);
        efx_rc_t rc;
 
-       EFSYS_ASSERT(enp->en_family == EFX_FAMILY_MEDFORD);
+       EFSYS_ASSERT((enp->en_family == EFX_FAMILY_MEDFORD) ||
+           (enp->en_family == EFX_FAMILY_MEDFORD2));
 
-       (void) memset(payload, 0, sizeof (payload));
        req.emr_cmd = MC_CMD_LICENSING_V3;
        req.emr_in_buf = payload;
        req.emr_in_length = MC_CMD_LICENSING_V3_IN_LEN;
@@ -976,14 +923,14 @@ efx_mcdi_licensing_v3_app_state(
        __out           boolean_t *licensedp)
 {
        efx_mcdi_req_t req;
-       uint8_t payload[MAX(MC_CMD_GET_LICENSED_V3_APP_STATE_IN_LEN,
-                           MC_CMD_GET_LICENSED_V3_APP_STATE_OUT_LEN)];
+       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_GET_LICENSED_V3_APP_STATE_IN_LEN,
+               MC_CMD_GET_LICENSED_V3_APP_STATE_OUT_LEN);
        uint32_t app_state;
        efx_rc_t rc;
 
-       EFSYS_ASSERT(enp->en_family == EFX_FAMILY_MEDFORD);
+       EFSYS_ASSERT((enp->en_family == EFX_FAMILY_MEDFORD) ||
+           (enp->en_family == EFX_FAMILY_MEDFORD2));
 
-       (void) memset(payload, 0, sizeof (payload));
        req.emr_cmd = MC_CMD_GET_LICENSED_V3_APP_STATE;
        req.emr_in_buf = payload;
        req.emr_in_length = MC_CMD_GET_LICENSED_V3_APP_STATE_IN_LEN;
@@ -1002,7 +949,8 @@ efx_mcdi_licensing_v3_app_state(
                goto fail1;
        }
 
-       if (req.emr_out_length_used < MC_CMD_GET_LICENSED_V3_APP_STATE_OUT_LEN) {
+       if (req.emr_out_length_used <
+           MC_CMD_GET_LICENSED_V3_APP_STATE_OUT_LEN) {
                rc = EMSGSIZE;
                goto fail2;
        }
@@ -1034,27 +982,15 @@ efx_mcdi_licensing_v3_get_id(
                        uint8_t *bufferp)
 {
        efx_mcdi_req_t req;
-       uint8_t payload[MAX(MC_CMD_LICENSING_GET_ID_V3_IN_LEN,
-                           MC_CMD_LICENSING_GET_ID_V3_OUT_LENMIN)];
+       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_LICENSING_GET_ID_V3_IN_LEN,
+               MC_CMD_LICENSING_GET_ID_V3_OUT_LENMAX);
        efx_rc_t rc;
 
        req.emr_cmd = MC_CMD_LICENSING_GET_ID_V3;
-
-       if (bufferp == NULL) {
-               /* Request id type and length only */
-               req.emr_in_buf = bufferp;
-               req.emr_in_length = MC_CMD_LICENSING_GET_ID_V3_IN_LEN;
-               req.emr_out_buf = bufferp;
-               req.emr_out_length = MC_CMD_LICENSING_GET_ID_V3_OUT_LENMIN;
-               (void) memset(payload, 0, sizeof (payload));
-       } else {
-               /* Request full buffer */
-               req.emr_in_buf = bufferp;
-               req.emr_in_length = MC_CMD_LICENSING_GET_ID_V3_IN_LEN;
-               req.emr_out_buf = bufferp;
-               req.emr_out_length = MIN(buffer_size, MC_CMD_LICENSING_GET_ID_V3_OUT_LENMAX);
-               (void) memset(bufferp, 0, req.emr_out_length);
-       }
+       req.emr_in_buf = payload;
+       req.emr_in_length = MC_CMD_LICENSING_GET_ID_V3_IN_LEN;
+       req.emr_out_buf = payload;
+       req.emr_out_length = MC_CMD_LICENSING_GET_ID_V3_OUT_LENMAX;
 
        efx_mcdi_execute_quiet(enp, &req);
 
@@ -1069,20 +1005,13 @@ efx_mcdi_licensing_v3_get_id(
        }
 
        *typep = MCDI_OUT_DWORD(req, LICENSING_GET_ID_V3_OUT_LICENSE_TYPE);
-       *lengthp = MCDI_OUT_DWORD(req, LICENSING_GET_ID_V3_OUT_LICENSE_ID_LENGTH);
+       *lengthp =
+           MCDI_OUT_DWORD(req, LICENSING_GET_ID_V3_OUT_LICENSE_ID_LENGTH);
 
-       if (bufferp == NULL) {
-               /* modify length requirements to indicate to caller the extra buffering
-               ** needed to read the complete output.
-               */
-               *lengthp += MC_CMD_LICENSING_GET_ID_V3_OUT_LENMIN;
-       } else {
-               /* Shift ID down to start of buffer */
-               memmove(bufferp,
-                   bufferp + MC_CMD_LICENSING_GET_ID_V3_OUT_LICENSE_ID_OFST,
-                   *lengthp);
-               memset(bufferp + (*lengthp), 0,
-                   MC_CMD_LICENSING_GET_ID_V3_OUT_LICENSE_ID_OFST);
+       if (bufferp != NULL) {
+               memcpy(bufferp,
+                   payload + MC_CMD_LICENSING_GET_ID_V3_OUT_LICENSE_ID_OFST,
+                   MIN(buffer_size, *lengthp));
        }
 
        return (0);
@@ -1096,8 +1025,8 @@ fail1:
 }
 
 /* V3 format uses Huntington TLV format partition. See SF-108797-SW */
-#define EFX_LICENSE_V3_KEY_LENGTH_MIN    (64)
-#define EFX_LICENSE_V3_KEY_LENGTH_MAX    (160)
+#define        EFX_LICENSE_V3_KEY_LENGTH_MIN   (64)
+#define        EFX_LICENSE_V3_KEY_LENGTH_MAX   (160)
 
        __checkReturn           efx_rc_t
 efx_lic_v3_find_start(
@@ -1105,12 +1034,12 @@ efx_lic_v3_find_start(
        __in_bcount(buffer_size)
                                caddr_t bufferp,
        __in                    size_t buffer_size,
-       __out                   uint32_t *startp
-       )
+       __out                   uint32_t *startp)
 {
        _NOTE(ARGUNUSED(enp))
 
-       return ef10_nvram_buffer_find_item_start(bufferp, buffer_size, startp);
+       return (ef10_nvram_buffer_find_item_start(bufferp, buffer_size,
+           startp));
 }
 
        __checkReturn           efx_rc_t
@@ -1120,12 +1049,11 @@ efx_lic_v3_find_end(
                                caddr_t bufferp,
        __in                    size_t buffer_size,
        __in                    uint32_t offset,
-       __out                   uint32_t *endp
-       )
+       __out                   uint32_t *endp)
 {
        _NOTE(ARGUNUSED(enp))
 
-       return ef10_nvram_buffer_find_end(bufferp, buffer_size, offset, endp);
+       return (ef10_nvram_buffer_find_end(bufferp, buffer_size, offset, endp));
 }
 
        __checkReturn   __success(return != B_FALSE)    boolean_t
@@ -1136,8 +1064,7 @@ efx_lic_v3_find_key(
        __in                    size_t buffer_size,
        __in                    uint32_t offset,
        __out                   uint32_t *startp,
-       __out                   uint32_t *lengthp
-       )
+       __out                   uint32_t *lengthp)
 {
        _NOTE(ARGUNUSED(enp))
 
@@ -1149,8 +1076,7 @@ efx_lic_v3_find_key(
 efx_lic_v3_validate_key(
        __in                    efx_nic_t *enp,
        __in_bcount(length)     caddr_t keyp,
-       __in                    uint32_t length
-       )
+       __in                    uint32_t length)
 {
        /* Check key is a valid V3 key */
        uint8_t key_type;
@@ -1184,7 +1110,7 @@ fail3:
 fail2:
        EFSYS_PROBE(fail2);
 fail1:
-       EFSYS_PROBE(fail1);
+       EFSYS_PROBE1(fail1, boolean_t, B_FALSE);
 
        return (B_FALSE);
 }
@@ -1200,13 +1126,14 @@ efx_lic_v3_read_key(
        __out_bcount_part(key_max_size, *lengthp)
                                caddr_t keyp,
        __in                    size_t key_max_size,
-       __out                   uint32_t *lengthp
-       )
+       __out                   uint32_t *lengthp)
 {
+       uint32_t tag;
+
        _NOTE(ARGUNUSED(enp))
 
        return ef10_nvram_buffer_get_item(bufferp, buffer_size,
-                   offset, length, keyp, key_max_size, lengthp);
+                   offset, length, &tag, keyp, key_max_size, lengthp);
 }
 
        __checkReturn           efx_rc_t
@@ -1218,14 +1145,13 @@ efx_lic_v3_write_key(
        __in                    uint32_t offset,
        __in_bcount(length)     caddr_t keyp,
        __in                    uint32_t length,
-       __out                   uint32_t *lengthp
-       )
+       __out                   uint32_t *lengthp)
 {
        _NOTE(ARGUNUSED(enp))
        EFSYS_ASSERT(length <= EFX_LICENSE_V3_KEY_LENGTH_MAX);
 
        return ef10_nvram_buffer_insert_item(bufferp, buffer_size,
-                   offset, keyp, length, lengthp);
+                   offset, TLV_TAG_LICENSE, keyp, length, lengthp);
 }
 
        __checkReturn           efx_rc_t
@@ -1237,8 +1163,7 @@ efx_lic_v3_delete_key(
        __in                    uint32_t offset,
        __in                    uint32_t length,
        __in                    uint32_t end,
-       __out                   uint32_t *deltap
-       )
+       __out                   uint32_t *deltap)
 {
        efx_rc_t rc;
 
@@ -1264,13 +1189,14 @@ efx_lic_v3_create_partition(
        __in                    efx_nic_t *enp,
        __in_bcount(buffer_size)
                                caddr_t bufferp,
-       __in                    size_t buffer_size
-       )
+       __in                    size_t buffer_size)
 {
        efx_rc_t rc;
 
+       _NOTE(ARGUNUSED(enp))
+
        /* Construct empty partition */
-       if ((rc = ef10_nvram_buffer_create(enp,
+       if ((rc = ef10_nvram_buffer_create(
            NVRAM_PARTITION_TYPE_LICENSE,
            bufferp, buffer_size)) != 0) {
                rc = EFAULT;
@@ -1290,18 +1216,20 @@ efx_lic_v3_finish_partition(
        __in                    efx_nic_t *enp,
        __in_bcount(buffer_size)
                                caddr_t bufferp,
-       __in                    size_t buffer_size
-       )
+       __in                    size_t buffer_size)
 {
        efx_rc_t rc;
 
+       _NOTE(ARGUNUSED(enp))
+
        if ((rc = ef10_nvram_buffer_finish(bufferp,
                        buffer_size)) != 0) {
                goto fail1;
        }
 
        /* Validate completed partition */
-       if ((rc = ef10_nvram_buffer_validate(enp, NVRAM_PARTITION_TYPE_LICENSE,
+       if ((rc = ef10_nvram_buffer_validate(
+                                       NVRAM_PARTITION_TYPE_LICENSE,
                                        bufferp, buffer_size)) != 0) {
                goto fail2;
        }
@@ -1317,7 +1245,7 @@ fail1:
 }
 
 
-#endif /* EFSYS_OPT_MEDFORD */
+#endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
 
        __checkReturn           efx_rc_t
 efx_lic_init(
@@ -1351,6 +1279,12 @@ efx_lic_init(
                break;
 #endif /* EFSYS_OPT_MEDFORD */
 
+#if EFSYS_OPT_MEDFORD2
+       case EFX_FAMILY_MEDFORD2:
+               elop = &__efx_lic_v3_ops;
+               break;
+#endif /* EFSYS_OPT_MEDFORD2 */
+
        default:
                EFSYS_ASSERT(0);
                rc = ENOTSUP;
@@ -1383,7 +1317,7 @@ efx_lic_check_support(
        EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
        EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);
 
-       return enp->en_licensing_supported;
+       return (enp->en_licensing_supported);
 }
 
                                void
@@ -1474,8 +1408,7 @@ efx_lic_get_id(
        __in            size_t buffer_size,
        __out           uint32_t *typep,
        __out           size_t *lengthp,
-       __out_opt       uint8_t *bufferp
-       )
+       __out_opt       uint8_t *bufferp)
 {
        const efx_lic_ops_t *elop = enp->en_elop;
        efx_rc_t rc;
@@ -1498,7 +1431,10 @@ fail1:
        return (rc);
 }
 
-/* Buffer management API - abstracts varying TLV format used for License partition */
+/*
+ * Buffer management API - abstracts varying TLV format used for License
+ * partition.
+ */
 
        __checkReturn           efx_rc_t
 efx_lic_find_start(
@@ -1506,8 +1442,7 @@ efx_lic_find_start(
        __in_bcount(buffer_size)
                                caddr_t bufferp,
        __in                    size_t buffer_size,
-       __out                   uint32_t *startp
-       )
+       __out                   uint32_t *startp)
 {
        const efx_lic_ops_t *elop = enp->en_elop;
        efx_rc_t rc;
@@ -1533,8 +1468,7 @@ efx_lic_find_end(
                                caddr_t bufferp,
        __in                    size_t buffer_size,
        __in                    uint32_t offset,
-       __out                   uint32_t *endp
-       )
+       __out                   uint32_t *endp)
 {
        const efx_lic_ops_t *elop = enp->en_elop;
        efx_rc_t rc;
@@ -1542,7 +1476,8 @@ efx_lic_find_end(
        EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
        EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);
 
-       if ((rc = elop->elo_find_end(enp, bufferp, buffer_size, offset, endp)) != 0)
+       rc = elop->elo_find_end(enp, bufferp, buffer_size, offset, endp);
+       if (rc != 0)
                goto fail1;
 
        return (0);
@@ -1561,8 +1496,7 @@ efx_lic_find_key(
        __in                    size_t buffer_size,
        __in                    uint32_t offset,
        __out                   uint32_t *startp,
-       __out                   uint32_t *lengthp
-       )
+       __out                   uint32_t *lengthp)
 {
        const efx_lic_ops_t *elop = enp->en_elop;
 
@@ -1578,15 +1512,15 @@ efx_lic_find_key(
 }
 
 
-/* Validate that the buffer contains a single key in a recognised format.
-** An empty or terminator buffer is not accepted as a valid key.
-*/
+/*
+ * Validate that the buffer contains a single key in a recognised format.
+ * An empty or terminator buffer is not accepted as a valid key.
+ */
        __checkReturn   __success(return != B_FALSE)    boolean_t
 efx_lic_validate_key(
        __in                    efx_nic_t *enp,
        __in_bcount(length)     caddr_t keyp,
-       __in                    uint32_t length
-       )
+       __in                    uint32_t length)
 {
        const efx_lic_ops_t *elop = enp->en_elop;
        boolean_t rc;
@@ -1616,8 +1550,7 @@ efx_lic_read_key(
        __out_bcount_part(key_max_size, *lengthp)
                                caddr_t keyp,
        __in                    size_t key_max_size,
-       __out                   uint32_t *lengthp
-       )
+       __out                   uint32_t *lengthp)
 {
        const efx_lic_ops_t *elop = enp->en_elop;
        efx_rc_t rc;
@@ -1646,8 +1579,7 @@ efx_lic_write_key(
        __in                    uint32_t offset,
        __in_bcount(length)     caddr_t keyp,
        __in                    uint32_t length,
-       __out                   uint32_t *lengthp
-       )
+       __out                   uint32_t *lengthp)
 {
        const efx_lic_ops_t *elop = enp->en_elop;
        efx_rc_t rc;
@@ -1676,8 +1608,7 @@ efx_lic_delete_key(
        __in                    uint32_t offset,
        __in                    uint32_t length,
        __in                    uint32_t end,
-       __out                   uint32_t *deltap
-       )
+       __out                   uint32_t *deltap)
 {
        const efx_lic_ops_t *elop = enp->en_elop;
        efx_rc_t rc;
@@ -1702,8 +1633,7 @@ efx_lic_create_partition(
        __in                    efx_nic_t *enp,
        __in_bcount(buffer_size)
                                caddr_t bufferp,
-       __in                    size_t buffer_size
-       )
+       __in                    size_t buffer_size)
 {
        const efx_lic_ops_t *elop = enp->en_elop;
        efx_rc_t rc;
@@ -1728,8 +1658,7 @@ efx_lic_finish_partition(
        __in                    efx_nic_t *enp,
        __in_bcount(buffer_size)
                                caddr_t bufferp,
-       __in                    size_t buffer_size
-       )
+       __in                    size_t buffer_size)
 {
        const efx_lic_ops_t *elop = enp->en_elop;
        efx_rc_t rc;