static struct net_device **slcan_devs;
 
+static const u32 slcan_bitrate_const[] = {
+       10000, 20000, 50000, 100000, 125000,
+       250000, 500000, 800000, 1000000
+};
+
  /************************************************************************
   *                    SLCAN ENCAPSULATION FORMAT                       *
   ************************************************************************/
        netif_stop_queue(dev);
        close_candev(dev);
        sl->can.state = CAN_STATE_STOPPED;
+       if (sl->can.bittiming.bitrate == CAN_BITRATE_UNKNOWN)
+               sl->can.bittiming.bitrate = CAN_BITRATE_UNSET;
+
        sl->rcount   = 0;
        sl->xleft    = 0;
        spin_unlock_bh(&sl->lock);
 static int slc_open(struct net_device *dev)
 {
        struct slcan *sl = netdev_priv(dev);
-       int err;
+       unsigned char cmd[SLC_MTU];
+       int err, s;
 
        if (sl->tty == NULL)
                return -ENODEV;
         * can.bittiming.bitrate is CAN_BITRATE_UNSET (0), causing
         * open_candev() to fail. So let's set to a fake value.
         */
-       sl->can.bittiming.bitrate = CAN_BITRATE_UNKNOWN;
+       if (sl->can.bittiming.bitrate == CAN_BITRATE_UNSET)
+               sl->can.bittiming.bitrate = CAN_BITRATE_UNKNOWN;
+
        err = open_candev(dev);
        if (err) {
                netdev_err(dev, "failed to open can device\n");
                return err;
        }
 
-       sl->can.state = CAN_STATE_ERROR_ACTIVE;
        sl->flags &= BIT(SLF_INUSE);
+
+       if (sl->can.bittiming.bitrate != CAN_BITRATE_UNKNOWN) {
+               for (s = 0; s < ARRAY_SIZE(slcan_bitrate_const); s++) {
+                       if (sl->can.bittiming.bitrate == slcan_bitrate_const[s])
+                               break;
+               }
+
+               /* The CAN framework has already validate the bitrate value,
+                * so we can avoid to check if `s' has been properly set.
+                */
+
+               snprintf(cmd, sizeof(cmd), "C\rS%d\r", s);
+               err = slcan_transmit_cmd(sl, cmd);
+               if (err) {
+                       netdev_err(dev,
+                                  "failed to send bitrate command 'C\\rS%d\\r'\n",
+                                  s);
+                       close_candev(dev);
+                       return err;
+               }
+       }
+
+       sl->can.state = CAN_STATE_ERROR_ACTIVE;
        netif_start_queue(dev);
        return 0;
 }
        /* Initialize channel control data */
        sl->magic = SLCAN_MAGIC;
        sl->dev = dev;
+       sl->can.bitrate_const = slcan_bitrate_const;
+       sl->can.bitrate_const_cnt = ARRAY_SIZE(slcan_bitrate_const);
        spin_lock_init(&sl->lock);
        INIT_WORK(&sl->tx_work, slcan_transmit);
        init_waitqueue_head(&sl->xcmd_wait);