aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWang Chen <wangchen@cn.fujitsu.com>2008-11-20 07:26:21 -0500
committerDavid S. Miller <davem@davemloft.net>2008-11-20 07:26:21 -0500
commit7be6065b39c3f1cfa796667eac1a2170465acc91 (patch)
tree973a5d4bc0782e25a29d96ecf99b216ab6175446
parent826dd0e1e3c83ce0cd8c295cd0f6e72b8b527809 (diff)
netdevice wanrouter: Convert directly reference of netdev->priv
1. Make device driver to allocate memory for netdev. 2. Convert all directly reference of netdev->priv to netdev_priv(). Signed-off-by: Wang Chen <wangchen@cn.fujitsu.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/wan/cycx_x25.c89
-rw-r--r--net/wanrouter/wanmain.c36
2 files changed, 55 insertions, 70 deletions
diff --git a/drivers/net/wan/cycx_x25.c b/drivers/net/wan/cycx_x25.c
index aeea321e4a9d..5fa52923efa8 100644
--- a/drivers/net/wan/cycx_x25.c
+++ b/drivers/net/wan/cycx_x25.c
@@ -199,6 +199,8 @@ static struct net_device *cycx_x25_get_dev_by_lcn(struct wan_device *wandev,
199static struct net_device * 199static struct net_device *
200 cycx_x25_get_dev_by_dte_addr(struct wan_device *wandev, char *dte); 200 cycx_x25_get_dev_by_dte_addr(struct wan_device *wandev, char *dte);
201 201
202static void cycx_x25_chan_setup(struct net_device *dev);
203
202#ifdef CYCLOMX_X25_DEBUG 204#ifdef CYCLOMX_X25_DEBUG
203static void hex_dump(char *msg, unsigned char *p, int len); 205static void hex_dump(char *msg, unsigned char *p, int len);
204static void cycx_x25_dump_config(struct cycx_x25_config *conf); 206static void cycx_x25_dump_config(struct cycx_x25_config *conf);
@@ -353,6 +355,12 @@ static int cycx_wan_update(struct wan_device *wandev)
353 return 0; 355 return 0;
354} 356}
355 357
358/* callback to initialize device */
359static void cycx_x25_chan_setup(struct net_device *dev)
360{
361 dev->init = cycx_netdevice_init;
362}
363
356/* Create new logical channel. 364/* Create new logical channel.
357 * This routine is called by the router when ROUTER_IFNEW IOCTL is being 365 * This routine is called by the router when ROUTER_IFNEW IOCTL is being
358 * handled. 366 * handled.
@@ -376,11 +384,12 @@ static int cycx_wan_new_if(struct wan_device *wandev, struct net_device *dev,
376 return -EINVAL; 384 return -EINVAL;
377 } 385 }
378 386
379 /* allocate and initialize private data */ 387 dev = alloc_netdev(sizeof(struct cycx_x25_channel), conf->name,
380 chan = kzalloc(sizeof(struct cycx_x25_channel), GFP_KERNEL); 388 cycx_x25_chan_setup);
381 if (!chan) 389 if (!dev)
382 return -ENOMEM; 390 return -ENOMEM;
383 391
392 chan = netdev_priv(dev);
384 strcpy(chan->name, conf->name); 393 strcpy(chan->name, conf->name);
385 chan->card = card; 394 chan->card = card;
386 chan->link = conf->port; 395 chan->link = conf->port;
@@ -396,14 +405,14 @@ static int cycx_wan_new_if(struct wan_device *wandev, struct net_device *dev,
396 if (len > WAN_ADDRESS_SZ) { 405 if (len > WAN_ADDRESS_SZ) {
397 printk(KERN_ERR "%s: %s local addr too long!\n", 406 printk(KERN_ERR "%s: %s local addr too long!\n",
398 wandev->name, chan->name); 407 wandev->name, chan->name);
399 kfree(chan); 408 err = -EINVAL;
400 return -EINVAL; 409 goto error;
401 } else { 410 } else {
402 chan->local_addr = kmalloc(len + 1, GFP_KERNEL); 411 chan->local_addr = kmalloc(len + 1, GFP_KERNEL);
403 412
404 if (!chan->local_addr) { 413 if (!chan->local_addr) {
405 kfree(chan); 414 err = -ENOMEM;
406 return -ENOMEM; 415 goto error;
407 } 416 }
408 } 417 }
409 418
@@ -429,41 +438,31 @@ static int cycx_wan_new_if(struct wan_device *wandev, struct net_device *dev,
429 "%s: PVC %u is out of range on interface %s!\n", 438 "%s: PVC %u is out of range on interface %s!\n",
430 wandev->name, lcn, chan->name); 439 wandev->name, lcn, chan->name);
431 err = -EINVAL; 440 err = -EINVAL;
441 goto error;
432 } 442 }
433 } else { 443 } else {
434 printk(KERN_ERR "%s: invalid media address on interface %s!\n", 444 printk(KERN_ERR "%s: invalid media address on interface %s!\n",
435 wandev->name, chan->name); 445 wandev->name, chan->name);
436 err = -EINVAL; 446 err = -EINVAL;
447 goto error;
437 } 448 }
438 449
439 if (err) {
440 kfree(chan->local_addr);
441 kfree(chan);
442 return err;
443 }
444
445 /* prepare network device data space for registration */
446 strcpy(dev->name, chan->name);
447 dev->init = cycx_netdevice_init;
448 dev->priv = chan;
449
450 return 0; 450 return 0;
451
452error:
453 free_netdev(dev);
454 return err;
451} 455}
452 456
453/* Delete logical channel. */ 457/* Delete logical channel. */
454static int cycx_wan_del_if(struct wan_device *wandev, struct net_device *dev) 458static int cycx_wan_del_if(struct wan_device *wandev, struct net_device *dev)
455{ 459{
456 if (dev->priv) { 460 struct cycx_x25_channel *chan = netdev_priv(dev);
457 struct cycx_x25_channel *chan = dev->priv;
458 461
459 if (chan->svc) { 462 if (chan->svc) {
460 kfree(chan->local_addr); 463 kfree(chan->local_addr);
461 if (chan->state == WAN_CONNECTED) 464 if (chan->state == WAN_CONNECTED)
462 del_timer(&chan->timer); 465 del_timer(&chan->timer);
463 }
464
465 kfree(chan);
466 dev->priv = NULL;
467 } 466 }
468 467
469 return 0; 468 return 0;
@@ -484,7 +483,7 @@ static const struct header_ops cycx_header_ops = {
484 * registration. */ 483 * registration. */
485static int cycx_netdevice_init(struct net_device *dev) 484static int cycx_netdevice_init(struct net_device *dev)
486{ 485{
487 struct cycx_x25_channel *chan = dev->priv; 486 struct cycx_x25_channel *chan = netdev_priv(dev);
488 struct cycx_device *card = chan->card; 487 struct cycx_device *card = chan->card;
489 struct wan_device *wandev = &card->wandev; 488 struct wan_device *wandev = &card->wandev;
490 489
@@ -542,7 +541,7 @@ static int cycx_netdevice_open(struct net_device *dev)
542 * o if there's no more open channels then disconnect physical link. */ 541 * o if there's no more open channels then disconnect physical link. */
543static int cycx_netdevice_stop(struct net_device *dev) 542static int cycx_netdevice_stop(struct net_device *dev)
544{ 543{
545 struct cycx_x25_channel *chan = dev->priv; 544 struct cycx_x25_channel *chan = netdev_priv(dev);
546 545
547 netif_stop_queue(dev); 546 netif_stop_queue(dev);
548 547
@@ -596,7 +595,7 @@ static int cycx_netdevice_rebuild_header(struct sk_buff *skb)
596static int cycx_netdevice_hard_start_xmit(struct sk_buff *skb, 595static int cycx_netdevice_hard_start_xmit(struct sk_buff *skb,
597 struct net_device *dev) 596 struct net_device *dev)
598{ 597{
599 struct cycx_x25_channel *chan = dev->priv; 598 struct cycx_x25_channel *chan = netdev_priv(dev);
600 struct cycx_device *card = chan->card; 599 struct cycx_device *card = chan->card;
601 600
602 if (!chan->svc) 601 if (!chan->svc)
@@ -670,7 +669,7 @@ free_packet:
670 * Return a pointer to struct net_device_stats */ 669 * Return a pointer to struct net_device_stats */
671static struct net_device_stats *cycx_netdevice_get_stats(struct net_device *dev) 670static struct net_device_stats *cycx_netdevice_get_stats(struct net_device *dev)
672{ 671{
673 struct cycx_x25_channel *chan = dev->priv; 672 struct cycx_x25_channel *chan = netdev_priv(dev);
674 673
675 return chan ? &chan->ifstats : NULL; 674 return chan ? &chan->ifstats : NULL;
676} 675}
@@ -783,7 +782,7 @@ static void cycx_x25_irq_rx(struct cycx_device *card, struct cycx_x25_cmd *cmd)
783 return; 782 return;
784 } 783 }
785 784
786 chan = dev->priv; 785 chan = netdev_priv(dev);
787 reset_timer(dev); 786 reset_timer(dev);
788 787
789 if (chan->drop_sequence) { 788 if (chan->drop_sequence) {
@@ -883,7 +882,7 @@ static void cycx_x25_irq_connect(struct cycx_device *card,
883 return; 882 return;
884 } 883 }
885 884
886 chan = dev->priv; 885 chan = netdev_priv(dev);
887 chan->lcn = lcn; 886 chan->lcn = lcn;
888 cycx_x25_connect_response(card, chan); 887 cycx_x25_connect_response(card, chan);
889 cycx_x25_set_chan_state(dev, WAN_CONNECTED); 888 cycx_x25_set_chan_state(dev, WAN_CONNECTED);
@@ -913,7 +912,7 @@ static void cycx_x25_irq_connect_confirm(struct cycx_device *card,
913 } 912 }
914 913
915 clear_bit(--key, (void*)&card->u.x.connection_keys); 914 clear_bit(--key, (void*)&card->u.x.connection_keys);
916 chan = dev->priv; 915 chan = netdev_priv(dev);
917 chan->lcn = lcn; 916 chan->lcn = lcn;
918 cycx_x25_set_chan_state(dev, WAN_CONNECTED); 917 cycx_x25_set_chan_state(dev, WAN_CONNECTED);
919} 918}
@@ -953,7 +952,7 @@ static void cycx_x25_irq_disconnect(struct cycx_device *card,
953 952
954 dev = cycx_x25_get_dev_by_lcn(wandev, lcn); 953 dev = cycx_x25_get_dev_by_lcn(wandev, lcn);
955 if (dev) { 954 if (dev) {
956 struct cycx_x25_channel *chan = dev->priv; 955 struct cycx_x25_channel *chan = netdev_priv(dev);
957 956
958 cycx_x25_disconnect_response(card, chan->link, lcn); 957 cycx_x25_disconnect_response(card, chan->link, lcn);
959 cycx_x25_set_chan_state(dev, WAN_DISCONNECTED); 958 cycx_x25_set_chan_state(dev, WAN_DISCONNECTED);
@@ -1301,7 +1300,7 @@ static struct net_device *cycx_x25_get_dev_by_lcn(struct wan_device *wandev,
1301 struct cycx_x25_channel *chan; 1300 struct cycx_x25_channel *chan;
1302 1301
1303 while (dev) { 1302 while (dev) {
1304 chan = (struct cycx_x25_channel*)dev->priv; 1303 chan = netdev_priv(dev);
1305 1304
1306 if (chan->lcn == lcn) 1305 if (chan->lcn == lcn)
1307 break; 1306 break;
@@ -1318,7 +1317,7 @@ static struct net_device *
1318 struct cycx_x25_channel *chan; 1317 struct cycx_x25_channel *chan;
1319 1318
1320 while (dev) { 1319 while (dev) {
1321 chan = (struct cycx_x25_channel*)dev->priv; 1320 chan = netdev_priv(dev);
1322 1321
1323 if (!strcmp(chan->addr, dte)) 1322 if (!strcmp(chan->addr, dte))
1324 break; 1323 break;
@@ -1336,7 +1335,7 @@ static struct net_device *
1336 * <0 failure */ 1335 * <0 failure */
1337static int cycx_x25_chan_connect(struct net_device *dev) 1336static int cycx_x25_chan_connect(struct net_device *dev)
1338{ 1337{
1339 struct cycx_x25_channel *chan = dev->priv; 1338 struct cycx_x25_channel *chan = netdev_priv(dev);
1340 struct cycx_device *card = chan->card; 1339 struct cycx_device *card = chan->card;
1341 1340
1342 if (chan->svc) { 1341 if (chan->svc) {
@@ -1361,7 +1360,7 @@ static int cycx_x25_chan_connect(struct net_device *dev)
1361 * o if SVC then clear X.25 call */ 1360 * o if SVC then clear X.25 call */
1362static void cycx_x25_chan_disconnect(struct net_device *dev) 1361static void cycx_x25_chan_disconnect(struct net_device *dev)
1363{ 1362{
1364 struct cycx_x25_channel *chan = dev->priv; 1363 struct cycx_x25_channel *chan = netdev_priv(dev);
1365 1364
1366 if (chan->svc) { 1365 if (chan->svc) {
1367 x25_clear_call(chan->card, chan->link, chan->lcn, 0, 0); 1366 x25_clear_call(chan->card, chan->link, chan->lcn, 0, 0);
@@ -1374,7 +1373,7 @@ static void cycx_x25_chan_disconnect(struct net_device *dev)
1374static void cycx_x25_chan_timer(unsigned long d) 1373static void cycx_x25_chan_timer(unsigned long d)
1375{ 1374{
1376 struct net_device *dev = (struct net_device *)d; 1375 struct net_device *dev = (struct net_device *)d;
1377 struct cycx_x25_channel *chan = dev->priv; 1376 struct cycx_x25_channel *chan = netdev_priv(dev);
1378 1377
1379 if (chan->state == WAN_CONNECTED) 1378 if (chan->state == WAN_CONNECTED)
1380 cycx_x25_chan_disconnect(dev); 1379 cycx_x25_chan_disconnect(dev);
@@ -1386,7 +1385,7 @@ static void cycx_x25_chan_timer(unsigned long d)
1386/* Set logical channel state. */ 1385/* Set logical channel state. */
1387static void cycx_x25_set_chan_state(struct net_device *dev, u8 state) 1386static void cycx_x25_set_chan_state(struct net_device *dev, u8 state)
1388{ 1387{
1389 struct cycx_x25_channel *chan = dev->priv; 1388 struct cycx_x25_channel *chan = netdev_priv(dev);
1390 struct cycx_device *card = chan->card; 1389 struct cycx_device *card = chan->card;
1391 unsigned long flags; 1390 unsigned long flags;
1392 char *string_state = NULL; 1391 char *string_state = NULL;
@@ -1452,7 +1451,7 @@ static void cycx_x25_set_chan_state(struct net_device *dev, u8 state)
1452 * to the router. */ 1451 * to the router. */
1453static int cycx_x25_chan_send(struct net_device *dev, struct sk_buff *skb) 1452static int cycx_x25_chan_send(struct net_device *dev, struct sk_buff *skb)
1454{ 1453{
1455 struct cycx_x25_channel *chan = dev->priv; 1454 struct cycx_x25_channel *chan = netdev_priv(dev);
1456 struct cycx_device *card = chan->card; 1455 struct cycx_device *card = chan->card;
1457 int bitm = 0; /* final packet */ 1456 int bitm = 0; /* final packet */
1458 unsigned len = skb->len; 1457 unsigned len = skb->len;
@@ -1545,7 +1544,7 @@ static unsigned dec_to_uint(u8 *str, int len)
1545 1544
1546static void reset_timer(struct net_device *dev) 1545static void reset_timer(struct net_device *dev)
1547{ 1546{
1548 struct cycx_x25_channel *chan = dev->priv; 1547 struct cycx_x25_channel *chan = netdev_priv(dev);
1549 1548
1550 if (chan->svc) 1549 if (chan->svc)
1551 mod_timer(&chan->timer, jiffies+chan->idle_tmout*HZ); 1550 mod_timer(&chan->timer, jiffies+chan->idle_tmout*HZ);
@@ -1598,7 +1597,7 @@ static void cycx_x25_dump_devs(struct wan_device *wandev)
1598 printk(KERN_INFO "---------------------------------------\n"); 1597 printk(KERN_INFO "---------------------------------------\n");
1599 1598
1600 while(dev) { 1599 while(dev) {
1601 struct cycx_x25_channel *chan = dev->priv; 1600 struct cycx_x25_channel *chan = netdev_priv(dev);
1602 1601
1603 printk(KERN_INFO "%-5.5s %-15.15s %d ETH_P_%s\n", 1602 printk(KERN_INFO "%-5.5s %-15.15s %d ETH_P_%s\n",
1604 chan->name, chan->addr, netif_queue_stopped(dev), 1603 chan->name, chan->addr, netif_queue_stopped(dev),
diff --git a/net/wanrouter/wanmain.c b/net/wanrouter/wanmain.c
index 7f07152bc109..39701dec1dba 100644
--- a/net/wanrouter/wanmain.c
+++ b/net/wanrouter/wanmain.c
@@ -60,6 +60,8 @@
60 60
61#define KMEM_SAFETYZONE 8 61#define KMEM_SAFETYZONE 8
62 62
63#define DEV_TO_SLAVE(dev) (*((struct net_device **)netdev_priv(dev)))
64
63/* 65/*
64 * Function Prototypes 66 * Function Prototypes
65 */ 67 */
@@ -511,7 +513,7 @@ static int wanrouter_device_shutdown(struct wan_device *wandev)
511 if (err) 513 if (err)
512 return err; 514 return err;
513 /* The above function deallocates the current dev 515 /* The above function deallocates the current dev
514 * structure. Therefore, we cannot use dev->priv 516 * structure. Therefore, we cannot use netdev_priv(dev)
515 * as the next element: wandev->dev points to the 517 * as the next element: wandev->dev points to the
516 * next element */ 518 * next element */
517 dev = wandev->dev; 519 dev = wandev->dev;
@@ -589,10 +591,6 @@ static int wanrouter_device_new_if(struct wan_device *wandev,
589 err = -EPROTONOSUPPORT; 591 err = -EPROTONOSUPPORT;
590 goto out; 592 goto out;
591 } else { 593 } else {
592 dev = kzalloc(sizeof(struct net_device), GFP_KERNEL);
593 err = -ENOBUFS;
594 if (dev == NULL)
595 goto out;
596 err = wandev->new_if(wandev, dev, cnf); 594 err = wandev->new_if(wandev, dev, cnf);
597 } 595 }
598 596
@@ -622,10 +620,9 @@ static int wanrouter_device_new_if(struct wan_device *wandev,
622 wandev->dev = dev; 620 wandev->dev = dev;
623 } else { 621 } else {
624 for (slave=wandev->dev; 622 for (slave=wandev->dev;
625 *((struct net_device **)slave->priv); 623 DEV_TO_SLAVE(slave);
626 slave = *((struct net_device **)slave->priv)); 624 slave = DEV_TO_SLAVE(slave))
627 625 DEV_TO_SLAVE(slave) = dev;
628 *((struct net_device **)slave->priv) = dev;
629 } 626 }
630 ++wandev->ndev; 627 ++wandev->ndev;
631 628
@@ -636,15 +633,9 @@ static int wanrouter_device_new_if(struct wan_device *wandev,
636 } 633 }
637 if (wandev->del_if) 634 if (wandev->del_if)
638 wandev->del_if(wandev, dev); 635 wandev->del_if(wandev, dev);
636 free_netdev(dev);
639 } 637 }
640 638
641 /* This code has moved from del_if() function */
642 kfree(dev->priv);
643 dev->priv = NULL;
644
645 /* Sync PPP is disabled */
646 if (cnf->config_id != WANCONFIG_MPPP)
647 kfree(dev);
648out: 639out:
649 kfree(cnf); 640 kfree(cnf);
650 return err; 641 return err;
@@ -734,7 +725,7 @@ static int wanrouter_delete_interface(struct wan_device *wandev, char *name)
734 dev = wandev->dev; 725 dev = wandev->dev;
735 prev = NULL; 726 prev = NULL;
736 while (dev && strcmp(name, dev->name)) { 727 while (dev && strcmp(name, dev->name)) {
737 struct net_device **slave = dev->priv; 728 struct net_device **slave = netdev_priv(dev);
738 prev = dev; 729 prev = dev;
739 dev = *slave; 730 dev = *slave;
740 } 731 }
@@ -751,12 +742,12 @@ static int wanrouter_delete_interface(struct wan_device *wandev, char *name)
751 742
752 lock_adapter_irq(&wandev->lock, &smp_flags); 743 lock_adapter_irq(&wandev->lock, &smp_flags);
753 if (prev) { 744 if (prev) {
754 struct net_device **prev_slave = prev->priv; 745 struct net_device **prev_slave = netdev_priv(prev);
755 struct net_device **slave = dev->priv; 746 struct net_device **slave = netdev_priv(dev);
756 747
757 *prev_slave = *slave; 748 *prev_slave = *slave;
758 } else { 749 } else {
759 struct net_device **slave = dev->priv; 750 struct net_device **slave = netdev_priv(dev);
760 wandev->dev = *slave; 751 wandev->dev = *slave;
761 } 752 }
762 --wandev->ndev; 753 --wandev->ndev;
@@ -764,11 +755,6 @@ static int wanrouter_delete_interface(struct wan_device *wandev, char *name)
764 755
765 printk(KERN_INFO "%s: unregistering '%s'\n", wandev->name, dev->name); 756 printk(KERN_INFO "%s: unregistering '%s'\n", wandev->name, dev->name);
766 757
767 /* Due to new interface linking method using dev->priv,
768 * this code has moved from del_if() function.*/
769 kfree(dev->priv);
770 dev->priv=NULL;
771
772 unregister_netdev(dev); 758 unregister_netdev(dev);
773 759
774 free_netdev(dev); 760 free_netdev(dev);