{
        struct gsm_msg *msg;
        u8 *dp;
-       int len, total_size, size;
-       int h = dlci->adaption - 1;
+       int h, len, size;
 
-       total_size = 0;
-       while (1) {
-               len = kfifo_len(&dlci->fifo);
-               if (len == 0)
-                       return total_size;
-
-               /* MTU/MRU count only the data bits */
-               if (len > gsm->mtu)
-                       len = gsm->mtu;
-
-               size = len + h;
-
-               msg = gsm_data_alloc(gsm, dlci->addr, size, gsm->ftype);
-               /* FIXME: need a timer or something to kick this so it can't
-                  get stuck with no work outstanding and no buffer free */
-               if (msg == NULL)
-                       return -ENOMEM;
-               dp = msg->data;
-               switch (dlci->adaption) {
-               case 1: /* Unstructured */
-                       break;
-               case 2: /* Unstructed with modem bits.
-               Always one byte as we never send inline break data */
-                       *dp++ = (gsm_encode_modem(dlci) << 1) | EA;
-                       break;
-               }
-               WARN_ON(kfifo_out_locked(&dlci->fifo, dp , len, &dlci->lock) != len);
-               __gsm_data_queue(dlci, msg);
-               total_size += size;
+       /* for modem bits without break data */
+       h = ((dlci->adaption == 1) ? 0 : 1);
+
+       len = kfifo_len(&dlci->fifo);
+       if (len == 0)
+               return 0;
+
+       /* MTU/MRU count only the data bits but watch adaption mode */
+       if ((len + h) > gsm->mtu)
+               len = gsm->mtu - h;
+
+       size = len + h;
+
+       msg = gsm_data_alloc(gsm, dlci->addr, size, gsm->ftype);
+       /* FIXME: need a timer or something to kick this so it can't
+        * get stuck with no work outstanding and no buffer free
+        */
+       if (!msg)
+               return -ENOMEM;
+       dp = msg->data;
+       switch (dlci->adaption) {
+       case 1: /* Unstructured */
+               break;
+       case 2: /* Unstructured with modem bits.
+                * Always one byte as we never send inline break data
+                */
+               *dp++ = (gsm_encode_modem(dlci) << 1) | EA;
+               break;
+       default:
+               pr_err("%s: unsupported adaption %d\n", __func__,
+                      dlci->adaption);
+               break;
        }
+
+       WARN_ON(len != kfifo_out_locked(&dlci->fifo, dp, len,
+               &dlci->lock));
+
+       /* Notify upper layer about available send space. */
+       tty_port_tty_wakeup(&dlci->port);
+
+       __gsm_data_queue(dlci, msg);
        /* Bytes of data we used up */
-       return total_size;
+       return size;
 }
 
 /**