}
                }
 
-               err = slcan_transmit_cmd(sl, "O\r");
-               if (err) {
-                       netdev_err(dev, "failed to send open command 'O\\r'\n");
-                       goto cmd_transmit_failed;
+               if (sl->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) {
+                       err = slcan_transmit_cmd(sl, "L\r");
+                       if (err) {
+                               netdev_err(dev,
+                                          "failed to send listen-only command 'L\\r'\n");
+                               goto cmd_transmit_failed;
+                       }
+               } else {
+                       err = slcan_transmit_cmd(sl, "O\r");
+                       if (err) {
+                               netdev_err(dev,
+                                          "failed to send open command 'O\\r'\n");
+                               goto cmd_transmit_failed;
+                       }
                }
        }
 
        /* Configure CAN metadata */
        sl->can.bitrate_const = slcan_bitrate_const;
        sl->can.bitrate_const_cnt = ARRAY_SIZE(slcan_bitrate_const);
+       sl->can.ctrlmode_supported = CAN_CTRLMODE_LISTENONLY;
 
        /* Configure netdev interface */
        sl->dev = dev;