aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband
diff options
context:
space:
mode:
authorJack Morgenstein <jackm@dev.mellanox.co.il>2012-08-03 04:40:56 -0400
committerRoland Dreier <roland@purestorage.com>2012-09-30 23:33:43 -0400
commitafa8fd1db9f295a0c4130bc6d87bf8b05bdd0523 (patch)
tree725c4a2c6a9044ff9ac79e4f6a863393756953f0 /drivers/infiniband
parent026149cbaada391d98f1cbec47c488cb548f753a (diff)
mlx4: Paravirtualize Node Guids for slaves
This is necessary in order to support > 1 VF/PF in a VM for software that uses the node guid as a discriminator, such as librdmacm. Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il> Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r--drivers/infiniband/hw/mlx4/mad.c14
-rw-r--r--drivers/infiniband/hw/mlx4/mlx4_ib.h3
2 files changed, 17 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c
index b91b4865d63..603a114b3df 100644
--- a/drivers/infiniband/hw/mlx4/mad.c
+++ b/drivers/infiniband/hw/mlx4/mad.c
@@ -35,6 +35,7 @@
35#include <rdma/ib_sa.h> 35#include <rdma/ib_sa.h>
36#include <rdma/ib_cache.h> 36#include <rdma/ib_cache.h>
37 37
38#include <linux/random.h>
38#include <linux/mlx4/cmd.h> 39#include <linux/mlx4/cmd.h>
39#include <linux/gfp.h> 40#include <linux/gfp.h>
40#include <rdma/ib_pma.h> 41#include <rdma/ib_pma.h>
@@ -89,6 +90,12 @@ static void handle_lid_change_event(struct mlx4_ib_dev *dev, u8 port_num);
89static void __propagate_pkey_ev(struct mlx4_ib_dev *dev, int port_num, 90static void __propagate_pkey_ev(struct mlx4_ib_dev *dev, int port_num,
90 int block, u32 change_bitmap); 91 int block, u32 change_bitmap);
91 92
93__be64 mlx4_ib_gen_node_guid(void)
94{
95#define NODE_GUID_HI ((u64) (((u64)IB_OPENIB_OUI) << 40))
96 return cpu_to_be64(NODE_GUID_HI | random32());
97}
98
92__be64 mlx4_ib_get_new_demux_tid(struct mlx4_ib_demux_ctx *ctx) 99__be64 mlx4_ib_get_new_demux_tid(struct mlx4_ib_demux_ctx *ctx)
93{ 100{
94 return cpu_to_be64(atomic_inc_return(&ctx->tid)) | 101 return cpu_to_be64(atomic_inc_return(&ctx->tid)) |
@@ -1962,6 +1969,13 @@ int mlx4_ib_init_sriov(struct mlx4_ib_dev *dev)
1962 return 0; 1969 return 0;
1963 } 1970 }
1964 1971
1972 for (i = 0; i < dev->dev->caps.sqp_demux; i++) {
1973 if (i == mlx4_master_func_num(dev->dev))
1974 mlx4_put_slave_node_guid(dev->dev, i, dev->ib_dev.node_guid);
1975 else
1976 mlx4_put_slave_node_guid(dev->dev, i, mlx4_ib_gen_node_guid());
1977 }
1978
1965 err = mlx4_ib_init_alias_guid_service(dev); 1979 err = mlx4_ib_init_alias_guid_service(dev);
1966 if (err) { 1980 if (err) {
1967 mlx4_ib_warn(&dev->ib_dev, "Failed init alias guid process.\n"); 1981 mlx4_ib_warn(&dev->ib_dev, "Failed init alias guid process.\n");
diff --git a/drivers/infiniband/hw/mlx4/mlx4_ib.h b/drivers/infiniband/hw/mlx4/mlx4_ib.h
index e57a220a4d5..e04cbc9a54a 100644
--- a/drivers/infiniband/hw/mlx4/mlx4_ib.h
+++ b/drivers/infiniband/hw/mlx4/mlx4_ib.h
@@ -723,4 +723,7 @@ int mlx4_ib_device_register_sysfs(struct mlx4_ib_dev *device) ;
723 723
724void mlx4_ib_device_unregister_sysfs(struct mlx4_ib_dev *device); 724void mlx4_ib_device_unregister_sysfs(struct mlx4_ib_dev *device);
725 725
726__be64 mlx4_ib_gen_node_guid(void);
727
728
726#endif /* MLX4_IB_H */ 729#endif /* MLX4_IB_H */