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 <asm/system.h>
50 #include <linux/uaccess.h>
51 #include <linux/bitops.h>
52 #include <linux/string.h>
53 #include <linux/tty.h>
54 #include <linux/errno.h>
55 #include <linux/netdevice.h>
56 #include <linux/skbuff.h>
57 #include <linux/rtnetlink.h>
58 #include <linux/if_arp.h>
59 #include <linux/if_ether.h>
60 #include <linux/sched.h>
61 #include <linux/delay.h>
62 #include <linux/init.h>
63 #include <linux/can.h>
64 #include <linux/kthread.h>
65 #include <linux/hrtimer.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 int master = true;
84 static int baudrate = 0; /* 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) */
117 SLSTATE_RESPONSE_SENT,
120 struct sllin_conf_entry {
121 int dlc; /* Length of data in LIN frame */
122 canid_t frame_fl; /* LIN frame flags. Passed from userspace as
124 u8 data[8]; /* LIN frame data payload */
130 /* Various fields. */
131 struct tty_struct *tty; /* ptr to TTY structure */
132 struct net_device *dev; /* easy for intr handling */
135 /* LIN message buffer and actual processed data counts */
136 unsigned char rx_buff[SLLIN_BUFF_LEN]; /* LIN Rx buffer */
137 unsigned char tx_buff[SLLIN_BUFF_LEN]; /* LIN Tx buffer */
138 int rx_expect; /* expected number of Rx chars */
139 int rx_lim; /* maximum Rx chars for current frame */
140 int rx_cnt; /* message buffer Rx fill level */
141 int tx_lim; /* actual limit of bytes to Tx */
142 int tx_cnt; /* number of already Tx bytes */
143 char lin_master; /* node is a master node */
144 int lin_baud; /* LIN baudrate */
145 int lin_state; /* state */
146 char id_to_send; /* there is ID to be sent */
147 char data_to_send; /* there are data to be sent */
148 char resp_len_known; /* Length of the response is known */
150 unsigned long flags; /* Flag values/ mode etc */
151 #define SLF_INUSE 0 /* Channel in use */
152 #define SLF_ERROR 1 /* Parity, etc. error */
153 #define SLF_RXEVENT 2 /* Rx wake event */
154 #define SLF_TXEVENT 3 /* Tx wake event */
155 #define SLF_MSGEVENT 4 /* CAN message to sent */
156 #define SLF_TMOUTEVENT 5 /* Timeout on received data */
159 struct task_struct *kwthread;
160 wait_queue_head_t kwt_wq; /* Wait queue used by kwthread */
161 struct hrtimer rx_timer; /* RX timeout timer */
162 ktime_t rx_timer_timeout; /* RX timeout timer value */
163 struct sk_buff *tx_req_skb; /* Socket buffer with CAN frame
164 received from network stack*/
166 /* List with configurations for each of 0 to LIN_ID_MAX LIN IDs */
167 struct sllin_conf_entry linfr_cache[LIN_ID_MAX + 1];
170 static struct net_device **sllin_devs;
171 static int sllin_configure_frame_cache(struct sllin *sl, struct can_frame *cf);
174 /* Values of two parity bits in LIN Protected
175 Identifier for each particular LIN ID */
176 const unsigned char sllin_id_parity_table[] = {
177 0x80, 0xc0, 0x40, 0x00, 0xc0, 0x80, 0x00, 0x40,
178 0x00, 0x40, 0xc0, 0x80, 0x40, 0x00, 0x80, 0xc0,
179 0x40, 0x00, 0x80, 0xc0, 0x00, 0x40, 0xc0, 0x80,
180 0xc0, 0x80, 0x00, 0x40, 0x80, 0xc0, 0x40, 0x00,
181 0x00, 0x40, 0xc0, 0x80, 0x40, 0x00, 0x80, 0xc0,
182 0x80, 0xc0, 0x40, 0x00, 0xc0, 0x80, 0x00, 0x40,
183 0xc0, 0x80, 0x00, 0x40, 0x80, 0xc0, 0x40, 0x00,
184 0x40, 0x00, 0x80, 0xc0, 0x00, 0x40, 0xc0, 0x80
188 * sltty_change_speed() -- Change baudrate of Serial device belonging
191 * @tty: Pointer to TTY to change speed for.
192 * @speed: Integer value of new speed. It is possible to
193 * assign non-standard values, i.e. those which
194 * are not defined in termbits.h.
196 static int sltty_change_speed(struct tty_struct *tty, unsigned speed)
198 struct ktermios old_termios;
201 mutex_lock(&tty->termios_mutex);
203 old_termios = *(tty->termios);
205 cflag = CS8 | CREAD | CLOCAL | HUPCL;
206 cflag &= ~(CBAUD | CIBAUD);
208 tty->termios->c_cflag = cflag;
209 tty->termios->c_oflag = 0;
210 tty->termios->c_lflag = 0;
212 /* Enable interrupt when UART-Break or Framing error received */
213 tty->termios->c_iflag = BRKINT | INPCK;
215 tty_encode_baud_rate(tty, speed, speed);
217 if (tty->ops->set_termios)
218 tty->ops->set_termios(tty, &old_termios);
220 mutex_unlock(&tty->termios_mutex);
225 /* Send one can_frame to the network layer */
226 static void sllin_send_canfr(struct sllin *sl, canid_t id, char *data, int len)
233 if (cf.can_dlc > 0) {
234 memcpy(&cf.data, data, cf.can_dlc);
237 skb = dev_alloc_skb(sizeof(struct can_frame));
242 skb->protocol = htons(ETH_P_CAN);
243 skb->pkt_type = PACKET_BROADCAST;
244 skb->ip_summed = CHECKSUM_UNNECESSARY;
245 memcpy(skb_put(skb, sizeof(struct can_frame)),
246 &cf, sizeof(struct can_frame));
249 sl->dev->stats.rx_packets++;
250 sl->dev->stats.rx_bytes += cf.can_dlc;
254 * sll_bump() -- Send data of received LIN frame (existing in sl->rx_buff)
259 static void sll_bump(struct sllin *sl)
261 sllin_send_canfr(sl, sl->rx_buff[SLLIN_BUFF_ID] & LIN_ID_MASK,
262 sl->rx_buff + SLLIN_BUFF_DATA,
263 sl->rx_cnt - SLLIN_BUFF_DATA - 1); /* without checksum */
267 * Called by the driver when there's room for more data. If we have
268 * more packets to send, we send them here.
270 static void sllin_write_wakeup(struct tty_struct *tty)
274 struct sllin *sl = (struct sllin *) tty->disc_data;
276 /* First make sure we're connected. */
277 if (!sl || sl->magic != SLLIN_MAGIC || !netif_running(sl->dev))
280 if (sl->lin_state != SLSTATE_BREAK_SENT)
281 remains = sl->tx_lim - sl->tx_cnt;
283 remains = SLLIN_BUFF_BREAK + 1 - sl->tx_cnt;
286 actual = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt,
287 sl->tx_cnt - sl->tx_lim);
288 sl->tx_cnt += actual;
290 if (sl->tx_cnt < sl->tx_lim) {
291 pr_debug("sllin: sllin_write_wakeup sent %d, "
292 "remains %d, waiting\n",
293 sl->tx_cnt, sl->tx_lim - sl->tx_cnt);
298 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
299 set_bit(SLF_TXEVENT, &sl->flags);
300 wake_up(&sl->kwt_wq);
302 pr_debug("sllin: sllin_write_wakeup sent %d, wakeup\n", sl->tx_cnt);
306 * sll_xmit() -- Send a can_frame to a TTY queue.
308 * @skb: Pointer to Socket buffer to be sent.
309 * @dev: Network device where @skb will be sent.
311 static netdev_tx_t sll_xmit(struct sk_buff *skb, struct net_device *dev)
313 struct sllin *sl = netdev_priv(dev);
314 struct can_frame *cf;
316 if (skb->len != sizeof(struct can_frame))
319 spin_lock(&sl->lock);
320 if (!netif_running(dev)) {
321 printk(KERN_WARNING "%s: xmit: iface is down\n", dev->name);
324 if (sl->tty == NULL) {
328 cf = (struct can_frame *) skb->data;
329 if (cf->can_id & LIN_CTRL_FRAME) {
330 sllin_configure_frame_cache(sl, cf);
331 goto free_out_unlock;
334 netif_stop_queue(sl->dev);
336 sl->tx_req_skb = skb;
337 set_bit(SLF_MSGEVENT, &sl->flags);
338 wake_up(&sl->kwt_wq);
339 spin_unlock(&sl->lock);
344 spin_unlock(&sl->lock);
351 /******************************************
352 * Routines looking at netdevice side.
353 ******************************************/
355 /* Netdevice UP -> DOWN routine */
356 static int sll_close(struct net_device *dev)
358 struct sllin *sl = netdev_priv(dev);
360 spin_lock_bh(&sl->lock);
362 /* TTY discipline is running. */
363 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
365 netif_stop_queue(dev);
368 spin_unlock_bh(&sl->lock);
373 /* Netdevice DOWN -> UP routine */
374 static int sll_open(struct net_device *dev)
376 struct sllin *sl = netdev_priv(dev);
378 pr_debug("sllin: %s() invoked\n", __FUNCTION__);
383 sl->flags &= (1 << SLF_INUSE);
384 netif_start_queue(dev);
388 /* Hook the destructor so we can free sllin devs at the right point in time */
389 static void sll_free_netdev(struct net_device *dev)
391 int i = dev->base_addr;
393 sllin_devs[i] = NULL;
396 static const struct net_device_ops sll_netdev_ops = {
397 .ndo_open = sll_open,
398 .ndo_stop = sll_close,
399 .ndo_start_xmit = sll_xmit,
402 static void sll_setup(struct net_device *dev)
404 dev->netdev_ops = &sll_netdev_ops;
405 dev->destructor = sll_free_netdev;
407 dev->hard_header_len = 0;
409 dev->tx_queue_len = 10;
411 dev->mtu = sizeof(struct can_frame);
412 dev->type = ARPHRD_CAN;
414 /* New-style flags. */
415 dev->flags = IFF_NOARP;
416 dev->features = NETIF_F_NO_CSUM;
419 /******************************************
420 Routines looking at TTY side.
421 ******************************************/
423 static void sllin_receive_buf(struct tty_struct *tty,
424 const unsigned char *cp, char *fp, int count)
426 struct sllin *sl = (struct sllin *) tty->disc_data;
428 pr_debug("sllin: sllin_receive_buf invoked\n");
430 if (!sl || sl->magic != SLLIN_MAGIC || !netif_running(sl->dev))
433 /* Read the characters out of the buffer */
436 if (sl->rx_cnt > SLLIN_BUFF_BREAK) {
437 set_bit(SLF_ERROR, &sl->flags);
439 pr_debug("sllin: sllin_receive_buf char 0x%02x ignored "
440 "due marker 0x%02x, flags 0x%lx\n",
441 *cp, *(fp-1), sl->flags);
443 if (sl->lin_master == true) {
444 wake_up(&sl->kwt_wq);
453 if (sl->rx_cnt < SLLIN_BUFF_LEN) {
454 #ifndef BREAK_BY_BAUD
455 /* We didn't receive Break character */
456 if ((sl->rx_cnt == SLLIN_BUFF_BREAK) && (*cp == 0x55)) {
457 sl->rx_buff[sl->rx_cnt++] = 0x00;
460 pr_debug("sllin: LIN_RX[%d]: 0x%02x\n", sl->rx_cnt, *cp);
461 sl->rx_buff[sl->rx_cnt++] = *cp++;
465 if (sl->rx_cnt >= sl->rx_expect) {
466 set_bit(SLF_RXEVENT, &sl->flags);
467 wake_up(&sl->kwt_wq);
468 pr_debug("sllin: sllin_receive_buf count %d, wakeup\n", sl->rx_cnt);
470 pr_debug("sllin: sllin_receive_buf count %d, waiting\n", sl->rx_cnt);
474 /*****************************************
475 * sllin message helper routines
476 *****************************************/
478 * sllin_report_error() -- Report an error by sending CAN frame
479 * with particular error flag set in can_id
482 * @err: Error flag to be sent.
484 void sllin_report_error(struct sllin *sl, int err)
487 case LIN_ERR_CHECKSUM:
488 sl->dev->stats.rx_crc_errors++;
491 case LIN_ERR_RX_TIMEOUT:
492 sl->dev->stats.rx_errors++;
495 case LIN_ERR_FRAMING:
496 sl->dev->stats.rx_frame_errors++;
500 sllin_send_canfr(sl, 0 | CAN_EFF_FLAG |
501 (err & ~LIN_ID_MASK), NULL, 0);
505 * sllin_configure_frame_cache() -- Configure particular entry in linfr_cache
508 * @cf: Pointer to CAN frame sent to this driver
509 * holding configuration information
511 static int sllin_configure_frame_cache(struct sllin *sl, struct can_frame *cf)
513 struct sllin_conf_entry *sce;
514 if (!(cf->can_id & LIN_ID_CONF))
517 sce = &sl->linfr_cache[cf->can_id & LIN_ID_MASK];
518 pr_debug("sllin: Setting frame cache with EFF CAN frame. "
519 "LIN ID = %d\n", cf->can_id & LIN_ID_MASK);
521 sce->dlc = cf->can_dlc;
522 if (sce->dlc > SLLIN_DATA_MAX)
523 sce->dlc = SLLIN_DATA_MAX;
525 sce->frame_fl = (cf->can_id & ~LIN_ID_MASK) & CAN_EFF_MASK;
526 memcpy(sce->data, cf->data, cf->can_dlc);
532 * sllin_checksum() -- Count checksum for particular data
534 * @data: Pointer to the buffer containing whole LIN
535 * frame (i.e. including break and sync bytes).
536 * @length: Length of the buffer.
537 * @enhanced_fl: Flag determining whether Enhanced or Classic
538 * checksum should be counted.
540 static inline unsigned sllin_checksum(unsigned char *data, int length, int enhanced_fl)
551 for (; i < length; i++) {
560 #define SLLIN_STPMSG_RESPONLY (1) /* Message will be LIN Response only */
561 #define SLLIN_STPMSG_CHCKSUM_CLS (1 << 1)
562 #define SLLIN_STPMSG_CHCKSUM_ENH (1 << 2)
564 int sllin_setup_msg(struct sllin *sl, int mode, int id,
565 unsigned char *data, int len)
567 if (id > LIN_ID_MASK)
570 if (!(mode & SLLIN_STPMSG_RESPONLY)) {
574 sl->rx_lim = SLLIN_BUFF_LEN;
577 sl->tx_buff[SLLIN_BUFF_BREAK] = 0;
578 sl->tx_buff[SLLIN_BUFF_SYNC] = 0x55;
579 sl->tx_buff[SLLIN_BUFF_ID] = id | sllin_id_parity_table[id];
580 sl->tx_lim = SLLIN_BUFF_DATA;
582 if ((data != NULL) && len) {
584 memcpy(sl->tx_buff + SLLIN_BUFF_DATA, data, len);
585 sl->tx_buff[sl->tx_lim++] = sllin_checksum(sl->tx_buff,
586 sl->tx_lim, mode & SLLIN_STPMSG_CHCKSUM_ENH);
589 sl->rx_lim = SLLIN_BUFF_DATA + len + 1;
594 static void sllin_reset_buffs(struct sllin *sl)
598 sl->rx_lim = sl->lin_master ? 0 : SLLIN_BUFF_LEN;
601 sl->id_to_send = false;
602 sl->data_to_send = false;
605 int sllin_send_tx_buff(struct sllin *sl)
607 struct tty_struct *tty = sl->tty;
612 if (sl->lin_state != SLSTATE_BREAK_SENT)
613 remains = sl->tx_lim - sl->tx_cnt;
617 remains = sl->tx_lim - sl->tx_cnt;
620 res = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt, remains);
628 set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
629 res = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt, remains);
631 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
639 pr_debug("sllin: sllin_send_tx_buff sent %d, remains %d\n",
640 sl->tx_cnt, remains);
646 int sllin_send_break(struct sllin *sl)
648 struct tty_struct *tty = sl->tty;
649 unsigned long break_baud;
652 break_baud = ((sl->lin_baud * 2) / 3);
653 sltty_change_speed(tty, break_baud);
655 tty->ops->flush_buffer(tty);
656 sl->rx_cnt = SLLIN_BUFF_BREAK;
658 sl->rx_expect = SLLIN_BUFF_BREAK + 1;
659 sl->lin_state = SLSTATE_BREAK_SENT;
661 res = sllin_send_tx_buff(sl);
663 sl->lin_state = SLSTATE_IDLE;
669 #else /* BREAK_BY_BAUD */
671 int sllin_send_break(struct sllin *sl)
673 struct tty_struct *tty = sl->tty;
675 unsigned long break_baud;
676 unsigned long usleep_range_min;
677 unsigned long usleep_range_max;
679 break_baud = ((sl->lin_baud * 2) / 3);
680 sl->rx_cnt = SLLIN_BUFF_BREAK;
681 sl->rx_expect = SLLIN_BUFF_BREAK + 1;
682 sl->lin_state = SLSTATE_BREAK_SENT;
684 /* Do the break ourselves; Inspired by
685 http://lxr.linux.no/#linux+v3.1.2/drivers/tty/tty_io.c#L2452 */
686 retval = tty->ops->break_ctl(tty, -1);
691 usleep_range_min = (1000000l * SLLIN_SAMPLES_PER_CHAR) / break_baud;
692 usleep_range_max = usleep_range_min + 50;
693 usleep_range(usleep_range_min, usleep_range_max);
695 retval = tty->ops->break_ctl(tty, 0);
696 usleep_range_min = (1000000l * 1 /* 1 bit */) / break_baud;
697 usleep_range_max = usleep_range_min + 30;
698 usleep_range(usleep_range_min, usleep_range_max);
700 tty->ops->flush_buffer(tty);
702 sl->tx_cnt = SLLIN_BUFF_SYNC;
704 pr_debug("sllin: Break sent.\n");
705 set_bit(SLF_RXEVENT, &sl->flags);
706 wake_up(&sl->kwt_wq);
710 #endif /* BREAK_BY_BAUD */
713 static enum hrtimer_restart sllin_rx_timeout_handler(struct hrtimer *hrtimer)
715 struct sllin *sl = container_of(hrtimer, struct sllin, rx_timer);
717 sllin_report_error(sl, LIN_ERR_RX_TIMEOUT);
718 set_bit(SLF_TMOUTEVENT, &sl->flags);
719 wake_up(&sl->kwt_wq);
721 return HRTIMER_NORESTART;
725 * sllin_rx_validate() -- Validate received frame, i,e. check checksum
729 static int sllin_rx_validate(struct sllin *sl)
734 unsigned char rec_chcksm = sl->rx_buff[sl->rx_cnt - 1];
735 struct sllin_conf_entry *scf;
737 actual_id = sl->rx_buff[SLLIN_BUFF_ID] & LIN_ID_MASK;
738 scf = &sl->linfr_cache[actual_id];
740 ext_chcks_fl = scf->frame_fl & LIN_CHECKSUM_EXTENDED;
742 if (sllin_checksum(sl->rx_buff, sl->rx_cnt - 1, ext_chcks_fl) !=
745 /* Type of checksum is configured for particular frame */
749 if (sllin_checksum(sl->rx_buff, sl->rx_cnt - 1,
750 !ext_chcks_fl) != rec_chcksm) {
759 /*****************************************
760 * sllin_kwthread - kernel worker thread
761 *****************************************/
763 int sllin_kwthread(void *ptr)
765 struct sllin *sl = (struct sllin *)ptr;
766 struct tty_struct *tty = sl->tty;
767 struct sched_param schparam = { .sched_priority = 40 };
768 int tx_bytes = 0; /* Used for Network statistics */
771 pr_debug("sllin: sllin_kwthread started.\n");
772 sched_setscheduler(current, SCHED_FIFO, &schparam);
774 clear_bit(SLF_ERROR, &sl->flags);
775 sltty_change_speed(tty, sl->lin_baud);
777 while (!kthread_should_stop()) {
778 struct can_frame *cf;
781 u8 lin_data_buff[SLLIN_DATA_MAX];
784 if ((sl->lin_state == SLSTATE_IDLE) && sl->lin_master &&
786 if(sllin_send_break(sl) < 0) {
787 /* error processing */
791 wait_event_killable(sl->kwt_wq, kthread_should_stop() ||
792 test_bit(SLF_RXEVENT, &sl->flags) ||
793 test_bit(SLF_TXEVENT, &sl->flags) ||
794 test_bit(SLF_TMOUTEVENT, &sl->flags) ||
795 test_bit(SLF_ERROR, &sl->flags) ||
796 (((sl->lin_state == SLSTATE_IDLE) ||
797 (sl->lin_state == SLSTATE_RESPONSE_WAIT))
798 && test_bit(SLF_MSGEVENT, &sl->flags)));
800 if (test_and_clear_bit(SLF_RXEVENT, &sl->flags)) {
801 pr_debug("sllin: sllin_kthread RXEVENT\n");
804 if (test_and_clear_bit(SLF_ERROR, &sl->flags)) {
805 unsigned long usleep_range_min;
806 unsigned long usleep_range_max;
807 hrtimer_cancel(&sl->rx_timer);
808 pr_debug("sllin: sllin_kthread ERROR\n");
810 if (sl->lin_state != SLSTATE_IDLE)
811 sllin_report_error(sl, LIN_ERR_FRAMING);
813 usleep_range_min = (1000000l * SLLIN_SAMPLES_PER_CHAR * 10) /
815 usleep_range_max = usleep_range_min + 50;
816 usleep_range(usleep_range_min, usleep_range_max);
817 sllin_reset_buffs(sl);
818 sl->lin_state = SLSTATE_IDLE;
821 if (test_and_clear_bit(SLF_TXEVENT, &sl->flags)) {
822 pr_debug("sllin: sllin_kthread TXEVENT\n");
825 if (test_and_clear_bit(SLF_TMOUTEVENT, &sl->flags)) {
826 pr_debug("sllin: sllin_kthread TMOUTEVENT\n");
827 sllin_reset_buffs(sl);
829 sl->lin_state = SLSTATE_IDLE;
832 switch (sl->lin_state) {
834 if (!test_bit(SLF_MSGEVENT, &sl->flags))
837 cf = (struct can_frame *)sl->tx_req_skb->data;
839 /* SFF RTR CAN frame -> LIN header */
840 if (cf->can_id & CAN_RTR_FLAG) {
841 spin_lock(&sl->lock);
842 pr_debug("sllin: %s: RTR SFF CAN frame, ID = %x\n",
843 __FUNCTION__, cf->can_id & LIN_ID_MASK);
845 /* Is there Slave response in linfr_cache to be sent? */
846 if ((sl->linfr_cache[cf->can_id & LIN_ID_MASK].frame_fl &
848 && (sl->linfr_cache[cf->can_id & LIN_ID_MASK].dlc > 0)) {
850 pr_debug("sllin: Sending LIN response from linfr_cache\n");
851 lin_data = sl->linfr_cache[cf->can_id & LIN_ID_MASK].data;
852 lin_dlc = sl->linfr_cache[cf->can_id & LIN_ID_MASK].dlc;
853 if (lin_dlc > SLLIN_DATA_MAX)
854 lin_dlc = SLLIN_DATA_MAX;
855 memcpy(lin_data_buff, lin_data, lin_dlc);
856 lin_data = lin_data_buff;
859 lin_dlc = sl->linfr_cache[cf->can_id & LIN_ID_MASK].dlc;
861 spin_unlock(&sl->lock);
862 } else { /* SFF NON-RTR CAN frame -> LIN header + LIN response */
863 pr_debug("sllin: %s: NON-RTR SFF CAN frame, ID = %x\n",
864 __FUNCTION__, (int)cf->can_id & LIN_ID_MASK);
867 lin_dlc = cf->can_dlc;
868 if (lin_dlc > SLLIN_DATA_MAX)
869 lin_dlc = SLLIN_DATA_MAX;
873 if (sllin_setup_msg(sl, 0, cf->can_id & LIN_ID_MASK,
874 lin_data, lin_dlc) != -1) {
876 sl->id_to_send = true;
877 sl->data_to_send = (lin_data != NULL) ? true : false;
878 sl->resp_len_known = (lin_dlc > 0) ? true : false;
879 sl->dev->stats.tx_packets++;
880 sl->dev->stats.tx_bytes += tx_bytes;
883 clear_bit(SLF_MSGEVENT, &sl->flags);
884 kfree_skb(sl->tx_req_skb);
885 netif_wake_queue(sl->dev);
886 hrtimer_start(&sl->rx_timer,
887 ktime_add(ktime_get(), sl->rx_timer_timeout),
891 case SLSTATE_BREAK_SENT:
893 if (sl->rx_cnt <= SLLIN_BUFF_BREAK)
896 res = sltty_change_speed(tty, sl->lin_baud);
899 sl->lin_state = SLSTATE_ID_SENT;
900 sllin_send_tx_buff(sl);
903 case SLSTATE_ID_SENT:
904 hrtimer_cancel(&sl->rx_timer);
905 sl->id_to_send = false;
906 if (sl->data_to_send) {
907 sllin_send_tx_buff(sl);
908 sl->lin_state = SLSTATE_RESPONSE_SENT;
909 sl->rx_expect = sl->tx_lim;
910 goto slstate_response_sent;
912 if (sl->resp_len_known) {
913 sl->rx_expect = sl->rx_lim;
915 sl->rx_expect = SLLIN_BUFF_DATA + 2;
917 sl->lin_state = SLSTATE_RESPONSE_WAIT;
918 /* If we don't receive anything, timer will "unblock" us */
919 hrtimer_start(&sl->rx_timer,
920 ktime_add(ktime_get(), sl->rx_timer_timeout),
922 goto slstate_response_wait;
926 case SLSTATE_RESPONSE_WAIT:
927 slstate_response_wait:
928 if (test_bit(SLF_MSGEVENT, &sl->flags)) {
929 unsigned char *lin_buff;
930 cf = (struct can_frame *)sl->tx_req_skb->data;
932 lin_buff = (sl->lin_master) ? sl->tx_buff : sl->rx_buff;
933 if (cf->can_id == (lin_buff[SLLIN_BUFF_ID] & LIN_ID_MASK)) {
934 hrtimer_cancel(&sl->rx_timer);
935 pr_debug("sllin: received LIN response in a CAN frame.\n");
936 if (sllin_setup_msg(sl, SLLIN_STPMSG_RESPONLY,
937 cf->can_id & LIN_ID_MASK,
938 cf->data, cf->can_dlc) != -1) {
940 sl->rx_expect = sl->tx_lim;
941 sl->data_to_send = true;
942 sl->dev->stats.tx_packets++;
943 sl->dev->stats.tx_bytes += tx_bytes;
945 if (!sl->lin_master) {
946 sl->tx_cnt = SLLIN_BUFF_DATA;
949 sllin_send_tx_buff(sl);
950 clear_bit(SLF_MSGEVENT, &sl->flags);
951 kfree_skb(sl->tx_req_skb);
952 netif_wake_queue(sl->dev);
954 sl->lin_state = SLSTATE_RESPONSE_SENT;
955 goto slstate_response_sent;
958 sl->lin_state = SLSTATE_RESPONSE_WAIT_BUS;
962 /* Be aware, no BREAK here */
963 case SLSTATE_RESPONSE_WAIT_BUS:
964 if (sl->rx_cnt < sl->rx_expect)
967 hrtimer_cancel(&sl->rx_timer);
968 pr_debug("sllin: response received ID %d len %d\n",
969 sl->rx_buff[SLLIN_BUFF_ID], sl->rx_cnt - SLLIN_BUFF_DATA - 1);
971 if (sllin_rx_validate(sl) == -1) {
972 pr_debug("sllin: RX validation failed.\n");
973 sllin_report_error(sl, LIN_ERR_CHECKSUM);
975 /* Send CAN non-RTR frame with data */
976 pr_debug("sllin: sending NON-RTR CAN"
977 "frame with LIN payload.");
978 sll_bump(sl); /* send packet to the network layer */
981 sl->id_to_send = false;
982 sl->lin_state = SLSTATE_IDLE;
985 case SLSTATE_RESPONSE_SENT:
986 slstate_response_sent:
987 if (sl->rx_cnt < sl->tx_lim)
990 hrtimer_cancel(&sl->rx_timer);
991 sll_bump(sl); /* send packet to the network layer */
992 pr_debug("sllin: response sent ID %d len %d\n",
993 sl->rx_buff[SLLIN_BUFF_ID], sl->rx_cnt - SLLIN_BUFF_DATA - 1);
995 sl->id_to_send = false;
996 sl->lin_state = SLSTATE_IDLE;
1001 hrtimer_cancel(&sl->rx_timer);
1002 pr_debug("sllin: sllin_kwthread stopped.\n");
1008 /************************************
1009 * sllin_open helper routines.
1010 ************************************/
1012 /* Collect hanged up channels */
1013 static void sll_sync(void)
1016 struct net_device *dev;
1019 for (i = 0; i < maxdev; i++) {
1020 dev = sllin_devs[i];
1024 sl = netdev_priv(dev);
1027 if (dev->flags & IFF_UP)
1032 /* Find a free SLLIN channel, and link in this `tty' line. */
1033 static struct sllin *sll_alloc(dev_t line)
1036 struct net_device *dev = NULL;
1039 if (sllin_devs == NULL)
1040 return NULL; /* Master array missing ! */
1042 for (i = 0; i < maxdev; i++) {
1043 dev = sllin_devs[i];
1049 /* Sorry, too many, all slots in use */
1054 sl = netdev_priv(dev);
1055 if (test_bit(SLF_INUSE, &sl->flags)) {
1056 unregister_netdevice(dev);
1058 sllin_devs[i] = NULL;
1063 char name[IFNAMSIZ];
1064 sprintf(name, "sllin%d", i);
1066 dev = alloc_netdev(sizeof(*sl), name, sll_setup);
1072 sl = netdev_priv(dev);
1073 /* Initialize channel control data */
1074 sl->magic = SLLIN_MAGIC;
1076 spin_lock_init(&sl->lock);
1077 sllin_devs[i] = dev;
1083 * Open the high-level part of the SLLIN channel.
1084 * This function is called by the TTY module when the
1085 * SLLIN line discipline is called for. Because we are
1086 * sure the tty line exists, we only have to link it to
1087 * a free SLLIN channel...
1089 * Called in process context serialized from other ldisc calls.
1092 static int sllin_open(struct tty_struct *tty)
1096 pr_debug("sllin: %s() invoked\n", __FUNCTION__);
1098 if (!capable(CAP_NET_ADMIN))
1101 if (tty->ops->write == NULL)
1104 /* RTnetlink lock is misused here to serialize concurrent
1105 opens of sllin channels. There are better ways, but it is
1110 /* Collect hanged up channels. */
1113 sl = tty->disc_data;
1116 /* First make sure we're not already connected. */
1117 if (sl && sl->magic == SLLIN_MAGIC)
1120 /* OK. Find a free SLLIN channel to use. */
1122 sl = sll_alloc(tty_devnum(tty));
1127 tty->disc_data = sl;
1128 sl->line = tty_devnum(tty);
1130 if (!test_bit(SLF_INUSE, &sl->flags)) {
1131 /* Perform the low-level SLLIN initialization. */
1132 sl->lin_master = master;
1134 sllin_reset_buffs(sl);
1136 sl->lin_baud = (baudrate == 0) ? LIN_DEFAULT_BAUDRATE : baudrate;
1137 pr_debug("sllin: Baudrate set to %u\n", sl->lin_baud);
1139 sl->lin_state = SLSTATE_IDLE;
1141 hrtimer_init(&sl->rx_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
1142 sl->rx_timer.function = sllin_rx_timeout_handler;
1143 /* timeval_to_ktime(msg_head->ival1); */
1144 sl->rx_timer_timeout = ns_to_ktime(
1145 (1000000000l / sl->lin_baud) *
1146 SLLIN_SAMPLES_PER_CHAR * SLLIN_CHARS_TO_TIMEOUT);
1148 set_bit(SLF_INUSE, &sl->flags);
1150 init_waitqueue_head(&sl->kwt_wq);
1151 sl->kwthread = kthread_run(sllin_kwthread, sl, "sllin");
1152 if (sl->kwthread == NULL)
1155 err = register_netdevice(sl->dev);
1157 goto err_free_chan_and_thread;
1160 /* Done. We have linked the TTY line to a channel. */
1162 tty->receive_room = SLLIN_BUFF_LEN * 40; /* We don't flow control */
1164 /* TTY layer expects 0 on success */
1167 err_free_chan_and_thread:
1168 kthread_stop(sl->kwthread);
1169 sl->kwthread = NULL;
1173 tty->disc_data = NULL;
1174 clear_bit(SLF_INUSE, &sl->flags);
1179 /* Count references from TTY module */
1184 * Close down a SLLIN channel.
1185 * This means flushing out any pending queues, and then returning. This
1186 * call is serialized against other ldisc functions.
1188 * We also use this method for a hangup event.
1191 static void sllin_close(struct tty_struct *tty)
1193 struct sllin *sl = (struct sllin *) tty->disc_data;
1195 /* First make sure we're connected. */
1196 if (!sl || sl->magic != SLLIN_MAGIC || sl->tty != tty)
1199 kthread_stop(sl->kwthread);
1200 sl->kwthread = NULL;
1202 tty->disc_data = NULL;
1205 /* Flush network side */
1206 unregister_netdev(sl->dev);
1207 /* This will complete via sl_free_netdev */
1210 static int sllin_hangup(struct tty_struct *tty)
1216 /* Perform I/O control on an active SLLIN channel. */
1217 static int sllin_ioctl(struct tty_struct *tty, struct file *file,
1218 unsigned int cmd, unsigned long arg)
1220 struct sllin *sl = (struct sllin *) tty->disc_data;
1223 /* First make sure we're connected. */
1224 if (!sl || sl->magic != SLLIN_MAGIC)
1229 tmp = strlen(sl->dev->name) + 1;
1230 if (copy_to_user((void __user *)arg, sl->dev->name, tmp))
1238 return tty_mode_ioctl(tty, file, cmd, arg);
1242 static struct tty_ldisc_ops sll_ldisc = {
1243 .owner = THIS_MODULE,
1244 .magic = TTY_LDISC_MAGIC,
1247 .close = sllin_close,
1248 .hangup = sllin_hangup,
1249 .ioctl = sllin_ioctl,
1250 .receive_buf = sllin_receive_buf,
1251 .write_wakeup = sllin_write_wakeup,
1254 static int __init sllin_init(void)
1259 maxdev = 4; /* Sanity */
1262 pr_debug("sllin: %d dynamic interface channels.\n", maxdev);
1264 sllin_devs = kzalloc(sizeof(struct net_device *)*maxdev, GFP_KERNEL);
1266 printk(KERN_ERR "sllin: can't allocate sllin device array!\n");
1270 /* Fill in our line protocol discipline, and register it */
1271 status = tty_register_ldisc(N_SLLIN, &sll_ldisc);
1273 printk(KERN_ERR "sllin: can't register line discipline\n");
1277 #ifdef BREAK_BY_BAUD
1278 pr_debug("sllin: Break is generated by baud-rate change.");
1280 pr_debug("sllin: Break is generated manually with tiny sleep.");
1286 static void __exit sllin_exit(void)
1289 struct net_device *dev;
1291 unsigned long timeout = jiffies + HZ;
1294 if (sllin_devs == NULL)
1297 /* First of all: check for active disciplines and hangup them.
1301 msleep_interruptible(100);
1304 for (i = 0; i < maxdev; i++) {
1305 dev = sllin_devs[i];
1308 sl = netdev_priv(dev);
1309 spin_lock_bh(&sl->lock);
1312 tty_hangup(sl->tty);
1314 spin_unlock_bh(&sl->lock);
1316 } while (busy && time_before(jiffies, timeout));
1318 /* FIXME: hangup is async so we should wait when doing this second
1321 for (i = 0; i < maxdev; i++) {
1322 dev = sllin_devs[i];
1325 sllin_devs[i] = NULL;
1327 sl = netdev_priv(dev);
1329 printk(KERN_ERR "%s: tty discipline still running\n",
1331 /* Intentionally leak the control block. */
1332 dev->destructor = NULL;
1335 unregister_netdev(dev);
1341 i = tty_unregister_ldisc(N_SLLIN);
1343 printk(KERN_ERR "sllin: can't unregister ldisc (err %d)\n", i);
1346 module_init(sllin_init);
1347 module_exit(sllin_exit);