diff options
Diffstat (limited to 'drivers/pci/probe.c')
| -rw-r--r-- | drivers/pci/probe.c | 18 | 
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index b66fa42c4b1f..1779582fb500 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -842,7 +842,6 @@ static struct irq_domain *pci_host_bridge_msi_domain(struct pci_bus *bus)  	if (!d)  		d = pci_host_bridge_acpi_msi_domain(bus); -#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN  	/*  	 * If no IRQ domain was found via the OF tree, try looking it up  	 * directly through the fwnode_handle. @@ -854,7 +853,6 @@ static struct irq_domain *pci_host_bridge_msi_domain(struct pci_bus *bus)  			d = irq_find_matching_fwnode(fwnode,  						     DOMAIN_BUS_PCI_MSI);  	} -#endif  	return d;  } @@ -906,6 +904,10 @@ static int pci_register_host_bridge(struct pci_host_bridge *bridge)  		bus->domain_nr = pci_bus_find_domain_nr(bus, parent);  	else  		bus->domain_nr = bridge->domain_nr; +	if (bus->domain_nr < 0) { +		err = bus->domain_nr; +		goto free; +	}  #endif  	b = pci_find_bus(pci_domain_nr(bus), bridge->busnr); @@ -1030,6 +1032,9 @@ unregister:  	device_del(&bridge->dev);  free: +#ifdef CONFIG_PCI_DOMAINS_GENERIC +	pci_bus_release_domain_nr(bus, parent); +#endif  	kfree(bus);  	return err;  } @@ -1891,9 +1896,6 @@ int pci_setup_device(struct pci_dev *dev)  	dev->broken_intx_masking = pci_intx_mask_broken(dev); -	/* Clear errors left from system firmware */ -	pci_write_config_word(dev, PCI_STATUS, 0xffff); -  	switch (dev->hdr_type) {		    /* header type */  	case PCI_HEADER_TYPE_NORMAL:		    /* standard header */  		if (class == PCI_CLASS_BRIDGE_PCI) @@ -2307,6 +2309,12 @@ struct pci_dev *pci_alloc_dev(struct pci_bus *bus)  	INIT_LIST_HEAD(&dev->bus_list);  	dev->dev.type = &pci_dev_type;  	dev->bus = pci_bus_get(bus); +	dev->driver_exclusive_resource = (struct resource) { +		.name = "PCI Exclusive", +		.start = 0, +		.end = -1, +	}; +  #ifdef CONFIG_PCI_MSI  	raw_spin_lock_init(&dev->msi_lock);  #endif  |