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
35static int debug;
36
37module_param(debug, int, 0644);
38MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off).");
39
40#define dprintk	if (debug) printk
41
42static 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
61static 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
110static 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
124static 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
184static 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
220static 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
243static 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
257static 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
290static 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
298static 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
331static 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
342static 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
356static 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
394static 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) */
432static 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 */
454static 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 */
482static 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
502static 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
540static 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
553static 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
566static 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	dmx_pes_type_t ts_pes;
576	struct dmx_ts_feed *tsfeed;
577
578	feed->ts = NULL;
579	otype = para->output;
580
581	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
618static 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
735static 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_timer(&dmxdevfilter->timer);
765
766	dvbdev->users++;
767
768	mutex_unlock(&dmxdev->mutex);
769	return 0;
770}
771
772static int dvb_dmxdev_filter_free(struct dmxdev *dmxdev,
773				  struct dmxdev_filter *dmxdevfilter)
774{
775	mutex_lock(&dmxdev->mutex);
776	mutex_lock(&dmxdevfilter->mutex);
777
778	dvb_dmxdev_filter_stop(dmxdevfilter);
779	dvb_dmxdev_filter_reset(dmxdevfilter);
780
781	if (dmxdevfilter->buffer.data) {
782		void *mem = dmxdevfilter->buffer.data;
783
784		spin_lock_irq(&dmxdev->lock);
785		dmxdevfilter->buffer.data = NULL;
786		spin_unlock_irq(&dmxdev->lock);
787		vfree(mem);
788	}
789
790	dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_FREE);
791	wake_up(&dmxdevfilter->buffer.queue);
792	mutex_unlock(&dmxdevfilter->mutex);
793	mutex_unlock(&dmxdev->mutex);
794	return 0;
795}
796
797static inline void invert_mode(dmx_filter_t *filter)
798{
799	int i;
800
801	for (i = 0; i < DMX_FILTER_SIZE; i++)
802		filter->mode[i] ^= 0xff;
803}
804
805static int dvb_dmxdev_add_pid(struct dmxdev *dmxdev,
806			      struct dmxdev_filter *filter, u16 pid)
807{
808	struct dmxdev_feed *feed;
809
810	if ((filter->type != DMXDEV_TYPE_PES) ||
811	    (filter->state < DMXDEV_STATE_SET))
812		return -EINVAL;
813
814	/* only TS packet filters may have multiple PIDs */
815	if ((filter->params.pes.output != DMX_OUT_TSDEMUX_TAP) &&
816	    (!list_empty(&filter->feed.ts)))
817		return -EINVAL;
818
819	feed = kzalloc(sizeof(struct dmxdev_feed), GFP_KERNEL);
820	if (feed == NULL)
821		return -ENOMEM;
822
823	feed->pid = pid;
824	list_add(&feed->next, &filter->feed.ts);
825
826	if (filter->state >= DMXDEV_STATE_GO)
827		return dvb_dmxdev_start_feed(dmxdev, filter, feed);
828
829	return 0;
830}
831
832static int dvb_dmxdev_remove_pid(struct dmxdev *dmxdev,
833				  struct dmxdev_filter *filter, u16 pid)
834{
835	struct dmxdev_feed *feed, *tmp;
836
837	if ((filter->type != DMXDEV_TYPE_PES) ||
838	    (filter->state < DMXDEV_STATE_SET))
839		return -EINVAL;
840
841	list_for_each_entry_safe(feed, tmp, &filter->feed.ts, next) {
842		if ((feed->pid == pid) && (feed->ts != NULL)) {
843			feed->ts->stop_filtering(feed->ts);
844			filter->dev->demux->release_ts_feed(filter->dev->demux,
845							    feed->ts);
846			list_del(&feed->next);
847			kfree(feed);
848		}
849	}
850
851	return 0;
852}
853
854static int dvb_dmxdev_filter_set(struct dmxdev *dmxdev,
855				 struct dmxdev_filter *dmxdevfilter,
856				 struct dmx_sct_filter_params *params)
857{
858	dprintk("function : %s\n", __func__);
859
860	dvb_dmxdev_filter_stop(dmxdevfilter);
861
862	dmxdevfilter->type = DMXDEV_TYPE_SEC;
863	memcpy(&dmxdevfilter->params.sec,
864	       params, sizeof(struct dmx_sct_filter_params));
865	invert_mode(&dmxdevfilter->params.sec.filter);
866	dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_SET);
867
868	if (params->flags & DMX_IMMEDIATE_START)
869		return dvb_dmxdev_filter_start(dmxdevfilter);
870
871	return 0;
872}
873
874static int dvb_dmxdev_pes_filter_set(struct dmxdev *dmxdev,
875				     struct dmxdev_filter *dmxdevfilter,
876				     struct dmx_pes_filter_params *params)
877{
878	int ret;
879
880	dvb_dmxdev_filter_stop(dmxdevfilter);
881	dvb_dmxdev_filter_reset(dmxdevfilter);
882
883	if (params->pes_type > DMX_PES_OTHER || params->pes_type < 0)
884		return -EINVAL;
885
886	dmxdevfilter->type = DMXDEV_TYPE_PES;
887	memcpy(&dmxdevfilter->params, params,
888	       sizeof(struct dmx_pes_filter_params));
889	INIT_LIST_HEAD(&dmxdevfilter->feed.ts);
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
904static 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
945static ssize_t
946dvb_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
966static int dvb_demux_do_ioctl(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
1087static long dvb_demux_ioctl(struct file *file, unsigned int cmd,
1088			    unsigned long arg)
1089{
1090	return dvb_usercopy(file, cmd, arg, dvb_demux_do_ioctl);
1091}
1092
1093static 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
1117static 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
1139static const struct file_operations dvb_demux_fops = {
1140	.owner = THIS_MODULE,
1141	.read = dvb_demux_read,
1142	.unlocked_ioctl = dvb_demux_ioctl,
1143	.open = dvb_demux_open,
1144	.release = dvb_demux_release,
1145	.poll = dvb_demux_poll,
1146	.llseek = default_llseek,
1147};
1148
1149static struct dvb_device dvbdev_demux = {
1150	.priv = NULL,
1151	.users = 1,
1152	.writers = 1,
1153	.fops = &dvb_demux_fops
1154};
1155
1156static int dvb_dvr_do_ioctl(struct file *file,
1157			    unsigned int cmd, void *parg)
1158{
1159	struct dvb_device *dvbdev = file->private_data;
1160	struct dmxdev *dmxdev = dvbdev->priv;
1161	unsigned long arg = (unsigned long)parg;
1162	int ret;
1163
1164	if (mutex_lock_interruptible(&dmxdev->mutex))
1165		return -ERESTARTSYS;
1166
1167	switch (cmd) {
1168	case DMX_SET_BUFFER_SIZE:
1169		ret = dvb_dvr_set_buffer_size(dmxdev, arg);
1170		break;
1171
1172	default:
1173		ret = -EINVAL;
1174		break;
1175	}
1176	mutex_unlock(&dmxdev->mutex);
1177	return ret;
1178}
1179
1180static long dvb_dvr_ioctl(struct file *file,
1181			 unsigned int cmd, unsigned long arg)
1182{
1183	return dvb_usercopy(file, cmd, arg, dvb_dvr_do_ioctl);
1184}
1185
1186static unsigned int dvb_dvr_poll(struct file *file, poll_table *wait)
1187{
1188	struct dvb_device *dvbdev = file->private_data;
1189	struct dmxdev *dmxdev = dvbdev->priv;
1190	unsigned int mask = 0;
1191
1192	dprintk("function : %s\n", __func__);
1193
1194	poll_wait(file, &dmxdev->dvr_buffer.queue, wait);
1195
1196	if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
1197		if (dmxdev->dvr_buffer.error)
1198			mask |= (POLLIN | POLLRDNORM | POLLPRI | POLLERR);
1199
1200		if (!dvb_ringbuffer_empty(&dmxdev->dvr_buffer))
1201			mask |= (POLLIN | POLLRDNORM | POLLPRI);
1202	} else
1203		mask |= (POLLOUT | POLLWRNORM | POLLPRI);
1204
1205	return mask;
1206}
1207
1208static const struct file_operations dvb_dvr_fops = {
1209	.owner = THIS_MODULE,
1210	.read = dvb_dvr_read,
1211	.write = dvb_dvr_write,
1212	.unlocked_ioctl = dvb_dvr_ioctl,
1213	.open = dvb_dvr_open,
1214	.release = dvb_dvr_release,
1215	.poll = dvb_dvr_poll,
1216	.llseek = default_llseek,
1217};
1218
1219static struct dvb_device dvbdev_dvr = {
1220	.priv = NULL,
1221	.readers = 1,
1222	.users = 1,
1223	.fops = &dvb_dvr_fops
1224};
1225
1226int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter)
1227{
1228	int i;
1229
1230	if (dmxdev->demux->open(dmxdev->demux) < 0)
1231		return -EUSERS;
1232
1233	dmxdev->filter = vmalloc(dmxdev->filternum * sizeof(struct dmxdev_filter));
1234	if (!dmxdev->filter)
1235		return -ENOMEM;
1236
1237	mutex_init(&dmxdev->mutex);
1238	spin_lock_init(&dmxdev->lock);
1239	for (i = 0; i < dmxdev->filternum; i++) {
1240		dmxdev->filter[i].dev = dmxdev;
1241		dmxdev->filter[i].buffer.data = NULL;
1242		dvb_dmxdev_filter_state_set(&dmxdev->filter[i],
1243					    DMXDEV_STATE_FREE);
1244	}
1245
1246	dvb_register_device(dvb_adapter, &dmxdev->dvbdev, &dvbdev_demux, dmxdev,
1247			    DVB_DEVICE_DEMUX);
1248	dvb_register_device(dvb_adapter, &dmxdev->dvr_dvbdev, &dvbdev_dvr,
1249			    dmxdev, DVB_DEVICE_DVR);
1250
1251	dvb_ringbuffer_init(&dmxdev->dvr_buffer, NULL, 8192);
1252
1253	return 0;
1254}
1255
1256EXPORT_SYMBOL(dvb_dmxdev_init);
1257
1258void dvb_dmxdev_release(struct dmxdev *dmxdev)
1259{
1260	dmxdev->exit=1;
1261	if (dmxdev->dvbdev->users > 1) {
1262		wait_event(dmxdev->dvbdev->wait_queue,
1263				dmxdev->dvbdev->users==1);
1264	}
1265	if (dmxdev->dvr_dvbdev->users > 1) {
1266		wait_event(dmxdev->dvr_dvbdev->wait_queue,
1267				dmxdev->dvr_dvbdev->users==1);
1268	}
1269
1270	dvb_unregister_device(dmxdev->dvbdev);
1271	dvb_unregister_device(dmxdev->dvr_dvbdev);
1272
1273	vfree(dmxdev->filter);
1274	dmxdev->filter = NULL;
1275	dmxdev->demux->close(dmxdev->demux);
1276}
1277
1278EXPORT_SYMBOL(dvb_dmxdev_release);
1279