PCI/VPD: Determine VPD size in pci_vpd_init()
Determine VPD size in pci_vpd_init(). Quirks set dev->vpd.len to a non-zero value, so they cause us to skip the dynamic size calculation. Prerequisite is that we move the quirks from FINAL to HEADER so they are run before pci_vpd_init(). Link: https://lore.kernel.org/r/cc4a6538-557a-294d-4f94-e6d1d3c91589@gmail.com Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
This commit is contained in:
parent
fd00faa375
commit
7bac54497c
1 changed files with 19 additions and 23 deletions
|
@ -124,9 +124,6 @@ static ssize_t pci_vpd_read(struct pci_dev *dev, loff_t pos, size_t count,
|
||||||
if (pos < 0)
|
if (pos < 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (!vpd->len)
|
|
||||||
vpd->len = pci_vpd_size(dev);
|
|
||||||
|
|
||||||
if (vpd->len == PCI_VPD_SZ_INVALID)
|
if (vpd->len == PCI_VPD_SZ_INVALID)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
|
@ -191,9 +188,6 @@ static ssize_t pci_vpd_write(struct pci_dev *dev, loff_t pos, size_t count,
|
||||||
if (pos < 0 || (pos & 3) || (count & 3))
|
if (pos < 0 || (pos & 3) || (count & 3))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (!vpd->len)
|
|
||||||
vpd->len = pci_vpd_size(dev);
|
|
||||||
|
|
||||||
if (vpd->len == PCI_VPD_SZ_INVALID)
|
if (vpd->len == PCI_VPD_SZ_INVALID)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
|
@ -234,6 +228,9 @@ void pci_vpd_init(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
dev->vpd.cap = pci_find_capability(dev, PCI_CAP_ID_VPD);
|
dev->vpd.cap = pci_find_capability(dev, PCI_CAP_ID_VPD);
|
||||||
mutex_init(&dev->vpd.lock);
|
mutex_init(&dev->vpd.lock);
|
||||||
|
|
||||||
|
if (!dev->vpd.len)
|
||||||
|
dev->vpd.len = pci_vpd_size(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t vpd_read(struct file *filp, struct kobject *kobj,
|
static ssize_t vpd_read(struct file *filp, struct kobject *kobj,
|
||||||
|
@ -398,25 +395,24 @@ static void quirk_blacklist_vpd(struct pci_dev *dev)
|
||||||
dev->vpd.len = PCI_VPD_SZ_INVALID;
|
dev->vpd.len = PCI_VPD_SZ_INVALID;
|
||||||
pci_warn(dev, FW_BUG "disabling VPD access (can't determine size of non-standard VPD format)\n");
|
pci_warn(dev, FW_BUG "disabling VPD access (can't determine size of non-standard VPD format)\n");
|
||||||
}
|
}
|
||||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x0060, quirk_blacklist_vpd);
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_LSI_LOGIC, 0x0060, quirk_blacklist_vpd);
|
||||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x007c, quirk_blacklist_vpd);
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_LSI_LOGIC, 0x007c, quirk_blacklist_vpd);
|
||||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x0413, quirk_blacklist_vpd);
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_LSI_LOGIC, 0x0413, quirk_blacklist_vpd);
|
||||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x0078, quirk_blacklist_vpd);
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_LSI_LOGIC, 0x0078, quirk_blacklist_vpd);
|
||||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x0079, quirk_blacklist_vpd);
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_LSI_LOGIC, 0x0079, quirk_blacklist_vpd);
|
||||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x0073, quirk_blacklist_vpd);
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_LSI_LOGIC, 0x0073, quirk_blacklist_vpd);
|
||||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x0071, quirk_blacklist_vpd);
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_LSI_LOGIC, 0x0071, quirk_blacklist_vpd);
|
||||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x005b, quirk_blacklist_vpd);
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_LSI_LOGIC, 0x005b, quirk_blacklist_vpd);
|
||||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x002f, quirk_blacklist_vpd);
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_LSI_LOGIC, 0x002f, quirk_blacklist_vpd);
|
||||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x005d, quirk_blacklist_vpd);
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_LSI_LOGIC, 0x005d, quirk_blacklist_vpd);
|
||||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x005f, quirk_blacklist_vpd);
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_LSI_LOGIC, 0x005f, quirk_blacklist_vpd);
|
||||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, PCI_ANY_ID,
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATTANSIC, PCI_ANY_ID, quirk_blacklist_vpd);
|
||||||
quirk_blacklist_vpd);
|
|
||||||
/*
|
/*
|
||||||
* The Amazon Annapurna Labs 0x0031 device id is reused for other non Root Port
|
* The Amazon Annapurna Labs 0x0031 device id is reused for other non Root Port
|
||||||
* device types, so the quirk is registered for the PCI_CLASS_BRIDGE_PCI class.
|
* device types, so the quirk is registered for the PCI_CLASS_BRIDGE_PCI class.
|
||||||
*/
|
*/
|
||||||
DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_AMAZON_ANNAPURNA_LABS, 0x0031,
|
DECLARE_PCI_FIXUP_CLASS_HEADER(PCI_VENDOR_ID_AMAZON_ANNAPURNA_LABS, 0x0031,
|
||||||
PCI_CLASS_BRIDGE_PCI, 8, quirk_blacklist_vpd);
|
PCI_CLASS_BRIDGE_PCI, 8, quirk_blacklist_vpd);
|
||||||
|
|
||||||
static void quirk_chelsio_extend_vpd(struct pci_dev *dev)
|
static void quirk_chelsio_extend_vpd(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
|
@ -441,7 +437,7 @@ static void quirk_chelsio_extend_vpd(struct pci_dev *dev)
|
||||||
dev->vpd.len = 2048;
|
dev->vpd.len = 2048;
|
||||||
}
|
}
|
||||||
|
|
||||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, PCI_ANY_ID,
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_CHELSIO, PCI_ANY_ID,
|
||||||
quirk_chelsio_extend_vpd);
|
quirk_chelsio_extend_vpd);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue