/* guarantee 0 <= bytes_to_rcv <= rmbe_size */
                smp_mb__after_atomic();
                smc->sk.sk_data_ready(&smc->sk);
+       } else if ((conn->local_rx_ctrl.prod_flags.write_blocked) ||
+                  (conn->local_rx_ctrl.prod_flags.cons_curs_upd_req)) {
+               smc->sk.sk_data_ready(&smc->sk);
        }
 
        if (conn->local_rx_ctrl.conn_state_flags.peer_conn_abort) {
                /* trigger socket release if connection closed */
                smc_close_wake_tx_prepared(smc);
        }
-
-       /* socket connected but not accepted */
-       if (!smc->sk.sk_socket)
-               return;
-
-       /* data available */
-       if ((conn->local_rx_ctrl.prod_flags.write_blocked) ||
-           (conn->local_rx_ctrl.prod_flags.cons_curs_upd_req))
-               smc_tx_consumer_update(conn);
 }
 
 /* called under tasklet context */
 
 void smc_tx_consumer_update(struct smc_connection *conn)
 {
        union smc_host_cursor cfed, cons;
-       struct smc_cdc_tx_pend *pend;
-       struct smc_wr_buf *wr_buf;
-       int to_confirm, rc;
+       int to_confirm;
 
        smc_curs_write(&cons,
                       smc_curs_read(&conn->local_tx_ctrl.cons, conn),
            ((to_confirm > conn->rmbe_update_limit) &&
             ((to_confirm > (conn->rmbe_size / 2)) ||
              conn->local_rx_ctrl.prod_flags.write_blocked))) {
-               rc = smc_cdc_get_free_slot(conn, &wr_buf, &pend);
-               if (!rc)
-                       rc = smc_cdc_msg_send(conn, wr_buf, pend);
-               if (rc < 0) {
+               if (smc_cdc_get_slot_and_msg_send(conn) < 0) {
                        schedule_delayed_work(&conn->tx_work,
                                              SMC_TX_WORK_DELAY);
                        return;