[media] gspca - jeilinj: use gspca_dev->usb_err to forward error to upper layer
authorPatrice Chotard <patrice.chotard@sfr.fr>
Mon, 18 Apr 2011 20:38:37 +0000 (17:38 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Fri, 20 May 2011 12:27:18 +0000 (09:27 -0300)
Signed-off-by: Patrice CHOTARD <patricechotard@free.fr>
Signed-off-by: Jean-François Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/gspca/jeilinj.c

index 33de177..32494fb 100644 (file)
@@ -71,39 +71,44 @@ static struct v4l2_pix_format jlj_mode[] = {
  */
 
 /* All commands are two bytes only */
-static int jlj_write2(struct gspca_dev *gspca_dev, unsigned char *command)
+static void jlj_write2(struct gspca_dev *gspca_dev, unsigned char *command)
 {
        int retval;
 
+       if (gspca_dev->usb_err < 0)
+               return;
        memcpy(gspca_dev->usb_buf, command, 2);
        retval = usb_bulk_msg(gspca_dev->dev,
                        usb_sndbulkpipe(gspca_dev->dev, 3),
                        gspca_dev->usb_buf, 2, NULL, 500);
-       if (retval < 0)
+       if (retval < 0) {
                err("command write [%02x] error %d",
                                gspca_dev->usb_buf[0], retval);
-       return retval;
+               gspca_dev->usb_err = retval;
+       }
 }
 
 /* Responses are one byte only */
-static int jlj_read1(struct gspca_dev *gspca_dev, unsigned char response)
+static void jlj_read1(struct gspca_dev *gspca_dev, unsigned char response)
 {
        int retval;
 
+       if (gspca_dev->usb_err < 0)
+               return;
        retval = usb_bulk_msg(gspca_dev->dev,
        usb_rcvbulkpipe(gspca_dev->dev, 0x84),
                                gspca_dev->usb_buf, 1, NULL, 500);
        response = gspca_dev->usb_buf[0];
-       if (retval < 0)
+       if (retval < 0) {
                err("read command [%02x] error %d",
                                gspca_dev->usb_buf[0], retval);
-       return retval;
+               gspca_dev->usb_err = retval;
+       }
 }
 
 static int jlj_start(struct gspca_dev *gspca_dev)
 {
        int i;
-       int retval = -1;
        u8 response = 0xff;
        struct sd *sd = (struct sd *) gspca_dev;
        struct jlj_command start_commands[] = {
@@ -138,16 +143,13 @@ static int jlj_start(struct gspca_dev *gspca_dev)
 
        sd->blocks_left = 0;
        for (i = 0; i < ARRAY_SIZE(start_commands); i++) {
-               retval = jlj_write2(gspca_dev, start_commands[i].instruction);
-               if (retval < 0)
-                       return retval;
+               jlj_write2(gspca_dev, start_commands[i].instruction);
                if (start_commands[i].ack_wanted)
-                       retval = jlj_read1(gspca_dev, response);
-               if (retval < 0)
-                       return retval;
+                       jlj_read1(gspca_dev, response);
        }
-       PDEBUG(D_ERR, "jlj_start retval is %d", retval);
-       return retval;
+       if (gspca_dev->usb_err < 0)
+               PDEBUG(D_ERR, "Start streaming command failed");
+       return gspca_dev->usb_err;
 }
 
 static void sd_pkt_scan(struct gspca_dev *gspca_dev,
@@ -250,26 +252,21 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
 /* this function is called at probe and resume time */
 static int sd_init(struct gspca_dev *gspca_dev)
 {
-       return 0;
+       return gspca_dev->usb_err;
 }
 
 /* Set up for getting frames. */
 static int sd_start(struct gspca_dev *gspca_dev)
 {
        struct sd *dev = (struct sd *) gspca_dev;
-       int ret;
 
        /* create the JPEG header */
        jpeg_define(dev->jpeg_hdr, gspca_dev->height, gspca_dev->width,
                        0x21);          /* JPEG 422 */
        jpeg_set_qual(dev->jpeg_hdr, dev->quality);
        PDEBUG(D_STREAM, "Start streaming at 320x240");
-       ret = jlj_start(gspca_dev);
-       if (ret < 0) {
-               PDEBUG(D_ERR, "Start streaming command failed");
-               return ret;
-       }
-       return 0;
+       jlj_start(gspca_dev);
+       return gspca_dev->usb_err;
 }
 
 /* Table of supported USB devices */