2 * sllin.c - serial line LIN interface driver (using tty line discipline)
4 * This file is derived from drivers/net/can/slcan.c
5 * slcan.c Author: Oliver Hartkopp <socketcan@hartkopp.net>
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307. You can also get it
20 * at http://www.gnu.org/licenses/gpl.html
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
35 * Idea: Oliver Hartkopp <oliver.hartkopp@volkswagen.de>
36 * Copyright: (c) 2011 Czech Technical University in Prague
37 * (c) 2011 Volkswagen Group Research
38 * Authors: Pavel Pisa <pisa@cmp.felk.cvut.cz>
39 * Rostislav Lisovy <lisovy@kormus.cz>
40 * Michal Sojka <sojkam1@fel.cvut.cz>
41 * Funded by: Volkswagen Group Research
44 #define DEBUG 1 /* Enables pr_debug() printouts */
46 #include <linux/module.h>
47 #include <linux/moduleparam.h>
49 #include <linux/uaccess.h>
50 #include <linux/bitops.h>
51 #include <linux/string.h>
52 #include <linux/tty.h>
53 #include <linux/errno.h>
54 #include <linux/netdevice.h>
55 #include <linux/skbuff.h>
56 #include <linux/rtnetlink.h>
57 #include <linux/if_arp.h>
58 #include <linux/if_ether.h>
59 #include <linux/sched.h>
60 #include <linux/delay.h>
61 #include <linux/init.h>
62 #include <linux/can.h>
63 #include <linux/kthread.h>
64 #include <linux/hrtimer.h>
65 #include <linux/version.h>
66 #include "linux/lin_bus.h"
68 /* Should be in include/linux/tty.h */
70 /* -------------------------------- */
72 static __initdata const char banner[] =
73 KERN_INFO "sllin: serial line LIN interface driver\n";
75 MODULE_ALIAS_LDISC(N_SLLIN);
76 MODULE_DESCRIPTION("serial line LIN interface");
77 MODULE_LICENSE("GPL");
78 MODULE_AUTHOR("Pavel Pisa <pisa@cmp.felk.cvut.cz>");
80 #define SLLIN_MAGIC 0x53CA
81 /* #define BREAK_BY_BAUD */
83 static bool master = true;
84 static int baudrate; /* Use LIN_DEFAULT_BAUDRATE when not set */
86 module_param(master, bool, 0);
87 MODULE_PARM_DESC(master, "LIN interface is Master device");
88 module_param(baudrate, int, 0);
89 MODULE_PARM_DESC(baudrate, "Baudrate of LIN interface");
91 static int maxdev = 10; /* MAX number of SLLIN channels;
92 This can be overridden with
93 insmod sllin.ko maxdev=nnn */
94 module_param(maxdev, int, 0);
95 MODULE_PARM_DESC(maxdev, "Maximum number of sllin interfaces");
97 /* maximum buffer len to store whole LIN message*/
98 #define SLLIN_DATA_MAX 8
99 #define SLLIN_BUFF_LEN (1 /*break*/ + 1 /*sync*/ + 1 /*ID*/ + \
100 SLLIN_DATA_MAX + 1 /*checksum*/)
101 #define SLLIN_BUFF_BREAK 0
102 #define SLLIN_BUFF_SYNC 1
103 #define SLLIN_BUFF_ID 2
104 #define SLLIN_BUFF_DATA 3
106 #define SLLIN_SAMPLES_PER_CHAR 10
107 #define SLLIN_CHARS_TO_TIMEOUT 24
113 SLSTATE_RESPONSE_WAIT, /* Wait for response */
114 SLSTATE_RESPONSE_WAIT_BUS, /* Wait for response from LIN bus
115 only (CAN frames from network stack
116 are not processed in this moment) */
118 SLSTATE_RESPONSE_SENT,
121 struct sllin_conf_entry {
122 int dlc; /* Length of data in LIN frame */
123 canid_t frame_fl; /* LIN frame flags. Passed from userspace as
125 u8 data[8]; /* LIN frame data payload */
131 /* Various fields. */
132 struct tty_struct *tty; /* ptr to TTY structure */
133 struct net_device *dev; /* easy for intr handling */
136 /* LIN message buffer and actual processed data counts */
137 unsigned char rx_buff[SLLIN_BUFF_LEN]; /* LIN Rx buffer */
138 unsigned char tx_buff[SLLIN_BUFF_LEN]; /* LIN Tx buffer */
139 int rx_expect; /* expected number of Rx chars */
140 int rx_lim; /* maximum Rx chars for current frame */
141 int rx_cnt; /* message buffer Rx fill level */
142 int tx_lim; /* actual limit of bytes to Tx */
143 int tx_cnt; /* number of already Tx bytes */
144 char lin_master; /* node is a master node */
145 int lin_baud; /* LIN baudrate */
146 int lin_state; /* state */
147 char id_to_send; /* there is ID to be sent */
148 char data_to_send; /* there are data to be sent */
149 char resp_len_known; /* Length of the response is known */
150 char header_received;/* In Slave mode, set when header was already
152 char rx_len_unknown; /* We are not sure how much data will be sent to us --
153 we just guess the length */
155 unsigned long flags; /* Flag values/ mode etc */
156 #define SLF_INUSE 0 /* Channel in use */
157 #define SLF_ERROR 1 /* Parity, etc. error */
158 #define SLF_RXEVENT 2 /* Rx wake event */
159 #define SLF_TXEVENT 3 /* Tx wake event */
160 #define SLF_MSGEVENT 4 /* CAN message to sent */
161 #define SLF_TMOUTEVENT 5 /* Timeout on received data */
162 #define SLF_TXBUFF_RQ 6 /* Req. to send buffer to UART*/
163 #define SLF_TXBUFF_INPR 7 /* Above request in progress */
166 struct task_struct *kwthread;
167 wait_queue_head_t kwt_wq; /* Wait queue used by kwthread */
168 struct hrtimer rx_timer; /* RX timeout timer */
169 ktime_t rx_timer_timeout; /* RX timeout timer value */
170 struct sk_buff *tx_req_skb; /* Socket buffer with CAN frame
171 received from network stack*/
173 /* List with configurations for each of 0 to LIN_ID_MAX LIN IDs */
174 struct sllin_conf_entry linfr_cache[LIN_ID_MAX + 1];
175 spinlock_t linfr_lock; /* frame cache and buffers lock */
178 static struct net_device **sllin_devs;
179 static int sllin_configure_frame_cache(struct sllin *sl, struct can_frame *cf);
180 static void sllin_slave_receive_buf(struct tty_struct *tty,
181 const unsigned char *cp, char *fp, int count);
182 static void sllin_master_receive_buf(struct tty_struct *tty,
183 const unsigned char *cp, char *fp, int count);
186 /* Values of two parity bits in LIN Protected
187 Identifier for each particular LIN ID */
188 const unsigned char sllin_id_parity_table[] = {
189 0x80, 0xc0, 0x40, 0x00, 0xc0, 0x80, 0x00, 0x40,
190 0x00, 0x40, 0xc0, 0x80, 0x40, 0x00, 0x80, 0xc0,
191 0x40, 0x00, 0x80, 0xc0, 0x00, 0x40, 0xc0, 0x80,
192 0xc0, 0x80, 0x00, 0x40, 0x80, 0xc0, 0x40, 0x00,
193 0x00, 0x40, 0xc0, 0x80, 0x40, 0x00, 0x80, 0xc0,
194 0x80, 0xc0, 0x40, 0x00, 0xc0, 0x80, 0x00, 0x40,
195 0xc0, 0x80, 0x00, 0x40, 0x80, 0xc0, 0x40, 0x00,
196 0x40, 0x00, 0x80, 0xc0, 0x00, 0x40, 0xc0, 0x80
200 * sltty_change_speed() -- Change baudrate of Serial device belonging
203 * @tty: Pointer to TTY to change speed for.
204 * @speed: Integer value of new speed. It is possible to
205 * assign non-standard values, i.e. those which
206 * are not defined in termbits.h.
208 static int sltty_change_speed(struct tty_struct *tty, unsigned speed)
210 struct ktermios old_termios, termios;
213 mutex_lock(&tty->termios_mutex);
215 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 7, 0)
216 old_termios = termios = *(tty->termios);
218 old_termios = termios = tty->termios;
221 cflag = CS8 | CREAD | CLOCAL | HUPCL;
222 cflag &= ~(CBAUD | CIBAUD);
224 termios.c_cflag = cflag;
228 /* Enable interrupt when UART-Break or Framing error received */
229 termios.c_iflag = BRKINT | INPCK;
230 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 7, 0)
231 *(tty->termios) = termios;
233 tty->termios = termios;
236 tty_encode_baud_rate(tty, speed, speed);
238 if (tty->ops->set_termios)
239 tty->ops->set_termios(tty, &old_termios);
241 mutex_unlock(&tty->termios_mutex);
246 /* Send one can_frame to the network layer */
247 static void sllin_send_canfr(struct sllin *sl, canid_t id, char *data, int len)
255 memcpy(&cf.data, data, cf.can_dlc);
257 skb = dev_alloc_skb(sizeof(struct can_frame));
262 skb->protocol = htons(ETH_P_CAN);
263 skb->pkt_type = PACKET_BROADCAST;
264 skb->ip_summed = CHECKSUM_UNNECESSARY;
265 memcpy(skb_put(skb, sizeof(struct can_frame)),
266 &cf, sizeof(struct can_frame));
269 sl->dev->stats.rx_packets++;
270 sl->dev->stats.rx_bytes += cf.can_dlc;
274 * sll_bump() -- Send data of received LIN frame (existing in sl->rx_buff)
279 static void sll_bump(struct sllin *sl)
281 int len = sl->rx_cnt - SLLIN_BUFF_DATA - 1; /* without checksum */
282 len = (len < 0) ? 0 : len;
284 sllin_send_canfr(sl, sl->rx_buff[SLLIN_BUFF_ID] & LIN_ID_MASK,
285 sl->rx_buff + SLLIN_BUFF_DATA, len);
288 static void sll_send_rtr(struct sllin *sl)
290 sllin_send_canfr(sl, (sl->rx_buff[SLLIN_BUFF_ID] & LIN_ID_MASK) |
291 CAN_RTR_FLAG, NULL, 0);
295 * Called by the driver when there's room for more data. If we have
296 * more packets to send, we send them here.
298 static void sllin_write_wakeup(struct tty_struct *tty)
302 struct sllin *sl = (struct sllin *) tty->disc_data;
304 /* First make sure we're connected. */
305 if (!sl || sl->magic != SLLIN_MAGIC || !netif_running(sl->dev))
308 set_bit(SLF_TXBUFF_RQ, &sl->flags);
310 if (unlikely(test_and_set_bit(SLF_TXBUFF_INPR, &sl->flags)))
311 return; /* ongoing concurrent processing */
313 clear_bit(SLF_TXBUFF_RQ, &sl->flags);
314 smp_mb__after_clear_bit();
316 if (sl->lin_state != SLSTATE_BREAK_SENT)
317 remains = sl->tx_lim - sl->tx_cnt;
319 remains = SLLIN_BUFF_BREAK + 1 - sl->tx_cnt;
322 actual = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt,
323 sl->tx_cnt - sl->tx_lim);
324 sl->tx_cnt += actual;
327 clear_bit(SLF_TXBUFF_INPR, &sl->flags);
328 smp_mb__after_clear_bit();
330 } while (unlikely(test_bit(SLF_TXBUFF_RQ, &sl->flags)));
332 if ((remains > 0) && (actual >= 0)) {
333 netdev_dbg(sl->dev, "sllin_write_wakeup sent %d, remains %d, waiting\n",
334 sl->tx_cnt, sl->tx_lim - sl->tx_cnt);
338 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
339 set_bit(SLF_TXEVENT, &sl->flags);
340 wake_up(&sl->kwt_wq);
342 netdev_dbg(sl->dev, "sllin_write_wakeup sent %d, wakeup\n", sl->tx_cnt);
346 * sll_xmit() -- Send a can_frame to a TTY queue.
348 * @skb: Pointer to Socket buffer to be sent.
349 * @dev: Network device where @skb will be sent.
351 static netdev_tx_t sll_xmit(struct sk_buff *skb, struct net_device *dev)
353 struct sllin *sl = netdev_priv(dev);
354 struct can_frame *cf;
356 if (skb->len != sizeof(struct can_frame))
359 spin_lock(&sl->lock);
360 if (!netif_running(dev)) {
361 netdev_warn(sl->dev, "xmit: iface is down\n");
364 if (sl->tty == NULL) {
365 netdev_warn(sl->dev, "xmit: no tty device connected\n");
369 cf = (struct can_frame *) skb->data;
370 if (cf->can_id & LIN_CTRL_FRAME) {
371 sllin_configure_frame_cache(sl, cf);
372 goto free_out_unlock;
375 netif_stop_queue(sl->dev);
377 sl->tx_req_skb = skb;
378 set_bit(SLF_MSGEVENT, &sl->flags);
379 wake_up(&sl->kwt_wq);
380 spin_unlock(&sl->lock);
385 spin_unlock(&sl->lock);
392 /******************************************
393 * Routines looking at netdevice side.
394 ******************************************/
396 /* Netdevice UP -> DOWN routine */
397 static int sll_close(struct net_device *dev)
399 struct sllin *sl = netdev_priv(dev);
401 spin_lock_bh(&sl->lock);
403 /* TTY discipline is running. */
404 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
406 netif_stop_queue(dev);
409 spin_unlock_bh(&sl->lock);
414 /* Netdevice DOWN -> UP routine */
415 static int sll_open(struct net_device *dev)
417 struct sllin *sl = netdev_priv(dev);
419 netdev_dbg(sl->dev, "%s() invoked\n", __func__);
424 sl->flags &= (1 << SLF_INUSE);
425 netif_start_queue(dev);
429 /* Hook the destructor so we can free sllin devs at the right point in time */
430 static void sll_free_netdev(struct net_device *dev)
432 int i = dev->base_addr;
434 sllin_devs[i] = NULL;
437 static const struct net_device_ops sll_netdev_ops = {
438 .ndo_open = sll_open,
439 .ndo_stop = sll_close,
440 .ndo_start_xmit = sll_xmit,
443 static void sll_setup(struct net_device *dev)
445 dev->netdev_ops = &sll_netdev_ops;
446 dev->destructor = sll_free_netdev;
448 dev->hard_header_len = 0;
450 dev->tx_queue_len = 10;
452 dev->mtu = sizeof(struct can_frame);
453 dev->type = ARPHRD_CAN;
455 /* New-style flags. */
456 dev->flags = IFF_NOARP;
457 dev->features = NETIF_F_HW_CSUM; /* NETIF_F_NO_CSUM;*/
460 /******************************************
461 Routines looking at TTY side.
462 ******************************************/
463 static void sllin_master_receive_buf(struct tty_struct *tty,
464 const unsigned char *cp, char *fp, int count)
466 struct sllin *sl = (struct sllin *) tty->disc_data;
468 /* Read the characters out of the buffer */
471 netdev_dbg(sl->dev, "sllin_master_receive_buf char 0x%02x ignored "
472 "due marker 0x%02x, flags 0x%lx\n",
473 *cp, *(fp-1), sl->flags);
475 /* i.e. Real error -- not Break */
476 if (sl->rx_cnt > SLLIN_BUFF_BREAK) {
477 set_bit(SLF_ERROR, &sl->flags);
478 wake_up(&sl->kwt_wq);
483 #ifndef BREAK_BY_BAUD
484 /* We didn't receive Break character -- fake it! */
485 if ((sl->rx_cnt == SLLIN_BUFF_BREAK) && (*cp == 0x55)) {
486 netdev_dbg(sl->dev, "LIN_RX[%d]: 0x00\n", sl->rx_cnt);
487 sl->rx_buff[sl->rx_cnt++] = 0x00;
489 #endif /* BREAK_BY_BAUD */
491 if (sl->rx_cnt < SLLIN_BUFF_LEN) {
492 netdev_dbg(sl->dev, "LIN_RX[%d]: 0x%02x\n", sl->rx_cnt, *cp);
493 sl->rx_buff[sl->rx_cnt++] = *cp++;
498 if (sl->rx_cnt >= sl->rx_expect) {
499 set_bit(SLF_RXEVENT, &sl->flags);
500 wake_up(&sl->kwt_wq);
501 netdev_dbg(sl->dev, "sllin_receive_buf count %d, wakeup\n", sl->rx_cnt);
503 netdev_dbg(sl->dev, "sllin_receive_buf count %d, waiting\n", sl->rx_cnt);
508 /*****************************************
509 * sllin message helper routines
510 *****************************************/
512 * sllin_report_error() -- Report an error by sending CAN frame
513 * with particular error flag set in can_id
516 * @err: Error flag to be sent.
518 static void sllin_report_error(struct sllin *sl, int err)
520 unsigned char *lin_buff;
524 case LIN_ERR_CHECKSUM:
525 sl->dev->stats.rx_crc_errors++;
528 case LIN_ERR_RX_TIMEOUT:
529 sl->dev->stats.rx_errors++;
532 case LIN_ERR_FRAMING:
533 sl->dev->stats.rx_frame_errors++;
537 lin_buff = (sl->lin_master) ? sl->tx_buff : sl->rx_buff;
538 lin_id = lin_buff[SLLIN_BUFF_ID] & LIN_ID_MASK;
539 sllin_send_canfr(sl, lin_id | CAN_EFF_FLAG |
540 (err & ~LIN_ID_MASK), NULL, 0);
544 * sllin_configure_frame_cache() -- Configure particular entry in linfr_cache
547 * @cf: Pointer to CAN frame sent to this driver
548 * holding configuration information
550 static int sllin_configure_frame_cache(struct sllin *sl, struct can_frame *cf)
553 struct sllin_conf_entry *sce;
555 if (!(cf->can_id & LIN_CTRL_FRAME))
558 sce = &sl->linfr_cache[cf->can_id & LIN_ID_MASK];
559 netdev_dbg(sl->dev, "Setting frame cache with EFF CAN frame. LIN ID = %d\n",
560 cf->can_id & LIN_ID_MASK);
562 spin_lock_irqsave(&sl->linfr_lock, flags);
564 sce->dlc = cf->can_dlc;
565 if (sce->dlc > SLLIN_DATA_MAX)
566 sce->dlc = SLLIN_DATA_MAX;
568 sce->frame_fl = (cf->can_id & ~LIN_ID_MASK) & CAN_EFF_MASK;
569 memcpy(sce->data, cf->data, cf->can_dlc);
571 spin_unlock_irqrestore(&sl->linfr_lock, flags);
577 * sllin_checksum() -- Count checksum for particular data
579 * @data: Pointer to the buffer containing whole LIN
580 * frame (i.e. including break and sync bytes).
581 * @length: Length of the buffer.
582 * @enhanced_fl: Flag determining whether Enhanced or Classic
583 * checksum should be counted.
585 static inline unsigned sllin_checksum(unsigned char *data, int length, int enhanced_fl)
595 for (; i < length; i++) {
604 #define SLLIN_STPMSG_RESPONLY (1) /* Message will be LIN Response only */
605 #define SLLIN_STPMSG_CHCKSUM_CLS (1 << 1)
606 #define SLLIN_STPMSG_CHCKSUM_ENH (1 << 2)
608 static int sllin_setup_msg(struct sllin *sl, int mode, int id,
609 unsigned char *data, int len)
611 if (id > LIN_ID_MASK)
614 if (!(mode & SLLIN_STPMSG_RESPONLY)) {
618 sl->rx_lim = SLLIN_BUFF_LEN;
621 sl->tx_buff[SLLIN_BUFF_BREAK] = 0;
622 sl->tx_buff[SLLIN_BUFF_SYNC] = 0x55;
623 sl->tx_buff[SLLIN_BUFF_ID] = id | sllin_id_parity_table[id];
624 sl->tx_lim = SLLIN_BUFF_DATA;
626 if ((data != NULL) && len) {
628 memcpy(sl->tx_buff + SLLIN_BUFF_DATA, data, len);
629 sl->tx_buff[sl->tx_lim] = sllin_checksum(sl->tx_buff,
630 sl->tx_lim, mode & SLLIN_STPMSG_CHCKSUM_ENH);
634 sl->rx_lim = SLLIN_BUFF_DATA + len + 1;
639 static void sllin_reset_buffs(struct sllin *sl)
643 sl->rx_lim = sl->lin_master ? 0 : SLLIN_BUFF_LEN;
646 sl->id_to_send = false;
647 sl->data_to_send = false;
651 * sllin_rx_validate() -- Validate received frame, i,e. check checksum
655 static int sllin_rx_validate(struct sllin *sl)
661 unsigned char rec_chcksm = sl->rx_buff[sl->rx_cnt - 1];
662 struct sllin_conf_entry *sce;
664 actual_id = sl->rx_buff[SLLIN_BUFF_ID] & LIN_ID_MASK;
665 sce = &sl->linfr_cache[actual_id];
667 spin_lock_irqsave(&sl->linfr_lock, flags);
669 ext_chcks_fl = sce->frame_fl & LIN_CHECKSUM_EXTENDED;
670 spin_unlock_irqrestore(&sl->linfr_lock, flags);
672 if (sllin_checksum(sl->rx_buff, sl->rx_cnt - 1, ext_chcks_fl) !=
675 /* Type of checksum is configured for particular frame */
679 if (sllin_checksum(sl->rx_buff, sl->rx_cnt - 1,
680 !ext_chcks_fl) != rec_chcksm) {
689 static void sllin_slave_finish_rx_msg(struct sllin *sl)
691 if (sllin_rx_validate(sl) == -1) {
692 netdev_dbg(sl->dev, "sllin: RX validation failed.\n");
693 sllin_report_error(sl, LIN_ERR_CHECKSUM);
695 /* Send CAN non-RTR frame with data */
696 netdev_dbg(sl->dev, "sllin: sending NON-RTR CAN frame with LIN payload.");
697 sll_bump(sl); /* send packet to the network layer */
699 /* Prepare for reception of new header */
701 sl->rx_expect = SLLIN_BUFF_ID + 1;
702 sl->rx_len_unknown = false; /* We do know exact length of the header */
703 sl->header_received = false;
706 static void sllin_slave_receive_buf(struct tty_struct *tty,
707 const unsigned char *cp, char *fp, int count)
709 struct sllin *sl = (struct sllin *) tty->disc_data;
711 struct sllin_conf_entry *sce;
714 /* Read the characters out of the buffer */
718 * If we don't know the length of the current message
719 * and received at least the LIN ID, we received here
720 * the break of the next message.
721 * Evaluate the previous one before continuing.
723 if ((sl->rx_len_unknown == true) &&
724 (sl->rx_cnt >= SLLIN_BUFF_ID))
726 hrtimer_cancel(&sl->rx_timer);
727 sllin_slave_finish_rx_msg(sl);
729 set_bit(SLF_RXEVENT, &sl->flags);
730 wake_up(&sl->kwt_wq);
733 netdev_dbg(sl->dev, "sllin_slave_receive_buf char 0x%02x ignored "
734 "due marker 0x%02x, flags 0x%lx\n",
735 *cp, *(fp-1), sl->flags);
739 sl->rx_expect = SLLIN_BUFF_ID + 1;
740 sl->rx_len_unknown = false; /* We do know exact length of the header */
741 sl->header_received = false;
744 if (sl->rx_cnt < SLLIN_BUFF_LEN) {
745 netdev_dbg(sl->dev, "LIN_RX[%d]: 0x%02x\n", sl->rx_cnt, *cp);
747 /* We did not receive break (0x00) character */
748 if ((sl->rx_cnt == SLLIN_BUFF_BREAK) && (*cp == 0x55)) {
749 sl->rx_buff[sl->rx_cnt++] = 0x00;
752 if (sl->rx_cnt == SLLIN_BUFF_SYNC) {
753 /* 'Duplicated' break character -- ignore */
759 /* Wrong sync character */
764 sl->rx_buff[sl->rx_cnt++] = *cp++;
767 /* Header received */
768 if ((sl->header_received == false) && (sl->rx_cnt >= (SLLIN_BUFF_ID + 1))) {
771 lin_id = sl->rx_buff[SLLIN_BUFF_ID] & LIN_ID_MASK;
772 sce = &sl->linfr_cache[lin_id];
774 spin_lock_irqsave(&sl->linfr_lock, flags);
776 sl->lin_state = SLSTATE_ID_RECEIVED;
777 /* Is the length of data set in frame cache? */
779 sl->rx_expect += sce->dlc + 1; /* + checksum */
780 sl->rx_len_unknown = false;
781 wake_up(&sl->kwt_wq);
783 sl->rx_expect += SLLIN_DATA_MAX + 1; /* + checksum */
784 sl->rx_len_unknown = true;
786 spin_unlock_irqrestore(&sl->linfr_lock, flags);
788 sl->header_received = true;
790 hrtimer_start(&sl->rx_timer,
791 ktime_add(ktime_get(), sl->rx_timer_timeout),
797 /* Response received */
798 if ((sl->header_received == true) &&
799 ((sl->rx_cnt >= sl->rx_expect))) {
801 hrtimer_cancel(&sl->rx_timer);
802 netdev_dbg(sl->dev, "Received LIN header & LIN response. "
803 "rx_cnt = %u, rx_expect = %u\n", sl->rx_cnt,
805 sllin_slave_finish_rx_msg(sl);
807 set_bit(SLF_RXEVENT, &sl->flags);
808 wake_up(&sl->kwt_wq);
813 static void sllin_receive_buf(struct tty_struct *tty,
814 const unsigned char *cp, char *fp, int count)
816 struct sllin *sl = (struct sllin *) tty->disc_data;
817 netdev_dbg(sl->dev, "sllin_receive_buf invoked, count = %u\n", count);
819 if (!sl || sl->magic != SLLIN_MAGIC || !netif_running(sl->dev))
823 sllin_master_receive_buf(tty, cp, fp, count);
825 sllin_slave_receive_buf(tty, cp, fp, count);
829 static int sllin_send_tx_buff(struct sllin *sl)
831 struct tty_struct *tty = sl->tty;
835 set_bit(SLF_TXBUFF_RQ, &sl->flags);
837 if (unlikely(test_and_set_bit(SLF_TXBUFF_INPR, &sl->flags)))
838 return 0; /* ongoing concurrent processing */
840 clear_bit(SLF_TXBUFF_RQ, &sl->flags);
841 smp_mb__after_clear_bit();
844 if (sl->lin_state != SLSTATE_BREAK_SENT)
845 remains = sl->tx_lim - sl->tx_cnt;
849 remains = sl->tx_lim - sl->tx_cnt;
852 res = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt, remains);
860 set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
861 res = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt, remains);
863 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
871 netdev_dbg(sl->dev, "sllin_send_tx_buff sent %d, remains %d\n",
872 sl->tx_cnt, remains);
874 clear_bit(SLF_TXBUFF_INPR, &sl->flags);
875 smp_mb__after_clear_bit();
877 } while (unlikely(test_bit(SLF_TXBUFF_RQ, &sl->flags)));
882 clear_bit(SLF_TXBUFF_INPR, &sl->flags);
888 static int sllin_send_break(struct sllin *sl)
890 struct tty_struct *tty = sl->tty;
891 unsigned long break_baud;
894 break_baud = ((sl->lin_baud * 2) / 3);
895 sltty_change_speed(tty, break_baud);
897 tty->ops->flush_buffer(tty);
898 sl->rx_cnt = SLLIN_BUFF_BREAK;
900 sl->rx_expect = SLLIN_BUFF_BREAK + 1;
901 sl->lin_state = SLSTATE_BREAK_SENT;
903 res = sllin_send_tx_buff(sl);
905 sl->lin_state = SLSTATE_IDLE;
911 #else /* BREAK_BY_BAUD */
913 static int sllin_send_break(struct sllin *sl)
915 struct tty_struct *tty = sl->tty;
917 unsigned long break_baud;
918 unsigned long usleep_range_min;
919 unsigned long usleep_range_max;
921 break_baud = ((sl->lin_baud * 2) / 3);
922 sl->rx_cnt = SLLIN_BUFF_BREAK;
923 sl->rx_expect = SLLIN_BUFF_BREAK + 1;
924 sl->lin_state = SLSTATE_BREAK_SENT;
926 /* Do the break ourselves; Inspired by
927 http://lxr.linux.no/#linux+v3.1.2/drivers/tty/tty_io.c#L2452 */
928 retval = tty->ops->break_ctl(tty, -1);
933 usleep_range_min = (1000000l * SLLIN_SAMPLES_PER_CHAR) / break_baud;
934 usleep_range_max = usleep_range_min + 50;
935 usleep_range(usleep_range_min, usleep_range_max);
937 retval = tty->ops->break_ctl(tty, 0);
938 usleep_range_min = (1000000l * 1 /* 1 bit */) / break_baud;
939 usleep_range_max = usleep_range_min + 30;
940 usleep_range(usleep_range_min, usleep_range_max);
942 tty->ops->flush_buffer(tty);
944 sl->tx_cnt = SLLIN_BUFF_SYNC;
946 netdev_dbg(sl->dev, "Break sent.\n");
947 set_bit(SLF_RXEVENT, &sl->flags);
948 wake_up(&sl->kwt_wq);
952 #endif /* BREAK_BY_BAUD */
955 static enum hrtimer_restart sllin_rx_timeout_handler(struct hrtimer *hrtimer)
957 struct sllin *sl = container_of(hrtimer, struct sllin, rx_timer);
960 * Signal timeout when:
961 * master: We did not receive as much characters as expected
962 * slave: * we did not receive any data bytes at all
963 * * we know the length and didn't receive enough
965 if ((sl->lin_master) ||
966 (sl->rx_cnt <= SLLIN_BUFF_DATA) ||
967 ((!sl->rx_len_unknown) &&
968 (sl->rx_cnt < sl->rx_expect))) {
969 sllin_report_error(sl, LIN_ERR_RX_TIMEOUT);
970 set_bit(SLF_TMOUTEVENT, &sl->flags);
972 sllin_slave_finish_rx_msg(sl);
973 set_bit(SLF_RXEVENT, &sl->flags);
975 wake_up(&sl->kwt_wq);
977 return HRTIMER_NORESTART;
980 /*****************************************
981 * sllin_kwthread - kernel worker thread
982 *****************************************/
984 static int sllin_kwthread(void *ptr)
986 struct sllin *sl = (struct sllin *)ptr;
987 struct tty_struct *tty = sl->tty;
988 struct sched_param schparam = { .sched_priority = 40 };
989 int tx_bytes = 0; /* Used for Network statistics */
992 struct sllin_conf_entry *sce;
994 netdev_dbg(sl->dev, "sllin_kwthread started.\n");
995 sched_setscheduler(current, SCHED_FIFO, &schparam);
997 clear_bit(SLF_ERROR, &sl->flags);
998 sltty_change_speed(tty, sl->lin_baud);
1000 while (!kthread_should_stop()) {
1001 struct can_frame *cf;
1004 u8 lin_data_buff[SLLIN_DATA_MAX];
1007 if ((sl->lin_state == SLSTATE_IDLE) && sl->lin_master &&
1009 if (sllin_send_break(sl) < 0) {
1010 /* error processing */
1014 wait_event_killable(sl->kwt_wq, kthread_should_stop() ||
1015 test_bit(SLF_RXEVENT, &sl->flags) ||
1016 test_bit(SLF_TXEVENT, &sl->flags) ||
1017 test_bit(SLF_TMOUTEVENT, &sl->flags) ||
1018 test_bit(SLF_ERROR, &sl->flags) ||
1019 (sl->lin_state == SLSTATE_ID_RECEIVED) ||
1020 (((sl->lin_state == SLSTATE_IDLE) ||
1021 (sl->lin_state == SLSTATE_RESPONSE_WAIT))
1022 && test_bit(SLF_MSGEVENT, &sl->flags)));
1024 if (test_and_clear_bit(SLF_RXEVENT, &sl->flags)) {
1025 netdev_dbg(sl->dev, "sllin_kthread RXEVENT\n");
1028 if (test_and_clear_bit(SLF_ERROR, &sl->flags)) {
1029 unsigned long usleep_range_min;
1030 unsigned long usleep_range_max;
1031 hrtimer_cancel(&sl->rx_timer);
1032 netdev_dbg(sl->dev, "sllin_kthread ERROR\n");
1034 if (sl->lin_state != SLSTATE_IDLE)
1035 sllin_report_error(sl, LIN_ERR_FRAMING);
1037 usleep_range_min = (1000000l * SLLIN_SAMPLES_PER_CHAR * 10) /
1039 usleep_range_max = usleep_range_min + 50;
1040 usleep_range(usleep_range_min, usleep_range_max);
1041 sllin_reset_buffs(sl);
1042 sl->lin_state = SLSTATE_IDLE;
1045 if (test_and_clear_bit(SLF_TXEVENT, &sl->flags)) {
1046 netdev_dbg(sl->dev, "sllin_kthread TXEVENT\n");
1049 if (test_and_clear_bit(SLF_TMOUTEVENT, &sl->flags)) {
1050 netdev_dbg(sl->dev, "sllin_kthread TMOUTEVENT\n");
1051 sllin_reset_buffs(sl);
1053 sl->lin_state = SLSTATE_IDLE;
1056 switch (sl->lin_state) {
1058 if (!test_bit(SLF_MSGEVENT, &sl->flags))
1061 cf = (struct can_frame *)sl->tx_req_skb->data;
1063 /* SFF RTR CAN frame -> LIN header */
1064 if (cf->can_id & CAN_RTR_FLAG) {
1065 struct sllin_conf_entry *sce;
1067 netdev_dbg(sl->dev, "%s: RTR SFF CAN frame, ID = %x\n",
1068 __func__, cf->can_id & LIN_ID_MASK);
1070 sce = &sl->linfr_cache[cf->can_id & LIN_ID_MASK];
1071 spin_lock_irqsave(&sl->linfr_lock, flags);
1073 /* Is there Slave response in linfr_cache to be sent? */
1074 if ((sce->frame_fl & LIN_CACHE_RESPONSE)
1075 && (sce->dlc > 0)) {
1077 netdev_dbg(sl->dev, "Sending LIN response from linfr_cache\n");
1079 lin_data = sce->data;
1081 if (lin_dlc > SLLIN_DATA_MAX)
1082 lin_dlc = SLLIN_DATA_MAX;
1083 memcpy(lin_data_buff, lin_data, lin_dlc);
1084 lin_data = lin_data_buff;
1089 spin_unlock_irqrestore(&sl->linfr_lock, flags);
1091 } else { /* SFF NON-RTR CAN frame -> LIN header + LIN response */
1092 netdev_dbg(sl->dev, "%s: NON-RTR SFF CAN frame, ID = %x\n",
1093 __func__, (int)cf->can_id & LIN_ID_MASK);
1095 lin_data = cf->data;
1096 lin_dlc = cf->can_dlc;
1097 if (lin_dlc > SLLIN_DATA_MAX)
1098 lin_dlc = SLLIN_DATA_MAX;
1102 if (sllin_setup_msg(sl, 0, cf->can_id & LIN_ID_MASK,
1103 lin_data, lin_dlc) != -1) {
1105 sl->id_to_send = true;
1106 sl->data_to_send = (lin_data != NULL) ? true : false;
1107 sl->resp_len_known = (lin_dlc > 0) ? true : false;
1108 sl->dev->stats.tx_packets++;
1109 sl->dev->stats.tx_bytes += tx_bytes;
1112 clear_bit(SLF_MSGEVENT, &sl->flags);
1113 kfree_skb(sl->tx_req_skb);
1114 netif_wake_queue(sl->dev);
1115 hrtimer_start(&sl->rx_timer,
1116 ktime_add(ktime_get(), sl->rx_timer_timeout),
1120 case SLSTATE_BREAK_SENT:
1121 #ifdef BREAK_BY_BAUD
1122 if (sl->rx_cnt <= SLLIN_BUFF_BREAK)
1125 res = sltty_change_speed(tty, sl->lin_baud);
1128 sl->lin_state = SLSTATE_ID_SENT;
1129 sllin_send_tx_buff(sl);
1132 case SLSTATE_ID_SENT:
1133 hrtimer_cancel(&sl->rx_timer);
1134 sl->id_to_send = false;
1135 if (sl->data_to_send) {
1136 sllin_send_tx_buff(sl);
1137 sl->lin_state = SLSTATE_RESPONSE_SENT;
1138 sl->rx_expect = sl->tx_lim;
1139 goto slstate_response_sent;
1141 if (sl->resp_len_known) {
1142 sl->rx_expect = sl->rx_lim;
1144 sl->rx_expect = SLLIN_BUFF_DATA + 2;
1146 sl->lin_state = SLSTATE_RESPONSE_WAIT;
1147 /* If we don't receive anything, timer will "unblock" us */
1148 hrtimer_start(&sl->rx_timer,
1149 ktime_add(ktime_get(), sl->rx_timer_timeout),
1151 goto slstate_response_wait;
1155 case SLSTATE_RESPONSE_WAIT:
1156 slstate_response_wait:
1157 if (test_bit(SLF_MSGEVENT, &sl->flags)) {
1158 unsigned char *lin_buff;
1159 cf = (struct can_frame *)sl->tx_req_skb->data;
1161 lin_buff = (sl->lin_master) ? sl->tx_buff : sl->rx_buff;
1162 if (cf->can_id == (lin_buff[SLLIN_BUFF_ID] & LIN_ID_MASK)) {
1163 hrtimer_cancel(&sl->rx_timer);
1164 netdev_dbg(sl->dev, "received LIN response in a CAN frame.\n");
1165 if (sllin_setup_msg(sl, SLLIN_STPMSG_RESPONLY,
1166 cf->can_id & LIN_ID_MASK,
1167 cf->data, cf->can_dlc) != -1) {
1169 sl->rx_expect = sl->tx_lim;
1170 sl->data_to_send = true;
1171 sl->dev->stats.tx_packets++;
1172 sl->dev->stats.tx_bytes += tx_bytes;
1174 if (!sl->lin_master) {
1175 sl->tx_cnt = SLLIN_BUFF_DATA;
1178 sllin_send_tx_buff(sl);
1179 clear_bit(SLF_MSGEVENT, &sl->flags);
1180 kfree_skb(sl->tx_req_skb);
1181 netif_wake_queue(sl->dev);
1183 sl->lin_state = SLSTATE_RESPONSE_SENT;
1184 goto slstate_response_sent;
1187 sl->lin_state = SLSTATE_RESPONSE_WAIT_BUS;
1191 /* Be aware, no BREAK here */
1192 case SLSTATE_RESPONSE_WAIT_BUS:
1193 if (sl->rx_cnt < sl->rx_expect)
1196 hrtimer_cancel(&sl->rx_timer);
1197 netdev_dbg(sl->dev, "response received ID %d len %d\n",
1198 sl->rx_buff[SLLIN_BUFF_ID], sl->rx_cnt - SLLIN_BUFF_DATA - 1);
1200 if (sllin_rx_validate(sl) == -1) {
1201 netdev_dbg(sl->dev, "RX validation failed.\n");
1202 sllin_report_error(sl, LIN_ERR_CHECKSUM);
1204 /* Send CAN non-RTR frame with data */
1205 netdev_dbg(sl->dev, "sending NON-RTR CAN frame with LIN payload.");
1206 sll_bump(sl); /* send packet to the network layer */
1209 sl->id_to_send = false;
1210 sl->lin_state = SLSTATE_IDLE;
1213 case SLSTATE_ID_RECEIVED:
1214 lin_id = sl->rx_buff[SLLIN_BUFF_ID] & LIN_ID_MASK;
1215 sce = &sl->linfr_cache[lin_id];
1216 spin_lock_irqsave(&sl->linfr_lock, flags);
1218 if ((sce->frame_fl & LIN_CACHE_RESPONSE)
1219 && (sce->dlc > 0)) {
1222 netdev_dbg(sl->dev, "Sending LIN response from linfr_cache\n");
1224 lin_data = sce->data;
1226 if (lin_dlc > SLLIN_DATA_MAX)
1227 lin_dlc = SLLIN_DATA_MAX;
1228 memcpy(lin_data_buff, lin_data, lin_dlc);
1229 lin_data = lin_data_buff;
1232 mode = SLLIN_STPMSG_RESPONLY;
1233 if (sce->frame_fl & LIN_CHECKSUM_EXTENDED)
1234 mode |= SLLIN_STPMSG_CHCKSUM_ENH;
1236 if (sllin_setup_msg(sl, mode, lin_id & LIN_ID_MASK,
1237 lin_data, lin_dlc) != -1) {
1239 sl->rx_expect = sl->tx_lim;
1240 sl->data_to_send = true;
1241 sl->dev->stats.tx_packets++;
1242 sl->dev->stats.tx_bytes += tx_bytes;
1243 sl->resp_len_known = true;
1245 if (!sl->lin_master) {
1246 sl->tx_cnt = SLLIN_BUFF_DATA;
1248 sllin_send_tx_buff(sl);
1251 hrtimer_start(&sl->rx_timer,
1252 ktime_add(ktime_get(), sl->rx_timer_timeout),
1255 spin_unlock_irqrestore(&sl->linfr_lock, flags);
1256 sl->lin_state = SLSTATE_IDLE;
1259 case SLSTATE_RESPONSE_SENT:
1260 slstate_response_sent:
1261 if (sl->rx_cnt < sl->tx_lim)
1264 hrtimer_cancel(&sl->rx_timer);
1265 sll_bump(sl); /* send packet to the network layer */
1266 netdev_dbg(sl->dev, "response sent ID %d len %d\n",
1267 sl->rx_buff[SLLIN_BUFF_ID], sl->rx_cnt - SLLIN_BUFF_DATA - 1);
1269 sl->id_to_send = false;
1270 sl->lin_state = SLSTATE_IDLE;
1275 hrtimer_cancel(&sl->rx_timer);
1276 netdev_dbg(sl->dev, "sllin_kwthread stopped.\n");
1282 /************************************
1283 * sllin_open helper routines.
1284 ************************************/
1286 /* Collect hanged up channels */
1287 static void sll_sync(void)
1290 struct net_device *dev;
1293 for (i = 0; i < maxdev; i++) {
1294 dev = sllin_devs[i];
1298 sl = netdev_priv(dev);
1301 if (dev->flags & IFF_UP)
1306 /* Find a free SLLIN channel, and link in this `tty' line. */
1307 static struct sllin *sll_alloc(dev_t line)
1310 struct net_device *dev = NULL;
1313 if (sllin_devs == NULL)
1314 return NULL; /* Master array missing ! */
1316 for (i = 0; i < maxdev; i++) {
1317 dev = sllin_devs[i];
1323 /* Sorry, too many, all slots in use */
1328 sl = netdev_priv(dev);
1329 if (test_bit(SLF_INUSE, &sl->flags)) {
1330 unregister_netdevice(dev);
1332 sllin_devs[i] = NULL;
1337 char name[IFNAMSIZ];
1338 sprintf(name, "sllin%d", i);
1340 dev = alloc_netdev(sizeof(*sl), name, sll_setup);
1346 sl = netdev_priv(dev);
1347 /* Initialize channel control data */
1348 sl->magic = SLLIN_MAGIC;
1350 spin_lock_init(&sl->lock);
1351 spin_lock_init(&sl->linfr_lock);
1352 sllin_devs[i] = dev;
1358 * Open the high-level part of the SLLIN channel.
1359 * This function is called by the TTY module when the
1360 * SLLIN line discipline is called for. Because we are
1361 * sure the tty line exists, we only have to link it to
1362 * a free SLLIN channel...
1364 * Called in process context serialized from other ldisc calls.
1367 static int sllin_open(struct tty_struct *tty)
1372 pr_debug("sllin: %s() invoked\n", __func__);
1374 if (!capable(CAP_NET_ADMIN))
1377 if (tty->ops->write == NULL)
1380 /* RTnetlink lock is misused here to serialize concurrent
1381 opens of sllin channels. There are better ways, but it is
1386 /* Collect hanged up channels. */
1389 sl = tty->disc_data;
1392 /* First make sure we're not already connected. */
1393 if (sl && sl->magic == SLLIN_MAGIC)
1396 /* OK. Find a free SLLIN channel to use. */
1398 sl = sll_alloc(tty_devnum(tty));
1403 tty->disc_data = sl;
1404 sl->line = tty_devnum(tty);
1406 if (!test_bit(SLF_INUSE, &sl->flags)) {
1407 /* Perform the low-level SLLIN initialization. */
1408 sl->lin_master = master;
1410 pr_debug("sllin: Configured as MASTER\n");
1412 pr_debug("sllin: Configured as SLAVE\n");
1414 sllin_reset_buffs(sl);
1416 sl->lin_baud = (baudrate == 0) ? LIN_DEFAULT_BAUDRATE : baudrate;
1417 pr_debug("sllin: Baudrate set to %u\n", sl->lin_baud);
1419 sl->lin_state = SLSTATE_IDLE;
1421 hrtimer_init(&sl->rx_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
1422 sl->rx_timer.function = sllin_rx_timeout_handler;
1423 /* timeval_to_ktime(msg_head->ival1); */
1424 sl->rx_timer_timeout = ns_to_ktime(
1425 (1000000000l / sl->lin_baud) *
1426 SLLIN_SAMPLES_PER_CHAR * SLLIN_CHARS_TO_TIMEOUT);
1428 set_bit(SLF_INUSE, &sl->flags);
1430 init_waitqueue_head(&sl->kwt_wq);
1431 sl->kwthread = kthread_run(sllin_kwthread, sl, "sllin");
1432 if (sl->kwthread == NULL)
1435 err = register_netdevice(sl->dev);
1437 goto err_free_chan_and_thread;
1440 /* Done. We have linked the TTY line to a channel. */
1442 tty->receive_room = SLLIN_BUFF_LEN * 40; /* We don't flow control */
1444 /* TTY layer expects 0 on success */
1447 err_free_chan_and_thread:
1448 kthread_stop(sl->kwthread);
1449 sl->kwthread = NULL;
1453 tty->disc_data = NULL;
1454 clear_bit(SLF_INUSE, &sl->flags);
1459 /* Count references from TTY module */
1464 * Close down a SLLIN channel.
1465 * This means flushing out any pending queues, and then returning. This
1466 * call is serialized against other ldisc functions.
1468 * We also use this method for a hangup event.
1471 static void sllin_close(struct tty_struct *tty)
1473 struct sllin *sl = (struct sllin *) tty->disc_data;
1475 /* First make sure we're connected. */
1476 if (!sl || sl->magic != SLLIN_MAGIC || sl->tty != tty)
1479 kthread_stop(sl->kwthread);
1480 sl->kwthread = NULL;
1482 tty->disc_data = NULL;
1485 /* Flush network side */
1486 unregister_netdev(sl->dev);
1487 /* This will complete via sl_free_netdev */
1490 static int sllin_hangup(struct tty_struct *tty)
1496 /* Perform I/O control on an active SLLIN channel. */
1497 static int sllin_ioctl(struct tty_struct *tty, struct file *file,
1498 unsigned int cmd, unsigned long arg)
1500 struct sllin *sl = (struct sllin *) tty->disc_data;
1503 /* First make sure we're connected. */
1504 if (!sl || sl->magic != SLLIN_MAGIC)
1509 tmp = strlen(sl->dev->name) + 1;
1510 if (copy_to_user((void __user *)arg, sl->dev->name, tmp))
1518 return tty_mode_ioctl(tty, file, cmd, arg);
1522 static struct tty_ldisc_ops sll_ldisc = {
1523 .owner = THIS_MODULE,
1524 .magic = TTY_LDISC_MAGIC,
1527 .close = sllin_close,
1528 .hangup = sllin_hangup,
1529 .ioctl = sllin_ioctl,
1530 .receive_buf = sllin_receive_buf,
1531 .write_wakeup = sllin_write_wakeup,
1534 static int __init sllin_init(void)
1539 maxdev = 4; /* Sanity */
1542 pr_debug("sllin: %d dynamic interface channels.\n", maxdev);
1544 sllin_devs = kzalloc(sizeof(struct net_device *)*maxdev, GFP_KERNEL);
1546 pr_err("sllin: can't allocate sllin device array!\n");
1550 /* Fill in our line protocol discipline, and register it */
1551 status = tty_register_ldisc(N_SLLIN, &sll_ldisc);
1553 pr_err("sllin: can't register line discipline\n");
1557 #ifdef BREAK_BY_BAUD
1558 pr_debug("sllin: Break is generated by baud-rate change.");
1560 pr_debug("sllin: Break is generated manually with tiny sleep.");
1566 static void __exit sllin_exit(void)
1569 struct net_device *dev;
1571 unsigned long timeout = jiffies + HZ;
1574 if (sllin_devs == NULL)
1577 /* First of all: check for active disciplines and hangup them.
1581 msleep_interruptible(100);
1584 for (i = 0; i < maxdev; i++) {
1585 dev = sllin_devs[i];
1588 sl = netdev_priv(dev);
1589 spin_lock_bh(&sl->lock);
1592 tty_hangup(sl->tty);
1594 spin_unlock_bh(&sl->lock);
1596 } while (busy && time_before(jiffies, timeout));
1598 /* FIXME: hangup is async so we should wait when doing this second
1601 for (i = 0; i < maxdev; i++) {
1602 dev = sllin_devs[i];
1605 sllin_devs[i] = NULL;
1607 sl = netdev_priv(dev);
1609 netdev_dbg(sl->dev, "tty discipline still running\n");
1610 /* Intentionally leak the control block. */
1611 dev->destructor = NULL;
1614 unregister_netdev(dev);
1620 i = tty_unregister_ldisc(N_SLLIN);
1622 pr_err("sllin: can't unregister ldisc (err %d)\n", i);
1625 module_init(sllin_init);
1626 module_exit(sllin_exit);