vio: make remove callback return void

The driver core ignores the return value of struct bus_type::remove()
because there is only little that can be done. To simplify the quest to
make this function return void, let struct vio_driver::remove() return
void, too. All users already unconditionally return 0, this commit makes
it obvious that returning an error code is a bad idea.

Note there are two nominally different implementations for a vio bus:
one in arch/sparc/kernel/vio.c and the other in
arch/powerpc/platforms/pseries/vio.c. This patch only adapts the powerpc
one.

Before this patch for a device that was bound to a driver without a
remove callback vio_cmo_bus_remove(viodev) wasn't called. As the device
core still considers the device unbound after vio_bus_remove() returns
calling this unconditionally is the consistent behaviour which is
implemented here.

Signed-off-by: Uwe Kleine-König <uwe@kleine-koenig.org>
Reviewed-by: Tyrel Datwyler <tyreld@linux.ibm.com>
Acked-by: Lijun Pan <ljp@linux.ibm.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
[mpe: Drop unneeded hvcs_remove() forward declaration, squash in
 change from sfr to drop ibmvnic_remove() forward declaration]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210225221834.160083-1-uwe@kleine-koenig.org
This commit is contained in:
Uwe Kleine-König 2021-02-25 23:18:34 +01:00 committed by Michael Ellerman
parent 91b6c5dbe9
commit 386a966f5c
13 changed files with 15 additions and 37 deletions

View File

