From 4791194922d8ab361136d462a23e897b459d1a2a Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Mon, 30 Sep 2013 17:04:55 +0100 Subject: [PATCH 109/196] vchiq: fix the shim message release Signed-off-by: Daniel Stone --- .../vc04_services/interface/vchiq_arm/vchiq_shim.c | 47 +++++++++++++--------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c index f752f8d..fe9bd80 100644 --- 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(VCHIQ_REASON_T reason, 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; } -- 1.9.1