23 #include <linux/sched.h>
25 #include <linux/slab.h>
27 #include <linux/module.h>
28 #include <linux/poll.h>
30 #include <linux/wait.h>
31 #include <asm/uaccess.h>
39 #define dprintk if (debug) printk
42 const u8 *
src,
size_t len)
53 dprintk(
"dmxdev: buffer overflow\n");
62 size_t count, loff_t *ppos)
77 for (todo = count; todo > 0; todo -=
ret) {
106 return (count - todo) ? (count -
todo) : ret;
125 struct dvb_device *dvbdev = file->private_data;
129 dprintk(
"function : %s\n", __func__);
164 if (!dmxdev->
demux->write) {
175 dmxdev->
demux->disconnect_frontend(dmxdev->
demux);
176 dmxdev->
demux->connect_frontend(dmxdev->
demux, front);
183 static int dvb_dvr_release(
struct inode *inode,
struct file *file)
186 struct dmxdev *dmxdev = dvbdev->
priv;
191 dmxdev->
demux->disconnect_frontend(dmxdev->
demux);
192 dmxdev->
demux->connect_frontend(dmxdev->
demux,
200 spin_lock_irq(&dmxdev->
lock);
202 spin_unlock_irq(&dmxdev->
lock);
208 if (dvbdev->
users == 1 && dmxdev->
exit == 1) {
219 static ssize_t dvb_dvr_write(
struct file *file,
const char __user *buf,
220 size_t count, loff_t *ppos)
223 struct dmxdev *dmxdev = dvbdev->
priv;
226 if (!dmxdev->
demux->write)
237 ret = dmxdev->
demux->write(dmxdev->
demux, buf, count);
242 static ssize_t dvb_dvr_read(
struct file *file,
char __user *buf,
size_t count,
246 struct dmxdev *dmxdev = dvbdev->
priv;
251 return dvb_dmxdev_buffer_read(&dmxdev->
dvr_buffer,
256 static int dvb_dvr_set_buffer_size(
struct dmxdev *dmxdev,
263 dprintk(
"function : %s\n", __func__);
265 if (buf->
size == size)
276 spin_lock_irq(&dmxdev->
lock);
282 spin_unlock_irq(&dmxdev->
lock);
289 static inline void dvb_dmxdev_filter_state_set(
struct dmxdev_filter
290 *dmxdevfilter,
int state)
292 spin_lock_irq(&dmxdevfilter->
dev->lock);
294 spin_unlock_irq(&dmxdevfilter->
dev->lock);
297 static int dvb_dmxdev_set_buffer_size(
struct dmxdev_filter *dmxdevfilter,
304 if (buf->
size == size)
317 spin_lock_irq(&dmxdevfilter->
dev->lock);
323 spin_unlock_irq(&dmxdevfilter->
dev->lock);
330 static void dvb_dmxdev_filter_timeout(
unsigned long data)
335 spin_lock_irq(&dmxdevfilter->
dev->lock);
337 spin_unlock_irq(&dmxdevfilter->
dev->lock);
341 static void dvb_dmxdev_filter_timer(
struct dmxdev_filter *dmxdevfilter)
347 dmxdevfilter->
timer.function = dvb_dmxdev_filter_timeout;
348 dmxdevfilter->
timer.data = (
unsigned long)dmxdevfilter;
349 dmxdevfilter->
timer.expires =
355 static int dvb_dmxdev_section_callback(
const u8 *
buffer1,
size_t buffer1_len,
363 if (dmxdevfilter->
buffer.error) {
367 spin_lock(&dmxdevfilter->
dev->lock);
369 spin_unlock(&dmxdevfilter->
dev->lock);
373 dprintk(
"dmxdev: section callback %*ph\n", 6, buffer1);
374 ret = dvb_dmxdev_buffer_write(&dmxdevfilter->
buffer, buffer1,
376 if (ret == buffer1_len) {
377 ret = dvb_dmxdev_buffer_write(&dmxdevfilter->
buffer, buffer2,
386 spin_unlock(&dmxdevfilter->
dev->lock);
391 static int dvb_dmxdev_ts_callback(
const u8 *buffer1,
size_t buffer1_len,
392 const u8 *buffer2,
size_t buffer2_len,
400 spin_lock(&dmxdevfilter->
dev->lock);
402 spin_unlock(&dmxdevfilter->
dev->lock);
408 buffer = &dmxdevfilter->
buffer;
410 buffer = &dmxdevfilter->
dev->dvr_buffer;
412 spin_unlock(&dmxdevfilter->
dev->lock);
416 ret = dvb_dmxdev_buffer_write(buffer, buffer1, buffer1_len);
417 if (ret == buffer1_len)
418 ret = dvb_dmxdev_buffer_write(buffer, buffer2, buffer2_len);
423 spin_unlock(&dmxdevfilter->
dev->lock);
429 static int dvb_dmxdev_feed_stop(
struct dmxdev_filter *dmxdevfilter)
435 switch (dmxdevfilter->
type) {
442 feed->
ts->stop_filtering(feed->
ts);
458 switch (filter->type) {
460 return filter->feed.sec->start_filtering(filter->feed.sec);
463 ret = feed->
ts->start_filtering(feed->
ts);
465 dvb_dmxdev_feed_stop(filter);
479 static int dvb_dmxdev_feed_restart(
struct dmxdev_filter *filter)
482 struct dmxdev *dmxdev = filter->
dev;
488 dmxdev->
filter[i].params.sec.pid == pid) {
489 dvb_dmxdev_feed_start(&dmxdev->
filter[i]);
493 filter->
dev->demux->release_section_feed(dmxdev->
demux,
499 static int dvb_dmxdev_filter_stop(
struct dmxdev_filter *dmxdevfilter)
507 switch (dmxdevfilter->
type) {
511 dvb_dmxdev_feed_stop(dmxdevfilter);
514 release_filter(dmxdevfilter->
feed.
sec,
516 dvb_dmxdev_feed_restart(dmxdevfilter);
520 dvb_dmxdev_feed_stop(dmxdevfilter);
521 demux = dmxdevfilter->
dev->demux;
537 static void dvb_dmxdev_delete_pids(
struct dmxdev_filter *dmxdevfilter)
550 static inline int dvb_dmxdev_filter_reset(
struct dmxdev_filter *dmxdevfilter)
556 dvb_dmxdev_delete_pids(dmxdevfilter);
563 static int dvb_dmxdev_start_feed(
struct dmxdev *dmxdev,
592 ret = dmxdev->
demux->allocate_ts_feed(dmxdev->
demux, &feed->
ts,
593 dvb_dmxdev_ts_callback);
600 ret = tsfeed->
set(tsfeed, feed->
pid, ts_type, ts_pes, 32768, timeout);
602 dmxdev->
demux->release_ts_feed(dmxdev->
demux, tsfeed);
608 dmxdev->
demux->release_ts_feed(dmxdev->
demux, tsfeed);
615 static int dvb_dmxdev_filter_start(
struct dmxdev_filter *filter)
617 struct dmxdev *dmxdev = filter->
dev;
626 dvb_dmxdev_filter_stop(filter);
628 if (!filter->
buffer.data) {
632 spin_lock_irq(&filter->
dev->lock);
634 spin_unlock_irq(&filter->
dev->lock);
639 switch (filter->
type) {
651 for (i = 0; i < dmxdev->
filternum; i++) {
654 dmxdev->
filter[i].params.sec.pid == para->
pid) {
655 *secfeed = dmxdev->
filter[
i].feed.sec;
662 ret = dmxdev->
demux->allocate_section_feed(dmxdev->
demux,
664 dvb_dmxdev_section_callback);
666 printk(
"DVB (%s): could not alloc feed\n",
671 ret = (*secfeed)->set(*secfeed, para->
pid, 32768,
674 printk(
"DVB (%s): could not set feed\n",
676 dvb_dmxdev_feed_restart(filter);
680 dvb_dmxdev_feed_stop(filter);
683 ret = (*secfeed)->allocate_filter(*secfeed, secfilter);
685 dvb_dmxdev_feed_restart(filter);
686 filter->
feed.
sec->start_filtering(*secfeed);
687 dprintk(
"could not get filter\n");
691 (*secfilter)->priv =
filter;
693 memcpy(&((*secfilter)->filter_value[3]),
695 memcpy(&(*secfilter)->filter_mask[3],
697 memcpy(&(*secfilter)->filter_mode[3],
701 (*secfilter)->filter_mask[0] = para->
filter.
mask[0];
702 (*secfilter)->filter_mode[0] = para->
filter.
mode[0];
703 (*secfilter)->filter_mask[1] = 0;
704 (*secfilter)->filter_mask[2] = 0;
712 dvb_dmxdev_filter_timer(filter);
717 ret = dvb_dmxdev_start_feed(dmxdev, filter, feed);
719 dvb_dmxdev_filter_stop(filter);
732 static int dvb_demux_open(
struct inode *inode,
struct file *file)
735 struct dmxdev *dmxdev = dvbdev->
priv;
754 dmxdevfilter = &dmxdev->
filter[
i];
769 static int dvb_dmxdev_filter_free(
struct dmxdev *dmxdev,
775 dvb_dmxdev_filter_stop(dmxdevfilter);
776 dvb_dmxdev_filter_reset(dmxdevfilter);
778 if (dmxdevfilter->
buffer.data) {
779 void *mem = dmxdevfilter->
buffer.data;
781 spin_lock_irq(&dmxdev->
lock);
783 spin_unlock_irq(&dmxdev->
lock);
799 filter->
mode[i] ^= 0xff;
802 static int dvb_dmxdev_add_pid(
struct dmxdev *dmxdev,
813 (!list_empty(&filter->
feed.
ts)))
824 return dvb_dmxdev_start_feed(dmxdev, filter, feed);
829 static int dvb_dmxdev_remove_pid(
struct dmxdev *dmxdev,
839 if ((feed->
pid == pid) && (feed->
ts != NULL)) {
840 feed->
ts->stop_filtering(feed->
ts);
841 filter->
dev->demux->release_ts_feed(filter->
dev->demux,
851 static int dvb_dmxdev_filter_set(
struct dmxdev *dmxdev,
855 dprintk(
"function : %s\n", __func__);
857 dvb_dmxdev_filter_stop(dmxdevfilter);
862 invert_mode(&dmxdevfilter->
params.
sec.filter);
866 return dvb_dmxdev_filter_start(dmxdevfilter);
871 static int dvb_dmxdev_pes_filter_set(
struct dmxdev *dmxdev,
877 dvb_dmxdev_filter_stop(dmxdevfilter);
878 dvb_dmxdev_filter_reset(dmxdevfilter);
886 INIT_LIST_HEAD(&dmxdevfilter->
feed.
ts);
890 ret = dvb_dmxdev_add_pid(dmxdev, dmxdevfilter,
896 return dvb_dmxdev_filter_start(dmxdevfilter);
902 struct file *file,
char __user *buf,
903 size_t count, loff_t *ppos)
908 if (dfil->
todo <= 0) {
909 hcount = 3 + dfil->
todo;
912 result = dvb_dmxdev_buffer_read(&dfil->
buffer,
931 if (count > dfil->
todo)
933 result = dvb_dmxdev_buffer_read(&dfil->
buffer,
939 return (result + done);
943 dvb_demux_read(
struct file *file,
char __user *buf,
size_t count,
953 ret = dvb_dmxdev_read_sec(dmxdevfilter, file, buf, count, ppos);
955 ret = dvb_dmxdev_buffer_read(&dmxdevfilter->
buffer,
963 static int dvb_demux_do_ioctl(
struct file *file,
964 unsigned int cmd,
void *parg)
967 struct dmxdev *dmxdev = dmxdevfilter->
dev;
968 unsigned long arg = (
unsigned long)parg;
983 ret = dvb_dmxdev_filter_start(dmxdevfilter);
992 ret = dvb_dmxdev_filter_stop(dmxdevfilter);
1001 ret = dvb_dmxdev_filter_set(dmxdev, dmxdevfilter, parg);
1010 ret = dvb_dmxdev_pes_filter_set(dmxdev, dmxdevfilter, parg);
1019 ret = dvb_dmxdev_set_buffer_size(dmxdevfilter, arg);
1024 if (!dmxdev->
demux->get_pes_pids) {
1028 dmxdev->
demux->get_pes_pids(dmxdev->
demux, parg);
1032 if (!dmxdev->
demux->get_caps) {
1036 ret = dmxdev->
demux->get_caps(dmxdev->
demux, parg);
1040 if (!dmxdev->
demux->set_source) {
1044 ret = dmxdev->
demux->set_source(dmxdev->
demux, parg);
1048 if (!dmxdev->
demux->get_stc) {
1053 ((
struct dmx_stc *)parg)->num,
1054 &((
struct dmx_stc *)parg)->stc,
1055 &((
struct dmx_stc *)parg)->base);
1063 ret = dvb_dmxdev_add_pid(dmxdev, dmxdevfilter, *(
u16 *)parg);
1072 ret = dvb_dmxdev_remove_pid(dmxdev, dmxdevfilter, *(
u16 *)parg);
1084 static long dvb_demux_ioctl(
struct file *file,
unsigned int cmd,
1087 return dvb_usercopy(file, cmd, arg, dvb_demux_do_ioctl);
1090 static unsigned int dvb_demux_poll(
struct file *file,
poll_table *
wait)
1093 unsigned int mask = 0;
1098 poll_wait(file, &dmxdevfilter->
buffer.queue, wait);
1105 if (dmxdevfilter->
buffer.error)
1114 static int dvb_demux_release(
struct inode *inode,
struct file *file)
1117 struct dmxdev *dmxdev = dmxdevfilter->
dev;
1121 ret = dvb_dmxdev_filter_free(dmxdev, dmxdevfilter);
1125 if(dmxdev->
dvbdev->users==1 && dmxdev->
exit==1) {
1138 .read = dvb_demux_read,
1139 .unlocked_ioctl = dvb_demux_ioctl,
1140 .open = dvb_demux_open,
1141 .release = dvb_demux_release,
1142 .poll = dvb_demux_poll,
1150 .fops = &dvb_demux_fops
1153 static int dvb_dvr_do_ioctl(
struct file *file,
1154 unsigned int cmd,
void *parg)
1157 struct dmxdev *dmxdev = dvbdev->
priv;
1158 unsigned long arg = (
unsigned long)parg;
1166 ret = dvb_dvr_set_buffer_size(dmxdev, arg);
1177 static long dvb_dvr_ioctl(
struct file *file,
1178 unsigned int cmd,
unsigned long arg)
1183 static unsigned int dvb_dvr_poll(
struct file *file,
poll_table *wait)
1186 struct dmxdev *dmxdev = dvbdev->
priv;
1187 unsigned int mask = 0;
1189 dprintk(
"function : %s\n", __func__);
1191 poll_wait(file, &dmxdev->
dvr_buffer.queue, wait);
1207 .read = dvb_dvr_read,
1208 .write = dvb_dvr_write,
1209 .unlocked_ioctl = dvb_dvr_ioctl,
1210 .open = dvb_dvr_open,
1211 .release = dvb_dvr_release,
1212 .poll = dvb_dvr_poll,
1220 .fops = &dvb_dvr_fops
1236 for (i = 0; i < dmxdev->
filternum; i++) {
1237 dmxdev->
filter[
i].dev = dmxdev;
1239 dvb_dmxdev_filter_state_set(&dmxdev->
filter[i],
1258 if (dmxdev->
dvbdev->users > 1) {
1260 dmxdev->
dvbdev->users==1);