Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d4894f3e authored by Matt Carlson's avatar Matt Carlson Committed by David S. Miller
Browse files

tg3: Add code to verify RODATA checksum of VPD



This patch adds code to verify the checksum stored in the "RV" info
keyword of the RODATA VPD section.

Signed-off-by: default avatarMatt Carlson <mcarlson@broadcom.com>
Reviewed-by: default avatarMichael Chan <mchan@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 01c3a392
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -10499,6 +10499,41 @@ static int tg3_test_nvram(struct tg3 *tp)
	if (csum != le32_to_cpu(buf[0xfc/4]))
		goto out;

	for (i = 0; i < TG3_NVM_VPD_LEN; i += 4) {
		/* The data is in little-endian format in NVRAM.
		 * Use the big-endian read routines to preserve
		 * the byte order as it exists in NVRAM.
		 */
		if (tg3_nvram_read_be32(tp, TG3_NVM_VPD_OFF + i, &buf[i/4]))
			goto out;
	}

	i = pci_vpd_find_tag((u8 *)buf, 0, TG3_NVM_VPD_LEN,
			     PCI_VPD_LRDT_RO_DATA);
	if (i > 0) {
		j = pci_vpd_lrdt_size(&((u8 *)buf)[i]);
		if (j < 0)
			goto out;

		if (i + PCI_VPD_LRDT_TAG_SIZE + j > TG3_NVM_VPD_LEN)
			goto out;

		i += PCI_VPD_LRDT_TAG_SIZE;
		j = pci_vpd_find_info_keyword((u8 *)buf, i, j,
					      PCI_VPD_RO_KEYWORD_CHKSUM);
		if (j > 0) {
			u8 csum8 = 0;

			j += PCI_VPD_INFO_FLD_HDR_SIZE;

			for (i = 0; i <= j; i++)
				csum8 += ((u8 *)buf)[i];

			if (csum8)
				goto out;
		}
	}

	err = 0;

out:
+1 −0
Original line number Diff line number Diff line
@@ -1479,6 +1479,7 @@ void pci_request_acs(void);
#define PCI_VPD_RO_KEYWORD_PARTNO	"PN"
#define PCI_VPD_RO_KEYWORD_MFR_ID	"MN"
#define PCI_VPD_RO_KEYWORD_VENDOR0	"V0"
#define PCI_VPD_RO_KEYWORD_CHKSUM	"RV"

/**
 * pci_vpd_lrdt_size - Extracts the Large Resource Data Type length