diff options
Diffstat (limited to 'drivers/infiniband/hw/cxgb3/iwch_cm.c')
-rw-r--r-- | drivers/infiniband/hw/cxgb3/iwch_cm.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.c b/drivers/infiniband/hw/cxgb3/iwch_cm.c index 3b4b0acd707f..b2faff5abce8 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_cm.c +++ b/drivers/infiniband/hw/cxgb3/iwch_cm.c | |||
@@ -1109,6 +1109,15 @@ static int abort_rpl(struct t3cdev *tdev, struct sk_buff *skb, void *ctx) | |||
1109 | 1109 | ||
1110 | PDBG("%s ep %p\n", __FUNCTION__, ep); | 1110 | PDBG("%s ep %p\n", __FUNCTION__, ep); |
1111 | 1111 | ||
1112 | /* | ||
1113 | * We get 2 abort replies from the HW. The first one must | ||
1114 | * be ignored except for scribbling that we need one more. | ||
1115 | */ | ||
1116 | if (!(ep->flags & ABORT_REQ_IN_PROGRESS)) { | ||
1117 | ep->flags |= ABORT_REQ_IN_PROGRESS; | ||
1118 | return CPL_RET_BUF_DONE; | ||
1119 | } | ||
1120 | |||
1112 | close_complete_upcall(ep); | 1121 | close_complete_upcall(ep); |
1113 | state_set(&ep->com, DEAD); | 1122 | state_set(&ep->com, DEAD); |
1114 | release_ep_resources(ep); | 1123 | release_ep_resources(ep); |
@@ -1189,6 +1198,7 @@ static int listen_stop(struct iwch_listen_ep *ep) | |||
1189 | } | 1198 | } |
1190 | req = (struct cpl_close_listserv_req *) skb_put(skb, sizeof(*req)); | 1199 | req = (struct cpl_close_listserv_req *) skb_put(skb, sizeof(*req)); |
1191 | req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); | 1200 | req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); |
1201 | req->cpu_idx = 0; | ||
1192 | OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_CLOSE_LISTSRV_REQ, ep->stid)); | 1202 | OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_CLOSE_LISTSRV_REQ, ep->stid)); |
1193 | skb->priority = 1; | 1203 | skb->priority = 1; |
1194 | ep->com.tdev->send(ep->com.tdev, skb); | 1204 | ep->com.tdev->send(ep->com.tdev, skb); |
@@ -1475,6 +1485,15 @@ static int peer_abort(struct t3cdev *tdev, struct sk_buff *skb, void *ctx) | |||
1475 | int ret; | 1485 | int ret; |
1476 | int state; | 1486 | int state; |
1477 | 1487 | ||
1488 | /* | ||
1489 | * We get 2 peer aborts from the HW. The first one must | ||
1490 | * be ignored except for scribbling that we need one more. | ||
1491 | */ | ||
1492 | if (!(ep->flags & PEER_ABORT_IN_PROGRESS)) { | ||
1493 | ep->flags |= PEER_ABORT_IN_PROGRESS; | ||
1494 | return CPL_RET_BUF_DONE; | ||
1495 | } | ||
1496 | |||
1478 | if (is_neg_adv_abort(req->status)) { | 1497 | if (is_neg_adv_abort(req->status)) { |
1479 | PDBG("%s neg_adv_abort ep %p tid %d\n", __FUNCTION__, ep, | 1498 | PDBG("%s neg_adv_abort ep %p tid %d\n", __FUNCTION__, ep, |
1480 | ep->hwtid); | 1499 | ep->hwtid); |