diff options
Diffstat (limited to 'drivers/pci/probe.c')
-rw-r--r-- | drivers/pci/probe.c | 24 |
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 | ||
1443 | static 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 | |||
1441 | int pci_cfg_space_size(struct pci_dev *dev) | 1453 | int 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); |