Commit 5f5f147f authored by Gianluca Gennari's avatar Gianluca Gennari Committed by Mauro Carvalho Chehab

[media] em28xx-dvb: stop URBs when stopping the streaming

Stop the URBs in em28xx_stop_streaming(), so that em28xx_irq_callback()
cannot be called after the streaming has stopped.

This should eliminate the crashes reported by Antti Palosaari and the warnings
reported by Andy Furniss.
Signed-off-by: default avatarGianluca Gennari <gennarone@gmail.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 95faf82b
...@@ -666,7 +666,6 @@ int em28xx_capture_start(struct em28xx *dev, int start) ...@@ -666,7 +666,6 @@ int em28xx_capture_start(struct em28xx *dev, int start)
return rc; return rc;
} }
EXPORT_SYMBOL_GPL(em28xx_capture_start);
int em28xx_vbi_supported(struct em28xx *dev) int em28xx_vbi_supported(struct em28xx *dev)
{ {
...@@ -1007,6 +1006,31 @@ void em28xx_uninit_isoc(struct em28xx *dev, enum em28xx_mode mode) ...@@ -1007,6 +1006,31 @@ void em28xx_uninit_isoc(struct em28xx *dev, enum em28xx_mode mode)
} }
EXPORT_SYMBOL_GPL(em28xx_uninit_isoc); EXPORT_SYMBOL_GPL(em28xx_uninit_isoc);
/*
* Stop URBs
*/
void em28xx_stop_urbs(struct em28xx *dev)
{
int i;
struct urb *urb;
struct em28xx_usb_isoc_bufs *isoc_bufs = &dev->isoc_ctl.digital_bufs;
em28xx_isocdbg("em28xx: called em28xx_stop_urbs\n");
for (i = 0; i < isoc_bufs->num_bufs; i++) {
urb = isoc_bufs->urb[i];
if (urb) {
if (!irqs_disabled())
usb_kill_urb(urb);
else
usb_unlink_urb(urb);
}
}
em28xx_capture_start(dev, 0);
}
EXPORT_SYMBOL_GPL(em28xx_stop_urbs);
/* /*
* Allocate URBs * Allocate URBs
*/ */
......
...@@ -183,7 +183,7 @@ static int em28xx_stop_streaming(struct em28xx_dvb *dvb) ...@@ -183,7 +183,7 @@ static int em28xx_stop_streaming(struct em28xx_dvb *dvb)
{ {
struct em28xx *dev = dvb->adapter.priv; struct em28xx *dev = dvb->adapter.priv;
em28xx_capture_start(dev, 0); em28xx_stop_urbs(dev);
em28xx_set_mode(dev, EM28XX_SUSPEND); em28xx_set_mode(dev, EM28XX_SUSPEND);
......
...@@ -695,6 +695,7 @@ int em28xx_init_isoc(struct em28xx *dev, enum em28xx_mode mode, ...@@ -695,6 +695,7 @@ int em28xx_init_isoc(struct em28xx *dev, enum em28xx_mode mode,
int max_packets, int num_bufs, int max_pkt_size, int max_packets, int num_bufs, int max_pkt_size,
int (*isoc_copy) (struct em28xx *dev, struct urb *urb)); int (*isoc_copy) (struct em28xx *dev, struct urb *urb));
void em28xx_uninit_isoc(struct em28xx *dev, enum em28xx_mode mode); void em28xx_uninit_isoc(struct em28xx *dev, enum em28xx_mode mode);
void em28xx_stop_urbs(struct em28xx *dev);
int em28xx_isoc_dvb_max_packetsize(struct em28xx *dev); int em28xx_isoc_dvb_max_packetsize(struct em28xx *dev);
int em28xx_set_mode(struct em28xx *dev, enum em28xx_mode set_mode); int em28xx_set_mode(struct em28xx *dev, enum em28xx_mode set_mode);
int em28xx_gpio_set(struct em28xx *dev, struct em28xx_reg_seq *gpio); int em28xx_gpio_set(struct em28xx *dev, struct em28xx_reg_seq *gpio);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment