aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAapo Tahkola <aet@rasterburn.org>2007-05-08 18:21:47 -0300
committerMauro Carvalho Chehab <mchehab@infradead.org>2007-07-18 14:23:43 -0300
commit3847b22ab59a9110c9e7433ac75751070047280e (patch)
tree912b02bdd4dd1b69d6a821c02b6f1b71b497e3d9
parent55bbe5ea203373c07c10a9d1d5088dd013345027 (diff)
V4L/DVB (5694): M920x: fix for Dposh devices
Make sure devices manufactured by Dposh are not affected by previous hw pid filtering changes Doing so might crash it. Signed-off-by: Aapo Tahkola <aet@rasterburn.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
-rw-r--r--drivers/media/dvb/dvb-usb/m920x.c38
1 files changed, 22 insertions, 16 deletions
diff --git a/drivers/media/dvb/dvb-usb/m920x.c b/drivers/media/dvb/dvb-usb/m920x.c
index 350cdc90b9c..1156b7df797 100644
--- a/drivers/media/dvb/dvb-usb/m920x.c
+++ b/drivers/media/dvb/dvb-usb/m920x.c
@@ -59,7 +59,7 @@ static inline int m920x_write(struct usb_device *udev, u8 request,
static int m920x_init(struct dvb_usb_device *d, struct m920x_inits *rc_seq)
{
- int ret = 0, i, epi;
+ int ret = 0, i, epi, flags = 0;
int adap_enabled[M9206_MAX_ADAPTERS] = { 0 };
/* Remote controller init. */
@@ -79,26 +79,32 @@ static int m920x_init(struct dvb_usb_device *d, struct m920x_inits *rc_seq)
deb("Initialising remote control success\n");
}
- for (i = 0; i < d->props.num_adapters; i++) {
- epi = d->adapter[i].props.stream.endpoint - 0x81;
+ for (i = 0; i < d->props.num_adapters; i++)
+ flags |= d->adapter[i].props.caps;
- if (epi < 0 || epi >= M9206_MAX_ADAPTERS) {
- printk(KERN_INFO "m920x: Unexpected adapter endpoint!\n");
- return -EINVAL;
- }
+ /* Some devices(Dposh) might crash if we attempt touch at all. */
+ if (flags & DVB_USB_ADAP_HAS_PID_FILTER) {
+ for (i = 0; i < d->props.num_adapters; i++) {
+ epi = d->adapter[i].props.stream.endpoint - 0x81;
- adap_enabled[epi] = 1;
- }
+ if (epi < 0 || epi >= M9206_MAX_ADAPTERS) {
+ printk(KERN_INFO "m920x: Unexpected adapter endpoint!\n");
+ return -EINVAL;
+ }
- for (i = 0; i < M9206_MAX_ADAPTERS; i++) {
- if (adap_enabled[i])
- continue;
+ adap_enabled[epi] = 1;
+ }
- if ((ret = m920x_set_filter(d, 0x81 + i, 0, 0x0)) != 0)
- return ret;
+ for (i = 0; i < M9206_MAX_ADAPTERS; i++) {
+ if (adap_enabled[i])
+ continue;
- if ((ret = m920x_set_filter(d, 0x81 + i, 0, 0x02f5)) != 0)
- return ret;
+ if ((ret = m920x_set_filter(d, 0x81 + i, 0, 0x0)) != 0)
+ return ret;
+
+ if ((ret = m920x_set_filter(d, 0x81 + i, 0, 0x02f5)) != 0)
+ return ret;
+ }
}
return ret;