Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 Mar 2015 10:48:29 +0000 (UTC)
From:      Andrew Rybchenko <arybchik@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r280544 - stable/10/sys/dev/sfxge/common
Message-ID:  <201503251048.t2PAmTed094829@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: arybchik
Date: Wed Mar 25 10:48:28 2015
New Revision: 280544
URL: https://svnweb.freebsd.org/changeset/base/280544

Log:
  MFC: 278941
  
  sfxge: support variable-length response to MCDI GET_BOARD_CFG
  
  Allocate the minimum or maximum response length for GET_BOARD_CFG as
  appropriate.  When looking up firmware subtypes by partition ID,
  check the ID against the actual response length.
  
  Merge of the patch made by Ben Hutchings in 2011.
  
  Sponsored by:   Solarflare Communications, Inc.
  Approved by:    gnn (mentor)

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

Modified: stable/10/sys/dev/sfxge/common/efx_regs_mcdi.h
==============================================================================
--- stable/10/sys/dev/sfxge/common/efx_regs_mcdi.h	Wed Mar 25 10:46:13 2015	(r280543)
+++ stable/10/sys/dev/sfxge/common/efx_regs_mcdi.h	Wed Mar 25 10:48:28 2015	(r280544)
@@ -709,7 +709,9 @@
 #define	MC_CMD_GET_BOARD_CFG_IN_LEN 0
 
 /* MC_CMD_GET_BOARD_CFG_OUT msgresponse */
-#define	MC_CMD_GET_BOARD_CFG_OUT_LEN 96
+#define	MC_CMD_GET_BOARD_CFG_OUT_LENMIN 96
+#define	MC_CMD_GET_BOARD_CFG_OUT_LENMAX 136
+#define	MC_CMD_GET_BOARD_CFG_OUT_LEN(num) (72+2*(num))
 #define	MC_CMD_GET_BOARD_CFG_OUT_BOARD_TYPE_OFST 0
 #define	MC_CMD_GET_BOARD_CFG_OUT_BOARD_NAME_OFST 4
 #define	MC_CMD_GET_BOARD_CFG_OUT_BOARD_NAME_LEN 32
@@ -729,7 +731,8 @@
 #define	MC_CMD_GET_BOARD_CFG_OUT_MAC_STRIDE_PORT1_OFST 68
 #define	MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_OFST 72
 #define	MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_LEN 2
-#define	MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_NUM 12
+#define	MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_MINNUM 12
+#define	MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_MAXNUM 32
 
 
 /***********************************/

Modified: stable/10/sys/dev/sfxge/common/siena_nic.c
==============================================================================
--- stable/10/sys/dev/sfxge/common/siena_nic.c	Wed Mar 25 10:46:13 2015	(r280543)
+++ stable/10/sys/dev/sfxge/common/siena_nic.c	Wed Mar 25 10:48:28 2015	(r280544)
@@ -276,7 +276,7 @@ siena_board_cfg(
 {
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	efx_mcdi_iface_t *emip = &(enp->en_u.siena.enu_mip);
-	uint8_t outbuf[MAX(MC_CMD_GET_BOARD_CFG_OUT_LEN,
+	uint8_t outbuf[MAX(MC_CMD_GET_BOARD_CFG_OUT_LENMIN,
 		    MC_CMD_GET_RESOURCE_LIMITS_OUT_LEN)];
 	efx_mcdi_req_t req;
 	uint8_t *src;
@@ -288,7 +288,7 @@ siena_board_cfg(
 	req.emr_in_buf = NULL;
 	req.emr_in_length = 0;
 	req.emr_out_buf = outbuf;
-	req.emr_out_length = MC_CMD_GET_BOARD_CFG_OUT_LEN;
+	req.emr_out_length = MC_CMD_GET_BOARD_CFG_OUT_LENMIN;
 
 	efx_mcdi_execute(enp, &req);
 
@@ -297,7 +297,7 @@ siena_board_cfg(
 		goto fail1;
 	}
 
-	if (req.emr_out_length_used < MC_CMD_GET_BOARD_CFG_OUT_LEN) {
+	if (req.emr_out_length_used < MC_CMD_GET_BOARD_CFG_OUT_LENMIN) {
 		rc = EMSGSIZE;
 		goto fail2;
 	}

Modified: stable/10/sys/dev/sfxge/common/siena_nvram.c
==============================================================================
--- stable/10/sys/dev/sfxge/common/siena_nvram.c	Wed Mar 25 10:46:13 2015	(r280543)
+++ stable/10/sys/dev/sfxge/common/siena_nvram.c	Wed Mar 25 10:48:28 2015	(r280544)
@@ -587,7 +587,7 @@ siena_nvram_get_subtype(
 	__out			uint32_t *subtypep)
 {
 	efx_mcdi_req_t req;
-	uint8_t outbuf[MC_CMD_GET_BOARD_CFG_OUT_LEN];
+	uint8_t outbuf[MC_CMD_GET_BOARD_CFG_OUT_LENMAX];
 	efx_word_t *fw_list;
 	int rc;
 
@@ -605,17 +605,26 @@ siena_nvram_get_subtype(
 		goto fail1;
 	}
 
-	if (req.emr_out_length_used < MC_CMD_GET_BOARD_CFG_OUT_LEN) {
+	if (req.emr_out_length_used < MC_CMD_GET_BOARD_CFG_OUT_LENMIN) {
 		rc = EMSGSIZE;
 		goto fail2;
 	}
 
+	if (req.emr_out_length_used <
+	    MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_OFST +
+	    (partn + 1) * sizeof(efx_word_t)) {
+		rc = ENOENT;
+		goto fail3;
+	}
+
 	fw_list = MCDI_OUT2(req, efx_word_t,
 			    GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST);
 	*subtypep = EFX_WORD_FIELD(fw_list[partn], EFX_WORD_0);
 
 	return (0);
 
+fail3:
+	EFSYS_PROBE(fail3);
 fail2:
 	EFSYS_PROBE(fail2);
 fail1:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201503251048.t2PAmTed094829>