* Empty buffers (bytesused == 0) don't trigger end of frame detection
         * as it doesn't make sense to return an empty buffer.
         */
-       if (is_header && buf->buf.bytesused != 0) {
+       if (is_header && buf->bytesused != 0) {
                buf->state = UVC_BUF_STATE_DONE;
                return -EAGAIN;
        }
         * contain no data.
         */
        if (!is_header) {
-               maxlen = buf->buf.length - buf->buf.bytesused;
-               mem = queue->mem + buf->buf.m.offset + buf->buf.bytesused;
+               maxlen = buf->length - buf->bytesused;
+               mem = buf->mem + buf->bytesused;
                nbytes = min(len, maxlen);
                memcpy(mem, data, nbytes);
-               buf->buf.bytesused += nbytes;
+               buf->bytesused += nbytes;
 
-               if (len > maxlen || buf->buf.bytesused == buf->buf.length) {
+               if (len > maxlen || buf->bytesused == buf->length) {
                        uvc_trace(UVC_TRACE_FRAME, "Frame complete "
                                  "(overflow).\n");
                        buf->state = UVC_BUF_STATE_DONE;
 
                queue->buffer[i].buf.field = V4L2_FIELD_NONE;
                queue->buffer[i].buf.memory = V4L2_MEMORY_MMAP;
                queue->buffer[i].buf.flags = 0;
+
+               queue->buffer[i].mem = queue->mem + i * bufsize;
+               queue->buffer[i].length = buflength;
                init_waitqueue_head(&queue->buffer[i].wait);
        }
 
        }
        buf->state = UVC_BUF_STATE_QUEUED;
        if (v4l2_buf->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
-               buf->buf.bytesused = 0;
+               buf->bytesused = 0;
        else
-               buf->buf.bytesused = v4l2_buf->bytesused;
+               buf->bytesused = v4l2_buf->bytesused;
 
        list_add_tail(&buf->stream, &queue->mainqueue);
        list_add_tail(&buf->queue, &queue->irqqueue);
         */
        vma->vm_flags |= VM_IO;
 
-       addr = (unsigned long)queue->mem + buffer->buf.m.offset;
+       addr = (unsigned long)buffer->mem;
 #ifdef CONFIG_MMU
        while (size > 0) {
                page = vmalloc_to_page((void *)addr);
                ret = -EINVAL;
                goto done;
        }
-       ret = (unsigned long)queue->mem + buffer->buf.m.offset;
+       ret = (unsigned long)buf->mem;
 done:
        mutex_unlock(&queue->mutex);
        return ret;
        list_del(&buf->queue);
        buf->error = 0;
        buf->state = UVC_BUF_STATE_DONE;
+       buf->buf.bytesused = buf->bytesused;
        if (!list_empty(&queue->irqqueue))
                nextbuf = list_first_entry(&queue->irqqueue, struct uvc_buffer,
                                           queue);
 
         * avoids detecting end of frame conditions at FID toggling if the
         * previous payload had the EOF bit set.
         */
-       if (fid != stream->last_fid && buf->buf.bytesused != 0) {
+       if (fid != stream->last_fid && buf->bytesused != 0) {
                uvc_trace(UVC_TRACE_FRAME, "Frame complete (FID bit "
                                "toggled).\n");
                buf->state = UVC_BUF_STATE_READY;
 static void uvc_video_decode_data(struct uvc_streaming *stream,
                struct uvc_buffer *buf, const __u8 *data, int len)
 {
-       struct uvc_video_queue *queue = &stream->queue;
        unsigned int maxlen, nbytes;
        void *mem;
 
                return;
 
        /* Copy the video data to the buffer. */
-       maxlen = buf->buf.length - buf->buf.bytesused;
-       mem = queue->mem + buf->buf.m.offset + buf->buf.bytesused;
+       maxlen = buf->length - buf->bytesused;
+       mem = buf->mem + buf->bytesused;
        nbytes = min((unsigned int)len, maxlen);
        memcpy(mem, data, nbytes);
-       buf->buf.bytesused += nbytes;
+       buf->bytesused += nbytes;
 
        /* Complete the current frame if the buffer size was exceeded. */
        if (len > maxlen) {
                struct uvc_buffer *buf, const __u8 *data, int len)
 {
        /* Mark the buffer as done if the EOF marker is set. */
-       if (data[1] & UVC_STREAM_EOF && buf->buf.bytesused != 0) {
+       if (data[1] & UVC_STREAM_EOF && buf->bytesused != 0) {
                uvc_trace(UVC_TRACE_FRAME, "Frame complete (EOF found).\n");
                if (data[0] == len)
                        uvc_trace(UVC_TRACE_FRAME, "EOF in empty payload.\n");
        void *mem;
 
        /* Copy video data to the URB buffer. */
-       mem = queue->mem + buf->buf.m.offset + queue->buf_used;
-       nbytes = min((unsigned int)len, buf->buf.bytesused - queue->buf_used);
+       mem = buf->mem + queue->buf_used;
+       nbytes = min((unsigned int)len, buf->bytesused - queue->buf_used);
        nbytes = min(stream->bulk.max_payload_size - stream->bulk.payload_size,
                        nbytes);
        memcpy(data, mem, nbytes);
                        urb->iso_frame_desc[i].actual_length);
 
                if (buf->state == UVC_BUF_STATE_READY) {
-                       if (buf->buf.length != buf->buf.bytesused &&
+                       if (buf->length != buf->bytesused &&
                            !(stream->cur_format->flags &
                              UVC_FMT_FLAG_COMPRESSED))
                                buf->error = 1;
        stream->bulk.payload_size += ret;
        len -= ret;
 
-       if (buf->buf.bytesused == stream->queue.buf_used ||
+       if (buf->bytesused == stream->queue.buf_used ||
            stream->bulk.payload_size == stream->bulk.max_payload_size) {
-               if (buf->buf.bytesused == stream->queue.buf_used) {
+               if (buf->bytesused == stream->queue.buf_used) {
                        stream->queue.buf_used = 0;
                        buf->state = UVC_BUF_STATE_READY;
                        buf->buf.sequence = ++stream->sequence;