Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 7 Dec 2015 06:01:14 +0000 (UTC)
From:      Andrew Rybchenko <arybchik@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r291923 - head/sys/dev/sfxge/common
Message-ID:  <201512070601.tB761EJu015545@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: arybchik
Date: Mon Dec  7 06:01:14 2015
New Revision: 291923
URL: https://svnweb.freebsd.org/changeset/base/291923

Log:
  sfxge: [Sorrento] support writing of MUM firmware
  
  When writing the MUM firmware the chunk size must be equal to the erase
  size.
  
  Submitted by:   Laurence Evans <levans at solarflare.com>
  Sponsored by:   Solarflare Communications, Inc.
  MFC after:      2 days
  Differential Revision: https://reviews.freebsd.org/D4388

Modified:
  head/sys/dev/sfxge/common/efx.h
  head/sys/dev/sfxge/common/efx_nvram.c
  head/sys/dev/sfxge/common/hunt_nic.c
  head/sys/dev/sfxge/common/hunt_nvram.c
  head/sys/dev/sfxge/common/siena_nic.c

Modified: head/sys/dev/sfxge/common/efx.h
==============================================================================
--- head/sys/dev/sfxge/common/efx.h	Mon Dec  7 05:59:24 2015	(r291922)
+++ head/sys/dev/sfxge/common/efx.h	Mon Dec  7 06:01:14 2015	(r291923)
@@ -1176,6 +1176,7 @@ typedef struct efx_nic_cfg_s {
 	boolean_t               enc_allow_set_mac_with_installed_filters;
 	/* External port identifier */
 	uint8_t			enc_external_port;
+	uint32_t		enc_mcdi_max_payload_length;
 } efx_nic_cfg_t;
 
 #define	EFX_PCI_FUNCTION_IS_PF(_encp)	((_encp)->enc_vf == 0xffff)

Modified: head/sys/dev/sfxge/common/efx_nvram.c
==============================================================================
--- head/sys/dev/sfxge/common/efx_nvram.c	Mon Dec  7 05:59:24 2015	(r291922)
+++ head/sys/dev/sfxge/common/efx_nvram.c	Mon Dec  7 06:01:14 2015	(r291923)
@@ -749,6 +749,11 @@ fail1:
 	return (rc);
 }
 
+/*
+ * The NVRAM_WRITE MCDI command is a V1 command and so is supported by both
+ * Sienna and EF10 based boards.  However EF10 based boards support the use
+ * of this command with payloads up to the maximum MCDI V2 payload length.
+ */
 	__checkReturn		efx_rc_t
 efx_mcdi_nvram_write(
 	__in			efx_nic_t *enp,
@@ -758,11 +763,18 @@ efx_mcdi_nvram_write(
 	__in			size_t size)
 {
 	efx_mcdi_req_t req;
-	uint8_t payload[MAX(MC_CMD_NVRAM_WRITE_IN_LENMAX,
-			    MC_CMD_NVRAM_WRITE_OUT_LEN)];
+	uint8_t payload[MAX(MCDI_CTL_SDU_LEN_MAX_V1,
+			    MCDI_CTL_SDU_LEN_MAX_V2)];
 	efx_rc_t rc;
+	size_t max_data_size;
 
-	if (size > MC_CMD_NVRAM_WRITE_IN_LENMAX) {
+	max_data_size = enp->en_nic_cfg.enc_mcdi_max_payload_length
+	    - MC_CMD_NVRAM_WRITE_IN_LEN(0);
+	EFSYS_ASSERT3U(enp->en_nic_cfg.enc_mcdi_max_payload_length, >, 0);
+	EFSYS_ASSERT3U(max_data_size, <,
+		    enp->en_nic_cfg.enc_mcdi_max_payload_length);
+
+	if (size > max_data_size) {
 		rc = EINVAL;
 		goto fail1;
 	}

Modified: head/sys/dev/sfxge/common/hunt_nic.c
==============================================================================
--- head/sys/dev/sfxge/common/hunt_nic.c	Mon Dec  7 05:59:24 2015	(r291922)
+++ head/sys/dev/sfxge/common/hunt_nic.c	Mon Dec  7 06:01:14 2015	(r291923)
@@ -1681,6 +1681,7 @@ hunt_nic_init(
 	}
 
 	enp->en_vport_id = EVB_PORT_ID_ASSIGNED;
+	enp->en_nic_cfg.enc_mcdi_max_payload_length = MCDI_CTL_SDU_LEN_MAX_V2;
 
 	return (0);
 

Modified: head/sys/dev/sfxge/common/hunt_nvram.c
==============================================================================
--- head/sys/dev/sfxge/common/hunt_nvram.c	Mon Dec  7 05:59:24 2015	(r291922)
+++ head/sys/dev/sfxge/common/hunt_nvram.c	Mon Dec  7 06:01:14 2015	(r291923)
@@ -1409,14 +1409,32 @@ hunt_nvram_partn_write(
 	__in			size_t size)
 {
 	size_t chunk;
+	uint32_t write_size;
 	efx_rc_t rc;
 
+	if ((rc = efx_mcdi_nvram_info(enp, partn, NULL, NULL,
+	    NULL, &write_size)) != 0)
+		goto fail1;
+
+	if (write_size != 0) {
+		/*
+		 * Check that the size is a multiple of the write chunk size if
+		 * the write chunk size is available.
+		 */
+		if (size % write_size != 0) {
+			rc = EINVAL;
+			goto fail2;
+		}
+	} else {
+		write_size = HUNTINGTON_NVRAM_CHUNK;
+	}
+
 	while (size > 0) {
-		chunk = MIN(size, HUNTINGTON_NVRAM_CHUNK);
+		chunk = MIN(size, write_size);
 
 		if ((rc = efx_mcdi_nvram_write(enp, partn, offset,
 			    data, chunk)) != 0) {
-			goto fail1;
+			goto fail3;
 		}
 
 		size -= chunk;
@@ -1426,6 +1444,10 @@ hunt_nvram_partn_write(
 
 	return (0);
 
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
 fail1:
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
 

Modified: head/sys/dev/sfxge/common/siena_nic.c
==============================================================================
--- head/sys/dev/sfxge/common/siena_nic.c	Mon Dec  7 05:59:24 2015	(r291922)
+++ head/sys/dev/sfxge/common/siena_nic.c	Mon Dec  7 06:01:14 2015	(r291923)
@@ -420,6 +420,8 @@ siena_nic_init(
 	if ((rc = siena_phy_reconfigure(enp)) != 0)
 		goto fail2;
 
+	enp->en_nic_cfg.enc_mcdi_max_payload_length = MCDI_CTL_SDU_LEN_MAX_V1;
+
 	return (0);
 
 fail2:



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