uint8_t dlc;
        canid_t id;
        uint8_t dreg;
+       u8 cmd_reg_val = 0x00;
        int i;
 
        if (can_dropped_invalid_skb(dev, skb))
        can_put_echo_skb(skb, dev, 0);
 
        if (priv->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT)
-               sja1000_write_cmdreg(priv, CMD_TR | CMD_AT);
+               cmd_reg_val |= CMD_AT;
+
+       if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK)
+               cmd_reg_val |= CMD_SRR;
        else
-               sja1000_write_cmdreg(priv, CMD_TR);
+               cmd_reg_val |= CMD_TR;
+
+       sja1000_write_cmdreg(priv, cmd_reg_val);
 
        return NETDEV_TX_OK;
 }
        priv->can.do_set_bittiming = sja1000_set_bittiming;
        priv->can.do_set_mode = sja1000_set_mode;
        priv->can.do_get_berr_counter = sja1000_get_berr_counter;
-       priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES |
-               CAN_CTRLMODE_BERR_REPORTING | CAN_CTRLMODE_LISTENONLY |
-               CAN_CTRLMODE_ONE_SHOT;
+       priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK |
+                                      CAN_CTRLMODE_LISTENONLY |
+                                      CAN_CTRLMODE_3_SAMPLES |
+                                      CAN_CTRLMODE_ONE_SHOT |
+                                      CAN_CTRLMODE_BERR_REPORTING;
 
        spin_lock_init(&priv->cmdreg_lock);