mr.c (3121e3c441b5eccdd15e6c320ec32215b334b9ec) mr.c (d5436ba01075ef4629015f7a00914d64ffd795d6)
1/*
2 * Copyright (c) 2013, Mellanox Technologies inc. All rights reserved.
3 *
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:

--- 1024 unchanged lines hidden (view full) ---

1033 err = mlx5_core_create_psv(&dev->mdev, to_mpd(pd)->pdn,
1034 2, psv_index);
1035 if (err)
1036 goto err_free_sig;
1037
1038 access_mode = MLX5_ACCESS_MODE_KLM;
1039 mr->sig->psv_memory.psv_idx = psv_index[0];
1040 mr->sig->psv_wire.psv_idx = psv_index[1];
1/*
2 * Copyright (c) 2013, Mellanox Technologies inc. All rights reserved.
3 *
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:

--- 1024 unchanged lines hidden (view full) ---

1033 err = mlx5_core_create_psv(&dev->mdev, to_mpd(pd)->pdn,
1034 2, psv_index);
1035 if (err)
1036 goto err_free_sig;
1037
1038 access_mode = MLX5_ACCESS_MODE_KLM;
1039 mr->sig->psv_memory.psv_idx = psv_index[0];
1040 mr->sig->psv_wire.psv_idx = psv_index[1];
1041
1042 mr->sig->sig_status_checked = true;
1043 mr->sig->sig_err_exists = false;
1044 /* Next UMR, Arm SIGERR */
1045 ++mr->sig->sigerr_count;
1041 }
1042
1043 in->seg.flags = MLX5_PERM_UMR_EN | access_mode;
1044 err = mlx5_core_create_mkey(&dev->mdev, &mr->mmr, in, sizeof(*in),
1045 NULL, NULL, NULL);
1046 if (err)
1047 goto err_destroy_psv;
1048

--- 134 unchanged lines hidden (view full) ---

1183 struct mlx5_ib_dev *dev = to_mdev(page_list->device);
1184 int size = page_list->max_page_list_len * sizeof(u64);
1185
1186 dma_free_coherent(&dev->mdev.pdev->dev, size, mfrpl->mapped_page_list,
1187 mfrpl->map);
1188 kfree(mfrpl->ibfrpl.page_list);
1189 kfree(mfrpl);
1190}
1046 }
1047
1048 in->seg.flags = MLX5_PERM_UMR_EN | access_mode;
1049 err = mlx5_core_create_mkey(&dev->mdev, &mr->mmr, in, sizeof(*in),
1050 NULL, NULL, NULL);
1051 if (err)
1052 goto err_destroy_psv;
1053

--- 134 unchanged lines hidden (view full) ---

1188 struct mlx5_ib_dev *dev = to_mdev(page_list->device);
1189 int size = page_list->max_page_list_len * sizeof(u64);
1190
1191 dma_free_coherent(&dev->mdev.pdev->dev, size, mfrpl->mapped_page_list,
1192 mfrpl->map);
1193 kfree(mfrpl->ibfrpl.page_list);
1194 kfree(mfrpl);
1195}
1196
1197int mlx5_ib_check_mr_status(struct ib_mr *ibmr, u32 check_mask,
1198 struct ib_mr_status *mr_status)
1199{
1200 struct mlx5_ib_mr *mmr = to_mmr(ibmr);
1201 int ret = 0;
1202
1203 if (check_mask & ~IB_MR_CHECK_SIG_STATUS) {
1204 pr_err("Invalid status check mask\n");
1205 ret = -EINVAL;
1206 goto done;
1207 }
1208
1209 mr_status->fail_status = 0;
1210 if (check_mask & IB_MR_CHECK_SIG_STATUS) {
1211 if (!mmr->sig) {
1212 ret = -EINVAL;
1213 pr_err("signature status check requested on a non-signature enabled MR\n");
1214 goto done;
1215 }
1216
1217 mmr->sig->sig_status_checked = true;
1218 if (!mmr->sig->sig_err_exists)
1219 goto done;
1220
1221 if (ibmr->lkey == mmr->sig->err_item.key)
1222 memcpy(&mr_status->sig_err, &mmr->sig->err_item,
1223 sizeof(mr_status->sig_err));
1224 else {
1225 mr_status->sig_err.err_type = IB_SIG_BAD_GUARD;
1226 mr_status->sig_err.sig_err_offset = 0;
1227 mr_status->sig_err.key = mmr->sig->err_item.key;
1228 }
1229
1230 mmr->sig->sig_err_exists = false;
1231 mr_status->fail_status |= IB_MR_CHECK_SIG_STATUS;
1232 }
1233
1234done:
1235 return ret;
1236}