diff options
Diffstat (limited to 'target/linux/brcm2708/patches-3.10/0109-vchiq-fix-the-shim-message-release.patch')
-rw-r--r-- | target/linux/brcm2708/patches-3.10/0109-vchiq-fix-the-shim-message-release.patch | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/target/linux/brcm2708/patches-3.10/0109-vchiq-fix-the-shim-message-release.patch b/target/linux/brcm2708/patches-3.10/0109-vchiq-fix-the-shim-message-release.patch new file mode 100644 index 0000000000..fa8e79ccb8 --- /dev/null +++ b/target/linux/brcm2708/patches-3.10/0109-vchiq-fix-the-shim-message-release.patch @@ -0,0 +1,89 @@ +From 6d8dc87966b488c93a365657588690137de13ed1 Mon Sep 17 00:00:00 2001 +From: Vincent Sanders <vincent.sanders@collabora.co.uk> +Date: Mon, 30 Sep 2013 17:04:55 +0100 +Subject: [PATCH 109/174] vchiq: fix the shim message release + +Signed-off-by: Daniel Stone <daniels@collabora.com> +--- + .../vc04_services/interface/vchiq_arm/vchiq_shim.c | 47 +++++++++++++--------- + 1 file changed, 29 insertions(+), 18 deletions(-) + +--- a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c ++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c +@@ -545,47 +545,58 @@ static VCHIQ_STATUS_T shim_callback(VCHI + SHIM_SERVICE_T *service = + (SHIM_SERVICE_T *)VCHIQ_GET_SERVICE_USERDATA(handle); + ++ if (!service->callback) ++ goto release; ++ + switch (reason) { + case VCHIQ_MESSAGE_AVAILABLE: + vchiu_queue_push(&service->queue, header); + +- if (service->callback) +- service->callback(service->callback_param, +- VCHI_CALLBACK_MSG_AVAILABLE, NULL); ++ service->callback(service->callback_param, ++ VCHI_CALLBACK_MSG_AVAILABLE, NULL); ++ ++ goto done; + break; ++ + case VCHIQ_BULK_TRANSMIT_DONE: +- if (service->callback) +- service->callback(service->callback_param, +- VCHI_CALLBACK_BULK_SENT, bulk_user); ++ service->callback(service->callback_param, ++ VCHI_CALLBACK_BULK_SENT, bulk_user); + break; ++ + case VCHIQ_BULK_RECEIVE_DONE: +- if (service->callback) +- service->callback(service->callback_param, +- VCHI_CALLBACK_BULK_RECEIVED, bulk_user); ++ service->callback(service->callback_param, ++ VCHI_CALLBACK_BULK_RECEIVED, bulk_user); + break; ++ + case VCHIQ_SERVICE_CLOSED: +- if (service->callback) +- service->callback(service->callback_param, +- VCHI_CALLBACK_SERVICE_CLOSED, NULL); ++ service->callback(service->callback_param, ++ VCHI_CALLBACK_SERVICE_CLOSED, NULL); + break; ++ + case VCHIQ_SERVICE_OPENED: + /* No equivalent VCHI reason */ + break; ++ + case VCHIQ_BULK_TRANSMIT_ABORTED: +- if (service->callback) +- service->callback(service->callback_param, +- VCHI_CALLBACK_BULK_TRANSMIT_ABORTED, bulk_user); ++ service->callback(service->callback_param, ++ VCHI_CALLBACK_BULK_TRANSMIT_ABORTED, ++ bulk_user); + break; ++ + case VCHIQ_BULK_RECEIVE_ABORTED: +- if (service->callback) +- service->callback(service->callback_param, +- VCHI_CALLBACK_BULK_RECEIVE_ABORTED, bulk_user); ++ service->callback(service->callback_param, ++ VCHI_CALLBACK_BULK_RECEIVE_ABORTED, ++ bulk_user); + break; ++ + default: + WARN(1, "not supported\n"); + break; + } + ++release: ++ vchiq_release_message(service->handle, header); ++done: + return VCHIQ_SUCCESS; + } + |