aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/hw/mlx4/mad.c33
-rw-r--r--drivers/infiniband/hw/mlx4/main.c35
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/cmd.c12
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/main.c11
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mlx4.h47
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/resource_tracker.c217
-rw-r--r--include/linux/mlx4/device.h3
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
1124static 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
1124static void mlx4_ib_alloc_eqs(struct mlx4_dev *dev, struct mlx4_ib_dev *ibdev) 1156static 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
1380err_notif: 1415err_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}
425EXPORT_SYMBOL(mlx4_get_parav_qkey); 425EXPORT_SYMBOL(mlx4_get_parav_qkey);
426 426
427void 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