vchi_msg_dequeue() provides the same functionality as vchi_msg_hold()
except it copies the message data as opposed to the later which provides
the data in place.

The copying is done on a local variable, so there is no need to keep the
message out the function's bounds, so use vchi_msg_hold() instead.

Signed-off-by: Nicolas Saenz Julienne <nsaenzjulie...@suse.de>
---
 .../bcm2835-audio/bcm2835-vchiq.c             | 25 +++++++++++--------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c 
b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
index 62eef233275f..5018b5baa009 100644
--- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
+++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
@@ -94,31 +94,34 @@ static void audio_vchi_callback(void *param,
                                void *msg_handle)
 {
        struct bcm2835_audio_instance *instance = param;
-       struct vc_audio_msg m;
-       int msg_len;
+       struct vchi_held_msg handle;
+       struct vc_audio_msg *m;
+       unsigned size;
        int status;
 
        if (reason != VCHI_CALLBACK_MSG_AVAILABLE)
                return;
 
-       status = vchi_msg_dequeue(instance->service,
-                                 &m, sizeof(m), &msg_len, VCHI_FLAGS_NONE);
+       status = vchi_msg_hold(instance->service, (void **)&m, &size,
+                              VCHI_FLAGS_NONE, &handle);
        if (status)
                return;
 
-       if (m.type == VC_AUDIO_MSG_TYPE_RESULT) {
-               instance->result = m.result.success;
+       if (m->type == VC_AUDIO_MSG_TYPE_RESULT) {
+               instance->result = m->result.success;
                complete(&instance->msg_avail_comp);
-       } else if (m.type == VC_AUDIO_MSG_TYPE_COMPLETE) {
-               if (m.complete.cookie1 != VC_AUDIO_WRITE_COOKIE1 ||
-                   m.complete.cookie2 != VC_AUDIO_WRITE_COOKIE2)
+       } else if (m->type == VC_AUDIO_MSG_TYPE_COMPLETE) {
+               if (m->complete.cookie1 != VC_AUDIO_WRITE_COOKIE1 ||
+                   m->complete.cookie2 != VC_AUDIO_WRITE_COOKIE2)
                        dev_err(instance->dev, "invalid cookie\n");
                else
                        bcm2835_playback_fifo(instance->alsa_stream,
-                                             m.complete.count);
+                                             m->complete.count);
        } else {
-               dev_err(instance->dev, "unexpected callback type=%d\n", m.type);
+               dev_err(instance->dev, "unexpected callback type=%d\n", 
m->type);
        }
+
+       vchi_held_msg_release(&handle);
 }
 
 static int
-- 
2.27.0

Reply via email to