diff options
| author | Stephen Hemminger <shemminger@vyatta.com> | 2008-11-20 00:32:24 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2008-11-20 00:32:24 -0500 |
| commit | d314774cf2cd5dfeb39a00d37deee65d4c627927 (patch) | |
| tree | 1c7778b509cea814aa2b7115949667941037d07c | |
| parent | 6b41e7dd90c6a628ab5fb8d781302d60a243b2ce (diff) | |
netdev: network device operations infrastructure
This patch changes the network device internal API to move adminstrative
operations out of the network device structure and into a separate structure.
This patch involves some hackery to maintain compatablity between the
new and old model, so all 300+ drivers don't have to be changed at once.
For drivers that aren't converted yet, the netdevice_ops virt function list
still resides in the net_device structure. For old protocols, the new
net_device_ops are copied out to the old net_device pointers.
After the transistion is completed the nag message can be changed to
an WARN_ON, and the compatiablity code can be made configurable.
Some function pointers aren't moved:
* destructor can't be in net_device_ops because
it may need to be referenced after the module is unloaded.
* neighbor setup is manipulated in a couple of places that need special
consideration
* hard_start_xmit is in the fast path for transmit.
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | include/linux/netdevice.h | 232 | ||||
| -rw-r--r-- | net/Kconfig | 3 | ||||
| -rw-r--r-- | net/core/dev.c | 109 | ||||
| -rw-r--r-- | net/core/netpoll.c | 7 | ||||
| -rw-r--r-- | net/core/rtnetlink.c | 9 | ||||
| -rw-r--r-- | net/sched/sch_generic.c | 4 |
6 files changed, 259 insertions, 105 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 12d7f4469dc9..9060f5f3517a 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -451,6 +451,131 @@ struct netdev_queue { | |||
| 451 | struct Qdisc *qdisc_sleeping; | 451 | struct Qdisc *qdisc_sleeping; |
| 452 | } ____cacheline_aligned_in_smp; | 452 | } ____cacheline_aligned_in_smp; |
| 453 | 453 | ||
| 454 | |||
| 455 | /* | ||
| 456 | * This structure defines the management hooks for network devices. | ||
| 457 | * The following hooks can bed defined and are optonal (can be null) | ||
| 458 | * unless otherwise noted. | ||
| 459 | * | ||
| 460 | * int (*ndo_init)(struct net_device *dev); | ||
| 461 | * This function is called once when network device is registered. | ||
| 462 | * The network device can use this to any late stage initializaton | ||
| 463 | * or semantic validattion. It can fail with an error code which will | ||
| 464 | * be propogated back to register_netdev | ||
| 465 | * | ||
| 466 | * void (*ndo_uninit)(struct net_device *dev); | ||
| 467 | * This function is called when device is unregistered or when registration | ||
| 468 | * fails. It is not called if init fails. | ||
| 469 | * | ||
| 470 | * int (*ndo_open)(struct net_device *dev); | ||
| 471 | * This function is called when network device transistions to the up | ||
| 472 | * state. | ||
| 473 | * | ||
| 474 | * int (*ndo_stop)(struct net_device *dev); | ||
| 475 | * This function is called when network device transistions to the down | ||
| 476 | * state. | ||
| 477 | * | ||
| 478 | * void (*ndo_change_rx_flags)(struct net_device *dev, int flags); | ||
| 479 | * This function is called to allow device receiver to make | ||
| 480 | * changes to configuration when multicast or promiscious is enabled. | ||
| 481 | * | ||
| 482 | * void (*ndo_set_rx_mode)(struct net_device *dev); | ||
| 483 | * This function is called device changes address list filtering. | ||
| 484 | * | ||
| 485 | * void (*ndo_set_multicast_list)(struct net_device *dev); | ||
| 486 | * This function is called when the multicast address list changes. | ||
| 487 | * | ||
| 488 | * int (*ndo_set_mac_address)(struct net_device *dev, void *addr); | ||
| 489 | * This function is called when the Media Access Control address | ||
| 490 | * needs to be changed. If not this interface is not defined, the | ||
| 491 | * mac address can not be changed. | ||
| 492 | * | ||
| 493 | * int (*ndo_validate_addr)(struct net_device *dev); | ||
| 494 | * Test if Media Access Control address is valid for the device. | ||
| 495 | * | ||
| 496 | * int (*ndo_do_ioctl)(struct net_device *dev, struct ifreq *ifr, int cmd); | ||
| 497 | * Called when a user request an ioctl which can't be handled by | ||
| 498 | * the generic interface code. If not defined ioctl's return | ||
| 499 | * not supported error code. | ||
| 500 | * | ||
| 501 | * int (*ndo_set_config)(struct net_device *dev, struct ifmap *map); | ||
| 502 | * Used to set network devices bus interface parameters. This interface | ||
| 503 | * is retained for legacy reason, new devices should use the bus | ||
| 504 | * interface (PCI) for low level management. | ||
| 505 | * | ||
| 506 | * int (*ndo_change_mtu)(struct net_device *dev, int new_mtu); | ||
| 507 | * Called when a user wants to change the Maximum Transfer Unit | ||
| 508 | * of a device. If not defined, any request to change MTU will | ||
| 509 | * will return an error. | ||
| 510 | * | ||
| 511 | * void (*ndo_tx_timeout) (struct net_device *dev); | ||
| 512 | * Callback uses when the transmitter has not made any progress | ||
| 513 | * for dev->watchdog ticks. | ||
| 514 | * | ||
| 515 | * struct net_device_stats* (*get_stats)(struct net_device *dev); | ||
| 516 | * Called when a user wants to get the network device usage | ||
| 517 | * statistics. If not defined, the counters in dev->stats will | ||
| 518 | * be used. | ||
| 519 | * | ||
| 520 | * void (*ndo_vlan_rx_register)(struct net_device *dev, struct vlan_group *grp); | ||
| 521 | * If device support VLAN receive accleration | ||
| 522 | * (ie. dev->features & NETIF_F_HW_VLAN_RX), then this function is called | ||
| 523 | * when vlan groups for the device changes. Note: grp is NULL | ||
| 524 | * if no vlan's groups are being used. | ||
| 525 | * | ||
| 526 | * void (*ndo_vlan_rx_add_vid)(struct net_device *dev, unsigned short vid); | ||
| 527 | * If device support VLAN filtering (dev->features & NETIF_F_HW_VLAN_FILTER) | ||
| 528 | * this function is called when a VLAN id is registered. | ||
| 529 | * | ||
| 530 | * void (*ndo_vlan_rx_kill_vid)(struct net_device *dev, unsigned short vid); | ||
| 531 | * If device support VLAN filtering (dev->features & NETIF_F_HW_VLAN_FILTER) | ||
| 532 | * this function is called when a VLAN id is unregistered. | ||
| 533 | * | ||
| 534 | * void (*ndo_poll_controller)(struct net_device *dev); | ||
| 535 | */ | ||
| 536 | struct net_device_ops { | ||
| 537 | int (*ndo_init)(struct net_device *dev); | ||
| 538 | void (*ndo_uninit)(struct net_device *dev); | ||
| 539 | int (*ndo_open)(struct net_device *dev); | ||
| 540 | int (*ndo_stop)(struct net_device *dev); | ||
| 541 | #define HAVE_CHANGE_RX_FLAGS | ||
| 542 | void (*ndo_change_rx_flags)(struct net_device *dev, | ||
| 543 | int flags); | ||
| 544 | #define HAVE_SET_RX_MODE | ||
| 545 | void (*ndo_set_rx_mode)(struct net_device *dev); | ||
| 546 | #define HAVE_MULTICAST | ||
| 547 | void (*ndo_set_multicast_list)(struct net_device *dev); | ||
| 548 | #define HAVE_SET_MAC_ADDR | ||
| 549 | int (*ndo_set_mac_address)(struct net_device *dev, | ||
| 550 | void *addr); | ||
| 551 | #define HAVE_VALIDATE_ADDR | ||
| 552 | int (*ndo_validate_addr)(struct net_device *dev); | ||
| 553 | #define HAVE_PRIVATE_IOCTL | ||
| 554 | int (*ndo_do_ioctl)(struct net_device *dev, | ||
| 555 | struct ifreq *ifr, int cmd); | ||
| 556 | #define HAVE_SET_CONFIG | ||
| 557 | int (*ndo_set_config)(struct net_device *dev, | ||
| 558 | struct ifmap *map); | ||
| 559 | #define HAVE_CHANGE_MTU | ||
| 560 | int (*ndo_change_mtu)(struct net_device *dev, int new_mtu); | ||
| 561 | |||
| 562 | #define HAVE_TX_TIMEOUT | ||
| 563 | void (*ndo_tx_timeout) (struct net_device *dev); | ||
| 564 | |||
| 565 | struct net_device_stats* (*ndo_get_stats)(struct net_device *dev); | ||
| 566 | |||
| 567 | void (*ndo_vlan_rx_register)(struct net_device *dev, | ||
| 568 | struct vlan_group *grp); | ||
| 569 | void (*ndo_vlan_rx_add_vid)(struct net_device *dev, | ||
| 570 | unsigned short vid); | ||
| 571 | void (*ndo_vlan_rx_kill_vid)(struct net_device *dev, | ||
| 572 | unsigned short vid); | ||
| 573 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
| 574 | #define HAVE_NETDEV_POLL | ||
| 575 | void (*ndo_poll_controller)(struct net_device *dev); | ||
| 576 | #endif | ||
| 577 | }; | ||
| 578 | |||
| 454 | /* | 579 | /* |
| 455 | * The DEVICE structure. | 580 | * The DEVICE structure. |
| 456 | * Actually, this whole structure is a big mistake. It mixes I/O | 581 | * Actually, this whole structure is a big mistake. It mixes I/O |
| @@ -498,11 +623,6 @@ struct net_device | |||
| 498 | #ifdef CONFIG_NETPOLL | 623 | #ifdef CONFIG_NETPOLL |
| 499 | struct list_head napi_list; | 624 | struct list_head napi_list; |
| 500 | #endif | 625 | #endif |
| 501 | |||
| 502 | /* The device initialization function. Called only once. */ | ||
| 503 | int (*init)(struct net_device *dev); | ||
| 504 | |||
| 505 | /* ------- Fields preinitialized in Space.c finish here ------- */ | ||
| 506 | 626 | ||
| 507 | /* Net device features */ | 627 | /* Net device features */ |
| 508 | unsigned long features; | 628 | unsigned long features; |
| @@ -546,15 +666,13 @@ struct net_device | |||
| 546 | * for all in netdev_increment_features. | 666 | * for all in netdev_increment_features. |
| 547 | */ | 667 | */ |
| 548 | #define NETIF_F_ONE_FOR_ALL (NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ROBUST | \ | 668 | #define NETIF_F_ONE_FOR_ALL (NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ROBUST | \ |
| 549 | NETIF_F_SG | NETIF_F_HIGHDMA | \ | 669 | NETIF_F_SG | NETIF_F_HIGHDMA | \ |
| 550 | NETIF_F_FRAGLIST) | 670 | NETIF_F_FRAGLIST) |
| 551 | 671 | ||
| 552 | /* Interface index. Unique device identifier */ | 672 | /* Interface index. Unique device identifier */ |
| 553 | int ifindex; | 673 | int ifindex; |
| 554 | int iflink; | 674 | int iflink; |
| 555 | 675 | ||
| 556 | |||
| 557 | struct net_device_stats* (*get_stats)(struct net_device *dev); | ||
| 558 | struct net_device_stats stats; | 676 | struct net_device_stats stats; |
| 559 | 677 | ||
| 560 | #ifdef CONFIG_WIRELESS_EXT | 678 | #ifdef CONFIG_WIRELESS_EXT |
| @@ -564,18 +682,13 @@ struct net_device | |||
| 564 | /* Instance data managed by the core of Wireless Extensions. */ | 682 | /* Instance data managed by the core of Wireless Extensions. */ |
| 565 | struct iw_public_data * wireless_data; | 683 | struct iw_public_data * wireless_data; |
| 566 | #endif | 684 | #endif |
| 685 | /* Management operations */ | ||
| 686 | const struct net_device_ops *netdev_ops; | ||
| 567 | const struct ethtool_ops *ethtool_ops; | 687 | const struct ethtool_ops *ethtool_ops; |
| 568 | 688 | ||
| 569 | /* Hardware header description */ | 689 | /* Hardware header description */ |
| 570 | const struct header_ops *header_ops; | 690 | const struct header_ops *header_ops; |
| 571 | 691 | ||
| 572 | /* | ||
| 573 | * This marks the end of the "visible" part of the structure. All | ||
| 574 | * fields hereafter are internal to the system, and may change at | ||
| 575 | * will (read: may be cleaned up at will). | ||
| 576 | */ | ||
| 577 | |||
| 578 | |||
| 579 | unsigned int flags; /* interface flags (a la BSD) */ | 692 | unsigned int flags; /* interface flags (a la BSD) */ |
| 580 | unsigned short gflags; | 693 | unsigned short gflags; |
| 581 | unsigned short priv_flags; /* Like 'flags' but invisible to userspace. */ | 694 | unsigned short priv_flags; /* Like 'flags' but invisible to userspace. */ |
| @@ -634,7 +747,7 @@ struct net_device | |||
| 634 | unsigned long last_rx; /* Time of last Rx */ | 747 | unsigned long last_rx; /* Time of last Rx */ |
| 635 | /* Interface address info used in eth_type_trans() */ | 748 | /* Interface address info used in eth_type_trans() */ |
| 636 | unsigned char dev_addr[MAX_ADDR_LEN]; /* hw address, (before bcast | 749 | unsigned char dev_addr[MAX_ADDR_LEN]; /* hw address, (before bcast |
| 637 | because most packets are unicast) */ | 750 | because most packets are unicast) */ |
| 638 | 751 | ||
| 639 | unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */ | 752 | unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */ |
| 640 | 753 | ||
| @@ -648,6 +761,10 @@ struct net_device | |||
| 648 | /* Number of TX queues currently active in device */ | 761 | /* Number of TX queues currently active in device */ |
| 649 | unsigned int real_num_tx_queues; | 762 | unsigned int real_num_tx_queues; |
| 650 | 763 | ||
| 764 | /* Map buffer to appropriate transmit queue */ | ||
| 765 | u16 (*select_queue)(struct net_device *dev, | ||
| 766 | struct sk_buff *skb); | ||
| 767 | |||
| 651 | unsigned long tx_queue_len; /* Max frames per queue allowed */ | 768 | unsigned long tx_queue_len; /* Max frames per queue allowed */ |
| 652 | spinlock_t tx_global_lock; | 769 | spinlock_t tx_global_lock; |
| 653 | /* | 770 | /* |
| @@ -662,9 +779,6 @@ struct net_device | |||
| 662 | int watchdog_timeo; /* used by dev_watchdog() */ | 779 | int watchdog_timeo; /* used by dev_watchdog() */ |
| 663 | struct timer_list watchdog_timer; | 780 | struct timer_list watchdog_timer; |
| 664 | 781 | ||
| 665 | /* | ||
| 666 | * refcnt is a very hot point, so align it on SMP | ||
| 667 | */ | ||
| 668 | /* Number of references to this device */ | 782 | /* Number of references to this device */ |
| 669 | atomic_t refcnt ____cacheline_aligned_in_smp; | 783 | atomic_t refcnt ____cacheline_aligned_in_smp; |
| 670 | 784 | ||
| @@ -683,56 +797,14 @@ struct net_device | |||
| 683 | NETREG_RELEASED, /* called free_netdev */ | 797 | NETREG_RELEASED, /* called free_netdev */ |
| 684 | } reg_state; | 798 | } reg_state; |
| 685 | 799 | ||
| 686 | /* Called after device is detached from network. */ | 800 | /* Called from unregister, can be used to call free_netdev */ |
| 687 | void (*uninit)(struct net_device *dev); | 801 | void (*destructor)(struct net_device *dev); |
| 688 | /* Called after last user reference disappears. */ | ||
| 689 | void (*destructor)(struct net_device *dev); | ||
| 690 | 802 | ||
| 691 | /* Pointers to interface service routines. */ | 803 | int (*neigh_setup)(struct net_device *dev, struct neigh_parms *); |
| 692 | int (*open)(struct net_device *dev); | ||
| 693 | int (*stop)(struct net_device *dev); | ||
| 694 | #define HAVE_NETDEV_POLL | ||
| 695 | #define HAVE_CHANGE_RX_FLAGS | ||
| 696 | void (*change_rx_flags)(struct net_device *dev, | ||
| 697 | int flags); | ||
| 698 | #define HAVE_SET_RX_MODE | ||
| 699 | void (*set_rx_mode)(struct net_device *dev); | ||
| 700 | #define HAVE_MULTICAST | ||
| 701 | void (*set_multicast_list)(struct net_device *dev); | ||
| 702 | #define HAVE_SET_MAC_ADDR | ||
| 703 | int (*set_mac_address)(struct net_device *dev, | ||
| 704 | void *addr); | ||
| 705 | #define HAVE_VALIDATE_ADDR | ||
| 706 | int (*validate_addr)(struct net_device *dev); | ||
| 707 | #define HAVE_PRIVATE_IOCTL | ||
| 708 | int (*do_ioctl)(struct net_device *dev, | ||
| 709 | struct ifreq *ifr, int cmd); | ||
| 710 | #define HAVE_SET_CONFIG | ||
| 711 | int (*set_config)(struct net_device *dev, | ||
| 712 | struct ifmap *map); | ||
| 713 | #define HAVE_CHANGE_MTU | ||
| 714 | int (*change_mtu)(struct net_device *dev, int new_mtu); | ||
| 715 | 804 | ||
| 716 | #define HAVE_TX_TIMEOUT | ||
| 717 | void (*tx_timeout) (struct net_device *dev); | ||
| 718 | |||
| 719 | void (*vlan_rx_register)(struct net_device *dev, | ||
| 720 | struct vlan_group *grp); | ||
| 721 | void (*vlan_rx_add_vid)(struct net_device *dev, | ||
| 722 | unsigned short vid); | ||
| 723 | void (*vlan_rx_kill_vid)(struct net_device *dev, | ||
| 724 | unsigned short vid); | ||
| 725 | |||
| 726 | int (*neigh_setup)(struct net_device *dev, struct neigh_parms *); | ||
| 727 | #ifdef CONFIG_NETPOLL | 805 | #ifdef CONFIG_NETPOLL |
| 728 | struct netpoll_info *npinfo; | 806 | struct netpoll_info *npinfo; |
| 729 | #endif | 807 | #endif |
| 730 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
| 731 | void (*poll_controller)(struct net_device *dev); | ||
| 732 | #endif | ||
| 733 | |||
| 734 | u16 (*select_queue)(struct net_device *dev, | ||
| 735 | struct sk_buff *skb); | ||
| 736 | 808 | ||
| 737 | #ifdef CONFIG_NET_NS | 809 | #ifdef CONFIG_NET_NS |
| 738 | /* Network namespace this network device is inside */ | 810 | /* Network namespace this network device is inside */ |
| @@ -763,6 +835,38 @@ struct net_device | |||
| 763 | /* for setting kernel sock attribute on TCP connection setup */ | 835 | /* for setting kernel sock attribute on TCP connection setup */ |
| 764 | #define GSO_MAX_SIZE 65536 | 836 | #define GSO_MAX_SIZE 65536 |
| 765 | unsigned int gso_max_size; | 837 | unsigned int gso_max_size; |
| 838 | |||
| 839 | #ifdef CONFIG_COMPAT_NET_DEV_OPS | ||
| 840 | struct { | ||
| 841 | int (*init)(struct net_device *dev); | ||
| 842 | void (*uninit)(struct net_device *dev); | ||
| 843 | int (*open)(struct net_device *dev); | ||
| 844 | int (*stop)(struct net_device *dev); | ||
| 845 | void (*change_rx_flags)(struct net_device *dev, | ||
| 846 | int flags); | ||
| 847 | void (*set_rx_mode)(struct net_device *dev); | ||
| 848 | void (*set_multicast_list)(struct net_device *dev); | ||
| 849 | int (*set_mac_address)(struct net_device *dev, | ||
| 850 | void *addr); | ||
| 851 | int (*validate_addr)(struct net_device *dev); | ||
| 852 | int (*do_ioctl)(struct net_device *dev, | ||
| 853 | struct ifreq *ifr, int cmd); | ||
| 854 | int (*set_config)(struct net_device *dev, | ||
| 855 | struct ifmap *map); | ||
| 856 | int (*change_mtu)(struct net_device *dev, int new_mtu); | ||
| 857 | void (*tx_timeout) (struct net_device *dev); | ||
| 858 | struct net_device_stats* (*get_stats)(struct net_device *dev); | ||
| 859 | void (*vlan_rx_register)(struct net_device *dev, | ||
| 860 | struct vlan_group *grp); | ||
| 861 | void (*vlan_rx_add_vid)(struct net_device *dev, | ||
| 862 | unsigned short vid); | ||
| 863 | void (*vlan_rx_kill_vid)(struct net_device *dev, | ||
| 864 | unsigned short vid); | ||
| 865 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
| 866 | void (*poll_controller)(struct net_device *dev); | ||
| 867 | #endif | ||
| 868 | #endif | ||
| 869 | }; | ||
| 766 | }; | 870 | }; |
| 767 | #define to_net_dev(d) container_of(d, struct net_device, dev) | 871 | #define to_net_dev(d) container_of(d, struct net_device, dev) |
| 768 | 872 | ||
diff --git a/net/Kconfig b/net/Kconfig index 8c3d97ca0d96..4e2e40ba8ba6 100644 --- a/net/Kconfig +++ b/net/Kconfig | |||
| @@ -32,6 +32,9 @@ config NET_NS | |||
| 32 | Allow user space to create what appear to be multiple instances | 32 | Allow user space to create what appear to be multiple instances |
| 33 | of the network stack. | 33 | of the network stack. |
| 34 | 34 | ||
| 35 | config COMPAT_NET_DEV_OPS | ||
| 36 | def_bool y | ||
| 37 | |||
| 35 | source "net/packet/Kconfig" | 38 | source "net/packet/Kconfig" |
| 36 | source "net/unix/Kconfig" | 39 | source "net/unix/Kconfig" |
| 37 | source "net/xfrm/Kconfig" | 40 | source "net/xfrm/Kconfig" |
diff --git a/net/core/dev.c b/net/core/dev.c index e08c0fcd603b..ca14ab407b33 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -1059,6 +1059,7 @@ void dev_load(struct net *net, const char *name) | |||
| 1059 | */ | 1059 | */ |
| 1060 | int dev_open(struct net_device *dev) | 1060 | int dev_open(struct net_device *dev) |
| 1061 | { | 1061 | { |
| 1062 | const struct net_device_ops *ops = dev->netdev_ops; | ||
| 1062 | int ret = 0; | 1063 | int ret = 0; |
| 1063 | 1064 | ||
| 1064 | ASSERT_RTNL(); | 1065 | ASSERT_RTNL(); |
| @@ -1081,11 +1082,11 @@ int dev_open(struct net_device *dev) | |||
| 1081 | */ | 1082 | */ |
| 1082 | set_bit(__LINK_STATE_START, &dev->state); | 1083 | set_bit(__LINK_STATE_START, &dev->state); |
| 1083 | 1084 | ||
| 1084 | if (dev->validate_addr) | 1085 | if (ops->ndo_validate_addr) |
| 1085 | ret = dev->validate_addr(dev); | 1086 | ret = ops->ndo_validate_addr(dev); |
| 1086 | 1087 | ||
| 1087 | if (!ret && dev->open) | 1088 | if (!ret && ops->ndo_open) |
| 1088 | ret = dev->open(dev); | 1089 | ret = ops->ndo_open(dev); |
| 1089 | 1090 | ||
| 1090 | /* | 1091 | /* |
| 1091 | * If it went open OK then: | 1092 | * If it went open OK then: |
| @@ -1129,6 +1130,7 @@ int dev_open(struct net_device *dev) | |||
| 1129 | */ | 1130 | */ |
| 1130 | int dev_close(struct net_device *dev) | 1131 | int dev_close(struct net_device *dev) |
| 1131 | { | 1132 | { |
| 1133 | const struct net_device_ops *ops = dev->netdev_ops; | ||
| 1132 | ASSERT_RTNL(); | 1134 | ASSERT_RTNL(); |
| 1133 | 1135 | ||
| 1134 | might_sleep(); | 1136 | might_sleep(); |
| @@ -1161,8 +1163,8 @@ int dev_close(struct net_device *dev) | |||
| 1161 | * We allow it to be called even after a DETACH hot-plug | 1163 | * We allow it to be called even after a DETACH hot-plug |
| 1162 | * event. | 1164 | * event. |
| 1163 | */ | 1165 | */ |
| 1164 | if (dev->stop) | 1166 | if (ops->ndo_stop) |
| 1165 | dev->stop(dev); | 1167 | ops->ndo_stop(dev); |
| 1166 | 1168 | ||
| 1167 | /* | 1169 | /* |
| 1168 | * Device is now down. | 1170 | * Device is now down. |
| @@ -2930,8 +2932,10 @@ int netdev_set_master(struct net_device *slave, struct net_device *master) | |||
| 2930 | 2932 | ||
| 2931 | static void dev_change_rx_flags(struct net_device *dev, int flags) | 2933 | static void dev_change_rx_flags(struct net_device *dev, int flags) |
| 2932 | { | 2934 | { |
| 2933 | if (dev->flags & IFF_UP && dev->change_rx_flags) | 2935 | const struct net_device_ops *ops = dev->netdev_ops; |
| 2934 | dev->change_rx_flags(dev, flags); | 2936 | |
| 2937 | if ((dev->flags & IFF_UP) && ops->ndo_change_rx_flags) | ||
| 2938 | ops->ndo_change_rx_flags(dev, flags); | ||
| 2935 | } | 2939 | } |
| 2936 | 2940 | ||
| 2937 | static int __dev_set_promiscuity(struct net_device *dev, int inc) | 2941 | static int __dev_set_promiscuity(struct net_device *dev, int inc) |
| @@ -3051,6 +3055,8 @@ int dev_set_allmulti(struct net_device *dev, int inc) | |||
| 3051 | */ | 3055 | */ |
| 3052 | void __dev_set_rx_mode(struct net_device *dev) | 3056 | void __dev_set_rx_mode(struct net_device *dev) |
| 3053 | { | 3057 | { |
| 3058 | const struct net_device_ops *ops = dev->netdev_ops; | ||
| 3059 | |||
| 3054 | /* dev_open will call this function so the list will stay sane. */ | 3060 | /* dev_open will call this function so the list will stay sane. */ |
| 3055 | if (!(dev->flags&IFF_UP)) | 3061 | if (!(dev->flags&IFF_UP)) |
| 3056 | return; | 3062 | return; |
| @@ -3058,8 +3064,8 @@ void __dev_set_rx_mode(struct net_device *dev) | |||
| 3058 | if (!netif_device_present(dev)) | 3064 | if (!netif_device_present(dev)) |
| 3059 | return; | 3065 | return; |
| 3060 | 3066 | ||
| 3061 | if (dev->set_rx_mode) | 3067 | if (ops->ndo_set_rx_mode) |
| 3062 | dev->set_rx_mode(dev); | 3068 | ops->ndo_set_rx_mode(dev); |
| 3063 | else { | 3069 | else { |
| 3064 | /* Unicast addresses changes may only happen under the rtnl, | 3070 | /* Unicast addresses changes may only happen under the rtnl, |
| 3065 | * therefore calling __dev_set_promiscuity here is safe. | 3071 | * therefore calling __dev_set_promiscuity here is safe. |
| @@ -3072,8 +3078,8 @@ void __dev_set_rx_mode(struct net_device *dev) | |||
| 3072 | dev->uc_promisc = 0; | 3078 | dev->uc_promisc = 0; |
| 3073 | } | 3079 | } |
| 3074 | 3080 | ||
| 3075 | if (dev->set_multicast_list) | 3081 | if (ops->ndo_set_multicast_list) |
| 3076 | dev->set_multicast_list(dev); | 3082 | ops->ndo_set_multicast_list(dev); |
| 3077 | } | 3083 | } |
| 3078 | } | 3084 | } |
| 3079 | 3085 | ||
| @@ -3432,6 +3438,7 @@ int dev_change_flags(struct net_device *dev, unsigned flags) | |||
| 3432 | */ | 3438 | */ |
| 3433 | int dev_set_mtu(struct net_device *dev, int new_mtu) | 3439 | int dev_set_mtu(struct net_device *dev, int new_mtu) |
| 3434 | { | 3440 | { |
| 3441 | const struct net_device_ops *ops = dev->netdev_ops; | ||
| 3435 | int err; | 3442 | int err; |
| 3436 | 3443 | ||
| 3437 | if (new_mtu == dev->mtu) | 3444 | if (new_mtu == dev->mtu) |
| @@ -3445,10 +3452,11 @@ int dev_set_mtu(struct net_device *dev, int new_mtu) | |||
| 3445 | return -ENODEV; | 3452 | return -ENODEV; |
| 3446 | 3453 | ||
| 3447 | err = 0; | 3454 | err = 0; |
| 3448 | if (dev->change_mtu) | 3455 | if (ops->ndo_change_mtu) |
| 3449 | err = dev->change_mtu(dev, new_mtu); | 3456 | err = ops->ndo_change_mtu(dev, new_mtu); |
| 3450 | else | 3457 | else |
| 3451 | dev->mtu = new_mtu; | 3458 | dev->mtu = new_mtu; |
| 3459 | |||
| 3452 | if (!err && dev->flags & IFF_UP) | 3460 | if (!err && dev->flags & IFF_UP) |
| 3453 | call_netdevice_notifiers(NETDEV_CHANGEMTU, dev); | 3461 | call_netdevice_notifiers(NETDEV_CHANGEMTU, dev); |
| 3454 | return err; | 3462 | return err; |
| @@ -3463,15 +3471,16 @@ int dev_set_mtu(struct net_device *dev, int new_mtu) | |||
| 3463 | */ | 3471 | */ |
| 3464 | int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa) | 3472 | int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa) |
| 3465 | { | 3473 | { |
| 3474 | const struct net_device_ops *ops = dev->netdev_ops; | ||
| 3466 | int err; | 3475 | int err; |
| 3467 | 3476 | ||
| 3468 | if (!dev->set_mac_address) | 3477 | if (!ops->ndo_set_mac_address) |
| 3469 | return -EOPNOTSUPP; | 3478 | return -EOPNOTSUPP; |
| 3470 | if (sa->sa_family != dev->type) | 3479 | if (sa->sa_family != dev->type) |
| 3471 | return -EINVAL; | 3480 | return -EINVAL; |
| 3472 | if (!netif_device_present(dev)) | 3481 | if (!netif_device_present(dev)) |
| 3473 | return -ENODEV; | 3482 | return -ENODEV; |
| 3474 | err = dev->set_mac_address(dev, sa); | 3483 | err = ops->ndo_set_mac_address(dev, sa); |
| 3475 | if (!err) | 3484 | if (!err) |
| 3476 | call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); | 3485 | call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); |
| 3477 | return err; | 3486 | return err; |
| @@ -3551,6 +3560,7 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, unsigned int cmd) | |||
| 3551 | { | 3560 | { |
| 3552 | int err; | 3561 | int err; |
| 3553 | struct net_device *dev = __dev_get_by_name(net, ifr->ifr_name); | 3562 | struct net_device *dev = __dev_get_by_name(net, ifr->ifr_name); |
| 3563 | const struct net_device_ops *ops = dev->netdev_ops; | ||
| 3554 | 3564 | ||
| 3555 | if (!dev) | 3565 | if (!dev) |
| 3556 | return -ENODEV; | 3566 | return -ENODEV; |
| @@ -3578,15 +3588,15 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, unsigned int cmd) | |||
| 3578 | return 0; | 3588 | return 0; |
| 3579 | 3589 | ||
| 3580 | case SIOCSIFMAP: | 3590 | case SIOCSIFMAP: |
| 3581 | if (dev->set_config) { | 3591 | if (ops->ndo_set_config) { |
| 3582 | if (!netif_device_present(dev)) | 3592 | if (!netif_device_present(dev)) |
| 3583 | return -ENODEV; | 3593 | return -ENODEV; |
| 3584 | return dev->set_config(dev, &ifr->ifr_map); | 3594 | return ops->ndo_set_config(dev, &ifr->ifr_map); |
| 3585 | } | 3595 | } |
| 3586 | return -EOPNOTSUPP; | 3596 | return -EOPNOTSUPP; |
| 3587 | 3597 | ||
| 3588 | case SIOCADDMULTI: | 3598 | case SIOCADDMULTI: |
| 3589 | if ((!dev->set_multicast_list && !dev->set_rx_mode) || | 3599 | if ((!ops->ndo_set_multicast_list && !ops->ndo_set_rx_mode) || |
| 3590 | ifr->ifr_hwaddr.sa_family != AF_UNSPEC) | 3600 | ifr->ifr_hwaddr.sa_family != AF_UNSPEC) |
| 3591 | return -EINVAL; | 3601 | return -EINVAL; |
| 3592 | if (!netif_device_present(dev)) | 3602 | if (!netif_device_present(dev)) |
| @@ -3595,7 +3605,7 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, unsigned int cmd) | |||
| 3595 | dev->addr_len, 1); | 3605 | dev->addr_len, 1); |
| 3596 | 3606 | ||
| 3597 | case SIOCDELMULTI: | 3607 | case SIOCDELMULTI: |
| 3598 | if ((!dev->set_multicast_list && !dev->set_rx_mode) || | 3608 | if ((!ops->ndo_set_multicast_list && !ops->ndo_set_rx_mode) || |
| 3599 | ifr->ifr_hwaddr.sa_family != AF_UNSPEC) | 3609 | ifr->ifr_hwaddr.sa_family != AF_UNSPEC) |
| 3600 | return -EINVAL; | 3610 | return -EINVAL; |
| 3601 | if (!netif_device_present(dev)) | 3611 | if (!netif_device_present(dev)) |
| @@ -3633,10 +3643,9 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, unsigned int cmd) | |||
| 3633 | cmd == SIOCBRDELIF || | 3643 | cmd == SIOCBRDELIF || |
| 3634 | cmd == SIOCWANDEV) { | 3644 | cmd == SIOCWANDEV) { |
| 3635 | err = -EOPNOTSUPP; | 3645 | err = -EOPNOTSUPP; |
| 3636 | if (dev->do_ioctl) { | 3646 | if (ops->ndo_do_ioctl) { |
| 3637 | if (netif_device_present(dev)) | 3647 | if (netif_device_present(dev)) |
| 3638 | err = dev->do_ioctl(dev, ifr, | 3648 | err = ops->ndo_do_ioctl(dev, ifr, cmd); |
| 3639 | cmd); | ||
| 3640 | else | 3649 | else |
| 3641 | err = -ENODEV; | 3650 | err = -ENODEV; |
| 3642 | } | 3651 | } |
| @@ -3897,8 +3906,8 @@ static void rollback_registered(struct net_device *dev) | |||
| 3897 | */ | 3906 | */ |
| 3898 | dev_addr_discard(dev); | 3907 | dev_addr_discard(dev); |
| 3899 | 3908 | ||
| 3900 | if (dev->uninit) | 3909 | if (dev->netdev_ops->ndo_uninit) |
| 3901 | dev->uninit(dev); | 3910 | dev->netdev_ops->ndo_uninit(dev); |
| 3902 | 3911 | ||
| 3903 | /* Notifier chain MUST detach us from master device. */ | 3912 | /* Notifier chain MUST detach us from master device. */ |
| 3904 | WARN_ON(dev->master); | 3913 | WARN_ON(dev->master); |
| @@ -3988,7 +3997,7 @@ int register_netdevice(struct net_device *dev) | |||
| 3988 | struct hlist_head *head; | 3997 | struct hlist_head *head; |
| 3989 | struct hlist_node *p; | 3998 | struct hlist_node *p; |
| 3990 | int ret; | 3999 | int ret; |
| 3991 | struct net *net; | 4000 | struct net *net = dev_net(dev); |
| 3992 | 4001 | ||
| 3993 | BUG_ON(dev_boot_phase); | 4002 | BUG_ON(dev_boot_phase); |
| 3994 | ASSERT_RTNL(); | 4003 | ASSERT_RTNL(); |
| @@ -3997,8 +4006,7 @@ int register_netdevice(struct net_device *dev) | |||
| 3997 | 4006 | ||
| 3998 | /* When net_device's are persistent, this will be fatal. */ | 4007 | /* When net_device's are persistent, this will be fatal. */ |
| 3999 | BUG_ON(dev->reg_state != NETREG_UNINITIALIZED); | 4008 | BUG_ON(dev->reg_state != NETREG_UNINITIALIZED); |
| 4000 | BUG_ON(!dev_net(dev)); | 4009 | BUG_ON(!net); |
| 4001 | net = dev_net(dev); | ||
| 4002 | 4010 | ||
| 4003 | spin_lock_init(&dev->addr_list_lock); | 4011 | spin_lock_init(&dev->addr_list_lock); |
| 4004 | netdev_set_addr_lockdep_class(dev); | 4012 | netdev_set_addr_lockdep_class(dev); |
| @@ -4006,9 +4014,46 @@ int register_netdevice(struct net_device *dev) | |||
| 4006 | 4014 | ||
| 4007 | dev->iflink = -1; | 4015 | dev->iflink = -1; |
| 4008 | 4016 | ||
| 4017 | #ifdef CONFIG_COMPAT_NET_DEV_OPS | ||
| 4018 | /* Netdevice_ops API compatiability support. | ||
| 4019 | * This is temporary until all network devices are converted. | ||
| 4020 | */ | ||
| 4021 | if (dev->netdev_ops) { | ||
| 4022 | const struct net_device_ops *ops = dev->netdev_ops; | ||
| 4023 | |||
| 4024 | dev->init = ops->ndo_init; | ||
| 4025 | dev->uninit = ops->ndo_uninit; | ||
| 4026 | dev->open = ops->ndo_open; | ||
| 4027 | dev->change_rx_flags = ops->ndo_change_rx_flags; | ||
| 4028 | dev->set_rx_mode = ops->ndo_set_rx_mode; | ||
| 4029 | dev->set_multicast_list = ops->ndo_set_multicast_list; | ||
| 4030 | dev->set_mac_address = ops->ndo_set_mac_address; | ||
| 4031 | dev->validate_addr = ops->ndo_validate_addr; | ||
| 4032 | dev->do_ioctl = ops->ndo_do_ioctl; | ||
| 4033 | dev->set_config = ops->ndo_set_config; | ||
| 4034 | dev->change_mtu = ops->ndo_change_mtu; | ||
| 4035 | dev->tx_timeout = ops->ndo_tx_timeout; | ||
| 4036 | dev->get_stats = ops->ndo_get_stats; | ||
| 4037 | dev->vlan_rx_register = ops->ndo_vlan_rx_register; | ||
| 4038 | dev->vlan_rx_add_vid = ops->ndo_vlan_rx_add_vid; | ||
| 4039 | dev->vlan_rx_kill_vid = ops->ndo_vlan_rx_kill_vid; | ||
| 4040 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
| 4041 | dev->poll_controller = ops->ndo_poll_controller; | ||
| 4042 | #endif | ||
| 4043 | } else { | ||
| 4044 | char drivername[64]; | ||
| 4045 | pr_info("%s (%s): not using net_device_ops yet\n", | ||
| 4046 | dev->name, netdev_drivername(dev, drivername, 64)); | ||
| 4047 | |||
| 4048 | /* This works only because net_device_ops and the | ||
| 4049 | compatiablity structure are the same. */ | ||
| 4050 | dev->netdev_ops = (void *) &(dev->init); | ||
| 4051 | } | ||
| 4052 | #endif | ||
| 4053 | |||
| 4009 | /* Init, if this function is available */ | 4054 | /* Init, if this function is available */ |
| 4010 | if (dev->init) { | 4055 | if (dev->netdev_ops->ndo_init) { |
| 4011 | ret = dev->init(dev); | 4056 | ret = dev->netdev_ops->ndo_init(dev); |
| 4012 | if (ret) { | 4057 | if (ret) { |
| 4013 | if (ret > 0) | 4058 | if (ret > 0) |
| 4014 | ret = -EIO; | 4059 | ret = -EIO; |
| @@ -4086,8 +4131,8 @@ out: | |||
| 4086 | return ret; | 4131 | return ret; |
| 4087 | 4132 | ||
| 4088 | err_uninit: | 4133 | err_uninit: |
| 4089 | if (dev->uninit) | 4134 | if (dev->netdev_ops->ndo_uninit) |
| 4090 | dev->uninit(dev); | 4135 | dev->netdev_ops->ndo_uninit(dev); |
| 4091 | goto out; | 4136 | goto out; |
| 4092 | } | 4137 | } |
| 4093 | 4138 | ||
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index fc4e28e23b89..630df6034444 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
| @@ -172,12 +172,13 @@ static void service_arp_queue(struct netpoll_info *npi) | |||
| 172 | void netpoll_poll(struct netpoll *np) | 172 | void netpoll_poll(struct netpoll *np) |
| 173 | { | 173 | { |
| 174 | struct net_device *dev = np->dev; | 174 | struct net_device *dev = np->dev; |
| 175 | const struct net_device_ops *ops = dev->netdev_ops; | ||
| 175 | 176 | ||
| 176 | if (!dev || !netif_running(dev) || !dev->poll_controller) | 177 | if (!dev || !netif_running(dev) || !ops->ndo_poll_controller) |
| 177 | return; | 178 | return; |
| 178 | 179 | ||
| 179 | /* Process pending work on NIC */ | 180 | /* Process pending work on NIC */ |
| 180 | dev->poll_controller(dev); | 181 | ops->ndo_poll_controller(dev); |
| 181 | 182 | ||
| 182 | poll_napi(dev); | 183 | poll_napi(dev); |
| 183 | 184 | ||
| @@ -694,7 +695,7 @@ int netpoll_setup(struct netpoll *np) | |||
| 694 | atomic_inc(&npinfo->refcnt); | 695 | atomic_inc(&npinfo->refcnt); |
| 695 | } | 696 | } |
| 696 | 697 | ||
| 697 | if (!ndev->poll_controller) { | 698 | if (!ndev->netdev_ops->ndo_poll_controller) { |
| 698 | printk(KERN_ERR "%s: %s doesn't support polling, aborting.\n", | 699 | printk(KERN_ERR "%s: %s doesn't support polling, aborting.\n", |
| 699 | np->name, np->dev_name); | 700 | np->name, np->dev_name); |
| 700 | err = -ENOTSUPP; | 701 | err = -ENOTSUPP; |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 4dfb6b4d4559..6f8e0778e565 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
| @@ -762,6 +762,7 @@ static int validate_linkmsg(struct net_device *dev, struct nlattr *tb[]) | |||
| 762 | static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm, | 762 | static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm, |
| 763 | struct nlattr **tb, char *ifname, int modified) | 763 | struct nlattr **tb, char *ifname, int modified) |
| 764 | { | 764 | { |
| 765 | const struct net_device_ops *ops = dev->netdev_ops; | ||
| 765 | int send_addr_notify = 0; | 766 | int send_addr_notify = 0; |
| 766 | int err; | 767 | int err; |
| 767 | 768 | ||
| @@ -783,7 +784,7 @@ static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm, | |||
| 783 | struct rtnl_link_ifmap *u_map; | 784 | struct rtnl_link_ifmap *u_map; |
| 784 | struct ifmap k_map; | 785 | struct ifmap k_map; |
| 785 | 786 | ||
| 786 | if (!dev->set_config) { | 787 | if (!ops->ndo_set_config) { |
| 787 | err = -EOPNOTSUPP; | 788 | err = -EOPNOTSUPP; |
| 788 | goto errout; | 789 | goto errout; |
| 789 | } | 790 | } |
| @@ -801,7 +802,7 @@ static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm, | |||
| 801 | k_map.dma = (unsigned char) u_map->dma; | 802 | k_map.dma = (unsigned char) u_map->dma; |
| 802 | k_map.port = (unsigned char) u_map->port; | 803 | k_map.port = (unsigned char) u_map->port; |
| 803 | 804 | ||
| 804 | err = dev->set_config(dev, &k_map); | 805 | err = ops->ndo_set_config(dev, &k_map); |
| 805 | if (err < 0) | 806 | if (err < 0) |
| 806 | goto errout; | 807 | goto errout; |
| 807 | 808 | ||
| @@ -812,7 +813,7 @@ static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm, | |||
| 812 | struct sockaddr *sa; | 813 | struct sockaddr *sa; |
| 813 | int len; | 814 | int len; |
| 814 | 815 | ||
| 815 | if (!dev->set_mac_address) { | 816 | if (!ops->ndo_set_mac_address) { |
| 816 | err = -EOPNOTSUPP; | 817 | err = -EOPNOTSUPP; |
| 817 | goto errout; | 818 | goto errout; |
| 818 | } | 819 | } |
| @@ -831,7 +832,7 @@ static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm, | |||
| 831 | sa->sa_family = dev->type; | 832 | sa->sa_family = dev->type; |
| 832 | memcpy(sa->sa_data, nla_data(tb[IFLA_ADDRESS]), | 833 | memcpy(sa->sa_data, nla_data(tb[IFLA_ADDRESS]), |
| 833 | dev->addr_len); | 834 | dev->addr_len); |
| 834 | err = dev->set_mac_address(dev, sa); | 835 | err = ops->ndo_set_mac_address(dev, sa); |
| 835 | kfree(sa); | 836 | kfree(sa); |
| 836 | if (err) | 837 | if (err) |
| 837 | goto errout; | 838 | goto errout; |
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 80c8f3dbbea1..95ab55c064f1 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
| @@ -224,7 +224,7 @@ static void dev_watchdog(unsigned long arg) | |||
| 224 | char drivername[64]; | 224 | char drivername[64]; |
| 225 | WARN_ONCE(1, KERN_INFO "NETDEV WATCHDOG: %s (%s): transmit timed out\n", | 225 | WARN_ONCE(1, KERN_INFO "NETDEV WATCHDOG: %s (%s): transmit timed out\n", |
| 226 | dev->name, netdev_drivername(dev, drivername, 64)); | 226 | dev->name, netdev_drivername(dev, drivername, 64)); |
| 227 | dev->tx_timeout(dev); | 227 | dev->netdev_ops->ndo_tx_timeout(dev); |
| 228 | } | 228 | } |
| 229 | if (!mod_timer(&dev->watchdog_timer, | 229 | if (!mod_timer(&dev->watchdog_timer, |
| 230 | round_jiffies(jiffies + | 230 | round_jiffies(jiffies + |
| @@ -239,7 +239,7 @@ static void dev_watchdog(unsigned long arg) | |||
| 239 | 239 | ||
| 240 | void __netdev_watchdog_up(struct net_device *dev) | 240 | void __netdev_watchdog_up(struct net_device *dev) |
| 241 | { | 241 | { |
| 242 | if (dev->tx_timeout) { | 242 | if (dev->netdev_ops->ndo_tx_timeout) { |
| 243 | if (dev->watchdog_timeo <= 0) | 243 | if (dev->watchdog_timeo <= 0) |
| 244 | dev->watchdog_timeo = 5*HZ; | 244 | dev->watchdog_timeo = 5*HZ; |
| 245 | if (!mod_timer(&dev->watchdog_timer, | 245 | if (!mod_timer(&dev->watchdog_timer, |
