Skip to content

Commit

Permalink
[media] em28xx: rename function em28xx_isoc_copy and extend for USB b…
Browse files Browse the repository at this point in the history
…ulk transfers

The URB data processing for bulk transfers is very similar to what
is done with isoc transfers, so create a common function that works
with both transfer types based on the existing isoc function.

[mchehab@redhat.com: Fix a CodingStyle issue: don't break strings
 into separate lines]

Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
  • Loading branch information
Frank Schaefer authored and Mauro Carvalho Chehab committed Dec 22, 2012
1 parent 1653cb0 commit 0fa4a40
Showing 1 changed file with 40 additions and 25 deletions.
65 changes: 40 additions & 25 deletions drivers/media/usb/em28xx/em28xx-video.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
Markus Rechberger <mrechberger@gmail.com>
Mauro Carvalho Chehab <mchehab@infradead.org>
Sascha Sommer <saschasommer@freenet.de>
Copyright (C) 2012 Frank Schäfer <fschaefer.oss@googlemail.com>
Some parts based on SN9C10x PC Camera Controllers GPL driver made
by Luca Risolia <luca.risolia@studio.unibo.it>
Expand Down Expand Up @@ -412,16 +413,14 @@ static inline void vbi_get_next_buf(struct em28xx_dmaqueue *dma_q,
return;
}

/*
* Controls the isoc copy of each urb packet
*/
static inline int em28xx_isoc_copy(struct em28xx *dev, struct urb *urb)
/* Processes and copies the URB data content to a frame buffer queue */
static inline int em28xx_urb_data_copy(struct em28xx *dev, struct urb *urb)
{
struct em28xx_buffer *buf;
struct em28xx_dmaqueue *dma_q = &dev->vidq;
unsigned char *outp = NULL;
int i, len = 0, rc = 1;
unsigned char *p;
int xfer_bulk, num_packets, i, rc = 1;
unsigned int actual_length, len = 0;
unsigned char *p, *outp = NULL;

if (!dev)
return 0;
Expand All @@ -432,33 +431,46 @@ static inline int em28xx_isoc_copy(struct em28xx *dev, struct urb *urb)
if (urb->status < 0)
print_err_status(dev, -1, urb->status);

xfer_bulk = usb_pipebulk(urb->pipe);

buf = dev->usb_ctl.vid_buf;
if (buf != NULL)
outp = videobuf_to_vmalloc(&buf->vb);

for (i = 0; i < urb->number_of_packets; i++) {
int status = urb->iso_frame_desc[i].status;
if (xfer_bulk) /* bulk */
num_packets = 1;
else /* isoc */
num_packets = urb->number_of_packets;

for (i = 0; i < num_packets; i++) {
if (xfer_bulk) { /* bulk */
actual_length = urb->actual_length;

p = urb->transfer_buffer;
} else { /* isoc */
if (urb->iso_frame_desc[i].status < 0) {
print_err_status(dev, i,
urb->iso_frame_desc[i].status);
if (urb->iso_frame_desc[i].status != -EPROTO)
continue;
}

if (status < 0) {
print_err_status(dev, i, status);
if (urb->iso_frame_desc[i].status != -EPROTO)
actual_length = urb->iso_frame_desc[i].actual_length;
if (actual_length > dev->max_pkt_size) {
em28xx_isocdbg("packet bigger than packet size");
continue;
}

len = urb->iso_frame_desc[i].actual_length - 4;
}

if (urb->iso_frame_desc[i].actual_length <= 0) {
/* em28xx_isocdbg("packet %d is empty",i); - spammy */
continue;
p = urb->transfer_buffer +
urb->iso_frame_desc[i].offset;
}
if (urb->iso_frame_desc[i].actual_length >
dev->max_pkt_size) {
em28xx_isocdbg("packet bigger than packet size");

if (actual_length <= 0) {
/* NOTE: happens very often with isoc transfers */
/* em28xx_usbdbg("packet %d is empty",i); - spammy */
continue;
}

p = urb->transfer_buffer + urb->iso_frame_desc[i].offset;

/* FIXME: incomplete buffer checks where removed to make
logic simpler. Impacts of those changes should be evaluated
*/
Expand Down Expand Up @@ -492,9 +504,12 @@ static inline int em28xx_isoc_copy(struct em28xx *dev, struct urb *urb)
}
if (buf != NULL) {
if (p[0] != 0x88 && p[0] != 0x22) {
/* NOTE: no intermediate data packet header
* 88 88 88 88 when using bulk transfers */
em28xx_isocdbg("frame is not complete\n");
len += 4;
len = actual_length;
} else {
len = actual_length - 4;
p += 4;
}
em28xx_copy_video(dev, dma_q, buf, p, outp, len);
Expand Down Expand Up @@ -767,7 +782,7 @@ buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
EM28XX_NUM_BUFS,
dev->max_pkt_size,
EM28XX_NUM_ISOC_PACKETS,
em28xx_isoc_copy);
em28xx_urb_data_copy);
if (rc < 0)
goto fail;
}
Expand Down

0 comments on commit 0fa4a40

Please sign in to comment.