diff options
| -rw-r--r-- | drivers/infiniband/hw/mlx4/mad.c | 33 | ||||
| -rw-r--r-- | drivers/infiniband/hw/mlx4/main.c | 35 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/cmd.c | 12 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/main.c | 11 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mlx4.h | 47 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | 217 | ||||
| -rw-r--r-- | include/linux/mlx4/device.h | 3 |
7 files changed, 344 insertions, 14 deletions
diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c index e98849338a9..318d5bcf821 100644 --- a/drivers/infiniband/hw/mlx4/mad.c +++ b/drivers/infiniband/hw/mlx4/mad.c | |||
| @@ -185,6 +185,10 @@ static void smp_snoop(struct ib_device *ibdev, u8 port_num, struct ib_mad *mad, | |||
| 185 | { | 185 | { |
| 186 | struct ib_port_info *pinfo; | 186 | struct ib_port_info *pinfo; |
| 187 | u16 lid; | 187 | u16 lid; |
| 188 | __be16 *base; | ||
| 189 | u32 bn, pkey_change_bitmap; | ||
| 190 | int i; | ||
| 191 | |||
| 188 | 192 | ||
| 189 | struct mlx4_ib_dev *dev = to_mdev(ibdev); | 193 | struct mlx4_ib_dev *dev = to_mdev(ibdev); |
| 190 | if ((mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_LID_ROUTED || | 194 | if ((mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_LID_ROUTED || |
| @@ -209,8 +213,33 @@ static void smp_snoop(struct ib_device *ibdev, u8 port_num, struct ib_mad *mad, | |||
| 209 | break; | 213 | break; |
| 210 | 214 | ||
| 211 | case IB_SMP_ATTR_PKEY_TABLE: | 215 | case IB_SMP_ATTR_PKEY_TABLE: |
| 212 | mlx4_ib_dispatch_event(dev, port_num, | 216 | if (!mlx4_is_mfunc(dev->dev)) { |
| 213 | IB_EVENT_PKEY_CHANGE); | 217 | mlx4_ib_dispatch_event(dev, port_num, |
| 218 | IB_EVENT_PKEY_CHANGE); | ||
| 219 | break; | ||
| 220 | } | ||
| 221 | |||
| 222 | bn = be32_to_cpu(((struct ib_smp *)mad)->attr_mod) & 0xFFFF; | ||
| 223 | base = (__be16 *) &(((struct ib_smp *)mad)->data[0]); | ||
| 224 | pkey_change_bitmap = 0; | ||
| 225 | for (i = 0; i < 32; i++) { | ||
| 226 | pr_debug("PKEY[%d] = x%x\n", | ||
| 227 | i + bn*32, be16_to_cpu(base[i])); | ||
| 228 | if (be16_to_cpu(base[i]) != | ||
| 229 | dev->pkeys.phys_pkey_cache[port_num - 1][i + bn*32]) { | ||
| 230 | pkey_change_bitmap |= (1 << i); | ||
| 231 | dev->pkeys.phys_pkey_cache[port_num - 1][i + bn*32] = | ||
| 232 | be16_to_cpu(base[i]); | ||
| 233 | } | ||
| 234 | } | ||
| 235 | pr_debug("PKEY Change event: port=%d, " | ||
| 236 | "block=0x%x, change_bitmap=0x%x\n", | ||
| 237 | port_num, bn, pkey_change_bitmap); | ||
| 238 | |||
| 239 | if (pkey_change_bitmap) | ||
| 240 | mlx4_ib_dispatch_event(dev, port_num, | ||
| 241 | IB_EVENT_PKEY_CHANGE); | ||
| 242 | |||
| 214 | break; | 243 | break; |
| 215 | 244 | ||
| 216 | case IB_SMP_ATTR_GUID_INFO: | 245 | case IB_SMP_ATTR_GUID_INFO: |
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c index 3f7f77f93a1..8e10ec2af7b 100644 --- a/drivers/infiniband/hw/mlx4/main.c +++ b/drivers/infiniband/hw/mlx4/main.c | |||
| @@ -1121,6 +1121,38 @@ static int mlx4_ib_netdev_event(struct notifier_block *this, unsigned long event | |||
| 1121 | return NOTIFY_DONE; | 1121 | return NOTIFY_DONE; |
| 1122 | } | 1122 | } |
| 1123 | 1123 | ||
| 1124 | static void init_pkeys(struct mlx4_ib_dev *ibdev) | ||
| 1125 | { | ||
| 1126 | int port; | ||
| 1127 | int slave; | ||
| 1128 | int i; | ||
| 1129 | |||
| 1130 | if (mlx4_is_master(ibdev->dev)) { | ||
| 1131 | for (slave = 0; slave <= ibdev->dev->num_vfs; ++slave) { | ||
| 1132 | for (port = 1; port <= ibdev->dev->caps.num_ports; ++port) { | ||
| 1133 | for (i = 0; | ||
| 1134 | i < ibdev->dev->phys_caps.pkey_phys_table_len[port]; | ||
| 1135 | ++i) { | ||
| 1136 | ibdev->pkeys.virt2phys_pkey[slave][port - 1][i] = | ||
| 1137 | /* master has the identity virt2phys pkey mapping */ | ||
| 1138 | (slave == mlx4_master_func_num(ibdev->dev) || !i) ? i : | ||
| 1139 | ibdev->dev->phys_caps.pkey_phys_table_len[port] - 1; | ||
| 1140 | mlx4_sync_pkey_table(ibdev->dev, slave, port, i, | ||
| 1141 | ibdev->pkeys.virt2phys_pkey[slave][port - 1][i]); | ||
| 1142 | } | ||
| 1143 | } | ||
| 1144 | } | ||
| 1145 | /* initialize pkey cache */ | ||
| 1146 | for (port = 1; port <= ibdev->dev->caps.num_ports; ++port) { | ||
| 1147 | for (i = 0; | ||
| 1148 | i < ibdev->dev->phys_caps.pkey_phys_table_len[port]; | ||
| 1149 | ++i) | ||
| 1150 | ibdev->pkeys.phys_pkey_cache[port-1][i] = | ||
| 1151 | (i) ? 0 : 0xFFFF; | ||
| 1152 | } | ||
| 1153 | } | ||
| 1154 | } | ||
| 1155 | |||
| 1124 | static void mlx4_ib_alloc_eqs(struct mlx4_dev *dev, struct mlx4_ib_dev *ibdev) | 1156 | static void mlx4_ib_alloc_eqs(struct mlx4_dev *dev, struct mlx4_ib_dev *ibdev) |
| 1125 | { | 1157 | { |
| 1126 | char name[32]; | 1158 | char name[32]; |
| @@ -1375,6 +1407,9 @@ static void *mlx4_ib_add(struct mlx4_dev *dev) | |||
| 1375 | 1407 | ||
| 1376 | ibdev->ib_active = true; | 1408 | ibdev->ib_active = true; |
| 1377 | 1409 | ||
| 1410 | if (mlx4_is_mfunc(ibdev->dev)) | ||
| 1411 | init_pkeys(ibdev); | ||
| 1412 | |||
| 1378 | return ibdev; | 1413 | return ibdev; |
| 1379 | 1414 | ||
| 1380 | err_notif: | 1415 | err_notif: |
diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c index cb9bebe2827..662a3c5da73 100644 --- a/drivers/net/ethernet/mellanox/mlx4/cmd.c +++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c | |||
| @@ -950,7 +950,7 @@ static struct mlx4_cmd_info cmd_info[] = { | |||
| 950 | .out_is_imm = false, | 950 | .out_is_imm = false, |
| 951 | .encode_slave_id = false, | 951 | .encode_slave_id = false, |
| 952 | .verify = NULL, | 952 | .verify = NULL, |
| 953 | .wrapper = mlx4_GEN_QP_wrapper | 953 | .wrapper = mlx4_INIT2INIT_QP_wrapper |
| 954 | }, | 954 | }, |
| 955 | { | 955 | { |
| 956 | .opcode = MLX4_CMD_INIT2RTR_QP, | 956 | .opcode = MLX4_CMD_INIT2RTR_QP, |
| @@ -968,7 +968,7 @@ static struct mlx4_cmd_info cmd_info[] = { | |||
| 968 | .out_is_imm = false, | 968 | .out_is_imm = false, |
| 969 | .encode_slave_id = false, | 969 | .encode_slave_id = false, |
| 970 | .verify = NULL, | 970 | .verify = NULL, |
| 971 | .wrapper = mlx4_GEN_QP_wrapper | 971 | .wrapper = mlx4_RTR2RTS_QP_wrapper |
| 972 | }, | 972 | }, |
| 973 | { | 973 | { |
| 974 | .opcode = MLX4_CMD_RTS2RTS_QP, | 974 | .opcode = MLX4_CMD_RTS2RTS_QP, |
| @@ -977,7 +977,7 @@ static struct mlx4_cmd_info cmd_info[] = { | |||
| 977 | .out_is_imm = false, | 977 | .out_is_imm = false, |
| 978 | .encode_slave_id = false, | 978 | .encode_slave_id = false, |
| 979 | .verify = NULL, | 979 | .verify = NULL, |
| 980 | .wrapper = mlx4_GEN_QP_wrapper | 980 | .wrapper = mlx4_RTS2RTS_QP_wrapper |
| 981 | }, | 981 | }, |
| 982 | { | 982 | { |
| 983 | .opcode = MLX4_CMD_SQERR2RTS_QP, | 983 | .opcode = MLX4_CMD_SQERR2RTS_QP, |
| @@ -986,7 +986,7 @@ static struct mlx4_cmd_info cmd_info[] = { | |||
| 986 | .out_is_imm = false, | 986 | .out_is_imm = false, |
| 987 | .encode_slave_id = false, | 987 | .encode_slave_id = false, |
| 988 | .verify = NULL, | 988 | .verify = NULL, |
| 989 | .wrapper = mlx4_GEN_QP_wrapper | 989 | .wrapper = mlx4_SQERR2RTS_QP_wrapper |
| 990 | }, | 990 | }, |
| 991 | { | 991 | { |
| 992 | .opcode = MLX4_CMD_2ERR_QP, | 992 | .opcode = MLX4_CMD_2ERR_QP, |
| @@ -1013,7 +1013,7 @@ static struct mlx4_cmd_info cmd_info[] = { | |||
| 1013 | .out_is_imm = false, | 1013 | .out_is_imm = false, |
| 1014 | .encode_slave_id = false, | 1014 | .encode_slave_id = false, |
| 1015 | .verify = NULL, | 1015 | .verify = NULL, |
| 1016 | .wrapper = mlx4_GEN_QP_wrapper | 1016 | .wrapper = mlx4_SQD2SQD_QP_wrapper |
| 1017 | }, | 1017 | }, |
| 1018 | { | 1018 | { |
| 1019 | .opcode = MLX4_CMD_SQD2RTS_QP, | 1019 | .opcode = MLX4_CMD_SQD2RTS_QP, |
| @@ -1022,7 +1022,7 @@ static struct mlx4_cmd_info cmd_info[] = { | |||
| 1022 | .out_is_imm = false, | 1022 | .out_is_imm = false, |
| 1023 | .encode_slave_id = false, | 1023 | .encode_slave_id = false, |
| 1024 | .verify = NULL, | 1024 | .verify = NULL, |
| 1025 | .wrapper = mlx4_GEN_QP_wrapper | 1025 | .wrapper = mlx4_SQD2RTS_QP_wrapper |
| 1026 | }, | 1026 | }, |
| 1027 | { | 1027 | { |
| 1028 | .opcode = MLX4_CMD_2RST_QP, | 1028 | .opcode = MLX4_CMD_2RST_QP, |
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index 06ef3afbc49..2294b717318 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | |||
| @@ -424,6 +424,17 @@ int mlx4_get_parav_qkey(struct mlx4_dev *dev, u32 qpn, u32 *qkey) | |||
| 424 | } | 424 | } |
| 425 | EXPORT_SYMBOL(mlx4_get_parav_qkey); | 425 | EXPORT_SYMBOL(mlx4_get_parav_qkey); |
| 426 | 426 | ||
| 427 | void mlx4_sync_pkey_table(struct mlx4_dev *dev, int slave, int port, int i, int val) | ||
| 428 | { | ||
| 429 | struct mlx4_priv *priv = container_of(dev, struct mlx4_priv, dev); | ||
| 430 | |||
| 431 | if (!mlx4_is_master(dev)) | ||
| 432 | return; | ||
| 433 | |||
| 434 | priv->virt2phys_p | ||
