[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: Gianluca Gennari <gennarone@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
95faf82bd3
commit
5f5f147f63
|
@ -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)
|
||||||
}
|
}
|
||||||
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)
|
||||||
{
|
{
|
||||||
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,
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue