struct list_head tx_list;       /* Pending data packets */
 
        /* Control messages */
+       struct timer_list kick_timer;   /* Kick TX queuing on timeout */
        struct timer_list t2_timer;     /* Retransmit timer for commands */
        int cretries;                   /* Command retry counter */
        struct gsm_control *pending_cmd;/* Our current pending command */
        list_add_tail(&msg->list, &gsm->tx_list);
        gsm->tx_bytes += msg->len;
        gsm_data_kick(gsm, dlci);
+       mod_timer(&gsm->kick_timer, jiffies + 10 * gsm->t1 * HZ / 100);
 }
 
 /**
        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;
 
        size = len + overhead;
        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) {
                skb_queue_tail(&dlci->skb_list, dlci->skb);
                dlci->skb = NULL;
  *     renegotiate DLCI priorities with optional stuff. Needs optimising.
  */
 
-static void gsm_dlci_data_sweep(struct gsm_mux *gsm)
+static int gsm_dlci_data_sweep(struct gsm_mux *gsm)
 {
-       int len;
+       int len, ret = 0;
        /* Priority ordering: We should do priority with RR of the groups */
        int i = 1;
 
                /* DLCI empty - try the next */
                if (len == 0)
                        i++;
+               else
+                       ret++;
        }
+
+       return ret;
 }
 
 /**
        }
 }
 
+/**
+ *     gsm_kick_timer  -       transmit if possible
+ *     @t: timer contained in our gsm object
+ *
+ *     Transmit data from DLCIs if the queue is empty. We can't rely on
+ *     a tty wakeup except when we filled the pipe so we need to fire off
+ *     new data ourselves in other cases.
+ */
+static void gsm_kick_timer(struct timer_list *t)
+{
+       struct gsm_mux *gsm = from_timer(gsm, t, kick_timer);
+       unsigned long flags;
+       int sent = 0;
+
+       spin_lock_irqsave(&gsm->tx_lock, flags);
+       /* If we have nothing running then we need to fire up */
+       if (gsm->tx_bytes < TX_THRESH_LO)
+               sent = gsm_dlci_data_sweep(gsm);
+       spin_unlock_irqrestore(&gsm->tx_lock, flags);
+
+       if (sent && debug & 4)
+               pr_info("%s TX queue stalled\n", __func__);
+}
+
 /*
  *     Allocate/Free DLCI channels
  */
        }
 
        /* Finish outstanding timers, making sure they are done */
+       del_timer_sync(&gsm->kick_timer);
        del_timer_sync(&gsm->t2_timer);
 
        /* Free up any link layer users and finally the control channel */
        struct gsm_dlci *dlci;
        int ret;
 
+       timer_setup(&gsm->kick_timer, gsm_kick_timer, 0);
        timer_setup(&gsm->t2_timer, gsm_control_retransmit, 0);
        init_waitqueue_head(&gsm->event);
        spin_lock_init(&gsm->control_lock);
 
        gsmld_attach_gsm(tty, gsm);
 
+       timer_setup(&gsm->kick_timer, gsm_kick_timer, 0);
        timer_setup(&gsm->t2_timer, gsm_control_retransmit, 0);
 
        return 0;