mlx4: Initialize ConnectX HCA Ethernet driver (mlx4_en)
authorXiao Jia <stfairy@gmail.com>
Thu, 17 Sep 2015 02:58:08 +0000 (19:58 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 23 Sep 2015 20:46:27 +0000 (16:46 -0400)
kern/drivers/net/mlx4/en_main.c
kern/drivers/net/mlx4/en_netdev.c
kern/drivers/net/mlx4/main.c
kern/drivers/net/mlx4/mlx4_en.h
kern/include/linux/mlx4/device.h

index 99c15cd..d98253e 100644 (file)
@@ -92,6 +92,17 @@ void en_print(const char *level, const struct mlx4_en_priv *priv,
                       level, DRV_NAME, dev_name(&priv->mdev->pdev->dev),
                       priv->port, &vaf);
        va_end(args);
+#else
+       va_list args;
+
+       va_start(args, format);
+       if (priv->registered)
+               printk("%s%s: %s: ", level, DRV_NAME, priv->dev->name);
+       else
+               printk("%s%s: %s: Port %d: ", level, DRV_NAME,
+                      dev_name(&priv->mdev->pdev->dev), priv->port);
+       vcprintf(format, args);
+       va_end(args);
 #endif
 }
 
@@ -318,6 +329,16 @@ static void *mlx4_en_add(struct mlx4_dev *dev)
                mdev->nb.notifier_call = NULL;
                mlx4_err(mdev, "Failed to create notifier\n");
        }
+#else
+       /* FIXME initialize all ports */
+       mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_ETH) {
+               if (i == 1) {
+                       mlx4_en_init_netdev(mdev, i, dev->persist->edev,
+                                           &mdev->profile.prof[i]);
+               } else {
+                       mdev->pndev[i] = NULL;
+               }
+       }
 #endif
 
        return mdev;
@@ -366,7 +387,7 @@ static void mlx4_en_verify_params(void)
        }
 }
 
-static int __init mlx4_en_init(void)
+int mlx4_en_init(void)
 {
        mlx4_en_verify_params();
 
index bd7e036..903dfeb 100644 (file)
@@ -2834,9 +2834,9 @@ void mlx4_en_set_stats_bitmap(struct mlx4_dev *dev,
 }
 
 int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
+                       struct ether *dev,
                        struct mlx4_en_port_profile *prof)
 {
-       struct ether *dev;
        struct mlx4_en_priv *priv;
        int i;
        int err;
@@ -2852,6 +2852,8 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
        netif_set_real_num_rx_queues(dev, prof->rx_ring_num);
 
        SET_NETDEV_DEV(dev, &mdev->dev->persist->pdev->dev);
+#else
+       dev->ctlr = kzmalloc(sizeof(struct mlx4_en_priv), KMALLOC_WAIT);
 #endif
 
        /*
index 24a99b7..fc55a6c 100644 (file)
@@ -3852,6 +3852,8 @@ module_exit(mlx4_cleanup);
 #include <ip.h>
 #include <ns.h>
 
+extern int mlx4_en_init(void);
+
 static const struct pci_device_id *search_pci_table(struct pci_device *needle)
 {
        const struct pci_device_id *i;
@@ -3872,6 +3874,7 @@ static int mlx4_pnp(struct ether *edev)
 {
        static bool probed = false; // TODO support multiple devices
 
+       struct mlx4_dev_persistent *persist;
        const struct pci_device_id *pci_id;
        struct pci_device *pdev;
 
@@ -3899,6 +3902,10 @@ static int mlx4_pnp(struct ether *edev)
        mlx4_init();
        mlx4_init_one(pdev, pci_id);
 
+       persist = pci_get_drvdata(pdev);
+       persist->edev = edev;
+       mlx4_en_init();
+
        return 0;
 }
 
index ede278a..402a171 100644 (file)
@@ -732,6 +732,7 @@ void mlx4_en_update_loopback_state(struct ether *dev,
 
 void mlx4_en_destroy_netdev(struct ether *dev);
 int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
+                       struct ether *dev,
                        struct mlx4_en_port_profile *prof);
 
 int mlx4_en_start_port(struct ether *dev);
index f234e03..662ef23 100644 (file)
@@ -802,6 +802,7 @@ struct mlx4_dev_persistent {
        uint8_t         state;
        qlock_t interface_state_mutex; /* protect SW state */
        uint8_t interface_state;
+       struct ether *edev;
 };
 
 struct mlx4_dev {