diff options
Diffstat (limited to 'drivers/net/ethernet')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/port.c | 33 |
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 | } |
508 | static struct mlx4_roce_gid_entry zgid_entry; | ||
508 | 509 | ||
509 | static int mlx4_common_set_port(struct mlx4_dev *dev, int slave, u32 in_mod, | 510 | static 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 | } |
929 | EXPORT_SYMBOL(mlx4_set_stats_bitmap); | 954 | EXPORT_SYMBOL(mlx4_set_stats_bitmap); |
930 | 955 | ||
931 | int mlx4_get_slave_from_roce_gid(struct mlx4_dev *dev, int port, u8 *gid, int *slave_id) | 956 | int 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 | } |
951 | EXPORT_SYMBOL(mlx4_get_slave_from_roce_gid); | 977 | EXPORT_SYMBOL(mlx4_get_slave_from_roce_gid); |
952 | 978 | ||
953 | int mlx4_get_roce_gid_from_slave(struct mlx4_dev *dev, int port, int slave_id, u8 *gid) | 979 | int 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 | ||