diff options
Diffstat (limited to 'drivers/pci/access.c')
-rw-r--r-- | drivers/pci/access.c | 27 |
1 files changed, 4 insertions, 23 deletions
diff --git a/drivers/pci/access.c b/drivers/pci/access.c index 769f7e35f1a2..59ac36fe7c42 100644 --- a/drivers/pci/access.c +++ b/drivers/pci/access.c | |||
@@ -442,7 +442,8 @@ static const struct pci_vpd_ops pci_vpd_pci22_ops = { | |||
442 | static ssize_t pci_vpd_f0_read(struct pci_dev *dev, loff_t pos, size_t count, | 442 | static ssize_t pci_vpd_f0_read(struct pci_dev *dev, loff_t pos, size_t count, |
443 | void *arg) | 443 | void *arg) |
444 | { | 444 | { |
445 | struct pci_dev *tdev = pci_get_slot(dev->bus, PCI_SLOT(dev->devfn)); | 445 | struct pci_dev *tdev = pci_get_slot(dev->bus, |
446 | PCI_DEVFN(PCI_SLOT(dev->devfn), 0)); | ||
446 | ssize_t ret; | 447 | ssize_t ret; |
447 | 448 | ||
448 | if (!tdev) | 449 | if (!tdev) |
@@ -456,7 +457,8 @@ static ssize_t pci_vpd_f0_read(struct pci_dev *dev, loff_t pos, size_t count, | |||
456 | static ssize_t pci_vpd_f0_write(struct pci_dev *dev, loff_t pos, size_t count, | 457 | static ssize_t pci_vpd_f0_write(struct pci_dev *dev, loff_t pos, size_t count, |
457 | const void *arg) | 458 | const void *arg) |
458 | { | 459 | { |
459 | struct pci_dev *tdev = pci_get_slot(dev->bus, PCI_SLOT(dev->devfn)); | 460 | struct pci_dev *tdev = pci_get_slot(dev->bus, |
461 | PCI_DEVFN(PCI_SLOT(dev->devfn), 0)); | ||
460 | ssize_t ret; | 462 | ssize_t ret; |
461 | 463 | ||
462 | if (!tdev) | 464 | if (!tdev) |
@@ -473,22 +475,6 @@ static const struct pci_vpd_ops pci_vpd_f0_ops = { | |||
473 | .release = pci_vpd_pci22_release, | 475 | .release = pci_vpd_pci22_release, |
474 | }; | 476 | }; |
475 | 477 | ||
476 | static int pci_vpd_f0_dev_check(struct pci_dev *dev) | ||
477 | { | ||
478 | struct pci_dev *tdev = pci_get_slot(dev->bus, PCI_SLOT(dev->devfn)); | ||
479 | int ret = 0; | ||
480 | |||
481 | if (!tdev) | ||
482 | return -ENODEV; | ||
483 | if (!tdev->vpd || !tdev->multifunction || | ||
484 | dev->class != tdev->class || dev->vendor != tdev->vendor || | ||
485 | dev->device != tdev->device) | ||
486 | ret = -ENODEV; | ||
487 | |||
488 | pci_dev_put(tdev); | ||
489 | return ret; | ||
490 | } | ||
491 | |||
492 | int pci_vpd_pci22_init(struct pci_dev *dev) | 478 | int pci_vpd_pci22_init(struct pci_dev *dev) |
493 | { | 479 | { |
494 | struct pci_vpd_pci22 *vpd; | 480 | struct pci_vpd_pci22 *vpd; |
@@ -497,12 +483,7 @@ int pci_vpd_pci22_init(struct pci_dev *dev) | |||
497 | cap = pci_find_capability(dev, PCI_CAP_ID_VPD); | 483 | cap = pci_find_capability(dev, PCI_CAP_ID_VPD); |
498 | if (!cap) | 484 | if (!cap) |
499 | return -ENODEV; | 485 | return -ENODEV; |
500 | if (dev->dev_flags & PCI_DEV_FLAGS_VPD_REF_F0) { | ||
501 | int ret = pci_vpd_f0_dev_check(dev); | ||
502 | 486 | ||
503 | if (ret) | ||
504 | return ret; | ||
505 | } | ||
506 | vpd = kzalloc(sizeof(*vpd), GFP_ATOMIC); | 487 | vpd = kzalloc(sizeof(*vpd), GFP_ATOMIC); |
507 | if (!vpd) | 488 | if (!vpd) |
508 | return -ENOMEM; | 489 | return -ENOMEM; |