spin_unlock_bh(&cfhsi->lock);
 
                /* Create HSI frame. */
-               len = cfhsi_tx_frm(desc, cfhsi);
-               if (!len) {
-                       cfhsi->tx_state = CFHSI_TX_STATE_IDLE;
-                       /* Start inactivity timer. */
-                       mod_timer(&cfhsi->timer,
+               do {
+                       len = cfhsi_tx_frm(desc, cfhsi);
+                       if (!len) {
+                               spin_lock_bh(&cfhsi->lock);
+                               if (unlikely(skb_peek(&cfhsi->qhead))) {
+                                       spin_unlock_bh(&cfhsi->lock);
+                                       continue;
+                               }
+                               cfhsi->tx_state = CFHSI_TX_STATE_IDLE;
+                               /* Start inactivity timer. */
+                               mod_timer(&cfhsi->timer,
                                        jiffies + CFHSI_INACTIVITY_TOUT);
-                       break;
-               }
+                               spin_unlock_bh(&cfhsi->lock);
+                               goto done;
+                       }
+               } while (!len);
 
                /* Set up new transfer. */
                res = cfhsi->dev->cfhsi_tx(cfhsi->tx_buf, len, cfhsi->dev);
                                __func__, res);
                }
        } while (res < 0);
+
+done:
+       return;
 }
 
 static void cfhsi_tx_done_cb(struct cfhsi_drv *drv)