Adds error handling to the chipset_device_create message. If it returns a failure, it is assumed it has not signaled the s-Par firmware of the failure and the caller must do that. Signed-off-by: David Kershner <david.kershner@xxxxxxxxxx> Reviewed-by: Reviewed-by: Tim Sell <timothy.sell@xxxxxxxxxx> --- drivers/staging/unisys/visorbus/visorbus_main.c | 22 ++++++++------- drivers/staging/unisys/visorbus/visorbus_private.h | 2 +- drivers/staging/unisys/visorbus/visorchipset.c | 12 ++++++-- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c index 87fb343..9ef91c7 100644 --- a/drivers/staging/unisys/visorbus/visorbus_main.c +++ b/drivers/staging/unisys/visorbus/visorbus_main.c @@ -1118,25 +1118,29 @@ chipset_bus_destroy(struct visor_device *dev) bus_destroy_response(dev, 0); } -void +int chipset_device_create(struct visor_device *dev_info) { - int rc; + int err; u32 bus_no = dev_info->chipset_bus_no; u32 dev_no = dev_info->chipset_dev_no; POSTCODE_LINUX(DEVICE_CREATE_ENTRY_PC, dev_no, bus_no, DIAG_SEVERITY_PRINT); - rc = create_visor_device(dev_info); - device_create_response(dev_info, rc); - - if (rc < 0) + err = create_visor_device(dev_info); + if (err < 0) { POSTCODE_LINUX(DEVICE_CREATE_FAILURE_PC, dev_no, bus_no, DIAG_SEVERITY_ERR); - else - POSTCODE_LINUX(DEVICE_CREATE_SUCCESS_PC, dev_no, bus_no, - DIAG_SEVERITY_PRINT); + return err; + } + + POSTCODE_LINUX(DEVICE_CREATE_SUCCESS_PC, dev_no, bus_no, + DIAG_SEVERITY_PRINT); + + device_create_response(dev_info, err); + + return 0; } void diff --git a/drivers/staging/unisys/visorbus/visorbus_private.h b/drivers/staging/unisys/visorbus/visorbus_private.h index 597c2de..7efe4d4 100644 --- a/drivers/staging/unisys/visorbus/visorbus_private.h +++ b/drivers/staging/unisys/visorbus/visorbus_private.h @@ -29,7 +29,7 @@ int chipset_bus_create(struct visor_device *bus_info); void chipset_bus_destroy(struct visor_device *bus_info); -void chipset_device_create(struct visor_device *dev_info); +int chipset_device_create(struct visor_device *dev_info); void chipset_device_destroy(struct visor_device *dev_info); void chipset_device_pause(struct visor_device *dev_info); void chipset_device_resume(struct visor_device *dev_info); diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c index d7ddf55..2582053 100644 --- a/drivers/staging/unisys/visorbus/visorchipset.c +++ b/drivers/staging/unisys/visorbus/visorchipset.c @@ -853,14 +853,14 @@ my_device_create(struct controlvm_message *inmsg) spar_vhba_channel_protocol_uuid) == 0) { err = save_crash_message(inmsg, CRASH_DEV); if (err) - goto err_free_dev_info; + goto err_destroy_visorchannel; } if (inmsg->hdr.flags.response_expected == 1) { pmsg_hdr = kzalloc(sizeof(*pmsg_hdr), GFP_KERNEL); if (!pmsg_hdr) { err = -ENOMEM; - goto err_free_dev_info; + goto err_destroy_visorchannel; } memcpy(pmsg_hdr, &inmsg->hdr, @@ -868,11 +868,17 @@ my_device_create(struct controlvm_message *inmsg) dev_info->pending_msg_hdr = pmsg_hdr; } /* Chipset_device_create will send response */ - chipset_device_create(dev_info); + err = chipset_device_create(dev_info); + if (err) + goto err_destroy_visorchannel; + POSTCODE_LINUX(DEVICE_CREATE_EXIT_PC, dev_no, bus_no, DIAG_SEVERITY_PRINT); return 0; +err_destroy_visorchannel: + visorchannel_destroy(visorchannel); + err_free_dev_info: kfree(dev_info); -- git-series 0.9.1 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel