mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-21 14:11:20 +00:00
s390/pci: implement pcibios_remove_bus
Implement pcibios_remove_bus to free arch specific data when a pci bus is deregistered. While at it remove a useless kzalloc/kfree wrapper. Reviewed-by: Gerald Schaefer <gerald.schaefer@de.ibm.com> Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
7a572a3ab1
commit
7d594322b2
3 changed files with 39 additions and 40 deletions
|
@ -124,12 +124,10 @@ static inline bool zdev_enabled(struct zpci_dev *zdev)
|
||||||
Prototypes
|
Prototypes
|
||||||
----------------------------------------------------------------------------- */
|
----------------------------------------------------------------------------- */
|
||||||
/* Base stuff */
|
/* Base stuff */
|
||||||
struct zpci_dev *zpci_alloc_device(void);
|
|
||||||
int zpci_create_device(struct zpci_dev *);
|
int zpci_create_device(struct zpci_dev *);
|
||||||
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 *);
|
||||||
void zpci_stop_device(struct zpci_dev *);
|
void zpci_stop_device(struct zpci_dev *);
|
||||||
void zpci_free_device(struct zpci_dev *);
|
|
||||||
int zpci_register_ioat(struct zpci_dev *, u8, u64, u64, u64);
|
int zpci_register_ioat(struct zpci_dev *, u8, u64, u64, u64);
|
||||||
int zpci_unregister_ioat(struct zpci_dev *, u8);
|
int zpci_unregister_ioat(struct zpci_dev *, u8);
|
||||||
|
|
||||||
|
|
|
@ -530,20 +530,6 @@ static void zpci_unmap_resources(struct zpci_dev *zdev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct zpci_dev *zpci_alloc_device(void)
|
|
||||||
{
|
|
||||||
struct zpci_dev *zdev;
|
|
||||||
|
|
||||||
/* Alloc memory for our private pci device data */
|
|
||||||
zdev = kzalloc(sizeof(*zdev), GFP_KERNEL);
|
|
||||||
return zdev ? : ERR_PTR(-ENOMEM);
|
|
||||||
}
|
|
||||||
|
|
||||||
void zpci_free_device(struct zpci_dev *zdev)
|
|
||||||
{
|
|
||||||
kfree(zdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
int pcibios_add_platform_entries(struct pci_dev *pdev)
|
int pcibios_add_platform_entries(struct pci_dev *pdev)
|
||||||
{
|
{
|
||||||
return zpci_sysfs_add_device(&pdev->dev);
|
return zpci_sysfs_add_device(&pdev->dev);
|
||||||
|
@ -774,26 +760,6 @@ struct dev_pm_ops pcibios_pm_ops = {
|
||||||
};
|
};
|
||||||
#endif /* CONFIG_HIBERNATE_CALLBACKS */
|
#endif /* CONFIG_HIBERNATE_CALLBACKS */
|
||||||
|
|
||||||
static int zpci_scan_bus(struct zpci_dev *zdev)
|
|
||||||
{
|
|
||||||
LIST_HEAD(resources);
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = zpci_setup_bus_resources(zdev, &resources);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
zdev->bus = pci_scan_root_bus(NULL, ZPCI_BUS_NR, &pci_root_ops,
|
|
||||||
zdev, &resources);
|
|
||||||
if (!zdev->bus) {
|
|
||||||
zpci_cleanup_bus_resources(zdev);
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
zdev->bus->max_bus_speed = zdev->max_bus_speed;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int zpci_alloc_domain(struct zpci_dev *zdev)
|
static int zpci_alloc_domain(struct zpci_dev *zdev)
|
||||||
{
|
{
|
||||||
spin_lock(&zpci_domain_lock);
|
spin_lock(&zpci_domain_lock);
|
||||||
|
@ -814,6 +780,41 @@ static void zpci_free_domain(struct zpci_dev *zdev)
|
||||||
spin_unlock(&zpci_domain_lock);
|
spin_unlock(&zpci_domain_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pcibios_remove_bus(struct pci_bus *bus)
|
||||||
|
{
|
||||||
|
struct zpci_dev *zdev = get_zdev_by_bus(bus);
|
||||||
|
|
||||||
|
zpci_exit_slot(zdev);
|
||||||
|
zpci_cleanup_bus_resources(zdev);
|
||||||
|
zpci_free_domain(zdev);
|
||||||
|
|
||||||
|
spin_lock(&zpci_list_lock);
|
||||||
|
list_del(&zdev->entry);
|
||||||
|
spin_unlock(&zpci_list_lock);
|
||||||
|
|
||||||
|
kfree(zdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int zpci_scan_bus(struct zpci_dev *zdev)
|
||||||
|
{
|
||||||
|
LIST_HEAD(resources);
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = zpci_setup_bus_resources(zdev, &resources);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
zdev->bus = pci_scan_root_bus(NULL, ZPCI_BUS_NR, &pci_root_ops,
|
||||||
|
zdev, &resources);
|
||||||
|
if (!zdev->bus) {
|
||||||
|
zpci_cleanup_bus_resources(zdev);
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
zdev->bus->max_bus_speed = zdev->max_bus_speed;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int zpci_enable_device(struct zpci_dev *zdev)
|
int zpci_enable_device(struct zpci_dev *zdev)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
|
@ -155,9 +155,9 @@ int clp_add_pci_device(u32 fid, u32 fh, int configured)
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
zpci_dbg(3, "add fid:%x, fh:%x, c:%d\n", fid, fh, configured);
|
zpci_dbg(3, "add fid:%x, fh:%x, c:%d\n", fid, fh, configured);
|
||||||
zdev = zpci_alloc_device();
|
zdev = kzalloc(sizeof(*zdev), GFP_KERNEL);
|
||||||
if (IS_ERR(zdev))
|
if (!zdev)
|
||||||
return PTR_ERR(zdev);
|
return -ENOMEM;
|
||||||
|
|
||||||
zdev->fh = fh;
|
zdev->fh = fh;
|
||||||
zdev->fid = fid;
|
zdev->fid = fid;
|
||||||
|
@ -178,7 +178,7 @@ int clp_add_pci_device(u32 fid, u32 fh, int configured)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
zpci_free_device(zdev);
|
kfree(zdev);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue