summaryrefslogtreecommitdiffstats
path: root/drivers/pci/probe.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci/probe.c')
-rw-r--r--drivers/pci/probe.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 201f9e5ff55c..b1c05b5054a0 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -713,6 +713,7 @@ static void pci_set_bus_speed(struct pci_bus *bus)
713 713
714 pcie_capability_read_dword(bridge, PCI_EXP_LNKCAP, &linkcap); 714 pcie_capability_read_dword(bridge, PCI_EXP_LNKCAP, &linkcap);
715 bus->max_bus_speed = pcie_link_speed[linkcap & PCI_EXP_LNKCAP_SLS]; 715 bus->max_bus_speed = pcie_link_speed[linkcap & PCI_EXP_LNKCAP_SLS];
716 bridge->link_active_reporting = !!(linkcap & PCI_EXP_LNKCAP_DLLLARC);
716 717
717 pcie_capability_read_word(bridge, PCI_EXP_LNKSTA, &linksta); 718 pcie_capability_read_word(bridge, PCI_EXP_LNKSTA, &linksta);
718 pcie_update_link_speed(bus, linksta); 719 pcie_update_link_speed(bus, linksta);
@@ -1438,12 +1439,29 @@ static int pci_cfg_space_size_ext(struct pci_dev *dev)
1438 return PCI_CFG_SPACE_EXP_SIZE; 1439 return PCI_CFG_SPACE_EXP_SIZE;
1439} 1440}
1440 1441
1442#ifdef CONFIG_PCI_IOV
1443static bool is_vf0(struct pci_dev *dev)
1444{
1445 if (pci_iov_virtfn_devfn(dev->physfn, 0) == dev->devfn &&
1446 pci_iov_virtfn_bus(dev->physfn, 0) == dev->bus->number)
1447 return true;
1448
1449 return false;
1450}
1451#endif
1452
1441int pci_cfg_space_size(struct pci_dev *dev) 1453int pci_cfg_space_size(struct pci_dev *dev)
1442{ 1454{
1443 int pos; 1455 int pos;
1444 u32 status; 1456 u32 status;
1445 u16 class; 1457 u16 class;
1446 1458
1459#ifdef CONFIG_PCI_IOV
1460 /* Read cached value for all VFs except for VF0 */
1461 if (dev->is_virtfn && !is_vf0(dev))
1462 return dev->physfn->sriov->cfg_size;
1463#endif
1464
1447 if (dev->bus->bus_flags & PCI_BUS_FLAGS_NO_EXTCFG) 1465 if (dev->bus->bus_flags & PCI_BUS_FLAGS_NO_EXTCFG)
1448 return PCI_CFG_SPACE_SIZE; 1466 return PCI_CFG_SPACE_SIZE;
1449 1467
@@ -2143,7 +2161,7 @@ static void pci_release_dev(struct device *dev)
2143 pcibios_release_device(pci_dev); 2161 pcibios_release_device(pci_dev);
2144 pci_bus_put(pci_dev->bus); 2162 pci_bus_put(pci_dev->bus);
2145 kfree(pci_dev->driver_override); 2163 kfree(pci_dev->driver_override);
2146 kfree(pci_dev->dma_alias_mask); 2164 bitmap_free(pci_dev->dma_alias_mask);
2147 kfree(pci_dev); 2165 kfree(pci_dev);
2148} 2166}
2149 2167
@@ -2397,8 +2415,8 @@ void pci_device_add(struct pci_dev *dev, struct pci_bus *bus)
2397 dev->dev.dma_parms = &dev->dma_parms; 2415 dev->dev.dma_parms = &dev->dma_parms;
2398 dev->dev.coherent_dma_mask = 0xffffffffull; 2416 dev->dev.coherent_dma_mask = 0xffffffffull;
2399 2417
2400 pci_set_dma_max_seg_size(dev, 65536); 2418 dma_set_max_seg_size(&dev->dev, 65536);
2401 pci_set_dma_seg_boundary(dev, 0xffffffff); 2419 dma_set_seg_boundary(&dev->dev, 0xffffffff);
2402 2420
2403 /* Fix up broken headers */ 2421 /* Fix up broken headers */
2404 pci_fixup_device(pci_fixup_header, dev); 2422 pci_fixup_device(pci_fixup_header, dev);