]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/infiniband/ulp/ipoib/ipoib_main.c
[NET]: Move hardware header operations out of netdevice.
[net-next-2.6.git] / drivers / infiniband / ulp / ipoib / ipoib_main.c
index f2a40ae8e7d0c8af562f03ad7254b62d5db1caf0..2bd76ef57154a0b9cd1115f9c1490f5f5b46437d 100644 (file)
@@ -98,16 +98,20 @@ int ipoib_open(struct net_device *dev)
 
        ipoib_dbg(priv, "bringing up interface\n");
 
+       napi_enable(&priv->napi);
        set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
 
        if (ipoib_pkey_dev_delay_open(dev))
                return 0;
 
-       if (ipoib_ib_dev_open(dev))
+       if (ipoib_ib_dev_open(dev)) {
+               napi_disable(&priv->napi);
                return -EINVAL;
+       }
 
        if (ipoib_ib_dev_up(dev)) {
-               ipoib_ib_dev_stop(dev);
+               ipoib_ib_dev_stop(dev, 1);
+               napi_disable(&priv->napi);
                return -EINVAL;
        }
 
@@ -140,6 +144,7 @@ static int ipoib_stop(struct net_device *dev)
        ipoib_dbg(priv, "stopping interface\n");
 
        clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
+       napi_disable(&priv->napi);
 
        netif_stop_queue(dev);
 
@@ -152,7 +157,7 @@ static int ipoib_stop(struct net_device *dev)
        flush_workqueue(ipoib_workqueue);
 
        ipoib_ib_dev_down(dev, 1);
-       ipoib_ib_dev_stop(dev);
+       ipoib_ib_dev_stop(dev, 1);
 
        if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) {
                struct ipoib_dev_priv *cpriv;
@@ -395,14 +400,10 @@ static void path_rec_completion(int status,
        skb_queue_head_init(&skqueue);
 
        if (!status) {
-               struct ib_ah_attr av = {
-                       .dlid          = be16_to_cpu(pathrec->dlid),
-                       .sl            = pathrec->sl,
-                       .port_num      = priv->port,
-                       .static_rate   = pathrec->rate
-               };
-
-               ah = ipoib_create_ah(dev, priv->pd, &av);
+               struct ib_ah_attr av;
+
+               if (!ib_init_ah_from_path(priv->ca, priv->port, pathrec, &av))
+                       ah = ipoib_create_ah(dev, priv->pd, &av);
        }
 
        spin_lock_irqsave(&priv->lock, flags);
@@ -779,7 +780,7 @@ static void ipoib_timeout(struct net_device *dev)
 static int ipoib_hard_header(struct sk_buff *skb,
                             struct net_device *dev,
                             unsigned short type,
-                            void *daddr, void *saddr, unsigned len)
+                            const void *daddr, const void *saddr, unsigned len)
 {
        struct ipoib_header *header;
 
@@ -939,6 +940,10 @@ void ipoib_dev_cleanup(struct net_device *dev)
        priv->tx_ring = NULL;
 }
 
+static const struct header_ops ipoib_header_ops = {
+       .create = ipoib_hard_header,
+};
+
 static void ipoib_setup(struct net_device *dev)
 {
        struct ipoib_dev_priv *priv = netdev_priv(dev);
@@ -949,10 +954,12 @@ static void ipoib_setup(struct net_device *dev)
        dev->hard_start_xmit     = ipoib_start_xmit;
        dev->get_stats           = ipoib_get_stats;
        dev->tx_timeout          = ipoib_timeout;
-       dev->hard_header         = ipoib_hard_header;
+       dev->header_ops          = &ipoib_header_ops;
        dev->set_multicast_list  = ipoib_set_mcast_list;
        dev->neigh_setup         = ipoib_neigh_setup_dev;
 
+       netif_napi_add(dev, &priv->napi, ipoib_poll, 100);
+
        dev->watchdog_timeo      = HZ;
 
        dev->flags              |= IFF_BROADCAST | IFF_MULTICAST;
@@ -975,8 +982,6 @@ static void ipoib_setup(struct net_device *dev)
 
        netif_carrier_off(dev);
 
-       SET_MODULE_OWNER(dev);
-
        priv->dev = dev;
 
        spin_lock_init(&priv->lock);
@@ -990,7 +995,8 @@ static void ipoib_setup(struct net_device *dev)
        INIT_LIST_HEAD(&priv->dead_ahs);
        INIT_LIST_HEAD(&priv->multicast_list);
 
-       INIT_DELAYED_WORK(&priv->pkey_task,    ipoib_pkey_poll);
+       INIT_DELAYED_WORK(&priv->pkey_poll_task, ipoib_pkey_poll);
+       INIT_WORK(&priv->pkey_event_task, ipoib_pkey_event);
        INIT_DELAYED_WORK(&priv->mcast_task,   ipoib_mcast_join_task);
        INIT_WORK(&priv->flush_task,   ipoib_ib_dev_flush);
        INIT_WORK(&priv->restart_task, ipoib_mcast_restart_task);