diff options
author | Frank Schaefer <fschaefer.oss@googlemail.com> | 2012-11-08 12:11:52 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-12-22 15:17:52 -0500 |
commit | c647a91a2558c4031eddd013e5860ca5a41363a7 (patch) | |
tree | 90a0b103355b59ef61fa7d2f88a6ec78e24e189b /drivers/media/usb/em28xx/em28xx-dvb.c | |
parent | c8e9d95b41f2a441b2af0a1899448dd45ad7632d (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.c | 34 |
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 | ||