Merge branch 'kvm-updates/2.6.36' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[sfrench/cifs-2.6.git] / drivers / media / video / gspca / pac7311.c
index 44fed9686729340777e9425b1ad5e10e56204651..1cb7e99e92bde439fa7d65d3c7d910d7d624180c 100644 (file)
@@ -270,7 +270,7 @@ static void reg_w_buf(struct gspca_dev *gspca_dev,
        memcpy(gspca_dev->usb_buf, buffer, len);
        ret = usb_control_msg(gspca_dev->dev,
                        usb_sndctrlpipe(gspca_dev->dev, 0),
-                       1,              /* request */
+                       0,              /* request */
                        USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
                        0,              /* value */
                        index, gspca_dev->usb_buf, len,
@@ -599,7 +599,6 @@ static const unsigned char pac_jpeg_header2[] = {
 };
 
 static void pac_start_frame(struct gspca_dev *gspca_dev,
-               struct gspca_frame *frame,
                __u16 lines, __u16 samples_per_line)
 {
        unsigned char tmpbuf[4];
@@ -624,19 +623,13 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
                        int len)                        /* iso packet length */
 {
        struct sd *sd = (struct sd *) gspca_dev;
+       u8 *image;
        unsigned char *sof;
-       struct gspca_frame *frame;
 
        sof = pac_find_sof(&sd->sof_read, data, len);
        if (sof) {
                int n, lum_offset, footer_length;
 
-               frame = gspca_get_i_frame(gspca_dev);
-               if (frame == NULL) {
-                       gspca_dev->last_packet_type = DISCARD_PACKET;
-                       return;
-               }
-
                /* 6 bytes after the FF D9 EOF marker a number of lumination
                   bytes are send corresponding to different parts of the
                   image, the 14th and 15th byte after the EOF seem to
@@ -647,16 +640,16 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
                /* Finish decoding current frame */
                n = (sof - data) - (footer_length + sizeof pac_sof_marker);
                if (n < 0) {
-                       frame->data_end += n;
+                       gspca_dev->image_len += n;
                        n = 0;
+               } else {
+                       gspca_frame_add(gspca_dev, INTER_PACKET, data, n);
                }
-               gspca_frame_add(gspca_dev, INTER_PACKET,
-                                       data, n);
-               if (gspca_dev->last_packet_type != DISCARD_PACKET &&
-                               frame->data_end[-2] == 0xff &&
-                               frame->data_end[-1] == 0xd9)
-                       gspca_frame_add(gspca_dev, LAST_PACKET,
-                                               NULL, 0);
+               image = gspca_dev->image;
+               if (image != NULL
+                && image[gspca_dev->image_len - 2] == 0xff
+                && image[gspca_dev->image_len - 1] == 0xd9)
+                       gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
 
                n = sof - data;
                len -= n;
@@ -671,7 +664,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
                        atomic_set(&sd->avg_lum, -1);
 
                /* Start the new frame with the jpeg header */
-               pac_start_frame(gspca_dev, frame,
+               pac_start_frame(gspca_dev,
                        gspca_dev->height, gspca_dev->width);
        }
        gspca_frame_add(gspca_dev, INTER_PACKET, data, len);