Commit 9a187c41 authored by Florian Mickler's avatar Florian Mickler Committed by Mauro Carvalho Chehab

[media] vp702x: fix locking of usb operations

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: default avatarFlorian Mickler <florian@mickler.org>
Cc: Patrick Boettcher <pb@linuxtv.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 57873c72
...@@ -30,8 +30,8 @@ struct vp702x_adapter_state { ...@@ -30,8 +30,8 @@ struct vp702x_adapter_state {
u8 pid_filter_state; u8 pid_filter_state;
}; };
/* check for mutex FIXME */ static int vp702x_usb_in_op_unlocked(struct dvb_usb_device *d, u8 req,
int vp702x_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen) u16 value, u16 index, u8 *b, int blen)
{ {
int ret; int ret;
...@@ -55,8 +55,20 @@ int vp702x_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 ...@@ -55,8 +55,20 @@ int vp702x_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8
return ret; return ret;
} }
static int vp702x_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value, int vp702x_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value,
u16 index, u8 *b, int blen) 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; int ret;
deb_xfer("out: req. %02x, val: %04x, ind: %04x, buffer: ",req,value,index); 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, ...@@ -74,6 +86,18 @@ static int vp702x_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value,
return 0; 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 vp702x_usb_inout_op(struct dvb_usb_device *d, u8 *o, int olen, u8 *i, int ilen, int msec)
{ {
int ret; int ret;
...@@ -81,12 +105,11 @@ int vp702x_usb_inout_op(struct dvb_usb_device *d, u8 *o, int olen, u8 *i, int il ...@@ -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))) if ((ret = mutex_lock_interruptible(&d->usb_mutex)))
return ret; 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); 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); mutex_unlock(&d->usb_mutex);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment