hctx->srtt, hctx->rttvar,
                               hctx->rto, HZ, r);
        }
-
-       /* we got a new ack, so re-start RTO timer */
-       ccid2_hc_tx_kill_rto_timer(sk);
-       ccid2_start_rto_timer(sk);
-}
-
-static void ccid2_hc_tx_dec_pipe(struct sock *sk)
-{
-       struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
-
-       if (hctx->pipe == 0)
-               DCCP_BUG("pipe == 0");
-       else
-               hctx->pipe--;
-
-       if (hctx->pipe == 0)
-               ccid2_hc_tx_kill_rto_timer(sk);
 }
 
 static void ccid2_congestion_event(struct sock *sk, struct ccid2_seq *seqp)
                                        seqp->ccid2s_acked = 1;
                                        ccid2_pr_debug("Got ack for %llu\n",
                                                       (unsigned long long)seqp->ccid2s_seq);
-                                       ccid2_hc_tx_dec_pipe(sk);
+                                       hctx->pipe--;
                                }
                                if (seqp == hctx->seqt) {
                                        done = 1;
                                 * one ack vector.
                                 */
                                ccid2_congestion_event(sk, seqp);
-                               ccid2_hc_tx_dec_pipe(sk);
+                               hctx->pipe--;
                        }
                        if (seqp == hctx->seqt)
                                break;
                hctx->seqt = hctx->seqt->ccid2s_next;
        }
 
+       /* restart RTO timer if not all outstanding data has been acked */
+       if (hctx->pipe == 0)
+               sk_stop_timer(sk, &hctx->rtotimer);
+       else
+               sk_reset_timer(sk, &hctx->rtotimer,
+                              jiffies + hctx->rto);
 done:
        /* check if incoming Acks allow pending packets to be sent */
        if (sender_was_blocked && !ccid2_cwnd_network_limited(hctx))