diff options
author | Benjamin Li <benli@broadcom.com> | 2008-07-02 10:59:04 -0700 |
---|---|---|
committer | Jesse Barnes <jbarnes@virtuousgeek.org> | 2008-07-02 11:25:54 -0700 |
commit | 99cb233d60cbe644203f19938c729ea2bb004d70 (patch) | |
tree | 20fb5b9194982ff50d6795dc435dd8e09264233e /drivers/pci/pci.h | |
parent | a94c248113b86bbbc47d027a4004b70f2be298b1 (diff) | |
download | linux-3.10-99cb233d60cbe644203f19938c729ea2bb004d70.tar.gz linux-3.10-99cb233d60cbe644203f19938c729ea2bb004d70.tar.bz2 linux-3.10-99cb233d60cbe644203f19938c729ea2bb004d70.zip |
PCI: Limit VPD read/write lengths for Broadcom 5706, 5708, 5709 rev.
For Broadcom 5706, 5708, 5709 rev. A nics, any read beyond the
VPD end tag will hang the device. This problem was initially
observed when a vpd entry was created in sysfs
('/sys/bus/pci/devices/<id>/vpd'). A read to this sysfs entry
will dump 32k of data. Reading a full 32k will cause an access
beyond the VPD end tag causing the device to hang. Once the device
is hung, the bnx2 driver will not be able to reset the device.
We believe that it is legal to read beyond the end tag and
therefore the solution is to limit the read/write length.
A majority of this patch is from Matthew Wilcox who gave code for
reworking the PCI vpd size information. A PCI quirk added for the
Broadcom NIC's to limit the read/write's.
Signed-off-by: Benjamin Li <benli@broadcom.com>
Signed-off-by: Matthew Wilcox <willy@linux.intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Diffstat (limited to 'drivers/pci/pci.h')
-rw-r--r-- | drivers/pci/pci.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 0a497c1b422..00408c97e5f 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -21,11 +21,11 @@ extern int pci_user_write_config_dword(struct pci_dev *dev, int where, u32 val); struct pci_vpd_ops { int (*read)(struct pci_dev *dev, int pos, int size, char *buf); int (*write)(struct pci_dev *dev, int pos, int size, const char *buf); - int (*get_size)(struct pci_dev *dev); void (*release)(struct pci_dev *dev); }; struct pci_vpd { + unsigned int len; struct pci_vpd_ops *ops; struct bin_attribute *attr; /* descriptor for sysfs VPD entry */ }; |