[media] gspca - mars: Propagate USB errors to higher level
authorJean-François Moine <moinejf@free.fr>
Sat, 16 Oct 2010 17:10:59 +0000 (14:10 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Thu, 21 Oct 2010 09:55:53 +0000 (07:55 -0200)
Signed-off-by: Jean-François Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/gspca/mars.c

index cd0d69277b02788291ee6296552bb4dd224d7fda..adec5be646a78ec6f4d601fe899b61fc71e63011 100644 (file)
@@ -133,21 +133,25 @@ static const __u8 mi_data[0x20] = {
 };
 
 /* write <len> bytes from gspca_dev->usb_buf */
-static int reg_w(struct gspca_dev *gspca_dev,
+static void reg_w(struct gspca_dev *gspca_dev,
                 int len)
 {
        int alen, ret;
 
+       if (gspca_dev->usb_err < 0)
+               return;
+
        ret = usb_bulk_msg(gspca_dev->dev,
                        usb_sndbulkpipe(gspca_dev->dev, 4),
                        gspca_dev->usb_buf,
                        len,
                        &alen,
                        500);   /* timeout in milliseconds */
-       if (ret < 0)
+       if (ret < 0) {
                err("reg write [%02x] error %d",
                        gspca_dev->usb_buf[0], ret);
-       return ret;
+               gspca_dev->usb_err = ret;
+       }
 }
 
 static void mi_w(struct gspca_dev *gspca_dev,
@@ -226,7 +230,6 @@ static int sd_init(struct gspca_dev *gspca_dev)
 static int sd_start(struct gspca_dev *gspca_dev)
 {
        struct sd *sd = (struct sd *) gspca_dev;
-       int err_code;
        u8 *data;
        int i;
 
@@ -239,9 +242,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
 
        data[0] = 0x01;         /* address */
        data[1] = 0x01;
-       err_code = reg_w(gspca_dev, 2);
-       if (err_code < 0)
-               return err_code;
+       reg_w(gspca_dev, 2);
 
        /*
           Initialize the MR97113 chip register
@@ -263,16 +264,12 @@ static int sd_start(struct gspca_dev *gspca_dev)
 /*jfm: from win trace*/
        data[10] = 0x18;
 
-       err_code = reg_w(gspca_dev, 11);
-       if (err_code < 0)
-               return err_code;
+       reg_w(gspca_dev, 11);
 
        data[0] = 0x23;         /* address */
        data[1] = 0x09;         /* reg 35, append frame header */
 
-       err_code = reg_w(gspca_dev, 2);
-       if (err_code < 0)
-               return err_code;
+       reg_w(gspca_dev, 2);
 
        data[0] = 0x3c;         /* address */
 /*     if (gspca_dev->width == 1280) */
@@ -281,9 +278,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
 /*     else */
        data[1] = 50;           /* 50 reg 60, pc-cam frame size
                                 *      (unit: 4KB) 200KB */
-       err_code = reg_w(gspca_dev, 2);
-       if (err_code < 0)
-               return err_code;
+       reg_w(gspca_dev, 2);
 
        /* auto dark-gain */
        data[0] = 0x5e;         /* address */
@@ -297,32 +292,24 @@ static int sd_start(struct gspca_dev *gspca_dev)
        data[4] = sd->ctrls[BRIGHTNESS].val; /* reg 0x61 = brightness */
        data[5] = 0x00;
 
-       err_code = reg_w(gspca_dev, 6);
-       if (err_code < 0)
-               return err_code;
+       reg_w(gspca_dev, 6);
 
        data[0] = 0x67;
 /*jfm: from win trace*/
        data[1] = sd->ctrls[SHARPNESS].val * 4 + 3;
        data[2] = 0x14;
-       err_code = reg_w(gspca_dev, 3);
-       if (err_code < 0)
-               return err_code;
+       reg_w(gspca_dev, 3);
 
        data[0] = 0x69;
        data[1] = 0x2f;
        data[2] = 0x28;
        data[3] = 0x42;
-       err_code = reg_w(gspca_dev, 4);
-       if (err_code < 0)
-               return err_code;
+       reg_w(gspca_dev, 4);
 
        data[0] = 0x63;
        data[1] = 0x07;
-       err_code = reg_w(gspca_dev, 2);
+       reg_w(gspca_dev, 2);
 /*jfm: win trace - many writes here to reg 0x64*/
-       if (err_code < 0)
-               return err_code;
 
        /* initialize the MI sensor */
        for (i = 0; i < sizeof mi_data; i++)
@@ -331,18 +318,15 @@ static int sd_start(struct gspca_dev *gspca_dev)
        data[0] = 0x00;
        data[1] = 0x4d;         /* ISOC transfering enable... */
        reg_w(gspca_dev, 2);
-       return 0;
+
+       return gspca_dev->usb_err;
 }
 
 static void sd_stopN(struct gspca_dev *gspca_dev)
 {
-       int result;
-
        gspca_dev->usb_buf[0] = 1;
        gspca_dev->usb_buf[1] = 0;
-       result = reg_w(gspca_dev, 2);
-       if (result < 0)
-               PDEBUG(D_ERR, "Camera Stop failed");
+       reg_w(gspca_dev, 2);
 }
 
 static void sd_pkt_scan(struct gspca_dev *gspca_dev,