[vuplus-wifi-util] fix default ccode
[vuplus_openvuplus_3.0] / meta-bsp / recipes-kernel / linux / linux-vuplus-4.1.45 / linux_dvb-core.patch
1 diff --git a/drivers/media/dvb-core/dmxdev.c b/drivers/media/dvb-core/dmxdev.c
2 index d0e3f9d..d060019 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,
6  
7                 ret = wait_event_interruptible(src->queue,
8                                                !dvb_ringbuffer_empty(src) ||
9 -                                              (src->error != 0));
10 +                                              (src->error != 0) ||
11 +                                              (src->do_wait != 1));
12 +               if (src->do_wait != 1)
13 +                       ret = -EINTR;
14 +
15                 if (ret < 0)
16                         break;
17  
18 @@ -955,6 +959,22 @@ dvb_demux_read(struct file *file, char __user *buf, size_t count,
19         return ret;
20  }
21  
22 +static int dvb_demux_lock_filter(struct dmxdev_filter *dmxdevfilter)
23 +{
24 +       int ret;
25 +
26 +       dmxdevfilter->buffer.do_wait = 0;
27 +
28 +       if (waitqueue_active(&dmxdevfilter->buffer.queue))
29 +               wake_up(&dmxdevfilter->buffer.queue);
30 +
31 +       ret = mutex_lock_interruptible(&dmxdevfilter->mutex);
32 +
33 +       dmxdevfilter->buffer.do_wait = 1;
34 +
35 +       return ret;
36 +}
37 +
38  static int dvb_demux_do_ioctl(struct file *file,
39                               unsigned int cmd, void *parg)
40  {
41 @@ -968,7 +988,7 @@ static int dvb_demux_do_ioctl(struct file *file,
42  
43         switch (cmd) {
44         case DMX_START:
45 -               if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
46 +               if (dvb_demux_lock_filter(dmxdevfilter)) {
47                         mutex_unlock(&dmxdev->mutex);
48                         return -ERESTARTSYS;
49                 }
50 @@ -980,7 +1000,7 @@ static int dvb_demux_do_ioctl(struct file *file,
51                 break;
52  
53         case DMX_STOP:
54 -               if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
55 +               if (dvb_demux_lock_filter(dmxdevfilter)) {
56                         mutex_unlock(&dmxdev->mutex);
57                         return -ERESTARTSYS;
58                 }
59 @@ -989,7 +1009,7 @@ static int dvb_demux_do_ioctl(struct file *file,
60                 break;
61  
62         case DMX_SET_FILTER:
63 -               if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
64 +               if (dvb_demux_lock_filter(dmxdevfilter)) {
65                         mutex_unlock(&dmxdev->mutex);
66                         return -ERESTARTSYS;
67                 }
68 @@ -998,7 +1018,7 @@ static int dvb_demux_do_ioctl(struct file *file,
69                 break;
70  
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);
75                         return -ERESTARTSYS;
76                 }
77 @@ -1007,7 +1027,7 @@ static int dvb_demux_do_ioctl(struct file *file,
78                 break;
79  
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);
84                         return -ERESTARTSYS;
85                 }
86 @@ -1051,7 +1071,7 @@ static int dvb_demux_do_ioctl(struct file *file,
87                 break;
88  
89         case DMX_ADD_PID:
90 -               if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
91 +               if (dvb_demux_lock_filter(dmxdevfilter)) {
92                         ret = -ERESTARTSYS;
93                         break;
94                 }
95 @@ -1060,7 +1080,7 @@ static int dvb_demux_do_ioctl(struct file *file,
96                 break;
97  
98         case DMX_REMOVE_PID:
99 -               if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
100 +               if (dvb_demux_lock_filter(dmxdevfilter)) {
101                         ret = -ERESTARTSYS;
102                         break;
103                 }
104 @@ -1221,6 +1241,13 @@ static const struct dvb_device dvbdev_dvr = {
105  #endif
106         .fops = &dvb_dvr_fops
107  };
108 +
109 +void (*dvb_dmxdev_init_hook)(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter) = NULL;
110 +EXPORT_SYMBOL(dvb_dmxdev_init_hook);
111 +
112 +void (*dvb_dmxdev_release_hook)(struct dmxdev *dmxdev) = NULL;
113 +EXPORT_SYMBOL(dvb_dmxdev_release_hook);
114 +
115  int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter)
116  {
117         int i;
118 @@ -1248,6 +1275,9 @@ int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter)
119  
120         dvb_ringbuffer_init(&dmxdev->dvr_buffer, NULL, 8192);
121  
122 +       if (dvb_dmxdev_init_hook) {
123 +               dvb_dmxdev_init_hook(dmxdev, dvb_adapter);
124 +       }
125         return 0;
126  }
127  
128 @@ -1255,6 +1285,10 @@ EXPORT_SYMBOL(dvb_dmxdev_init);
129  
130  void dvb_dmxdev_release(struct dmxdev *dmxdev)
131  {
132 +       if (dvb_dmxdev_release_hook) {
133 +               dvb_dmxdev_release_hook(dmxdev);
134 +       }
135 +
136         dmxdev->exit=1;
137         if (dmxdev->dvbdev->users > 1) {
138                 wait_event(dmxdev->dvbdev->wait_queue,
139 diff --git a/drivers/media/dvb-core/dvb_demux.c b/drivers/media/dvb-core/dvb_demux.c
140 index 6c7ff0c..bd2d3c5 100644
141 --- a/drivers/media/dvb-core/dvb_demux.c
142 +++ b/drivers/media/dvb-core/dvb_demux.c
143 @@ -60,6 +60,9 @@ MODULE_PARM_DESC(dvb_demux_feed_err_pkts,
144                         printk(x);                              \
145         } while (0)
146  
147 +int (*dmx_swfilter_hook)(struct dvb_demux *dvbdmx, const u8 *buffer, size_t length) = NULL;
148 +EXPORT_SYMBOL(dmx_swfilter_hook);
149 +
150  /******************************************************************************
151   * static inlined helper functions
152   ******************************************************************************/
153 @@ -478,6 +481,10 @@ void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf,
154  {
155         unsigned long flags;
156  
157 +       if (dmx_swfilter_hook) {
158 +               if (dmx_swfilter_hook(demux, buf, count) >= 0) return;
159 +       }
160 +
161         spin_lock_irqsave(&demux->lock, flags);
162  
163         while (count--) {
164 @@ -572,6 +579,10 @@ bailout:
165  
166  void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count)
167  {
168 +       if (dmx_swfilter_hook) {
169 +               if (dmx_swfilter_hook(demux, buf, count) >= 0) return;
170 +       }
171 +
172         _dvb_dmx_swfilter(demux, buf, count, 188);
173  }
174  EXPORT_SYMBOL(dvb_dmx_swfilter);
175 diff --git a/drivers/media/dvb-core/dvb_ringbuffer.c b/drivers/media/dvb-core/dvb_ringbuffer.c
176 index 7df7fb3..b8771b3 100644
177 --- a/drivers/media/dvb-core/dvb_ringbuffer.c
178 +++ b/drivers/media/dvb-core/dvb_ringbuffer.c
179 @@ -45,6 +45,7 @@ void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len)
180         rbuf->data=data;
181         rbuf->size=len;
182         rbuf->error=0;
183 +       rbuf->do_wait=1;
184  
185         init_waitqueue_head(&rbuf->queue);
186  
187 diff --git a/drivers/media/dvb-core/dvb_ringbuffer.h b/drivers/media/dvb-core/dvb_ringbuffer.h
188 index 9e1e11b..0f876c0 100644
189 --- a/drivers/media/dvb-core/dvb_ringbuffer.h
190 +++ b/drivers/media/dvb-core/dvb_ringbuffer.h
191 @@ -39,6 +39,7 @@ struct dvb_ringbuffer {
192  
193         wait_queue_head_t queue;
194         spinlock_t        lock;
195 +       int               do_wait;
196  };
197  
198  #define DVB_RINGBUFFER_PKTHDRSIZE 3