mirror of https://gitee.com/openkylin/linux.git
V4L/DVB (5512): Fix 3/3 for bug 7819: fixed hotplugging for dvbnet
fixed hotplugging for dvbnet Signed-off-by: Michal CIJOML Semler <cijoml@volny.cz> Signed-off-by: Markus Rechberger <markus.rechberger@amd.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
57861b432b
commit
2c4d336468
|
@ -1208,8 +1208,6 @@ int dvb_dmx_init(struct dvb_demux *dvbdemux)
|
||||||
dmx->disconnect_frontend = dvbdmx_disconnect_frontend;
|
dmx->disconnect_frontend = dvbdmx_disconnect_frontend;
|
||||||
dmx->get_pes_pids = dvbdmx_get_pes_pids;
|
dmx->get_pes_pids = dvbdmx_get_pes_pids;
|
||||||
|
|
||||||
init_waitqueue_head (&dvbdemux->wait_queue);
|
|
||||||
|
|
||||||
mutex_init(&dvbdemux->mutex);
|
mutex_init(&dvbdemux->mutex);
|
||||||
spin_lock_init(&dvbdemux->lock);
|
spin_lock_init(&dvbdemux->lock);
|
||||||
|
|
||||||
|
|
|
@ -119,7 +119,6 @@ struct dvb_demux {
|
||||||
u16 pids[DMX_TS_PES_OTHER];
|
u16 pids[DMX_TS_PES_OTHER];
|
||||||
int playing;
|
int playing;
|
||||||
int recording;
|
int recording;
|
||||||
wait_queue_head_t wait_queue;
|
|
||||||
|
|
||||||
#define DMX_MAX_PID 0x2000
|
#define DMX_MAX_PID 0x2000
|
||||||
struct list_head feed_list;
|
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);
|
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 = {
|
static struct file_operations dvb_net_fops = {
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.ioctl = dvb_net_ioctl,
|
.ioctl = dvb_net_ioctl,
|
||||||
.open = dvb_generic_open,
|
.open = dvb_generic_open,
|
||||||
.release = dvb_generic_release,
|
.release = dvb_net_close,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct dvb_device dvbdev_net = {
|
static struct dvb_device dvbdev_net = {
|
||||||
|
@ -1458,6 +1483,11 @@ void dvb_net_release (struct dvb_net *dvbnet)
|
||||||
{
|
{
|
||||||
int i;
|
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);
|
dvb_unregister_device(dvbnet->dvbdev);
|
||||||
|
|
||||||
for (i=0; i<DVB_NET_DEVICES_MAX; i++) {
|
for (i=0; i<DVB_NET_DEVICES_MAX; i++) {
|
||||||
|
|
|
@ -36,6 +36,7 @@ struct dvb_net {
|
||||||
struct dvb_device *dvbdev;
|
struct dvb_device *dvbdev;
|
||||||
struct net_device *device[DVB_NET_DEVICES_MAX];
|
struct net_device *device[DVB_NET_DEVICES_MAX];
|
||||||
int state[DVB_NET_DEVICES_MAX];
|
int state[DVB_NET_DEVICES_MAX];
|
||||||
|
unsigned int exit:1;
|
||||||
struct dmx_demux *demux;
|
struct dmx_demux *demux;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue