Hello,
I have made a patch to correct the use count misbehaviour in dvb-core 1.1.1 when using the net character device and the network devices (I have posted an email last month about it).
The only one driver that makes use of the changes is skystar2. If you want a driver to take advantaje of the changes, you have to make in it the same modification I made in skystar2 (just one line ;-). I did not make the change in the rest of the drivers because I have no access to those cards, so I could not test them. It is not mandatory, however, to change the rest of the drivers to start using the patch, but those drivers are not goint to benefit from the changes.
I also have the patch for dvb vers. 1.1.0, and a document explaining the
changes. I'll send them just to Holger, in order to not send a huge mail
to the list ;-)This is it:
diff -ru linuxtv-dvb-1.1.1/linux/drivers/media/dvb/b2c2/skystar2.c linuxtv-dvb-1.1.1.patched/linux/drivers/media/dvb/b2c2/skystar2.c
--- linuxtv-dvb-1.1.1/linux/drivers/media/dvb/b2c2/skystar2.c Tue Jan 27 13:20:11 2004
+++ linuxtv-dvb-1.1.1.patched/linux/drivers/media/dvb/b2c2/skystar2.c Thu Mar 18 11:59:34 2004
@@ -2253,6 +2253,8 @@
return -ENODEV;
}
+ dvb_adapter->reg_mod = THIS_MODULE;
+
adapter = (struct adapter *) pci_get_drvdata(pdev);adapter->dvb_adapter = dvb_adapter;
diff -ru linuxtv-dvb-1.1.1/linux/drivers/media/dvb/dvb-core/dvb_net.c linuxtv-dvb-1.1.1.patched/linux/drivers/media/dvb/dvb-core/dvb_net.c
--- linuxtv-dvb-1.1.1/linux/drivers/media/dvb/dvb-core/dvb_net.c Mon Feb 23 16:08:36 2004
+++ linuxtv-dvb-1.1.1.patched/linux/drivers/media/dvb/dvb-core/dvb_net.c Thu Mar 18 11:59:34 2004
@@ -59,6 +59,8 @@
#define RX_MODE_PROMISC 3
struct work_struct set_multicast_list_wq;
struct work_struct restart_net_feed_wq;
+
+ struct module *reg_mod;
};
@@ -469,6 +471,8 @@ static void dvb_net_setup(struct net_device *dev) #endif { + struct dvb_net_priv *priv = dev->priv; + ether_setup(dev);
dev->open = dvb_net_open;
@@ -482,6 +486,9 @@
dev->mc_count = 0;
dev->hard_header_cache = NULL;+ if (priv->reg_mod)
+ dev->owner = priv->reg_mod;
+
dev->flags |= IFF_NOARP;
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
return 0;
@@ -536,6 +543,7 @@
priv->demux = demux;
priv->pid = pid;
priv->rx_mode = RX_MODE_UNI;
+ priv->reg_mod = dvbnet->dvbdev->adapter->reg_mod; INIT_WORK(&priv->set_multicast_list_wq, wq_set_multicast_list, net);
INIT_WORK(&priv->restart_net_feed_wq, wq_restart_net_feed, net);
@@ -575,6 +583,7 @@
priv->demux = dvbnet->demux;
priv->pid = pid;
priv->rx_mode = RX_MODE_UNI;
+ priv->reg_mod = dvbnet->dvbdev->adapter->reg_mod;INIT_WORK(&priv->set_multicast_list_wq, wq_set_multicast_list, net);
INIT_WORK(&priv->restart_net_feed_wq, wq_restart_net_feed, net);
diff -ru linuxtv-dvb-1.1.1/linux/drivers/media/dvb/dvb-core/dvbdev.c linuxtv-dvb-1.1.1.patched/linux/drivers/media/dvb/dvb-core/dvbdev.c
--- linuxtv-dvb-1.1.1/linux/drivers/media/dvb/dvb-core/dvbdev.c Wed Oct 15 07:58:07 2003
+++ linuxtv-dvb-1.1.1.patched/linux/drivers/media/dvb/dvb-core/dvbdev.c Thu Mar 18 11:59:34 2004
@@ -220,6 +220,9 @@
dvbdev->adapter = adap;
dvbdev->priv = priv;
+ if (adap->reg_mod && dvbdev->fops)
+ dvbdev->fops->owner = adap->reg_mod;
+
list_add_tail (&dvbdev->list_head, &adap->device_list);#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
diff -ru linuxtv-dvb-1.1.1/linux/drivers/media/dvb/dvb-core/dvbdev.h linuxtv-dvb-1.1.1.patched/linux/drivers/media/dvb/dvb-core/dvbdev.h
--- linuxtv-dvb-1.1.1/linux/drivers/media/dvb/dvb-core/dvbdev.h Tue Oct 14 05:11:03 2003
+++ linuxtv-dvb-1.1.1.patched/linux/drivers/media/dvb/dvb-core/dvbdev.h Thu Mar 18 11:59:34 2004
@@ -52,6 +52,10 @@
struct list_head device_list;
const char *name;
u8 proposed_mac [6];
+
+ /* registering module, used to increment the
+ use count of the correct module */
+ struct module *reg_mod;
};
Regards,
Hernan.
-- Info: To unsubscribe send a mail to [EMAIL PROTECTED] with "unsubscribe linux-dvb" as subject.
