diff options
Diffstat (limited to 'drivers/net/ethernet')
-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 |
4 files changed, 275 insertions, 12 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c index cb9bebe28276..662a3c5da739 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 06ef3afbc49a..2294b7173180 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_pkey[slave][port - 1][i] = val; | ||
435 | } | ||
436 | EXPORT_SYMBOL(mlx4_sync_pkey_table); | ||
437 | |||
427 | int mlx4_is_slave_active(struct mlx4_dev *dev, int slave) | 438 | int mlx4_is_slave_active(struct mlx4_dev *dev, int slave) |
428 | { | 439 | { |
429 | struct mlx4_priv *priv = mlx4_priv(dev); | 440 | struct mlx4_priv *priv = mlx4_priv(dev); |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h index dba69d98734a..7d27c3158d0c 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h | |||
@@ -807,6 +807,8 @@ struct mlx4_priv { | |||
807 | struct io_mapping *bf_mapping; | 807 | struct io_mapping *bf_mapping; |
808 | int reserved_mtts; | 808 | int reserved_mtts; |
809 | int fs_hash_mode; | 809 | int fs_hash_mode; |
810 | u8 virt2phys_pkey[MLX4_MFUNC_MAX][MLX4_MAX_PORTS][MLX4_MAX_PORT_PKEYS]; | ||
811 | |||
810 | }; | 812 | }; |
811 | 813 | ||
812 | static inline struct mlx4_priv *mlx4_priv(struct mlx4_dev *dev) | 814 | static inline struct mlx4_priv *mlx4_priv(struct mlx4_dev *dev) |
@@ -1011,16 +1013,61 @@ int mlx4_RST2INIT_QP_wrapper(struct mlx4_dev *dev, int slave, | |||
1011 | struct mlx4_cmd_mailbox *inbox, | 1013 | struct mlx4_cmd_mailbox *inbox, |
1012 | struct mlx4_cmd_mailbox *outbox, | 1014 | struct mlx4_cmd_mailbox *outbox, |
1013 | struct mlx4_cmd_info *cmd); | 1015 | struct mlx4_cmd_info *cmd); |
1016 | int mlx4_INIT2INIT_QP_wrapper(struct mlx4_dev *dev, int slave, | ||
1017 | struct mlx4_vhcr *vhcr, | ||
1018 | struct mlx4_cmd_mailbox *inbox, | ||
1019 | struct mlx4_cmd_mailbox *outbox, | ||
1020 | struct mlx4_cmd_info *cmd); | ||
1014 | int mlx4_INIT2RTR_QP_wrapper(struct mlx4_dev *dev, int slave, | 1021 | int mlx4_INIT2RTR_QP_wrapper(struct mlx4_dev *dev, int slave, |
1015 | struct mlx4_vhcr *vhcr, | 1022 | struct mlx4_vhcr *vhcr, |
1016 | struct mlx4_cmd_mailbox *inbox, | 1023 | struct mlx4_cmd_mailbox *inbox, |
1017 | struct mlx4_cmd_mailbox *outbox, | 1024 | struct mlx4_cmd_mailbox *outbox, |
1018 | struct mlx4_cmd_info *cmd); | 1025 | struct mlx4_cmd_info *cmd); |
1026 | int mlx4_RTR2RTS_QP_wrapper(struct mlx4_dev *dev, int slave, | ||
1027 | struct mlx4_vhcr *vhcr, | ||
1028 | struct mlx4_cmd_mailbox *inbox, | ||
1029 | struct mlx4_cmd_mailbox *outbox, | ||
1030 | struct mlx4_cmd_info *cmd); | ||
1031 | int mlx4_RTS2RTS_QP_wrapper(struct mlx4_dev *dev, int slave, | ||
1032 | struct mlx4_vhcr *vhcr, | ||
1033 | struct mlx4_cmd_mailbox *inbox, | ||
1034 | struct mlx4_cmd_mailbox *outbox, | ||
1035 | struct mlx4_cmd_info *cmd); | ||
1036 | int mlx4_SQERR2RTS_QP_wrapper(struct mlx4_dev *dev, int slave, | ||
1037 | struct mlx4_vhcr *vhcr, | ||
1038 | struct mlx4_cmd_mailbox *inbox, | ||
1039 | struct mlx4_cmd_mailbox *outbox, | ||
1040 | struct mlx4_cmd_info *cmd); | ||
1041 | int mlx4_2ERR_QP_wrapper(struct mlx4_dev *dev, int slave, | ||
1042 | struct mlx4_vhcr *vhcr, | ||
1043 | struct mlx4_cmd_mailbox *inbox, | ||
1044 | struct mlx4_cmd_mailbox *outbox, | ||
1045 | struct mlx4_cmd_info *cmd); | ||
1046 | int mlx4_RTS2SQD_QP_wrapper(struct mlx4_dev *dev, int slave, | ||
1047 | struct mlx4_vhcr *vhcr, | ||
1048 | struct mlx4_cmd_mailbox *inbox, | ||
1049 | struct mlx4_cmd_mailbox *outbox, | ||
1050 | struct mlx4_cmd_info *cmd); | ||
1051 | int mlx4_SQD2SQD_QP_wrapper(struct mlx4_dev *dev, int slave, | ||
1052 | struct mlx4_vhcr *vhcr, | ||
1053 | struct mlx4_cmd_mailbox *inbox, | ||
1054 | struct mlx4_cmd_mailbox *outbox, | ||
1055 | struct mlx4_cmd_info *cmd); | ||
1056 | int mlx4_SQD2RTS_QP_wrapper(struct mlx4_dev *dev, int slave, | ||
1057 | struct mlx4_vhcr *vhcr, | ||
1058 | struct mlx4_cmd_mailbox *inbox, | ||
1059 | struct mlx4_cmd_mailbox *outbox, | ||
1060 | struct mlx4_cmd_info *cmd); | ||
1019 | int mlx4_2RST_QP_wrapper(struct mlx4_dev *dev, int slave, | 1061 | int mlx4_2RST_QP_wrapper(struct mlx4_dev *dev, int slave, |
1020 | struct mlx4_vhcr *vhcr, | 1062 | struct mlx4_vhcr *vhcr, |
1021 | struct mlx4_cmd_mailbox *inbox, | 1063 | struct mlx4_cmd_mailbox *inbox, |
1022 | struct mlx4_cmd_mailbox *outbox, | 1064 | struct mlx4_cmd_mailbox *outbox, |
1023 | struct mlx4_cmd_info *cmd); | 1065 | struct mlx4_cmd_info *cmd); |
1066 | int mlx4_QUERY_QP_wrapper(struct mlx4_dev *dev, int slave, | ||
1067 | struct mlx4_vhcr *vhcr, | ||
1068 | struct mlx4_cmd_mailbox *inbox, | ||
1069 | struct mlx4_cmd_mailbox *outbox, | ||
1070 | struct mlx4_cmd_info *cmd); | ||
1024 | 1071 | ||
1025 | int mlx4_GEN_EQE(struct mlx4_dev *dev, int slave, struct mlx4_eqe *eqe); | 1072 | int mlx4_GEN_EQE(struct mlx4_dev *dev, int slave, struct mlx4_eqe *eqe); |
1026 | 1073 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c index 3c57a83e6287..49e9de725d0a 100644 --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | |||
@@ -242,6 +242,15 @@ static int res_tracker_insert(struct rb_root *root, struct res_common *res) | |||
242 | return 0; | 242 | return 0; |
243 | } | 243 | } |
244 | 244 | ||
245 | enum qp_transition { | ||
246 | QP_TRANS_INIT2RTR, | ||
247 | QP_TRANS_RTR2RTS, | ||
248 | QP_TRANS_RTS2RTS, | ||
249 | QP_TRANS_SQERR2RTS, | ||
250 | QP_TRANS_SQD2SQD, | ||
251 | QP_TRANS_SQD2RTS | ||
252 | }; | ||
253 | |||
245 | /* For Debug uses */ | 254 | /* For Debug uses */ |
246 | static const char *ResourceType(enum mlx4_resource rt) | 255 | static const char *ResourceType(enum mlx4_resource rt) |
247 | { | 256 | { |
@@ -308,14 +317,41 @@ void mlx4_free_resource_tracker(struct mlx4_dev *dev, | |||
308 | } | 317 | } |
309 | } | 318 | } |
310 | 319 | ||
311 | static void update_ud_gid(struct mlx4_dev *dev, | 320 | static void update_pkey_index(struct mlx4_dev *dev, int slave, |
312 | struct mlx4_qp_context *qp_ctx, u8 slave) | 321 | struct mlx4_cmd_mailbox *inbox) |
313 | { | 322 | { |
314 | u32 ts = (be32_to_cpu(qp_ctx->flags) >> 16) & 0xff; | 323 | u8 sched = *(u8 *)(inbox->buf + 64); |
324 | u8 orig_index = *(u8 *)(inbox->buf + 35); | ||
325 | u8 new_index; | ||
326 | struct mlx4_priv *priv = mlx4_priv(dev); | ||
327 | int port; | ||
328 | |||
329 | port = (sched >> 6 & 1) + 1; | ||
330 | |||
331 | new_index = priv->virt2phys_pkey[slave][port - 1][orig_index]; | ||
332 | *(u8 *)(inbox->buf + 35) = new_index; | ||
333 | |||
334 | mlx4_dbg(dev, "port = %d, orig pkey index = %d, " | ||
335 | "new pkey index = %d\n", port, orig_index, new_index); | ||
336 | } | ||
337 | |||
338 | static void update_gid(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *inbox, | ||
339 | u8 slave) | ||
340 | { | ||
341 | struct mlx4_qp_context *qp_ctx = inbox->buf + 8; | ||
342 | enum mlx4_qp_optpar optpar = be32_to_cpu(*(__be32 *) inbox->buf); | ||
343 | u32 ts = (be32_to_cpu(qp_ctx->flags) >> 16) & 0xff; | ||
315 | 344 | ||
316 | if (MLX4_QP_ST_UD == ts) | 345 | if (MLX4_QP_ST_UD == ts) |
317 | qp_ctx->pri_path.mgid_index = 0x80 | slave; | 346 | qp_ctx->pri_path.mgid_index = 0x80 | slave; |
318 | 347 | ||
348 | if (MLX4_QP_ST_RC == ts || MLX4_QP_ST_UC == ts) { | ||
349 | if (optpar & MLX4_QP_OPTPAR_PRIMARY_ADDR_PATH) | ||
350 | qp_ctx->pri_path.mgid_index = slave & 0x7F; | ||
351 | if (optpar & MLX4_QP_OPTPAR_ALT_ADDR_PATH) | ||
352 | qp_ctx->alt_path.mgid_index = slave & 0x7F; | ||
353 | } | ||
354 | |||
319 | mlx4_dbg(dev, "slave %d, new gid index: 0x%x ", | 355 | mlx4_dbg(dev, "slave %d, new gid index: 0x%x ", |
320 | slave, qp_ctx->pri_path.mgid_index); | 356 | slave, qp_ctx->pri_path.mgid_index); |
321 | } | 357 | } |
@@ -1109,6 +1145,11 @@ static int valid_reserved(struct mlx4_dev *dev, int slave, int qpn) | |||
1109 | (mlx4_is_master(dev) || mlx4_is_guest_proxy(dev, slave, qpn)); | 1145 | (mlx4_is_master(dev) || mlx4_is_guest_proxy(dev, slave, qpn)); |
1110 | } | 1146 | } |
1111 | 1147 | ||
1148 | static int fw_reserved(struct mlx4_dev *dev, int qpn) | ||
1149 | { | ||
1150 | return qpn < dev->caps.reserved_qps_cnt[MLX4_QP_REGION_FW]; | ||
1151 | } | ||
1152 | |||
1112 | static int qp_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd, | 1153 | static int qp_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd, |
1113 | u64 in_param, u64 *out_param) | 1154 | u64 in_param, u64 *out_param) |
1114 | { | 1155 | { |
@@ -1146,7 +1187,7 @@ static int qp_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd, | |||
1146 | if (err) | 1187 | if (err) |
1147 | return err; | 1188 | return err; |
1148 | 1189 | ||
1149 | if (!valid_reserved(dev, slave, qpn)) { | 1190 | if (!fw_reserved(dev, qpn)) { |
1150 | err = __mlx4_qp_alloc_icm(dev, qpn); | 1191 | err = __mlx4_qp_alloc_icm(dev, qpn); |
1151 | if (err) { | 1192 | if (err) { |
1152 | res_abort_move(dev, slave, RES_QP, qpn); | 1193 | res_abort_move(dev, slave, RES_QP, qpn); |
@@ -1499,7 +1540,7 @@ static int qp_free_res(struct mlx4_dev *dev, int slave, int op, int cmd, | |||
1499 | if (err) | 1540 | if (err) |
1500 | return err; | 1541 | return err; |
1501 | 1542 | ||
1502 | if (!valid_reserved(dev, slave, qpn)) | 1543 | if (!fw_reserved(dev, qpn)) |
1503 | __mlx4_qp_free_icm(dev, qpn); | 1544 | __mlx4_qp_free_icm(dev, qpn); |
1504 | 1545 | ||
1505 | res_end_move(dev, slave, RES_QP, qpn); | 1546 | res_end_move(dev, slave, RES_QP, qpn); |
@@ -1939,6 +1980,19 @@ static u32 qp_get_srqn(struct mlx4_qp_context *qpc) | |||
1939 | return be32_to_cpu(qpc->srqn) & 0x1ffffff; | 1980 | return be32_to_cpu(qpc->srqn) & 0x1ffffff; |
1940 | } | 1981 | } |
1941 | 1982 | ||
1983 | static void adjust_proxy_tun_qkey(struct mlx4_dev *dev, struct mlx4_vhcr *vhcr, | ||
1984 | struct mlx4_qp_context *context) | ||
1985 | { | ||
1986 | u32 qpn = vhcr->in_modifier & 0xffffff; | ||
1987 | u32 qkey = 0; | ||
1988 | |||
1989 | if (mlx4_get_parav_qkey(dev, qpn, &qkey)) | ||
1990 | return; | ||
1991 | |||
1992 | /* adjust qkey in qp context */ | ||
1993 | context->qkey = cpu_to_be32(qkey); | ||
1994 | } | ||
1995 | |||
1942 | int mlx4_RST2INIT_QP_wrapper(struct mlx4_dev *dev, int slave, | 1996 | int mlx4_RST2INIT_QP_wrapper(struct mlx4_dev *dev, int slave, |
1943 | struct mlx4_vhcr *vhcr, | 1997 | struct mlx4_vhcr *vhcr, |
1944 | struct mlx4_cmd_mailbox *inbox, | 1998 | struct mlx4_cmd_mailbox *inbox, |
@@ -1991,6 +2045,8 @@ int mlx4_RST2INIT_QP_wrapper(struct mlx4_dev *dev, int slave, | |||
1991 | goto ex_put_scq; | 2045 | goto ex_put_scq; |
1992 | } | 2046 | } |
1993 | 2047 | ||
2048 | adjust_proxy_tun_qkey(dev, vhcr, qpc); | ||
2049 | update_pkey_index(dev, slave, inbox); | ||
1994 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); | 2050 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); |
1995 | if (err) | 2051 | if (err) |
1996 | goto ex_put_srq; | 2052 | goto ex_put_srq; |
@@ -2136,6 +2192,48 @@ static int get_containing_mtt(struct mlx4_dev *dev, int slave, int start, | |||
2136 | return err; | 2192 | return err; |
2137 | } | 2193 | } |
2138 | 2194 | ||
2195 | static int verify_qp_parameters(struct mlx4_dev *dev, | ||
2196 | struct mlx4_cmd_mailbox *inbox, | ||
2197 | enum qp_transition transition, u8 slave) | ||
2198 | { | ||
2199 | u32 qp_type; | ||
2200 | struct mlx4_qp_context *qp_ctx; | ||
2201 | enum mlx4_qp_optpar optpar; | ||
2202 | |||
2203 | qp_ctx = inbox->buf + 8; | ||
2204 | qp_type = (be32_to_cpu(qp_ctx->flags) >> 16) & 0xff; | ||
2205 | optpar = be32_to_cpu(*(__be32 *) inbox->buf); | ||
2206 | |||
2207 | switch (qp_type) { | ||
2208 | case MLX4_QP_ST_RC: | ||
2209 | case MLX4_QP_ST_UC: | ||
2210 | switch (transition) { | ||
2211 | case QP_TRANS_INIT2RTR: | ||
2212 | case QP_TRANS_RTR2RTS: | ||
2213 | case QP_TRANS_RTS2RTS: | ||
2214 | case QP_TRANS_SQD2SQD: | ||
2215 | case QP_TRANS_SQD2RTS: | ||
2216 | if (slave != mlx4_master_func_num(dev)) | ||
2217 | /* slaves have only gid index 0 */ | ||
2218 | if (optpar & MLX4_QP_OPTPAR_PRIMARY_ADDR_PATH) | ||
2219 | if (qp_ctx->pri_path.mgid_index) | ||
2220 | return -EINVAL; | ||
2221 | if (optpar & MLX4_QP_OPTPAR_ALT_ADDR_PATH) | ||
2222 | if (qp_ctx->alt_path.mgid_index) | ||
2223 | return -EINVAL; | ||
2224 | break; | ||
2225 | default: | ||
2226 | break; | ||
2227 | } | ||
2228 | |||
2229 | break; | ||
2230 | default: | ||
2231 | break; | ||
2232 | } | ||
2233 | |||
2234 | return 0; | ||
2235 | } | ||
2236 | |||
2139 | int mlx4_WRITE_MTT_wrapper(struct mlx4_dev *dev, int slave, | 2237 | int mlx4_WRITE_MTT_wrapper(struct mlx4_dev *dev, int slave, |
2140 | struct mlx4_vhcr *vhcr, | 2238 | struct mlx4_vhcr *vhcr, |
2141 | struct mlx4_cmd_mailbox *inbox, | 2239 | struct mlx4_cmd_mailbox *inbox, |
@@ -2623,16 +2721,123 @@ out: | |||
2623 | return err; | 2721 | return err; |
2624 | } | 2722 | } |
2625 | 2723 | ||
2724 | int mlx4_INIT2INIT_QP_wrapper(struct mlx4_dev *dev, int slave, | ||
2725 | struct mlx4_vhcr *vhcr, | ||
2726 | struct mlx4_cmd_mailbox *inbox, | ||
2727 | struct mlx4_cmd_mailbox *outbox, | ||
2728 | struct mlx4_cmd_info *cmd) | ||
2729 | { | ||
2730 | struct mlx4_qp_context *context = inbox->buf + 8; | ||
2731 | adjust_proxy_tun_qkey(dev, vhcr, context); | ||
2732 | update_pkey_index(dev, slave, inbox); | ||
2733 | return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd); | ||
2734 | } | ||
2735 | |||
2626 | int mlx4_INIT2RTR_QP_wrapper(struct mlx4_dev *dev, int slave, | 2736 | int mlx4_INIT2RTR_QP_wrapper(struct mlx4_dev *dev, int slave, |
2627 | struct mlx4_vhcr *vhcr, | 2737 | struct mlx4_vhcr *vhcr, |
2628 | struct mlx4_cmd_mailbox *inbox, | 2738 | struct mlx4_cmd_mailbox *inbox, |
2629 | struct mlx4_cmd_mailbox *outbox, | 2739 | struct mlx4_cmd_mailbox *outbox, |
2630 | struct mlx4_cmd_info *cmd) | 2740 | struct mlx4_cmd_info *cmd) |
2631 | { | 2741 | { |
2742 | int err; | ||
2632 | struct mlx4_qp_context *qpc = inbox->buf + 8; | 2743 | struct mlx4_qp_context *qpc = inbox->buf + 8; |
2633 | 2744 | ||
2634 | update_ud_gid(dev, qpc, (u8)slave); | 2745 | err = verify_qp_parameters(dev, inbox, QP_TRANS_INIT2RTR, slave); |
2746 | if (err) | ||
2747 | return err; | ||
2748 | |||
2749 | update_pkey_index(dev, slave, inbox); | ||
2750 | update_gid(dev, inbox, (u8)slave); | ||
2751 | adjust_proxy_tun_qkey(dev, vhcr, qpc); | ||
2752 | |||
2753 | return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd); | ||
2754 | } | ||
2755 | |||
2756 | int mlx4_RTR2RTS_QP_wrapper(struct mlx4_dev *dev, int slave, | ||
2757 | struct mlx4_vhcr *vhcr, | ||
2758 | struct mlx4_cmd_mailbox *inbox, | ||
2759 | struct mlx4_cmd_mailbox *outbox, | ||
2760 | struct mlx4_cmd_info *cmd) | ||
2761 | { | ||
2762 | int err; | ||
2763 | struct mlx4_qp_context *context = inbox->buf + 8; | ||
2764 | |||
2765 | err = verify_qp_parameters(dev, inbox, QP_TRANS_RTR2RTS, slave); | ||
2766 | if (err) | ||
2767 | return err; | ||
2768 | |||
2769 | update_pkey_index(dev, slave, inbox); | ||
2770 | update_gid(dev, inbox, (u8)slave); | ||
2771 | adjust_proxy_tun_qkey(dev, vhcr, context); | ||
2772 | return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd); | ||
2773 | } | ||
2774 | |||
2775 | int mlx4_RTS2RTS_QP_wrapper(struct mlx4_dev *dev, int slave, | ||
2776 | struct mlx4_vhcr *vhcr, | ||
2777 | struct mlx4_cmd_mailbox *inbox, | ||
2778 | struct mlx4_cmd_mailbox *outbox, | ||
2779 | struct mlx4_cmd_info *cmd) | ||
2780 | { | ||
2781 | int err; | ||
2782 | struct mlx4_qp_context *context = inbox->buf + 8; | ||
2783 | |||
2784 | err = verify_qp_parameters(dev, inbox, QP_TRANS_RTS2RTS, slave); | ||
2785 | if (err) | ||
2786 | return err; | ||
2787 | |||
2788 | update_pkey_index(dev, slave, inbox); | ||
2789 | update_gid(dev, inbox, (u8)slave); | ||
2790 | adjust_proxy_tun_qkey(dev, vhcr, context); | ||
2791 | return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd); | ||
2792 | } | ||
2793 | |||
2794 | |||
2795 | int mlx4_SQERR2RTS_QP_wrapper(struct mlx4_dev *dev, int slave, | ||
2796 | struct mlx4_vhcr *vhcr, | ||
2797 | struct mlx4_cmd_mailbox *inbox, | ||
2798 | struct mlx4_cmd_mailbox *outbox, | ||
2799 | struct mlx4_cmd_info *cmd) | ||
2800 | { | ||
2801 | struct mlx4_qp_context *context = inbox->buf + 8; | ||
2802 | adjust_proxy_tun_qkey(dev, vhcr, context); | ||
2803 | return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd); | ||
2804 | } | ||
2805 | |||
2806 | int mlx4_SQD2SQD_QP_wrapper(struct mlx4_dev *dev, int slave, | ||
2807 | struct mlx4_vhcr *vhcr, | ||
2808 | struct mlx4_cmd_mailbox *inbox, | ||
2809 | struct mlx4_cmd_mailbox *outbox, | ||
2810 | struct mlx4_cmd_info *cmd) | ||
2811 | { | ||
2812 | int err; | ||
2813 | struct mlx4_qp_context *context = inbox->buf + 8; | ||
2814 | |||
2815 | err = verify_qp_parameters(dev, inbox, QP_TRANS_SQD2SQD, slave); | ||
2816 | if (err) | ||
2817 | return err; | ||
2818 | |||
2819 | adjust_proxy_tun_qkey(dev, vhcr, context); | ||
2820 | update_gid(dev, inbox, (u8)slave); | ||
2821 | update_pkey_index(dev, slave, inbox); | ||
2822 | return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd); | ||
2823 | } | ||
2824 | |||
2825 | int mlx4_SQD2RTS_QP_wrapper(struct mlx4_dev *dev, int slave, | ||
2826 | struct mlx4_vhcr *vhcr, | ||
2827 | struct mlx4_cmd_mailbox *inbox, | ||
2828 | struct mlx4_cmd_mailbox *outbox, | ||
2829 | struct mlx4_cmd_info *cmd) | ||
2830 | { | ||
2831 | int err; | ||
2832 | struct mlx4_qp_context *context = inbox->buf + 8; | ||
2833 | |||
2834 | err = verify_qp_parameters(dev, inbox, QP_TRANS_SQD2RTS, slave); | ||
2835 | if (err) | ||
2836 | return err; | ||
2635 | 2837 | ||
2838 | adjust_proxy_tun_qkey(dev, vhcr, context); | ||
2839 | update_gid(dev, inbox, (u8)slave); | ||
2840 | update_pkey_index(dev, slave, inbox); | ||
2636 | return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd); | 2841 | return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd); |
2637 | } | 2842 | } |
2638 | 2843 | ||