mlx4: Add API to query interfaces for given internal device

Updated mlx4_en interface to provide a query function for it's
internal net_device structure.

Signed-off-by: Oren Duer <[EMAIL PROTECTED]>

Index: ofed_kernel-2.6.18-EL5.1.orig/drivers/net/mlx4/en_main.c
===================================================================
--- ofed_kernel-2.6.18-EL5.1.orig.orig/drivers/net/mlx4/en_main.c       
2008-09-04 14:45:56.000000000 +0300
+++ ofed_kernel-2.6.18-EL5.1.orig/drivers/net/mlx4/en_main.c    2008-09-04 
14:46:17.440543000 +0300
@@ -234,10 +234,24 @@ err_free_res:
        return NULL;
 }
 
+enum mlx4_query_reply mlx4_en_query(void *endev_ptr, void *int_dev)
+{
+       struct mlx4_en_dev *mdev = endev_ptr;
+       struct net_device *netdev = int_dev;
+       int p;
+       
+       for (p = 1; p <= MLX4_MAX_PORTS; ++p)
+               if (mdev->pndev[p] == netdev)
+                       return p;
+
+       return MLX4_QUERY_NOT_MINE;
+}
+
 static struct mlx4_interface mlx4_en_interface = {
        .add    = mlx4_en_add,
        .remove = mlx4_en_remove,
-       .event  = mlx4_en_event
+       .event  = mlx4_en_event,
+       .query  = mlx4_en_query
 };
 
 static int __init mlx4_en_init(void)
Index: ofed_kernel-2.6.18-EL5.1.orig/drivers/net/mlx4/intf.c
===================================================================
--- ofed_kernel-2.6.18-EL5.1.orig.orig/drivers/net/mlx4/intf.c  2008-09-04 
14:45:47.000000000 +0300
+++ ofed_kernel-2.6.18-EL5.1.orig/drivers/net/mlx4/intf.c       2008-09-04 
14:46:02.196098000 +0300
@@ -112,6 +112,36 @@ void mlx4_unregister_interface(struct ml
 }
 EXPORT_SYMBOL_GPL(mlx4_unregister_interface);
 
+struct mlx4_dev *mlx4_query_interface(void *int_dev, int *port)
+{
+       struct mlx4_priv *priv;
+       struct mlx4_device_context *dev_ctx;
+       enum mlx4_query_reply r;
+       unsigned long flags;
+
+       mutex_lock(&intf_mutex);
+
+       list_for_each_entry(priv, &dev_list, dev_list) {
+               spin_lock_irqsave(&priv->ctx_lock, flags);
+               list_for_each_entry(dev_ctx, &priv->ctx_list, list) {
+                       if (!dev_ctx->intf->query)
+                               continue;
+                       r = dev_ctx->intf->query(dev_ctx->context, int_dev);
+                       if (r != MLX4_QUERY_NOT_MINE) {
+                               *port = r;
+                               spin_unlock_irqrestore(&priv->ctx_lock, flags);
+                               mutex_unlock(&intf_mutex);
+                               return &priv->dev;
+                       }
+               }
+               spin_unlock_irqrestore(&priv->ctx_lock, flags);
+       }
+
+       mutex_unlock(&intf_mutex);
+       return NULL;
+}
+EXPORT_SYMBOL_GPL(mlx4_query_interface);
+
 void mlx4_dispatch_event(struct mlx4_dev *dev, enum mlx4_dev_event type, int 
port)
 {
        struct mlx4_priv *priv = mlx4_priv(dev);
Index: ofed_kernel-2.6.18-EL5.1.orig/include/linux/mlx4/driver.h
===================================================================
--- ofed_kernel-2.6.18-EL5.1.orig.orig/include/linux/mlx4/driver.h      
2008-09-04 14:45:47.000000000 +0300
+++ ofed_kernel-2.6.18-EL5.1.orig/include/linux/mlx4/driver.h   2008-09-04 
14:46:02.201102000 +0300
@@ -44,15 +44,22 @@ enum mlx4_dev_event {
        MLX4_DEV_EVENT_PORT_REINIT,
 };
 
+enum mlx4_query_reply {
+       MLX4_QUERY_NOT_MINE     = -1,
+       MLX4_QUERY_MINE_NOPORT  = 0
+};
+
 struct mlx4_interface {
        void *                  (*add)   (struct mlx4_dev *dev);
        void                    (*remove)(struct mlx4_dev *dev, void *context);
        void                    (*event) (struct mlx4_dev *dev, void *context,
                                          enum mlx4_dev_event event, int port);
+       enum mlx4_query_reply   (*query) (void *context, void *);
        struct list_head        list;
 };
 
 int mlx4_register_interface(struct mlx4_interface *intf);
 void mlx4_unregister_interface(struct mlx4_interface *intf);
+struct mlx4_dev *mlx4_query_interface(void *, int *port);
 
 #endif /* MLX4_DRIVER_H */
_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to