2 * slcan.c - serial line CAN interface driver (using tty line discipline)
4 * Copyright (c) 2007 Volkswagen Group Electronic Research
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of Volkswagen nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
19 * Alternatively, provided that this notice is retained in full, this
20 * software may be distributed under the terms of the GNU General
21 * Public License ("GPL") version 2, in which case the provisions of the
22 * GPL apply INSTEAD OF those given above.
24 * The provided data structures and external interfaces from this code
25 * are not restricted to be used by modules with a GPL compatible license.
27 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
29 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
30 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
31 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
32 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
33 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
40 * Send feedback to <socketcan-users@lists.berlios.de>
45 * This file is derived from linux/drivers/net/slip.c
47 * Therefore it has the same (strange?) behaviour not to unregister the
48 * netdevice when detaching the tty. Is there any better solution?
50 * Do not try to attach, detach and re-attach a tty for this reason ...
52 * slip.c Authors: Laurence Culhane, <loz@holmes.demon.co.uk>
53 * Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
56 #include <linux/version.h>
57 #include <linux/module.h>
58 #include <linux/moduleparam.h>
60 #include <asm/system.h>
61 #include <asm/uaccess.h>
62 #include <linux/bitops.h>
63 #include <linux/string.h>
65 #include <linux/interrupt.h>
67 #include <linux/tty.h>
68 #include <linux/errno.h>
69 #include <linux/netdevice.h>
70 #include <linux/etherdevice.h>
71 #include <linux/skbuff.h>
72 #include <linux/rtnetlink.h>
73 #include <linux/if_arp.h>
74 #include <linux/if_ether.h>
75 #include <linux/if_slip.h>
76 #include <linux/delay.h>
77 #include <linux/init.h>
79 #include <linux/can.h>
81 #include <linux/can/version.h> /* for RCSID. Removed by mkpatch script */
84 static __initdata const char banner[] =
85 KERN_INFO "slcan: serial line CAN interface driver\n";
87 MODULE_ALIAS_LDISC(N_SLCAN);
88 MODULE_DESCRIPTION("serial line CAN interface");
89 MODULE_LICENSE("Dual BSD/GPL");
90 MODULE_AUTHOR("Oliver Hartkopp <oliver.hartkopp@volkswagen.de>");
92 #ifdef CONFIG_CAN_DEBUG_DEVICES
94 module_param(debug, int, S_IRUGO);
95 #define DBG(args...) (debug & 1 ? \
96 (printk(KERN_DEBUG "slcan %s: ", __func__), \
103 #error Your kernel does not support tty line discipline N_SLCAN
106 * As there is currently no line discipline N_SLCAN in the mainstream kernel
107 * you will have to modify two kernel includes & recompile the kernel.
109 * Add this in include/asm/termios.h after the definition of N_HCI:
112 * Increment NR_LDICS in include/linux/tty.h from 16 to 17
114 * NEW: Since Kernel 2.6.21 you only have to change include/linux/tty.h
118 #define SLC_CHECK_TRANSMIT
119 #define SLCAN_MAGIC 0x53CA
121 static int maxdev = 10; /* MAX number of SLCAN channels;
122 This can be overridden with
123 insmod slcan.ko maxdev=nnn */
124 module_param(maxdev, int, 0);
125 MODULE_PARM_DESC(maxdev, "Maximum number of slcan interfaces");
127 /* maximum rx buffer len: extended CAN frame with timestamp */
128 #define SLC_MTU (sizeof("T1111222281122334455667788EA5F\r")+1)
133 /* Various fields. */
134 struct tty_struct *tty; /* ptr to TTY structure */
135 struct net_device *dev; /* easy for intr handling */
138 /* These are pointers to the malloc()ed frame buffers. */
139 unsigned char rbuff[SLC_MTU]; /* receiver buffer */
140 int rcount; /* received chars counter */
141 unsigned char xbuff[SLC_MTU]; /* transmitter buffer */
142 unsigned char *xhead; /* pointer to next XMIT byte */
143 int xleft; /* bytes left in XMIT queue */
145 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
146 /* SLCAN interface statistics. */
147 struct net_device_stats stats;
150 unsigned long flags; /* Flag values/ mode etc */
151 #define SLF_INUSE 0 /* Channel in use */
152 #define SLF_ERROR 1 /* Parity, etc. error */
154 unsigned char leased;
159 static struct net_device **slcan_devs;
161 /************************************************************************
162 * SLCAN ENCAPSULATION FORMAT *
163 ************************************************************************/
166 * A CAN frame has a can_id (11 bit standard frame format OR 29 bit extended
167 * frame format) a data length code (can_dlc) which can be from 0 to 8
168 * and up to <can_dlc> data bytes as payload.
169 * Additionally a CAN frame may become a remote transmission frame if the
170 * RTR-bit is set. This causes another ECU to send a CAN frame with the
173 * The SLCAN ASCII representation of these different frame types is:
174 * <type> <id> <dlc> <data>*
176 * Extended frames (29 bit) are defined by capital characters in the type.
177 * RTR frames are defined as 'r' types - normal frames have 't' type:
178 * t => 11 bit data frame
179 * r => 11 bit RTR frame
180 * T => 29 bit data frame
181 * R => 29 bit RTR frame
183 * The <id> is 3 (standard) or 8 (extended) bytes in ASCII Hex (base64).
184 * The <dlc> is a one byte ASCII number ('0' - '8')
185 * The <data> section has at much ASCII Hex bytes as defined by the <dlc>
189 * t1230 : can_id 0x123, can_dlc 0, no data
190 * t4563112233 : can_id 0x456, can_dlc 3, data 0x11 0x22 0x33
191 * T12ABCDEF2AA55 : extended can_id 0x12ABCDEF, can_dlc 2, data 0xAA 0x55
192 * r1230 : can_id 0x123, can_dlc 0, no data, remote transmission request
196 /************************************************************************
197 * STANDARD SLCAN DECAPSULATION *
198 ************************************************************************/
200 static int asc2nibble(char c)
203 if ((c >= '0') && (c <= '9'))
206 if ((c >= 'A') && (c <= 'F'))
209 if ((c >= 'a') && (c <= 'f'))
212 return 16; /* error */
215 /* Send one completely decapsulated can_frame to the network layer */
216 static void slc_bump(struct slcan *sl)
218 struct net_device_stats *stats = sl->dev->get_stats(sl->dev);
222 char cmd = sl->rbuff[0];
224 if ((cmd != 't') && (cmd != 'T') && (cmd != 'r') && (cmd != 'R'))
227 if (cmd & 0x20) /* tiny chars 'r' 't' => standard frame format */
228 dlc_pos = 4; /* dlc position tiiid */
230 dlc_pos = 9; /* dlc position Tiiiiiiiid */
232 if (!((sl->rbuff[dlc_pos] >= '0') && (sl->rbuff[dlc_pos] < '9')))
235 cf.can_dlc = sl->rbuff[dlc_pos] & 0x0F; /* get can_dlc */
237 sl->rbuff[dlc_pos] = 0; /* terminate can_id string */
238 cf.can_id = simple_strtoul(sl->rbuff+1, NULL, 16);
240 if (!(cmd & 0x20)) /* NO tiny chars => extended frame format */
241 cf.can_id |= CAN_EFF_FLAG;
243 if ((cmd | 0x20) == 'r') /* RTR frame */
244 cf.can_id |= CAN_RTR_FLAG;
246 *(u64 *) (&cf.data) = 0; /* clear payload */
248 for (i = 0, dlc_pos++; i < cf.can_dlc; i++) {
250 tmp = asc2nibble(sl->rbuff[dlc_pos++]);
253 cf.data[i] = (tmp << 4);
254 tmp = asc2nibble(sl->rbuff[dlc_pos++]);
261 skb = dev_alloc_skb(sizeof(struct can_frame));
266 skb->protocol = htons(ETH_P_CAN);
267 skb->pkt_type = PACKET_BROADCAST;
268 skb->ip_summed = CHECKSUM_UNNECESSARY;
269 memcpy(skb_put(skb, sizeof(struct can_frame)),
270 &cf, sizeof(struct can_frame));
273 sl->dev->last_rx = jiffies;
275 stats->rx_bytes += cf.can_dlc;
278 /* parse tty input stream */
279 static void slcan_unesc(struct slcan *sl, unsigned char s)
281 struct net_device_stats *stats = sl->dev->get_stats(sl->dev);
283 if ((s == '\r') || (s == '\a')) { /* CR or BEL ends the pdu */
284 if (!test_and_clear_bit(SLF_ERROR, &sl->flags) &&
290 if (!test_bit(SLF_ERROR, &sl->flags)) {
291 if (sl->rcount < SLC_MTU) {
292 sl->rbuff[sl->rcount++] = s;
295 stats->rx_over_errors++;
296 set_bit(SLF_ERROR, &sl->flags);
302 /************************************************************************
303 * STANDARD SLCAN ENCAPSULATION *
304 ************************************************************************/
306 /* Encapsulate one can_frame and stuff into a TTY queue. */
307 static void slc_encaps(struct slcan *sl, struct can_frame *cf)
309 struct net_device_stats *stats = sl->dev->get_stats(sl->dev);
313 if (cf->can_id & CAN_RTR_FLAG)
314 cmd = 'R'; /* becomes 'r' in standard frame format */
316 cmd = 'T'; /* becomes 't' in standard frame format */
318 if (cf->can_id & CAN_EFF_FLAG)
319 sprintf(sl->xbuff, "%c%08X%d", cmd,
320 cf->can_id & CAN_EFF_MASK, cf->can_dlc);
322 sprintf(sl->xbuff, "%c%03X%d", cmd | 0x20,
323 cf->can_id & CAN_SFF_MASK, cf->can_dlc);
325 idx = strlen(sl->xbuff);
327 for (i = 0; i < cf->can_dlc; i++)
328 sprintf(&sl->xbuff[idx + 2*i], "%02X", cf->data[i]);
330 DBG("ASCII frame = '%s'\n", sl->xbuff);
332 strcat(sl->xbuff, "\r"); /* add terminating character */
334 /* Order of next two lines is *very* important.
335 * When we are sending a little amount of data,
336 * the transfer may be completed inside driver.write()
337 * routine, because it's running with interrupts enabled.
338 * In this case we *never* got WRITE_WAKEUP event,
339 * if we did not request it before write operation.
340 * 14 Oct 1994 Dmitry Gorodchanin.
342 sl->tty->flags |= (1 << TTY_DO_WRITE_WAKEUP);
343 actual = sl->tty->driver->write(sl->tty, sl->xbuff, strlen(sl->xbuff));
344 #ifdef SLC_CHECK_TRANSMIT
345 sl->dev->trans_start = jiffies;
347 sl->xleft = strlen(sl->xbuff) - actual;
348 sl->xhead = sl->xbuff + actual;
349 stats->tx_bytes += cf->can_dlc;
353 * Called by the driver when there's room for more data. If we have
354 * more packets to send, we send them here.
356 static void slcan_write_wakeup(struct tty_struct *tty)
359 struct slcan *sl = (struct slcan *) tty->disc_data;
360 struct net_device_stats *stats = sl->dev->get_stats(sl->dev);
362 /* First make sure we're connected. */
363 if (!sl || sl->magic != SLCAN_MAGIC || !netif_running(sl->dev))
366 if (sl->xleft <= 0) {
367 /* Now serial buffer is almost free & we can start
368 * transmission of another packet */
370 tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
371 netif_wake_queue(sl->dev);
375 actual = tty->driver->write(tty, sl->xhead, sl->xleft);
380 static void slc_tx_timeout(struct net_device *dev)
382 struct slcan *sl = netdev_priv(dev);
384 spin_lock(&sl->lock);
386 if (netif_queue_stopped(dev)) {
387 if (!netif_running(dev))
390 /* May be we must check transmitter timeout here ?
391 * 14 Oct 1994 Dmitry Gorodchanin.
393 #ifdef SLC_CHECK_TRANSMIT
394 if (time_before(jiffies, dev->trans_start + 20 * HZ)) {
395 /* 20 sec timeout not reached */
398 printk(KERN_WARNING "%s: transmit timed out, %s?\n", dev->name,
399 (sl->tty->driver->chars_in_buffer(sl->tty) || sl->xleft)
400 ? "bad line quality" : "driver error");
402 sl->tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
403 netif_wake_queue(sl->dev);
407 spin_unlock(&sl->lock);
411 /******************************************
412 * Routines looking at netdevice side.
413 ******************************************/
415 /* Send a can_frame to a TTY queue. */
416 static int slc_xmit(struct sk_buff *skb, struct net_device *dev)
418 struct slcan *sl = netdev_priv(dev);
420 if (skb->len != sizeof(struct can_frame))
423 spin_lock(&sl->lock);
424 if (!netif_running(dev)) {
425 spin_unlock(&sl->lock);
426 printk(KERN_WARNING "%s: xmit: iface is down\n", dev->name);
430 if (sl->tty == NULL) {
431 spin_unlock(&sl->lock);
435 netif_stop_queue(sl->dev);
436 slc_encaps(sl, (struct can_frame *) skb->data); /* encaps & send */
437 spin_unlock(&sl->lock);
445 /* Netdevice UP -> DOWN routine */
446 static int slc_close(struct net_device *dev)
448 struct slcan *sl = netdev_priv(dev);
450 spin_lock_bh(&sl->lock);
452 /* TTY discipline is running. */
453 sl->tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
455 netif_stop_queue(dev);
458 spin_unlock_bh(&sl->lock);
463 /* Netdevice DOWN -> UP routine */
464 static int slc_open(struct net_device *dev)
466 struct slcan *sl = netdev_priv(dev);
471 sl->flags &= (1 << SLF_INUSE);
472 netif_start_queue(dev);
476 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
477 /* Netdevice get statistics request */
478 static struct net_device_stats *slc_get_stats(struct net_device *dev)
480 struct slcan *sl = netdev_priv(dev);
486 /* Netdevice register callback */
487 static void slc_setup(struct net_device *dev)
489 dev->open = slc_open;
490 dev->destructor = free_netdev;
491 dev->stop = slc_close;
492 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
493 dev->get_stats = slc_get_stats;
495 dev->hard_start_xmit = slc_xmit;
497 dev->hard_header_len = 0;
499 dev->tx_queue_len = 10;
501 dev->mtu = sizeof(struct can_frame);
502 dev->type = ARPHRD_CAN;
503 #ifdef SLC_CHECK_TRANSMIT
504 dev->tx_timeout = slc_tx_timeout;
505 dev->watchdog_timeo = 20*HZ;
508 /* New-style flags. */
509 dev->flags = IFF_NOARP;
510 dev->features = NETIF_F_NO_CSUM;
513 /******************************************
514 * Routines looking at TTY side.
515 ******************************************/
517 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16)
518 static int slcan_receive_room(struct tty_struct *tty)
520 return 65536; /* We can handle an infinite amount of data. :-) */
525 * Handle the 'receiver data ready' interrupt.
526 * This function is called by the 'tty_io' module in the kernel when
527 * a block of SLCAN data has been received, which can now be decapsulated
528 * and sent on to some IP layer for further processing. This will not
529 * be re-entered while running but other ldisc functions may be called
533 static void slcan_receive_buf(struct tty_struct *tty,
534 const unsigned char *cp, char *fp, int count)
536 struct slcan *sl = (struct slcan *) tty->disc_data;
537 struct net_device_stats *stats = sl->dev->get_stats(sl->dev);
539 if (!sl || sl->magic != SLCAN_MAGIC ||
540 !netif_running(sl->dev))
543 /* Read the characters out of the buffer */
546 if (!test_and_set_bit(SLF_ERROR, &sl->flags))
551 slcan_unesc(sl, *cp++);
555 /************************************
556 * slcan_open helper routines.
557 ************************************/
559 /* Collect hanged up channels */
561 static void slc_sync(void)
564 struct net_device *dev;
567 for (i = 0; i < maxdev; i++) {
572 sl = netdev_priv(dev);
573 if (sl->tty || sl->leased)
575 if (dev->flags&IFF_UP)
581 /* Find a free SLCAN channel, and link in this `tty' line. */
582 static struct slcan *slc_alloc(dev_t line)
587 struct net_device *dev = NULL;
590 if (slcan_devs == NULL)
591 return NULL; /* Master array missing ! */
593 for (i = 0; i < maxdev; i++) {
598 sl = netdev_priv(dev);
600 if (sl->line != line)
605 /* Clear ESCAPE & ERROR flags */
606 sl->flags &= (1 << SLF_INUSE);
613 if (current->pid == sl->pid) {
614 if (sl->line == line && score < 3) {
625 if (sl->line == line && score < 1) {
640 sl = netdev_priv(dev);
641 sl->flags &= (1 << SLF_INUSE);
646 /* Sorry, too many, all slots in use */
651 sl = netdev_priv(dev);
652 if (test_bit(SLF_INUSE, &sl->flags)) {
653 unregister_netdevice(dev);
654 free_netdev(dev); /* new in slcan.c */
656 slcan_devs[i] = NULL;
662 sprintf(name, "slc%d", i);
664 dev = alloc_netdev(sizeof(*sl), name, slc_setup);
670 sl = netdev_priv(dev);
672 /* Initialize channel control data */
673 sl->magic = SLCAN_MAGIC;
675 spin_lock_init(&sl->lock);
682 * Open the high-level part of the SLCAN channel.
683 * This function is called by the TTY module when the
684 * SLCAN line discipline is called for. Because we are
685 * sure the tty line exists, we only have to link it to
686 * a free SLCAN channel...
688 * Called in process context serialized from other ldisc calls.
691 static int slcan_open(struct tty_struct *tty)
696 if (!capable(CAP_NET_ADMIN))
699 /* RTnetlink lock is misused here to serialize concurrent
700 opens of slcan channels. There are better ways, but it is
705 /* Collect hanged up channels. */
708 sl = (struct slcan *) tty->disc_data;
711 /* First make sure we're not already connected. */
712 if (sl && sl->magic == SLCAN_MAGIC)
715 /* OK. Find a free SLCAN channel to use. */
717 sl = slc_alloc(tty_devnum(tty));
723 sl->line = tty_devnum(tty);
724 sl->pid = current->pid;
726 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16)
727 /* FIXME: already done before we were called - seems this can go */
728 if (tty->driver->flush_buffer)
729 tty->driver->flush_buffer(tty);
732 if (!test_bit(SLF_INUSE, &sl->flags)) {
733 /* Perform the low-level SLCAN initialization. */
737 set_bit(SLF_INUSE, &sl->flags);
739 err = register_netdevice(sl->dev);
744 /* Done. We have linked the TTY line to a channel. */
747 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
748 tty->receive_room = 65536; /* We don't flow control */
751 return sl->dev->base_addr;
755 tty->disc_data = NULL;
756 clear_bit(SLF_INUSE, &sl->flags);
761 /* Count references from TTY module */
767 FIXME: 1,2 are fixed 3 was never true anyway.
769 Let me to blame a bit.
770 1. TTY module calls this funstion on soft interrupt.
771 2. TTY module calls this function WITH MASKED INTERRUPTS!
772 3. TTY module does not notify us about line discipline
775 Seems, now it is clean. The solution is to consider netdevice and
776 line discipline sides as two independent threads.
778 By-product (not desired): slc? does not feel hangups and remains open.
779 It is supposed, that user level program (dip, diald, slattach...)
780 will catch SIGHUP and make the rest of work.
782 I see no way to make more with current tty code. --ANK
786 * Close down a SLCAN channel.
787 * This means flushing out any pending queues, and then returning. This
788 * call is serialized against other ldisc functions.
790 static void slcan_close(struct tty_struct *tty)
792 struct slcan *sl = (struct slcan *) tty->disc_data;
794 /* First make sure we're connected. */
795 if (!sl || sl->magic != SLCAN_MAGIC || sl->tty != tty)
798 tty->disc_data = NULL;
803 /* Count references from TTY module */
806 /* Perform I/O control on an active SLCAN channel. */
807 static int slcan_ioctl(struct tty_struct *tty, struct file *file,
808 unsigned int cmd, unsigned long arg)
810 struct slcan *sl = (struct slcan *) tty->disc_data;
813 /* First make sure we're connected. */
814 if (!sl || sl->magic != SLCAN_MAGIC)
819 tmp = strlen(sl->dev->name) + 1;
820 if (copy_to_user((void __user *)arg, sl->dev->name, tmp))
828 /* Allow stty to read, but not set, the serial port */
831 return n_tty_ioctl(tty, file, cmd, arg);
838 static struct tty_ldisc slc_ldisc = {
839 .owner = THIS_MODULE,
840 .magic = TTY_LDISC_MAGIC,
843 .close = slcan_close,
844 .ioctl = slcan_ioctl,
845 .receive_buf = slcan_receive_buf,
846 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16)
847 .receive_room = slcan_receive_room,
849 .write_wakeup = slcan_write_wakeup,
852 /************************************
853 * general slcan module init/exit
854 ************************************/
856 static int __init slcan_init(void)
861 maxdev = 4; /* Sanity */
864 printk(KERN_INFO "slcan: %d dynamic interface channels.\n", maxdev);
866 slcan_devs = kmalloc(sizeof(struct net_device *)*maxdev, GFP_KERNEL);
868 printk(KERN_ERR "slcan: can't allocate slcan device array!\n");
872 /* Clear the pointer array, we allocate devices when we need them */
873 memset(slcan_devs, 0, sizeof(struct net_device *)*maxdev);
875 /* Fill in our line protocol discipline, and register it */
876 status = tty_register_ldisc(N_SLCAN, &slc_ldisc);
878 printk(KERN_ERR "slcan: can't register line discipline\n");
884 static void __exit slcan_exit(void)
887 struct net_device *dev;
889 unsigned long timeout = jiffies + HZ;
892 if (slcan_devs == NULL)
895 /* First of all: check for active disciplines and hangup them.
899 msleep_interruptible(100);
902 for (i = 0; i < maxdev; i++) {
906 sl = netdev_priv(dev);
907 spin_lock_bh(&sl->lock);
912 spin_unlock_bh(&sl->lock);
914 } while (busy && time_before(jiffies, timeout));
917 for (i = 0; i < maxdev; i++) {
921 slcan_devs[i] = NULL;
923 sl = netdev_priv(dev);
925 printk(KERN_ERR "%s: tty discipline still running\n",
927 /* Intentionally leak the control block. */
928 dev->destructor = NULL;
931 unregister_netdev(dev);
937 i = tty_unregister_ldisc(N_SLCAN);
939 printk(KERN_ERR "slcan: can't unregister ldisc (err %d)\n", i);
942 module_init(slcan_init);
943 module_exit(slcan_exit);