PCI/VPD: Treat initial 0xff as missing EEPROM
authorHeiner Kallweit <hkallweit1@gmail.com>
Thu, 29 Jul 2021 17:22:25 +0000 (12:22 -0500)
committerBjorn Helgaas <bhelgaas@google.com>
Fri, 30 Jul 2021 18:41:52 +0000 (13:41 -0500)
Previously we assumed that the first tag being 0x00 meant an EEPROM was
missing.  The first tag being 0xff means the same thing; check for that
also.

[bhelgaas: rework error mesage]
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
drivers/pci/vpd.c

index 28052d4..05e4df0 100644 (file)
@@ -78,10 +78,8 @@ static size_t pci_vpd_size(struct pci_dev *dev, size_t old_size)
        while (off < old_size && pci_read_vpd(dev, off, 1, header) == 1) {
                unsigned char tag;
 
-               if (!header[0] && !off) {
-                       pci_info(dev, "Invalid VPD tag 00, assume missing optional VPD EPROM\n");
-                       return 0;
-               }
+               if (off == 0 && (header[0] == 0x00 || header[0] == 0xff))
+                       goto error;
 
                if (header[0] & PCI_VPD_LRDT) {
                        /* Large Resource Data Type Tag */
@@ -113,6 +111,12 @@ static size_t pci_vpd_size(struct pci_dev *dev, size_t old_size)
                }
        }
        return 0;
+
+error:
+       pci_info(dev, "invalid VPD tag %#04x at offset %zu%s\n",
+                header[0], off, off == 0 ?
+                "; assume missing optional EEPROM" : "");
+       return 0;
 }
 
 /*