Linux Audio

Check our new training course

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