|
@@ -251,6 +251,8 @@ static int vfio_platform_open(void *device_data)
|
|
|
mutex_lock(&driver_lock);
|
|
|
|
|
|
if (!vdev->refcnt) {
|
|
|
+ const char *extra_dbg = NULL;
|
|
|
+
|
|
|
ret = vfio_platform_regions_init(vdev);
|
|
|
if (ret)
|
|
|
goto err_reg;
|
|
@@ -259,7 +261,12 @@ static int vfio_platform_open(void *device_data)
|
|
|
if (ret)
|
|
|
goto err_irq;
|
|
|
|
|
|
- vfio_platform_call_reset(vdev, NULL);
|
|
|
+ ret = vfio_platform_call_reset(vdev, &extra_dbg);
|
|
|
+ if (ret && vdev->reset_required) {
|
|
|
+ dev_warn(vdev->device, "reset driver is required and reset call failed in open (%d) %s\n",
|
|
|
+ ret, extra_dbg ? extra_dbg : "");
|
|
|
+ goto err_rst;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
vdev->refcnt++;
|
|
@@ -267,6 +274,8 @@ static int vfio_platform_open(void *device_data)
|
|
|
mutex_unlock(&driver_lock);
|
|
|
return 0;
|
|
|
|
|
|
+err_rst:
|
|
|
+ vfio_platform_irq_cleanup(vdev);
|
|
|
err_irq:
|
|
|
vfio_platform_regions_cleanup(vdev);
|
|
|
err_reg:
|