1 diff --git a/drivers/media/dvb-core/dmxdev.c b/drivers/media/dvb-core/dmxdev.c
2 index c0363f1..0171117 100644
3 --- a/drivers/media/dvb-core/dmxdev.c
4 +++ b/drivers/media/dvb-core/dmxdev.c
5 @@ -82,7 +82,11 @@ static ssize_t dvb_dmxdev_buffer_read(struct dvb_ringbuffer *src,
7 ret = wait_event_interruptible(src->queue,
8 !dvb_ringbuffer_empty(src) ||
10 + (src->error != 0) ||
11 + (src->do_wait != 1));
12 + if (src->do_wait != 1)
18 @@ -955,6 +959,22 @@ dvb_demux_read(struct file *file, char __user *buf, size_t count,
22 +static int dvb_demux_lock_filter(struct dmxdev_filter *dmxdevfilter)
26 + dmxdevfilter->buffer.do_wait = 0;
28 + if (waitqueue_active(&dmxdevfilter->buffer.queue))
29 + wake_up(&dmxdevfilter->buffer.queue);
31 + ret = mutex_lock_interruptible(&dmxdevfilter->mutex);
33 + dmxdevfilter->buffer.do_wait = 1;
38 static int dvb_demux_do_ioctl(struct file *file,
39 unsigned int cmd, void *parg)
41 @@ -968,7 +988,7 @@ static int dvb_demux_do_ioctl(struct file *file,
45 - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
46 + if (dvb_demux_lock_filter(dmxdevfilter)) {
47 mutex_unlock(&dmxdev->mutex);
50 @@ -980,7 +1000,7 @@ static int dvb_demux_do_ioctl(struct file *file,
54 - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
55 + if (dvb_demux_lock_filter(dmxdevfilter)) {
56 mutex_unlock(&dmxdev->mutex);
59 @@ -989,7 +1009,7 @@ static int dvb_demux_do_ioctl(struct file *file,
63 - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
64 + if (dvb_demux_lock_filter(dmxdevfilter)) {
65 mutex_unlock(&dmxdev->mutex);
68 @@ -998,7 +1018,7 @@ static int dvb_demux_do_ioctl(struct file *file,
71 case DMX_SET_PES_FILTER:
72 - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
73 + if (dvb_demux_lock_filter(dmxdevfilter)) {
74 mutex_unlock(&dmxdev->mutex);
77 @@ -1007,7 +1027,7 @@ static int dvb_demux_do_ioctl(struct file *file,
80 case DMX_SET_BUFFER_SIZE:
81 - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
82 + if (dvb_demux_lock_filter(dmxdevfilter)) {
83 mutex_unlock(&dmxdev->mutex);
86 @@ -1051,7 +1071,7 @@ static int dvb_demux_do_ioctl(struct file *file,
90 - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
91 + if (dvb_demux_lock_filter(dmxdevfilter)) {
95 @@ -1060,7 +1080,7 @@ static int dvb_demux_do_ioctl(struct file *file,
99 - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
100 + if (dvb_demux_lock_filter(dmxdevfilter)) {
104 @@ -1213,6 +1233,12 @@ static struct dvb_device dvbdev_dvr = {
105 .fops = &dvb_dvr_fops
108 +void (*dvb_dmxdev_init_hook)(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter) = NULL;
109 +EXPORT_SYMBOL(dvb_dmxdev_init_hook);
111 +void (*dvb_dmxdev_release_hook)(struct dmxdev *dmxdev) = NULL;
112 +EXPORT_SYMBOL(dvb_dmxdev_release_hook);
114 int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter)
117 @@ -1240,6 +1266,9 @@ int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter)
119 dvb_ringbuffer_init(&dmxdev->dvr_buffer, NULL, 8192);
121 + if (dvb_dmxdev_init_hook) {
122 + dvb_dmxdev_init_hook(dmxdev, dvb_adapter);
127 @@ -1247,6 +1276,10 @@ EXPORT_SYMBOL(dvb_dmxdev_init);
129 void dvb_dmxdev_release(struct dmxdev *dmxdev)
131 + if (dvb_dmxdev_release_hook) {
132 + dvb_dmxdev_release_hook(dmxdev);
136 if (dmxdev->dvbdev->users > 1) {
137 wait_event(dmxdev->dvbdev->wait_queue,
138 diff --git a/drivers/media/dvb-core/dvb_demux.c b/drivers/media/dvb-core/dvb_demux.c
139 index 6c7ff0c..bd2d3c5 100644
140 --- a/drivers/media/dvb-core/dvb_demux.c
141 +++ b/drivers/media/dvb-core/dvb_demux.c
142 @@ -60,6 +60,9 @@ MODULE_PARM_DESC(dvb_demux_feed_err_pkts,
146 +int (*dmx_swfilter_hook)(struct dvb_demux *dvbdmx, const u8 *buffer, size_t length) = NULL;
147 +EXPORT_SYMBOL(dmx_swfilter_hook);
149 /******************************************************************************
150 * static inlined helper functions
151 ******************************************************************************/
152 @@ -478,6 +481,10 @@ void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf,
156 + if (dmx_swfilter_hook) {
157 + if (dmx_swfilter_hook(demux, buf, count) >= 0) return;
160 spin_lock_irqsave(&demux->lock, flags);
163 @@ -572,6 +579,10 @@ bailout:
165 void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count)
167 + if (dmx_swfilter_hook) {
168 + if (dmx_swfilter_hook(demux, buf, count) >= 0) return;
171 _dvb_dmx_swfilter(demux, buf, count, 188);
173 EXPORT_SYMBOL(dvb_dmx_swfilter);
174 diff --git a/drivers/media/dvb-core/dvb_ringbuffer.c b/drivers/media/dvb-core/dvb_ringbuffer.c
175 index a5712cd..d5333f3 100644
176 --- a/drivers/media/dvb-core/dvb_ringbuffer.c
177 +++ b/drivers/media/dvb-core/dvb_ringbuffer.c
178 @@ -45,6 +45,7 @@ void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len)
184 init_waitqueue_head(&rbuf->queue);
186 diff --git a/drivers/media/dvb-core/dvb_ringbuffer.h b/drivers/media/dvb-core/dvb_ringbuffer.h
187 index 41f04da..6951dd3 100644
188 --- a/drivers/media/dvb-core/dvb_ringbuffer.h
189 +++ b/drivers/media/dvb-core/dvb_ringbuffer.h
190 @@ -39,6 +39,7 @@ struct dvb_ringbuffer {
192 wait_queue_head_t queue;
197 #define DVB_RINGBUFFER_PKTHDRSIZE 3