[media] vp702x: fix locking of usb operations
authorFlorian Mickler <florian@mickler.org>
Mon, 21 Mar 2011 10:19:11 +0000 (07:19 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Fri, 20 May 2011 12:28:10 +0000 (09:28 -0300)
Otherwise it is not obvious that vp702x_usb_in_op or vp702x_usb_out_op
will not interfere with any vp702x_usb_inout_op.

Note: This change is tested to compile only, as I don't have the
hardware.

Signed-off-by: Florian Mickler <florian@mickler.org>
Cc: Patrick Boettcher <pb@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/dvb-usb/vp702x.c

index 35fe778..c82cb6b 100644 (file)
@@ -30,8 +30,8 @@ struct vp702x_adapter_state {
        u8  pid_filter_state;
 };
 
-/* check for mutex FIXME */
-int vp702x_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen)
+static int vp702x_usb_in_op_unlocked(struct dvb_usb_device *d, u8 req,
+                                    u16 value, u16 index, u8 *b, int blen)
 {
        int ret;
 
@@ -55,8 +55,20 @@ int vp702x_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8
        return ret;
 }
 
-static int vp702x_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value,
-                            u16 index, u8 *b, int blen)
+int vp702x_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value,
+                           u16 index, u8 *b, int blen)
+{
+       int ret;
+
+       mutex_lock(&d->usb_mutex);
+       ret = vp702x_usb_in_op_unlocked(d, req, value, index, b, blen);
+       mutex_unlock(&d->usb_mutex);
+
+       return ret;
+}
+
+int vp702x_usb_out_op_unlocked(struct dvb_usb_device *d, u8 req, u16 value,
+                                     u16 index, u8 *b, int blen)
 {
        int ret;
        deb_xfer("out: req. %02x, val: %04x, ind: %04x, buffer: ",req,value,index);
@@ -74,6 +86,18 @@ static int vp702x_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value,
                return 0;
 }
 
+int vp702x_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value,
+                            u16 index, u8 *b, int blen)
+{
+       int ret;
+
+       mutex_lock(&d->usb_mutex);
+       ret = vp702x_usb_out_op_unlocked(d, req, value, index, b, blen);
+       mutex_unlock(&d->usb_mutex);
+
+       return ret;
+}
+
 int vp702x_usb_inout_op(struct dvb_usb_device *d, u8 *o, int olen, u8 *i, int ilen, int msec)
 {
        int ret;
@@ -81,12 +105,11 @@ int vp702x_usb_inout_op(struct dvb_usb_device *d, u8 *o, int olen, u8 *i, int il
        if ((ret = mutex_lock_interruptible(&d->usb_mutex)))
                return ret;
 
-       ret = vp702x_usb_out_op(d,REQUEST_OUT,0,0,o,olen);
+       ret = vp702x_usb_out_op_unlocked(d, REQUEST_OUT, 0, 0, o, olen);
        msleep(msec);
-       ret = vp702x_usb_in_op(d,REQUEST_IN,0,0,i,ilen);
+       ret = vp702x_usb_in_op_unlocked(d, REQUEST_IN, 0, 0, i, ilen);
 
        mutex_unlock(&d->usb_mutex);
-
        return ret;
 }