Commit 8c4ebae4 authored by Jean-Francois Moine's avatar Jean-Francois Moine Committed by Mauro Carvalho Chehab

V4L/DVB (13566): gspca - main: New variable usb_err for USB exchanges.

Signed-off-by: default avatarJean-Francois Moine <moinejf@free.fr>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent c4322bfc
...@@ -767,6 +767,7 @@ static int vidioc_g_register(struct file *file, void *priv, ...@@ -767,6 +767,7 @@ static int vidioc_g_register(struct file *file, void *priv,
if (mutex_lock_interruptible(&gspca_dev->usb_lock)) if (mutex_lock_interruptible(&gspca_dev->usb_lock))
return -ERESTARTSYS; return -ERESTARTSYS;
gspca_dev->usb_err = 0;
if (gspca_dev->present) if (gspca_dev->present)
ret = gspca_dev->sd_desc->get_register(gspca_dev, reg); ret = gspca_dev->sd_desc->get_register(gspca_dev, reg);
else else
...@@ -790,6 +791,7 @@ static int vidioc_s_register(struct file *file, void *priv, ...@@ -790,6 +791,7 @@ static int vidioc_s_register(struct file *file, void *priv,
if (mutex_lock_interruptible(&gspca_dev->usb_lock)) if (mutex_lock_interruptible(&gspca_dev->usb_lock))
return -ERESTARTSYS; return -ERESTARTSYS;
gspca_dev->usb_err = 0;
if (gspca_dev->present) if (gspca_dev->present)
ret = gspca_dev->sd_desc->set_register(gspca_dev, reg); ret = gspca_dev->sd_desc->set_register(gspca_dev, reg);
else else
...@@ -811,6 +813,7 @@ static int vidioc_g_chip_ident(struct file *file, void *priv, ...@@ -811,6 +813,7 @@ static int vidioc_g_chip_ident(struct file *file, void *priv,
if (mutex_lock_interruptible(&gspca_dev->usb_lock)) if (mutex_lock_interruptible(&gspca_dev->usb_lock))
return -ERESTARTSYS; return -ERESTARTSYS;
gspca_dev->usb_err = 0;
if (gspca_dev->present) if (gspca_dev->present)
ret = gspca_dev->sd_desc->get_chip_ident(gspca_dev, chip); ret = gspca_dev->sd_desc->get_chip_ident(gspca_dev, chip);
else else
...@@ -1081,6 +1084,7 @@ static int dev_close(struct file *file) ...@@ -1081,6 +1084,7 @@ static int dev_close(struct file *file)
if (gspca_dev->capt_file == file) { if (gspca_dev->capt_file == file) {
if (gspca_dev->streaming) { if (gspca_dev->streaming) {
mutex_lock(&gspca_dev->usb_lock); mutex_lock(&gspca_dev->usb_lock);
gspca_dev->usb_err = 0;
gspca_stream_off(gspca_dev); gspca_stream_off(gspca_dev);
mutex_unlock(&gspca_dev->usb_lock); mutex_unlock(&gspca_dev->usb_lock);
} }
...@@ -1200,6 +1204,7 @@ static int vidioc_s_ctrl(struct file *file, void *priv, ...@@ -1200,6 +1204,7 @@ static int vidioc_s_ctrl(struct file *file, void *priv,
PDEBUG(D_CONF, "set ctrl [%08x] = %d", ctrl->id, ctrl->value); PDEBUG(D_CONF, "set ctrl [%08x] = %d", ctrl->id, ctrl->value);
if (mutex_lock_interruptible(&gspca_dev->usb_lock)) if (mutex_lock_interruptible(&gspca_dev->usb_lock))
return -ERESTARTSYS; return -ERESTARTSYS;
gspca_dev->usb_err = 0;
if (gspca_dev->present) if (gspca_dev->present)
ret = ctrls->set(gspca_dev, ctrl->value); ret = ctrls->set(gspca_dev, ctrl->value);
else else
...@@ -1221,6 +1226,7 @@ static int vidioc_g_ctrl(struct file *file, void *priv, ...@@ -1221,6 +1226,7 @@ static int vidioc_g_ctrl(struct file *file, void *priv,
if (mutex_lock_interruptible(&gspca_dev->usb_lock)) if (mutex_lock_interruptible(&gspca_dev->usb_lock))
return -ERESTARTSYS; return -ERESTARTSYS;
gspca_dev->usb_err = 0;
if (gspca_dev->present) if (gspca_dev->present)
ret = ctrls->get(gspca_dev, &ctrl->value); ret = ctrls->get(gspca_dev, &ctrl->value);
else else
...@@ -1335,6 +1341,7 @@ static int vidioc_reqbufs(struct file *file, void *priv, ...@@ -1335,6 +1341,7 @@ static int vidioc_reqbufs(struct file *file, void *priv,
/* stop streaming */ /* stop streaming */
if (gspca_dev->streaming) { if (gspca_dev->streaming) {
mutex_lock(&gspca_dev->usb_lock); mutex_lock(&gspca_dev->usb_lock);
gspca_dev->usb_err = 0;
gspca_stream_off(gspca_dev); gspca_stream_off(gspca_dev);
mutex_unlock(&gspca_dev->usb_lock); mutex_unlock(&gspca_dev->usb_lock);
} }
...@@ -1426,6 +1433,7 @@ static int vidioc_streamoff(struct file *file, void *priv, ...@@ -1426,6 +1433,7 @@ static int vidioc_streamoff(struct file *file, void *priv,
ret = -ERESTARTSYS; ret = -ERESTARTSYS;
goto out; goto out;
} }
gspca_dev->usb_err = 0;
gspca_stream_off(gspca_dev); gspca_stream_off(gspca_dev);
mutex_unlock(&gspca_dev->usb_lock); mutex_unlock(&gspca_dev->usb_lock);
...@@ -1451,6 +1459,7 @@ static int vidioc_g_jpegcomp(struct file *file, void *priv, ...@@ -1451,6 +1459,7 @@ static int vidioc_g_jpegcomp(struct file *file, void *priv,
return -EINVAL; return -EINVAL;
if (mutex_lock_interruptible(&gspca_dev->usb_lock)) if (mutex_lock_interruptible(&gspca_dev->usb_lock))
return -ERESTARTSYS; return -ERESTARTSYS;
gspca_dev->usb_err = 0;
if (gspca_dev->present) if (gspca_dev->present)
ret = gspca_dev->sd_desc->get_jcomp(gspca_dev, jpegcomp); ret = gspca_dev->sd_desc->get_jcomp(gspca_dev, jpegcomp);
else else
...@@ -1469,6 +1478,7 @@ static int vidioc_s_jpegcomp(struct file *file, void *priv, ...@@ -1469,6 +1478,7 @@ static int vidioc_s_jpegcomp(struct file *file, void *priv,
return -EINVAL; return -EINVAL;
if (mutex_lock_interruptible(&gspca_dev->usb_lock)) if (mutex_lock_interruptible(&gspca_dev->usb_lock))
return -ERESTARTSYS; return -ERESTARTSYS;
gspca_dev->usb_err = 0;
if (gspca_dev->present) if (gspca_dev->present)
ret = gspca_dev->sd_desc->set_jcomp(gspca_dev, jpegcomp); ret = gspca_dev->sd_desc->set_jcomp(gspca_dev, jpegcomp);
else else
...@@ -1489,6 +1499,7 @@ static int vidioc_g_parm(struct file *filp, void *priv, ...@@ -1489,6 +1499,7 @@ static int vidioc_g_parm(struct file *filp, void *priv,
if (mutex_lock_interruptible(&gspca_dev->usb_lock)) if (mutex_lock_interruptible(&gspca_dev->usb_lock))
return -ERESTARTSYS; return -ERESTARTSYS;
gspca_dev->usb_err = 0;
if (gspca_dev->present) if (gspca_dev->present)
ret = gspca_dev->sd_desc->get_streamparm(gspca_dev, ret = gspca_dev->sd_desc->get_streamparm(gspca_dev,
parm); parm);
...@@ -1518,6 +1529,7 @@ static int vidioc_s_parm(struct file *filp, void *priv, ...@@ -1518,6 +1529,7 @@ static int vidioc_s_parm(struct file *filp, void *priv,
if (mutex_lock_interruptible(&gspca_dev->usb_lock)) if (mutex_lock_interruptible(&gspca_dev->usb_lock))
return -ERESTARTSYS; return -ERESTARTSYS;
gspca_dev->usb_err = 0;
if (gspca_dev->present) if (gspca_dev->present)
ret = gspca_dev->sd_desc->set_streamparm(gspca_dev, ret = gspca_dev->sd_desc->set_streamparm(gspca_dev,
parm); parm);
...@@ -1689,6 +1701,7 @@ static int frame_wait(struct gspca_dev *gspca_dev, ...@@ -1689,6 +1701,7 @@ static int frame_wait(struct gspca_dev *gspca_dev,
if (gspca_dev->sd_desc->dq_callback) { if (gspca_dev->sd_desc->dq_callback) {
mutex_lock(&gspca_dev->usb_lock); mutex_lock(&gspca_dev->usb_lock);
gspca_dev->usb_err = 0;
if (gspca_dev->present) if (gspca_dev->present)
gspca_dev->sd_desc->dq_callback(gspca_dev); gspca_dev->sd_desc->dq_callback(gspca_dev);
mutex_unlock(&gspca_dev->usb_lock); mutex_unlock(&gspca_dev->usb_lock);
......
...@@ -180,6 +180,7 @@ struct gspca_dev { ...@@ -180,6 +180,7 @@ struct gspca_dev {
struct mutex usb_lock; /* usb exchange protection */ struct mutex usb_lock; /* usb exchange protection */
struct mutex read_lock; /* read protection */ struct mutex read_lock; /* read protection */
struct mutex queue_lock; /* ISOC queue protection */ struct mutex queue_lock; /* ISOC queue protection */
int usb_err; /* USB error - protected by usb_lock */
#ifdef CONFIG_PM #ifdef CONFIG_PM
char frozen; /* suspend - resume */ char frozen; /* suspend - resume */
#endif #endif
......
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