@ -113,7 +113,7 @@ struct vio_driver {
const char *name; const char *name;
const struct vio_device_id *id_table; const struct vio_device_id *id_table;
int (*probe)(struct vio_dev *dev, const struct vio_device_id *id); int (*probe)(struct vio_dev *dev, const struct vio_device_id *id);
int (*remove)(struct vio_dev *dev); void (*remove)(struct vio_dev *dev);
/* A driver must have a get_desired_dma() function to /* A driver must have a get_desired_dma() function to
* be loaded in a CMO environment if it uses DMA. * be loaded in a CMO environment if it uses DMA.
*/ */

View File

@ -1261,7 +1261,6 @@ static int vio_bus_remove(struct device *dev)
struct vio_dev *viodev = to_vio_dev(dev); struct vio_dev *viodev = to_vio_dev(dev);
struct vio_driver *viodrv = to_vio_driver(dev->driver); struct vio_driver *viodrv = to_vio_driver(dev->driver);
struct device *devptr; struct device *devptr;
int ret = 1;
/* /*
* Hold a reference to the device after the remove function is called * Hold a reference to the device after the remove function is called
@ -1270,13 +1269,13 @@ static int vio_bus_remove(struct device *dev)
devptr = get_device(dev); devptr = get_device(dev);
if (viodrv->remove) if (viodrv->remove)
ret = viodrv->remove(viodev); viodrv->remove(viodev);
if (!ret && firmware_has_feature(FW_FEATURE_CMO)) if (firmware_has_feature(FW_FEATURE_CMO))
vio_cmo_bus_remove(viodev); vio_cmo_bus_remove(viodev);
put_device(devptr); put_device(devptr);
return ret; return 0;
} }
/** /**

View File

@ -54,10 +54,9 @@ static int pseries_rng_probe(struct vio_dev *dev,
return hwrng_register(&pseries_rng); return hwrng_register(&pseries_rng);
} }
static int pseries_rng_remove(struct vio_dev *dev) static void pseries_rng_remove(struct vio_dev *dev)
{ {
hwrng_unregister(&pseries_rng); hwrng_unregister(&pseries_rng);
return 0;
} }
static const struct vio_device_id pseries_rng_driver_ids[] = { static const struct vio_device_id pseries_rng_driver_ids[] = {

View File

@ -343,7 +343,7 @@ static int ibmvtpm_crq_send_init_complete(struct ibmvtpm_dev *ibmvtpm)
* *
* Return: Always 0. * Return: Always 0.
*/ */
static int tpm_ibmvtpm_remove(struct vio_dev *vdev) static void tpm_ibmvtpm_remove(struct vio_dev *vdev)
{ {
struct tpm_chip *chip = dev_get_drvdata(&vdev->dev); struct tpm_chip *chip = dev_get_drvdata(&vdev->dev);
struct ibmvtpm_dev *ibmvtpm = dev_get_drvdata(&chip->dev); struct ibmvtpm_dev *ibmvtpm = dev_get_drvdata(&chip->dev);
@ -372,8 +372,6 @@ static int tpm_ibmvtpm_remove(struct vio_dev *vdev)
kfree(ibmvtpm); kfree(ibmvtpm);
/* For tpm_ibmvtpm_get_desired_dma */ /* For tpm_ibmvtpm_get_desired_dma */
dev_set_drvdata(&vdev->dev, NULL); dev_set_drvdata(&vdev->dev, NULL);
return 0;
} }
/** /**

View File

@ -1042,7 +1042,7 @@ error:
return ret; return ret;
} }
static int nx842_remove(struct vio_dev *viodev) static void nx842_remove(struct vio_dev *viodev)
{ {
struct nx842_devdata *old_devdata; struct nx842_devdata *old_devdata;
unsigned long flags; unsigned long flags;
@ -1063,8 +1063,6 @@ static int nx842_remove(struct vio_dev *viodev)
if (old_devdata) if (old_devdata)
kfree(old_devdata->counters); kfree(old_devdata->counters);
kfree(old_devdata); kfree(old_devdata);
return 0;
} }
static const struct vio_device_id nx842_vio_driver_ids[] = { static const struct vio_device_id nx842_vio_driver_ids[] = {

View File

@ -783,7 +783,7 @@ static int nx_probe(struct vio_dev *viodev, const struct vio_device_id *id)
return nx_register_algs(); return nx_register_algs();
} }
static int nx_remove(struct vio_dev *viodev) static void nx_remove(struct vio_dev *viodev)
{ {
dev_dbg(&viodev->dev, "entering nx_remove for UA 0x%x\n", dev_dbg(&viodev->dev, "entering nx_remove for UA 0x%x\n",
viodev->unit_address); viodev->unit_address);
@ -811,8 +811,6 @@ static int nx_remove(struct vio_dev *viodev)
nx_unregister_skcipher(&nx_ecb_aes_alg, NX_FC_AES, nx_unregister_skcipher(&nx_ecb_aes_alg, NX_FC_AES,
NX_MODE_AES_ECB); NX_MODE_AES_ECB);
} }
return 0;
} }

View File

@ -2288,15 +2288,13 @@ crq_failed:
return -EPERM; return -EPERM;
} }
static int ibmvmc_remove(struct vio_dev *vdev) static void ibmvmc_remove(struct vio_dev *vdev)
{ {
struct crq_server_adapter *adapter = dev_get_drvdata(&vdev->dev); struct crq_server_adapter *adapter = dev_get_drvdata(&vdev->dev);
dev_info(adapter->dev, "Entering remove for UA 0x%x\n", dev_info(adapter->dev, "Entering remove for UA 0x%x\n",
vdev->unit_address); vdev->unit_address);
ibmvmc_release_crq_queue(adapter); ibmvmc_release_crq_queue(adapter);
return 0;
} }
static struct vio_device_id ibmvmc_device_table[] = { static struct vio_device_id ibmvmc_device_table[] = {

View File

@ -1758,7 +1758,7 @@ static int ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id)
return 0; return 0;
} }
static int ibmveth_remove(struct vio_dev *dev) static void ibmveth_remove(struct vio_dev *dev)
{ {
struct net_device *netdev = dev_get_drvdata(&dev->dev); struct net_device *netdev = dev_get_drvdata(&dev->dev);
struct ibmveth_adapter *adapter = netdev_priv(netdev); struct ibmveth_adapter *adapter = netdev_priv(netdev);
@ -1771,8 +1771,6 @@ static int ibmveth_remove(struct vio_dev *dev)
free_netdev(netdev); free_netdev(netdev);
dev_set_drvdata(&dev->dev, NULL); dev_set_drvdata(&dev->dev, NULL);
return 0;
} }
static struct attribute veth_active_attr; static struct attribute veth_active_attr;

View File

@ -78,7 +78,6 @@ MODULE_LICENSE("GPL");
MODULE_VERSION(IBMVNIC_DRIVER_VERSION); MODULE_VERSION(IBMVNIC_DRIVER_VERSION);
static int ibmvnic_version = IBMVNIC_INITIAL_VERSION; static int ibmvnic_version = IBMVNIC_INITIAL_VERSION;
static int ibmvnic_remove(struct vio_dev *);
static void release_sub_crqs(struct ibmvnic_adapter *, bool); static void release_sub_crqs(struct ibmvnic_adapter *, bool);
static int ibmvnic_reset_crq(struct ibmvnic_adapter *); static int ibmvnic_reset_crq(struct ibmvnic_adapter *);
static int ibmvnic_send_crq_init(struct ibmvnic_adapter *); static int ibmvnic_send_crq_init(struct ibmvnic_adapter *);
@ -5396,7 +5395,7 @@ ibmvnic_init_fail:
return rc; return rc;
} }
static int ibmvnic_remove(struct vio_dev *dev) static void ibmvnic_remove(struct vio_dev *dev)
{ {
struct net_device *netdev = dev_get_drvdata(&dev->dev); struct net_device *netdev = dev_get_drvdata(&dev->dev);
struct ibmvnic_adapter *adapter = netdev_priv(netdev); struct ibmvnic_adapter *adapter = netdev_priv(netdev);
@ -5437,8 +5436,6 @@ static int ibmvnic_remove(struct vio_dev *dev)
device_remove_file(&dev->dev, &dev_attr_failover); device_remove_file(&dev->dev, &dev_attr_failover);
free_netdev(netdev); free_netdev(netdev);
dev_set_drvdata(&dev->dev, NULL); dev_set_drvdata(&dev->dev, NULL);
return 0;
} }
static ssize_t failover_store(struct device *dev, struct device_attribute *attr, static ssize_t failover_store(struct device *dev, struct device_attribute *attr,

View File

@ -6038,7 +6038,7 @@ out:
* Return value: * Return value:
* 0 * 0
**/ **/
static int ibmvfc_remove(struct vio_dev *vdev) static void ibmvfc_remove(struct vio_dev *vdev)
{ {
struct ibmvfc_host *vhost = dev_get_drvdata(&vdev->dev); struct ibmvfc_host *vhost = dev_get_drvdata(&vdev->dev);
LIST_HEAD(purge); LIST_HEAD(purge);
@ -6070,7 +6070,6 @@ static int ibmvfc_remove(struct vio_dev *vdev)
spin_unlock(&ibmvfc_driver_lock); spin_unlock(&ibmvfc_driver_lock);
scsi_host_put(vhost->host); scsi_host_put(vhost->host);
LEAVE; LEAVE;
return 0;
} }
/** /**

View File

@ -2335,7 +2335,7 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id)
return -1; return -1;
} }
static int ibmvscsi_remove(struct vio_dev *vdev) static void ibmvscsi_remove(struct vio_dev *vdev)
{ {
struct ibmvscsi_host_data *hostdata = dev_get_drvdata(&vdev->dev); struct ibmvscsi_host_data *hostdata = dev_get_drvdata(&vdev->dev);
@ -2356,8 +2356,6 @@ static int ibmvscsi_remove(struct vio_dev *vdev)
spin_unlock(&ibmvscsi_driver_lock); spin_unlock(&ibmvscsi_driver_lock);
scsi_host_put(hostdata->host); scsi_host_put(hostdata->host);
return 0;
} }
/** /**

View File

@ -3595,7 +3595,7 @@ free_adapter:
return rc; return rc;
} }
static int ibmvscsis_remove(struct vio_dev *vdev) static void ibmvscsis_remove(struct vio_dev *vdev)
{ {
struct scsi_info *vscsi = dev_get_drvdata(&vdev->dev); struct scsi_info *vscsi = dev_get_drvdata(&vdev->dev);
@ -3622,8 +3622,6 @@ static int ibmvscsis_remove(struct vio_dev *vdev)
list_del(&vscsi->list); list_del(&vscsi->list);
spin_unlock_bh(&ibmvscsis_dev_lock); spin_unlock_bh(&ibmvscsis_dev_lock);
kfree(vscsi); kfree(vscsi);
return 0;
} }
static ssize_t system_id_show(struct device *dev, static ssize_t system_id_show(struct device *dev,

View File

@ -317,7 +317,6 @@ static void hvcs_hangup(struct tty_struct * tty);
static int hvcs_probe(struct vio_dev *dev, static int hvcs_probe(struct vio_dev *dev,
const struct vio_device_id *id); const struct vio_device_id *id);
static int hvcs_remove(struct vio_dev *dev);
static int __init hvcs_module_init(void); static int __init hvcs_module_init(void);
static void __exit hvcs_module_exit(void); static void __exit hvcs_module_exit(void);
static int hvcs_initialize(void); static int hvcs_initialize(void);
@ -819,7 +818,7 @@ static int hvcs_probe(
return 0; return 0;
} }
static int hvcs_remove(struct vio_dev *dev) static void hvcs_remove(struct vio_dev *dev)
{ {
struct hvcs_struct *hvcsd = dev_get_drvdata(&dev->dev); struct hvcs_struct *hvcsd = dev_get_drvdata(&dev->dev);
unsigned long flags; unsigned long flags;
@ -849,7 +848,6 @@ static int hvcs_remove(struct vio_dev *dev)
printk(KERN_INFO "HVCS: vty-server@%X removed from the" printk(KERN_INFO "HVCS: vty-server@%X removed from the"
" vio bus.\n", dev->unit_address); " vio bus.\n", dev->unit_address);
return 0;
}; };
static struct vio_driver hvcs_vio_driver = { static struct vio_driver hvcs_vio_driver = {