Merge branch 'for-linus' of git://git.kernel.org/pub/scm/fs/xfs/xfs
[cascardo/linux.git] / drivers / media / dvb / dvb-core / dmxdev.c
1 /*
2  * dmxdev.c - DVB demultiplexer device
3  *
4  * Copyright (C) 2000 Ralph Metzler & Marcus Metzler
5  *                    for convergence integrated media GmbH
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public License
9  * as published by the Free Software Foundation; either version 2.1
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20  *
21  */
22
23 #include <linux/sched.h>
24 #include <linux/spinlock.h>
25 #include <linux/slab.h>
26 #include <linux/vmalloc.h>
27 #include <linux/module.h>
28 #include <linux/poll.h>
29 #include <linux/ioctl.h>
30 #include <linux/wait.h>
31 #include <asm/uaccess.h>
32 #include <asm/system.h>
33 #include "dmxdev.h"
34
35 static int debug;
36
37 module_param(debug, int, 0644);
38 MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off).");
39
40 #define dprintk if (debug) printk
41
42 static int dvb_dmxdev_buffer_write(struct dvb_ringbuffer *buf,
43                                    const u8 *src, size_t len)
44 {
45         ssize_t free;
46
47         if (!len)
48                 return 0;
49         if (!buf->data)
50                 return 0;
51
52         free = dvb_ringbuffer_free(buf);
53         if (len > free) {
54                 dprintk("dmxdev: buffer overflow\n");
55                 return -EOVERFLOW;
56         }
57
58         return dvb_ringbuffer_write(buf, src, len);
59 }
60
61 static ssize_t dvb_dmxdev_buffer_read(struct dvb_ringbuffer *src,
62                                       int non_blocking, char __user *buf,
63                                       size_t count, loff_t *ppos)
64 {
65         size_t todo;
66         ssize_t avail;
67         ssize_t ret = 0;
68
69         if (!src->data)
70                 return 0;
71
72         if (src->error) {
73                 ret = src->error;
74                 dvb_ringbuffer_flush(src);
75                 return ret;
76         }
77
78         for (todo = count; todo > 0; todo -= ret) {
79                 if (non_blocking && dvb_ringbuffer_empty(src)) {
80                         ret = -EWOULDBLOCK;
81                         break;
82                 }
83
84                 ret = wait_event_interruptible(src->queue,
85                                                !dvb_ringbuffer_empty(src) ||
86                                                (src->error != 0));
87                 if (ret < 0)
88                         break;
89
90                 if (src->error) {
91                         ret = src->error;
92                         dvb_ringbuffer_flush(src);
93                         break;
94                 }
95
96                 avail = dvb_ringbuffer_avail(src);
97                 if (avail > todo)
98                         avail = todo;
99
100                 ret = dvb_ringbuffer_read_user(src, buf, avail);
101                 if (ret < 0)
102                         break;
103
104                 buf += ret;
105         }
106
107         return (count - todo) ? (count - todo) : ret;
108 }
109
110 static struct dmx_frontend *get_fe(struct dmx_demux *demux, int type)
111 {
112         struct list_head *head, *pos;
113
114         head = demux->get_frontends(demux);
115         if (!head)
116                 return NULL;
117         list_for_each(pos, head)
118                 if (DMX_FE_ENTRY(pos)->source == type)
119                         return DMX_FE_ENTRY(pos);
120
121         return NULL;
122 }
123
124 static int dvb_dvr_open(struct inode *inode, struct file *file)
125 {
126         struct dvb_device *dvbdev = file->private_data;
127         struct dmxdev *dmxdev = dvbdev->priv;
128         struct dmx_frontend *front;
129
130         dprintk("function : %s\n", __func__);
131
132         if (mutex_lock_interruptible(&dmxdev->mutex))
133                 return -ERESTARTSYS;
134
135         if (dmxdev->exit) {
136                 mutex_unlock(&dmxdev->mutex);
137                 return -ENODEV;
138         }
139
140         if ((file->f_flags & O_ACCMODE) == O_RDWR) {
141                 if (!(dmxdev->capabilities & DMXDEV_CAP_DUPLEX)) {
142                         mutex_unlock(&dmxdev->mutex);
143                         return -EOPNOTSUPP;
144                 }
145         }
146
147         if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
148                 void *mem;
149                 if (!dvbdev->readers) {
150                         mutex_unlock(&dmxdev->mutex);
151                         return -EBUSY;
152                 }
153                 mem = vmalloc(DVR_BUFFER_SIZE);
154                 if (!mem) {
155                         mutex_unlock(&dmxdev->mutex);
156                         return -ENOMEM;
157                 }
158                 dvb_ringbuffer_init(&dmxdev->dvr_buffer, mem, DVR_BUFFER_SIZE);
159                 dvbdev->readers--;
160         }
161
162         if ((file->f_flags & O_ACCMODE) == O_WRONLY) {
163                 dmxdev->dvr_orig_fe = dmxdev->demux->frontend;
164
165                 if (!dmxdev->demux->write) {
166                         mutex_unlock(&dmxdev->mutex);
167                         return -EOPNOTSUPP;
168                 }
169
170                 front = get_fe(dmxdev->demux, DMX_MEMORY_FE);
171
172                 if (!front) {
173                         mutex_unlock(&dmxdev->mutex);
174                         return -EINVAL;
175                 }
176                 dmxdev->demux->disconnect_frontend(dmxdev->demux);
177                 dmxdev->demux->connect_frontend(dmxdev->demux, front);
178         }
179         dvbdev->users++;
180         mutex_unlock(&dmxdev->mutex);
181         return 0;
182 }
183
184 static int dvb_dvr_release(struct inode *inode, struct file *file)
185 {
186         struct dvb_device *dvbdev = file->private_data;
187         struct dmxdev *dmxdev = dvbdev->priv;
188
189         mutex_lock(&dmxdev->mutex);
190
191         if ((file->f_flags & O_ACCMODE) == O_WRONLY) {
192                 dmxdev->demux->disconnect_frontend(dmxdev->demux);
193                 dmxdev->demux->connect_frontend(dmxdev->demux,
194                                                 dmxdev->dvr_orig_fe);
195         }
196         if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
197                 dvbdev->readers++;
198                 if (dmxdev->dvr_buffer.data) {
199                         void *mem = dmxdev->dvr_buffer.data;
200                         mb();
201                         spin_lock_irq(&dmxdev->lock);
202                         dmxdev->dvr_buffer.data = NULL;
203                         spin_unlock_irq(&dmxdev->lock);
204                         vfree(mem);
205                 }
206         }
207         /* TODO */
208         dvbdev->users--;
209         if(dvbdev->users==-1 && dmxdev->exit==1) {
210                 fops_put(file->f_op);
211                 file->f_op = NULL;
212                 mutex_unlock(&dmxdev->mutex);
213                 wake_up(&dvbdev->wait_queue);
214         } else
215                 mutex_unlock(&dmxdev->mutex);
216
217         return 0;
218 }
219
220 static ssize_t dvb_dvr_write(struct file *file, const char __user *buf,
221                              size_t count, loff_t *ppos)
222 {
223         struct dvb_device *dvbdev = file->private_data;
224         struct dmxdev *dmxdev = dvbdev->priv;
225         int ret;
226
227         if (!dmxdev->demux->write)
228                 return -EOPNOTSUPP;
229         if ((file->f_flags & O_ACCMODE) != O_WRONLY)
230                 return -EINVAL;
231         if (mutex_lock_interruptible(&dmxdev->mutex))
232                 return -ERESTARTSYS;
233
234         if (dmxdev->exit) {
235                 mutex_unlock(&dmxdev->mutex);
236                 return -ENODEV;
237         }
238         ret = dmxdev->demux->write(dmxdev->demux, buf, count);
239         mutex_unlock(&dmxdev->mutex);
240         return ret;
241 }
242
243 static ssize_t dvb_dvr_read(struct file *file, char __user *buf, size_t count,
244                             loff_t *ppos)
245 {
246         struct dvb_device *dvbdev = file->private_data;
247         struct dmxdev *dmxdev = dvbdev->priv;
248
249         if (dmxdev->exit)
250                 return -ENODEV;
251
252         return dvb_dmxdev_buffer_read(&dmxdev->dvr_buffer,
253                                       file->f_flags & O_NONBLOCK,
254                                       buf, count, ppos);
255 }
256
257 static int dvb_dvr_set_buffer_size(struct dmxdev *dmxdev,
258                                       unsigned long size)
259 {
260         struct dvb_ringbuffer *buf = &dmxdev->dvr_buffer;
261         void *newmem;
262         void *oldmem;
263
264         dprintk("function : %s\n", __func__);
265
266         if (buf->size == size)
267                 return 0;
268         if (!size)
269                 return -EINVAL;
270
271         newmem = vmalloc(size);
272         if (!newmem)
273                 return -ENOMEM;
274
275         oldmem = buf->data;
276
277         spin_lock_irq(&dmxdev->lock);
278         buf->data = newmem;
279         buf->size = size;
280
281         /* reset and not flush in case the buffer shrinks */
282         dvb_ringbuffer_reset(buf);
283         spin_unlock_irq(&dmxdev->lock);
284
285         vfree(oldmem);
286
287         return 0;
288 }
289
290 static inline void dvb_dmxdev_filter_state_set(struct dmxdev_filter
291                                                *dmxdevfilter, int state)
292 {
293         spin_lock_irq(&dmxdevfilter->dev->lock);
294         dmxdevfilter->state = state;
295         spin_unlock_irq(&dmxdevfilter->dev->lock);
296 }
297
298 static int dvb_dmxdev_set_buffer_size(struct dmxdev_filter *dmxdevfilter,
299                                       unsigned long size)
300 {
301         struct dvb_ringbuffer *buf = &dmxdevfilter->buffer;
302         void *newmem;
303         void *oldmem;
304
305         if (buf->size == size)
306                 return 0;
307         if (!size)
308                 return -EINVAL;
309         if (dmxdevfilter->state >= DMXDEV_STATE_GO)
310                 return -EBUSY;
311
312         newmem = vmalloc(size);
313         if (!newmem)
314                 return -ENOMEM;
315
316         oldmem = buf->data;
317
318         spin_lock_irq(&dmxdevfilter->dev->lock);
319         buf->data = newmem;
320         buf->size = size;
321
322         /* reset and not flush in case the buffer shrinks */
323         dvb_ringbuffer_reset(buf);
324         spin_unlock_irq(&dmxdevfilter->dev->lock);
325
326         vfree(oldmem);
327
328         return 0;
329 }
330
331 static void dvb_dmxdev_filter_timeout(unsigned long data)
332 {
333         struct dmxdev_filter *dmxdevfilter = (struct dmxdev_filter *)data;
334
335         dmxdevfilter->buffer.error = -ETIMEDOUT;
336         spin_lock_irq(&dmxdevfilter->dev->lock);
337         dmxdevfilter->state = DMXDEV_STATE_TIMEDOUT;
338         spin_unlock_irq(&dmxdevfilter->dev->lock);
339         wake_up(&dmxdevfilter->buffer.queue);
340 }
341
342 static void dvb_dmxdev_filter_timer(struct dmxdev_filter *dmxdevfilter)
343 {
344         struct dmx_sct_filter_params *para = &dmxdevfilter->params.sec;
345
346         del_timer(&dmxdevfilter->timer);
347         if (para->timeout) {
348                 dmxdevfilter->timer.function = dvb_dmxdev_filter_timeout;
349                 dmxdevfilter->timer.data = (unsigned long)dmxdevfilter;
350                 dmxdevfilter->timer.expires =
351                     jiffies + 1 + (HZ / 2 + HZ * para->timeout) / 1000;
352                 add_timer(&dmxdevfilter->timer);
353         }
354 }
355
356 static int dvb_dmxdev_section_callback(const u8 *buffer1, size_t buffer1_len,
357                                        const u8 *buffer2, size_t buffer2_len,
358                                        struct dmx_section_filter *filter,
359                                        enum dmx_success success)
360 {
361         struct dmxdev_filter *dmxdevfilter = filter->priv;
362         int ret;
363
364         if (dmxdevfilter->buffer.error) {
365                 wake_up(&dmxdevfilter->buffer.queue);
366                 return 0;
367         }
368         spin_lock(&dmxdevfilter->dev->lock);
369         if (dmxdevfilter->state != DMXDEV_STATE_GO) {
370                 spin_unlock(&dmxdevfilter->dev->lock);
371                 return 0;
372         }
373         del_timer(&dmxdevfilter->timer);
374         dprintk("dmxdev: section callback %02x %02x %02x %02x %02x %02x\n",
375                 buffer1[0], buffer1[1],
376                 buffer1[2], buffer1[3], buffer1[4], buffer1[5]);
377         ret = dvb_dmxdev_buffer_write(&dmxdevfilter->buffer, buffer1,
378                                       buffer1_len);
379         if (ret == buffer1_len) {
380                 ret = dvb_dmxdev_buffer_write(&dmxdevfilter->buffer, buffer2,
381                                               buffer2_len);
382         }
383         if (ret < 0) {
384                 dvb_ringbuffer_flush(&dmxdevfilter->buffer);
385                 dmxdevfilter->buffer.error = ret;
386         }
387         if (dmxdevfilter->params.sec.flags & DMX_ONESHOT)
388                 dmxdevfilter->state = DMXDEV_STATE_DONE;
389         spin_unlock(&dmxdevfilter->dev->lock);
390         wake_up(&dmxdevfilter->buffer.queue);
391         return 0;
392 }
393
394 static int dvb_dmxdev_ts_callback(const u8 *buffer1, size_t buffer1_len,
395                                   const u8 *buffer2, size_t buffer2_len,
396                                   struct dmx_ts_feed *feed,
397                                   enum dmx_success success)
398 {
399         struct dmxdev_filter *dmxdevfilter = feed->priv;
400         struct dvb_ringbuffer *buffer;
401         int ret;
402
403         spin_lock(&dmxdevfilter->dev->lock);
404         if (dmxdevfilter->params.pes.output == DMX_OUT_DECODER) {
405                 spin_unlock(&dmxdevfilter->dev->lock);
406                 return 0;
407         }
408
409         if (dmxdevfilter->params.pes.output == DMX_OUT_TAP
410             || dmxdevfilter->params.pes.output == DMX_OUT_TSDEMUX_TAP)
411                 buffer = &dmxdevfilter->buffer;
412         else
413                 buffer = &dmxdevfilter->dev->dvr_buffer;
414         if (buffer->error) {
415                 spin_unlock(&dmxdevfilter->dev->lock);
416                 wake_up(&buffer->queue);
417                 return 0;
418         }
419         ret = dvb_dmxdev_buffer_write(buffer, buffer1, buffer1_len);
420         if (ret == buffer1_len)
421                 ret = dvb_dmxdev_buffer_write(buffer, buffer2, buffer2_len);
422         if (ret < 0) {
423                 dvb_ringbuffer_flush(buffer);
424                 buffer->error = ret;
425         }
426         spin_unlock(&dmxdevfilter->dev->lock);
427         wake_up(&buffer->queue);
428         return 0;
429 }
430
431 /* stop feed but only mark the specified filter as stopped (state set) */
432 static int dvb_dmxdev_feed_stop(struct dmxdev_filter *dmxdevfilter)
433 {
434         struct dmxdev_feed *feed;
435
436         dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_SET);
437
438         switch (dmxdevfilter->type) {
439         case DMXDEV_TYPE_SEC:
440                 del_timer(&dmxdevfilter->timer);
441                 dmxdevfilter->feed.sec->stop_filtering(dmxdevfilter->feed.sec);
442                 break;
443         case DMXDEV_TYPE_PES:
444                 list_for_each_entry(feed, &dmxdevfilter->feed.ts, next)
445                         feed->ts->stop_filtering(feed->ts);
446                 break;
447         default:
448                 return -EINVAL;
449         }
450         return 0;
451 }
452
453 /* start feed associated with the specified filter */
454 static int dvb_dmxdev_feed_start(struct dmxdev_filter *filter)
455 {
456         struct dmxdev_feed *feed;
457         int ret;
458
459         dvb_dmxdev_filter_state_set(filter, DMXDEV_STATE_GO);
460
461         switch (filter->type) {
462         case DMXDEV_TYPE_SEC:
463                 return filter->feed.sec->start_filtering(filter->feed.sec);
464         case DMXDEV_TYPE_PES:
465                 list_for_each_entry(feed, &filter->feed.ts, next) {
466                         ret = feed->ts->start_filtering(feed->ts);
467                         if (ret < 0) {
468                                 dvb_dmxdev_feed_stop(filter);
469                                 return ret;
470                         }
471                 }
472                 break;
473         default:
474                 return -EINVAL;
475         }
476
477         return 0;
478 }
479
480 /* restart section feed if it has filters left associated with it,
481    otherwise release the feed */
482 static int dvb_dmxdev_feed_restart(struct dmxdev_filter *filter)
483 {
484         int i;
485         struct dmxdev *dmxdev = filter->dev;
486         u16 pid = filter->params.sec.pid;
487
488         for (i = 0; i < dmxdev->filternum; i++)
489                 if (dmxdev->filter[i].state >= DMXDEV_STATE_GO &&
490                     dmxdev->filter[i].type == DMXDEV_TYPE_SEC &&
491                     dmxdev->filter[i].params.sec.pid == pid) {
492                         dvb_dmxdev_feed_start(&dmxdev->filter[i]);
493                         return 0;
494                 }
495
496         filter->dev->demux->release_section_feed(dmxdev->demux,
497                                                  filter->feed.sec);
498
499         return 0;
500 }
501
502 static int dvb_dmxdev_filter_stop(struct dmxdev_filter *dmxdevfilter)
503 {
504         struct dmxdev_feed *feed;
505         struct dmx_demux *demux;
506
507         if (dmxdevfilter->state < DMXDEV_STATE_GO)
508                 return 0;
509
510         switch (dmxdevfilter->type) {
511         case DMXDEV_TYPE_SEC:
512                 if (!dmxdevfilter->feed.sec)
513                         break;
514                 dvb_dmxdev_feed_stop(dmxdevfilter);
515                 if (dmxdevfilter->filter.sec)
516                         dmxdevfilter->feed.sec->
517                             release_filter(dmxdevfilter->feed.sec,
518                                            dmxdevfilter->filter.sec);
519                 dvb_dmxdev_feed_restart(dmxdevfilter);
520                 dmxdevfilter->feed.sec = NULL;
521                 break;
522         case DMXDEV_TYPE_PES:
523                 dvb_dmxdev_feed_stop(dmxdevfilter);
524                 demux = dmxdevfilter->dev->demux;
525                 list_for_each_entry(feed, &dmxdevfilter->feed.ts, next) {
526                         demux->release_ts_feed(demux, feed->ts);
527                         feed->ts = NULL;
528                 }
529                 break;
530         default:
531                 if (dmxdevfilter->state == DMXDEV_STATE_ALLOCATED)
532                         return 0;
533                 return -EINVAL;
534         }
535
536         dvb_ringbuffer_flush(&dmxdevfilter->buffer);
537         return 0;
538 }
539
540 static void dvb_dmxdev_delete_pids(struct dmxdev_filter *dmxdevfilter)
541 {
542         struct dmxdev_feed *feed, *tmp;
543
544         /* delete all PIDs */
545         list_for_each_entry_safe(feed, tmp, &dmxdevfilter->feed.ts, next) {
546                 list_del(&feed->next);
547                 kfree(feed);
548         }
549
550         BUG_ON(!list_empty(&dmxdevfilter->feed.ts));
551 }
552
553 static inline int dvb_dmxdev_filter_reset(struct dmxdev_filter *dmxdevfilter)
554 {
555         if (dmxdevfilter->state < DMXDEV_STATE_SET)
556                 return 0;
557
558         if (dmxdevfilter->type == DMXDEV_TYPE_PES)
559                 dvb_dmxdev_delete_pids(dmxdevfilter);
560
561         dmxdevfilter->type = DMXDEV_TYPE_NONE;
562         dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_ALLOCATED);
563         return 0;
564 }
565
566 static int dvb_dmxdev_start_feed(struct dmxdev *dmxdev,
567                                  struct dmxdev_filter *filter,
568                                  struct dmxdev_feed *feed)
569 {
570         struct timespec timeout = { 0 };
571         struct dmx_pes_filter_params *para = &filter->params.pes;
572         dmx_output_t otype;
573         int ret;
574         int ts_type;
575         enum dmx_ts_pes ts_pes;
576         struct dmx_ts_feed *tsfeed;
577
578         feed->ts = NULL;
579         otype = para->output;
580
581         ts_pes = (enum dmx_ts_pes)para->pes_type;
582
583         if (ts_pes < DMX_PES_OTHER)
584                 ts_type = TS_DECODER;
585         else
586                 ts_type = 0;
587
588         if (otype == DMX_OUT_TS_TAP)
589                 ts_type |= TS_PACKET;
590         else if (otype == DMX_OUT_TSDEMUX_TAP)
591                 ts_type |= TS_PACKET | TS_DEMUX;
592         else if (otype == DMX_OUT_TAP)
593                 ts_type |= TS_PACKET | TS_DEMUX | TS_PAYLOAD_ONLY;
594
595         ret = dmxdev->demux->allocate_ts_feed(dmxdev->demux, &feed->ts,
596                                               dvb_dmxdev_ts_callback);
597         if (ret < 0)
598                 return ret;
599
600         tsfeed = feed->ts;
601         tsfeed->priv = filter;
602
603         ret = tsfeed->set(tsfeed, feed->pid, ts_type, ts_pes, 32768, timeout);
604         if (ret < 0) {
605                 dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed);
606                 return ret;
607         }
608
609         ret = tsfeed->start_filtering(tsfeed);
610         if (ret < 0) {
611                 dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed);
612                 return ret;
613         }
614
615         return 0;
616 }
617
618 static int dvb_dmxdev_filter_start(struct dmxdev_filter *filter)
619 {
620         struct dmxdev *dmxdev = filter->dev;
621         struct dmxdev_feed *feed;
622         void *mem;
623         int ret, i;
624
625         if (filter->state < DMXDEV_STATE_SET)
626                 return -EINVAL;
627
628         if (filter->state >= DMXDEV_STATE_GO)
629                 dvb_dmxdev_filter_stop(filter);
630
631         if (!filter->buffer.data) {
632                 mem = vmalloc(filter->buffer.size);
633                 if (!mem)
634                         return -ENOMEM;
635                 spin_lock_irq(&filter->dev->lock);
636                 filter->buffer.data = mem;
637                 spin_unlock_irq(&filter->dev->lock);
638         }
639
640         dvb_ringbuffer_flush(&filter->buffer);
641
642         switch (filter->type) {
643         case DMXDEV_TYPE_SEC:
644         {
645                 struct dmx_sct_filter_params *para = &filter->params.sec;
646                 struct dmx_section_filter **secfilter = &filter->filter.sec;
647                 struct dmx_section_feed **secfeed = &filter->feed.sec;
648
649                 *secfilter = NULL;
650                 *secfeed = NULL;
651
652
653                 /* find active filter/feed with same PID */
654                 for (i = 0; i < dmxdev->filternum; i++) {
655                         if (dmxdev->filter[i].state >= DMXDEV_STATE_GO &&
656                             dmxdev->filter[i].type == DMXDEV_TYPE_SEC &&
657                             dmxdev->filter[i].params.sec.pid == para->pid) {
658                                 *secfeed = dmxdev->filter[i].feed.sec;
659                                 break;
660                         }
661                 }
662
663                 /* if no feed found, try to allocate new one */
664                 if (!*secfeed) {
665                         ret = dmxdev->demux->allocate_section_feed(dmxdev->demux,
666                                                                    secfeed,
667                                                                    dvb_dmxdev_section_callback);
668                         if (ret < 0) {
669                                 printk("DVB (%s): could not alloc feed\n",
670                                        __func__);
671                                 return ret;
672                         }
673
674                         ret = (*secfeed)->set(*secfeed, para->pid, 32768,
675                                               (para->flags & DMX_CHECK_CRC) ? 1 : 0);
676                         if (ret < 0) {
677                                 printk("DVB (%s): could not set feed\n",
678                                        __func__);
679                                 dvb_dmxdev_feed_restart(filter);
680                                 return ret;
681                         }
682                 } else {
683                         dvb_dmxdev_feed_stop(filter);
684                 }
685
686                 ret = (*secfeed)->allocate_filter(*secfeed, secfilter);
687                 if (ret < 0) {
688                         dvb_dmxdev_feed_restart(filter);
689                         filter->feed.sec->start_filtering(*secfeed);
690                         dprintk("could not get filter\n");
691                         return ret;
692                 }
693
694                 (*secfilter)->priv = filter;
695
696                 memcpy(&((*secfilter)->filter_value[3]),
697                        &(para->filter.filter[1]), DMX_FILTER_SIZE - 1);
698                 memcpy(&(*secfilter)->filter_mask[3],
699                        &para->filter.mask[1], DMX_FILTER_SIZE - 1);
700                 memcpy(&(*secfilter)->filter_mode[3],
701                        &para->filter.mode[1], DMX_FILTER_SIZE - 1);
702
703                 (*secfilter)->filter_value[0] = para->filter.filter[0];
704                 (*secfilter)->filter_mask[0] = para->filter.mask[0];
705                 (*secfilter)->filter_mode[0] = para->filter.mode[0];
706                 (*secfilter)->filter_mask[1] = 0;
707                 (*secfilter)->filter_mask[2] = 0;
708
709                 filter->todo = 0;
710
711                 ret = filter->feed.sec->start_filtering(filter->feed.sec);
712                 if (ret < 0)
713                         return ret;
714
715                 dvb_dmxdev_filter_timer(filter);
716                 break;
717         }
718         case DMXDEV_TYPE_PES:
719                 list_for_each_entry(feed, &filter->feed.ts, next) {
720                         ret = dvb_dmxdev_start_feed(dmxdev, filter, feed);
721                         if (ret < 0) {
722                                 dvb_dmxdev_filter_stop(filter);
723                                 return ret;
724                         }
725                 }
726                 break;
727         default:
728                 return -EINVAL;
729         }
730
731         dvb_dmxdev_filter_state_set(filter, DMXDEV_STATE_GO);
732         return 0;
733 }
734
735 static int dvb_demux_open(struct inode *inode, struct file *file)
736 {
737         struct dvb_device *dvbdev = file->private_data;
738         struct dmxdev *dmxdev = dvbdev->priv;
739         int i;
740         struct dmxdev_filter *dmxdevfilter;
741
742         if (!dmxdev->filter)
743                 return -EINVAL;
744
745         if (mutex_lock_interruptible(&dmxdev->mutex))
746                 return -ERESTARTSYS;
747
748         for (i = 0; i < dmxdev->filternum; i++)
749                 if (dmxdev->filter[i].state == DMXDEV_STATE_FREE)
750                         break;
751
752         if (i == dmxdev->filternum) {
753                 mutex_unlock(&dmxdev->mutex);
754                 return -EMFILE;
755         }
756
757         dmxdevfilter = &dmxdev->filter[i];
758         mutex_init(&dmxdevfilter->mutex);
759         file->private_data = dmxdevfilter;
760
761         dvb_ringbuffer_init(&dmxdevfilter->buffer, NULL, 8192);
762         dmxdevfilter->type = DMXDEV_TYPE_NONE;
763         dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_ALLOCATED);
764         INIT_LIST_HEAD(&dmxdevfilter->feed.ts);
765         init_timer(&dmxdevfilter->timer);
766
767         dvbdev->users++;
768
769         mutex_unlock(&dmxdev->mutex);
770         return 0;
771 }
772
773 static int dvb_dmxdev_filter_free(struct dmxdev *dmxdev,
774                                   struct dmxdev_filter *dmxdevfilter)
775 {
776         mutex_lock(&dmxdev->mutex);
777         mutex_lock(&dmxdevfilter->mutex);
778
779         dvb_dmxdev_filter_stop(dmxdevfilter);
780         dvb_dmxdev_filter_reset(dmxdevfilter);
781
782         if (dmxdevfilter->buffer.data) {
783                 void *mem = dmxdevfilter->buffer.data;
784
785                 spin_lock_irq(&dmxdev->lock);
786                 dmxdevfilter->buffer.data = NULL;
787                 spin_unlock_irq(&dmxdev->lock);
788                 vfree(mem);
789         }
790
791         dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_FREE);
792         wake_up(&dmxdevfilter->buffer.queue);
793         mutex_unlock(&dmxdevfilter->mutex);
794         mutex_unlock(&dmxdev->mutex);
795         return 0;
796 }
797
798 static inline void invert_mode(dmx_filter_t *filter)
799 {
800         int i;
801
802         for (i = 0; i < DMX_FILTER_SIZE; i++)
803                 filter->mode[i] ^= 0xff;
804 }
805
806 static int dvb_dmxdev_add_pid(struct dmxdev *dmxdev,
807                               struct dmxdev_filter *filter, u16 pid)
808 {
809         struct dmxdev_feed *feed;
810
811         if ((filter->type != DMXDEV_TYPE_PES) ||
812             (filter->state < DMXDEV_STATE_SET))
813                 return -EINVAL;
814
815         /* only TS packet filters may have multiple PIDs */
816         if ((filter->params.pes.output != DMX_OUT_TSDEMUX_TAP) &&
817             (!list_empty(&filter->feed.ts)))
818                 return -EINVAL;
819
820         feed = kzalloc(sizeof(struct dmxdev_feed), GFP_KERNEL);
821         if (feed == NULL)
822                 return -ENOMEM;
823
824         feed->pid = pid;
825         list_add(&feed->next, &filter->feed.ts);
826
827         if (filter->state >= DMXDEV_STATE_GO)
828                 return dvb_dmxdev_start_feed(dmxdev, filter, feed);
829
830         return 0;
831 }
832
833 static int dvb_dmxdev_remove_pid(struct dmxdev *dmxdev,
834                                   struct dmxdev_filter *filter, u16 pid)
835 {
836         struct dmxdev_feed *feed, *tmp;
837
838         if ((filter->type != DMXDEV_TYPE_PES) ||
839             (filter->state < DMXDEV_STATE_SET))
840                 return -EINVAL;
841
842         list_for_each_entry_safe(feed, tmp, &filter->feed.ts, next) {
843                 if ((feed->pid == pid) && (feed->ts != NULL)) {
844                         feed->ts->stop_filtering(feed->ts);
845                         filter->dev->demux->release_ts_feed(filter->dev->demux,
846                                                             feed->ts);
847                         list_del(&feed->next);
848                         kfree(feed);
849                 }
850         }
851
852         return 0;
853 }
854
855 static int dvb_dmxdev_filter_set(struct dmxdev *dmxdev,
856                                  struct dmxdev_filter *dmxdevfilter,
857                                  struct dmx_sct_filter_params *params)
858 {
859         dprintk("function : %s\n", __func__);
860
861         dvb_dmxdev_filter_stop(dmxdevfilter);
862
863         dmxdevfilter->type = DMXDEV_TYPE_SEC;
864         memcpy(&dmxdevfilter->params.sec,
865                params, sizeof(struct dmx_sct_filter_params));
866         invert_mode(&dmxdevfilter->params.sec.filter);
867         dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_SET);
868
869         if (params->flags & DMX_IMMEDIATE_START)
870                 return dvb_dmxdev_filter_start(dmxdevfilter);
871
872         return 0;
873 }
874
875 static int dvb_dmxdev_pes_filter_set(struct dmxdev *dmxdev,
876                                      struct dmxdev_filter *dmxdevfilter,
877                                      struct dmx_pes_filter_params *params)
878 {
879         int ret;
880
881         dvb_dmxdev_filter_stop(dmxdevfilter);
882         dvb_dmxdev_filter_reset(dmxdevfilter);
883
884         if (params->pes_type > DMX_PES_OTHER || params->pes_type < 0)
885                 return -EINVAL;
886
887         dmxdevfilter->type = DMXDEV_TYPE_PES;
888         memcpy(&dmxdevfilter->params, params,
889                sizeof(struct dmx_pes_filter_params));
890
891         dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_SET);
892
893         ret = dvb_dmxdev_add_pid(dmxdev, dmxdevfilter,
894                                  dmxdevfilter->params.pes.pid);
895         if (ret < 0)
896                 return ret;
897
898         if (params->flags & DMX_IMMEDIATE_START)
899                 return dvb_dmxdev_filter_start(dmxdevfilter);
900
901         return 0;
902 }
903
904 static ssize_t dvb_dmxdev_read_sec(struct dmxdev_filter *dfil,
905                                    struct file *file, char __user *buf,
906                                    size_t count, loff_t *ppos)
907 {
908         int result, hcount;
909         int done = 0;
910
911         if (dfil->todo <= 0) {
912                 hcount = 3 + dfil->todo;
913                 if (hcount > count)
914                         hcount = count;
915                 result = dvb_dmxdev_buffer_read(&dfil->buffer,
916                                                 file->f_flags & O_NONBLOCK,
917                                                 buf, hcount, ppos);
918                 if (result < 0) {
919                         dfil->todo = 0;
920                         return result;
921                 }
922                 if (copy_from_user(dfil->secheader - dfil->todo, buf, result))
923                         return -EFAULT;
924                 buf += result;
925                 done = result;
926                 count -= result;
927                 dfil->todo -= result;
928                 if (dfil->todo > -3)
929                         return done;
930                 dfil->todo = ((dfil->secheader[1] << 8) | dfil->secheader[2]) & 0xfff;
931                 if (!count)
932                         return done;
933         }
934         if (count > dfil->todo)
935                 count = dfil->todo;
936         result = dvb_dmxdev_buffer_read(&dfil->buffer,
937                                         file->f_flags & O_NONBLOCK,
938                                         buf, count, ppos);
939         if (result < 0)
940                 return result;
941         dfil->todo -= result;
942         return (result + done);
943 }
944
945 static ssize_t
946 dvb_demux_read(struct file *file, char __user *buf, size_t count,
947                loff_t *ppos)
948 {
949         struct dmxdev_filter *dmxdevfilter = file->private_data;
950         int ret;
951
952         if (mutex_lock_interruptible(&dmxdevfilter->mutex))
953                 return -ERESTARTSYS;
954
955         if (dmxdevfilter->type == DMXDEV_TYPE_SEC)
956                 ret = dvb_dmxdev_read_sec(dmxdevfilter, file, buf, count, ppos);
957         else
958                 ret = dvb_dmxdev_buffer_read(&dmxdevfilter->buffer,
959                                              file->f_flags & O_NONBLOCK,
960                                              buf, count, ppos);
961
962         mutex_unlock(&dmxdevfilter->mutex);
963         return ret;
964 }
965
966 static int dvb_demux_do_ioctl(struct inode *inode, struct file *file,
967                               unsigned int cmd, void *parg)
968 {
969         struct dmxdev_filter *dmxdevfilter = file->private_data;
970         struct dmxdev *dmxdev = dmxdevfilter->dev;
971         unsigned long arg = (unsigned long)parg;
972         int ret = 0;
973
974         if (mutex_lock_interruptible(&dmxdev->mutex))
975                 return -ERESTARTSYS;
976
977         switch (cmd) {
978         case DMX_START:
979                 if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
980                         mutex_unlock(&dmxdev->mutex);
981                         return -ERESTARTSYS;
982                 }
983                 if (dmxdevfilter->state < DMXDEV_STATE_SET)
984                         ret = -EINVAL;
985                 else
986                         ret = dvb_dmxdev_filter_start(dmxdevfilter);
987                 mutex_unlock(&dmxdevfilter->mutex);
988                 break;
989
990         case DMX_STOP:
991                 if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
992                         mutex_unlock(&dmxdev->mutex);
993                         return -ERESTARTSYS;
994                 }
995                 ret = dvb_dmxdev_filter_stop(dmxdevfilter);
996                 mutex_unlock(&dmxdevfilter->mutex);
997                 break;
998
999         case DMX_SET_FILTER:
1000                 if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
1001                         mutex_unlock(&dmxdev->mutex);
1002                         return -ERESTARTSYS;
1003                 }
1004                 ret = dvb_dmxdev_filter_set(dmxdev, dmxdevfilter, parg);
1005                 mutex_unlock(&dmxdevfilter->mutex);
1006                 break;
1007
1008         case DMX_SET_PES_FILTER:
1009                 if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
1010                         mutex_unlock(&dmxdev->mutex);
1011                         return -ERESTARTSYS;
1012                 }
1013                 ret = dvb_dmxdev_pes_filter_set(dmxdev, dmxdevfilter, parg);
1014                 mutex_unlock(&dmxdevfilter->mutex);
1015                 break;
1016
1017         case DMX_SET_BUFFER_SIZE:
1018                 if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
1019                         mutex_unlock(&dmxdev->mutex);
1020                         return -ERESTARTSYS;
1021                 }
1022                 ret = dvb_dmxdev_set_buffer_size(dmxdevfilter, arg);
1023                 mutex_unlock(&dmxdevfilter->mutex);
1024                 break;
1025
1026         case DMX_GET_PES_PIDS:
1027                 if (!dmxdev->demux->get_pes_pids) {
1028                         ret = -EINVAL;
1029                         break;
1030                 }
1031                 dmxdev->demux->get_pes_pids(dmxdev->demux, parg);
1032                 break;
1033
1034         case DMX_GET_CAPS:
1035                 if (!dmxdev->demux->get_caps) {
1036                         ret = -EINVAL;
1037                         break;
1038                 }
1039                 ret = dmxdev->demux->get_caps(dmxdev->demux, parg);
1040                 break;
1041
1042         case DMX_SET_SOURCE:
1043                 if (!dmxdev->demux->set_source) {
1044                         ret = -EINVAL;
1045                         break;
1046                 }
1047                 ret = dmxdev->demux->set_source(dmxdev->demux, parg);
1048                 break;
1049
1050         case DMX_GET_STC:
1051                 if (!dmxdev->demux->get_stc) {
1052                         ret = -EINVAL;
1053                         break;
1054                 }
1055                 ret = dmxdev->demux->get_stc(dmxdev->demux,
1056                                              ((struct dmx_stc *)parg)->num,
1057                                              &((struct dmx_stc *)parg)->stc,
1058                                              &((struct dmx_stc *)parg)->base);
1059                 break;
1060
1061         case DMX_ADD_PID:
1062                 if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
1063                         ret = -ERESTARTSYS;
1064                         break;
1065                 }
1066                 ret = dvb_dmxdev_add_pid(dmxdev, dmxdevfilter, *(u16 *)parg);
1067                 mutex_unlock(&dmxdevfilter->mutex);
1068                 break;
1069
1070         case DMX_REMOVE_PID:
1071                 if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
1072                         ret = -ERESTARTSYS;
1073                         break;
1074                 }
1075                 ret = dvb_dmxdev_remove_pid(dmxdev, dmxdevfilter, *(u16 *)parg);
1076                 mutex_unlock(&dmxdevfilter->mutex);
1077                 break;
1078
1079         default:
1080                 ret = -EINVAL;
1081                 break;
1082         }
1083         mutex_unlock(&dmxdev->mutex);
1084         return ret;
1085 }
1086
1087 static int dvb_demux_ioctl(struct inode *inode, struct file *file,
1088                            unsigned int cmd, unsigned long arg)
1089 {
1090         return dvb_usercopy(inode, file, cmd, arg, dvb_demux_do_ioctl);
1091 }
1092
1093 static unsigned int dvb_demux_poll(struct file *file, poll_table *wait)
1094 {
1095         struct dmxdev_filter *dmxdevfilter = file->private_data;
1096         unsigned int mask = 0;
1097
1098         if (!dmxdevfilter)
1099                 return -EINVAL;
1100
1101         poll_wait(file, &dmxdevfilter->buffer.queue, wait);
1102
1103         if (dmxdevfilter->state != DMXDEV_STATE_GO &&
1104             dmxdevfilter->state != DMXDEV_STATE_DONE &&
1105             dmxdevfilter->state != DMXDEV_STATE_TIMEDOUT)
1106                 return 0;
1107
1108         if (dmxdevfilter->buffer.error)
1109                 mask |= (POLLIN | POLLRDNORM | POLLPRI | POLLERR);
1110
1111         if (!dvb_ringbuffer_empty(&dmxdevfilter->buffer))
1112                 mask |= (POLLIN | POLLRDNORM | POLLPRI);
1113
1114         return mask;
1115 }
1116
1117 static int dvb_demux_release(struct inode *inode, struct file *file)
1118 {
1119         struct dmxdev_filter *dmxdevfilter = file->private_data;
1120         struct dmxdev *dmxdev = dmxdevfilter->dev;
1121
1122         int ret;
1123
1124         ret = dvb_dmxdev_filter_free(dmxdev, dmxdevfilter);
1125
1126         mutex_lock(&dmxdev->mutex);
1127         dmxdev->dvbdev->users--;
1128         if(dmxdev->dvbdev->users==1 && dmxdev->exit==1) {
1129                 fops_put(file->f_op);
1130                 file->f_op = NULL;
1131                 mutex_unlock(&dmxdev->mutex);
1132                 wake_up(&dmxdev->dvbdev->wait_queue);
1133         } else
1134                 mutex_unlock(&dmxdev->mutex);
1135
1136         return ret;
1137 }
1138
1139 static const struct file_operations dvb_demux_fops = {
1140         .owner = THIS_MODULE,
1141         .read = dvb_demux_read,
1142         .ioctl = dvb_demux_ioctl,
1143         .open = dvb_demux_open,
1144         .release = dvb_demux_release,
1145         .poll = dvb_demux_poll,
1146 };
1147
1148 static struct dvb_device dvbdev_demux = {
1149         .priv = NULL,
1150         .users = 1,
1151         .writers = 1,
1152         .fops = &dvb_demux_fops
1153 };
1154
1155 static int dvb_dvr_do_ioctl(struct inode *inode, struct file *file,
1156                             unsigned int cmd, void *parg)
1157 {
1158         struct dvb_device *dvbdev = file->private_data;
1159         struct dmxdev *dmxdev = dvbdev->priv;
1160         unsigned long arg = (unsigned long)parg;
1161         int ret;
1162
1163         if (mutex_lock_interruptible(&dmxdev->mutex))
1164                 return -ERESTARTSYS;
1165
1166         switch (cmd) {
1167         case DMX_SET_BUFFER_SIZE:
1168                 ret = dvb_dvr_set_buffer_size(dmxdev, arg);
1169                 break;
1170
1171         default:
1172                 ret = -EINVAL;
1173                 break;
1174         }
1175         mutex_unlock(&dmxdev->mutex);
1176         return ret;
1177 }
1178
1179 static int dvb_dvr_ioctl(struct inode *inode, struct file *file,
1180                          unsigned int cmd, unsigned long arg)
1181 {
1182         return dvb_usercopy(inode, file, cmd, arg, dvb_dvr_do_ioctl);
1183 }
1184
1185 static unsigned int dvb_dvr_poll(struct file *file, poll_table *wait)
1186 {
1187         struct dvb_device *dvbdev = file->private_data;
1188         struct dmxdev *dmxdev = dvbdev->priv;
1189         unsigned int mask = 0;
1190
1191         dprintk("function : %s\n", __func__);
1192
1193         poll_wait(file, &dmxdev->dvr_buffer.queue, wait);
1194
1195         if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
1196                 if (dmxdev->dvr_buffer.error)
1197                         mask |= (POLLIN | POLLRDNORM | POLLPRI | POLLERR);
1198
1199                 if (!dvb_ringbuffer_empty(&dmxdev->dvr_buffer))
1200                         mask |= (POLLIN | POLLRDNORM | POLLPRI);
1201         } else
1202                 mask |= (POLLOUT | POLLWRNORM | POLLPRI);
1203
1204         return mask;
1205 }
1206
1207 static const struct file_operations dvb_dvr_fops = {
1208         .owner = THIS_MODULE,
1209         .read = dvb_dvr_read,
1210         .write = dvb_dvr_write,
1211         .ioctl = dvb_dvr_ioctl,
1212         .open = dvb_dvr_open,
1213         .release = dvb_dvr_release,
1214         .poll = dvb_dvr_poll,
1215 };
1216
1217 static struct dvb_device dvbdev_dvr = {
1218         .priv = NULL,
1219         .readers = 1,
1220         .users = 1,
1221         .fops = &dvb_dvr_fops
1222 };
1223
1224 int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter)
1225 {
1226         int i;
1227
1228         if (dmxdev->demux->open(dmxdev->demux) < 0)
1229                 return -EUSERS;
1230
1231         dmxdev->filter = vmalloc(dmxdev->filternum * sizeof(struct dmxdev_filter));
1232         if (!dmxdev->filter)
1233                 return -ENOMEM;
1234
1235         mutex_init(&dmxdev->mutex);
1236         spin_lock_init(&dmxdev->lock);
1237         for (i = 0; i < dmxdev->filternum; i++) {
1238                 dmxdev->filter[i].dev = dmxdev;
1239                 dmxdev->filter[i].buffer.data = NULL;
1240                 dvb_dmxdev_filter_state_set(&dmxdev->filter[i],
1241                                             DMXDEV_STATE_FREE);
1242         }
1243
1244         dvb_register_device(dvb_adapter, &dmxdev->dvbdev, &dvbdev_demux, dmxdev,
1245                             DVB_DEVICE_DEMUX);
1246         dvb_register_device(dvb_adapter, &dmxdev->dvr_dvbdev, &dvbdev_dvr,
1247                             dmxdev, DVB_DEVICE_DVR);
1248
1249         dvb_ringbuffer_init(&dmxdev->dvr_buffer, NULL, 8192);
1250
1251         return 0;
1252 }
1253
1254 EXPORT_SYMBOL(dvb_dmxdev_init);
1255
1256 void dvb_dmxdev_release(struct dmxdev *dmxdev)
1257 {
1258         dmxdev->exit=1;
1259         if (dmxdev->dvbdev->users > 1) {
1260                 wait_event(dmxdev->dvbdev->wait_queue,
1261                                 dmxdev->dvbdev->users==1);
1262         }
1263         if (dmxdev->dvr_dvbdev->users > 1) {
1264                 wait_event(dmxdev->dvr_dvbdev->wait_queue,
1265                                 dmxdev->dvr_dvbdev->users==1);
1266         }
1267
1268         dvb_unregister_device(dmxdev->dvbdev);
1269         dvb_unregister_device(dmxdev->dvr_dvbdev);
1270
1271         vfree(dmxdev->filter);
1272         dmxdev->filter = NULL;
1273         dmxdev->demux->close(dmxdev->demux);
1274 }
1275
1276 EXPORT_SYMBOL(dvb_dmxdev_release);