1 commit 900c688fa839fa2b84f99d6024ba46ca178c896e
2 Author: gdhan <gdhan@dev3>
3 Date: Thu Feb 23 16:20:47 2017 +0900
7 diff --git a/drivers/media/dvb-core/dmxdev.c b/drivers/media/dvb-core/dmxdev.c
8 index d0e3f9d..d060019 100644
9 --- a/drivers/media/dvb-core/dmxdev.c
10 +++ b/drivers/media/dvb-core/dmxdev.c
11 @@ -82,7 +82,11 @@ static ssize_t dvb_dmxdev_buffer_read(struct dvb_ringbuffer *src,
13 ret = wait_event_interruptible(src->queue,
14 !dvb_ringbuffer_empty(src) ||
16 + (src->error != 0) ||
17 + (src->do_wait != 1));
18 + if (src->do_wait != 1)
24 @@ -955,6 +959,22 @@ dvb_demux_read(struct file *file, char __user *buf, size_t count,
28 +static int dvb_demux_lock_filter(struct dmxdev_filter *dmxdevfilter)
32 + dmxdevfilter->buffer.do_wait = 0;
34 + if (waitqueue_active(&dmxdevfilter->buffer.queue))
35 + wake_up(&dmxdevfilter->buffer.queue);
37 + ret = mutex_lock_interruptible(&dmxdevfilter->mutex);
39 + dmxdevfilter->buffer.do_wait = 1;
44 static int dvb_demux_do_ioctl(struct file *file,
45 unsigned int cmd, void *parg)
47 @@ -968,7 +988,7 @@ static int dvb_demux_do_ioctl(struct file *file,
51 - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
52 + if (dvb_demux_lock_filter(dmxdevfilter)) {
53 mutex_unlock(&dmxdev->mutex);
56 @@ -980,7 +1000,7 @@ static int dvb_demux_do_ioctl(struct file *file,
60 - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
61 + if (dvb_demux_lock_filter(dmxdevfilter)) {
62 mutex_unlock(&dmxdev->mutex);
65 @@ -989,7 +1009,7 @@ static int dvb_demux_do_ioctl(struct file *file,
69 - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
70 + if (dvb_demux_lock_filter(dmxdevfilter)) {
71 mutex_unlock(&dmxdev->mutex);
74 @@ -998,7 +1018,7 @@ static int dvb_demux_do_ioctl(struct file *file,
77 case DMX_SET_PES_FILTER:
78 - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
79 + if (dvb_demux_lock_filter(dmxdevfilter)) {
80 mutex_unlock(&dmxdev->mutex);
83 @@ -1007,7 +1027,7 @@ static int dvb_demux_do_ioctl(struct file *file,
86 case DMX_SET_BUFFER_SIZE:
87 - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
88 + if (dvb_demux_lock_filter(dmxdevfilter)) {
89 mutex_unlock(&dmxdev->mutex);
92 @@ -1051,7 +1071,7 @@ static int dvb_demux_do_ioctl(struct file *file,
96 - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
97 + if (dvb_demux_lock_filter(dmxdevfilter)) {
101 @@ -1060,7 +1080,7 @@ static int dvb_demux_do_ioctl(struct file *file,
105 - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
106 + if (dvb_demux_lock_filter(dmxdevfilter)) {
110 @@ -1221,6 +1241,13 @@ static const struct dvb_device dvbdev_dvr = {
112 .fops = &dvb_dvr_fops
115 +void (*dvb_dmxdev_init_hook)(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter) = NULL;
116 +EXPORT_SYMBOL(dvb_dmxdev_init_hook);
118 +void (*dvb_dmxdev_release_hook)(struct dmxdev *dmxdev) = NULL;
119 +EXPORT_SYMBOL(dvb_dmxdev_release_hook);
121 int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter)
124 @@ -1248,6 +1275,9 @@ int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter)
126 dvb_ringbuffer_init(&dmxdev->dvr_buffer, NULL, 8192);
128 + if (dvb_dmxdev_init_hook) {
129 + dvb_dmxdev_init_hook(dmxdev, dvb_adapter);
134 @@ -1255,6 +1285,10 @@ EXPORT_SYMBOL(dvb_dmxdev_init);
136 void dvb_dmxdev_release(struct dmxdev *dmxdev)
138 + if (dvb_dmxdev_release_hook) {
139 + dvb_dmxdev_release_hook(dmxdev);
143 if (dmxdev->dvbdev->users > 1) {
144 wait_event(dmxdev->dvbdev->wait_queue,
145 diff --git a/drivers/media/dvb-core/dvb_demux.c b/drivers/media/dvb-core/dvb_demux.c
146 index 6c7ff0c..bd2d3c5 100644
147 --- a/drivers/media/dvb-core/dvb_demux.c
148 +++ b/drivers/media/dvb-core/dvb_demux.c
149 @@ -60,6 +60,9 @@ MODULE_PARM_DESC(dvb_demux_feed_err_pkts,
153 +int (*dmx_swfilter_hook)(struct dvb_demux *dvbdmx, const u8 *buffer, size_t length) = NULL;
154 +EXPORT_SYMBOL(dmx_swfilter_hook);
156 /******************************************************************************
157 * static inlined helper functions
158 ******************************************************************************/
159 @@ -478,6 +481,10 @@ void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf,
163 + if (dmx_swfilter_hook) {
164 + if (dmx_swfilter_hook(demux, buf, count) >= 0) return;
167 spin_lock_irqsave(&demux->lock, flags);
170 @@ -572,6 +579,10 @@ bailout:
172 void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count)
174 + if (dmx_swfilter_hook) {
175 + if (dmx_swfilter_hook(demux, buf, count) >= 0) return;
178 _dvb_dmx_swfilter(demux, buf, count, 188);
180 EXPORT_SYMBOL(dvb_dmx_swfilter);
181 diff --git a/drivers/media/dvb-core/dvb_ringbuffer.c b/drivers/media/dvb-core/dvb_ringbuffer.c
182 index 1100e98..64a77fe 100644
183 --- a/drivers/media/dvb-core/dvb_ringbuffer.c
184 +++ b/drivers/media/dvb-core/dvb_ringbuffer.c
185 @@ -45,6 +45,7 @@ void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len)
191 init_waitqueue_head(&rbuf->queue);
193 diff --git a/drivers/media/dvb-core/dvb_ringbuffer.h b/drivers/media/dvb-core/dvb_ringbuffer.h
194 index 9e1e11b..0f876c0 100644
195 --- a/drivers/media/dvb-core/dvb_ringbuffer.h
196 +++ b/drivers/media/dvb-core/dvb_ringbuffer.h
197 @@ -39,6 +39,7 @@ struct dvb_ringbuffer {
199 wait_queue_head_t queue;
204 #define DVB_RINGBUFFER_PKTHDRSIZE 3