Messages in this thread Patch in this message | | | Subject | [PATCH 4/7] Fix DVB network device handling | Date | Thu, 9 Oct 2003 12:47:55 +0200 | From | Michael Hunold (LinuxTV.org CVS maintainer) <> |
| |
- [DVB] simplify and sanitize add/del handling for dvb net devices diff -uNrwB --new-file linux-2.6.0-test7/drivers/media/dvb/dvb-core/dvb_net.c linux-2.6.0-test7-patch/drivers/media/dvb/dvb-core/dvb_net.c --- linux-2.6.0-test7/drivers/media/dvb/dvb-core/dvb_net.c 2003-10-09 10:40:19.000000000 +0200 +++ linux-2.6.0-test7-patch/drivers/media/dvb/dvb-core/dvb_net.c 2003-09-10 12:38:22.000000000 +0200 @@ -456,7 +463,7 @@ } -static void dvb_net_setup(struct net_device *dev) +static int dvb_net_init_dev (struct net_device *dev) { ether_setup(dev); @@ -472,8 +479,11 @@ dev->hard_header_cache = NULL; dev->flags |= IFF_NOARP; + + return 0; } + static int get_if(struct dvb_net *dvbnet) { int i; @@ -493,6 +503,7 @@ static int dvb_net_add_if(struct dvb_net *dvbnet, u16 pid) { struct net_device *net; + struct dmx_demux *demux; struct dvb_net_priv *priv; int result; int if_num; @@ -500,20 +511,25 @@ if ((if_num = get_if(dvbnet)) < 0) return -EINVAL; - net = alloc_netdev(sizeof(struct dvb_net_priv), "dvb", - dvb_net_setup); - if (!net) - return -ENOMEM; + net = &dvbnet->device[if_num]; + demux = dvbnet->demux; - sprintf(net->name, "dvb%d_%d", dvbnet->dvbdev->adapter->num, if_num); + memset(net, 0, sizeof(struct net_device)); + memcpy(net->name, "dvb0_0", 7); + net->name[3] = dvbnet->dvbdev->adapter->num + '0'; + net->name[5] = if_num + '0'; net->addr_len = 6; memcpy(net->dev_addr, dvbnet->dvbdev->adapter->proposed_mac, 6); + net->next = NULL; + net->init = dvb_net_init_dev; - dvbnet->device[if_num] = net; + if (!(net->priv = kmalloc(sizeof(struct dvb_net_priv), GFP_KERNEL))) + return -ENOMEM; priv = net->priv; - priv->demux = dvbnet->demux; + memset(priv, 0, sizeof(struct dvb_net_priv)); + priv->demux = demux; priv->pid = pid; priv->rx_mode = RX_MODE_UNI; @@ -523,7 +539,6 @@ net->base_addr = pid; if ((result = register_netdev(net)) < 0) { - kfree(net); return result; } @@ -533,20 +548,18 @@ static int dvb_net_remove_if(struct dvb_net *dvbnet, int num) { - struct net_device *net = dvbnet->device[num]; - struct dvb_net_priv *priv = net->priv; + struct dvb_net_priv *priv = dvbnet->device[num].priv; if (!dvbnet->state[num]) return -EINVAL; if (priv->in_use) return -EBUSY; - dvb_net_stop(net); + dvb_net_stop(&dvbnet->device[num]); flush_scheduled_work(); - unregister_netdev(net); + kfree(priv); + unregister_netdev(&dvbnet->device[num]); dvbnet->state[num]=0; - free_netdev(net); - return 0; } diff -uNrwB --new-file linux-2.6.0-test7/drivers/media/dvb/dvb-core/dvb_net.h linux-2.6.0-test7-patch/drivers/media/dvb/dvb-core/dvb_net.h --- linux-2.6.0-test7/drivers/media/dvb/dvb-core/dvb_net.h 2003-10-09 10:40:19.000000000 +0200 +++ linux-2.6.0-test7-patch/drivers/media/dvb/dvb-core/dvb_net.h 2003-08-25 12:16:12.000000000 +0200 @@ -34,7 +34,7 @@ struct dvb_net { 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]; struct dmx_demux *demux; }; - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |