Author: arybchik
Date: Mon Jan  2 09:31:34 2017
New Revision: 311079
URL: https://svnweb.freebsd.org/changeset/base/311079

Log:
  MFC r310746
  
  sfxge(4): make the common code determine the number of PFs
  
  Submitted by:   Ivan Malov <Ivan.Malov at oktetlabs.ru>
  Sponsored by:   Solarflare Communications, Inc.

Modified:
  stable/10/sys/dev/sfxge/common/ef10_nic.c
  stable/10/sys/dev/sfxge/common/efx.h
  stable/10/sys/dev/sfxge/common/siena_nic.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/sfxge/common/ef10_nic.c
==============================================================================
--- stable/10/sys/dev/sfxge/common/ef10_nic.c   Mon Jan  2 09:30:33 2017        
(r311078)
+++ stable/10/sys/dev/sfxge/common/ef10_nic.c   Mon Jan  2 09:31:34 2017        
(r311079)
@@ -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)))
 

Modified: stable/10/sys/dev/sfxge/common/efx.h
==============================================================================
--- stable/10/sys/dev/sfxge/common/efx.h        Mon Jan  2 09:30:33 2017        
(r311078)
+++ stable/10/sys/dev/sfxge/common/efx.h        Mon Jan  2 09:31:34 2017        
(r311079)
@@ -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;

Modified: stable/10/sys/dev/sfxge/common/siena_nic.c
==============================================================================
--- stable/10/sys/dev/sfxge/common/siena_nic.c  Mon Jan  2 09:30:33 2017        
(r311078)
+++ stable/10/sys/dev/sfxge/common/siena_nic.c  Mon Jan  2 09:31:34 2017        
(r311079)
@@ -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)) {
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to