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 */
149 char header_received;/* In Slave mode, set when header was already
152 unsigned long flags; /* Flag values/ mode etc */
153 #define SLF_INUSE 0 /* Channel in use */
154 #define SLF_ERROR 1 /* Parity, etc. error */
155 #define SLF_RXEVENT 2 /* Rx wake event */
156 #define SLF_TXEVENT 3 /* Tx wake event */
157 #define SLF_MSGEVENT 4 /* CAN message to sent */
158 #define SLF_TMOUTEVENT 5 /* Timeout on received data */
161 struct task_struct *kwthread;
162 wait_queue_head_t kwt_wq; /* Wait queue used by kwthread */
163 struct hrtimer rx_timer; /* RX timeout timer */
164 ktime_t rx_timer_timeout; /* RX timeout timer value */
165 struct sk_buff *tx_req_skb; /* Socket buffer with CAN frame
166 received from network stack*/
168 /* List with configurations for each of 0 to LIN_ID_MAX LIN IDs */
169 struct sllin_conf_entry linfr_cache[LIN_ID_MAX + 1];
172 static struct net_device **sllin_devs;
173 static int sllin_configure_frame_cache(struct sllin *sl, struct can_frame *cf);
176 /* Values of two parity bits in LIN Protected
177 Identifier for each particular LIN ID */
178 const unsigned char sllin_id_parity_table[] = {
179 0x80, 0xc0, 0x40, 0x00, 0xc0, 0x80, 0x00, 0x40,
180 0x00, 0x40, 0xc0, 0x80, 0x40, 0x00, 0x80, 0xc0,
181 0x40, 0x00, 0x80, 0xc0, 0x00, 0x40, 0xc0, 0x80,
182 0xc0, 0x80, 0x00, 0x40, 0x80, 0xc0, 0x40, 0x00,
183 0x00, 0x40, 0xc0, 0x80, 0x40, 0x00, 0x80, 0xc0,
184 0x80, 0xc0, 0x40, 0x00, 0xc0, 0x80, 0x00, 0x40,
185 0xc0, 0x80, 0x00, 0x40, 0x80, 0xc0, 0x40, 0x00,
186 0x40, 0x00, 0x80, 0xc0, 0x00, 0x40, 0xc0, 0x80
190 * sltty_change_speed() -- Change baudrate of Serial device belonging
193 * @tty: Pointer to TTY to change speed for.
194 * @speed: Integer value of new speed. It is possible to
195 * assign non-standard values, i.e. those which
196 * are not defined in termbits.h.
198 static int sltty_change_speed(struct tty_struct *tty, unsigned speed)
200 struct ktermios old_termios;
203 mutex_lock(&tty->termios_mutex);
205 old_termios = *(tty->termios);
207 cflag = CS8 | CREAD | CLOCAL | HUPCL;
208 cflag &= ~(CBAUD | CIBAUD);
210 tty->termios->c_cflag = cflag;
211 tty->termios->c_oflag = 0;
212 tty->termios->c_lflag = 0;
214 /* Enable interrupt when UART-Break or Framing error received */
215 tty->termios->c_iflag = BRKINT | INPCK;
217 tty_encode_baud_rate(tty, speed, speed);
219 if (tty->ops->set_termios)
220 tty->ops->set_termios(tty, &old_termios);
222 mutex_unlock(&tty->termios_mutex);
227 /* Send one can_frame to the network layer */
228 static void sllin_send_canfr(struct sllin *sl, canid_t id, char *data, int len)
235 if (cf.can_dlc > 0) {
236 memcpy(&cf.data, data, cf.can_dlc);
239 skb = dev_alloc_skb(sizeof(struct can_frame));
244 skb->protocol = htons(ETH_P_CAN);
245 skb->pkt_type = PACKET_BROADCAST;
246 skb->ip_summed = CHECKSUM_UNNECESSARY;
247 memcpy(skb_put(skb, sizeof(struct can_frame)),
248 &cf, sizeof(struct can_frame));
251 sl->dev->stats.rx_packets++;
252 sl->dev->stats.rx_bytes += cf.can_dlc;
256 * sll_bump() -- Send data of received LIN frame (existing in sl->rx_buff)
261 static void sll_bump(struct sllin *sl)
263 sllin_send_canfr(sl, sl->rx_buff[SLLIN_BUFF_ID] & LIN_ID_MASK,
264 sl->rx_buff + SLLIN_BUFF_DATA,
265 sl->rx_cnt - SLLIN_BUFF_DATA - 1); /* without checksum */
268 static void sll_send_rtr(struct sllin *sl)
270 sllin_send_canfr(sl, (sl->rx_buff[SLLIN_BUFF_ID] & LIN_ID_MASK) |
271 CAN_RTR_FLAG, NULL, 0);
275 * Called by the driver when there's room for more data. If we have
276 * more packets to send, we send them here.
278 static void sllin_write_wakeup(struct tty_struct *tty)
282 struct sllin *sl = (struct sllin *) tty->disc_data;
284 /* First make sure we're connected. */
285 if (!sl || sl->magic != SLLIN_MAGIC || !netif_running(sl->dev))
288 if (sl->lin_state != SLSTATE_BREAK_SENT)
289 remains = sl->tx_lim - sl->tx_cnt;
291 remains = SLLIN_BUFF_BREAK + 1 - sl->tx_cnt;
294 actual = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt,
295 sl->tx_cnt - sl->tx_lim);
296 sl->tx_cnt += actual;
298 if (sl->tx_cnt < sl->tx_lim) {
299 pr_debug("sllin: sllin_write_wakeup sent %d, "
300 "remains %d, waiting\n",
301 sl->tx_cnt, sl->tx_lim - sl->tx_cnt);
306 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
307 set_bit(SLF_TXEVENT, &sl->flags);
308 wake_up(&sl->kwt_wq);
310 pr_debug("sllin: sllin_write_wakeup sent %d, wakeup\n", sl->tx_cnt);
314 * sll_xmit() -- Send a can_frame to a TTY queue.
316 * @skb: Pointer to Socket buffer to be sent.
317 * @dev: Network device where @skb will be sent.
319 static netdev_tx_t sll_xmit(struct sk_buff *skb, struct net_device *dev)
321 struct sllin *sl = netdev_priv(dev);
322 struct can_frame *cf;
324 if (skb->len != sizeof(struct can_frame))
327 spin_lock(&sl->lock);
328 if (!netif_running(dev)) {
329 printk(KERN_WARNING "%s: xmit: iface is down\n", dev->name);
332 if (sl->tty == NULL) {
336 cf = (struct can_frame *) skb->data;
337 if (cf->can_id & LIN_CTRL_FRAME) {
338 sllin_configure_frame_cache(sl, cf);
339 goto free_out_unlock;
342 netif_stop_queue(sl->dev);
344 sl->tx_req_skb = skb;
345 set_bit(SLF_MSGEVENT, &sl->flags);
346 wake_up(&sl->kwt_wq);
347 spin_unlock(&sl->lock);
352 spin_unlock(&sl->lock);
359 /******************************************
360 * Routines looking at netdevice side.
361 ******************************************/
363 /* Netdevice UP -> DOWN routine */
364 static int sll_close(struct net_device *dev)
366 struct sllin *sl = netdev_priv(dev);
368 spin_lock_bh(&sl->lock);
370 /* TTY discipline is running. */
371 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
373 netif_stop_queue(dev);
376 spin_unlock_bh(&sl->lock);
381 /* Netdevice DOWN -> UP routine */
382 static int sll_open(struct net_device *dev)
384 struct sllin *sl = netdev_priv(dev);
386 pr_debug("sllin: %s() invoked\n", __FUNCTION__);
391 sl->flags &= (1 << SLF_INUSE);
392 netif_start_queue(dev);
396 /* Hook the destructor so we can free sllin devs at the right point in time */
397 static void sll_free_netdev(struct net_device *dev)
399 int i = dev->base_addr;
401 sllin_devs[i] = NULL;
404 static const struct net_device_ops sll_netdev_ops = {
405 .ndo_open = sll_open,
406 .ndo_stop = sll_close,
407 .ndo_start_xmit = sll_xmit,
410 static void sll_setup(struct net_device *dev)
412 dev->netdev_ops = &sll_netdev_ops;
413 dev->destructor = sll_free_netdev;
415 dev->hard_header_len = 0;
417 dev->tx_queue_len = 10;
419 dev->mtu = sizeof(struct can_frame);
420 dev->type = ARPHRD_CAN;
422 /* New-style flags. */
423 dev->flags = IFF_NOARP;
424 dev->features = NETIF_F_NO_CSUM;
427 /******************************************
428 Routines looking at TTY side.
429 ******************************************/
431 static void sllin_receive_buf(struct tty_struct *tty,
432 const unsigned char *cp, char *fp, int count)
434 struct sllin *sl = (struct sllin *) tty->disc_data;
435 pr_debug("sllin: sllin_receive_buf invoked, count = %u\n", count);
437 if (!sl || sl->magic != SLLIN_MAGIC || !netif_running(sl->dev))
440 /* Read the characters out of the buffer */
443 pr_debug("sllin: sllin_receive_buf char 0x%02x ignored "
444 "due marker 0x%02x, flags 0x%lx\n",
445 *cp, *(fp-1), sl->flags);
447 if (sl->lin_master == true) { /* Report error */
448 set_bit(SLF_ERROR, &sl->flags);
449 wake_up(&sl->kwt_wq);
451 } else { /* Received Break */
453 sl->rx_expect = SLLIN_BUFF_ID + 1;
454 sl->header_received = false;
459 if (sl->rx_cnt < SLLIN_BUFF_LEN) {
460 #ifndef BREAK_BY_BAUD
461 /* We didn't receive Break character -- fake it! */
462 if ((sl->rx_cnt == SLLIN_BUFF_BREAK) && (*cp == 0x55)) {
463 pr_debug("sllin: LIN_RX[%d]: 0x00\n", sl->rx_cnt);
464 sl->rx_buff[sl->rx_cnt++] = 0x00;
467 pr_debug("sllin: LIN_RX[%d]: 0x%02x\n", sl->rx_cnt, *cp);
468 sl->rx_buff[sl->rx_cnt++] = *cp++;
472 if (sl->lin_master == true) {
473 if (sl->rx_cnt >= sl->rx_expect) { /* Probably whole frame was received */
474 set_bit(SLF_RXEVENT, &sl->flags);
475 wake_up(&sl->kwt_wq);
476 pr_debug("sllin: sllin_receive_buf count %d, wakeup\n", sl->rx_cnt);
478 pr_debug("sllin: sllin_receive_buf count %d, waiting\n", sl->rx_cnt);
480 } else { /* LIN slave */
482 struct sllin_conf_entry *sce;
484 pr_debug("sllin: rx_cnt = %u; header_received = %u\n",
485 sl->rx_cnt, sl->header_received);
487 /* Whole header was received */
488 if ((sl->rx_cnt >= (SLLIN_BUFF_ID + 1)) &&
489 (sl->header_received == false))
491 lin_id = sl->rx_buff[SLLIN_BUFF_ID] & LIN_ID_MASK;
492 sce = &sl->linfr_cache[lin_id];
494 /* Is the length of data set in frame cache? */
495 if (sce->frame_fl & LIN_LOC_SLAVE_CACHE)
496 sl->rx_expect += sce->dlc;
498 sl->rx_expect += 2; /* 1 data byte + checksum */
500 sl->header_received = true;
504 /* Probably whole frame was received */
505 if ((sl->rx_cnt >= sl->rx_expect) && (sl->rx_cnt > SLLIN_BUFF_DATA)) {
507 pr_debug("sllin: Received LIN header & LIN response. "
508 "rx_cnt = %u, rx_expect = %u\n", sl->rx_cnt,
511 /* Prepare for reception of new header */
513 sl->rx_expect = SLLIN_BUFF_ID + 1;
514 sl->header_received = false;
519 /*****************************************
520 * sllin message helper routines
521 *****************************************/
523 * sllin_report_error() -- Report an error by sending CAN frame
524 * with particular error flag set in can_id
527 * @err: Error flag to be sent.
529 void sllin_report_error(struct sllin *sl, int err)
532 case LIN_ERR_CHECKSUM:
533 sl->dev->stats.rx_crc_errors++;
536 case LIN_ERR_RX_TIMEOUT:
537 sl->dev->stats.rx_errors++;
540 case LIN_ERR_FRAMING:
541 sl->dev->stats.rx_frame_errors++;
545 sllin_send_canfr(sl, 0 | CAN_EFF_FLAG |
546 (err & ~LIN_ID_MASK), NULL, 0);
550 * sllin_configure_frame_cache() -- Configure particular entry in linfr_cache
553 * @cf: Pointer to CAN frame sent to this driver
554 * holding configuration information
556 static int sllin_configure_frame_cache(struct sllin *sl, struct can_frame *cf)
558 struct sllin_conf_entry *sce;
559 if (!(cf->can_id & LIN_ID_CONF))
562 sce = &sl->linfr_cache[cf->can_id & LIN_ID_MASK];
563 pr_debug("sllin: Setting frame cache with EFF CAN frame. "
564 "LIN ID = %d\n", cf->can_id & LIN_ID_MASK);
566 sce->dlc = cf->can_dlc;
567 if (sce->dlc > SLLIN_DATA_MAX)
568 sce->dlc = SLLIN_DATA_MAX;
570 sce->frame_fl = (cf->can_id & ~LIN_ID_MASK) & CAN_EFF_MASK;
571 memcpy(sce->data, cf->data, cf->can_dlc);
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)
596 for (; i < length; i++) {
605 #define SLLIN_STPMSG_RESPONLY (1) /* Message will be LIN Response only */
606 #define SLLIN_STPMSG_CHCKSUM_CLS (1 << 1)
607 #define SLLIN_STPMSG_CHCKSUM_ENH (1 << 2)
609 int sllin_setup_msg(struct sllin *sl, int mode, int id,
610 unsigned char *data, int len)
612 if (id > LIN_ID_MASK)
615 if (!(mode & SLLIN_STPMSG_RESPONLY)) {
619 sl->rx_lim = SLLIN_BUFF_LEN;
622 sl->tx_buff[SLLIN_BUFF_BREAK] = 0;
623 sl->tx_buff[SLLIN_BUFF_SYNC] = 0x55;
624 sl->tx_buff[SLLIN_BUFF_ID] = id | sllin_id_parity_table[id];
625 sl->tx_lim = SLLIN_BUFF_DATA;
627 if ((data != NULL) && len) {
629 memcpy(sl->tx_buff + SLLIN_BUFF_DATA, data, len);
630 sl->tx_buff[sl->tx_lim++] = sllin_checksum(sl->tx_buff,
631 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;
650 int sllin_send_tx_buff(struct sllin *sl)
652 struct tty_struct *tty = sl->tty;
657 if (sl->lin_state != SLSTATE_BREAK_SENT)
658 remains = sl->tx_lim - sl->tx_cnt;
662 remains = sl->tx_lim - sl->tx_cnt;
665 res = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt, remains);
673 set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
674 res = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt, remains);
676 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
684 pr_debug("sllin: sllin_send_tx_buff sent %d, remains %d\n",
685 sl->tx_cnt, remains);
691 int sllin_send_break(struct sllin *sl)
693 struct tty_struct *tty = sl->tty;
694 unsigned long break_baud;
697 break_baud = ((sl->lin_baud * 2) / 3);
698 sltty_change_speed(tty, break_baud);
700 tty->ops->flush_buffer(tty);
701 sl->rx_cnt = SLLIN_BUFF_BREAK;
703 sl->rx_expect = SLLIN_BUFF_BREAK + 1;
704 sl->lin_state = SLSTATE_BREAK_SENT;
706 res = sllin_send_tx_buff(sl);
708 sl->lin_state = SLSTATE_IDLE;
714 #else /* BREAK_BY_BAUD */
716 int sllin_send_break(struct sllin *sl)
718 struct tty_struct *tty = sl->tty;
720 unsigned long break_baud;
721 unsigned long usleep_range_min;
722 unsigned long usleep_range_max;
724 break_baud = ((sl->lin_baud * 2) / 3);
725 sl->rx_cnt = SLLIN_BUFF_BREAK;
726 sl->rx_expect = SLLIN_BUFF_BREAK + 1;
727 sl->lin_state = SLSTATE_BREAK_SENT;
729 /* Do the break ourselves; Inspired by
730 http://lxr.linux.no/#linux+v3.1.2/drivers/tty/tty_io.c#L2452 */
731 retval = tty->ops->break_ctl(tty, -1);
736 usleep_range_min = (1000000l * SLLIN_SAMPLES_PER_CHAR) / break_baud;
737 usleep_range_max = usleep_range_min + 50;
738 usleep_range(usleep_range_min, usleep_range_max);
740 retval = tty->ops->break_ctl(tty, 0);
741 usleep_range_min = (1000000l * 1 /* 1 bit */) / break_baud;
742 usleep_range_max = usleep_range_min + 30;
743 usleep_range(usleep_range_min, usleep_range_max);
745 tty->ops->flush_buffer(tty);
747 sl->tx_cnt = SLLIN_BUFF_SYNC;
749 pr_debug("sllin: Break sent.\n");
750 set_bit(SLF_RXEVENT, &sl->flags);
751 wake_up(&sl->kwt_wq);
755 #endif /* BREAK_BY_BAUD */
758 static enum hrtimer_restart sllin_rx_timeout_handler(struct hrtimer *hrtimer)
760 struct sllin *sl = container_of(hrtimer, struct sllin, rx_timer);
762 sllin_report_error(sl, LIN_ERR_RX_TIMEOUT);
763 set_bit(SLF_TMOUTEVENT, &sl->flags);
764 wake_up(&sl->kwt_wq);
766 return HRTIMER_NORESTART;
770 * sllin_rx_validate() -- Validate received frame, i,e. check checksum
774 static int sllin_rx_validate(struct sllin *sl)
779 unsigned char rec_chcksm = sl->rx_buff[sl->rx_cnt - 1];
780 struct sllin_conf_entry *scf;
782 actual_id = sl->rx_buff[SLLIN_BUFF_ID] & LIN_ID_MASK;
783 scf = &sl->linfr_cache[actual_id];
785 ext_chcks_fl = scf->frame_fl & LIN_CHECKSUM_EXTENDED;
787 if (sllin_checksum(sl->rx_buff, sl->rx_cnt - 1, ext_chcks_fl) !=
790 /* Type of checksum is configured for particular frame */
794 if (sllin_checksum(sl->rx_buff, sl->rx_cnt - 1,
795 !ext_chcks_fl) != rec_chcksm) {
804 /*****************************************
805 * sllin_kwthread - kernel worker thread
806 *****************************************/
808 int sllin_kwthread(void *ptr)
810 struct sllin *sl = (struct sllin *)ptr;
811 struct tty_struct *tty = sl->tty;
812 struct sched_param schparam = { .sched_priority = 40 };
813 int tx_bytes = 0; /* Used for Network statistics */
816 pr_debug("sllin: sllin_kwthread started.\n");
817 sched_setscheduler(current, SCHED_FIFO, &schparam);
819 clear_bit(SLF_ERROR, &sl->flags);
820 sltty_change_speed(tty, sl->lin_baud);
822 while (!kthread_should_stop()) {
823 struct can_frame *cf;
826 u8 lin_data_buff[SLLIN_DATA_MAX];
829 if ((sl->lin_state == SLSTATE_IDLE) && sl->lin_master &&
831 if(sllin_send_break(sl) < 0) {
832 /* error processing */
836 wait_event_killable(sl->kwt_wq, kthread_should_stop() ||
837 test_bit(SLF_RXEVENT, &sl->flags) ||
838 test_bit(SLF_TXEVENT, &sl->flags) ||
839 test_bit(SLF_TMOUTEVENT, &sl->flags) ||
840 test_bit(SLF_ERROR, &sl->flags) ||
841 (((sl->lin_state == SLSTATE_IDLE) ||
842 (sl->lin_state == SLSTATE_RESPONSE_WAIT))
843 && test_bit(SLF_MSGEVENT, &sl->flags)));
845 if (test_and_clear_bit(SLF_RXEVENT, &sl->flags)) {
846 pr_debug("sllin: sllin_kthread RXEVENT\n");
849 if (test_and_clear_bit(SLF_ERROR, &sl->flags)) {
850 unsigned long usleep_range_min;
851 unsigned long usleep_range_max;
852 hrtimer_cancel(&sl->rx_timer);
853 pr_debug("sllin: sllin_kthread ERROR\n");
855 if (sl->lin_state != SLSTATE_IDLE)
856 sllin_report_error(sl, LIN_ERR_FRAMING);
858 usleep_range_min = (1000000l * SLLIN_SAMPLES_PER_CHAR * 10) /
860 usleep_range_max = usleep_range_min + 50;
861 usleep_range(usleep_range_min, usleep_range_max);
862 sllin_reset_buffs(sl);
863 sl->lin_state = SLSTATE_IDLE;
866 if (test_and_clear_bit(SLF_TXEVENT, &sl->flags)) {
867 pr_debug("sllin: sllin_kthread TXEVENT\n");
870 if (test_and_clear_bit(SLF_TMOUTEVENT, &sl->flags)) {
871 pr_debug("sllin: sllin_kthread TMOUTEVENT\n");
872 sllin_reset_buffs(sl);
874 sl->lin_state = SLSTATE_IDLE;
877 switch (sl->lin_state) {
879 if (!test_bit(SLF_MSGEVENT, &sl->flags))
882 cf = (struct can_frame *)sl->tx_req_skb->data;
884 /* SFF RTR CAN frame -> LIN header */
885 if (cf->can_id & CAN_RTR_FLAG) {
886 spin_lock(&sl->lock);
887 pr_debug("sllin: %s: RTR SFF CAN frame, ID = %x\n",
888 __FUNCTION__, cf->can_id & LIN_ID_MASK);
890 /* Is there Slave response in linfr_cache to be sent? */
891 if ((sl->linfr_cache[cf->can_id & LIN_ID_MASK].frame_fl &
893 && (sl->linfr_cache[cf->can_id & LIN_ID_MASK].dlc > 0)) {
895 pr_debug("sllin: Sending LIN response from linfr_cache\n");
896 lin_data = sl->linfr_cache[cf->can_id & LIN_ID_MASK].data;
897 lin_dlc = sl->linfr_cache[cf->can_id & LIN_ID_MASK].dlc;
898 if (lin_dlc > SLLIN_DATA_MAX)
899 lin_dlc = SLLIN_DATA_MAX;
900 memcpy(lin_data_buff, lin_data, lin_dlc);
901 lin_data = lin_data_buff;
904 lin_dlc = sl->linfr_cache[cf->can_id & LIN_ID_MASK].dlc;
906 spin_unlock(&sl->lock);
907 } else { /* SFF NON-RTR CAN frame -> LIN header + LIN response */
908 pr_debug("sllin: %s: NON-RTR SFF CAN frame, ID = %x\n",
909 __FUNCTION__, (int)cf->can_id & LIN_ID_MASK);
912 lin_dlc = cf->can_dlc;
913 if (lin_dlc > SLLIN_DATA_MAX)
914 lin_dlc = SLLIN_DATA_MAX;
918 if (sllin_setup_msg(sl, 0, cf->can_id & LIN_ID_MASK,
919 lin_data, lin_dlc) != -1) {
921 sl->id_to_send = true;
922 sl->data_to_send = (lin_data != NULL) ? true : false;
923 sl->resp_len_known = (lin_dlc > 0) ? true : false;
924 sl->dev->stats.tx_packets++;
925 sl->dev->stats.tx_bytes += tx_bytes;
928 clear_bit(SLF_MSGEVENT, &sl->flags);
929 kfree_skb(sl->tx_req_skb);
930 netif_wake_queue(sl->dev);
931 hrtimer_start(&sl->rx_timer,
932 ktime_add(ktime_get(), sl->rx_timer_timeout),
936 case SLSTATE_BREAK_SENT:
938 if (sl->rx_cnt <= SLLIN_BUFF_BREAK)
941 res = sltty_change_speed(tty, sl->lin_baud);
944 sl->lin_state = SLSTATE_ID_SENT;
945 sllin_send_tx_buff(sl);
948 case SLSTATE_ID_SENT:
949 hrtimer_cancel(&sl->rx_timer);
950 sl->id_to_send = false;
951 if (sl->data_to_send) {
952 sllin_send_tx_buff(sl);
953 sl->lin_state = SLSTATE_RESPONSE_SENT;
954 sl->rx_expect = sl->tx_lim;
955 goto slstate_response_sent;
957 if (sl->resp_len_known) {
958 sl->rx_expect = sl->rx_lim;
960 sl->rx_expect = SLLIN_BUFF_DATA + 2;
962 sl->lin_state = SLSTATE_RESPONSE_WAIT;
963 /* If we don't receive anything, timer will "unblock" us */
964 hrtimer_start(&sl->rx_timer,
965 ktime_add(ktime_get(), sl->rx_timer_timeout),
967 goto slstate_response_wait;
971 case SLSTATE_RESPONSE_WAIT:
972 slstate_response_wait:
973 if (test_bit(SLF_MSGEVENT, &sl->flags)) {
974 unsigned char *lin_buff;
975 cf = (struct can_frame *)sl->tx_req_skb->data;
977 lin_buff = (sl->lin_master) ? sl->tx_buff : sl->rx_buff;
978 if (cf->can_id == (lin_buff[SLLIN_BUFF_ID] & LIN_ID_MASK)) {
979 hrtimer_cancel(&sl->rx_timer);
980 pr_debug("sllin: received LIN response in a CAN frame.\n");
981 if (sllin_setup_msg(sl, SLLIN_STPMSG_RESPONLY,
982 cf->can_id & LIN_ID_MASK,
983 cf->data, cf->can_dlc) != -1) {
985 sl->rx_expect = sl->tx_lim;
986 sl->data_to_send = true;
987 sl->dev->stats.tx_packets++;
988 sl->dev->stats.tx_bytes += tx_bytes;
990 if (!sl->lin_master) {
991 sl->tx_cnt = SLLIN_BUFF_DATA;
994 sllin_send_tx_buff(sl);
995 clear_bit(SLF_MSGEVENT, &sl->flags);
996 kfree_skb(sl->tx_req_skb);
997 netif_wake_queue(sl->dev);
999 sl->lin_state = SLSTATE_RESPONSE_SENT;
1000 goto slstate_response_sent;
1003 sl->lin_state = SLSTATE_RESPONSE_WAIT_BUS;
1007 /* Be aware, no BREAK here */
1008 case SLSTATE_RESPONSE_WAIT_BUS:
1009 if (sl->rx_cnt < sl->rx_expect)
1012 hrtimer_cancel(&sl->rx_timer);
1013 pr_debug("sllin: response received ID %d len %d\n",
1014 sl->rx_buff[SLLIN_BUFF_ID], sl->rx_cnt - SLLIN_BUFF_DATA - 1);
1016 if (sllin_rx_validate(sl) == -1) {
1017 pr_debug("sllin: RX validation failed.\n");
1018 sllin_report_error(sl, LIN_ERR_CHECKSUM);
1020 /* Send CAN non-RTR frame with data */
1021 pr_debug("sllin: sending NON-RTR CAN"
1022 "frame with LIN payload.");
1023 sll_bump(sl); /* send packet to the network layer */
1026 sl->id_to_send = false;
1027 sl->lin_state = SLSTATE_IDLE;
1030 case SLSTATE_RESPONSE_SENT:
1031 slstate_response_sent:
1032 if (sl->rx_cnt < sl->tx_lim)
1035 hrtimer_cancel(&sl->rx_timer);
1036 sll_bump(sl); /* send packet to the network layer */
1037 pr_debug("sllin: response sent ID %d len %d\n",
1038 sl->rx_buff[SLLIN_BUFF_ID], sl->rx_cnt - SLLIN_BUFF_DATA - 1);
1040 sl->id_to_send = false;
1041 sl->lin_state = SLSTATE_IDLE;
1046 hrtimer_cancel(&sl->rx_timer);
1047 pr_debug("sllin: sllin_kwthread stopped.\n");
1053 /************************************
1054 * sllin_open helper routines.
1055 ************************************/
1057 /* Collect hanged up channels */
1058 static void sll_sync(void)
1061 struct net_device *dev;
1064 for (i = 0; i < maxdev; i++) {
1065 dev = sllin_devs[i];
1069 sl = netdev_priv(dev);
1072 if (dev->flags & IFF_UP)
1077 /* Find a free SLLIN channel, and link in this `tty' line. */
1078 static struct sllin *sll_alloc(dev_t line)
1081 struct net_device *dev = NULL;
1084 if (sllin_devs == NULL)
1085 return NULL; /* Master array missing ! */
1087 for (i = 0; i < maxdev; i++) {
1088 dev = sllin_devs[i];
1094 /* Sorry, too many, all slots in use */
1099 sl = netdev_priv(dev);
1100 if (test_bit(SLF_INUSE, &sl->flags)) {
1101 unregister_netdevice(dev);
1103 sllin_devs[i] = NULL;
1108 char name[IFNAMSIZ];
1109 sprintf(name, "sllin%d", i);
1111 dev = alloc_netdev(sizeof(*sl), name, sll_setup);
1117 sl = netdev_priv(dev);
1118 /* Initialize channel control data */
1119 sl->magic = SLLIN_MAGIC;
1121 spin_lock_init(&sl->lock);
1122 sllin_devs[i] = dev;
1128 * Open the high-level part of the SLLIN channel.
1129 * This function is called by the TTY module when the
1130 * SLLIN line discipline is called for. Because we are
1131 * sure the tty line exists, we only have to link it to
1132 * a free SLLIN channel...
1134 * Called in process context serialized from other ldisc calls.
1137 static int sllin_open(struct tty_struct *tty)
1141 pr_debug("sllin: %s() invoked\n", __FUNCTION__);
1143 if (!capable(CAP_NET_ADMIN))
1146 if (tty->ops->write == NULL)
1149 /* RTnetlink lock is misused here to serialize concurrent
1150 opens of sllin channels. There are better ways, but it is
1155 /* Collect hanged up channels. */
1158 sl = tty->disc_data;
1161 /* First make sure we're not already connected. */
1162 if (sl && sl->magic == SLLIN_MAGIC)
1165 /* OK. Find a free SLLIN channel to use. */
1167 sl = sll_alloc(tty_devnum(tty));
1172 tty->disc_data = sl;
1173 sl->line = tty_devnum(tty);
1175 if (!test_bit(SLF_INUSE, &sl->flags)) {
1176 /* Perform the low-level SLLIN initialization. */
1177 sl->lin_master = master;
1180 pr_debug("sllin: Configured as MASTER\n");
1182 pr_debug("sllin: Configured as SLAVE\n");
1185 sllin_reset_buffs(sl);
1187 sl->lin_baud = (baudrate == 0) ? LIN_DEFAULT_BAUDRATE : baudrate;
1188 pr_debug("sllin: Baudrate set to %u\n", sl->lin_baud);
1190 sl->lin_state = SLSTATE_IDLE;
1192 hrtimer_init(&sl->rx_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
1193 sl->rx_timer.function = sllin_rx_timeout_handler;
1194 /* timeval_to_ktime(msg_head->ival1); */
1195 sl->rx_timer_timeout = ns_to_ktime(
1196 (1000000000l / sl->lin_baud) *
1197 SLLIN_SAMPLES_PER_CHAR * SLLIN_CHARS_TO_TIMEOUT);
1199 set_bit(SLF_INUSE, &sl->flags);
1201 init_waitqueue_head(&sl->kwt_wq);
1202 sl->kwthread = kthread_run(sllin_kwthread, sl, "sllin");
1203 if (sl->kwthread == NULL)
1206 err = register_netdevice(sl->dev);
1208 goto err_free_chan_and_thread;
1211 /* Done. We have linked the TTY line to a channel. */
1213 tty->receive_room = SLLIN_BUFF_LEN * 40; /* We don't flow control */
1215 /* TTY layer expects 0 on success */
1218 err_free_chan_and_thread:
1219 kthread_stop(sl->kwthread);
1220 sl->kwthread = NULL;
1224 tty->disc_data = NULL;
1225 clear_bit(SLF_INUSE, &sl->flags);
1230 /* Count references from TTY module */
1235 * Close down a SLLIN channel.
1236 * This means flushing out any pending queues, and then returning. This
1237 * call is serialized against other ldisc functions.
1239 * We also use this method for a hangup event.
1242 static void sllin_close(struct tty_struct *tty)
1244 struct sllin *sl = (struct sllin *) tty->disc_data;
1246 /* First make sure we're connected. */
1247 if (!sl || sl->magic != SLLIN_MAGIC || sl->tty != tty)
1250 kthread_stop(sl->kwthread);
1251 sl->kwthread = NULL;
1253 tty->disc_data = NULL;
1256 /* Flush network side */
1257 unregister_netdev(sl->dev);
1258 /* This will complete via sl_free_netdev */
1261 static int sllin_hangup(struct tty_struct *tty)
1267 /* Perform I/O control on an active SLLIN channel. */
1268 static int sllin_ioctl(struct tty_struct *tty, struct file *file,
1269 unsigned int cmd, unsigned long arg)
1271 struct sllin *sl = (struct sllin *) tty->disc_data;
1274 /* First make sure we're connected. */
1275 if (!sl || sl->magic != SLLIN_MAGIC)
1280 tmp = strlen(sl->dev->name) + 1;
1281 if (copy_to_user((void __user *)arg, sl->dev->name, tmp))
1289 return tty_mode_ioctl(tty, file, cmd, arg);
1293 static struct tty_ldisc_ops sll_ldisc = {
1294 .owner = THIS_MODULE,
1295 .magic = TTY_LDISC_MAGIC,
1298 .close = sllin_close,
1299 .hangup = sllin_hangup,
1300 .ioctl = sllin_ioctl,
1301 .receive_buf = sllin_receive_buf,
1302 .write_wakeup = sllin_write_wakeup,
1305 static int __init sllin_init(void)
1310 maxdev = 4; /* Sanity */
1313 pr_debug("sllin: %d dynamic interface channels.\n", maxdev);
1315 sllin_devs = kzalloc(sizeof(struct net_device *)*maxdev, GFP_KERNEL);
1317 printk(KERN_ERR "sllin: can't allocate sllin device array!\n");
1321 /* Fill in our line protocol discipline, and register it */
1322 status = tty_register_ldisc(N_SLLIN, &sll_ldisc);
1324 printk(KERN_ERR "sllin: can't register line discipline\n");
1328 #ifdef BREAK_BY_BAUD
1329 pr_debug("sllin: Break is generated by baud-rate change.");
1331 pr_debug("sllin: Break is generated manually with tiny sleep.");
1337 static void __exit sllin_exit(void)
1340 struct net_device *dev;
1342 unsigned long timeout = jiffies + HZ;
1345 if (sllin_devs == NULL)
1348 /* First of all: check for active disciplines and hangup them.
1352 msleep_interruptible(100);
1355 for (i = 0; i < maxdev; i++) {
1356 dev = sllin_devs[i];
1359 sl = netdev_priv(dev);
1360 spin_lock_bh(&sl->lock);
1363 tty_hangup(sl->tty);
1365 spin_unlock_bh(&sl->lock);
1367 } while (busy && time_before(jiffies, timeout));
1369 /* FIXME: hangup is async so we should wait when doing this second
1372 for (i = 0; i < maxdev; i++) {
1373 dev = sllin_devs[i];
1376 sllin_devs[i] = NULL;
1378 sl = netdev_priv(dev);
1380 printk(KERN_ERR "%s: tty discipline still running\n",
1382 /* Intentionally leak the control block. */
1383 dev->destructor = NULL;
1386 unregister_netdev(dev);
1392 i = tty_unregister_ldisc(N_SLLIN);
1394 printk(KERN_ERR "sllin: can't unregister ldisc (err %d)\n", i);
1397 module_init(sllin_init);
1398 module_exit(sllin_exit);