aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/gspca
diff options
context:
space:
mode:
authorPatrice Chotard <patrice.chotard@sfr.fr>2011-04-18 16:38:37 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2011-05-20 08:27:18 -0400
commit8715b16eadef74e9cf167f44961354f54b547e2a (patch)
treeba8cb4deb8a85adc418fe58779e3dc62dda4f4b9 /drivers/media/video/gspca
parentc3d8692758dfaaf0049d6112c94c819de9237577 (diff)
[media] gspca - jeilinj: use gspca_dev->usb_err to forward error to upper layer
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>
Diffstat (limited to 'drivers/media/video/gspca')
-rw-r--r--drivers/media/video/gspca/jeilinj.c43
1 files changed, 20 insertions, 23 deletions
diff --git a/drivers/media/video/gspca/jeilinj.c b/drivers/media/video/gspca/jeilinj.c
index 33de1771b191..32494fbf1cf1 100644
--- a/drivers/media/video/gspca/jeilinj.c
+++ b/drivers/media/video/gspca/jeilinj.c
@@ -71,39 +71,44 @@ static struct v4l2_pix_format jlj_mode[] = {
71 */ 71 */
72 72
73/* All commands are two bytes only */ 73/* All commands are two bytes only */
74static int jlj_write2(struct gspca_dev *gspca_dev, unsigned char *command) 74static void jlj_write2(struct gspca_dev *gspca_dev, unsigned char *command)
75{ 75{
76 int retval; 76 int retval;
77 77
78 if (gspca_dev->usb_err < 0)
79 return;
78 memcpy(gspca_dev->usb_buf, command, 2); 80 memcpy(gspca_dev->usb_buf, command, 2);
79 retval = usb_bulk_msg(gspca_dev->dev, 81 retval = usb_bulk_msg(gspca_dev->dev,
80 usb_sndbulkpipe(gspca_dev->dev, 3), 82 usb_sndbulkpipe(gspca_dev->dev, 3),
81 gspca_dev->usb_buf, 2, NULL, 500); 83 gspca_dev->usb_buf, 2, NULL, 500);
82 if (retval < 0) 84 if (retval < 0) {
83 err("command write [%02x] error %d", 85 err("command write [%02x] error %d",
84 gspca_dev->usb_buf[0], retval); 86 gspca_dev->usb_buf[0], retval);
85 return retval; 87 gspca_dev->usb_err = retval;
88 }
86} 89}
87 90
88/* Responses are one byte only */ 91/* Responses are one byte only */
89static int jlj_read1(struct gspca_dev *gspca_dev, unsigned char response) 92static void jlj_read1(struct gspca_dev *gspca_dev, unsigned char response)
90{ 93{
91 int retval; 94 int retval;
92 95
96 if (gspca_dev->usb_err < 0)
97 return;
93 retval = usb_bulk_msg(gspca_dev->dev, 98 retval = usb_bulk_msg(gspca_dev->dev,
94 usb_rcvbulkpipe(gspca_dev->dev, 0x84), 99 usb_rcvbulkpipe(gspca_dev->dev, 0x84),
95 gspca_dev->usb_buf, 1, NULL, 500); 100 gspca_dev->usb_buf, 1, NULL, 500);
96 response = gspca_dev->usb_buf[0]; 101 response = gspca_dev->usb_buf[0];
97 if (retval < 0) 102 if (retval < 0) {
98 err("read command [%02x] error %d", 103 err("read command [%02x] error %d",
99 gspca_dev->usb_buf[0], retval); 104 gspca_dev->usb_buf[0], retval);
100 return retval; 105 gspca_dev->usb_err = retval;
106 }
101} 107}
102 108
103static int jlj_start(struct gspca_dev *gspca_dev) 109static int jlj_start(struct gspca_dev *gspca_dev)
104{ 110{
105 int i; 111 int i;
106 int retval = -1;
107 u8 response = 0xff; 112 u8 response = 0xff;
108 struct sd *sd = (struct sd *) gspca_dev; 113 struct sd *sd = (struct sd *) gspca_dev;
109 struct jlj_command start_commands[] = { 114 struct jlj_command start_commands[] = {
@@ -138,16 +143,13 @@ static int jlj_start(struct gspca_dev *gspca_dev)
138 143
139 sd->blocks_left = 0; 144 sd->blocks_left = 0;
140 for (i = 0; i < ARRAY_SIZE(start_commands); i++) { 145 for (i = 0; i < ARRAY_SIZE(start_commands); i++) {
141 retval = jlj_write2(gspca_dev, start_commands[i].instruction); 146 jlj_write2(gspca_dev, start_commands[i].instruction);
142 if (retval < 0)
143 return retval;
144 if (start_commands[i].ack_wanted) 147 if (start_commands[i].ack_wanted)
145 retval = jlj_read1(gspca_dev, response); 148 jlj_read1(gspca_dev, response);
146 if (retval < 0)
147 return retval;
148 } 149 }
149 PDEBUG(D_ERR, "jlj_start retval is %d", retval); 150 if (gspca_dev->usb_err < 0)
150 return retval; 151 PDEBUG(D_ERR, "Start streaming command failed");
152 return gspca_dev->usb_err;
151} 153}
152 154
153static void sd_pkt_scan(struct gspca_dev *gspca_dev, 155static void sd_pkt_scan(struct gspca_dev *gspca_dev,
@@ -250,26 +252,21 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
250/* this function is called at probe and resume time */ 252/* this function is called at probe and resume time */
251static int sd_init(struct gspca_dev *gspca_dev) 253static int sd_init(struct gspca_dev *gspca_dev)
252{ 254{
253 return 0; 255 return gspca_dev->usb_err;
254} 256}
255 257
256/* Set up for getting frames. */ 258/* Set up for getting frames. */
257static int sd_start(struct gspca_dev *gspca_dev) 259static int sd_start(struct gspca_dev *gspca_dev)
258{ 260{
259 struct sd *dev = (struct sd *) gspca_dev; 261 struct sd *dev = (struct sd *) gspca_dev;
260 int ret;
261 262
262 /* create the JPEG header */ 263 /* create the JPEG header */
263 jpeg_define(dev->jpeg_hdr, gspca_dev->height, gspca_dev->width, 264 jpeg_define(dev->jpeg_hdr, gspca_dev->height, gspca_dev->width,
264 0x21); /* JPEG 422 */ 265 0x21); /* JPEG 422 */
265 jpeg_set_qual(dev->jpeg_hdr, dev->quality); 266 jpeg_set_qual(dev->jpeg_hdr, dev->quality);
266 PDEBUG(D_STREAM, "Start streaming at 320x240"); 267 PDEBUG(D_STREAM, "Start streaming at 320x240");
267 ret = jlj_start(gspca_dev); 268 jlj_start(gspca_dev);
268 if (ret < 0) { 269 return gspca_dev->usb_err;
269 PDEBUG(D_ERR, "Start streaming command failed");
270 return ret;
271 }
272 return 0;
273} 270}
274 271
275/* Table of supported USB devices */ 272/* Table of supported USB devices */