diff options
author | David Kershner <david.kershner@unisys.com> | 2017-03-28 09:34:38 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-03-29 09:17:03 +0200 |
commit | 3f49a21deca8452cafbf4c01ee98cdb4f4966b51 (patch) | |
tree | 63db27e8f05a9d81e9f262891890b004750776df /drivers/staging | |
parent | 03156571160803875e9a9a0a966bcd2100a7ec2b (diff) |
staging: unisys: visorbus: add error handling for chipset_device_create
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@unisys.com>
Reviewed-by: Reviewed-by: Tim Sell <timothy.sell@unisys.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging')
-rw-r--r-- | drivers/staging/unisys/visorbus/visorbus_main.c | 22 | ||||
-rw-r--r-- | drivers/staging/unisys/visorbus/visorbus_private.h | 2 | ||||
-rw-r--r-- | 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 87fb343f28a3..9ef91c73dc0f 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 597c2dea3c51..7efe4d4c0d27 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 d7ddf55f97c1..2582053aea3d 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); |