2 * dmxdev.c - DVB demultiplexer device
4 * Copyright (C) 2000 Ralph Metzler <ralph@convergence.de>
5 * & Marcus Metzler <marcus@convergence.de>
6 for convergence integrated media GmbH
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public License
10 * as published by the Free Software Foundation; either version 2.1
11 * of the License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 #include <linux/spinlock.h>
25 #include <linux/slab.h>
26 #include <linux/vmalloc.h>
27 #include <linux/module.h>
28 #include <linux/sched.h>
29 #include <linux/poll.h>
30 #include <linux/ioctl.h>
31 #include <linux/wait.h>
32 #include <asm/uaccess.h>
33 #include <asm/system.h>
36 #include "dvb_functions.h"
38 MODULE_PARM(debug
,"i");
41 #define dprintk if (debug) printk
43 inline struct dmxdev_filter
*
44 dvb_dmxdev_file_to_filter(struct file
*file
)
46 return (struct dmxdev_filter
*) file
->private_data
;
49 inline struct dmxdev_dvr
*
50 dvb_dmxdev_file_to_dvr(struct dmxdev
*dmxdev
, struct file
*file
)
52 return (struct dmxdev_dvr
*) file
->private_data
;
55 static inline void dvb_dmxdev_buffer_init(struct dmxdev_buffer
*buffer
)
62 init_waitqueue_head(&buffer
->queue
);
65 static inline int dvb_dmxdev_buffer_write(struct dmxdev_buffer
*buf
, const u8
*src
, int len
)
76 free
=buf
->pread
-buf
->pwrite
;
80 split
=buf
->size
-buf
->pwrite
;
83 dprintk("dmxdev: buffer overflow\n");
90 memcpy(buf
->data
+ buf
->pwrite
, src
, split
);
94 memcpy(buf
->data
+ buf
->pwrite
, src
+split
, todo
);
95 buf
->pwrite
=(buf
->pwrite
+todo
)%buf
->size
;
99 static ssize_t
dvb_dmxdev_buffer_read(struct dmxdev_buffer
*src
,
100 int non_blocking
, char *buf
, size_t count
, loff_t
*ppos
)
102 unsigned long todo
=count
;
103 int split
, avail
, error
;
108 if ((error
=src
->error
)) {
109 src
->pwrite
=src
->pread
;
114 if (non_blocking
&& (src
->pwrite
==src
->pread
))
118 if (non_blocking
&& (src
->pwrite
==src
->pread
))
119 return (count
-todo
) ? (count
-todo
) : -EWOULDBLOCK
;
121 if (wait_event_interruptible(src
->queue
,
122 (src
->pread
!=src
->pwrite
) ||
126 if ((error
=src
->error
)) {
127 src
->pwrite
=src
->pread
;
133 avail
=src
->pwrite
- src
->pread
;
136 split
=src
->size
- src
->pread
;
141 if (copy_to_user(buf
, src
->data
+src
->pread
, split
))
149 if (copy_to_user(buf
, src
->data
+src
->pread
, avail
))
151 src
->pread
= (src
->pread
+ avail
) % src
->size
;
159 static struct dmx_frontend
* get_fe(struct dmx_demux
*demux
, int type
)
161 struct list_head
*head
, *pos
;
163 head
=demux
->get_frontends(demux
);
166 list_for_each(pos
, head
)
167 if (DMX_FE_ENTRY(pos
)->source
==type
)
168 return DMX_FE_ENTRY(pos
);
173 static inline void dvb_dmxdev_dvr_state_set(struct dmxdev_dvr
*dmxdevdvr
, int state
)
175 spin_lock_irq(&dmxdevdvr
->dev
->lock
);
176 dmxdevdvr
->state
=state
;
177 spin_unlock_irq(&dmxdevdvr
->dev
->lock
);
180 static int dvb_dvr_open(struct inode
*inode
, struct file
*file
)
182 struct dvb_device
*dvbdev
=(struct dvb_device
*) file
->private_data
;
183 struct dmxdev
*dmxdev
=(struct dmxdev
*) dvbdev
->priv
;
184 struct dmx_frontend
*front
;
186 dprintk ("function : %s\n", __FUNCTION__
);
188 if (down_interruptible (&dmxdev
->mutex
))
191 if ((file
->f_flags
&O_ACCMODE
)==O_RDWR
) {
192 if (!(dmxdev
->capabilities
&DMXDEV_CAP_DUPLEX
)) {
198 if ((file
->f_flags
&O_ACCMODE
)==O_RDONLY
) {
199 dvb_dmxdev_buffer_init(&dmxdev
->dvr_buffer
);
200 dmxdev
->dvr_buffer
.size
=DVR_BUFFER_SIZE
;
201 dmxdev
->dvr_buffer
.data
=vmalloc(DVR_BUFFER_SIZE
);
202 if (!dmxdev
->dvr_buffer
.data
) {
208 if ((file
->f_flags
&O_ACCMODE
)==O_WRONLY
) {
209 dmxdev
->dvr_orig_fe
=dmxdev
->demux
->frontend
;
211 if (!dmxdev
->demux
->write
) {
216 front
=get_fe(dmxdev
->demux
, DMX_MEMORY_FE
);
222 dmxdev
->demux
->disconnect_frontend(dmxdev
->demux
);
223 dmxdev
->demux
->connect_frontend(dmxdev
->demux
, front
);
229 static int dvb_dvr_release(struct inode
*inode
, struct file
*file
)
231 struct dvb_device
*dvbdev
=(struct dvb_device
*) file
->private_data
;
232 struct dmxdev
*dmxdev
=(struct dmxdev
*) dvbdev
->priv
;
234 if (down_interruptible (&dmxdev
->mutex
))
237 if ((file
->f_flags
&O_ACCMODE
)==O_WRONLY
) {
238 dmxdev
->demux
->disconnect_frontend(dmxdev
->demux
);
239 dmxdev
->demux
->connect_frontend(dmxdev
->demux
,
240 dmxdev
->dvr_orig_fe
);
242 if ((file
->f_flags
&O_ACCMODE
)==O_RDONLY
) {
243 if (dmxdev
->dvr_buffer
.data
) {
244 void *mem
=dmxdev
->dvr_buffer
.data
;
246 spin_lock_irq(&dmxdev
->lock
);
247 dmxdev
->dvr_buffer
.data
=0;
248 spin_unlock_irq(&dmxdev
->lock
);
256 static ssize_t
dvb_dvr_write(struct file
*file
, const char *buf
,
257 size_t count
, loff_t
*ppos
)
259 struct dvb_device
*dvbdev
=(struct dvb_device
*) file
->private_data
;
260 struct dmxdev
*dmxdev
=(struct dmxdev
*) dvbdev
->priv
;
263 if (!dmxdev
->demux
->write
)
265 if ((file
->f_flags
&O_ACCMODE
)!=O_WRONLY
)
267 if (down_interruptible (&dmxdev
->mutex
))
269 ret
=dmxdev
->demux
->write(dmxdev
->demux
, buf
, count
);
274 static ssize_t
dvb_dvr_read(struct file
*file
, char *buf
, size_t count
,
277 struct dvb_device
*dvbdev
=(struct dvb_device
*) file
->private_data
;
278 struct dmxdev
*dmxdev
=(struct dmxdev
*) dvbdev
->priv
;
281 //down(&dmxdev->mutex);
282 ret
= dvb_dmxdev_buffer_read(&dmxdev
->dvr_buffer
,
283 file
->f_flags
&O_NONBLOCK
,
285 //up(&dmxdev->mutex);
289 static inline void dvb_dmxdev_filter_state_set(struct dmxdev_filter
*dmxdevfilter
, int state
)
291 spin_lock_irq(&dmxdevfilter
->dev
->lock
);
292 dmxdevfilter
->state
=state
;
293 spin_unlock_irq(&dmxdevfilter
->dev
->lock
);
296 static int dvb_dmxdev_set_buffer_size(struct dmxdev_filter
*dmxdevfilter
, unsigned long size
)
298 struct dmxdev_buffer
*buf
=&dmxdevfilter
->buffer
;
303 if (dmxdevfilter
->state
>=DMXDEV_STATE_GO
)
305 spin_lock_irq(&dmxdevfilter
->dev
->lock
);
309 buf
->pwrite
=buf
->pread
=0;
310 spin_unlock_irq(&dmxdevfilter
->dev
->lock
);
315 mem
=vmalloc(dmxdevfilter
->buffer
.size
);
318 spin_lock_irq(&dmxdevfilter
->dev
->lock
);
320 spin_unlock_irq(&dmxdevfilter
->dev
->lock
);
325 static void dvb_dmxdev_filter_timeout(unsigned long data
)
327 struct dmxdev_filter
*dmxdevfilter
=(struct dmxdev_filter
*)data
;
329 dmxdevfilter
->buffer
.error
=-ETIMEDOUT
;
330 spin_lock_irq(&dmxdevfilter
->dev
->lock
);
331 dmxdevfilter
->state
=DMXDEV_STATE_TIMEDOUT
;
332 spin_unlock_irq(&dmxdevfilter
->dev
->lock
);
333 wake_up(&dmxdevfilter
->buffer
.queue
);
336 static void dvb_dmxdev_filter_timer(struct dmxdev_filter
*dmxdevfilter
)
338 struct dmx_sct_filter_params
*para
=&dmxdevfilter
->params
.sec
;
340 del_timer(&dmxdevfilter
->timer
);
342 dmxdevfilter
->timer
.function
=dvb_dmxdev_filter_timeout
;
343 dmxdevfilter
->timer
.data
=(unsigned long) dmxdevfilter
;
344 dmxdevfilter
->timer
.expires
=jiffies
+1+(HZ
/2+HZ
*para
->timeout
)/1000;
345 add_timer(&dmxdevfilter
->timer
);
349 static int dvb_dmxdev_section_callback(const u8
*buffer1
, size_t buffer1_len
,
350 const u8
*buffer2
, size_t buffer2_len
,
351 struct dmx_section_filter
*filter
, enum dmx_success success
)
353 struct dmxdev_filter
*dmxdevfilter
=(struct dmxdev_filter
*) filter
->priv
;
356 if (dmxdevfilter
->buffer
.error
) {
357 wake_up(&dmxdevfilter
->buffer
.queue
);
360 spin_lock(&dmxdevfilter
->dev
->lock
);
361 if (dmxdevfilter
->state
!=DMXDEV_STATE_GO
) {
362 spin_unlock(&dmxdevfilter
->dev
->lock
);
365 del_timer(&dmxdevfilter
->timer
);
366 dprintk("dmxdev: section callback %02x %02x %02x %02x %02x %02x\n",
367 buffer1
[0], buffer1
[1],
368 buffer1
[2], buffer1
[3],
369 buffer1
[4], buffer1
[5]);
370 ret
=dvb_dmxdev_buffer_write(&dmxdevfilter
->buffer
, buffer1
, buffer1_len
);
371 if (ret
==buffer1_len
) {
372 ret
=dvb_dmxdev_buffer_write(&dmxdevfilter
->buffer
, buffer2
, buffer2_len
);
375 dmxdevfilter
->buffer
.pwrite
=dmxdevfilter
->buffer
.pread
;
376 dmxdevfilter
->buffer
.error
=-EOVERFLOW
;
378 if (dmxdevfilter
->params
.sec
.flags
&DMX_ONESHOT
)
379 dmxdevfilter
->state
=DMXDEV_STATE_DONE
;
380 spin_unlock(&dmxdevfilter
->dev
->lock
);
381 wake_up(&dmxdevfilter
->buffer
.queue
);
385 static int dvb_dmxdev_ts_callback(const u8
*buffer1
, size_t buffer1_len
,
386 const u8
*buffer2
, size_t buffer2_len
,
387 struct dmx_ts_feed
*feed
, enum dmx_success success
)
389 struct dmxdev_filter
*dmxdevfilter
=(struct dmxdev_filter
*) feed
->priv
;
390 struct dmxdev_buffer
*buffer
;
393 spin_lock(&dmxdevfilter
->dev
->lock
);
394 if (dmxdevfilter
->params
.pes
.output
==DMX_OUT_DECODER
) {
395 spin_unlock(&dmxdevfilter
->dev
->lock
);
399 if (dmxdevfilter
->params
.pes
.output
==DMX_OUT_TAP
)
400 buffer
=&dmxdevfilter
->buffer
;
402 buffer
=&dmxdevfilter
->dev
->dvr_buffer
;
404 spin_unlock(&dmxdevfilter
->dev
->lock
);
405 wake_up(&buffer
->queue
);
408 ret
=dvb_dmxdev_buffer_write(buffer
, buffer1
, buffer1_len
);
409 if (ret
==buffer1_len
)
410 ret
=dvb_dmxdev_buffer_write(buffer
, buffer2
, buffer2_len
);
412 buffer
->pwrite
=buffer
->pread
;
413 buffer
->error
=-EOVERFLOW
;
415 spin_unlock(&dmxdevfilter
->dev
->lock
);
416 wake_up(&buffer
->queue
);
421 /* stop feed but only mark the specified filter as stopped (state set) */
423 static int dvb_dmxdev_feed_stop(struct dmxdev_filter
*dmxdevfilter
)
425 dvb_dmxdev_filter_state_set(dmxdevfilter
, DMXDEV_STATE_SET
);
427 switch (dmxdevfilter
->type
) {
428 case DMXDEV_TYPE_SEC
:
429 del_timer(&dmxdevfilter
->timer
);
430 dmxdevfilter
->feed
.sec
->stop_filtering(dmxdevfilter
->feed
.sec
);
432 case DMXDEV_TYPE_PES
:
433 dmxdevfilter
->feed
.ts
->stop_filtering(dmxdevfilter
->feed
.ts
);
442 /* start feed associated with the specified filter */
444 static int dvb_dmxdev_feed_start(struct dmxdev_filter
*filter
)
446 dvb_dmxdev_filter_state_set (filter
, DMXDEV_STATE_GO
);
448 switch (filter
->type
) {
449 case DMXDEV_TYPE_SEC
:
450 return filter
->feed
.sec
->start_filtering(filter
->feed
.sec
);
452 case DMXDEV_TYPE_PES
:
453 return filter
->feed
.ts
->start_filtering(filter
->feed
.ts
);
463 /* restart section feed if it has filters left associated with it,
464 otherwise release the feed */
466 static int dvb_dmxdev_feed_restart(struct dmxdev_filter
*filter
)
469 struct dmxdev
*dmxdev
= filter
->dev
;
470 u16 pid
= filter
->params
.sec
.pid
;
472 for (i
=0; i
<dmxdev
->filternum
; i
++)
473 if (dmxdev
->filter
[i
].state
>=DMXDEV_STATE_GO
&&
474 dmxdev
->filter
[i
].type
==DMXDEV_TYPE_SEC
&&
475 dmxdev
->filter
[i
].pid
==pid
) {
476 dvb_dmxdev_feed_start(&dmxdev
->filter
[i
]);
480 filter
->dev
->demux
->release_section_feed(dmxdev
->demux
, filter
->feed
.sec
);
485 static int dvb_dmxdev_filter_stop(struct dmxdev_filter
*dmxdevfilter
)
487 if (dmxdevfilter
->state
<DMXDEV_STATE_GO
)
490 switch (dmxdevfilter
->type
) {
491 case DMXDEV_TYPE_SEC
:
492 if (!dmxdevfilter
->feed
.sec
)
494 dvb_dmxdev_feed_stop(dmxdevfilter
);
495 if (dmxdevfilter
->filter
.sec
)
496 dmxdevfilter
->feed
.sec
->
497 release_filter(dmxdevfilter
->feed
.sec
,
498 dmxdevfilter
->filter
.sec
);
499 dvb_dmxdev_feed_restart(dmxdevfilter
);
500 dmxdevfilter
->feed
.sec
=0;
502 case DMXDEV_TYPE_PES
:
503 if (!dmxdevfilter
->feed
.ts
)
505 dvb_dmxdev_feed_stop(dmxdevfilter
);
506 dmxdevfilter
->dev
->demux
->
507 release_ts_feed(dmxdevfilter
->dev
->demux
,
508 dmxdevfilter
->feed
.ts
);
509 dmxdevfilter
->feed
.ts
=0;
512 if (dmxdevfilter
->state
==DMXDEV_STATE_ALLOCATED
)
516 dmxdevfilter
->buffer
.pwrite
=dmxdevfilter
->buffer
.pread
=0;
520 static inline int dvb_dmxdev_filter_reset(struct dmxdev_filter
*dmxdevfilter
)
522 if (dmxdevfilter
->state
<DMXDEV_STATE_SET
)
525 dmxdevfilter
->type
=DMXDEV_TYPE_NONE
;
526 dmxdevfilter
->pid
=0xffff;
527 dvb_dmxdev_filter_state_set(dmxdevfilter
, DMXDEV_STATE_ALLOCATED
);
531 static int dvb_dmxdev_filter_start(struct dmxdev_filter
*filter
)
533 struct dmxdev
*dmxdev
= filter
->dev
;
537 if (filter
->state
< DMXDEV_STATE_SET
)
540 if (filter
->state
>= DMXDEV_STATE_GO
)
541 dvb_dmxdev_filter_stop(filter
);
543 if (!(mem
= filter
->buffer
.data
)) {
544 mem
= vmalloc(filter
->buffer
.size
);
545 spin_lock_irq(&filter
->dev
->lock
);
546 filter
->buffer
.data
=mem
;
547 spin_unlock_irq(&filter
->dev
->lock
);
548 if (!filter
->buffer
.data
)
552 filter
->buffer
.pwrite
= filter
->buffer
.pread
= 0;
554 switch (filter
->type
) {
555 case DMXDEV_TYPE_SEC
:
557 struct dmx_sct_filter_params
*para
=&filter
->params
.sec
;
558 struct dmx_section_filter
**secfilter
=&filter
->filter
.sec
;
559 struct dmx_section_feed
**secfeed
=&filter
->feed
.sec
;
564 /* find active filter/feed with same PID */
565 for (i
=0; i
<dmxdev
->filternum
; i
++) {
566 if (dmxdev
->filter
[i
].state
>= DMXDEV_STATE_GO
&&
567 dmxdev
->filter
[i
].pid
== para
->pid
&&
568 dmxdev
->filter
[i
].type
== DMXDEV_TYPE_SEC
) {
569 *secfeed
= dmxdev
->filter
[i
].feed
.sec
;
574 /* if no feed found, try to allocate new one */
576 ret
=dmxdev
->demux
->allocate_section_feed(dmxdev
->demux
,
578 dvb_dmxdev_section_callback
);
580 printk ("DVB (%s): could not alloc feed\n",
585 ret
=(*secfeed
)->set(*secfeed
, para
->pid
, 32768, 0,
586 (para
->flags
& DMX_CHECK_CRC
) ? 1 : 0);
589 printk ("DVB (%s): could not set feed\n",
591 dvb_dmxdev_feed_restart(filter
);
595 dvb_dmxdev_feed_stop(filter
);
598 ret
=(*secfeed
)->allocate_filter(*secfeed
, secfilter
);
601 dvb_dmxdev_feed_restart(filter
);
602 filter
->feed
.sec
->start_filtering(*secfeed
);
603 dprintk ("could not get filter\n");
607 (*secfilter
)->priv
= filter
;
609 memcpy(&((*secfilter
)->filter_value
[3]),
610 &(para
->filter
.filter
[1]), DMX_FILTER_SIZE
-1);
611 memcpy(&(*secfilter
)->filter_mask
[3],
612 ¶
->filter
.mask
[1], DMX_FILTER_SIZE
-1);
613 memcpy(&(*secfilter
)->filter_mode
[3],
614 ¶
->filter
.mode
[1], DMX_FILTER_SIZE
-1);
616 (*secfilter
)->filter_value
[0]=para
->filter
.filter
[0];
617 (*secfilter
)->filter_mask
[0]=para
->filter
.mask
[0];
618 (*secfilter
)->filter_mode
[0]=para
->filter
.mode
[0];
619 (*secfilter
)->filter_mask
[1]=0;
620 (*secfilter
)->filter_mask
[2]=0;
624 ret
= filter
->feed
.sec
->start_filtering (filter
->feed
.sec
);
629 dvb_dmxdev_filter_timer(filter
);
633 case DMXDEV_TYPE_PES
:
635 struct timespec timeout
= { 0 };
636 struct dmx_pes_filter_params
*para
= &filter
->params
.pes
;
640 enum dmx_ts_pes ts_pes
;
641 struct dmx_ts_feed
**tsfeed
= &filter
->feed
.ts
;
646 ts_pes
=(enum dmx_ts_pes
) para
->pes_type
;
648 if (ts_pes
<DMX_PES_OTHER
)
653 if (otype
== DMX_OUT_TS_TAP
)
654 ts_type
|= TS_PACKET
;
656 if (otype
== DMX_OUT_TAP
)
657 ts_type
|= TS_PAYLOAD_ONLY
|TS_PACKET
;
659 ret
=dmxdev
->demux
->allocate_ts_feed(dmxdev
->demux
,
661 dvb_dmxdev_ts_callback
);
665 (*tsfeed
)->priv
= (void *) filter
;
667 ret
= (*tsfeed
)->set(*tsfeed
, para
->pid
, ts_type
, ts_pes
,
668 188, 32768, 0, timeout
);
671 dmxdev
->demux
->release_ts_feed(dmxdev
->demux
, *tsfeed
);
675 ret
= filter
->feed
.ts
->start_filtering(filter
->feed
.ts
);
686 dvb_dmxdev_filter_state_set(filter
, DMXDEV_STATE_GO
);
690 static int dvb_demux_open(struct inode
*inode
, struct file
*file
)
692 struct dvb_device
*dvbdev
=(struct dvb_device
*) file
->private_data
;
693 struct dmxdev
*dmxdev
=(struct dmxdev
*) dvbdev
->priv
;
695 struct dmxdev_filter
*dmxdevfilter
;
700 if (down_interruptible(&dmxdev
->mutex
))
703 for (i
=0; i
<dmxdev
->filternum
; i
++)
704 if (dmxdev
->filter
[i
].state
==DMXDEV_STATE_FREE
)
707 if (i
==dmxdev
->filternum
) {
712 dmxdevfilter
=&dmxdev
->filter
[i
];
713 sema_init(&dmxdevfilter
->mutex
, 1);
714 dmxdevfilter
->dvbdev
=dmxdev
->dvbdev
;
715 file
->private_data
=dmxdevfilter
;
717 dvb_dmxdev_buffer_init(&dmxdevfilter
->buffer
);
718 dmxdevfilter
->type
=DMXDEV_TYPE_NONE
;
719 dvb_dmxdev_filter_state_set(dmxdevfilter
, DMXDEV_STATE_ALLOCATED
);
720 dmxdevfilter
->feed
.ts
=0;
721 init_timer(&dmxdevfilter
->timer
);
728 static int dvb_dmxdev_filter_free(struct dmxdev
*dmxdev
, struct dmxdev_filter
*dmxdevfilter
)
730 if (down_interruptible(&dmxdev
->mutex
))
733 if (down_interruptible(&dmxdevfilter
->mutex
)) {
738 dvb_dmxdev_filter_stop(dmxdevfilter
);
739 dvb_dmxdev_filter_reset(dmxdevfilter
);
741 if (dmxdevfilter
->buffer
.data
) {
742 void *mem
=dmxdevfilter
->buffer
.data
;
744 spin_lock_irq(&dmxdev
->lock
);
745 dmxdevfilter
->buffer
.data
=0;
746 spin_unlock_irq(&dmxdev
->lock
);
750 dvb_dmxdev_filter_state_set(dmxdevfilter
, DMXDEV_STATE_FREE
);
751 wake_up(&dmxdevfilter
->buffer
.queue
);
752 up(&dmxdevfilter
->mutex
);
757 static inline void invert_mode(dmx_filter_t
*filter
)
761 for (i
=0; i
<DMX_FILTER_SIZE
; i
++)
762 filter
->mode
[i
]^=0xff;
766 static int dvb_dmxdev_filter_set(struct dmxdev
*dmxdev
,
767 struct dmxdev_filter
*dmxdevfilter
,
768 struct dmx_sct_filter_params
*params
)
770 dprintk ("function : %s\n", __FUNCTION__
);
772 dvb_dmxdev_filter_stop(dmxdevfilter
);
774 dmxdevfilter
->type
=DMXDEV_TYPE_SEC
;
775 dmxdevfilter
->pid
=params
->pid
;
776 memcpy(&dmxdevfilter
->params
.sec
,
777 params
, sizeof(struct dmx_sct_filter_params
));
778 invert_mode(&dmxdevfilter
->params
.sec
.filter
);
779 dvb_dmxdev_filter_state_set(dmxdevfilter
, DMXDEV_STATE_SET
);
781 if (params
->flags
&DMX_IMMEDIATE_START
)
782 return dvb_dmxdev_filter_start(dmxdevfilter
);
787 static int dvb_dmxdev_pes_filter_set(struct dmxdev
*dmxdev
,
788 struct dmxdev_filter
*dmxdevfilter
,
789 struct dmx_pes_filter_params
*params
)
791 dvb_dmxdev_filter_stop(dmxdevfilter
);
793 if (params
->pes_type
>DMX_PES_OTHER
|| params
->pes_type
<0)
796 dmxdevfilter
->type
=DMXDEV_TYPE_PES
;
797 dmxdevfilter
->pid
=params
->pid
;
798 memcpy(&dmxdevfilter
->params
, params
, sizeof(struct dmx_pes_filter_params
));
800 dvb_dmxdev_filter_state_set(dmxdevfilter
, DMXDEV_STATE_SET
);
802 if (params
->flags
&DMX_IMMEDIATE_START
)
803 return dvb_dmxdev_filter_start(dmxdevfilter
);
808 static ssize_t
dvb_dmxdev_read_sec(struct dmxdev_filter
*dfil
,
809 struct file
*file
, char *buf
, size_t count
, loff_t
*ppos
)
818 result
=dvb_dmxdev_buffer_read(&dfil
->buffer
, file
->f_flags
&O_NONBLOCK
,
824 if (copy_from_user(dfil
->secheader
-dfil
->todo
, buf
, result
))
832 dfil
->todo
=((dfil
->secheader
[1]<<8)|dfil
->secheader
[2])&0xfff;
836 if (count
>dfil
->todo
)
838 result
=dvb_dmxdev_buffer_read(&dfil
->buffer
, file
->f_flags
&O_NONBLOCK
,
843 return (result
+done
);
848 dvb_demux_read(struct file
*file
, char *buf
, size_t count
, loff_t
*ppos
)
850 struct dmxdev_filter
*dmxdevfilter
=dvb_dmxdev_file_to_filter(file
);
853 if (down_interruptible(&dmxdevfilter
->mutex
))
856 if (dmxdevfilter
->type
==DMXDEV_TYPE_SEC
)
857 ret
=dvb_dmxdev_read_sec(dmxdevfilter
, file
, buf
, count
, ppos
);
859 ret
=dvb_dmxdev_buffer_read(&dmxdevfilter
->buffer
,
860 file
->f_flags
&O_NONBLOCK
,
863 up(&dmxdevfilter
->mutex
);
868 static int dvb_demux_do_ioctl(struct inode
*inode
, struct file
*file
,
869 unsigned int cmd
, void *parg
)
871 struct dmxdev_filter
*dmxdevfilter
=dvb_dmxdev_file_to_filter(file
);
872 struct dmxdev
*dmxdev
=dmxdevfilter
->dev
;
873 unsigned long arg
=(unsigned long) parg
;
876 if (down_interruptible (&dmxdev
->mutex
))
881 if (down_interruptible(&dmxdevfilter
->mutex
)) {
885 if (dmxdevfilter
->state
<DMXDEV_STATE_SET
)
888 ret
= dvb_dmxdev_filter_start(dmxdevfilter
);
889 up(&dmxdevfilter
->mutex
);
893 if (down_interruptible(&dmxdevfilter
->mutex
)) {
897 ret
=dvb_dmxdev_filter_stop(dmxdevfilter
);
898 up(&dmxdevfilter
->mutex
);
902 if (down_interruptible(&dmxdevfilter
->mutex
)) {
906 ret
= dvb_dmxdev_filter_set(dmxdev
, dmxdevfilter
,
907 (struct dmx_sct_filter_params
*)parg
);
908 up(&dmxdevfilter
->mutex
);
911 case DMX_SET_PES_FILTER
:
912 if (down_interruptible(&dmxdevfilter
->mutex
)) {
916 ret
=dvb_dmxdev_pes_filter_set(dmxdev
, dmxdevfilter
,
917 (struct dmx_pes_filter_params
*)parg
);
918 up(&dmxdevfilter
->mutex
);
921 case DMX_SET_BUFFER_SIZE
:
922 if (down_interruptible(&dmxdevfilter
->mutex
)) {
926 ret
=dvb_dmxdev_set_buffer_size(dmxdevfilter
, arg
);
927 up(&dmxdevfilter
->mutex
);
933 case DMX_GET_PES_PIDS
:
934 if (!dmxdev
->demux
->get_pes_pids
) {
938 dmxdev
->demux
->get_pes_pids(dmxdev
->demux
, (u16
*)parg
);
942 if (!dmxdev
->demux
->get_stc
) {
946 ret
= dmxdev
->demux
->get_stc(dmxdev
->demux
,
947 ((struct dmx_stc
*)parg
)->num
,
948 &((struct dmx_stc
*)parg
)->stc
,
949 &((struct dmx_stc
*)parg
)->base
);
959 static int dvb_demux_ioctl(struct inode
*inode
, struct file
*file
,
960 unsigned int cmd
, unsigned long arg
)
962 return dvb_usercopy(inode
, file
, cmd
, arg
, dvb_demux_do_ioctl
);
966 static unsigned int dvb_demux_poll (struct file
*file
, poll_table
*wait
)
968 struct dmxdev_filter
*dmxdevfilter
= dvb_dmxdev_file_to_filter(file
);
969 unsigned int mask
= 0;
974 poll_wait(file
, &dmxdevfilter
->buffer
.queue
, wait
);
976 if (dmxdevfilter
->state
!= DMXDEV_STATE_GO
&&
977 dmxdevfilter
->state
!= DMXDEV_STATE_DONE
&&
978 dmxdevfilter
->state
!= DMXDEV_STATE_TIMEDOUT
)
981 if (dmxdevfilter
->buffer
.error
)
982 mask
|= (POLLIN
| POLLRDNORM
| POLLPRI
| POLLERR
);
984 if (dmxdevfilter
->buffer
.pread
!= dmxdevfilter
->buffer
.pwrite
)
985 mask
|= (POLLIN
| POLLRDNORM
| POLLPRI
);
991 static int dvb_demux_release(struct inode
*inode
, struct file
*file
)
993 struct dmxdev_filter
*dmxdevfilter
= dvb_dmxdev_file_to_filter(file
);
994 struct dmxdev
*dmxdev
= dmxdevfilter
->dev
;
996 return dvb_dmxdev_filter_free(dmxdev
, dmxdevfilter
);
999 static struct file_operations dvb_demux_fops
= {
1000 .owner
= THIS_MODULE
,
1001 .read
= dvb_demux_read
,
1002 .ioctl
= dvb_demux_ioctl
,
1003 .open
= dvb_demux_open
,
1004 .release
= dvb_demux_release
,
1005 .poll
= dvb_demux_poll
,
1008 static struct dvb_device dvbdev_demux
= {
1012 .fops
= &dvb_demux_fops
1015 static int dvb_dvr_do_ioctl(struct inode
*inode
, struct file
*file
,
1016 unsigned int cmd
, void *parg
)
1018 struct dvb_device
*dvbdev
=(struct dvb_device
*) file
->private_data
;
1019 struct dmxdev
*dmxdev
=(struct dmxdev
*) dvbdev
->priv
;
1023 if (down_interruptible (&dmxdev
->mutex
))
1024 return -ERESTARTSYS
;
1027 case DMX_SET_BUFFER_SIZE
:
1039 static int dvb_dvr_ioctl(struct inode
*inode
, struct file
*file
,
1040 unsigned int cmd
, unsigned long arg
)
1042 return dvb_usercopy(inode
, file
, cmd
, arg
, dvb_dvr_do_ioctl
);
1046 static unsigned int dvb_dvr_poll (struct file
*file
, poll_table
*wait
)
1048 struct dvb_device
*dvbdev
= (struct dvb_device
*) file
->private_data
;
1049 struct dmxdev
*dmxdev
= (struct dmxdev
*) dvbdev
->priv
;
1050 unsigned int mask
= 0;
1052 dprintk ("function : %s\n", __FUNCTION__
);
1054 poll_wait(file
, &dmxdev
->dvr_buffer
.queue
, wait
);
1056 if ((file
->f_flags
&O_ACCMODE
) == O_RDONLY
) {
1057 if (dmxdev
->dvr_buffer
.error
)
1058 mask
|= (POLLIN
| POLLRDNORM
| POLLPRI
| POLLERR
);
1060 if (dmxdev
->dvr_buffer
.pread
!=dmxdev
->dvr_buffer
.pwrite
)
1061 mask
|= (POLLIN
| POLLRDNORM
| POLLPRI
);
1063 mask
|= (POLLOUT
| POLLWRNORM
| POLLPRI
);
1069 static struct file_operations dvb_dvr_fops
= {
1070 .owner
= THIS_MODULE
,
1071 .read
= dvb_dvr_read
,
1072 .write
= dvb_dvr_write
,
1073 .ioctl
= dvb_dvr_ioctl
,
1074 .open
= dvb_dvr_open
,
1075 .release
= dvb_dvr_release
,
1076 .poll
= dvb_dvr_poll
,
1079 static struct dvb_device dvbdev_dvr
= {
1083 .fops
= &dvb_dvr_fops
1087 dvb_dmxdev_init(struct dmxdev
*dmxdev
, struct dvb_adapter
*dvb_adapter
)
1091 if (dmxdev
->demux
->open(dmxdev
->demux
)<0)
1094 dmxdev
->filter
= vmalloc(dmxdev
->filternum
*sizeof(struct dmxdev_filter
));
1095 if (!dmxdev
->filter
)
1098 dmxdev
->dvr
= vmalloc(dmxdev
->filternum
*sizeof(struct dmxdev_dvr
));
1100 vfree(dmxdev
->filter
);
1101 dmxdev
->filter
= NULL
;
1105 sema_init(&dmxdev
->mutex
, 1);
1106 spin_lock_init(&dmxdev
->lock
);
1107 for (i
=0; i
<dmxdev
->filternum
; i
++) {
1108 dmxdev
->filter
[i
].dev
=dmxdev
;
1109 dmxdev
->filter
[i
].buffer
.data
=0;
1110 dvb_dmxdev_filter_state_set(&dmxdev
->filter
[i
], DMXDEV_STATE_FREE
);
1111 dmxdev
->dvr
[i
].dev
=dmxdev
;
1112 dmxdev
->dvr
[i
].buffer
.data
=0;
1113 dvb_dmxdev_filter_state_set(&dmxdev
->filter
[i
], DMXDEV_STATE_FREE
);
1114 dvb_dmxdev_dvr_state_set(&dmxdev
->dvr
[i
], DMXDEV_STATE_FREE
);
1116 dvb_register_device(dvb_adapter
, &dmxdev
->dvbdev
, &dvbdev_demux
, dmxdev
, DVB_DEVICE_DEMUX
);
1117 dvb_register_device(dvb_adapter
, &dmxdev
->dvr_dvbdev
, &dvbdev_dvr
, dmxdev
, DVB_DEVICE_DVR
);
1119 dvb_dmxdev_buffer_init(&dmxdev
->dvr_buffer
);
1125 dvb_dmxdev_release(struct dmxdev
*dmxdev
)
1127 dvb_unregister_device(dmxdev
->dvbdev
);
1128 dvb_unregister_device(dmxdev
->dvr_dvbdev
);
1129 if (dmxdev
->filter
) {
1130 vfree(dmxdev
->filter
);
1137 dmxdev
->demux
->close(dmxdev
->demux
);