aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/mellanox/mlx4
diff options
context:
space:
mode:
authorJack Morgenstein <jackm@dev.mellanox.co.il>2014-03-12 06:00:38 -0400
committerDavid S. Miller <davem@davemloft.net>2014-03-12 15:57:13 -0400
commit9cd593529c8652785bc9962acc79b6b176741f99 (patch)
tree1e056dcc04d4ab3c95a20d3e2757352b6c040b7e /drivers/net/ethernet/mellanox/mlx4
parent6ee51a4e866bbb0921180b457ed16cd172859346 (diff)
mlx4_core: For RoCE, allow slaves to set the GID entry at that slave's index
For IB transport, the host determines the slave GIDs. For ETH (RoCE), however, the slave's GID is determined by the IP address that the slave itself assigns to the ETH device used by RoCE. In this case, the slave must be able to write its GIDs to the HCA gid table (at the GID indices that slave "owns"). This commit adds processing for the SET_PORT_GID_TABLE opcode modifier for the SET_PORT command wrapper (so that slaves may modify their GIDS for RoCE). Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4')
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/port.c33
1 files changed, 30 insertions, 3 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/port.c b/drivers/net/ethernet/mellanox/mlx4/port.c
index 9c063d6122b3..591740b06043 100644
--- a/drivers/net/ethernet/mellanox/mlx4/port.c
+++ b/drivers/net/ethernet/mellanox/mlx4/port.c
@@ -505,6 +505,7 @@ int mlx4_get_port_ib_caps(struct mlx4_dev *dev, u8 port, __be32 *caps)
505 mlx4_free_cmd_mailbox(dev, outmailbox); 505 mlx4_free_cmd_mailbox(dev, outmailbox);
506 return err; 506 return err;
507} 507}
508static struct mlx4_roce_gid_entry zgid_entry;
508 509
509static int mlx4_common_set_port(struct mlx4_dev *dev, int slave, u32 in_mod, 510static int mlx4_common_set_port(struct mlx4_dev *dev, int slave, u32 in_mod,
510 u8 op_mod, struct mlx4_cmd_mailbox *inbox) 511 u8 op_mod, struct mlx4_cmd_mailbox *inbox)
@@ -515,6 +516,7 @@ static int mlx4_common_set_port(struct mlx4_dev *dev, int slave, u32 in_mod,
515 struct mlx4_slave_state *slave_st = &master->slave_state[slave]; 516 struct mlx4_slave_state *slave_st = &master->slave_state[slave];
516 struct mlx4_set_port_rqp_calc_context *qpn_context; 517 struct mlx4_set_port_rqp_calc_context *qpn_context;
517 struct mlx4_set_port_general_context *gen_context; 518 struct mlx4_set_port_general_context *gen_context;
519 struct mlx4_roce_gid_entry *gid_entry;
518 int reset_qkey_viols; 520 int reset_qkey_viols;
519 int port; 521 int port;
520 int is_eth; 522 int is_eth;
@@ -535,7 +537,8 @@ static int mlx4_common_set_port(struct mlx4_dev *dev, int slave, u32 in_mod,
535 /* Slaves cannot perform SET_PORT operations except changing MTU */ 537 /* Slaves cannot perform SET_PORT operations except changing MTU */
536 if (is_eth) { 538 if (is_eth) {
537 if (slave != dev->caps.function && 539 if (slave != dev->caps.function &&
538 in_modifier != MLX4_SET_PORT_GENERAL) { 540 in_modifier != MLX4_SET_PORT_GENERAL &&
541 in_modifier != MLX4_SET_PORT_GID_TABLE) {
539 mlx4_warn(dev, "denying SET_PORT for slave:%d\n", 542 mlx4_warn(dev, "denying SET_PORT for slave:%d\n",
540 slave); 543 slave);
541 return -EINVAL; 544 return -EINVAL;
@@ -581,6 +584,28 @@ static int mlx4_common_set_port(struct mlx4_dev *dev, int slave, u32 in_mod,
581 584
582 gen_context->mtu = cpu_to_be16(master->max_mtu[port]); 585 gen_context->mtu = cpu_to_be16(master->max_mtu[port]);
583 break; 586 break;
587 case MLX4_SET_PORT_GID_TABLE:
588 gid_entry = (struct mlx4_roce_gid_entry *)(inbox->buf);
589 /* check that do not have duplicates */
590 if (memcmp(gid_entry->raw, zgid_entry.raw, 16)) {
591 for (i = 0; i < MLX4_ROCE_MAX_GIDS; i++) {
592 if (slave != i &&
593 !memcmp(gid_entry->raw, priv->roce_gids[port - 1][i].raw, 16)) {
594 mlx4_warn(dev, "requested gid entry for slave:%d "
595 "is a duplicate of slave %d\n",
596 slave, i);
597 return -EEXIST;
598 }
599 }
600 }
601 /* insert slave GID at proper index */
602 memcpy(priv->roce_gids[port - 1][slave].raw, gid_entry->raw, 16);
603 /* rewrite roce port gids table to FW */
604 for (i = 0; i < MLX4_ROCE_MAX_GIDS; i++) {
605 memcpy(gid_entry->raw, priv->roce_gids[port - 1][i].raw, 16);
606 gid_entry++;
607 }
608 break;
584 } 609 }
585 return mlx4_cmd(dev, inbox->dma, in_mod, op_mod, 610 return mlx4_cmd(dev, inbox->dma, in_mod, op_mod,
586 MLX4_CMD_SET_PORT, MLX4_CMD_TIME_CLASS_B, 611 MLX4_CMD_SET_PORT, MLX4_CMD_TIME_CLASS_B,
@@ -928,7 +953,8 @@ void mlx4_set_stats_bitmap(struct mlx4_dev *dev, u64 *stats_bitmap)
928} 953}
929EXPORT_SYMBOL(mlx4_set_stats_bitmap); 954EXPORT_SYMBOL(mlx4_set_stats_bitmap);
930 955
931int mlx4_get_slave_from_roce_gid(struct mlx4_dev *dev, int port, u8 *gid, int *slave_id) 956int mlx4_get_slave_from_roce_gid(struct mlx4_dev *dev, int port, u8 *gid,
957 int *slave_id)
932{ 958{
933 struct mlx4_priv *priv = mlx4_priv(dev); 959 struct mlx4_priv *priv = mlx4_priv(dev);
934 int i, found_ix = -1; 960 int i, found_ix = -1;
@@ -950,7 +976,8 @@ int mlx4_get_slave_from_roce_gid(struct mlx4_dev *dev, int port, u8 *gid, int *s
950} 976}
951EXPORT_SYMBOL(mlx4_get_slave_from_roce_gid); 977EXPORT_SYMBOL(mlx4_get_slave_from_roce_gid);
952 978
953int mlx4_get_roce_gid_from_slave(struct mlx4_dev *dev, int port, int slave_id, u8 *gid) 979int mlx4_get_roce_gid_from_slave(struct mlx4_dev *dev, int port, int slave_id,
980 u8 *gid)
954{ 981{
955 struct mlx4_priv *priv = mlx4_priv(dev); 982 struct mlx4_priv *priv = mlx4_priv(dev);
956 983