diff options
Diffstat (limited to 'drivers/infiniband/ulp/ipoib/ipoib_main.c')
-rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_main.c | 44 |
1 files changed, 21 insertions, 23 deletions
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index ff17fe3c765..e072f3c32ce 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | |||
@@ -98,16 +98,20 @@ int ipoib_open(struct net_device *dev) | |||
98 | 98 | ||
99 | ipoib_dbg(priv, "bringing up interface\n"); | 99 | ipoib_dbg(priv, "bringing up interface\n"); |
100 | 100 | ||
101 | napi_enable(&priv->napi); | ||
101 | set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); | 102 | set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); |
102 | 103 | ||
103 | if (ipoib_pkey_dev_delay_open(dev)) | 104 | if (ipoib_pkey_dev_delay_open(dev)) |
104 | return 0; | 105 | return 0; |
105 | 106 | ||
106 | if (ipoib_ib_dev_open(dev)) | 107 | if (ipoib_ib_dev_open(dev)) { |
108 | napi_disable(&priv->napi); | ||
107 | return -EINVAL; | 109 | return -EINVAL; |
110 | } | ||
108 | 111 | ||
109 | if (ipoib_ib_dev_up(dev)) { | 112 | if (ipoib_ib_dev_up(dev)) { |
110 | ipoib_ib_dev_stop(dev, 1); | 113 | ipoib_ib_dev_stop(dev, 1); |
114 | napi_disable(&priv->napi); | ||
111 | return -EINVAL; | 115 | return -EINVAL; |
112 | } | 116 | } |
113 | 117 | ||
@@ -140,6 +144,7 @@ static int ipoib_stop(struct net_device *dev) | |||
140 | ipoib_dbg(priv, "stopping interface\n"); | 144 | ipoib_dbg(priv, "stopping interface\n"); |
141 | 145 | ||
142 | clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); | 146 | clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); |
147 | napi_disable(&priv->napi); | ||
143 | 148 | ||
144 | netif_stop_queue(dev); | 149 | netif_stop_queue(dev); |
145 | 150 | ||
@@ -514,7 +519,7 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev) | |||
514 | 519 | ||
515 | neigh = ipoib_neigh_alloc(skb->dst->neighbour); | 520 | neigh = ipoib_neigh_alloc(skb->dst->neighbour); |
516 | if (!neigh) { | 521 | if (!neigh) { |
517 | ++priv->stats.tx_dropped; | 522 | ++dev->stats.tx_dropped; |
518 | dev_kfree_skb_any(skb); | 523 | dev_kfree_skb_any(skb); |
519 | return; | 524 | return; |
520 | } | 525 | } |
@@ -579,7 +584,7 @@ err_list: | |||
579 | err_path: | 584 | err_path: |
580 | ipoib_neigh_free(dev, neigh); | 585 | ipoib_neigh_free(dev, neigh); |
581 | err_drop: | 586 | err_drop: |
582 | ++priv->stats.tx_dropped; | 587 | ++dev->stats.tx_dropped; |
583 | dev_kfree_skb_any(skb); | 588 | dev_kfree_skb_any(skb); |
584 | 589 | ||
585 | spin_unlock(&priv->lock); | 590 | spin_unlock(&priv->lock); |
@@ -628,7 +633,7 @@ static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev, | |||
628 | } else | 633 | } else |
629 | __path_add(dev, path); | 634 | __path_add(dev, path); |
630 | } else { | 635 | } else { |
631 | ++priv->stats.tx_dropped; | 636 | ++dev->stats.tx_dropped; |
632 | dev_kfree_skb_any(skb); | 637 | dev_kfree_skb_any(skb); |
633 | } | 638 | } |
634 | 639 | ||
@@ -647,7 +652,7 @@ static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev, | |||
647 | skb_push(skb, sizeof *phdr); | 652 | skb_push(skb, sizeof *phdr); |
648 | __skb_queue_tail(&path->queue, skb); | 653 | __skb_queue_tail(&path->queue, skb); |
649 | } else { | 654 | } else { |
650 | ++priv->stats.tx_dropped; | 655 | ++dev->stats.tx_dropped; |
651 | dev_kfree_skb_any(skb); | 656 | dev_kfree_skb_any(skb); |
652 | } | 657 | } |
653 | 658 | ||
@@ -715,7 +720,7 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
715 | __skb_queue_tail(&neigh->queue, skb); | 720 | __skb_queue_tail(&neigh->queue, skb); |
716 | spin_unlock(&priv->lock); | 721 | spin_unlock(&priv->lock); |
717 | } else { | 722 | } else { |
718 | ++priv->stats.tx_dropped; | 723 | ++dev->stats.tx_dropped; |
719 | dev_kfree_skb_any(skb); | 724 | dev_kfree_skb_any(skb); |
720 | } | 725 | } |
721 | } else { | 726 | } else { |
@@ -741,7 +746,7 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
741 | IPOIB_QPN(phdr->hwaddr), | 746 | IPOIB_QPN(phdr->hwaddr), |
742 | IPOIB_GID_RAW_ARG(phdr->hwaddr + 4)); | 747 | IPOIB_GID_RAW_ARG(phdr->hwaddr + 4)); |
743 | dev_kfree_skb_any(skb); | 748 | dev_kfree_skb_any(skb); |
744 | ++priv->stats.tx_dropped; | 749 | ++dev->stats.tx_dropped; |
745 | goto out; | 750 | goto out; |
746 | } | 751 | } |
747 | 752 | ||
@@ -755,13 +760,6 @@ out: | |||
755 | return NETDEV_TX_OK; | 760 | return NETDEV_TX_OK; |
756 | } | 761 | } |
757 | 762 | ||
758 | static struct net_device_stats *ipoib_get_stats(struct net_device *dev) | ||
759 | { | ||
760 | struct ipoib_dev_priv *priv = netdev_priv(dev); | ||
761 | |||
762 | return &priv->stats; | ||
763 | } | ||
764 | |||
765 | static void ipoib_timeout(struct net_device *dev) | 763 | static void ipoib_timeout(struct net_device *dev) |
766 | { | 764 | { |
767 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 765 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
@@ -777,7 +775,7 @@ static void ipoib_timeout(struct net_device *dev) | |||
777 | static int ipoib_hard_header(struct sk_buff *skb, | 775 | static int ipoib_hard_header(struct sk_buff *skb, |
778 | struct net_device *dev, | 776 | struct net_device *dev, |
779 | unsigned short type, | 777 | unsigned short type, |
780 | void *daddr, void *saddr, unsigned len) | 778 | const void *daddr, const void *saddr, unsigned len) |
781 | { | 779 | { |
782 | struct ipoib_header *header; | 780 | struct ipoib_header *header; |
783 | 781 | ||
@@ -858,11 +856,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(struct neighbour *neighbour) | |||
858 | 856 | ||
859 | void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh) | 857 | void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh) |
860 | { | 858 | { |
861 | struct ipoib_dev_priv *priv = netdev_priv(dev); | ||
862 | struct sk_buff *skb; | 859 | struct sk_buff *skb; |
863 | *to_ipoib_neigh(neigh->neighbour) = NULL; | 860 | *to_ipoib_neigh(neigh->neighbour) = NULL; |
864 | while ((skb = __skb_dequeue(&neigh->queue))) { | 861 | while ((skb = __skb_dequeue(&neigh->queue))) { |
865 | ++priv->stats.tx_dropped; | 862 | ++dev->stats.tx_dropped; |
866 | dev_kfree_skb_any(skb); | 863 | dev_kfree_skb_any(skb); |
867 | } | 864 | } |
868 | if (ipoib_cm_get(neigh)) | 865 | if (ipoib_cm_get(neigh)) |
@@ -937,6 +934,10 @@ void ipoib_dev_cleanup(struct net_device *dev) | |||
937 | priv->tx_ring = NULL; | 934 | priv->tx_ring = NULL; |
938 | } | 935 | } |
939 | 936 | ||
937 | static const struct header_ops ipoib_header_ops = { | ||
938 | .create = ipoib_hard_header, | ||
939 | }; | ||
940 | |||
940 | static void ipoib_setup(struct net_device *dev) | 941 | static void ipoib_setup(struct net_device *dev) |
941 | { | 942 | { |
942 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 943 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
@@ -945,13 +946,12 @@ static void ipoib_setup(struct net_device *dev) | |||
945 | dev->stop = ipoib_stop; | 946 | dev->stop = ipoib_stop; |
946 | dev->change_mtu = ipoib_change_mtu; | 947 | dev->change_mtu = ipoib_change_mtu; |
947 | dev->hard_start_xmit = ipoib_start_xmit; | 948 | dev->hard_start_xmit = ipoib_start_xmit; |
948 | dev->get_stats = ipoib_get_stats; | ||
949 | dev->tx_timeout = ipoib_timeout; | 949 | dev->tx_timeout = ipoib_timeout; |
950 | dev->hard_header = ipoib_hard_header; | 950 | dev->header_ops = &ipoib_header_ops; |
951 | dev->set_multicast_list = ipoib_set_mcast_list; | 951 | dev->set_multicast_list = ipoib_set_mcast_list; |
952 | dev->neigh_setup = ipoib_neigh_setup_dev; | 952 | dev->neigh_setup = ipoib_neigh_setup_dev; |
953 | dev->poll = ipoib_poll; | 953 | |
954 | dev->weight = 100; | 954 | netif_napi_add(dev, &priv->napi, ipoib_poll, 100); |
955 | 955 | ||
956 | dev->watchdog_timeo = HZ; | 956 | dev->watchdog_timeo = HZ; |
957 | 957 | ||
@@ -975,8 +975,6 @@ static void ipoib_setup(struct net_device *dev) | |||
975 | 975 | ||
976 | netif_carrier_off(dev); | 976 | netif_carrier_off(dev); |
977 | 977 | ||
978 | SET_MODULE_OWNER(dev); | ||
979 | |||
980 | priv->dev = dev; | 978 | priv->dev = dev; |
981 | 979 | ||
982 | spin_lock_init(&priv->lock); | 980 | spin_lock_init(&priv->lock); |