[media] em28xx: rename function em28xx_dvb_isoc_copy and extend for USB bulk transfers
authorFrank Schaefer <fschaefer.oss@googlemail.com>
Thu, 8 Nov 2012 17:11:47 +0000 (14:11 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 22 Dec 2012 20:04:50 +0000 (18:04 -0200)
The URB data processing for DVB 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.
Tested with device Hauppauge HVR-930c.

Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/usb/em28xx/em28xx-dvb.c

index 7583cb7..22ef6dd 100644 (file)
@@ -10,6 +10,8 @@
 
  (c) 2008 Aidan Thornton <makosoft@googlemail.com>
 
+ (c) 2012 Frank Schäfer <fschaefer.oss@googlemail.com>
+
  Based on cx88-dvb, saa7134-dvb and videobuf-dvb originally written by:
        (c) 2004, 2005 Chris Pascoe <c.pascoe@itee.uq.edu.au>
        (c) 2004 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
@@ -124,9 +126,9 @@ static inline void print_err_status(struct em28xx *dev,
        }
 }
 
-static inline int em28xx_dvb_isoc_copy(struct em28xx *dev, struct urb *urb)
+static inline int em28xx_dvb_urb_data_copy(struct em28xx *dev, struct urb *urb)
 {
-       int i;
+       int xfer_bulk, num_packets, i;
 
        if (!dev)
                return 0;
@@ -137,18 +139,34 @@ static inline int em28xx_dvb_isoc_copy(struct em28xx *dev, struct urb *urb)
        if (urb->status < 0)
                print_err_status(dev, -1, urb->status);
 
-       for (i = 0; i < urb->number_of_packets; i++) {
-               int status = urb->iso_frame_desc[i].status;
+       xfer_bulk = usb_pipebulk(urb->pipe);
 
-               if (status < 0) {
-                       print_err_status(dev, i, status);
-                       if (urb->iso_frame_desc[i].status != -EPROTO)
-                               continue;
-               }
+       if (xfer_bulk) /* bulk */
+               num_packets = 1;
+       else /* isoc */
+               num_packets = urb->number_of_packets;
 
-               dvb_dmx_swfilter(&dev->dvb->demux, urb->transfer_buffer +
-                                urb->iso_frame_desc[i].offset,
-                                urb->iso_frame_desc[i].actual_length);
+       for (i = 0; i < num_packets; i++) {
+               if (xfer_bulk) {
+                       if (urb->status < 0) {
+                               print_err_status(dev, i, urb->status);
+                               if (urb->status != -EPROTO)
+                                       continue;
+                       }
+                       dvb_dmx_swfilter(&dev->dvb->demux, urb->transfer_buffer,
+                                       urb->actual_length);
+               } else {
+                       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;
+                       }
+                       dvb_dmx_swfilter(&dev->dvb->demux,
+                                        urb->transfer_buffer +
+                                        urb->iso_frame_desc[i].offset,
+                                        urb->iso_frame_desc[i].actual_length);
+               }
        }
 
        return 0;
@@ -177,7 +195,7 @@ static int em28xx_start_streaming(struct em28xx_dvb *dvb)
                                    EM28XX_DVB_NUM_BUFS,
                                    max_dvb_packet_size,
                                    EM28XX_DVB_NUM_ISOC_PACKETS,
-                                   em28xx_dvb_isoc_copy);
+                                   em28xx_dvb_urb_data_copy);
 }
 
 static int em28xx_stop_streaming(struct em28xx_dvb *dvb)