*/
        skb_get(skb);
        set_wr_txq(skb, CPL_PRIORITY_DATA, ep->txq_idx);
-       t4_set_arp_err_handler(skb, NULL, arp_failure_discard);
        BUG_ON(ep->mpa_skb);
        ep->mpa_skb = skb;
        ep->snd_seq += mpalen;
         * Function fw4_ack() will deref it.
         */
        skb_get(skb);
-       t4_set_arp_err_handler(skb, NULL, arp_failure_discard);
        ep->mpa_skb = skb;
        __state_set(&ep->com, MPA_REP_SENT);
        ep->snd_seq += mpalen;
             ep->mpa_attr.xmit_marker_enabled, ep->mpa_attr.version,
             ep->mpa_attr.p2p_type);
 
-       /*
-        * If the endpoint timer already expired, then we ignore
-        * the start request.  process_timeout() will abort
-        * the connection.
-        */
-       if (!stop_ep_timer(ep)) {
-               __state_set(&ep->com, MPA_REQ_RCVD);
-
-               /* drive upcall */
-               mutex_lock_nested(&ep->parent_ep->com.mutex,
-                                 SINGLE_DEPTH_NESTING);
-               if (ep->parent_ep->com.state != DEAD) {
-                       if (connect_request_upcall(ep))
-                               goto err_unlock_parent;
-               } else {
+       __state_set(&ep->com, MPA_REQ_RCVD);
+
+       /* drive upcall */
+       mutex_lock_nested(&ep->parent_ep->com.mutex, SINGLE_DEPTH_NESTING);
+       if (ep->parent_ep->com.state != DEAD) {
+               if (connect_request_upcall(ep))
                        goto err_unlock_parent;
-               }
-               mutex_unlock(&ep->parent_ep->com.mutex);
+       } else {
+               goto err_unlock_parent;
        }
+       mutex_unlock(&ep->parent_ep->com.mutex);
        return 0;
 
 err_unlock_parent:
                     state_read(&ep->com), ep->mpa_attr.initiator ? 1 : 0);
                kfree_skb(ep->mpa_skb);
                ep->mpa_skb = NULL;
+               mutex_lock(&ep->com.mutex);
+               if (test_bit(STOP_MPA_TIMER, &ep->com.flags))
+                       stop_ep_timer(ep);
+               mutex_unlock(&ep->com.mutex);
        }
        return 0;
 }
                disconnect = 1;
        }
        mutex_unlock(&ep->com.mutex);
-       if (disconnect)
+       if (disconnect) {
+               stop_ep_timer(ep);
                err = c4iw_ep_disconnect(ep, disconnect == 2, GFP_KERNEL);
+       }
        c4iw_put_ep(&ep->com);
        return 0;
 }
                             ep->com.qp, mask, &attrs, 1);
        if (err)
                goto err_deref_cm_id;
+
+       set_bit(STOP_MPA_TIMER, &ep->com.flags);
        err = send_mpa_reply(ep, conn_param->private_data,
                             conn_param->private_data_len);
        if (err)
                connect_reply_upcall(ep, -ETIMEDOUT);
                break;
        case MPA_REQ_WAIT:
+       case MPA_REP_SENT:
                __state_set(&ep->com, ABORTING);
                break;
        case CLOSING: