aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/ulp/ipoib/ipoib_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/ulp/ipoib/ipoib_main.c')
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib_main.c44
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:
579err_path: 584err_path:
580 ipoib_neigh_free(dev, neigh); 585 ipoib_neigh_free(dev, neigh);
581err_drop: 586err_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
758static 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
765static void ipoib_timeout(struct net_device *dev) 763static 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)
777static int ipoib_hard_header(struct sk_buff *skb, 775static 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
859void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh) 857void 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
937static const struct header_ops ipoib_header_ops = {
938 .create = ipoib_hard_header,
939};
940
940static void ipoib_setup(struct net_device *dev) 941static 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);