V4L/DVB (7331): Fix em2800 altsetting selection
authorSascha Sommer <saschasommer@freenet.de>
Tue, 22 Apr 2008 17:45:47 +0000 (14:45 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Thu, 24 Apr 2008 17:07:49 +0000 (14:07 -0300)
Signed-off-by: Sascha Sommer <saschasommer@freenet.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/video/em28xx/em28xx-core.c

index dbea89c115b1f817101dbe21304c7d14e3aaa138..4ebef10b572264d1a609e41348838e344f24bc53 100644 (file)
@@ -813,19 +813,27 @@ int em28xx_set_alternate(struct em28xx *dev)
 {
        int errCode, prev_alt = dev->alt;
        int i;
-       unsigned int min_pkt_size = dev->bytesperline+4;
+       unsigned int min_pkt_size = dev->bytesperline + 4;
 
-       /* When image size is bigger than a ceirtain value,
+       /* When image size is bigger than a certain value,
           the frame size should be increased, otherwise, only
           green screen will be received.
         */
        if (dev->frame_size > 720*240*2)
                min_pkt_size *= 2;
 
-       for (i = 0; i < dev->num_alt; i++)
-               if (dev->alt_max_pkt_size[i] >= min_pkt_size)
+       for (i = 0; i < dev->num_alt; i++) {
+               /* stop when the selected alt setting offers enough bandwidth */
+               if (dev->alt_max_pkt_size[i] >= min_pkt_size) {
+                       dev->alt = i;
                        break;
-       dev->alt = i;
+               /* otherwise make sure that we end up with the maximum bandwidth
+                  because the min_pkt_size equation might be wrong...
+               */
+               } else if (dev->alt_max_pkt_size[i] >
+                          dev->alt_max_pkt_size[dev->alt])
+                       dev->alt = i;
+       }
 
        if (dev->alt != prev_alt) {
                em28xx_coredbg("minimum isoc packet size: %u (alt=%d)\n",