Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/media/dvb/dvb-core/dmxdev.c
15112 views
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
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
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_timer(&dmxdevfilter->timer);
765
766
dvbdev->users++;
767
768
mutex_unlock(&dmxdev->mutex);
769
return 0;
770
}
771
772
static 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
797
static 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
805
static 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
832
static 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
854
static 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
874
static 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
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 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 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
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
.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
1149
static struct dvb_device dvbdev_demux = {
1150
.priv = NULL,
1151
.users = 1,
1152
.writers = 1,
1153
.fops = &dvb_demux_fops
1154
};
1155
1156
static 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
1180
static 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
1186
static 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
1208
static 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
1219
static struct dvb_device dvbdev_dvr = {
1220
.priv = NULL,
1221
.readers = 1,
1222
.users = 1,
1223
.fops = &dvb_dvr_fops
1224
};
1225
1226
int 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
1256
EXPORT_SYMBOL(dvb_dmxdev_init);
1257
1258
void 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
1278
EXPORT_SYMBOL(dvb_dmxdev_release);
1279
1280