sfxge(4): make the common code determine the number of PFs

Submitted by:   Ivan Malov <Ivan.Malov at oktetlabs.ru>
Reviewed by:    gnn
Sponsored by:   Solarflare Communications, Inc.
MFC after:      2 days
Differential Revision:  https://reviews.freebsd.org/D8941
This commit is contained in:
Andrew Rybchenko 2016-12-29 06:52:42 +00:00
parent 9933eabb8e
commit b422f9491d
3 changed files with 56 additions and 0 deletions

View File

@ -961,6 +961,50 @@ ef10_nic_pio_unlink(
return (efx_mcdi_unlink_piobuf(enp, vi_index));
}
static __checkReturn efx_rc_t
ef10_mcdi_get_pf_count(
__in efx_nic_t *enp,
__out uint32_t *pf_countp)
{
efx_mcdi_req_t req;
uint8_t payload[MAX(MC_CMD_GET_PF_COUNT_IN_LEN,
MC_CMD_GET_PF_COUNT_OUT_LEN)];
efx_rc_t rc;
(void) memset(payload, 0, sizeof (payload));
req.emr_cmd = MC_CMD_GET_PF_COUNT;
req.emr_in_buf = payload;
req.emr_in_length = MC_CMD_GET_PF_COUNT_IN_LEN;
req.emr_out_buf = payload;
req.emr_out_length = MC_CMD_GET_PF_COUNT_OUT_LEN;
efx_mcdi_execute(enp, &req);
if (req.emr_rc != 0) {
rc = req.emr_rc;
goto fail1;
}
if (req.emr_out_length_used < MC_CMD_GET_PF_COUNT_OUT_LEN) {
rc = EMSGSIZE;
goto fail2;
}
*pf_countp = *MCDI_OUT(req, uint8_t,
MC_CMD_GET_PF_COUNT_OUT_PF_COUNT_OFST);
EFSYS_ASSERT(*pf_countp != 0);
return (0);
fail2:
EFSYS_PROBE(fail2);
fail1:
EFSYS_PROBE1(fail1, efx_rc_t, rc);
return (rc);
}
__checkReturn efx_rc_t
ef10_get_datapath_caps(
__in efx_nic_t *enp)
@ -975,6 +1019,9 @@ ef10_get_datapath_caps(
&tso2nc)) != 0)
goto fail1;
if ((rc = ef10_mcdi_get_pf_count(enp, &encp->enc_hw_pf_count)) != 0)
goto fail1;
#define CAP_FLAG(flags1, field) \
((flags1) & (1 << (MC_CMD_GET_CAPABILITIES_V2_OUT_ ## field ## _LBN)))

View File

@ -1142,6 +1142,8 @@ typedef struct efx_nic_cfg_s {
/* Number of TSO contexts on the NIC (FATSOv2) */
uint32_t enc_fw_assisted_tso_v2_n_contexts;
boolean_t enc_hw_tx_insert_vlan_enabled;
/* Number of PFs on the NIC */
uint32_t enc_hw_pf_count;
/* Datapath firmware vadapter/vport/vswitch support */
boolean_t enc_datapath_cap_evb;
boolean_t enc_rx_disable_scatter_supported;

View File

@ -105,6 +105,13 @@ siena_board_cfg(
encp->enc_board_type = board_type;
/*
* There is no possibility to determine the number of PFs on Siena
* by issuing MCDI request, and it is not an easy task to find the
* value based on the board type, so 'enc_hw_pf_count' is set to 1
*/
encp->enc_hw_pf_count = 1;
/* Additional capabilities */
encp->enc_clk_mult = 1;
if (EFX_DWORD_FIELD(capabilities, MC_CMD_CAPABILITIES_TURBO)) {