From a4522f4eda11a8e6ab795ef1a012e6d820a8d5b9 Mon Sep 17 00:00:00 2001 From: Frank Schaefer Date: Thu, 8 Nov 2012 14:11:51 -0300 Subject: [PATCH] --- yaml --- r: 357139 b: refs/heads/master c: c8e9d95b41f2a441b2af0a1899448dd45ad7632d h: refs/heads/master i: 357137: c49fcf7944d4e92fe1b0eeb193103975a7982835 357135: ab34d3bc0f351c38649a8426bff4b50fdd36a386 v: v3 --- [refs] | 2 +- trunk/drivers/media/usb/em28xx/em28xx-core.c | 23 +++++++++++++------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index 08d1c373468b..ca1b2ab9a604 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7312f2c9fa22614acc787c064a0865840888d662 +refs/heads/master: c8e9d95b41f2a441b2af0a1899448dd45ad7632d diff --git a/trunk/drivers/media/usb/em28xx/em28xx-core.c b/trunk/drivers/media/usb/em28xx/em28xx-core.c index 3c40a1da69b6..cdf4cd24007d 100644 --- a/trunk/drivers/media/usb/em28xx/em28xx-core.c +++ b/trunk/drivers/media/usb/em28xx/em28xx-core.c @@ -805,21 +805,23 @@ int em28xx_resolution_set(struct em28xx *dev) return em28xx_scaler_set(dev, dev->hscale, dev->vscale); } +/* Set USB alternate setting for analog video */ int em28xx_set_alternate(struct em28xx *dev) { int errCode, prev_alt = dev->alt; int i; unsigned int min_pkt_size = dev->width * 2 + 4; - /* - * alt = 0 is used only for control messages, so, only values - * greater than 0 can be used for streaming. - */ - if (alt && alt < dev->num_alt) { + /* NOTE: for isoc transfers, only alt settings > 0 are allowed + for bulk transfers, use alt=0 as default value */ + dev->alt = 0; + if ((alt > 0) && (alt < dev->num_alt)) { em28xx_coredbg("alternate forced to %d\n", dev->alt); dev->alt = alt; goto set_alt; } + if (dev->analog_xfer_bulk) + goto set_alt; /* When image size is bigger than a certain value, the frame size should be increased, otherwise, only @@ -843,9 +845,14 @@ int em28xx_set_alternate(struct em28xx *dev) set_alt: if (dev->alt != prev_alt) { - em28xx_coredbg("minimum isoc packet size: %u (alt=%d)\n", - min_pkt_size, dev->alt); - dev->max_pkt_size = dev->alt_max_pkt_size_isoc[dev->alt]; + if (dev->analog_xfer_bulk) { + dev->max_pkt_size = 512; /* USB 2.0 spec */ + } else { /* isoc */ + em28xx_coredbg("minimum isoc packet size: %u (alt=%d)\n", + min_pkt_size, dev->alt); + dev->max_pkt_size = + dev->alt_max_pkt_size_isoc[dev->alt]; + } em28xx_coredbg("setting alternate %d with wMaxPacketSize=%u\n", dev->alt, dev->max_pkt_size); errCode = usb_set_interface(dev->udev, 0, dev->alt);