aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet')
-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