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

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
......@@ -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);
......
......@@ -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;
......
......@@ -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++) {
......
......@@ -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;
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment