Commit 2c4d3364 authored by Markus Rechberger's avatar Markus Rechberger Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (5512): Fix 3/3 for bug 7819: fixed hotplugging for dvbnet



fixed hotplugging for dvbnet

Signed-off-by: default avatarMichal CIJOML Semler <cijoml@volny.cz>
Signed-off-by: default avatarMarkus Rechberger <markus.rechberger@amd.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 57861b43
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -1208,8 +1208,6 @@ int dvb_dmx_init(struct dvb_demux *dvbdemux)
	dmx->disconnect_frontend = dvbdmx_disconnect_frontend;
	dmx->get_pes_pids = dvbdmx_get_pes_pids;

	init_waitqueue_head (&dvbdemux->wait_queue);

	mutex_init(&dvbdemux->mutex);
	spin_lock_init(&dvbdemux->lock);

+0 −1
Original line number Diff line number Diff line
@@ -119,7 +119,6 @@ struct dvb_demux {
	u16 pids[DMX_TS_PES_OTHER];
	int playing;
	int recording;
	wait_queue_head_t	  wait_queue;

#define DMX_MAX_PID 0x2000
	struct list_head feed_list;
+31 −1
Original line number Diff line number Diff line
@@ -1439,11 +1439,36 @@ static int dvb_net_ioctl(struct inode *inode, struct file *file,
	return dvb_usercopy(inode, file, cmd, arg, dvb_net_do_ioctl);
}

static int dvb_net_close(struct inode *inode, struct file *file)
{
	struct dvb_device *dvbdev = file->private_data;
	struct dvb_net *dvbnet = dvbdev->priv;

	if (!dvbdev)
		return -ENODEV;

	if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
		dvbdev->readers++;
	} else {
		dvbdev->writers++;
	}

	dvbdev->users++;

	if(dvbdev->users == 1 && dvbnet->exit==1) {
		fops_put(file->f_op);
		file->f_op = NULL;
		wake_up(&dvbdev->wait_queue);
	}
	return 0;
}


static struct file_operations dvb_net_fops = {
	.owner = THIS_MODULE,
	.ioctl = dvb_net_ioctl,
	.open =	dvb_generic_open,
	.release = dvb_generic_release,
	.release = dvb_net_close,
};

static struct dvb_device dvbdev_net = {
@@ -1458,6 +1483,11 @@ void dvb_net_release (struct dvb_net *dvbnet)
{
	int i;

	dvbnet->exit = 1;
	if (dvbnet->dvbdev->users < 1)
		wait_event(dvbnet->dvbdev->wait_queue,
				dvbnet->dvbdev->users==1);

	dvb_unregister_device(dvbnet->dvbdev);

	for (i=0; i<DVB_NET_DEVICES_MAX; i++) {
+1 −0
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ struct dvb_net {
	struct dvb_device *dvbdev;
	struct net_device *device[DVB_NET_DEVICES_MAX];
	int state[DVB_NET_DEVICES_MAX];
	unsigned int exit:1;
	struct dmx_demux *demux;
};