From 5ae225b1f68e129ca76b087cfee8b60a1c34354b Mon Sep 17 00:00:00 2001 From: Florent Audebert Date: Wed, 13 May 2015 17:51:23 +0200 Subject: [PATCH] Reserve 4 adapter numbers for each DVB-C modulators In order to determine on which tab/port modules are plugged, udev relies on adapter numbers which must remain multiple of 4. --- ddbridge/ddbridge-core.c | 15 ++++++++++----- dvb-core/dvbdev.c | 6 ++++-- dvb-core/dvbdev.h | 4 +++- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index 8fbe34e..c4dd88d 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -1564,7 +1564,8 @@ static int dvb_register_adapters(struct ddb *dev) adap = port->dvb[0].adap; ret = dvb_register_adapter(adap, "DDBridge", THIS_MODULE, port->dev->dev, - adapter_nr); + adapter_nr, + dev->link[0].info->type == DDB_MOD ? 4 : 1); if (ret < 0) return ret; port->dvb[0].adap_registered = 1; @@ -1584,7 +1585,8 @@ static int dvb_register_adapters(struct ddb *dev) ret = dvb_register_adapter(adap, "DDBridge", THIS_MODULE, port->dev->dev, - adapter_nr); + adapter_nr, + 1); if (ret < 0) return ret; port->dvb[0].adap_registered = 1; @@ -1597,7 +1599,8 @@ static int dvb_register_adapters(struct ddb *dev) ret = dvb_register_adapter(adap, "DDBridge", THIS_MODULE, port->dev->dev, - adapter_nr); + adapter_nr, + 1); if (ret < 0) return ret; port->dvb[1].adap_registered = 1; @@ -1609,7 +1612,8 @@ static int dvb_register_adapters(struct ddb *dev) ret = dvb_register_adapter(adap, "DDBridge", THIS_MODULE, port->dev->dev, - adapter_nr); + adapter_nr, + 1); if (ret < 0) return ret; port->dvb[0].adap_registered = 1; @@ -1621,7 +1625,8 @@ static int dvb_register_adapters(struct ddb *dev) ret = dvb_register_adapter(adap, "DDBridge", THIS_MODULE, port->dev->dev, - adapter_nr); + adapter_nr, + 1); if (ret < 0) return ret; port->dvb[0].adap_registered = 1; diff --git a/dvb-core/dvbdev.c b/dvb-core/dvbdev.c index f02b7a5..dee3ab6 100644 --- a/dvb-core/dvbdev.c +++ b/dvb-core/dvbdev.c @@ -780,9 +780,10 @@ static int dvbdev_check_free_adapter_num(int num) list_for_each(entry, &dvb_adapter_list) { struct dvb_adapter *adap; adap = list_entry(entry, struct dvb_adapter, list_head); - if (adap->num == num) + if (num >= adap->num && num < adap->num + adap->num_reserved) return 0; } + return 1; } @@ -802,7 +803,7 @@ static int dvbdev_get_free_adapter_num (void) int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct module *module, struct device *device, - short *adapter_nums) + short *adapter_nums, int num_reserved) { int i, num; @@ -837,6 +838,7 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name, adap->device = device; adap->mfe_shared = 0; adap->mfe_dvbdev = NULL; + adap->num_reserved = num_reserved; mutex_init (&adap->mfe_lock); list_add_tail (&adap->list_head, &dvb_adapter_list); diff --git a/dvb-core/dvbdev.h b/dvb-core/dvbdev.h index f4dc90e..50b8082 100644 --- a/dvb-core/dvbdev.h +++ b/dvb-core/dvbdev.h @@ -95,6 +95,8 @@ struct dvb_adapter { struct dvb_device *mfe_dvbdev; /* frontend device in use */ struct mutex mfe_lock; /* access lock for thread creation */ + int num_reserved; + #if defined(CONFIG_MEDIA_CONTROLLER_DVB) struct media_device *mdev; struct media_entity *conn; @@ -181,7 +183,7 @@ struct dvb_device { */ int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct module *module, struct device *device, - short *adapter_nums); + short *adapter_nums, int num_reserved); /** * dvb_unregister_adapter - Unregisters a DVB adapter