brcm2708: update against latest rpi-3.10.y branch
[openwrt/svn-archive/archive.git] / target / linux / brcm2708 / patches-3.10 / 0109-vchiq-fix-the-shim-message-release.patch
1 From 6d8dc87966b488c93a365657588690137de13ed1 Mon Sep 17 00:00:00 2001
2 From: Vincent Sanders <vincent.sanders@collabora.co.uk>
3 Date: Mon, 30 Sep 2013 17:04:55 +0100
4 Subject: [PATCH 109/174] vchiq: fix the shim message release
5
6 Signed-off-by: Daniel Stone <daniels@collabora.com>
7 ---
8 .../vc04_services/interface/vchiq_arm/vchiq_shim.c | 47 +++++++++++++---------
9 1 file changed, 29 insertions(+), 18 deletions(-)
10
11 --- a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c
12 +++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c
13 @@ -545,47 +545,58 @@ static VCHIQ_STATUS_T shim_callback(VCHI
14 SHIM_SERVICE_T *service =
15 (SHIM_SERVICE_T *)VCHIQ_GET_SERVICE_USERDATA(handle);
16
17 + if (!service->callback)
18 + goto release;
19 +
20 switch (reason) {
21 case VCHIQ_MESSAGE_AVAILABLE:
22 vchiu_queue_push(&service->queue, header);
23
24 - if (service->callback)
25 - service->callback(service->callback_param,
26 - VCHI_CALLBACK_MSG_AVAILABLE, NULL);
27 + service->callback(service->callback_param,
28 + VCHI_CALLBACK_MSG_AVAILABLE, NULL);
29 +
30 + goto done;
31 break;
32 +
33 case VCHIQ_BULK_TRANSMIT_DONE:
34 - if (service->callback)
35 - service->callback(service->callback_param,
36 - VCHI_CALLBACK_BULK_SENT, bulk_user);
37 + service->callback(service->callback_param,
38 + VCHI_CALLBACK_BULK_SENT, bulk_user);
39 break;
40 +
41 case VCHIQ_BULK_RECEIVE_DONE:
42 - if (service->callback)
43 - service->callback(service->callback_param,
44 - VCHI_CALLBACK_BULK_RECEIVED, bulk_user);
45 + service->callback(service->callback_param,
46 + VCHI_CALLBACK_BULK_RECEIVED, bulk_user);
47 break;
48 +
49 case VCHIQ_SERVICE_CLOSED:
50 - if (service->callback)
51 - service->callback(service->callback_param,
52 - VCHI_CALLBACK_SERVICE_CLOSED, NULL);
53 + service->callback(service->callback_param,
54 + VCHI_CALLBACK_SERVICE_CLOSED, NULL);
55 break;
56 +
57 case VCHIQ_SERVICE_OPENED:
58 /* No equivalent VCHI reason */
59 break;
60 +
61 case VCHIQ_BULK_TRANSMIT_ABORTED:
62 - if (service->callback)
63 - service->callback(service->callback_param,
64 - VCHI_CALLBACK_BULK_TRANSMIT_ABORTED, bulk_user);
65 + service->callback(service->callback_param,
66 + VCHI_CALLBACK_BULK_TRANSMIT_ABORTED,
67 + bulk_user);
68 break;
69 +
70 case VCHIQ_BULK_RECEIVE_ABORTED:
71 - if (service->callback)
72 - service->callback(service->callback_param,
73 - VCHI_CALLBACK_BULK_RECEIVE_ABORTED, bulk_user);
74 + service->callback(service->callback_param,
75 + VCHI_CALLBACK_BULK_RECEIVE_ABORTED,
76 + bulk_user);
77 break;
78 +
79 default:
80 WARN(1, "not supported\n");
81 break;
82 }
83
84 +release:
85 + vchiq_release_message(service->handle, header);
86 +done:
87 return VCHIQ_SUCCESS;
88 }
89