diff options
| author | Ben Hutchings <bhutchings@solarflare.com> | 2011-07-05 00:04:42 +0100 | 
|---|---|---|
| committer | Ben Hutchings <bhutchings@solarflare.com> | 2012-09-19 02:56:23 +0100 | 
| commit | e3f5ec1108ee01b555d5894722884e40dbec058f (patch) | |
| tree | f3e2d295c71bf271403c13674c2e69cf41a6ad11 | |
| parent | bfeed902946a31692e7a24ed355b6d13ac37d014 (diff) | |
| download | olio-linux-3.10-e3f5ec1108ee01b555d5894722884e40dbec058f.tar.xz olio-linux-3.10-e3f5ec1108ee01b555d5894722884e40dbec058f.zip  | |
sfc: Support variable-length response to MCDI GET_BOARD_CFG
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
| -rw-r--r-- | drivers/net/ethernet/sfc/mcdi.c | 6 | ||||
| -rw-r--r-- | drivers/net/ethernet/sfc/mtd.c | 3 | 
2 files changed, 6 insertions, 3 deletions
diff --git a/drivers/net/ethernet/sfc/mcdi.c b/drivers/net/ethernet/sfc/mcdi.c index 578e5f72aab..e855f4cddb4 100644 --- a/drivers/net/ethernet/sfc/mcdi.c +++ b/drivers/net/ethernet/sfc/mcdi.c @@ -683,12 +683,14 @@ int efx_mcdi_get_board_cfg(struct efx_nic *efx, u8 *mac_address,  	if (mac_address)  		memcpy(mac_address, outbuf + offset, ETH_ALEN);  	if (fw_subtype_list) { +		/* Byte-swap and truncate or zero-pad as necessary */  		offset = MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_OFST;  		for (i = 0; -		     i < MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_MINNUM; +		     i < MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_MAXNUM;  		     i++) {  			fw_subtype_list[i] = -				le16_to_cpup((__le16 *)(outbuf + offset)); +				(offset + 2 <= outlen) ? +				le16_to_cpup((__le16 *)(outbuf + offset)) : 0;  			offset += 2;  		}  	} diff --git a/drivers/net/ethernet/sfc/mtd.c b/drivers/net/ethernet/sfc/mtd.c index 758148379b0..8f4604d5d64 100644 --- a/drivers/net/ethernet/sfc/mtd.c +++ b/drivers/net/ethernet/sfc/mtd.c @@ -627,7 +627,8 @@ static int siena_mtd_get_fw_subtypes(struct efx_nic *efx,  				     struct efx_mtd *efx_mtd)  {  	struct efx_mtd_partition *part; -	uint16_t fw_subtype_list[MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_MINNUM]; +	uint16_t fw_subtype_list[ +		MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_MAXNUM];  	int rc;  	rc = efx_mcdi_get_board_cfg(efx, NULL, fw_subtype_list, NULL);  |