Commit 7dc697d6 authored by Niklas Schnelle's avatar Niklas Schnelle Committed by Heiko Carstens

s390/pci: do more bus setup in zpci_bus_scan()

Pull setting the maximum bus speed and multifunction attribute into
zpci_bus_scan() in preparation for handling bus creation separately
from scanning the bus.
Reviewed-by: default avatarMatthew Rosato <mjrosato@linux.ibm.com>
Acked-by: default avatarPierre Morel <pmorel@linux.ibm.com>
Signed-off-by: default avatarNiklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
parent faf29a4d
...@@ -86,24 +86,33 @@ void zpci_bus_remove_device(struct zpci_dev *zdev, bool set_error) ...@@ -86,24 +86,33 @@ void zpci_bus_remove_device(struct zpci_dev *zdev, bool set_error)
} }
} }
/* zpci_bus_scan /* zpci_bus_scan - Scan the PCI bus associated with this zbus
* @zbus: the zbus holding the zdevices * @zbus: the zbus holding the zdevices
* @f0: function 0 of the bus
* @ops: the pci operations * @ops: the pci operations
* *
* The domain number must be set before pci_scan_root_bus is called. * Function zero is taken as a parameter as this is used to determine the
* This function can be called once the domain is known, hence * domain, multifunction property and maximum bus speed of the entire bus.
* when the function_0 is dicovered. *
* Return: 0 on success, an error code otherwise
*/ */
static int zpci_bus_scan(struct zpci_bus *zbus, int domain, struct pci_ops *ops) static int zpci_bus_scan(struct zpci_bus *zbus, struct zpci_dev *f0, struct pci_ops *ops)
{ {
struct pci_bus *bus; struct pci_bus *bus;
int rc; int domain;
rc = zpci_alloc_domain(domain); domain = zpci_alloc_domain((u16)f0->uid);
if (rc < 0) if (domain < 0)
return rc; return domain;
zbus->domain_nr = rc;
zbus->domain_nr = domain;
zbus->multifunction = f0->rid_available;
zbus->max_bus_speed = f0->max_bus_speed;
/*
* Note that the zbus->resources are taken over and zbus->resources
* is empty after a successful call
*/
bus = pci_scan_root_bus(NULL, ZPCI_BUS_NR, ops, zbus, &zbus->resources); bus = pci_scan_root_bus(NULL, ZPCI_BUS_NR, ops, zbus, &zbus->resources);
if (!bus) { if (!bus) {
zpci_free_domain(zbus->domain_nr); zpci_free_domain(zbus->domain_nr);
...@@ -288,7 +297,7 @@ int zpci_bus_device_register(struct zpci_dev *zdev, struct pci_ops *ops) ...@@ -288,7 +297,7 @@ int zpci_bus_device_register(struct zpci_dev *zdev, struct pci_ops *ops)
WARN_ONCE(1, "rid_available not set on function 0 for multifunction\n"); WARN_ONCE(1, "rid_available not set on function 0 for multifunction\n");
goto error_bus; goto error_bus;
} }
rc = zpci_bus_scan(zbus, (u16)zdev->uid, ops); rc = zpci_bus_scan(zbus, zdev, ops);
if (rc) if (rc)
goto error_bus; goto error_bus;
zpci_bus_add_devices(zbus); zpci_bus_add_devices(zbus);
...@@ -296,8 +305,6 @@ int zpci_bus_device_register(struct zpci_dev *zdev, struct pci_ops *ops) ...@@ -296,8 +305,6 @@ int zpci_bus_device_register(struct zpci_dev *zdev, struct pci_ops *ops)
if (rc) if (rc)
goto error_bus; goto error_bus;
zdev->has_hp_slot = 1; zdev->has_hp_slot = 1;
zbus->multifunction = zdev->rid_available;
zbus->max_bus_speed = zdev->max_bus_speed;
} else { } else {
zbus->multifunction = 1; zbus->multifunction = 1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment