49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Copyright (c) 2012-2015 Solarflare Communications Inc.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * All rights reserved.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Redistribution and use in source and binary forms, with or without
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * modification, are permitted provided that the following conditions are met:
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * 1. Redistributions of source code must retain the above copyright notice,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * this list of conditions and the following disclaimer.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * 2. Redistributions in binary form must reproduce the above copyright notice,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * this list of conditions and the following disclaimer in the documentation
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * and/or other materials provided with the distribution.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * The views and conclusions contained in the software and documentation are
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * those of the authors and should not be interpreted as representing official
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * policies, either expressed or implied, of the FreeBSD Project.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t payload[MAX(MC_CMD_GET_PORT_ASSIGNMENT_IN_LEN,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON ||
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (void) memset(payload, 0, sizeof (payload));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_in_length = MC_CMD_GET_PORT_ASSIGNMENT_IN_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_out_length = MC_CMD_GET_PORT_ASSIGNMENT_OUT_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (req.emr_out_length_used < MC_CMD_GET_PORT_ASSIGNMENT_OUT_LEN) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *portp = MCDI_OUT_DWORD(req, GET_PORT_ASSIGNMENT_OUT_PORT);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t payload[MAX(MC_CMD_GET_PORT_MODES_IN_LEN,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON ||
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (void) memset(payload, 0, sizeof (payload));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_in_length = MC_CMD_GET_PORT_MODES_IN_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_out_length = MC_CMD_GET_PORT_MODES_OUT_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Require only Modes and DefaultMode fields.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * (CurrentMode field was added for Medford)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore MC_CMD_GET_PORT_MODES_OUT_CURRENT_MODE_OFST) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *modesp = MCDI_OUT_DWORD(req, GET_PORT_MODES_OUT_MODES);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t payload[MAX(MC_CMD_VADAPTOR_ALLOC_IN_LEN,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_vport_id, ==, EVB_PORT_ID_NULL);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (void) memset(payload, 0, sizeof (payload));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_in_length = MC_CMD_VADAPTOR_ALLOC_IN_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_out_length = MC_CMD_VADAPTOR_ALLOC_OUT_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore MCDI_IN_SET_DWORD(req, VADAPTOR_ALLOC_IN_UPSTREAM_PORT_ID, port_id);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore MCDI_IN_POPULATE_DWORD_1(req, VADAPTOR_ALLOC_IN_FLAGS,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore VADAPTOR_ALLOC_IN_FLAG_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore enp->en_nic_cfg.enc_allow_set_mac_with_installed_filters ? 1 : 0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t payload[MAX(MC_CMD_VADAPTOR_FREE_IN_LEN,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (void) memset(payload, 0, sizeof (payload));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_in_length = MC_CMD_VADAPTOR_FREE_IN_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_out_length = MC_CMD_VADAPTOR_FREE_OUT_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore MCDI_IN_SET_DWORD(req, VADAPTOR_FREE_IN_UPSTREAM_PORT_ID, port_id);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t payload[MAX(MC_CMD_GET_MAC_ADDRESSES_IN_LEN,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON ||
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (void) memset(payload, 0, sizeof (payload));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_in_length = MC_CMD_GET_MAC_ADDRESSES_IN_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_out_length = MC_CMD_GET_MAC_ADDRESSES_OUT_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (req.emr_out_length_used < MC_CMD_GET_MAC_ADDRESSES_OUT_LEN) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (MCDI_OUT_DWORD(req, GET_MAC_ADDRESSES_OUT_MAC_COUNT) < 1) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t payload[MAX(MC_CMD_VPORT_GET_MAC_ADDRESSES_IN_LEN,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore MC_CMD_VPORT_GET_MAC_ADDRESSES_OUT_LENMAX)];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON ||
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (void) memset(payload, 0, sizeof (payload));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_cmd = MC_CMD_VPORT_GET_MAC_ADDRESSES;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_in_length = MC_CMD_VPORT_GET_MAC_ADDRESSES_IN_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_out_length = MC_CMD_VPORT_GET_MAC_ADDRESSES_OUT_LENMAX;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore MCDI_IN_SET_DWORD(req, VPORT_GET_MAC_ADDRESSES_IN_VPORT_ID,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore MC_CMD_VPORT_GET_MAC_ADDRESSES_OUT_LENMIN) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore VPORT_GET_MAC_ADDRESSES_OUT_MACADDR_COUNT) < 1) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t payload[MAX(MC_CMD_GET_CLOCK_IN_LEN,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON ||
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (void) memset(payload, 0, sizeof (payload));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_in_length = MC_CMD_GET_CLOCK_IN_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_out_length = MC_CMD_GET_CLOCK_OUT_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (req.emr_out_length_used < MC_CMD_GET_CLOCK_OUT_LEN) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *sys_freqp = MCDI_OUT_DWORD(req, GET_CLOCK_OUT_SYS_FREQ);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t payload[MAX(MC_CMD_GET_VECTOR_CFG_IN_LEN,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (void) memset(payload, 0, sizeof (payload));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_in_length = MC_CMD_GET_VECTOR_CFG_IN_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_out_length = MC_CMD_GET_VECTOR_CFG_OUT_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (req.emr_out_length_used < MC_CMD_GET_VECTOR_CFG_OUT_LEN) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *vec_basep = MCDI_OUT_DWORD(req, GET_VECTOR_CFG_OUT_VEC_BASE);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *pf_nvecp = MCDI_OUT_DWORD(req, GET_VECTOR_CFG_OUT_VECS_PER_PF);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *vf_nvecp = MCDI_OUT_DWORD(req, GET_VECTOR_CFG_OUT_VECS_PER_VF);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t payload[MAX(MC_CMD_GET_CAPABILITIES_IN_LEN,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (void) memset(payload, 0, sizeof (payload));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_in_length = MC_CMD_GET_CAPABILITIES_IN_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_out_length = MC_CMD_GET_CAPABILITIES_V2_OUT_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (req.emr_out_length_used < MC_CMD_GET_CAPABILITIES_OUT_LEN) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *flagsp = MCDI_OUT_DWORD(req, GET_CAPABILITIES_OUT_FLAGS1);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (req.emr_out_length_used < MC_CMD_GET_CAPABILITIES_V2_OUT_LEN)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *flags2p = MCDI_OUT_DWORD(req, GET_CAPABILITIES_V2_OUT_FLAGS2);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t payload[MAX(MC_CMD_ALLOC_VIS_IN_LEN,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (void) memset(payload, 0, sizeof (payload));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_in_length = MC_CMD_ALLOC_VIS_IN_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_out_length = MC_CMD_ALLOC_VIS_OUT_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore MCDI_IN_SET_DWORD(req, ALLOC_VIS_IN_MIN_VI_COUNT, min_vi_count);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore MCDI_IN_SET_DWORD(req, ALLOC_VIS_IN_MAX_VI_COUNT, max_vi_count);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (req.emr_out_length_used < MC_CMD_ALLOC_VIS_OUT_LEN) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *vi_basep = MCDI_OUT_DWORD(req, ALLOC_VIS_OUT_VI_BASE);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *vi_countp = MCDI_OUT_DWORD(req, ALLOC_VIS_OUT_VI_COUNT);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Report VI_SHIFT if available (always zero for Huntington) */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (req.emr_out_length_used < MC_CMD_ALLOC_VIS_EXT_OUT_LEN)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *vi_shiftp = MCDI_OUT_DWORD(req, ALLOC_VIS_EXT_OUT_VI_SHIFT);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_STATIC_ASSERT(MC_CMD_FREE_VIS_IN_LEN == 0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_STATIC_ASSERT(MC_CMD_FREE_VIS_OUT_LEN == 0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Ignore ELREADY (no allocated VIs, so nothing to free) */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if ((req.emr_rc != 0) && (req.emr_rc != EALREADY)) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t payload[MAX(MC_CMD_ALLOC_PIOBUF_IN_LEN,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (void) memset(payload, 0, sizeof (payload));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_in_length = MC_CMD_ALLOC_PIOBUF_IN_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_out_length = MC_CMD_ALLOC_PIOBUF_OUT_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (req.emr_out_length_used < MC_CMD_ALLOC_PIOBUF_OUT_LEN) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *handlep = MCDI_OUT_DWORD(req, ALLOC_PIOBUF_OUT_PIOBUF_HANDLE);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t payload[MAX(MC_CMD_FREE_PIOBUF_IN_LEN,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (void) memset(payload, 0, sizeof (payload));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_in_length = MC_CMD_FREE_PIOBUF_IN_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_out_length = MC_CMD_FREE_PIOBUF_OUT_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore MCDI_IN_SET_DWORD(req, FREE_PIOBUF_IN_PIOBUF_HANDLE, handle);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t payload[MAX(MC_CMD_LINK_PIOBUF_IN_LEN,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (void) memset(payload, 0, sizeof (payload));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_in_length = MC_CMD_LINK_PIOBUF_IN_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_out_length = MC_CMD_LINK_PIOBUF_OUT_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore MCDI_IN_SET_DWORD(req, LINK_PIOBUF_IN_PIOBUF_HANDLE, handle);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore MCDI_IN_SET_DWORD(req, LINK_PIOBUF_IN_TXQ_INSTANCE, vi_index);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t payload[MAX(MC_CMD_UNLINK_PIOBUF_IN_LEN,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (void) memset(payload, 0, sizeof (payload));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_in_length = MC_CMD_UNLINK_PIOBUF_IN_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_out_length = MC_CMD_UNLINK_PIOBUF_OUT_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore MCDI_IN_SET_DWORD(req, UNLINK_PIOBUF_IN_TXQ_INSTANCE, vi_index);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int i;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_ARRAY_SIZE(enp->en_arch.ef10.ena_piobuf_handle));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore for (i = 0; i < max_piobuf_count; i++) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore handlep = &enp->en_arch.ef10.ena_piobuf_handle[i];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (efx_mcdi_alloc_piobuf(enp, handlep) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore for (i = 0; i < enp->en_arch.ef10.ena_piobuf_count; i++) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore handlep = &enp->en_arch.ef10.ena_piobuf_handle[i];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int i;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore for (i = 0; i < enp->en_arch.ef10.ena_piobuf_count; i++) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore handlep = &enp->en_arch.ef10.ena_piobuf_handle[i];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore/* Sub-allocate a block from a piobuf */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON ||
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (enp->en_arch.ef10.ena_piobuf_count == 0)) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore blk_per_buf = encp->enc_piobuf_size / edcp->edc_pio_alloc_size;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore for (buf = 0; buf < enp->en_arch.ef10.ena_piobuf_count; buf++) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t *map = &enp->en_arch.ef10.ena_pio_alloc_map[buf];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (~(*map) == 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(blk_per_buf, <=, (8 * sizeof (*map)));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *handlep = enp->en_arch.ef10.ena_piobuf_handle[buf];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore/* Free a piobuf sub-allocated block */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if ((bufnum >= enp->en_arch.ef10.ena_piobuf_count) ||
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore map = &enp->en_arch.ef10.ena_pio_alloc_map[bufnum];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore return (efx_mcdi_link_piobuf(enp, vi_index, handle));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore return (efx_mcdi_unlink_piobuf(enp, vi_index));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if ((rc = efx_mcdi_get_capabilities(enp, &flags, &flags2)) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ((flags1) & (1 << (MC_CMD_GET_CAPABILITIES_V2_OUT_ ## field ## _LBN)))
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ((flags2) & (1 << (MC_CMD_GET_CAPABILITIES_V2_OUT_ ## field ## _LBN)))
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Huntington RXDP firmware inserts a 0 or 14 byte prefix.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * We only support the 14 byte prefix here.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (CAP_FLAG(flags, RX_PREFIX_LEN_14) == 0) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Check if the firmware supports TSO */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Check if the firmware supports FATSOv2 */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore CAP_FLAG2(flags2, TX_TSO_V2) ? B_TRUE : B_FALSE;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Check if the firmware has vadapter/vport/vswitch support */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Check if the firmware supports VLAN insertion */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore CAP_FLAG(flags, TX_VLAN_INSERTION) ? B_TRUE : B_FALSE;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Check if the firmware supports RX event batching */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore CAP_FLAG(flags, RX_BATCHING) ? B_TRUE : B_FALSE;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Check if the firmware supports disabling scatter on RXQs */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore CAP_FLAG(flags, RX_DISABLE_SCATTER) ? B_TRUE : B_FALSE;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Check if the firmware supports set mac with running filters */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore encp->enc_allow_set_mac_with_installed_filters =
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore CAP_FLAG(flags, VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED) ?
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Check if firmware supports the extended MC_CMD_SET_MAC, which allows
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * specifying which parameters to configure.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore CAP_FLAG(flags, SET_MAC_ENHANCED) ? B_TRUE : B_FALSE;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore MC_CMD_PRIVILEGE_MASK_IN_GRP_INSECURE_FILTERS | \
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore MC_CMD_PRIVILEGE_MASK_IN_GRP_MAC_SPOOFING | \
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore MC_CMD_PRIVILEGE_MASK_IN_GRP_ALL_MULTICAST | \
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if ((rc = efx_mcdi_privilege_mask(enp, encp->enc_pf, encp->enc_vf,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Fallback for old firmware without privilege mask support */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Assume PF has admin privilege */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* VF is always unprivileged by default */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * The external port mapping is a one-based numbering of the external
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * connectors on the board. It does not distinguish off-board separated
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * outputs such as multi-headed cables.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * The number of ports that map to each external port connector
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * on the board is determined by the chip family and the port modes to
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * which the NIC can be configured. The mapping table lists modes with
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * port numbering requirements in increasing order.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic struct {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Supported modes requiring 1 output per port */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Supported modes requiring 2 outputs per port */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Supported modes requiring 4 outputs per port */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t stride = 1; /* default 1-1 mapping */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if ((rc = efx_mcdi_get_port_modes(enp, &port_modes)) != 0) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* No port mode information available - use default mapping */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Infer the internal port -> external port mapping from
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * the possible port modes for this NIC.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore for (i = 0; i < EFX_ARRAY_SIZE(__ef10_external_port_mappings); ++i) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (__ef10_external_port_mappings[i].family !=
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore matches = (__ef10_external_port_mappings[i].modes_mask &
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore stride = __ef10_external_port_mappings[i].stride;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Some advertised modes are not supported */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Scale as required by last matched mode and then convert to
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * one-based numbering
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *external_portp = (uint8_t)(port / stride) + 1;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON ||
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Read and clear any assertion state */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if ((rc = efx_mcdi_read_assertion(enp)) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Exit the assertion handler */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if ((rc = efx_mcdi_exit_assertion_handler(enp)) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if ((rc = efx_mcdi_drv_attach(enp, B_TRUE)) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Set default driver config limits (based on board config).
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * FIXME: For now allocate a fixed number of VIs which is likely to be
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * sufficient and small enough to allow multiple functions on the same
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore edcp->edc_min_vi_count = edcp->edc_max_vi_count =
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore MIN(128, MAX(encp->enc_rxq_limit, encp->enc_txq_limit));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* The client driver must configure and enable PIO buffer support */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Wipe the MAC statistics */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if ((rc = efx_mcdi_mac_stats_clear(enp)) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if ((rc = efx_mcdi_get_loopback_modes(enp)) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Unprivileged functions do not have access to sensors */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Get minimum required and maximum usable VI limits */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore min_evq_count = MIN(edlp->edl_min_evq_count, encp->enc_evq_limit);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore min_rxq_count = MIN(edlp->edl_min_rxq_count, encp->enc_rxq_limit);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore min_txq_count = MIN(edlp->edl_min_txq_count, encp->enc_txq_limit);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore MAX(min_evq_count, MAX(min_rxq_count, min_txq_count));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore max_evq_count = MIN(edlp->edl_max_evq_count, encp->enc_evq_limit);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore max_rxq_count = MIN(edlp->edl_max_rxq_count, encp->enc_rxq_limit);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore max_txq_count = MIN(edlp->edl_max_txq_count, encp->enc_txq_limit);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore MAX(max_evq_count, MAX(max_rxq_count, max_txq_count));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Check limits for sub-allocated piobuf blocks.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * PIO is optional, so don't fail if the limits are incorrect.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (edlp->edl_min_pio_alloc_size > encp->enc_piobuf_size)) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Disable PIO */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t blk_size, blk_count, blks_per_piobuf;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore blks_per_piobuf = encp->enc_piobuf_size / blk_size;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore blk_count = (encp->enc_piobuf_limit * blks_per_piobuf);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* A zero max pio alloc count means unlimited */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (edlp->edl_max_pio_alloc_count < blk_count)) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (blk_count + (blks_per_piobuf - 1)) / blks_per_piobuf;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t payload[MAX(MC_CMD_ENTITY_RESET_IN_LEN,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* ef10_nic_reset() is called to recover from BADASSERT failures. */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if ((rc = efx_mcdi_read_assertion(enp)) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if ((rc = efx_mcdi_exit_assertion_handler(enp)) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (void) memset(payload, 0, sizeof (payload));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_in_length = MC_CMD_ENTITY_RESET_IN_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore req.emr_out_length = MC_CMD_ENTITY_RESET_OUT_LEN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore MCDI_IN_POPULATE_DWORD_1(req, ENTITY_RESET_IN_FLAG,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ENTITY_RESET_IN_FUNCTION_RESOURCE_RESET, 1);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Clear RX/TX DMA queue errors */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore enp->en_reset_flags &= ~(EFX_RESET_RXQ_ERR | EFX_RESET_TXQ_ERR);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON ||
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Enable reporting of some events (e.g. link change) */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Allocate (optional) on-chip PIO buffers */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ef10_nic_alloc_piobufs(enp, edcp->edc_max_piobuf_count);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * For best performance, PIO writes should use a write-combined
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * (WC) memory mapping. Using a separate WC mapping for the PIO
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * aperture of each VI would be a burden to drivers (and not
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * possible if the host page size is >4Kbyte).
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * To avoid this we use a single uncached (UC) mapping for VI
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * register access, and a single WC mapping for extra VIs used
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * for PIO writes.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Each piobuf must be linked to a VI in the WC mapping, and to
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * each VI that is using a sub-allocated block from the piobuf.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore edcp->edc_max_vi_count + enp->en_arch.ef10.ena_piobuf_count;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Ensure that the previously attached driver's VIs are freed */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Reserve VI resources (EVQ+RXQ+TXQ) for this PCIe function. If this
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * fails then retrying the request for fewer VI resources may succeed.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if ((rc = efx_mcdi_alloc_vis(enp, min_vi_count, max_vi_count,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_PROBE2(vi_alloc, uint32_t, vi_base, uint32_t, vi_count);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (vi_count < min_vi_count + enp->en_arch.ef10.ena_piobuf_count) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Not enough extra VIs to map piobufs */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore vi_count - enp->en_arch.ef10.ena_piobuf_count;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Save UC memory mapping details */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore enp->en_arch.ef10.ena_uc_mem_map_offset = 0;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (enp->en_arch.ef10.ena_piobuf_count > 0) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Save WC memory mapping details */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Link piobufs to extra VIs in WC mapping */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (enp->en_arch.ef10.ena_piobuf_count > 0) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore for (i = 0; i < enp->en_arch.ef10.ena_piobuf_count; i++) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore enp->en_arch.ef10.ena_pio_write_vi_base + i,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Allocate a vAdaptor attached to our upstream vPort/pPort.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * On a VF, this may fail with MC_CMD_ERR_NO_EVB_PORT (ENOENT) if the PF
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * driver has yet to bring up the EVB port. See bug 56147. In this case,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * retry the request several times after waiting a while. The wait time
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * between retries starts small (10ms) and exponentially increases.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Total wait time is a little over two seconds. Retry logic in the
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * client driver may mean this whole loop is repeated if it continues to
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore while ((rc = efx_mcdi_vadaptor_alloc(enp, EVB_PORT_ID_ASSIGNED)) != 0) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (EFX_PCI_FUNCTION_IS_PF(&enp->en_nic_cfg) ||
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Do not retry alloc for PF, or for other errors on
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* VF startup before PF is ready. Retry allocation. */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Too many attempts */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_PROBE1(mcdi_no_evb_port_retry, int, retry);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore enp->en_nic_cfg.enc_mcdi_max_payload_length = MCDI_CTL_SDU_LEN_MAX_V2;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON ||
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Report VIs that the client driver can use.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Do not include VIs used for PIO buffer writes.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *vi_countp = enp->en_arch.ef10.ena_pio_write_vi_base;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON ||
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * TODO: Specify host memory mapping alignment and granularity
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * in efx_drv_limits_t so that they can be taken into account
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * when allocating extra VIs for PIO writes.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* UC mapped memory BAR region for VI registers */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *offsetp = enp->en_arch.ef10.ena_uc_mem_map_offset;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *sizep = enp->en_arch.ef10.ena_uc_mem_map_size;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* WC mapped memory BAR region for piobuf writes */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *offsetp = enp->en_arch.ef10.ena_wc_mem_map_offset;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *sizep = enp->en_arch.ef10.ena_wc_mem_map_size;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (void) efx_mcdi_vadaptor_free(enp, enp->en_vport_id);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Unlink piobufs from extra VIs in WC mapping */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (enp->en_arch.ef10.ena_piobuf_count > 0) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore for (i = 0; i < enp->en_arch.ef10.ena_piobuf_count; i++) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore enp->en_arch.ef10.ena_pio_write_vi_base + i);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#endif /* EFSYS_OPT_MON_STATS */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#endif /* EFSYS_OPT_DIAG */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD */