Netdevice ops second wave.
Subsystems (6)
cover Netdevice ops second wave.
PATCH 1/9 netdev: add more functions to netdevice ops
This patch moves neigh_setup and hard_start_xmit into the network device ops structure. For bisection, fix all the previously converted drivers as well. Bonding driver took the biggest hit on this.
Added a prefetch of the hard_start_xmit in the fast path to try and reduce any impact this would have.
--- drivers/net/8139cp.c | 2 - drivers/net/8139too.c | 2 - drivers/net/acenic.c | 4 ++ drivers/net/atl1e/atl1e_main.c | 3 +- drivers/net/atlx/atl1.c | 4 +- drivers/net/atlx/atl2.c | 2 - drivers/net/bonding/bond_main.c | 56 ++++++++++++++++++++++++++++++++-------- drivers/net/chelsio/cxgb2.c | 6 ++-- drivers/net/cxgb3/cxgb3_main.c | 1 drivers/net/e100.c | 2 - drivers/net/e1000/e1000_main.c | 2 - drivers/net/e1000e/netdev.c | 2 - drivers/net/enic/enic_main.c | 2 - drivers/net/forcedeth.c | 22 +++++++++++++-- drivers/net/ifb.c | 4 +- drivers/net/igb/igb_main.c | 2 - drivers/net/ixgb/ixgb_main.c | 2 - drivers/net/ixgbe/ixgbe_main.c | 2 - drivers/net/loopback.c | 2 - drivers/net/macvlan.c | 4 +- drivers/net/niu.c | 2 - drivers/net/ppp_generic.c | 5 +-- drivers/net/r8169.c | 2 - drivers/net/skge.c | 2 - drivers/net/sky2.c | 3 +- drivers/net/tg3.c | 45 ++++++++++++++++++++++---------- drivers/net/tun.c | 4 +- drivers/net/veth.c | 2 - drivers/net/via-velocity.c | 2 - include/linux/netdevice.h | 39 ++++++++++++++++++--------- net/bridge/br_device.c | 10 +++---- net/bridge/br_if.c | 2 - net/core/dev.c | 12 +++++--- net/core/neighbour.c | 6 ++-- net/core/netpoll.c | 6 ++-- net/core/pktgen.c | 8 ++--- 36 files changed, 183 insertions(+), 93 deletions(-)
drivers/net/acenic.c +3 -1
@@ -455,10 +455,13 @@ static const struct net_device_ops ace_n .ndo_stop = ace_close, .ndo_tx_timeout = ace_watchdog, .ndo_get_stats = ace_get_stats, + .ndo_start_xmit = ace_start_xmit, .ndo_set_multicast_list = ace_set_multicast_list, .ndo_set_mac_address = ace_set_mac_addr, .ndo_change_mtu = ace_change_mtu, +#if ACENIC_DO_VLAN .ndo_vlan_rx_register = ace_vlan_rx_register, +#endif }; static int __devinit acenic_probe_one(struct pci_dev *pdev,
@@ -489,7 +492,6 @@ static int __devinit acenic_probe_one(st dev->watchdog_timeo =5 *HZ ; dev->netdev_ops = &ace_netdev_ops; - dev->hard_start_xmit = &ace_start_xmit;SET_ETHTOOL_OPS (dev, &ace_ethtool_ops);/* we only display this string ONCE */
drivers/net/atl1e/atl1e_main.c +2 -1
@@ -2256,6 +2256,7 @@ static void atl1e_shutdown(struct pci_destatic const struct net_device_ops atl1e_netdev_ops = { .ndo_open = atl1e_open, .ndo_stop = atl1e_close, + .ndo_start_xmit = atl1e_xmit_frame, .ndo_get_stats = atl1e_get_stats, .ndo_set_multicast_list = atl1e_set_multi, .ndo_validate_addr = eth_validate_addr,
@@ -2277,7 +2278,7 @@ static int atl1e_init_netdev(struct net_ netdev->irq = pdev->irq; netdev->netdev_ops = &atl1e_netdev_ops; - netdev->hard_start_xmit = atl1e_xmit_frame, + netdev->watchdog_timeo =AT_TX_WATCHDOG ;atl1e_set_ethtool_ops (netdev);
drivers/net/atlx/atl1.c +2 -2
@@ -2883,12 +2883,13 @@ static void atl1_poll_controller(structstatic const struct net_device_ops atl1_netdev_ops = { .ndo_open = atl1_open, .ndo_stop = atl1_close, + .ndo_start_xmit = atl1_xmit_frame, .ndo_set_multicast_list = atlx_set_multi, .ndo_validate_addr = eth_validate_addr, .ndo_set_mac_address = atl1_set_mac, .ndo_change_mtu = atl1_change_mtu, .ndo_do_ioctl = atlx_ioctl, - .ndo_tx_timeout = atlx_tx_timeout, + .ndo_tx_timeout = atlx_tx_timeout, .ndo_vlan_rx_register = atlx_vlan_rx_register, #ifdef CONFIG_NET_POLL_CONTROLLER .ndo_poll_controller = atl1_poll_controller,
@@ -2983,7 +2984,6 @@ static int __devinit atl1_probe(struct p adapter->mii.reg_num_mask =0x1f ; netdev->netdev_ops = &atl1_netdev_ops; - netdev->hard_start_xmit = &atl1_xmit_frame; netdev->watchdog_timeo =5 *HZ ; netdev->ethtool_ops = &atl1_ethtool_ops;
drivers/net/atlx/atl2.c +1 -1
@@ -1315,6 +1315,7 @@ static void atl2_poll_controller(structstatic const struct net_device_ops atl2_netdev_ops = { .ndo_open = atl2_open, .ndo_stop = atl2_close, + .ndo_start_xmit = atl2_xmit_frame, .ndo_set_multicast_list = atl2_set_multi, .ndo_validate_addr = eth_validate_addr, .ndo_set_mac_address = atl2_set_mac,
@@ -1400,7 +1401,6 @@ static int __devinit atl2_probe(struct patl2_setup_pcicmd (pdev); - netdev->hard_start_xmit = &atl2_xmit_frame; netdev->netdev_ops = &atl2_netdev_ops;atl2_set_ethtool_ops (netdev); netdev->watchdog_timeo =5 *HZ ;
drivers/net/bonding/bond_main.c +46 -10
112 lines not on this page · raw message
drivers/net/chelsio/cxgb2.c +3 -3
@@ -915,7 +915,7 @@ static int t1_set_mac_addr(struct net_de }#if defined(CONFIG_VLAN_8021Q ) || defined(CONFIG_VLAN_8021Q_MODULE ) -static void vlan_rx_register (struct net_device *dev, +static void t1_vlan_rx_register (struct net_device *dev,struct vlan_group *grp) {struct adapter *adapter = dev->ml_priv;
@@ -1013,6 +1013,7 @@ void t1_fatal_err(struct adapter *adaptestatic const struct net_device_ops cxgb_netdev_ops = { .ndo_open = cxgb_open, .ndo_stop = cxgb_close, + .ndo_start_xmit = t1_start_xmit, .ndo_get_stats = t1_get_stats, .ndo_validate_addr = eth_validate_addr, .ndo_set_multicast_list = t1_set_rxmode,
@@ -1020,7 +1021,7 @@ static const struct net_device_ops cxgb_ .ndo_change_mtu = t1_change_mtu, .ndo_set_mac_address = t1_set_mac_addr,#if defined(CONFIG_VLAN_8021Q ) || defined(CONFIG_VLAN_8021Q_MODULE ) - .ndo_vlan_rx_register = vlan_rx_register, + .ndo_vlan_rx_register = t1_vlan_rx_register,#endif #ifdef CONFIG_NET_POLL_CONTROLLER .ndo_poll_controller = t1_netpoll,
@@ -1157,7 +1158,6 @@ static int __devinit init_one(struct pci } netdev->netdev_ops = &cxgb_netdev_ops; - netdev->hard_start_xmit = t1_start_xmit; netdev->hard_header_len += (adapter->flags &TSO_CAPABLE ) ?sizeof (struct cpl_tx_pkt_lso ) :sizeof (struct cpl_tx_pkt );
drivers/net/cxgb3/cxgb3_main.c +0 -1
@@ -2955,7 +2955,6 @@ static int __devinit init_one(struct pci netdev->features |=NETIF_F_HW_VLAN_TX |NETIF_F_HW_VLAN_RX ; netdev->netdev_ops = &cxgb_netdev_ops; - netdev->hard_start_xmit = t3_eth_xmit;SET_ETHTOOL_OPS (netdev, &cxgb_ethtool_ops); }
drivers/net/e100.c +1 -1
@@ -2615,6 +2615,7 @@ static int e100_close(struct net_devicestatic const struct net_device_ops e100_netdev_ops = { .ndo_open = e100_open, .ndo_stop = e100_close, + .ndo_start_xmit = e100_xmit_frame, .ndo_validate_addr = eth_validate_addr, .ndo_set_multicast_list = e100_set_multicast_list, .ndo_set_mac_address = e100_set_mac_address,
@@ -2640,7 +2641,6 @@ static int __devinit e100_probe(struct p } netdev->netdev_ops = &e100_netdev_ops; - netdev->hard_start_xmit = e100_xmit_frame;SET_ETHTOOL_OPS (netdev, &e100_ethtool_ops); netdev->watchdog_timeo =E100_WATCHDOG_PERIOD ;strncpy (netdev->name,pci_name (pdev),sizeof (netdev->name) -1 );
drivers/net/e1000/e1000_main.c +1 -1
@@ -891,6 +891,7 @@ static int e1000_is_need_ioport(struct pstatic const struct net_device_ops e1000_netdev_ops = { .ndo_open = e1000_open, .ndo_stop = e1000_close, + .ndo_start_xmit = e1000_xmit_frame, .ndo_get_stats = e1000_get_stats, .ndo_set_rx_mode = e1000_set_rx_mode, .ndo_set_mac_address = e1000_set_mac,
@@ -1001,7 +1002,6 @@ static int __devinit e1000_probe(struct } netdev->netdev_ops = &e1000_netdev_ops; - netdev->hard_start_xmit = &e1000_xmit_frame;e1000_set_ethtool_ops (netdev); netdev->watchdog_timeo =5 *HZ ;netif_napi_add (netdev, &adapter->napi, e1000_clean,64 );
drivers/net/e1000e/netdev.c +1 -1
@@ -4707,6 +4707,7 @@ static void e1000_eeprom_checks(struct estatic const struct net_device_ops e1000e_netdev_ops = { .ndo_open = e1000_open, .ndo_stop = e1000_close, + .ndo_start_xmit = e1000_xmit_frame, .ndo_get_stats = e1000_get_stats, .ndo_set_multicast_list = e1000_set_multi, .ndo_set_mac_address = e1000_set_mac,
@@ -4822,7 +4823,6 @@ static int __devinit e1000_probe(struct/* construct the net_device struct */ netdev->netdev_ops = &e1000e_netdev_ops; - netdev->hard_start_xmit = &e1000_xmit_frame;e1000e_set_ethtool_ops (netdev); netdev->watchdog_timeo =5 *HZ ;netif_napi_add (netdev, &adapter->napi, e1000_clean,64 );
drivers/net/enic/enic_main.c +1 -1
@@ -1593,6 +1593,7 @@ static void enic_iounmap(struct enic *enstatic const struct net_device_ops enic_netdev_ops = { .ndo_open = enic_open, .ndo_stop = enic_stop, + .ndo_start_xmit = enic_hard_start_xmit, .ndo_get_stats = enic_get_stats, .ndo_validate_addr = eth_validate_addr, .ndo_set_multicast_list = enic_set_multicast_list,
@@ -1830,7 +1831,6 @@ static int __devinit enic_probe(struct p } netdev->netdev_ops = &enic_netdev_ops; - netdev->hard_start_xmit = enic_hard_start_xmit; netdev->watchdog_timeo =2 *HZ ; netdev->ethtool_ops = &enic_ethtool_ops;
drivers/net/forcedeth.c +19 -3
@@ -5412,6 +5412,23 @@ static const struct net_device_ops nv_ne .ndo_open = nv_open, .ndo_stop = nv_close, .ndo_get_stats = nv_get_stats, + .ndo_start_xmit = nv_start_xmit, + .ndo_tx_timeout = nv_tx_timeout, + .ndo_change_mtu = nv_change_mtu, + .ndo_validate_addr = eth_validate_addr, + .ndo_set_mac_address = nv_set_mac_address, + .ndo_set_multicast_list = nv_set_multicast, + .ndo_vlan_rx_register = nv_vlan_rx_register, +#ifdef CONFIG_NET_POLL_CONTROLLER + .ndo_poll_controller = nv_poll_controller, +#endif +}; + +static const struct net_device_ops nv_netdev_ops_optimized = { + .ndo_open = nv_open, + .ndo_stop = nv_close, + .ndo_get_stats = nv_get_stats, + .ndo_start_xmit = nv_start_xmit_optimized, .ndo_tx_timeout = nv_tx_timeout, .ndo_change_mtu = nv_change_mtu, .ndo_validate_addr = eth_validate_addr,
@@ -5592,11 +5609,10 @@ static int __devinit nv_probe(struct pci goto out_freering;if (!nv_optimized (np)) - dev->hard_start_xmit = nv_start_xmit; + dev->netdev_ops = &nv_netdev_ops;else - dev->hard_start_xmit = nv_start_xmit_optimized; + dev->netdev_ops = &nv_netdev_ops_optimized; - dev->netdev_ops = &nv_netdev_ops;#ifdef CONFIG_FORCEDETH_NAPI netif_napi_add (dev, &np->napi, nv_napi_poll,RX_WORK_PER_LOOP );#endif
drivers/net/ifb.c +2 -2
@@ -138,15 +138,15 @@ resched: }static const struct net_device_ops ifb_netdev_ops = { - .ndo_validate_addr = eth_validate_addr, .ndo_open = ifb_open, .ndo_stop = ifb_close, + .ndo_start_xmit = ifb_xmit, + .ndo_validate_addr = eth_validate_addr, };static void ifb_setup (struct net_device *dev) {/* Initialize the device structure. */ - dev->hard_start_xmit = ifb_xmit; dev->destructor = free_netdev; dev->netdev_ops = &ifb_netdev_ops;
drivers/net/igb/igb_main.c +1 -1
@@ -953,6 +953,7 @@ static int igb_is_need_ioport(struct pcistatic const struct net_device_ops igb_netdev_ops = { .ndo_open = igb_open, .ndo_stop = igb_close, + .ndo_start_xmit = igb_xmit_frame_adv, .ndo_get_stats = igb_get_stats, .ndo_set_multicast_list = igb_set_multi, .ndo_set_mac_address = igb_set_mac,
@@ -1080,7 +1081,6 @@ static int __devinit igb_probe(struct pc netdev->netdev_ops = &igb_netdev_ops;igb_set_ethtool_ops (netdev); netdev->watchdog_timeo =5 *HZ ; - netdev->hard_start_xmit = &igb_xmit_frame_adv;strncpy (netdev->name,pci_name (pdev),sizeof (netdev->name) -1 );
drivers/net/ixgb/ixgb_main.c +1 -1
@@ -324,6 +324,7 @@ ixgb_reset(struct ixgb_adapter *adapter)static const struct net_device_ops ixgb_netdev_ops = { .ndo_open = ixgb_open, .ndo_stop = ixgb_close, + .ndo_start_xmit = ixgb_xmit_frame, .ndo_get_stats = ixgb_get_stats, .ndo_set_multicast_list = ixgb_set_multi, .ndo_validate_addr = eth_validate_addr,
@@ -414,7 +415,6 @@ ixgb_probe(struct pci_dev *pdev, const s } netdev->netdev_ops = &ixgb_netdev_ops; - netdev->hard_start_xmit = &ixgb_xmit_frame;ixgb_set_ethtool_ops (netdev); netdev->watchdog_timeo =5 *HZ ;netif_napi_add (netdev, &adapter->napi, ixgb_clean,64 );
drivers/net/ixgbe/ixgbe_main.c +1 -1
@@ -3730,6 +3730,7 @@ static int ixgbe_link_config(struct ixgbstatic const struct net_device_ops ixgbe_netdev_ops = { .ndo_open = ixgbe_open, .ndo_stop = ixgbe_close, + .ndo_start_xmit = ixgbe_xmit_frame, .ndo_get_stats = ixgbe_get_stats, .ndo_set_multicast_list = ixgbe_set_rx_mode, .ndo_validate_addr = eth_validate_addr,
@@ -3826,7 +3827,6 @@ static int __devinit ixgbe_probe(struct } netdev->netdev_ops = &ixgbe_netdev_ops; - netdev->hard_start_xmit = &ixgbe_xmit_frame;ixgbe_set_ethtool_ops (netdev); netdev->watchdog_timeo =5 *HZ ;strcpy (netdev->name,pci_name (pdev));
drivers/net/loopback.c +1 -1
@@ -145,6 +145,7 @@ static void loopback_dev_free(struct netstatic const struct net_device_ops loopback_ops = { .ndo_init = loopback_dev_init, + .ndo_start_xmit= loopback_xmit, .ndo_get_stats = loopback_get_stats, };
@@ -155,7 +156,6 @@ static const struct net_device_ops loopbstatic void loopback_setup (struct net_device *dev) { dev->mtu = (16 *1024 ) +20 +20 +12 ; - dev->hard_start_xmit = loopback_xmit; dev->hard_header_len =ETH_HLEN ;/* 14 */ dev->addr_len =ETH_ALEN ;/* 6 */ dev->tx_queue_len =0 ;
drivers/net/macvlan.c +2 -2
@@ -140,7 +140,7 @@ static struct sk_buff *macvlan_handle_frreturn NULL ; } -static int macvlan_hard_start_xmit (struct sk_buff *skb,struct net_device *dev) +static int macvlan_start_xmit (struct sk_buff *skb,struct net_device *dev) {const struct macvlan_dev *vlan =netdev_priv (dev);unsigned int len = skb->len;
@@ -365,6 +365,7 @@ static const struct net_device_ops macvl .ndo_init = macvlan_init, .ndo_open = macvlan_open, .ndo_stop = macvlan_stop, + .ndo_start_xmit = macvlan_start_xmit, .ndo_change_mtu = macvlan_change_mtu, .ndo_change_rx_flags = macvlan_change_rx_flags, .ndo_set_mac_address = macvlan_set_mac_address,
@@ -377,7 +378,6 @@ static void macvlan_setup(struct net_devether_setup (dev); dev->netdev_ops = &macvlan_netdev_ops; - dev->hard_start_xmit = macvlan_hard_start_xmit; dev->destructor = free_netdev; dev->header_ops = &macvlan_hard_header_ops, dev->ethtool_ops = &macvlan_ethtool_ops;
drivers/net/ppp_generic.c +2 -3
@@ -972,7 +972,8 @@ ppp_net_ioctl(struct net_device *dev, st }static const struct net_device_ops ppp_netdev_ops = { - .ndo_do_ioctl = ppp_net_ioctl, + .ndo_start_xmit = ppp_start_xmit, + .ndo_do_ioctl = ppp_net_ioctl, };static void ppp_setup (struct net_device *dev)
@@ -2437,8 +2438,6 @@ ppp_create_interface(int unit, int *retpskb_queue_head_init (&ppp->mrq);#endif /* CONFIG_PPP_MULTILINK */ - dev->hard_start_xmit = ppp_start_xmit; - ret = -EEXIST ;mutex_lock (&all_ppp_mutex);if (unit <0 )
drivers/net/skge.c +1 -1
@@ -3805,6 +3805,7 @@ static __exit void skge_debug_cleanup(vostatic const struct net_device_ops skge_netdev_ops = { .ndo_open = skge_up, .ndo_stop = skge_down, + .ndo_start_xmit = skge_xmit_frame, .ndo_do_ioctl = skge_ioctl, .ndo_get_stats = skge_get_stats, .ndo_tx_timeout = skge_tx_timeout,
@@ -3831,7 +3832,6 @@ static struct net_device *skge_devinit(s }SET_NETDEV_DEV (dev, &hw->pdev->dev); - dev->hard_start_xmit = skge_xmit_frame; dev->netdev_ops = &skge_netdev_ops; dev->ethtool_ops = &skge_ethtool_ops; dev->watchdog_timeo =TX_WATCHDOG ;
drivers/net/sky2.c +2 -1
@@ -4047,6 +4047,7 @@ static const struct net_device_ops sky2_ { .ndo_open = sky2_up, .ndo_stop = sky2_down, + .ndo_start_xmit = sky2_xmit_frame, .ndo_do_ioctl = sky2_ioctl, .ndo_validate_addr = eth_validate_addr, .ndo_set_mac_address = sky2_set_mac_address,
@@ -4063,6 +4064,7 @@ static const struct net_device_ops sky2_ { .ndo_open = sky2_up, .ndo_stop = sky2_down, + .ndo_start_xmit = sky2_xmit_frame, .ndo_do_ioctl = sky2_ioctl, .ndo_validate_addr = eth_validate_addr, .ndo_set_mac_address = sky2_set_mac_address,
@@ -4090,7 +4092,6 @@ static __devinit struct net_device *sky2SET_NETDEV_DEV (dev, &hw->pdev->dev); dev->irq = hw->pdev->irq; - dev->hard_start_xmit = sky2_xmit_frame;SET_ETHTOOL_OPS (dev, &sky2_ethtool_ops); dev->watchdog_timeo =TX_WATCHDOG ; dev->netdev_ops = &sky2_netdev_ops[port];
drivers/net/tg3.c +31 -14
69 lines not on this page · raw message
drivers/net/tun.c +2 -2
@@ -308,13 +308,14 @@ tun_net_change_mtu(struct net_device *destatic const struct net_device_ops tun_netdev_ops = { .ndo_open = tun_net_open, .ndo_stop = tun_net_close, + .ndo_start_xmit = tun_net_xmit, .ndo_change_mtu = tun_net_change_mtu, - };static const struct net_device_ops tap_netdev_ops = { .ndo_open = tun_net_open, .ndo_stop = tun_net_close, + .ndo_start_xmit = tun_net_xmit, .ndo_change_mtu = tun_net_change_mtu, .ndo_set_multicast_list = tun_net_mclist, .ndo_set_mac_address = eth_mac_addr,
@@ -691,7 +692,6 @@ static void tun_setup(struct net_device tun->owner =-1 ; tun->group =-1 ; - dev->hard_start_xmit = tun_net_xmit; dev->ethtool_ops = &tun_ethtool_ops; dev->destructor = free_netdev; dev->features |=NETIF_F_NETNS_LOCAL ;
drivers/net/veth.c +1 -1
@@ -265,6 +265,7 @@ static void veth_dev_free(struct net_devstatic const struct net_device_ops veth_netdev_ops = { .ndo_init = veth_dev_init, .ndo_open = veth_open, + .ndo_start_xmit = veth_xmit, .ndo_get_stats = veth_get_stats, };
@@ -273,7 +274,6 @@ static void veth_setup(struct net_deviceether_setup (dev); dev->netdev_ops = &veth_netdev_ops; - dev->hard_start_xmit = veth_xmit; dev->ethtool_ops = &veth_ethtool_ops; dev->features |=NETIF_F_LLTX ; dev->destructor = veth_dev_free;
drivers/net/via-velocity.c +1 -1
@@ -852,6 +852,7 @@ static int velocity_soft_reset(struct vestatic const struct net_device_ops velocity_netdev_ops = { .ndo_open = velocity_open, .ndo_stop = velocity_close, + .ndo_start_xmit = velocity_xmit, .ndo_get_stats = velocity_get_stats, .ndo_validate_addr = eth_validate_addr, .ndo_set_multicast_list = velocity_set_multi,
@@ -971,7 +972,6 @@ static int __devinit velocity_found1(str vptr->phy_id =MII_GET_PHY_ID (vptr->mac_regs); dev->irq = pdev->irq; - dev->hard_start_xmit = velocity_xmit; dev->netdev_ops = &velocity_netdev_ops; dev->ethtool_ops = &velocity_ethtool_ops;
include/linux/netdevice.h +26 -13
@@ -454,8 +454,8 @@ struct netdev_queue {/* * This structure defines the management hooks for network devices. -* The following hooks can bed defined and are optonal (can be null) -* unless otherwise noted. +* The following hooks can be defined; unless noted otherwise, they are +* optional and can be filled with a null pointer. * * int (*ndo_init)(struct net_device *dev); * This function is called once when network device is registered.
@@ -475,6 +475,15 @@ struct netdev_queue {* This function is called when network device transistions to the down * state. * +* int (*ndo_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev); +* Called when a packet needs to be transmitted. +* Must return NETDEV_TX_OK , NETDEV_TX_BUSY, or NETDEV_TX_LOCKED, +* Required can not be NULL. +* +* u16 (*ndo_select_queue)(struct net_device *dev, struct sk_buff *skb); +* Called to decide which queue to when device supports multiple +* transmit queues. +* * void (*ndo_change_rx_flags)(struct net_device *dev, int flags); * This function is called to allow device receiver to make * changes to configuration when multicast or promiscious is enabled.
@@ -508,7 +517,7 @@ struct netdev_queue {* of a device. If not defined, any request to change MTU will * will return an error. * -* void (*ndo_tx_timeout) (struct net_device *dev); +* void (*ndo_tx_timeout)(struct net_device *dev); * Callback uses when the transmitter has not made any progress * for dev->watchdog ticks. *
@@ -538,6 +547,10 @@ struct net_device_ops {void (*ndo_uninit)(struct net_device *dev);int (*ndo_open)(struct net_device *dev);int (*ndo_stop)(struct net_device *dev); +int (*ndo_start_xmit) (struct sk_buff *skb, +struct net_device *dev); +u16 (*ndo_select_queue)(struct net_device *dev, +struct sk_buff *skb);#define HAVE_CHANGE_RX_FLAGS void (*ndo_change_rx_flags)(struct net_device *dev,int flags);
@@ -557,8 +570,10 @@ struct net_device_ops {int (*ndo_set_config)(struct net_device *dev,struct ifmap *map);#define HAVE_CHANGE_MTU -int (*ndo_change_mtu)(struct net_device *dev,int new_mtu); - +int (*ndo_change_mtu)(struct net_device *dev, +int new_mtu); +int (*ndo_neigh_setup)(struct net_device *dev, +struct neigh_parms *);#define HAVE_TX_TIMEOUT void (*ndo_tx_timeout) (struct net_device *dev);
@@ -761,18 +776,12 @@ struct net_device/* Number of TX queues currently active in device */ unsigned int real_num_tx_queues; -/* Map buffer to appropriate transmit queue */ -u16 (*select_queue)(struct net_device *dev, -struct sk_buff *skb); -unsigned long tx_queue_len;/* Max frames per queue allowed */ spinlock_t tx_global_lock;/* * One part is mostly used on xmit path (device) */ void *priv;/* pointer to private data */ -int (*hard_start_xmit) (struct sk_buff *skb, -struct net_device *dev);/* These may be needed for future network-power-down code. */ unsigned long trans_start;/* Time (in jiffies) of last Tx */
@@ -800,8 +809,6 @@ struct net_device/* Called from unregister, can be used to call free_netdev */ void (*destructor)(struct net_device *dev); -int (*neigh_setup)(struct net_device *dev,struct neigh_parms *); -#ifdef CONFIG_NETPOLL struct netpoll_info *npinfo;#endif
@@ -842,6 +849,10 @@ struct net_devicevoid (*uninit)(struct net_device *dev);int (*open)(struct net_device *dev);int (*stop)(struct net_device *dev); +int (*hard_start_xmit) (struct sk_buff *skb, +struct net_device *dev); +u16 (*select_queue)(struct net_device *dev, +struct sk_buff *skb);void (*change_rx_flags)(struct net_device *dev,int flags);void (*set_rx_mode)(struct net_device *dev);
@@ -854,6 +865,8 @@ struct net_deviceint (*set_config)(struct net_device *dev,struct ifmap *map);int (*change_mtu)(struct net_device *dev,int new_mtu); +int (*neigh_setup)(struct net_device *dev, +struct neigh_parms *);void (*tx_timeout) (struct net_device *dev);struct net_device_stats * (*get_stats)(struct net_device *dev); void (*vlan_rx_register)(struct net_device *dev,
net/bridge/br_device.c +5 -5
@@ -163,10 +163,11 @@ static const struct ethtool_ops br_ethtostatic const struct net_device_ops br_netdev_ops = { .ndo_open = br_dev_open, .ndo_stop = br_dev_stop, - .ndo_set_mac_address = br_set_mac_address, - .ndo_set_multicast_list = br_dev_set_multicast_list, - .ndo_change_mtu = br_change_mtu, - .ndo_do_ioctl = br_dev_ioctl, + .ndo_start_xmit = br_dev_xmit, + .ndo_set_mac_address = br_set_mac_address, + .ndo_set_multicast_list = br_dev_set_multicast_list, + .ndo_change_mtu = br_change_mtu, + .ndo_do_ioctl = br_dev_ioctl, };void br_dev_setup (struct net_device *dev)
@@ -175,7 +176,6 @@ void br_dev_setup(struct net_device *devether_setup (dev); dev->netdev_ops = &br_netdev_ops; - dev->hard_start_xmit = br_dev_xmit; dev->destructor = free_netdev;SET_ETHTOOL_OPS (dev, &br_ethtool_ops); dev->tx_queue_len =0 ;
net/bridge/br_if.c +1 -1
@@ -373,7 +373,7 @@ int br_add_if(struct net_bridge *br, strif (dev->flags &IFF_LOOPBACK || dev->type !=ARPHRD_ETHER )return -EINVAL ; -if (dev->hard_start_xmit == br_dev_xmit) +if (dev->netdev_ops->ndo_start_xmit == br_dev_xmit)return -ELOOP ;if (dev->br_port !=NULL )
net/core/dev.c +8 -4
@@ -1660,6 +1660,9 @@ static int dev_gso_segment(struct sk_bufint dev_hard_start_xmit (struct sk_buff *skb,struct net_device *dev,struct netdev_queue *txq) { +const struct net_device_ops *ops = dev->netdev_ops; + +prefetch (&dev->netdev_ops->ndo_start_xmit);if (likely (!skb->next)) {if (!list_empty (&ptype_all))dev_queue_xmit_nit (skb, dev);
@@ -1671,7 +1674,7 @@ int dev_hard_start_xmit(struct sk_buff * goto gso; } -return dev->hard_start_xmit (skb, dev); +return ops->ndo_start_xmit (skb, dev); } gso:
@@ -1681,7 +1684,7 @@ gso: skb->next = nskb->next; nskb->next =NULL ; - rc = dev->hard_start_xmit (nskb, dev); + rc = ops->ndo_start_xmit (nskb, dev);if (unlikely (rc)) { nskb->next = skb->next; skb->next = nskb;
@@ -1755,10 +1758,11 @@ static u16 simple_tx_hash(struct net_devstatic struct netdev_queue *dev_pick_tx (struct net_device *dev,struct sk_buff *skb) { +const struct net_device_ops *ops = dev->netdev_ops;u16 queue_index =0 ; -if (dev->select_queue) - queue_index = dev->select_queue (dev, skb); +if (ops->ndo_select_queue) + queue_index = ops->ndo_select_queue (dev, skb);else if (dev->real_num_tx_queues >1 ) queue_index =simple_tx_hash (dev, skb);
net/core/neighbour.c +3 -3
@@ -1327,9 +1327,9 @@ struct neigh_parms *neigh_parms_alloc(st struct neigh_table *tbl) {struct neigh_parms *p, *ref; -struct net *net; +struct net *net =dev_net (dev); +const struct net_device_ops *ops = dev->netdev_ops; - net =dev_net (dev); ref =lookup_neigh_params (tbl, net,0 );if (!ref)return NULL ;
@@ -1341,7 +1341,7 @@ struct neigh_parms *neigh_parms_alloc(st p->reachable_time =neigh_rand_reach_time (p->base_reachable_time); -if (dev->neigh_setup && dev->neigh_setup (dev, p)) { +if (ops->ndo_neigh_setup && ops->ndo_neigh_setup (dev, p)) {kfree (p);return NULL ; }
net/core/netpoll.c +4 -2
@@ -58,6 +58,7 @@ static void queue_process(struct work_stwhile ((skb =skb_dequeue (&npinfo->txq))) {struct net_device *dev = skb->dev; +const struct net_device_ops *ops = dev->netdev_ops;struct netdev_queue *txq;if (!netif_device_present (dev) || !netif_running (dev)) {
@@ -71,7 +72,7 @@ static void queue_process(struct work_st__netif_tx_lock (txq,smp_processor_id ());if (netif_tx_queue_stopped (txq) ||netif_tx_queue_frozen (txq) || - dev->hard_start_xmit (skb, dev) !=NETDEV_TX_OK ) { + ops->ndo_start_xmit (skb, dev) !=NETDEV_TX_OK ) {skb_queue_head (&npinfo->txq, skb);__netif_tx_unlock (txq);local_irq_restore (flags);
@@ -273,6 +274,7 @@ static void netpoll_send_skb(struct netpint status =NETDEV_TX_BUSY ;unsigned long tries;struct net_device *dev = np->dev; +const struct net_device_ops *ops = dev->netdev_ops;struct netpoll_info *npinfo = np->dev->npinfo;if (!npinfo || !netif_running (dev) || !netif_device_present (dev)) {
@@ -293,7 +295,7 @@ static void netpoll_send_skb(struct netp tries > 0; --tries) {if (__netif_tx_trylock (txq)) {if (!netif_tx_queue_stopped (txq)) - status = dev->hard_start_xmit (skb, dev); + status = ops->ndo_start_xmit (skb, dev);__netif_tx_unlock (txq);if (status ==NETDEV_TX_OK )
net/core/pktgen.c +4 -4
@@ -3357,14 +3357,14 @@ static void pktgen_rem_thread(struct pktstatic __inline__void pktgen_xmit (struct pktgen_dev *pkt_dev) { -struct net_device *odev =NULL ; +struct net_device *odev = pkt_dev->odev; +int (*xmit)(struct sk_buff *,struct net_device *) + = odev->netdev_ops->ndo_start_xmit;struct netdev_queue *txq;__u64 idle_start =0 ;u16 queue_map;int ret; - odev = pkt_dev->odev; -if (pkt_dev->delay_us || pkt_dev->delay_ns) {u64 now;
@@ -3445,7 +3445,7 @@ static __inline__ void pktgen_xmit(strucatomic_inc (&(pkt_dev->skb->users)); retry_now: - ret = odev->hard_start_xmit (pkt_dev->skb, odev); + ret = (*xmit)(pkt_dev->skb, odev);if (likely (ret ==NETDEV_TX_OK )) { pkt_dev->last_ok =1 ; pkt_dev->sofar++;
drivers/net/8139cp.c +1 -1
@@ -1824,6 +1824,7 @@ static const struct net_device_ops cp_ne .ndo_set_multicast_list = cp_set_rx_mode, .ndo_get_stats = cp_get_stats, .ndo_do_ioctl = cp_ioctl, + .ndo_start_xmit = cp_start_xmit, .ndo_tx_timeout = cp_tx_timeout, #if CP_VLAN_TAG_USED .ndo_vlan_rx_register = cp_vlan_rx_register,
@@ -1949,7 +1950,6 @@ static int cp_init_one (struct pci_dev *memcpy (dev->perm_addr, dev->dev_addr, dev->addr_len); dev->netdev_ops = &cp_netdev_ops; - dev->hard_start_xmit = cp_start_xmit;netif_napi_add (dev, &cp->napi, cp_rx_poll,16 ); dev->ethtool_ops = &cp_ethtool_ops; dev->watchdog_timeo =TX_TIMEOUT ;
drivers/net/8139too.c +1 -1
@@ -921,6 +921,7 @@ static const struct net_device_ops rtl81 .ndo_stop = rtl8139_close, .ndo_get_stats = rtl8139_get_stats, .ndo_validate_addr = eth_validate_addr, + .ndo_start_xmit = rtl8139_start_xmit, .ndo_set_multicast_list = rtl8139_set_rx_mode, .ndo_do_ioctl = netdev_ioctl, .ndo_tx_timeout = rtl8139_tx_timeout,
@@ -992,7 +993,6 @@ static int __devinit rtl8139_init_one (s dev->netdev_ops = &rtl8139_netdev_ops; dev->ethtool_ops = &rtl8139_ethtool_ops; dev->watchdog_timeo =TX_TIMEOUT ; - dev->hard_start_xmit = rtl8139_start_xmit;netif_napi_add (dev, &tp->napi, rtl8139_poll,64 );/* note: the hardware is not capable of sg/csum/highdma, however
drivers/net/niu.c +1 -1
@@ -8892,6 +8892,7 @@ static struct net_device * __devinit niustatic const struct net_device_ops niu_netdev_ops = { .ndo_open = niu_open, .ndo_stop = niu_close, + .ndo_start_xmit = niu_start_xmit, .ndo_get_stats = niu_get_stats, .ndo_set_multicast_list = niu_set_rx_mode, .ndo_validate_addr = eth_validate_addr,
@@ -8904,7 +8905,6 @@ static const struct net_device_ops niu_nstatic void __devinit niu_assign_netdev_ops (struct net_device *dev) { dev->netdev_ops = &niu_netdev_ops; - dev->hard_start_xmit = niu_start_xmit; dev->ethtool_ops = &niu_ethtool_ops; dev->watchdog_timeo =NIU_TX_TIMEOUT ; }
drivers/net/r8169.c +1 -1
@@ -1927,6 +1927,7 @@ static const struct net_device_ops rtl81 .ndo_open = rtl8169_open, .ndo_stop = rtl8169_close, .ndo_get_stats = rtl8169_get_stats, + .ndo_start_xmit = rtl8169_start_xmit, .ndo_tx_timeout = rtl8169_tx_timeout, .ndo_validate_addr = eth_validate_addr, .ndo_change_mtu = rtl8169_change_mtu,
@@ -2125,7 +2126,6 @@ rtl8169_init_one(struct pci_dev *pdev, c dev->dev_addr[i] =RTL_R8 (MAC0 + i);memcpy (dev->perm_addr, dev->dev_addr, dev->addr_len); - dev->hard_start_xmit = rtl8169_start_xmit;SET_ETHTOOL_OPS (dev, &rtl8169_ethtool_ops); dev->watchdog_timeo =RTL8169_TX_TIMEOUT ; dev->irq = pdev->irq;
Re: [PATCH 1/9] netdev: add more functions to netdevice ops
From: Stephen Hemminger <[email protected]>
Date: Thu, 20 Nov 2008 09:59:14 -0800
Quoted 8 lines
This patch moves
neigh_setupandhard_start_xmitinto the network device ops structure. For bisection, fix all the previously converted drivers as well. Bonding driver took the biggest hit on this.Added a prefetch of the
hard_start_xmitin the fast path to try and reduce any impact this would have.Signed-off-by Stephen Hemminger <[email protected]>
Applied.
PATCH 2/9 dummy: convert to net_device_ops
In reply to Stephen HemmingerConvert to new network device ops interface.
drivers/net/dummy.c +10 -5
@@ -57,18 +57,23 @@ static void set_multicast_list(struct ne { } +static const struct net_device_ops dummy_netdev_ops = { + .ndo_start_xmit = dummy_xmit, + .ndo_validate_addr = eth_validate_addr, + .ndo_set_multicast_list = set_multicast_list, + .ndo_set_mac_address = dummy_set_address, +}; +static void dummy_setup (struct net_device *dev) { +ether_setup (dev); +/* Initialize the device structure. */ - dev->hard_start_xmit = dummy_xmit; - dev->set_multicast_list = set_multicast_list; - dev->set_mac_address = dummy_set_address; + dev->netdev_ops = &dummy_netdev_ops; dev->destructor = free_netdev;/* Fill in device structure with ethernet-generic values. */ -ether_setup (dev); dev->tx_queue_len =0 ; - dev->change_mtu =NULL ; dev->flags |=IFF_NOARP ; dev->flags &= ~IFF_MULTICAST ;random_ether_addr (dev->dev_addr);
Re: [PATCH 2/9] dummy: convert to net_device_ops
From: Stephen Hemminger <[email protected]>
Date: Thu, 20 Nov 2008 09:59:15 -0800
Quoted 3 lines
Convert to new network device ops interface.
Signed-off-by Stephen Hemminger <[email protected]>
Applied.
PATCH 3/9 ipmr: convert ipmr virtual interface to net_device_ops
In reply to Stephen HemmingerConvert to new network device ops interface.
net/ipv4/ipmr.c +5 -1
@@ -222,12 +222,16 @@ static int reg_vif_xmit(struct sk_buff *return 0 ; } +static const struct net_device_ops reg_vif_netdev_ops = { + .ndo_start_xmit = reg_vif_xmit, +}; +static void reg_vif_setup (struct net_device *dev) { dev->type =ARPHRD_PIMREG ; dev->mtu =ETH_DATA_LEN -sizeof (struct iphdr ) -8 ; dev->flags =IFF_NOARP ; - dev->hard_start_xmit = reg_vif_xmit; + dev->netdev_ops = ®_vif_netdev_ops, dev->destructor = free_netdev; }
net/ipv6/ip6mr.c +5 -1
@@ -416,12 +416,16 @@ static int reg_vif_xmit(struct sk_buff *return 0 ; } +static const struct net_device_ops reg_vif_netdev_ops = { + .ndo_start_xmit = reg_vif_xmit, +}; +static void reg_vif_setup (struct net_device *dev) { dev->type =ARPHRD_PIMREG ; dev->mtu =1500 -sizeof (struct ipv6hdr ) -8 ; dev->flags =IFF_NOARP ; - dev->hard_start_xmit = reg_vif_xmit; + dev->netdev_ops = ®_vif_netdev_ops; dev->destructor = free_netdev; }
Re: [PATCH 3/9] ipmr: convert ipmr virtual interface to net_device_ops
From: Stephen Hemminger <[email protected]>
Date: Thu, 20 Nov 2008 09:59:16 -0800
Quoted 3 lines
Convert to new network device ops interface.
Signed-off-by Stephen Hemminger <[email protected]>
Applied.
PATCH 4/9 fddi: convert to new network device ops
In reply to Stephen HemmingerSimilar to ethernet. Convert infrastructure and the one lone FDDI driver (for the one lone user of that hardware??). Compile tested only.
--- drivers/net/skfp/skfddi.c | 19 ++++++++++++------- include/linux/fddidevice.h | 1 + net/802/fddi.c | 8 ++++++-- 3 files changed, 19 insertions(+), 9 deletions(-)
net/802/fddi.c +6 -2
@@ -167,23 +167,27 @@ __be16 fddi_type_trans(struct sk_buff *sEXPORT_SYMBOL (fddi_type_trans); -static int fddi_change_mtu (struct net_device *dev,int new_mtu) +int fddi_change_mtu (struct net_device *dev,int new_mtu) {if ((new_mtu <FDDI_K_SNAP_HLEN ) || (new_mtu >FDDI_K_SNAP_DLEN ))return (-EINVAL ); dev->mtu = new_mtu;return (0 ); } +EXPORT_SYMBOL (fddi_change_mtu);static const struct header_ops fddi_header_ops = { .create = fddi_header, .rebuild = fddi_rebuild_header, }; +static void fddi_setup (struct net_device *dev) { - dev->change_mtu = fddi_change_mtu; dev->header_ops = &fddi_header_ops; +#ifdef CONFIG_COMPAT_NET_DEV_OPS + dev->change_mtu = fddi_change_mtu, +#endif dev->type =ARPHRD_FDDI ; dev->hard_header_len =FDDI_K_SNAP_HLEN +3 ;/* Assume 802.2 SNAP hdr len + 3 pad bytes */
include/linux/fddidevice.h +1 -0
@@ -27,6 +27,7 @@#ifdef __KERNEL__extern __be16 fddi_type_trans (struct sk_buff *skb,struct net_device *dev); +extern int fddi_change_mtu (struct net_device *dev,int new_mtu);extern struct net_device *alloc_fddidev (int sizeof_priv);#endif
drivers/net/skfp/skfddi.c +12 -7
@@ -168,6 +168,17 @@ static int num_boards; /* total number o #define PRINTK(s, args...)#endif // DRIVERDEBUG +static const struct net_device_ops skfp_netdev_ops = { + .ndo_open = skfp_open, + .ndo_stop = skfp_close, + .ndo_start_xmit = skfp_send_pkt, + .ndo_get_stats = skfp_ctl_get_stats, + .ndo_change_mtu = fddi_change_mtu, + .ndo_set_multicast_list = skfp_ctl_set_multicast_list, + .ndo_set_mac_address = skfp_ctl_set_mac_address, + .ndo_do_ioctl = skfp_ioctl, +}; +/* * ================= * = skfp_init_one =
@@ -253,13 +264,7 @@ static int skfp_init_one(struct pci_dev } dev->irq = pdev->irq; - dev->get_stats = &skfp_ctl_get_stats; - dev->open = &skfp_open; - dev->stop = &skfp_close; - dev->hard_start_xmit = &skfp_send_pkt; - dev->set_multicast_list = &skfp_ctl_set_multicast_list; - dev->set_mac_address = &skfp_ctl_set_mac_address; - dev->do_ioctl = &skfp_ioctl; + dev->netdev_ops = &skfp_netdev_ops;SET_NETDEV_DEV (dev, &pdev->dev);
Re: [PATCH 4/9] fddi: convert to new network device ops
From: Stephen Hemminger <[email protected]>
Date: Thu, 20 Nov 2008 09:59:17 -0800
Quoted 4 lines
Similar to ethernet. Convert infrastructure and the one lone FDDI driver (for the one lone user of that hardware??). Compile tested only.
Signed-off-by Stephen Hemminger <[email protected]>
Applied.
PATCH 5/9 defxx: convert driver to net_device_ops
In reply to Stephen HemmingerConvert this driver to net_device_ops.
drivers/net/defxx.c +10 -7
@@ -477,6 +477,15 @@ static void dfx_get_bars(struct device * } } +static const struct net_device_ops dfx_netdev_ops = { + .ndo_open = dfx_open, + .ndo_stop = dfx_close, + .ndo_start_xmit = dfx_xmt_queue_pkt, + .ndo_get_stats = dfx_ctl_get_stats, + .ndo_set_multicast_list = dfx_ctl_set_multicast_list, + .ndo_set_mac_address = dfx_ctl_set_mac_address, +}; +/* * ================ * = dfx_register =
@@ -573,13 +582,7 @@ static int __devinit dfx_register(struct }/* Initialize new device structure */ - - dev->get_stats = dfx_ctl_get_stats; - dev->open = dfx_open; - dev->stop = dfx_close; - dev->hard_start_xmit = dfx_xmt_queue_pkt; - dev->set_multicast_list = dfx_ctl_set_multicast_list; - dev->set_mac_address = dfx_ctl_set_mac_address; + dev->netdev_ops = &dfx_netdev_ops;if (dfx_bus_pci)pci_set_master (to_pci_dev (bdev));
Re: [PATCH 5/9] defxx: convert driver to net_device_ops
From: Stephen Hemminger <[email protected]>
Date: Thu, 20 Nov 2008 09:59:18 -0800
Quoted 3 lines
Convert this driver to
net_device_ops.Signed-off-by Stephen Hemminger <[email protected]>
Applied.
PATCH 6/9 hippi: convert driver to net_device_ops
In reply to Stephen HemmingerConvert the HIPPI infrastructure for use with net_device_ops.
--- drivers/net/rrunner.c | 15 +++++++++++---- include/linux/hippidevice.h | 4 +++- net/802/hippi.c | 14 +++++++++----- 3 files changed, 23 insertions(+), 10 deletions(-)
include/linux/hippidevice.h +3 -1
@@ -32,7 +32,9 @@ struct hippi_cb { };extern __be16 hippi_type_trans (struct sk_buff *skb,struct net_device *dev); - +extern int hippi_change_mtu (struct net_device *dev,int new_mtu); +extern int hippi_mac_addr (struct net_device *dev,void *p); +extern int hippi_neigh_setup_dev (struct net_device *dev,struct neigh_parms *p);extern struct net_device *alloc_hippi_dev (int sizeof_priv);#endif
net/802/hippi.c +9 -5
@@ -144,7 +144,7 @@ __be16 hippi_type_trans(struct sk_buff *EXPORT_SYMBOL (hippi_type_trans); -static int hippi_change_mtu (struct net_device *dev,int new_mtu) +int hippi_change_mtu (struct net_device *dev,int new_mtu) {/* * HIPPI's got these nice large MTUs.
@@ -154,12 +154,13 @@ static int hippi_change_mtu(struct net_d dev->mtu = new_mtu;return (0 ); } +EXPORT_SYMBOL (hippi_change_mtu);/* * For HIPPI we will actually use the lower 4 bytes of the hardware * address as the I-FIELD rather than the actual hardware address. */ -static int hippi_mac_addr (struct net_device *dev,void *p) +int hippi_mac_addr (struct net_device *dev,void *p) {struct sockaddr *addr = p;if (netif_running (dev))
@@ -167,8 +168,9 @@ static int hippi_mac_addr(struct net_devmemcpy (dev->dev_addr, addr->sa_data, dev->addr_len);return 0 ; } +EXPORT_SYMBOL (hippi_mac_addr); -static int hippi_neigh_setup_dev (struct net_device *dev,struct neigh_parms *p) +int hippi_neigh_setup_dev (struct net_device *dev,struct neigh_parms *p) {/* Never send broadcast/multicast ARP messages */ p->mcast_probes =0 ;
@@ -181,6 +183,7 @@ static int hippi_neigh_setup_dev(struct p->ucast_probes =0 ;return 0 ; } +EXPORT_SYMBOL (hippi_neigh_setup_dev);static const struct header_ops hippi_header_ops = { .create = hippi_header,
@@ -190,11 +193,12 @@ static const struct header_ops hippi_heastatic void hippi_setup (struct net_device *dev) { - dev->set_multicast_list =NULL ; +#ifdef CONFIG_COMPAT_NET_DEV_OPS dev->change_mtu = hippi_change_mtu; - dev->header_ops = &hippi_header_ops; dev->set_mac_address = hippi_mac_addr; dev->neigh_setup = hippi_neigh_setup_dev; +#endif + dev->header_ops = &hippi_header_ops;/* * We don't support HIPPI `ARP' for the time being, and probably
drivers/net/rrunner.c +11 -4
@@ -63,6 +63,16 @@ MODULE_LICENSE("GPL");static char version[]__devinitdata ="rrunner.c: v0.50 11/11/2002 Jes Sorensen ([email protected])\n" ; + +static const struct net_device_ops rr_netdev_ops = { + .ndo_open = rr_open, + .ndo_stop = rr_close, + .ndo_do_ioctl = rr_ioctl, + .ndo_start_xmit = rr_start_xmit, + .ndo_change_mtu = hippi_change_mtu, + .ndo_set_mac_address = hippi_mac_addr, +}; +/* * Implementation notes: *
@@ -115,10 +125,7 @@ static int __devinit rr_init_one(structspin_lock_init (&rrpriv->lock); dev->irq = pdev->irq; - dev->open = &rr_open; - dev->hard_start_xmit = &rr_start_xmit; - dev->stop = &rr_close; - dev->do_ioctl = &rr_ioctl; + dev->netdev_ops = &rr_netdev_ops; dev->base_addr =pci_resource_start (pdev,0 );
Re: [PATCH 6/9] hippi: convert driver to net_device_ops
From: Stephen Hemminger <[email protected]>
Date: Thu, 20 Nov 2008 09:59:19 -0800
Quoted 3 lines
Convert the HIPPI infrastructure for use with
net_device_ops.Signed-off-by Stephen Hemminger <[email protected]>
Applied.
PATCH 7/9 ipip: convert to net_device_ops
In reply to Stephen HemmingerConvert to network device ops. Needed to change to directly call the init routine since two sides share same ops. In the process found by inspection a device ref count leak if register_netdevice failed.
net/ipv4/ipip.c +17 -16
@@ -130,8 +130,8 @@ struct ipip_net {struct net_device *fb_tunnel_dev; }; -static int ipip_fb_tunnel_init (struct net_device *dev); -static int ipip_tunnel_init (struct net_device *dev); +static void ipip_fb_tunnel_init (struct net_device *dev); +static void ipip_tunnel_init (struct net_device *dev);static void ipip_tunnel_setup (struct net_device *dev);static DEFINE_RWLOCK (ipip_lock);
@@ -245,9 +245,10 @@ static struct ip_tunnel * ipip_tunnel_lo } nt =netdev_priv (dev); - dev->init = ipip_tunnel_init; nt->parms = *parms; +ipip_tunnel_init (dev); +if (register_netdevice (dev) <0 ) goto failed_free;
@@ -691,12 +692,17 @@ static int ipip_tunnel_change_mtu(structreturn 0 ; } +static const struct net_device_ops ipip_netdev_ops = { + .ndo_uninit = ipip_tunnel_uninit, + .ndo_start_xmit = ipip_tunnel_xmit, + .ndo_do_ioctl = ipip_tunnel_ioctl, + .ndo_change_mtu = ipip_tunnel_change_mtu, + +}; +static void ipip_tunnel_setup (struct net_device *dev) { - dev->uninit = ipip_tunnel_uninit; - dev->hard_start_xmit = ipip_tunnel_xmit; - dev->do_ioctl = ipip_tunnel_ioctl; - dev->change_mtu = ipip_tunnel_change_mtu; + dev->netdev_ops = &ipip_netdev_ops; dev->destructor = free_netdev; dev->type =ARPHRD_TUNNEL ;
@@ -708,11 +714,9 @@ static void ipip_tunnel_setup(struct net dev->features |=NETIF_F_NETNS_LOCAL ; } -static int ipip_tunnel_init (struct net_device *dev) +static void ipip_tunnel_init (struct net_device *dev) { -struct ip_tunnel *tunnel; - - tunnel =netdev_priv (dev); +struct ip_tunnel *tunnel =netdev_priv (dev); tunnel->dev = dev;strcpy (tunnel->parms.name, dev->name);
@@ -721,11 +725,9 @@ static int ipip_tunnel_init(struct net_dmemcpy (dev->broadcast, &tunnel->parms.iph.daddr,4 );ipip_tunnel_bind_dev (dev); - -return 0 ; } -static int ipip_fb_tunnel_init (struct net_device *dev) +static void ipip_fb_tunnel_init (struct net_device *dev) {struct ip_tunnel *tunnel =netdev_priv (dev);struct iphdr *iph = &tunnel->parms.iph;
@@ -740,7 +742,6 @@ static int ipip_fb_tunnel_init(struct nedev_hold (dev); ipn->tunnels_wc[0 ] = tunnel; -return 0 ; }static struct xfrm_tunnel ipip_handler = {
@@ -793,7 +794,7 @@ static int ipip_init_net(struct net *net goto err_alloc_dev; } - ipn->fb_tunnel_dev->init = ipip_fb_tunnel_init; +ipip_fb_tunnel_init (ipn->fb_tunnel_dev);dev_net_set (ipn->fb_tunnel_dev, net);if ((err =register_netdev (ipn->fb_tunnel_dev)))
Re: [PATCH 7/9] ipip: convert to net_device_ops
From: Stephen Hemminger <[email protected]>
Date: Thu, 20 Nov 2008 09:59:20 -0800
Quoted 5 lines
Convert to network device ops. Needed to change to directly call the init routine since two sides share same ops. In the process found by inspection a device ref count leak if
register_netdevicefailed.Signed-off-by Stephen Hemminger <[email protected]>
Applied.
PATCH 8/9 ipv6: convert tunnels to net_device_ops
In reply to Stephen HemmingerLike IPV4, convert the tunnel virtual devices to use net_device_ops.
--- net/ipv6/ip6_tunnel.c | 29 +++++++++++++++-------------- net/ipv6/sit.c | 33 +++++++++++++++++---------------- 2 files changed, 32 insertions(+), 30 deletions(-)
net/ipv6/sit.c +17 -16
@@ -62,8 +62,8 @@#define HASH_SIZE 16#define HASH (addr) (((__force u32)addr^((__force u32)addr>>4))&0xF) -static int ipip6_fb_tunnel_init (struct net_device *dev); -static int ipip6_tunnel_init (struct net_device *dev); +static void ipip6_fb_tunnel_init (struct net_device *dev); +static void ipip6_tunnel_init (struct net_device *dev);static void ipip6_tunnel_setup (struct net_device *dev);static int sit_net_id;
@@ -188,7 +188,8 @@ static struct ip_tunnel * ipip6_tunnel_l } nt =netdev_priv (dev); - dev->init = ipip6_tunnel_init; +ipip6_tunnel_init (dev); + nt->parms = *parms;if (parms->i_flags &SIT_ISATAP )
@@ -926,13 +927,17 @@ static int ipip6_tunnel_change_mtu(strucreturn 0 ; } +static const struct net_device_ops ipip6_netdev_ops = { + .ndo_uninit = ipip6_tunnel_uninit, + .ndo_start_xmit = ipip6_tunnel_xmit, + .ndo_do_ioctl = ipip6_tunnel_ioctl, + .ndo_change_mtu = ipip6_tunnel_change_mtu, +}; +static void ipip6_tunnel_setup (struct net_device *dev) { - dev->uninit = ipip6_tunnel_uninit; + dev->netdev_ops = &ipip6_netdev_ops; dev->destructor = free_netdev; - dev->hard_start_xmit = ipip6_tunnel_xmit; - dev->do_ioctl = ipip6_tunnel_ioctl; - dev->change_mtu = ipip6_tunnel_change_mtu; dev->type =ARPHRD_SIT ; dev->hard_header_len =LL_MAX_HEADER +sizeof (struct iphdr );
@@ -943,11 +948,9 @@ static void ipip6_tunnel_setup(struct ne dev->features |=NETIF_F_NETNS_LOCAL ; } -static int ipip6_tunnel_init (struct net_device *dev) +static void ipip6_tunnel_init (struct net_device *dev) { -struct ip_tunnel *tunnel; - - tunnel =netdev_priv (dev); +struct ip_tunnel *tunnel =netdev_priv (dev); tunnel->dev = dev;strcpy (tunnel->parms.name, dev->name);
@@ -956,11 +959,9 @@ static int ipip6_tunnel_init(struct net_memcpy (dev->broadcast, &tunnel->parms.iph.daddr,4 );ipip6_tunnel_bind_dev (dev); - -return 0 ; } -static int ipip6_fb_tunnel_init (struct net_device *dev) +static void ipip6_fb_tunnel_init (struct net_device *dev) {struct ip_tunnel *tunnel =netdev_priv (dev);struct iphdr *iph = &tunnel->parms.iph;
@@ -977,7 +978,6 @@ static int ipip6_fb_tunnel_init(struct ndev_hold (dev); sitn->tunnels_wc[0 ] = tunnel; -return 0 ; }static struct xfrm_tunnel sit_handler = {
@@ -1026,7 +1026,7 @@ static int sit_init_net(struct net *net) goto err_alloc_dev; } - sitn->fb_tunnel_dev->init = ipip6_fb_tunnel_init; +ipip6_fb_tunnel_init (sitn->fb_tunnel_dev);dev_net_set (sitn->fb_tunnel_dev, net);if ((err =register_netdev (sitn->fb_tunnel_dev)))
@@ -1035,6 +1035,7 @@ static int sit_init_net(struct net *net)return 0 ; err_reg_dev: +dev_put (sitn->fb_tunnel_dev);free_netdev (sitn->fb_tunnel_dev); err_alloc_dev:/* nothing */
net/ipv6/ip6_tunnel.c +15 -14
@@ -74,8 +74,8 @@ MODULE_LICENSE("GPL"); (addr)->s6_addr32[2] ^ (addr)->s6_addr32[3]) & \ (HASH_SIZE - 1)) -static int ip6_fb_tnl_dev_init (struct net_device *dev); -static int ip6_tnl_dev_init (struct net_device *dev); +static void ip6_fb_tnl_dev_init (struct net_device *dev); +static void ip6_tnl_dev_init (struct net_device *dev);static void ip6_tnl_dev_setup (struct net_device *dev);static int ip6_tnl_net_id;
@@ -249,7 +249,7 @@ static struct ip6_tnl *ip6_tnl_create(st } t =netdev_priv (dev); - dev->init = ip6_tnl_dev_init; +ip6_tnl_dev_init (dev); t->parms = *p;if ((err =register_netdevice (dev)) <0 )
@@ -1306,6 +1306,14 @@ ip6_tnl_change_mtu(struct net_device *dereturn 0 ; } + +static const struct net_device_ops ip6_tnl_netdev_ops = { + .ndo_uninit = ip6_tnl_dev_uninit, + .ndo_start_xmit = ip6_tnl_xmit, + .ndo_do_ioctl = ip6_tnl_ioctl, + .ndo_change_mtu = ip6_tnl_change_mtu, +}; +/** * ip6_tnl_dev_setup - setup virtual tunnel device * @dev: virtual device associated with tunnel
@@ -1316,11 +1324,8 @@ ip6_tnl_change_mtu(struct net_device *destatic void ip6_tnl_dev_setup (struct net_device *dev) { - dev->uninit = ip6_tnl_dev_uninit; + dev->netdev_ops = &ip6_tnl_netdev_ops; dev->destructor = free_netdev; - dev->hard_start_xmit = ip6_tnl_xmit; - dev->do_ioctl = ip6_tnl_ioctl; - dev->change_mtu = ip6_tnl_change_mtu; dev->type =ARPHRD_TUNNEL6 ; dev->hard_header_len =LL_MAX_HEADER +sizeof (struct ipv6hdr );
@@ -1349,13 +1354,11 @@ ip6_tnl_dev_init_gen(struct net_device ** @dev: virtual device associated with tunnel **/ -static int -ip6_tnl_dev_init (struct net_device *dev) +static void ip6_tnl_dev_init (struct net_device *dev) {struct ip6_tnl *t =netdev_priv (dev);ip6_tnl_dev_init_gen (dev);ip6_tnl_link_config (t); -return 0 ; }/**
@@ -1365,8 +1368,7 @@ ip6_tnl_dev_init(struct net_device *dev)* Return: 0 **/ -static int -ip6_fb_tnl_dev_init (struct net_device *dev) +static void ip6_fb_tnl_dev_init (struct net_device *dev) {struct ip6_tnl *t =netdev_priv (dev);struct net *net =dev_net (dev);
@@ -1376,7 +1378,6 @@ ip6_fb_tnl_dev_init(struct net_device *d t->parms.proto =IPPROTO_IPV6 ;dev_hold (dev); ip6n->tnls_wc[0 ] = t; -return 0 ; }static struct xfrm6_tunnel ip4ip6_handler = {
@@ -1429,7 +1430,7 @@ static int ip6_tnl_init_net(struct net *if (!ip6n->fb_tnl_dev) goto err_alloc_dev; - ip6n->fb_tnl_dev->init = ip6_fb_tnl_dev_init; +ip6_fb_tnl_dev_init (ip6n->fb_tnl_dev);dev_net_set (ip6n->fb_tnl_dev, net); err =register_netdev (ip6n->fb_tnl_dev);
Re: [PATCH 8/9] ipv6: convert tunnels to net_device_ops
From: Stephen Hemminger <[email protected]>
Date: Thu, 20 Nov 2008 09:59:21 -0800
Quoted 3 lines
Like IPV4, convert the tunnel virtual devices to use
net_device_ops.Signed-off-by Stephen Hemminger <[email protected]>
Applied.
PATCH 9/9 ipgre: convert to netdevice_ops
In reply to Stephen HemmingerConvert ipgre tunnel to netdevice ops.
net/ipv4/ip_gre.c +26 -16
@@ -126,8 +126,6 @@ static int ipgre_tunnel_bind_dev(struct/* Fallback tunnel: no source, no destination, no key, no options */ -static int ipgre_fb_tunnel_init (struct net_device *dev); -#define HASH_SIZE 16static int ipgre_net_id;
@@ -1142,6 +1140,7 @@ static int ipgre_open(struct net_devicestatic int ipgre_close (struct net_device *dev) {struct ip_tunnel *t =netdev_priv (dev); +if (ipv4_is_multicast (t->parms.iph.daddr) && t->mlink) {struct in_device *in_dev; in_dev =inetdev_by_index (dev_net (dev), t->mlink);
@@ -1155,14 +1154,22 @@ static int ipgre_close(struct net_device#endif +static const struct net_device_ops ipgre_netdev_ops = { + .ndo_init = ipgre_tunnel_init, + .ndo_uninit = ipgre_tunnel_uninit, +#ifdef CONFIG_NET_IPGRE_BROADCAST + .ndo_open = ipgre_open, + .ndo_stop = ipgre_close, +#endif + .ndo_start_xmit = ipgre_tunnel_xmit, + .ndo_do_ioctl = ipgre_tunnel_ioctl, + .ndo_change_mtu = ipgre_tunnel_change_mtu, +}; +static void ipgre_tunnel_setup (struct net_device *dev) { - dev->init = ipgre_tunnel_init; - dev->uninit = ipgre_tunnel_uninit; + dev->netdev_ops = &ipgre_netdev_ops; dev->destructor = free_netdev; - dev->hard_start_xmit = ipgre_tunnel_xmit; - dev->do_ioctl = ipgre_tunnel_ioctl; - dev->change_mtu = ipgre_tunnel_change_mtu; dev->type =ARPHRD_IPGRE ; dev->needed_headroom =LL_MAX_HEADER +sizeof (struct iphdr ) +4 ;
@@ -1194,8 +1201,6 @@ static int ipgre_tunnel_init(struct net_return -EINVAL ; dev->flags =IFF_BROADCAST ; dev->header_ops = &ipgre_header_ops; - dev->open = ipgre_open; - dev->stop = ipgre_close; }#endif }else
@@ -1204,7 +1209,7 @@ static int ipgre_tunnel_init(struct net_return 0 ; } -static int ipgre_fb_tunnel_init (struct net_device *dev) +static void ipgre_fb_tunnel_init (struct net_device *dev) {struct ip_tunnel *tunnel =netdev_priv (dev);struct iphdr *iph = &tunnel->parms.iph;
@@ -1220,7 +1225,6 @@ static int ipgre_fb_tunnel_init(struct ndev_hold (dev); ign->tunnels_wc[0 ] = tunnel; -return 0 ; }
@@ -1265,7 +1269,7 @@ static int ipgre_init_net(struct net *ne goto err_alloc_dev; } - ign->fb_tunnel_dev->init = ipgre_fb_tunnel_init; +ipgre_fb_tunnel_init (ign->fb_tunnel_dev);dev_net_set (ign->fb_tunnel_dev, net); ign->fb_tunnel_dev->rtnl_link_ops = &ipgre_link_ops;
@@ -1397,16 +1401,22 @@ static int ipgre_tap_init(struct net_devreturn 0 ; } +static const struct net_device_ops ipgre_tap_netdev_ops = { + .ndo_init = ipgre_tap_init, + .ndo_uninit = ipgre_tunnel_uninit, + .ndo_start_xmit = ipgre_tunnel_xmit, + .ndo_set_mac_address = eth_mac_addr, + .ndo_validate_addr = eth_validate_addr, + .ndo_change_mtu = ipgre_tunnel_change_mtu, +}; +static void ipgre_tap_setup (struct net_device *dev) {ether_setup (dev); - dev->init = ipgre_tap_init; - dev->uninit = ipgre_tunnel_uninit; + dev->netdev_ops = &ipgre_netdev_ops; dev->destructor = free_netdev; - dev->hard_start_xmit = ipgre_tunnel_xmit; - dev->change_mtu = ipgre_tunnel_change_mtu; dev->iflink =0 ; dev->features |=NETIF_F_NETNS_LOCAL ;
Re: [PATCH 9/9] ipgre: convert to netdevice_ops
From: Stephen Hemminger <[email protected]>
Date: Thu, 20 Nov 2008 09:59:22 -0800
Quoted 3 lines
Convert ipgre tunnel to netdevice ops.
Signed-off-by Stephen Hemminger <[email protected]>
Applied.