unsigned long           flags;          /* Flag values/ mode etc     */
 #define SLF_INUSE              0               /* Channel in use            */
 #define SLF_ERROR              1               /* Parity, etc. error        */
+#define SLF_XCMD               2               /* Command transmission      */
+       wait_queue_head_t       xcmd_wait;      /* Wait queue for commands   */
+                                               /* transmission              */
 };
 
 static struct net_device **slcan_devs;
 
        spin_lock_bh(&sl->lock);
        /* First make sure we're connected. */
-       if (!sl->tty || sl->magic != SLCAN_MAGIC || !netif_running(sl->dev)) {
+       if (!sl->tty || sl->magic != SLCAN_MAGIC ||
+           (unlikely(!netif_running(sl->dev)) &&
+            likely(!test_bit(SLF_XCMD, &sl->flags)))) {
                spin_unlock_bh(&sl->lock);
                return;
        }
 
        if (sl->xleft <= 0)  {
+               if (unlikely(test_bit(SLF_XCMD, &sl->flags))) {
+                       clear_bit(SLF_XCMD, &sl->flags);
+                       clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
+                       spin_unlock_bh(&sl->lock);
+                       wake_up(&sl->xcmd_wait);
+                       return;
+               }
+
                /* Now serial buffer is almost free & we can start
                 * transmission of another packet */
                sl->dev->stats.tx_packets++;
  *   Routines looking at netdevice side.
  ******************************************/
 
+static int slcan_transmit_cmd(struct slcan *sl, const unsigned char *cmd)
+{
+       int ret, actual, n;
+
+       spin_lock(&sl->lock);
+       if (!sl->tty) {
+               spin_unlock(&sl->lock);
+               return -ENODEV;
+       }
+
+       n = snprintf(sl->xbuff, sizeof(sl->xbuff), "%s", cmd);
+       set_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
+       actual = sl->tty->ops->write(sl->tty, sl->xbuff, n);
+       sl->xleft = n - actual;
+       sl->xhead = sl->xbuff + actual;
+       set_bit(SLF_XCMD, &sl->flags);
+       spin_unlock(&sl->lock);
+       ret = wait_event_interruptible_timeout(sl->xcmd_wait,
+                                              !test_bit(SLF_XCMD, &sl->flags),
+                                              HZ);
+       clear_bit(SLF_XCMD, &sl->flags);
+       if (ret == -ERESTARTSYS)
+               return ret;
+
+       if (ret == 0)
+               return -ETIMEDOUT;
+
+       return 0;
+}
+
 /* Netdevice UP -> DOWN routine */
 static int slc_close(struct net_device *dev)
 {
        sl->dev = dev;
        spin_lock_init(&sl->lock);
        INIT_WORK(&sl->tx_work, slcan_transmit);
+       init_waitqueue_head(&sl->xcmd_wait);
        slcan_devs[i] = dev;
 
        return sl;