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 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17)
62 #include <linux/uaccess.h>
64 #include <asm/uaccess.h>
66 #include <linux/bitops.h>
67 #include <linux/string.h>
69 #include <linux/interrupt.h>
71 #include <linux/tty.h>
72 #include <linux/errno.h>
73 #include <linux/netdevice.h>
74 #include <linux/etherdevice.h>
75 #include <linux/skbuff.h>
76 #include <linux/rtnetlink.h>
77 #include <linux/if_arp.h>
78 #include <linux/if_ether.h>
79 #include <linux/if_slip.h>
80 #include <linux/delay.h>
81 #include <linux/init.h>
83 #include <linux/can.h>
85 #include <linux/can/version.h> /* for RCSID. Removed by mkpatch script */
88 static __initdata const char banner[] =
89 KERN_INFO "slcan: serial line CAN interface driver\n";
91 MODULE_ALIAS_LDISC(N_SLCAN);
92 MODULE_DESCRIPTION("serial line CAN interface");
93 MODULE_LICENSE("Dual BSD/GPL");
94 MODULE_AUTHOR("Oliver Hartkopp <oliver.hartkopp@volkswagen.de>");
96 #ifdef CONFIG_CAN_DEBUG_DEVICES
98 module_param(debug, int, S_IRUGO);
99 #define DBG(args...) (debug & 1 ? \
100 (printk(KERN_DEBUG "slcan %s: ", __func__), \
107 #error Your kernel does not support tty line discipline N_SLCAN
110 * As there is currently no line discipline N_SLCAN in the mainstream kernel
111 * you will have to modify two kernel includes & recompile the kernel.
113 * Add this in include/asm/termios.h after the definition of N_HCI:
116 * Increment NR_LDICS in include/linux/tty.h from 16 to 17
118 * NEW: Since Kernel 2.6.21 you only have to change include/linux/tty.h
122 #define SLC_CHECK_TRANSMIT
123 #define SLCAN_MAGIC 0x53CA
125 static int maxdev = 10; /* MAX number of SLCAN channels;
126 This can be overridden with
127 insmod slcan.ko maxdev=nnn */
128 module_param(maxdev, int, 0);
129 MODULE_PARM_DESC(maxdev, "Maximum number of slcan interfaces");
131 /* maximum rx buffer len: extended CAN frame with timestamp */
132 #define SLC_MTU (sizeof("T1111222281122334455667788EA5F\r")+1)
137 /* Various fields. */
138 struct tty_struct *tty; /* ptr to TTY structure */
139 struct net_device *dev; /* easy for intr handling */
142 /* These are pointers to the malloc()ed frame buffers. */
143 unsigned char rbuff[SLC_MTU]; /* receiver buffer */
144 int rcount; /* received chars counter */
145 unsigned char xbuff[SLC_MTU]; /* transmitter buffer */
146 unsigned char *xhead; /* pointer to next XMIT byte */
147 int xleft; /* bytes left in XMIT queue */
149 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
150 /* SLCAN interface statistics. */
151 struct net_device_stats stats;
154 unsigned long flags; /* Flag values/ mode etc */
155 #define SLF_INUSE 0 /* Channel in use */
156 #define SLF_ERROR 1 /* Parity, etc. error */
158 unsigned char leased;
163 static struct net_device **slcan_devs;
166 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
167 /* Netdevice get statistics request */
168 static struct net_device_stats *slc_get_stats(struct net_device *dev)
170 struct slcan *sl = netdev_priv(dev);
176 /************************************************************************
177 * SLCAN ENCAPSULATION FORMAT *
178 ************************************************************************/
181 * A CAN frame has a can_id (11 bit standard frame format OR 29 bit extended
182 * frame format) a data length code (can_dlc) which can be from 0 to 8
183 * and up to <can_dlc> data bytes as payload.
184 * Additionally a CAN frame may become a remote transmission frame if the
185 * RTR-bit is set. This causes another ECU to send a CAN frame with the
188 * The SLCAN ASCII representation of these different frame types is:
189 * <type> <id> <dlc> <data>*
191 * Extended frames (29 bit) are defined by capital characters in the type.
192 * RTR frames are defined as 'r' types - normal frames have 't' type:
193 * t => 11 bit data frame
194 * r => 11 bit RTR frame
195 * T => 29 bit data frame
196 * R => 29 bit RTR frame
198 * The <id> is 3 (standard) or 8 (extended) bytes in ASCII Hex (base64).
199 * The <dlc> is a one byte ASCII number ('0' - '8')
200 * The <data> section has at much ASCII Hex bytes as defined by the <dlc>
204 * t1230 : can_id 0x123, can_dlc 0, no data
205 * t4563112233 : can_id 0x456, can_dlc 3, data 0x11 0x22 0x33
206 * T12ABCDEF2AA55 : extended can_id 0x12ABCDEF, can_dlc 2, data 0xAA 0x55
207 * r1230 : can_id 0x123, can_dlc 0, no data, remote transmission request
211 /************************************************************************
212 * STANDARD SLCAN DECAPSULATION *
213 ************************************************************************/
215 static int asc2nibble(char c)
218 if ((c >= '0') && (c <= '9'))
221 if ((c >= 'A') && (c <= 'F'))
224 if ((c >= 'a') && (c <= 'f'))
227 return 16; /* error */
230 /* Send one completely decapsulated can_frame to the network layer */
231 static void slc_bump(struct slcan *sl)
233 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
234 struct net_device_stats *stats = slc_get_stats(sl->dev);
236 struct net_device_stats *stats = &sl->dev->stats;
241 char cmd = sl->rbuff[0];
243 if ((cmd != 't') && (cmd != 'T') && (cmd != 'r') && (cmd != 'R'))
246 if (cmd & 0x20) /* tiny chars 'r' 't' => standard frame format */
247 dlc_pos = 4; /* dlc position tiiid */
249 dlc_pos = 9; /* dlc position Tiiiiiiiid */
251 if (!((sl->rbuff[dlc_pos] >= '0') && (sl->rbuff[dlc_pos] < '9')))
254 cf.can_dlc = sl->rbuff[dlc_pos] & 0x0F; /* get can_dlc */
256 sl->rbuff[dlc_pos] = 0; /* terminate can_id string */
258 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
259 cf.can_id = simple_strtoul(sl->rbuff+1, NULL, 16);
261 if (strict_strtoul(sl->rbuff+1, 16, (unsigned long *) &cf.can_id))
265 if (!(cmd & 0x20)) /* NO tiny chars => extended frame format */
266 cf.can_id |= CAN_EFF_FLAG;
268 if ((cmd | 0x20) == 'r') /* RTR frame */
269 cf.can_id |= CAN_RTR_FLAG;
271 *(u64 *) (&cf.data) = 0; /* clear payload */
273 for (i = 0, dlc_pos++; i < cf.can_dlc; i++) {
275 tmp = asc2nibble(sl->rbuff[dlc_pos++]);
278 cf.data[i] = (tmp << 4);
279 tmp = asc2nibble(sl->rbuff[dlc_pos++]);
286 skb = dev_alloc_skb(sizeof(struct can_frame));
291 skb->protocol = htons(ETH_P_CAN);
292 skb->pkt_type = PACKET_BROADCAST;
293 skb->ip_summed = CHECKSUM_UNNECESSARY;
294 memcpy(skb_put(skb, sizeof(struct can_frame)),
295 &cf, sizeof(struct can_frame));
298 sl->dev->last_rx = jiffies;
300 stats->rx_bytes += cf.can_dlc;
303 /* parse tty input stream */
304 static void slcan_unesc(struct slcan *sl, unsigned char s)
306 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
307 struct net_device_stats *stats = slc_get_stats(sl->dev);
309 struct net_device_stats *stats = &sl->dev->stats;
312 if ((s == '\r') || (s == '\a')) { /* CR or BEL ends the pdu */
313 if (!test_and_clear_bit(SLF_ERROR, &sl->flags) &&
319 if (!test_bit(SLF_ERROR, &sl->flags)) {
320 if (sl->rcount < SLC_MTU) {
321 sl->rbuff[sl->rcount++] = s;
324 stats->rx_over_errors++;
325 set_bit(SLF_ERROR, &sl->flags);
331 /************************************************************************
332 * STANDARD SLCAN ENCAPSULATION *
333 ************************************************************************/
335 /* Encapsulate one can_frame and stuff into a TTY queue. */
336 static void slc_encaps(struct slcan *sl, struct can_frame *cf)
338 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
339 struct net_device_stats *stats = slc_get_stats(sl->dev);
341 struct net_device_stats *stats = &sl->dev->stats;
346 if (cf->can_id & CAN_RTR_FLAG)
347 cmd = 'R'; /* becomes 'r' in standard frame format */
349 cmd = 'T'; /* becomes 't' in standard frame format */
351 if (cf->can_id & CAN_EFF_FLAG)
352 sprintf(sl->xbuff, "%c%08X%d", cmd,
353 cf->can_id & CAN_EFF_MASK, cf->can_dlc);
355 sprintf(sl->xbuff, "%c%03X%d", cmd | 0x20,
356 cf->can_id & CAN_SFF_MASK, cf->can_dlc);
358 idx = strlen(sl->xbuff);
360 for (i = 0; i < cf->can_dlc; i++)
361 sprintf(&sl->xbuff[idx + 2*i], "%02X", cf->data[i]);
363 DBG("ASCII frame = '%s'\n", sl->xbuff);
365 strcat(sl->xbuff, "\r"); /* add terminating character */
367 /* Order of next two lines is *very* important.
368 * When we are sending a little amount of data,
369 * the transfer may be completed inside driver.write()
370 * routine, because it's running with interrupts enabled.
371 * In this case we *never* got WRITE_WAKEUP event,
372 * if we did not request it before write operation.
373 * 14 Oct 1994 Dmitry Gorodchanin.
375 sl->tty->flags |= (1 << TTY_DO_WRITE_WAKEUP);
376 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
377 actual = sl->tty->driver->write(sl->tty, sl->xbuff, strlen(sl->xbuff));
379 actual = sl->tty->ops->write(sl->tty, sl->xbuff, strlen(sl->xbuff));
381 #ifdef SLC_CHECK_TRANSMIT
382 sl->dev->trans_start = jiffies;
384 sl->xleft = strlen(sl->xbuff) - actual;
385 sl->xhead = sl->xbuff + actual;
386 stats->tx_bytes += cf->can_dlc;
390 * Called by the driver when there's room for more data. If we have
391 * more packets to send, we send them here.
393 static void slcan_write_wakeup(struct tty_struct *tty)
396 struct slcan *sl = (struct slcan *) tty->disc_data;
397 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
398 struct net_device_stats *stats = slc_get_stats(sl->dev);
400 struct net_device_stats *stats = &sl->dev->stats;
403 /* First make sure we're connected. */
404 if (!sl || sl->magic != SLCAN_MAGIC || !netif_running(sl->dev))
407 if (sl->xleft <= 0) {
408 /* Now serial buffer is almost free & we can start
409 * transmission of another packet */
411 tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
412 netif_wake_queue(sl->dev);
416 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
417 actual = tty->driver->write(tty, sl->xhead, sl->xleft);
419 actual = tty->ops->write(tty, sl->xhead, sl->xleft);
425 static void slc_tx_timeout(struct net_device *dev)
427 struct slcan *sl = netdev_priv(dev);
429 spin_lock(&sl->lock);
431 if (netif_queue_stopped(dev)) {
432 if (!netif_running(dev))
435 /* May be we must check transmitter timeout here ?
436 * 14 Oct 1994 Dmitry Gorodchanin.
438 #ifdef SLC_CHECK_TRANSMIT
439 if (time_before(jiffies, dev->trans_start + 20 * HZ)) {
440 /* 20 sec timeout not reached */
443 printk(KERN_WARNING "%s: transmit timed out, %s?\n", dev->name,
444 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
445 (sl->tty->driver->chars_in_buffer(sl->tty) || sl->xleft)
447 (tty_chars_in_buffer(sl->tty) || sl->xleft)
449 ? "bad line quality" : "driver error");
451 sl->tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
452 netif_wake_queue(sl->dev);
456 spin_unlock(&sl->lock);
460 /******************************************
461 * Routines looking at netdevice side.
462 ******************************************/
464 /* Send a can_frame to a TTY queue. */
465 static int slc_xmit(struct sk_buff *skb, struct net_device *dev)
467 struct slcan *sl = netdev_priv(dev);
469 if (skb->len != sizeof(struct can_frame))
472 spin_lock(&sl->lock);
473 if (!netif_running(dev)) {
474 spin_unlock(&sl->lock);
475 printk(KERN_WARNING "%s: xmit: iface is down\n", dev->name);
479 if (sl->tty == NULL) {
480 spin_unlock(&sl->lock);
484 netif_stop_queue(sl->dev);
485 slc_encaps(sl, (struct can_frame *) skb->data); /* encaps & send */
486 spin_unlock(&sl->lock);
494 /* Netdevice UP -> DOWN routine */
495 static int slc_close(struct net_device *dev)
497 struct slcan *sl = netdev_priv(dev);
499 spin_lock_bh(&sl->lock);
501 /* TTY discipline is running. */
502 sl->tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
504 netif_stop_queue(dev);
507 spin_unlock_bh(&sl->lock);
512 /* Netdevice DOWN -> UP routine */
513 static int slc_open(struct net_device *dev)
515 struct slcan *sl = netdev_priv(dev);
520 sl->flags &= (1 << SLF_INUSE);
521 netif_start_queue(dev);
525 /* Netdevice register callback */
526 static void slc_setup(struct net_device *dev)
528 dev->open = slc_open;
529 dev->destructor = free_netdev;
530 dev->stop = slc_close;
531 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
532 dev->get_stats = slc_get_stats;
534 dev->hard_start_xmit = slc_xmit;
536 dev->hard_header_len = 0;
538 dev->tx_queue_len = 10;
540 dev->mtu = sizeof(struct can_frame);
541 dev->type = ARPHRD_CAN;
542 #ifdef SLC_CHECK_TRANSMIT
543 dev->tx_timeout = slc_tx_timeout;
544 dev->watchdog_timeo = 20*HZ;
547 /* New-style flags. */
548 dev->flags = IFF_NOARP;
549 dev->features = NETIF_F_NO_CSUM;
552 /******************************************
553 * Routines looking at TTY side.
554 ******************************************/
556 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16)
557 static int slcan_receive_room(struct tty_struct *tty)
559 return 65536; /* We can handle an infinite amount of data. :-) */
564 * Handle the 'receiver data ready' interrupt.
565 * This function is called by the 'tty_io' module in the kernel when
566 * a block of SLCAN data has been received, which can now be decapsulated
567 * and sent on to some IP layer for further processing. This will not
568 * be re-entered while running but other ldisc functions may be called
572 static void slcan_receive_buf(struct tty_struct *tty,
573 const unsigned char *cp, char *fp, int count)
575 struct slcan *sl = (struct slcan *) tty->disc_data;
576 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
577 struct net_device_stats *stats = slc_get_stats(sl->dev);
579 struct net_device_stats *stats = &sl->dev->stats;
582 if (!sl || sl->magic != SLCAN_MAGIC ||
583 !netif_running(sl->dev))
586 /* Read the characters out of the buffer */
589 if (!test_and_set_bit(SLF_ERROR, &sl->flags))
594 slcan_unesc(sl, *cp++);
598 /************************************
599 * slcan_open helper routines.
600 ************************************/
602 /* Collect hanged up channels */
604 static void slc_sync(void)
607 struct net_device *dev;
610 for (i = 0; i < maxdev; i++) {
615 sl = netdev_priv(dev);
616 if (sl->tty || sl->leased)
618 if (dev->flags&IFF_UP)
624 /* Find a free SLCAN channel, and link in this `tty' line. */
625 static struct slcan *slc_alloc(dev_t line)
630 struct net_device *dev = NULL;
633 if (slcan_devs == NULL)
634 return NULL; /* Master array missing ! */
636 for (i = 0; i < maxdev; i++) {
641 sl = netdev_priv(dev);
643 if (sl->line != line)
648 /* Clear ESCAPE & ERROR flags */
649 sl->flags &= (1 << SLF_INUSE);
656 if (current->pid == sl->pid) {
657 if (sl->line == line && score < 3) {
668 if (sl->line == line && score < 1) {
683 sl = netdev_priv(dev);
684 sl->flags &= (1 << SLF_INUSE);
689 /* Sorry, too many, all slots in use */
694 sl = netdev_priv(dev);
695 if (test_bit(SLF_INUSE, &sl->flags)) {
696 unregister_netdevice(dev);
697 free_netdev(dev); /* new in slcan.c */
699 slcan_devs[i] = NULL;
705 sprintf(name, "slc%d", i);
707 dev = alloc_netdev(sizeof(*sl), name, slc_setup);
713 sl = netdev_priv(dev);
715 /* Initialize channel control data */
716 sl->magic = SLCAN_MAGIC;
718 spin_lock_init(&sl->lock);
725 * Open the high-level part of the SLCAN channel.
726 * This function is called by the TTY module when the
727 * SLCAN line discipline is called for. Because we are
728 * sure the tty line exists, we only have to link it to
729 * a free SLCAN channel...
731 * Called in process context serialized from other ldisc calls.
734 static int slcan_open(struct tty_struct *tty)
739 if (!capable(CAP_NET_ADMIN))
742 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)
743 if (tty->ops->write == NULL)
747 /* RTnetlink lock is misused here to serialize concurrent
748 opens of slcan channels. There are better ways, but it is
753 /* Collect hanged up channels. */
756 sl = (struct slcan *) tty->disc_data;
759 /* First make sure we're not already connected. */
760 if (sl && sl->magic == SLCAN_MAGIC)
763 /* OK. Find a free SLCAN channel to use. */
765 sl = slc_alloc(tty_devnum(tty));
771 sl->line = tty_devnum(tty);
772 sl->pid = current->pid;
774 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16)
775 /* FIXME: already done before we were called - seems this can go */
776 if (tty->driver->flush_buffer)
777 tty->driver->flush_buffer(tty);
780 if (!test_bit(SLF_INUSE, &sl->flags)) {
781 /* Perform the low-level SLCAN initialization. */
785 set_bit(SLF_INUSE, &sl->flags);
787 err = register_netdevice(sl->dev);
792 /* Done. We have linked the TTY line to a channel. */
795 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
796 tty->receive_room = 65536; /* We don't flow control */
799 return sl->dev->base_addr;
803 tty->disc_data = NULL;
804 clear_bit(SLF_INUSE, &sl->flags);
809 /* Count references from TTY module */
815 FIXME: 1,2 are fixed 3 was never true anyway.
817 Let me to blame a bit.
818 1. TTY module calls this funstion on soft interrupt.
819 2. TTY module calls this function WITH MASKED INTERRUPTS!
820 3. TTY module does not notify us about line discipline
823 Seems, now it is clean. The solution is to consider netdevice and
824 line discipline sides as two independent threads.
826 By-product (not desired): slc? does not feel hangups and remains open.
827 It is supposed, that user level program (dip, diald, slattach...)
828 will catch SIGHUP and make the rest of work.
830 I see no way to make more with current tty code. --ANK
834 * Close down a SLCAN channel.
835 * This means flushing out any pending queues, and then returning. This
836 * call is serialized against other ldisc functions.
838 static void slcan_close(struct tty_struct *tty)
840 struct slcan *sl = (struct slcan *) tty->disc_data;
842 /* First make sure we're connected. */
843 if (!sl || sl->magic != SLCAN_MAGIC || sl->tty != tty)
846 tty->disc_data = NULL;
851 /* Count references from TTY module */
854 /* Perform I/O control on an active SLCAN channel. */
855 static int slcan_ioctl(struct tty_struct *tty, struct file *file,
856 unsigned int cmd, unsigned long arg)
858 struct slcan *sl = (struct slcan *) tty->disc_data;
861 /* First make sure we're connected. */
862 if (!sl || sl->magic != SLCAN_MAGIC)
867 tmp = strlen(sl->dev->name) + 1;
868 if (copy_to_user((void __user *)arg, sl->dev->name, tmp))
875 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
876 /* Allow stty to read, but not set, the serial port */
879 return n_tty_ioctl(tty, file, cmd, arg);
885 return tty_mode_ioctl(tty, file, cmd, arg);
890 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
891 static struct tty_ldisc slc_ldisc = {
893 static struct tty_ldisc_ops slc_ldisc = {
895 .owner = THIS_MODULE,
896 .magic = TTY_LDISC_MAGIC,
899 .close = slcan_close,
900 .ioctl = slcan_ioctl,
901 .receive_buf = slcan_receive_buf,
902 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16)
903 .receive_room = slcan_receive_room,
905 .write_wakeup = slcan_write_wakeup,
908 /************************************
909 * general slcan module init/exit
910 ************************************/
912 static int __init slcan_init(void)
917 maxdev = 4; /* Sanity */
920 printk(KERN_INFO "slcan: %d dynamic interface channels.\n", maxdev);
922 slcan_devs = kmalloc(sizeof(struct net_device *)*maxdev, GFP_KERNEL);
924 printk(KERN_ERR "slcan: can't allocate slcan device array!\n");
928 /* Clear the pointer array, we allocate devices when we need them */
929 memset(slcan_devs, 0, sizeof(struct net_device *)*maxdev);
931 /* Fill in our line protocol discipline, and register it */
932 status = tty_register_ldisc(N_SLCAN, &slc_ldisc);
934 printk(KERN_ERR "slcan: can't register line discipline\n");
940 static void __exit slcan_exit(void)
943 struct net_device *dev;
945 unsigned long timeout = jiffies + HZ;
948 if (slcan_devs == NULL)
951 /* First of all: check for active disciplines and hangup them.
955 msleep_interruptible(100);
958 for (i = 0; i < maxdev; i++) {
962 sl = netdev_priv(dev);
963 spin_lock_bh(&sl->lock);
968 spin_unlock_bh(&sl->lock);
970 } while (busy && time_before(jiffies, timeout));
973 for (i = 0; i < maxdev; i++) {
977 slcan_devs[i] = NULL;
979 sl = netdev_priv(dev);
981 printk(KERN_ERR "%s: tty discipline still running\n",
983 /* Intentionally leak the control block. */
984 dev->destructor = NULL;
987 unregister_netdev(dev);
993 i = tty_unregister_ldisc(N_SLCAN);
995 printk(KERN_ERR "slcan: can't unregister ldisc (err %d)\n", i);
998 module_init(slcan_init);
999 module_exit(slcan_exit);