sfc: Support variable-length response to MCDI GET_BOARD_CFG
authorBen Hutchings <bhutchings@solarflare.com>
Mon, 4 Jul 2011 23:04:42 +0000 (00:04 +0100)
committerBen Hutchings <bhutchings@solarflare.com>
Wed, 19 Sep 2012 01:56:23 +0000 (02:56 +0100)
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
drivers/net/ethernet/sfc/mcdi.c
drivers/net/ethernet/sfc/mtd.c

index 578e5f7..e855f4c 100644 (file)
@@ -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;
                }
        }
index 7581483..8f4604d 100644 (file)
@@ -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);