Skip to content

Commit 89aaca5

Browse files
skotur-brcmdledford
authored andcommitted
bnxt_re: Don't issue cmd to delete GID for QP1 GID entry before the QP is destroyed
FW needs the 0th GID Entry in the Table to be preserved before it's corresponding QP1 is deleted, else it will fail the cmd. Check for the same and return to prevent error msg being logged for cmd failure. Signed-off-by: Somnath Kotur <[email protected]> Signed-off-by: Doug Ledford <[email protected]>
1 parent 1993519 commit 89aaca5

File tree

1 file changed

+20
-3
lines changed

1 file changed

+20
-3
lines changed

drivers/infiniband/hw/bnxt_re/ib_verbs.c

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ int bnxt_re_del_gid(struct ib_device *ibdev, u8 port_num,
314314
struct bnxt_re_gid_ctx *ctx, **ctx_tbl;
315315
struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev);
316316
struct bnxt_qplib_sgid_tbl *sgid_tbl = &rdev->qplib_res.sgid_tbl;
317+
struct bnxt_qplib_gid *gid_to_del;
317318

318319
/* Delete the entry from the hardware */
319320
ctx = *context;
@@ -323,11 +324,25 @@ int bnxt_re_del_gid(struct ib_device *ibdev, u8 port_num,
323324
if (sgid_tbl && sgid_tbl->active) {
324325
if (ctx->idx >= sgid_tbl->max)
325326
return -EINVAL;
327+
gid_to_del = &sgid_tbl->tbl[ctx->idx];
328+
/* DEL_GID is called in WQ context(netdevice_event_work_handler)
329+
* or via the ib_unregister_device path. In the former case QP1
330+
* may not be destroyed yet, in which case just return as FW
331+
* needs that entry to be present and will fail it's deletion.
332+
* We could get invoked again after QP1 is destroyed OR get an
333+
* ADD_GID call with a different GID value for the same index
334+
* where we issue MODIFY_GID cmd to update the GID entry -- TBD
335+
*/
336+
if (ctx->idx == 0 &&
337+
rdma_link_local_addr((struct in6_addr *)gid_to_del) &&
338+
ctx->refcnt == 1 && rdev->qp1_sqp) {
339+
dev_dbg(rdev_to_dev(rdev),
340+
"Trying to delete GID0 while QP1 is alive\n");
341+
return -EFAULT;
342+
}
326343
ctx->refcnt--;
327344
if (!ctx->refcnt) {
328-
rc = bnxt_qplib_del_sgid(sgid_tbl,
329-
&sgid_tbl->tbl[ctx->idx],
330-
true);
345+
rc = bnxt_qplib_del_sgid(sgid_tbl, gid_to_del, true);
331346
if (rc) {
332347
dev_err(rdev_to_dev(rdev),
333348
"Failed to remove GID: %#x", rc);
@@ -811,6 +826,8 @@ int bnxt_re_destroy_qp(struct ib_qp *ib_qp)
811826

812827
kfree(rdev->sqp_ah);
813828
kfree(rdev->qp1_sqp);
829+
rdev->qp1_sqp = NULL;
830+
rdev->sqp_ah = NULL;
814831
}
815832

816833
if (!IS_ERR_OR_NULL(qp->rumem))

0 commit comments

Comments
 (0)