From f29fe7ee6b8563eb362e22b8276e817e0337f048 Mon Sep 17 00:00:00 2001
From: Vu Pham <vu@vu-lt.mti.mtl.com>
Date: Mon, 16 Aug 2010 10:16:42 -0700
Subject: [PATCH 08/10] mlx4: Add API to query protocol device of specific port on mlx4_device
Adding new fields in mlx4_interface to set the type of protocol (IB, EN,...)
and interface to query the underline protocol device of a specific port
on the mlx4_device provided
Signed-off-by: Oren Duer <oren@mellanox.co.il>
Signed-off-by: Vu Pham <vu@mellanx.com>
---
drivers/infiniband/hw/mlx4/main.c | 10 +++++++++-
drivers/net/mlx4/en_main.c | 9 +++++++++
drivers/net/mlx4/intf.c | 19 +++++++++++++++++++
include/linux/mlx4/driver.h | 9 +++++++++
4 files changed, 46 insertions(+), 1 deletions(-)
@@ -58,6 +58,12 @@ static const char mlx4_ib_version[] =
DRV_NAME ": Mellanox ConnectX InfiniBand driver v"
DRV_VERSION " (" DRV_RELDATE ")\n";
+static void *get_ibdev(struct mlx4_dev *dev, void *ctx, u8 port)
+{
+ struct mlx4_ib_dev *mlxibdev = ctx;
+ return &mlxibdev->ib_dev;
+}
+
static void init_query_mad(struct ib_smp *mad)
{
mad->base_version = 1;
@@ -749,7 +755,9 @@ static void mlx4_ib_event(struct mlx4_dev *dev, void *ibdev_ptr,
static struct mlx4_interface mlx4_ib_interface = {
.add = mlx4_ib_add,
.remove = mlx4_ib_remove,
- .event = mlx4_ib_event
+ .event = mlx4_ib_event,
+ .get_prot_dev = get_ibdev,
+ .protocol = MLX4_PROT_IB
};
static int __init mlx4_ib_init(void)
@@ -281,10 +281,19 @@ err_free_res:
return NULL;
}
+static void *get_netdev(struct mlx4_dev *dev, void *ctx, u8 port)
+{
+ struct mlx4_en_dev *mdev = ctx;
+
+ return (port <= MLX4_MAX_PORTS) ? mdev->pndev[port] : NULL;
+}
+
static struct mlx4_interface mlx4_en_interface = {
.add = mlx4_en_add,
.remove = mlx4_en_remove,
.event = mlx4_en_event,
+ .get_prot_dev = get_netdev,
+ .protocol = MLX4_PROT_EN
};
static int __init mlx4_en_init(void)
@@ -80,6 +80,25 @@ static void mlx4_remove_device(struct mlx4_interface *intf, struct mlx4_priv *pr
}
}
+void *mlx4_get_prot_dev(struct mlx4_dev *dev, enum mlx4_prot proto, int port)
+{
+ struct mlx4_priv *priv = mlx4_priv(dev);
+ struct mlx4_device_context *dev_ctx;
+ unsigned long flags;
+ void *result = NULL;
+
+ spin_lock_irqsave(&priv->ctx_lock, flags);
+ list_for_each_entry(dev_ctx, &priv->ctx_list, list)
+ if (dev_ctx->intf->protocol == proto && dev_ctx->intf->get_prot_dev) {
+ result = dev_ctx->intf->get_prot_dev(dev, dev_ctx->context, port);
+ break;
+ }
+ spin_unlock_irqrestore(&priv->ctx_lock, flags);
+
+ return result;
+}
+EXPORT_SYMBOL_GPL(mlx4_get_prot_dev);
+
int mlx4_register_interface(struct mlx4_interface *intf)
{
struct mlx4_priv *priv;
@@ -44,15 +44,24 @@ enum mlx4_dev_event {
MLX4_DEV_EVENT_PORT_REINIT,
};
+enum mlx4_prot {
+ MLX4_PROT_IB,
+ MLX4_PROT_EN,
+};
+
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);
+ void * (*get_prot_dev) (struct mlx4_dev *dev,
+ void *context, u8 port);
+ enum mlx4_prot protocol;
struct list_head list;
};
int mlx4_register_interface(struct mlx4_interface *intf);
void mlx4_unregister_interface(struct mlx4_interface *intf);
+void *mlx4_get_prot_dev(struct mlx4_dev *dev, enum mlx4_prot protocol, int port);
#endif /* MLX4_DRIVER_H */
--
1.6.3.3