Re: [PATCH RFC] gspca_sonixj: handle return values from USB subsystem

2010-10-18 Thread Németh Márton
Hi,
Jean-Francois Moine írta:
> On Sun, 17 Oct 2010 16:45:03 +0200
> Németh Márton  wrote:
> 
>> The usb_control_msg() may return error at any time so it is necessary
>> to handle it. The error handling mechanism is taken from the pac7302.
>>
>> The resulting driver was tested with hama AC-150 webcam (USB ID
>> 0c45:6142).
> 
> Hi Németh,
> 
> This mechanism has already been done by commit 60f44336 in
> media_tree.git branch staging/v2.6.37.

I must looking at totally wrong place for my base of changes. Now I
see the branch staging/v2.6.37, thanks for the hint.

Márton Németh
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH RFC] gspca_sonixj: handle return values from USB subsystem

2010-10-17 Thread Jean-Francois Moine
On Sun, 17 Oct 2010 16:45:03 +0200
Németh Márton  wrote:

> The usb_control_msg() may return error at any time so it is necessary
> to handle it. The error handling mechanism is taken from the pac7302.
> 
> The resulting driver was tested with hama AC-150 webcam (USB ID
> 0c45:6142).

Hi Németh,

This mechanism has already been done by commit 60f44336 in
media_tree.git branch staging/v2.6.37.

Cheers.

-- 
Ken ar c'hentañ | ** Breizh ha Linux atav! **
Jef |   http://moinejf.free.fr/
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH RFC] gspca_sonixj: handle return values from USB subsystem

2010-10-17 Thread Németh Márton
From: Márton Németh 

The usb_control_msg() may return error at any time so it is necessary to handle
it. The error handling mechanism is taken from the pac7302.

The resulting driver was tested with hama AC-150 webcam (USB ID 0c45:6142).

Signed-off-by: Márton Németh 
---
diff -upr d/drivers/media/video/gspca/sonixj.c 
e/drivers/media/video/gspca/sonixj.c
--- d/drivers/media/video/gspca/sonixj.c2010-10-17 12:28:41.0 
+0200
+++ e/drivers/media/video/gspca/sonixj.c2010-10-17 16:28:38.0 
+0200
@@ -1359,29 +1359,45 @@ static const u8 (*sensor_init[])[8] = {
 static void reg_r(struct gspca_dev *gspca_dev,
  u16 value, int len)
 {
+   int ret;
+
 #ifdef GSPCA_DEBUG
if (len > USB_BUF_SZ) {
err("reg_r: buffer overflow");
return;
}
 #endif
-   usb_control_msg(gspca_dev->dev,
+   if (gspca_dev->usb_err < 0)
+   return;
+   ret = usb_control_msg(gspca_dev->dev,
usb_rcvctrlpipe(gspca_dev->dev, 0),
0,
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
value, 0,
gspca_dev->usb_buf, len,
500);
-   PDEBUG(D_USBI, "reg_r [%02x] -> %02x", value, gspca_dev->usb_buf[0]);
+   if (ret < 0) {
+   PDEBUG(D_ERR, "reg_r(): "
+   "Failed to read %i registers from to 0x%x, error %i",
+   len, value, ret);
+   gspca_dev->usb_err = ret;
+   } else {
+   PDEBUG(D_USBI, "reg_r [%02x] -> %02x",
+   value, gspca_dev->usb_buf[0]);
+   }
 }

 static void reg_w1(struct gspca_dev *gspca_dev,
   u16 value,
   u8 data)
 {
+   int ret;
+
+   if (gspca_dev->usb_err < 0)
+   return;
PDEBUG(D_USBO, "reg_w1 [%04x] = %02x", value, data);
gspca_dev->usb_buf[0] = data;
-   usb_control_msg(gspca_dev->dev,
+   ret = usb_control_msg(gspca_dev->dev,
usb_sndctrlpipe(gspca_dev->dev, 0),
0x08,
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
@@ -1389,12 +1405,22 @@ static void reg_w1(struct gspca_dev *gsp
0,
gspca_dev->usb_buf, 1,
500);
+   if (ret < 0) {
+   PDEBUG(D_ERR, "reg_w1(): "
+   "Failed to write register to 0x%x, error %i",
+   value, ret);
+   gspca_dev->usb_err = ret;
+   }
 }
 static void reg_w(struct gspca_dev *gspca_dev,
  u16 value,
  const u8 *buffer,
  int len)
 {
+   int ret;
+
+   if (gspca_dev->usb_err < 0)
+   return;
PDEBUG(D_USBO, "reg_w [%04x] = %02x %02x ..",
value, buffer[0], buffer[1]);
 #ifdef GSPCA_DEBUG
@@ -1404,20 +1430,29 @@ static void reg_w(struct gspca_dev *gspc
}
 #endif
memcpy(gspca_dev->usb_buf, buffer, len);
-   usb_control_msg(gspca_dev->dev,
+   ret = usb_control_msg(gspca_dev->dev,
usb_sndctrlpipe(gspca_dev->dev, 0),
0x08,
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
value, 0,
gspca_dev->usb_buf, len,
500);
+   if (ret < 0) {
+   PDEBUG(D_ERR, "reg_w(): "
+   "Failed to write %i registers to 0x%x, error %i",
+   len, value, ret);
+   gspca_dev->usb_err = ret;
+   }
 }

 /* I2C write 1 byte */
 static void i2c_w1(struct gspca_dev *gspca_dev, u8 reg, u8 val)
 {
struct sd *sd = (struct sd *) gspca_dev;
+   int ret;

+   if (gspca_dev->usb_err < 0)
+   return;
PDEBUG(D_USBO, "i2c_w1 [%02x] = %02x", reg, val);
switch (sd->sensor) {
case SENSOR_ADCM1700:
@@ -1436,7 +1471,7 @@ static void i2c_w1(struct gspca_dev *gsp
gspca_dev->usb_buf[5] = 0;
gspca_dev->usb_buf[6] = 0;
gspca_dev->usb_buf[7] = 0x10;
-   usb_control_msg(gspca_dev->dev,
+   ret = usb_control_msg(gspca_dev->dev,
usb_sndctrlpipe(gspca_dev->dev, 0),
0x08,
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
@@ -1444,22 +1479,37 @@ static void i2c_w1(struct gspca_dev *gsp
0,
gspca_dev->usb_buf, 8,
500);
+   if (ret < 0) {
+   PDEBUG(D_ERR, "i2c_w1(): Failed to write "
+   "I2C register 0x%x, value 0x%X, error %i",
+   reg, val, ret);
+   gspca_dev->usb_err = ret;
+   }
 }

 /* I2C write 8 bytes */
 static void i2c_w8(struct gspca_dev *gspca_dev,