From: David Kershner Date: Tue, 28 Mar 2017 13:34:38 +0000 (-0400) Subject: staging: unisys: visorbus: add error handling for chipset_device_create X-Git-Tag: v4.14-rc1~980^2~318 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3f49a21deca8452cafbf4c01ee98cdb4f4966b51;p=platform%2Fkernel%2Flinux-rpi.git 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 Reviewed-by: Reviewed-by: Tim Sell Signed-off-by: Greg Kroah-Hartman --- 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);