|
@@ -308,7 +308,7 @@ static int rproc_vdev_do_probe(struct rproc_subdev *subdev)
|
|
|
return rproc_add_virtio_dev(rvdev, rvdev->id);
|
|
|
}
|
|
|
|
|
|
-static void rproc_vdev_do_remove(struct rproc_subdev *subdev)
|
|
|
+static void rproc_vdev_do_remove(struct rproc_subdev *subdev, bool crashed)
|
|
|
{
|
|
|
struct rproc_vdev *rvdev = container_of(subdev, struct rproc_vdev, subdev);
|
|
|
|
|
@@ -789,17 +789,17 @@ static int rproc_probe_subdevices(struct rproc *rproc)
|
|
|
|
|
|
unroll_registration:
|
|
|
list_for_each_entry_continue_reverse(subdev, &rproc->subdevs, node)
|
|
|
- subdev->remove(subdev);
|
|
|
+ subdev->remove(subdev, true);
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static void rproc_remove_subdevices(struct rproc *rproc)
|
|
|
+static void rproc_remove_subdevices(struct rproc *rproc, bool crashed)
|
|
|
{
|
|
|
struct rproc_subdev *subdev;
|
|
|
|
|
|
list_for_each_entry_reverse(subdev, &rproc->subdevs, node)
|
|
|
- subdev->remove(subdev);
|
|
|
+ subdev->remove(subdev, crashed);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1009,13 +1009,13 @@ static int rproc_trigger_auto_boot(struct rproc *rproc)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static int rproc_stop(struct rproc *rproc)
|
|
|
+static int rproc_stop(struct rproc *rproc, bool crashed)
|
|
|
{
|
|
|
struct device *dev = &rproc->dev;
|
|
|
int ret;
|
|
|
|
|
|
/* remove any subdevices for the remote processor */
|
|
|
- rproc_remove_subdevices(rproc);
|
|
|
+ rproc_remove_subdevices(rproc, crashed);
|
|
|
|
|
|
/* the installed resource table is no longer accessible */
|
|
|
rproc->table_ptr = rproc->cached_table;
|
|
@@ -1163,7 +1163,7 @@ int rproc_trigger_recovery(struct rproc *rproc)
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- ret = rproc_stop(rproc);
|
|
|
+ ret = rproc_stop(rproc, false);
|
|
|
if (ret)
|
|
|
goto unlock_mutex;
|
|
|
|
|
@@ -1316,7 +1316,7 @@ void rproc_shutdown(struct rproc *rproc)
|
|
|
if (!atomic_dec_and_test(&rproc->power))
|
|
|
goto out;
|
|
|
|
|
|
- ret = rproc_stop(rproc);
|
|
|
+ ret = rproc_stop(rproc, true);
|
|
|
if (ret) {
|
|
|
atomic_inc(&rproc->power);
|
|
|
goto out;
|
|
@@ -1663,7 +1663,7 @@ EXPORT_SYMBOL(rproc_del);
|
|
|
void rproc_add_subdev(struct rproc *rproc,
|
|
|
struct rproc_subdev *subdev,
|
|
|
int (*probe)(struct rproc_subdev *subdev),
|
|
|
- void (*remove)(struct rproc_subdev *subdev))
|
|
|
+ void (*remove)(struct rproc_subdev *subdev, bool crashed))
|
|
|
{
|
|
|
subdev->probe = probe;
|
|
|
subdev->remove = remove;
|