aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/usb/em28xx/em28xx-dvb.c
diff options
context:
space:
mode:
authorFrank Schaefer <fschaefer.oss@googlemail.com>2012-11-08 12:11:52 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-12-22 15:17:52 -0500
commitc647a91a2558c4031eddd013e5860ca5a41363a7 (patch)
tree90a0b103355b59ef61fa7d2f88a6ec78e24e189b /drivers/media/usb/em28xx/em28xx-dvb.c
parentc8e9d95b41f2a441b2af0a1899448dd45ad7632d (diff)
[media] em28xx: improve USB endpoint logic, also use bulk transfers
The current enpoint logic ignores all bulk endpoints and uses a fixed mapping between endpint addresses and the supported data stream types (analog/audio/DVB): Ep 0x82, isoc => analog Ep 0x83, isoc => audio Ep 0x84, isoc => DVB Now that the code can also do bulk transfers, the endpoint logic has to be extended to also consider bulk endpoints. The new logic preserves backwards compatibility and reflects the endpoint configurations we have seen so far: Ep 0x82, isoc => analog Ep 0x82, bulk => analog Ep 0x83, isoc* => audio Ep 0x84, isoc => digital Ep 0x84, bulk => analog or digital** (*: audio should always be isoc) (**: analog, if ep 0x82 is isoc, otherwise digital) [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>
Diffstat (limited to 'drivers/media/usb/em28xx/em28xx-dvb.c')
-rw-r--r--drivers/media/usb/em28xx/em28xx-dvb.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/drivers/media/usb/em28xx/em28xx-dvb.c b/drivers/media/usb/em28xx/em28xx-dvb.c
index 24962520df80..a70b19e07e37 100644
--- a/drivers/media/usb/em28xx/em28xx-dvb.c
+++ b/drivers/media/usb/em28xx/em28xx-dvb.c
@@ -176,25 +176,39 @@ static int em28xx_start_streaming(struct em28xx_dvb *dvb)
176{ 176{
177 int rc; 177 int rc;
178 struct em28xx *dev = dvb->adapter.priv; 178 struct em28xx *dev = dvb->adapter.priv;
179 int max_dvb_packet_size; 179 int dvb_max_packet_size, packet_multiplier, dvb_alt;
180
181 if (dev->dvb_xfer_bulk) {
182 if (!dev->dvb_ep_bulk)
183 return -ENODEV;
184 dvb_max_packet_size = 512; /* USB 2.0 spec */
185 packet_multiplier = EM28XX_DVB_BULK_PACKET_MULTIPLIER;
186 dvb_alt = 0;
187 } else { /* isoc */
188 if (!dev->dvb_ep_isoc)
189 return -ENODEV;
190 dvb_max_packet_size = dev->dvb_max_pkt_size_isoc;
191 if (dvb_max_packet_size < 0)
192 return dvb_max_packet_size;
193 packet_multiplier = EM28XX_DVB_NUM_ISOC_PACKETS;
194 dvb_alt = dev->dvb_alt_isoc;
195 }
180 196
181 usb_set_interface(dev->udev, 0, dev->dvb_alt_isoc); 197 usb_set_interface(dev->udev, 0, dvb_alt);
182 rc = em28xx_set_mode(dev, EM28XX_DIGITAL_MODE); 198 rc = em28xx_set_mode(dev, EM28XX_DIGITAL_MODE);
183 if (rc < 0) 199 if (rc < 0)
184 return rc; 200 return rc;
185 201
186 max_dvb_packet_size = dev->dvb_max_pkt_size_isoc;
187 if (max_dvb_packet_size < 0)
188 return max_dvb_packet_size;
189 dprintk(1, "Using %d buffers each with %d x %d bytes\n", 202 dprintk(1, "Using %d buffers each with %d x %d bytes\n",
190 EM28XX_DVB_NUM_BUFS, 203 EM28XX_DVB_NUM_BUFS,
191 EM28XX_DVB_NUM_ISOC_PACKETS, 204 packet_multiplier,
192 max_dvb_packet_size); 205 dvb_max_packet_size);
193 206
194 return em28xx_init_usb_xfer(dev, EM28XX_DIGITAL_MODE, 0, 207 return em28xx_init_usb_xfer(dev, EM28XX_DIGITAL_MODE,
208 dev->dvb_xfer_bulk,
195 EM28XX_DVB_NUM_BUFS, 209 EM28XX_DVB_NUM_BUFS,
196 max_dvb_packet_size, 210 dvb_max_packet_size,
197 EM28XX_DVB_NUM_ISOC_PACKETS, 211 packet_multiplier,
198 em28xx_dvb_urb_data_copy); 212 em28xx_dvb_urb_data_copy);
199} 213}
200 214