|
@@ -1109,6 +1109,15 @@ static int abort_rpl(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
|
|
|
|
|
|
PDBG("%s ep %p\n", __FUNCTION__, ep);
|
|
|
|
|
|
+ /*
|
|
|
+ * We get 2 abort replies from the HW. The first one must
|
|
|
+ * be ignored except for scribbling that we need one more.
|
|
|
+ */
|
|
|
+ if (!(ep->flags & ABORT_REQ_IN_PROGRESS)) {
|
|
|
+ ep->flags |= ABORT_REQ_IN_PROGRESS;
|
|
|
+ return CPL_RET_BUF_DONE;
|
|
|
+ }
|
|
|
+
|
|
|
close_complete_upcall(ep);
|
|
|
state_set(&ep->com, DEAD);
|
|
|
release_ep_resources(ep);
|
|
@@ -1476,6 +1485,15 @@ static int peer_abort(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
|
|
|
int ret;
|
|
|
int state;
|
|
|
|
|
|
+ /*
|
|
|
+ * We get 2 peer aborts from the HW. The first one must
|
|
|
+ * be ignored except for scribbling that we need one more.
|
|
|
+ */
|
|
|
+ if (!(ep->flags & PEER_ABORT_IN_PROGRESS)) {
|
|
|
+ ep->flags |= PEER_ABORT_IN_PROGRESS;
|
|
|
+ return CPL_RET_BUF_DONE;
|
|
|
+ }
|
|
|
+
|
|
|
if (is_neg_adv_abort(req->status)) {
|
|
|
PDBG("%s neg_adv_abort ep %p tid %d\n", __FUNCTION__, ep,
|
|
|
ep->hwtid);
|