Commit 61311e32 authored by Niklas Schnelle's avatar Niklas Schnelle Committed by Heiko Carstens

s390/pci: narrow scope of zpci_configure_device()

Currently zpci_configure_device() can be called on a zPCI function in
two completely different states. Either the underlying zPCI function has
already been configured by the platform and we are only doing the
scanning to get it usable by Linux drivers. Or the underlying function
is in Standby and we first do an SCLP to get it configured. This makes
zpci_configure_device() harder to reason about. Since calling
zpci_configure_device() on a function in Standby only happens in
enable_slot() simply pull out the SCLP call and setting of zdev->state
and thus call zpci_configure_device() under the same circumstances as
in the event handling code.
Reviewed-by: default avatarMatthew Rosato <mjrosato@linux.ibm.com>
Reviewed-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 14c87ba8
......@@ -742,10 +742,9 @@ struct zpci_dev *zpci_create_device(u32 fid, u32 fh, enum zpci_state state)
* @zdev: The zpci_dev to be configured
* @fh: The general function handle supplied by the platform
*
* Configuring a device includes the configuration itself, if not done by the
* platform, enabling, scanning and adding it to the common code PCI subsystem.
* If any failure occurs, the zpci_dev is left disabled either in Standby if
* the configuration failed or Configured if enabling or scanning failed.
* Given a device in the configuration state Configured, enables, scans and
* adds it to the common code PCI subsystem. If any failure occurs, the
* zpci_dev is left disabled.
*
* Return: 0 on success, or an error code otherwise
*/
......@@ -754,14 +753,6 @@ int zpci_configure_device(struct zpci_dev *zdev, u32 fh)
int rc;
zdev->fh = fh;
if (zdev->state != ZPCI_FN_STATE_CONFIGURED) {
rc = sclp_pci_configure(zdev->fid);
zpci_dbg(3, "conf fid:%x, rc:%d\n", zdev->fid, rc);
if (rc)
return rc;
zdev->state = ZPCI_FN_STATE_CONFIGURED;
}
/* the PCI function will be scanned once function 0 appears */
if (!zdev->zbus->bus)
return 0;
......
......@@ -24,10 +24,17 @@ static int enable_slot(struct hotplug_slot *hotplug_slot)
{
struct zpci_dev *zdev = container_of(hotplug_slot, struct zpci_dev,
hotplug_slot);
int rc;
if (zdev->state != ZPCI_FN_STATE_STANDBY)
return -EIO;
rc = sclp_pci_configure(zdev->fid);
zpci_dbg(3, "conf fid:%x, rc:%d\n", zdev->fid, rc);
if (rc)
return rc;
zdev->state = ZPCI_FN_STATE_CONFIGURED;
return zpci_configure_device(zdev, zdev->fh);
}
......
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