atomic_t                sndbuf_space;   /* remaining space in sndbuf */
        u16                     tx_cdc_seq;     /* sequence # for CDC send */
        spinlock_t              send_lock;      /* protect wr_sends */
-       struct work_struct      tx_work;        /* retry of smc_cdc_msg_send */
+       struct delayed_work     tx_work;        /* retry of smc_cdc_msg_send */
 
        struct smc_host_cdc_msg local_rx_ctrl;  /* filled during event_handl.
                                                 * .prod cf. TCP rcv_nxt
 
        case SMC_ACTIVE:
                smc_close_stream_wait(smc, timeout);
                release_sock(sk);
-               cancel_work_sync(&conn->tx_work);
+               cancel_delayed_work_sync(&conn->tx_work);
                lock_sock(sk);
                if (sk->sk_state == SMC_ACTIVE) {
                        /* send close request */
                if (!smc_cdc_rxed_any_close(conn))
                        smc_close_stream_wait(smc, timeout);
                release_sock(sk);
-               cancel_work_sync(&conn->tx_work);
+               cancel_delayed_work_sync(&conn->tx_work);
                lock_sock(sk);
                if (sk->sk_err != ECONNABORTED) {
                        /* confirm close from peer */
                /* peer sending PeerConnectionClosed will cause transition */
                break;
        case SMC_PROCESSABORT:
-               cancel_work_sync(&conn->tx_work);
+               release_sock(sk);
+               cancel_delayed_work_sync(&conn->tx_work);
+               lock_sock(sk);
                smc_close_abort(conn);
                sk->sk_state = SMC_CLOSED;
                smc_close_wait_tx_pends(smc);
        case SMC_ACTIVE:
                smc_close_stream_wait(smc, timeout);
                release_sock(sk);
-               cancel_work_sync(&conn->tx_work);
+               cancel_delayed_work_sync(&conn->tx_work);
                lock_sock(sk);
                /* send close wr request */
                rc = smc_close_wr(conn);
                if (!smc_cdc_rxed_any_close(conn))
                        smc_close_stream_wait(smc, timeout);
                release_sock(sk);
-               cancel_work_sync(&conn->tx_work);
+               cancel_delayed_work_sync(&conn->tx_work);
                lock_sock(sk);
                /* confirm close from peer */
                rc = smc_close_wr(conn);
 
 #include "smc_cdc.h"
 #include "smc_tx.h"
 
+#define SMC_TX_WORK_DELAY      HZ
+
 /***************************** sndbuf producer *******************************/
 
 /* callback implementation for sk.sk_write_space()
                                goto out_unlock;
                        }
                        rc = 0;
-                       schedule_work(&conn->tx_work);
+                       schedule_delayed_work(&conn->tx_work,
+                                             SMC_TX_WORK_DELAY);
                }
                goto out_unlock;
        }
  */
 static void smc_tx_work(struct work_struct *work)
 {
-       struct smc_connection *conn = container_of(work,
+       struct smc_connection *conn = container_of(to_delayed_work(work),
                                                   struct smc_connection,
                                                   tx_work);
        struct smc_sock *smc = container_of(conn, struct smc_sock, conn);
                if (!rc)
                        rc = smc_cdc_msg_send(conn, wr_buf, pend);
                if (rc < 0) {
-                       schedule_work(&conn->tx_work);
+                       schedule_delayed_work(&conn->tx_work,
+                                             SMC_TX_WORK_DELAY);
                        return;
                }
                smc_curs_write(&conn->rx_curs_confirmed,
 void smc_tx_init(struct smc_sock *smc)
 {
        smc->sk.sk_write_space = smc_tx_write_space;
-       INIT_WORK(&smc->conn.tx_work, smc_tx_work);
+       INIT_DELAYED_WORK(&smc->conn.tx_work, smc_tx_work);
        spin_lock_init(&smc->conn.send_lock);
 }