Commit 95b3a8b4 authored by Niklas Schnelle's avatar Niklas Schnelle Committed by Heiko Carstens

s390/pci: move zpci_remove_device() to bus code

The zpci_remove_device() function removes the device from the PCI common
code core which is an operation dealing primarily with the zbus and PCI
bus code. With that and to match an upcoming refactoring of the
symmetric scanning part move it to the bus code.
Reviewed-by: default avatarMatthew Rosato <mjrosato@linux.ibm.com>
Signed-off-by: default avatarNiklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
parent 2631f6b6
...@@ -201,7 +201,6 @@ extern unsigned int s390_pci_no_rid; ...@@ -201,7 +201,6 @@ extern unsigned int s390_pci_no_rid;
----------------------------------------------------------------------------- */ ----------------------------------------------------------------------------- */
/* Base stuff */ /* Base stuff */
int zpci_create_device(u32 fid, u32 fh, enum zpci_state state); int zpci_create_device(u32 fid, u32 fh, enum zpci_state state);
void zpci_remove_device(struct zpci_dev *zdev, bool set_error);
int zpci_enable_device(struct zpci_dev *); int zpci_enable_device(struct zpci_dev *);
int zpci_disable_device(struct zpci_dev *); int zpci_disable_device(struct zpci_dev *);
int zpci_configure_device(struct zpci_dev *zdev, u32 fh); int zpci_configure_device(struct zpci_dev *zdev, u32 fh);
......
...@@ -679,39 +679,6 @@ int zpci_disable_device(struct zpci_dev *zdev) ...@@ -679,39 +679,6 @@ int zpci_disable_device(struct zpci_dev *zdev)
return clp_disable_fh(zdev); return clp_disable_fh(zdev);
} }
/* zpci_remove_device - Removes the given zdev from the PCI core
* @zdev: the zdev to be removed from the PCI core
* @set_error: if true the device's error state is set to permanent failure
*
* Sets a zPCI device to a configured but offline state; the zPCI
* device is still accessible through its hotplug slot and the zPCI
* API but is removed from the common code PCI bus, making it
* no longer available to drivers.
*/
void zpci_remove_device(struct zpci_dev *zdev, bool set_error)
{
struct zpci_bus *zbus = zdev->zbus;
struct pci_dev *pdev;
if (!zdev->zbus->bus)
return;
pdev = pci_get_slot(zbus->bus, zdev->devfn);
if (pdev) {
if (set_error)
pdev->error_state = pci_channel_io_perm_failure;
if (pdev->is_virtfn) {
zpci_iov_remove_virtfn(pdev, zdev->vfn);
/* balance pci_get_slot */
pci_dev_put(pdev);
return;
}
pci_stop_and_remove_bus_device_locked(pdev);
/* balance pci_get_slot */
pci_dev_put(pdev);
}
}
/** /**
* zpci_create_device() - Create a new zpci_dev and add it to the zbus * zpci_create_device() - Create a new zpci_dev and add it to the zbus
* @fid: Function ID of the device to be created * @fid: Function ID of the device to be created
...@@ -847,7 +814,7 @@ int zpci_deconfigure_device(struct zpci_dev *zdev) ...@@ -847,7 +814,7 @@ int zpci_deconfigure_device(struct zpci_dev *zdev)
int rc; int rc;
if (zdev->zbus->bus) if (zdev->zbus->bus)
zpci_remove_device(zdev, false); zpci_bus_remove_device(zdev, false);
if (zdev_enabled(zdev)) { if (zdev_enabled(zdev)) {
rc = zpci_disable_device(zdev); rc = zpci_disable_device(zdev);
...@@ -870,7 +837,7 @@ void zpci_release_device(struct kref *kref) ...@@ -870,7 +837,7 @@ void zpci_release_device(struct kref *kref)
int ret; int ret;
if (zdev->zbus->bus) if (zdev->zbus->bus)
zpci_remove_device(zdev, false); zpci_bus_remove_device(zdev, false);
if (zdev_enabled(zdev)) if (zdev_enabled(zdev))
zpci_disable_device(zdev); zpci_disable_device(zdev);
......
...@@ -30,6 +30,39 @@ static LIST_HEAD(zbus_list); ...@@ -30,6 +30,39 @@ static LIST_HEAD(zbus_list);
static DEFINE_SPINLOCK(zbus_list_lock); static DEFINE_SPINLOCK(zbus_list_lock);
static int zpci_nb_devices; static int zpci_nb_devices;
/* zpci_bus_remove_device - Removes the given zdev from the PCI core
* @zdev: the zdev to be removed from the PCI core
* @set_error: if true the device's error state is set to permanent failure
*
* Sets a zPCI device to a configured but offline state; the zPCI
* device is still accessible through its hotplug slot and the zPCI
* API but is removed from the common code PCI bus, making it
* no longer available to drivers.
*/
void zpci_bus_remove_device(struct zpci_dev *zdev, bool set_error)
{
struct zpci_bus *zbus = zdev->zbus;
struct pci_dev *pdev;
if (!zdev->zbus->bus)
return;
pdev = pci_get_slot(zbus->bus, zdev->devfn);
if (pdev) {
if (set_error)
pdev->error_state = pci_channel_io_perm_failure;
if (pdev->is_virtfn) {
zpci_iov_remove_virtfn(pdev, zdev->vfn);
/* balance pci_get_slot */
pci_dev_put(pdev);
return;
}
pci_stop_and_remove_bus_device_locked(pdev);
/* balance pci_get_slot */
pci_dev_put(pdev);
}
}
/* zpci_bus_scan /* zpci_bus_scan
* @zbus: the zbus holding the zdevices * @zbus: the zbus holding the zdevices
* @ops: the pci operations * @ops: the pci operations
......
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
int zpci_bus_device_register(struct zpci_dev *zdev, struct pci_ops *ops); int zpci_bus_device_register(struct zpci_dev *zdev, struct pci_ops *ops);
void zpci_bus_device_unregister(struct zpci_dev *zdev); void zpci_bus_device_unregister(struct zpci_dev *zdev);
void zpci_bus_remove_device(struct zpci_dev *zdev, bool set_error);
void zpci_release_device(struct kref *kref); void zpci_release_device(struct kref *kref);
static inline void zpci_zdev_put(struct zpci_dev *zdev) static inline void zpci_zdev_put(struct zpci_dev *zdev)
{ {
......
...@@ -82,7 +82,7 @@ static void zpci_event_hard_deconfigured(struct zpci_dev *zdev, u32 fh) ...@@ -82,7 +82,7 @@ static void zpci_event_hard_deconfigured(struct zpci_dev *zdev, u32 fh)
/* Give the driver a hint that the function is /* Give the driver a hint that the function is
* already unusable. * already unusable.
*/ */
zpci_remove_device(zdev, true); zpci_bus_remove_device(zdev, true);
if (zdev_enabled(zdev)) { if (zdev_enabled(zdev)) {
rc = zpci_disable_device(zdev); rc = zpci_disable_device(zdev);
if (rc) if (rc)
......
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