diff options
author | Jack Morgenstein <jackm@dev.mellanox.co.il> | 2012-08-03 04:40:56 -0400 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2012-09-30 23:33:43 -0400 |
commit | afa8fd1db9f295a0c4130bc6d87bf8b05bdd0523 (patch) | |
tree | 725c4a2c6a9044ff9ac79e4f6a863393756953f0 /drivers/net | |
parent | 026149cbaada391d98f1cbec47c488cb548f753a (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/net')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/cmd.c | 11 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/main.c | 22 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mlx4.h | 1 |
3 files changed, 34 insertions, 0 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c index 78fdbd653fa9..90774b7e47a4 100644 --- a/drivers/net/ethernet/mellanox/mlx4/cmd.c +++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c | |||
@@ -696,6 +696,7 @@ static int mlx4_MAD_IFC_wrapper(struct mlx4_dev *dev, int slave, | |||
696 | struct ib_smp *outsmp = outbox->buf; | 696 | struct ib_smp *outsmp = outbox->buf; |
697 | __be16 *outtab = (__be16 *)(outsmp->data); | 697 | __be16 *outtab = (__be16 *)(outsmp->data); |
698 | __be32 slave_cap_mask; | 698 | __be32 slave_cap_mask; |
699 | __be64 slave_node_guid; | ||
699 | port = vhcr->in_modifier; | 700 | port = vhcr->in_modifier; |
700 | 701 | ||
701 | if (smp->base_version == 1 && | 702 | if (smp->base_version == 1 && |
@@ -755,6 +756,16 @@ static int mlx4_MAD_IFC_wrapper(struct mlx4_dev *dev, int slave, | |||
755 | } | 756 | } |
756 | return err; | 757 | return err; |
757 | } | 758 | } |
759 | if (smp->attr_id == IB_SMP_ATTR_NODE_INFO) { | ||
760 | err = mlx4_cmd_box(dev, inbox->dma, outbox->dma, | ||
761 | vhcr->in_modifier, vhcr->op_modifier, | ||
762 | vhcr->op, MLX4_CMD_TIME_CLASS_C, MLX4_CMD_NATIVE); | ||
763 | if (!err) { | ||
764 | slave_node_guid = mlx4_get_slave_node_guid(dev, slave); | ||
765 | memcpy(outsmp->data + 12, &slave_node_guid, 8); | ||
766 | } | ||
767 | return err; | ||
768 | } | ||
758 | } | 769 | } |
759 | } | 770 | } |
760 | if (slave != mlx4_master_func_num(dev) && | 771 | if (slave != mlx4_master_func_num(dev) && |
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index 2294b7173180..76f69fdd01d5 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | |||
@@ -435,6 +435,28 @@ void mlx4_sync_pkey_table(struct mlx4_dev *dev, int slave, int port, int i, int | |||
435 | } | 435 | } |
436 | EXPORT_SYMBOL(mlx4_sync_pkey_table); | 436 | EXPORT_SYMBOL(mlx4_sync_pkey_table); |
437 | 437 | ||
438 | void mlx4_put_slave_node_guid(struct mlx4_dev *dev, int slave, __be64 guid) | ||
439 | { | ||
440 | struct mlx4_priv *priv = container_of(dev, struct mlx4_priv, dev); | ||
441 | |||
442 | if (!mlx4_is_master(dev)) | ||
443 | return; | ||
444 | |||
445 | priv->slave_node_guids[slave] = guid; | ||
446 | } | ||
447 | EXPORT_SYMBOL(mlx4_put_slave_node_guid); | ||
448 | |||
449 | __be64 mlx4_get_slave_node_guid(struct mlx4_dev *dev, int slave) | ||
450 | { | ||
451 | struct mlx4_priv *priv = container_of(dev, struct mlx4_priv, dev); | ||
452 | |||
453 | if (!mlx4_is_master(dev)) | ||
454 | return 0; | ||
455 | |||
456 | return priv->slave_node_guids[slave]; | ||
457 | } | ||
458 | EXPORT_SYMBOL(mlx4_get_slave_node_guid); | ||
459 | |||
438 | int mlx4_is_slave_active(struct mlx4_dev *dev, int slave) | 460 | int mlx4_is_slave_active(struct mlx4_dev *dev, int slave) |
439 | { | 461 | { |
440 | struct mlx4_priv *priv = mlx4_priv(dev); | 462 | struct mlx4_priv *priv = mlx4_priv(dev); |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h index 399793a23457..4b1fbd84a68f 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h | |||
@@ -810,6 +810,7 @@ struct mlx4_priv { | |||
810 | int reserved_mtts; | 810 | int reserved_mtts; |
811 | int fs_hash_mode; | 811 | int fs_hash_mode; |
812 | u8 virt2phys_pkey[MLX4_MFUNC_MAX][MLX4_MAX_PORTS][MLX4_MAX_PORT_PKEYS]; | 812 | u8 virt2phys_pkey[MLX4_MFUNC_MAX][MLX4_MAX_PORTS][MLX4_MAX_PORT_PKEYS]; |
813 | __be64 slave_node_guids[MLX4_MFUNC_MAX]; | ||
813 | 814 | ||
814 | }; | 815 | }; |
815 | 816 | ||