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 * Send feedback to <socketcan-users@lists.berlios.de>
39 #define DEBUG 1 /* Enables pr_debug() printouts */
41 #include <linux/module.h>
42 #include <linux/moduleparam.h>
44 #include <asm/system.h>
45 #include <linux/uaccess.h>
46 #include <linux/bitops.h>
47 #include <linux/string.h>
48 #include <linux/tty.h>
49 #include <linux/errno.h>
50 #include <linux/netdevice.h>
51 #include <linux/skbuff.h>
52 #include <linux/rtnetlink.h>
53 #include <linux/if_arp.h>
54 #include <linux/if_ether.h>
55 #include <linux/sched.h>
56 #include <linux/delay.h>
57 #include <linux/init.h>
58 #include <linux/can.h>
59 #include <linux/kthread.h>
60 #include <linux/hrtimer.h>
61 #include "linux/lin_bus.h"
63 /* Should be in include/linux/tty.h */
65 /* -------------------------------- */
67 static __initdata const char banner[] =
68 KERN_INFO "sllin: serial line LIN interface driver\n";
70 MODULE_ALIAS_LDISC(N_SLLIN);
71 MODULE_DESCRIPTION("serial line LIN interface");
72 MODULE_LICENSE("GPL");
75 #define SLLIN_MAGIC 0x53CA
76 /* #define BREAK_BY_BAUD */
78 static int maxdev = 10; /* MAX number of SLLIN channels;
79 This can be overridden with
80 insmod sllin.ko maxdev=nnn */
81 module_param(maxdev, int, 0);
82 MODULE_PARM_DESC(maxdev, "Maximum number of sllin interfaces");
84 /* maximum buffer len to store whole LIN message*/
85 #define SLLIN_DATA_MAX 8
86 #define SLLIN_BUFF_LEN (1 /*break*/ + 1 /*sync*/ + 1 /*ID*/ + \
87 SLLIN_DATA_MAX + 1 /*checksum*/)
88 #define SLLIN_BUFF_BREAK 0
89 #define SLLIN_BUFF_SYNC 1
90 #define SLLIN_BUFF_ID 2
91 #define SLLIN_BUFF_DATA 3
93 #define SLLIN_SAMPLES_PER_CHAR 10
94 #define SLLIN_CHARS_TO_TIMEOUT 12
100 SLSTATE_RESPONSE_WAIT, /* Wait for response */
101 SLSTATE_RESPONSE_WAIT_BUS, /* Wait for response from LIN bus
102 only (CAN frames from network stack
103 are not processed in this moment) */
104 SLSTATE_RESPONSE_SENT,
107 struct sllin_conf_entry {
108 int dlc; /* Length of data in LIN frame */
109 canid_t frame_fl; /* LIN frame flags. Passed from userspace as
111 u8 data[8]; /* LIN frame data payload */
117 /* Various fields. */
118 struct tty_struct *tty; /* ptr to TTY structure */
119 struct net_device *dev; /* easy for intr handling */
122 /* LIN message buffer and actual processed data counts */
123 unsigned char rx_buff[SLLIN_BUFF_LEN]; /* LIN Rx buffer */
124 unsigned char tx_buff[SLLIN_BUFF_LEN]; /* LIN Tx buffer */
125 int rx_expect; /* expected number of Rx chars */
126 int rx_lim; /* maximum Rx chars for current frame */
127 int rx_cnt; /* message buffer Rx fill level */
128 int tx_lim; /* actual limit of bytes to Tx */
129 int tx_cnt; /* number of already Tx bytes */
130 char lin_master; /* node is a master node */
131 int lin_baud; /* LIN baudrate */
132 int lin_state; /* state */
133 char id_to_send; /* there is ID to be sent */
134 char data_to_send; /* there are data to be sent */
135 char resp_len_known; /* Length of the response is known */
137 unsigned long flags; /* Flag values/ mode etc */
138 #define SLF_INUSE 0 /* Channel in use */
139 #define SLF_ERROR 1 /* Parity, etc. error */
140 #define SLF_RXEVENT 2 /* Rx wake event */
141 #define SLF_TXEVENT 3 /* Tx wake event */
142 #define SLF_MSGEVENT 4 /* CAN message to sent */
143 #define SLF_TMOUTEVENT 5 /* Timeout on received data */
146 struct task_struct *kwthread;
147 wait_queue_head_t kwt_wq; /* Wait queue used by kwthread */
148 struct hrtimer rx_timer; /* RX timeout timer */
149 ktime_t rx_timer_timeout; /* RX timeout timer value */
150 struct sk_buff *tx_req_skb; /* Socket buffer with CAN frame
151 received from network stack*/
153 /* List with configurations for each of 0 to LIN_ID_MAX LIN IDs */
154 struct sllin_conf_entry linfr_cache[LIN_ID_MAX + 1];
157 static struct net_device **sllin_devs;
158 static int sllin_configure_frame_cache(struct sllin *sl, struct can_frame *cf);
161 /* Values of two parity bits in LIN Protected
162 Identifier for each particular LIN ID */
163 const unsigned char sllin_id_parity_table[] = {
164 0x80, 0xc0, 0x40, 0x00, 0xc0, 0x80, 0x00, 0x40,
165 0x00, 0x40, 0xc0, 0x80, 0x40, 0x00, 0x80, 0xc0,
166 0x40, 0x00, 0x80, 0xc0, 0x00, 0x40, 0xc0, 0x80,
167 0xc0, 0x80, 0x00, 0x40, 0x80, 0xc0, 0x40, 0x00,
168 0x00, 0x40, 0xc0, 0x80, 0x40, 0x00, 0x80, 0xc0,
169 0x80, 0xc0, 0x40, 0x00, 0xc0, 0x80, 0x00, 0x40,
170 0xc0, 0x80, 0x00, 0x40, 0x80, 0xc0, 0x40, 0x00,
171 0x40, 0x00, 0x80, 0xc0, 0x00, 0x40, 0xc0, 0x80
175 * sltty_change_speed() -- Change baudrate of Serial device belonging
178 * @tty: Pointer to TTY to change speed for.
179 * @speed: Integer value of new speed. It is possible to
180 * assign non-standard values, i.e. those which
181 * are not defined in termbits.h.
183 static int sltty_change_speed(struct tty_struct *tty, unsigned speed)
185 struct ktermios old_termios;
188 mutex_lock(&tty->termios_mutex);
190 old_termios = *(tty->termios);
191 cflag = tty->termios->c_cflag;
192 cflag &= ~(CBAUD | CIBAUD);
194 tty->termios->c_cflag = cflag;
196 tty_encode_baud_rate(tty, speed, speed);
198 if (tty->ops->set_termios)
199 tty->ops->set_termios(tty, &old_termios);
201 mutex_unlock(&tty->termios_mutex);
207 /* Send one can_frame to the network layer */
208 static void sllin_send_canfr(struct sllin *sl, canid_t id, char *data, int len)
215 if (cf.can_dlc > 0) {
216 memcpy(&cf.data, data, cf.can_dlc);
219 skb = dev_alloc_skb(sizeof(struct can_frame));
224 skb->protocol = htons(ETH_P_CAN);
225 skb->pkt_type = PACKET_BROADCAST;
226 skb->ip_summed = CHECKSUM_UNNECESSARY;
227 memcpy(skb_put(skb, sizeof(struct can_frame)),
228 &cf, sizeof(struct can_frame));
231 sl->dev->stats.rx_packets++;
232 sl->dev->stats.rx_bytes += cf.can_dlc;
236 * sll_bump() -- Send data of received LIN frame (existing in sl->rx_buff)
241 static void sll_bump(struct sllin *sl)
243 sllin_send_canfr(sl, sl->rx_buff[SLLIN_BUFF_ID] & LIN_ID_MASK,
244 sl->rx_buff + SLLIN_BUFF_DATA,
245 sl->rx_cnt - SLLIN_BUFF_DATA - 1); /* without checksum */
249 * Called by the driver when there's room for more data. If we have
250 * more packets to send, we send them here.
252 static void sllin_write_wakeup(struct tty_struct *tty)
256 struct sllin *sl = (struct sllin *) tty->disc_data;
258 /* First make sure we're connected. */
259 if (!sl || sl->magic != SLLIN_MAGIC || !netif_running(sl->dev))
262 if (sl->lin_state != SLSTATE_BREAK_SENT)
263 remains = sl->tx_lim - sl->tx_cnt;
265 remains = SLLIN_BUFF_BREAK + 1 - sl->tx_cnt;
268 actual = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt,
269 sl->tx_cnt - sl->tx_lim);
270 sl->tx_cnt += actual;
272 if (sl->tx_cnt < sl->tx_lim) {
273 pr_debug("sllin: sllin_write_wakeup sent %d, "
274 "remains %d, waiting\n",
275 sl->tx_cnt, sl->tx_lim - sl->tx_cnt);
280 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
281 set_bit(SLF_TXEVENT, &sl->flags);
282 wake_up(&sl->kwt_wq);
284 pr_debug("sllin: sllin_write_wakeup sent %d, wakeup\n", sl->tx_cnt);
288 * sll_xmit() -- Send a can_frame to a TTY queue.
290 * @skb: Pointer to Socket buffer to be sent.
291 * @dev: Network device where @skb will be sent.
293 static netdev_tx_t sll_xmit(struct sk_buff *skb, struct net_device *dev)
295 struct sllin *sl = netdev_priv(dev);
296 struct can_frame *cf;
298 if (skb->len != sizeof(struct can_frame))
301 spin_lock(&sl->lock);
302 if (!netif_running(dev)) {
303 printk(KERN_WARNING "%s: xmit: iface is down\n", dev->name);
306 if (sl->tty == NULL) {
310 cf = (struct can_frame *) skb->data;
311 if (cf->can_id & LIN_CTRL_FRAME) {
312 sllin_configure_frame_cache(sl, cf);
313 goto free_out_unlock;
316 netif_stop_queue(sl->dev);
318 sl->tx_req_skb = skb;
319 set_bit(SLF_MSGEVENT, &sl->flags);
320 wake_up(&sl->kwt_wq);
321 spin_unlock(&sl->lock);
326 spin_unlock(&sl->lock);
333 /******************************************
334 * Routines looking at netdevice side.
335 ******************************************/
337 /* Netdevice UP -> DOWN routine */
338 static int sll_close(struct net_device *dev)
340 struct sllin *sl = netdev_priv(dev);
342 spin_lock_bh(&sl->lock);
344 /* TTY discipline is running. */
345 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
347 netif_stop_queue(dev);
350 spin_unlock_bh(&sl->lock);
355 /* Netdevice DOWN -> UP routine */
356 static int sll_open(struct net_device *dev)
358 struct sllin *sl = netdev_priv(dev);
360 pr_debug("sllin: %s() invoked\n", __FUNCTION__);
365 sl->flags &= (1 << SLF_INUSE);
366 netif_start_queue(dev);
370 /* Hook the destructor so we can free sllin devs at the right point in time */
371 static void sll_free_netdev(struct net_device *dev)
373 int i = dev->base_addr;
375 sllin_devs[i] = NULL;
378 static const struct net_device_ops sll_netdev_ops = {
379 .ndo_open = sll_open,
380 .ndo_stop = sll_close,
381 .ndo_start_xmit = sll_xmit,
384 static void sll_setup(struct net_device *dev)
386 dev->netdev_ops = &sll_netdev_ops;
387 dev->destructor = sll_free_netdev;
389 dev->hard_header_len = 0;
391 dev->tx_queue_len = 10;
393 dev->mtu = sizeof(struct can_frame);
394 dev->type = ARPHRD_CAN;
396 /* New-style flags. */
397 dev->flags = IFF_NOARP;
398 dev->features = NETIF_F_NO_CSUM;
401 /******************************************
402 Routines looking at TTY side.
403 ******************************************/
405 static void sllin_receive_buf(struct tty_struct *tty,
406 const unsigned char *cp, char *fp, int count)
408 struct sllin *sl = (struct sllin *) tty->disc_data;
410 pr_debug("sllin: sllin_receive_buf invoked\n");
412 if (!sl || sl->magic != SLLIN_MAGIC || !netif_running(sl->dev))
415 /* Read the characters out of the buffer */
418 if (!test_and_set_bit(SLF_ERROR, &sl->flags))
419 sl->dev->stats.rx_errors++;
420 pr_debug("sllin: sllin_receive_buf char 0x%02x ignored "
421 "due marker 0x%02x, flags 0x%lx\n",
422 *cp, *(fp-1), sl->flags);
427 if (sl->rx_cnt < SLLIN_BUFF_LEN) {
428 #ifndef BREAK_BY_BAUD
429 /* We didn't receive Break character */
430 if ((sl->rx_cnt == SLLIN_BUFF_BREAK) && (*cp == 0x55)) {
431 sl->rx_buff[sl->rx_cnt++] = 0x00;
434 pr_debug("sllin: LIN_RX[%d]: 0x%02x\n", sl->rx_cnt, *cp);
435 sl->rx_buff[sl->rx_cnt++] = *cp++;
439 if (sl->rx_cnt >= sl->rx_expect) {
440 set_bit(SLF_RXEVENT, &sl->flags);
441 wake_up(&sl->kwt_wq);
442 pr_debug("sllin: sllin_receive_buf count %d, wakeup\n", sl->rx_cnt);
444 pr_debug("sllin: sllin_receive_buf count %d, waiting\n", sl->rx_cnt);
448 /*****************************************
449 * sllin message helper routines
450 *****************************************/
452 * sllin_report_error() -- Report an error by sending CAN frame
453 * with particular error flag set in can_id
456 * @err: Error flag to be sent.
458 void sllin_report_error(struct sllin *sl, int err)
461 case LIN_ERR_CHECKSUM:
462 sl->dev->stats.rx_crc_errors++;
465 case LIN_ERR_RX_TIMEOUT:
466 sl->dev->stats.rx_errors++;
470 sllin_send_canfr(sl, 0 | CAN_EFF_FLAG |
471 (err & ~LIN_ID_MASK), NULL, 0);
475 * sllin_configure_frame_cache() -- Configure particular entry in linfr_cache
478 * @cf: Pointer to CAN frame sent to this driver
479 * holding configuration information
481 static int sllin_configure_frame_cache(struct sllin *sl, struct can_frame *cf)
483 struct sllin_conf_entry *sce;
484 if (!(cf->can_id & LIN_ID_CONF))
487 sce = &sl->linfr_cache[cf->can_id & LIN_ID_MASK];
488 pr_debug("sllin: Setting frame cache with EFF CAN frame. "
489 "LIN ID = %d\n", cf->can_id & LIN_ID_MASK);
491 sce->dlc = cf->can_dlc;
492 if (sce->dlc > SLLIN_DATA_MAX)
493 sce->dlc = SLLIN_DATA_MAX;
495 sce->frame_fl = (cf->can_id & ~LIN_ID_MASK) & CAN_EFF_MASK;
496 memcpy(sce->data, cf->data, cf->can_dlc);
502 * sllin_checksum() -- Count checksum for particular data
504 * @data: Pointer to the buffer containing whole LIN
505 * frame (i.e. including break and sync bytes).
506 * @length: Length of the buffer.
507 * @enhanced_fl: Flag determining whether Enhanced or Classic
508 * checksum should be counted.
510 static inline unsigned sllin_checksum(unsigned char *data, int length, int enhanced_fl)
521 for (; i < length; i++) {
530 #define SLLIN_STPMSG_RESPONLY (1) /* Message will be LIN Response only */
531 #define SLLIN_STPMSG_CHCKSUM_CLS (1 << 1)
532 #define SLLIN_STPMSG_CHCKSUM_ENH (1 << 2)
534 int sllin_setup_msg(struct sllin *sl, int mode, int id,
535 unsigned char *data, int len)
537 if (id > LIN_ID_MASK)
540 if (!(mode & SLLIN_STPMSG_RESPONLY)) {
544 sl->rx_lim = SLLIN_BUFF_LEN;
547 sl->tx_buff[SLLIN_BUFF_BREAK] = 0;
548 sl->tx_buff[SLLIN_BUFF_SYNC] = 0x55;
549 sl->tx_buff[SLLIN_BUFF_ID] = id | sllin_id_parity_table[id];
550 sl->tx_lim = SLLIN_BUFF_DATA;
552 if ((data != NULL) && len) {
554 memcpy(sl->tx_buff + SLLIN_BUFF_DATA, data, len);
555 sl->tx_buff[sl->tx_lim++] = sllin_checksum(sl->tx_buff,
556 sl->tx_lim, mode & SLLIN_STPMSG_CHCKSUM_ENH);
559 sl->rx_lim = SLLIN_BUFF_DATA + len + 1;
565 int sllin_send_tx_buff(struct sllin *sl)
567 struct tty_struct *tty = sl->tty;
572 if (sl->lin_state != SLSTATE_BREAK_SENT)
573 remains = sl->tx_lim - sl->tx_cnt;
577 remains = sl->tx_lim - sl->tx_cnt;
580 res = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt, remains);
588 set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
589 res = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt, remains);
591 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
599 pr_debug("sllin: sllin_send_tx_buff sent %d, remains %d\n",
600 sl->tx_cnt, remains);
606 int sllin_send_break(struct sllin *sl)
608 struct tty_struct *tty = sl->tty;
609 unsigned long break_baud;
612 break_baud = ((sl->lin_baud * 2) / 3);
613 sltty_change_speed(tty, break_baud);
615 tty->ops->flush_buffer(tty);
616 sl->rx_cnt = SLLIN_BUFF_BREAK;
618 sl->rx_expect = SLLIN_BUFF_BREAK + 1;
619 sl->lin_state = SLSTATE_BREAK_SENT;
621 res = sllin_send_tx_buff(sl);
623 sl->lin_state = SLSTATE_IDLE;
629 #else /* BREAK_BY_BAUD */
631 int sllin_send_break(struct sllin *sl)
633 struct tty_struct *tty = sl->tty;
635 unsigned long break_baud;
636 unsigned long usleep_range_min;
637 unsigned long usleep_range_max;
639 break_baud = ((sl->lin_baud * 2) / 3);
640 sl->rx_cnt = SLLIN_BUFF_BREAK;
641 sl->rx_expect = SLLIN_BUFF_BREAK + 1;
642 sl->lin_state = SLSTATE_BREAK_SENT;
644 /* Do the break ourselves; Inspired by
645 http://lxr.linux.no/#linux+v3.1.2/drivers/tty/tty_io.c#L2452 */
646 retval = tty->ops->break_ctl(tty, -1);
651 usleep_range_min = (1000000l * SLLIN_SAMPLES_PER_CHAR) / break_baud;
652 usleep_range_max = usleep_range_min + 50;
653 usleep_range(usleep_range_min, usleep_range_max);
655 retval = tty->ops->break_ctl(tty, 0);
656 usleep_range_min = (1000000l * 1 /* 1 bit */) / break_baud;
657 usleep_range_max = usleep_range_min + 30;
658 usleep_range(usleep_range_min, usleep_range_max);
660 tty->ops->flush_buffer(tty);
662 sl->tx_cnt = SLLIN_BUFF_SYNC;
664 pr_debug("sllin: Break sent.\n");
665 set_bit(SLF_RXEVENT, &sl->flags);
666 wake_up(&sl->kwt_wq);
670 #endif /* BREAK_BY_BAUD */
673 static enum hrtimer_restart sllin_rx_timeout_handler(struct hrtimer *hrtimer)
675 struct sllin *sl = container_of(hrtimer, struct sllin, rx_timer);
677 sllin_report_error(sl, LIN_ERR_RX_TIMEOUT);
678 set_bit(SLF_TMOUTEVENT, &sl->flags);
679 wake_up(&sl->kwt_wq);
681 return HRTIMER_NORESTART;
685 * sllin_rx_validate() -- Validate received frame, i,e. check checksum
689 static int sllin_rx_validate(struct sllin *sl)
694 unsigned char rec_chcksm = sl->rx_buff[sl->rx_cnt - 1];
695 struct sllin_conf_entry *scf;
697 actual_id = sl->rx_buff[SLLIN_BUFF_ID] & LIN_ID_MASK;
698 scf = &sl->linfr_cache[actual_id];
700 ext_chcks_fl = scf->frame_fl & LIN_CHECKSUM_EXTENDED;
702 if (sllin_checksum(sl->rx_buff, sl->rx_cnt - 1, ext_chcks_fl) !=
705 /* Type of checksum is configured for particular frame */
709 if (sllin_checksum(sl->rx_buff, sl->rx_cnt - 1,
710 !ext_chcks_fl) != rec_chcksm) {
719 /*****************************************
720 * sllin_kwthread - kernel worker thread
721 *****************************************/
723 int sllin_kwthread(void *ptr)
725 struct sllin *sl = (struct sllin *)ptr;
726 struct tty_struct *tty = sl->tty;
727 struct sched_param schparam = { .sched_priority = 40 };
728 int tx_bytes = 0; /* Used for Network statistics */
731 pr_debug("sllin: sllin_kwthread started.\n");
732 sched_setscheduler(current, SCHED_FIFO, &schparam);
734 clear_bit(SLF_ERROR, &sl->flags);
735 sltty_change_speed(tty, sl->lin_baud);
737 while (!kthread_should_stop()) {
738 struct can_frame *cf;
741 u8 lin_data_buff[SLLIN_DATA_MAX];
744 if ((sl->lin_state == SLSTATE_IDLE) && sl->lin_master &&
746 if(sllin_send_break(sl) < 0) {
747 /* error processing */
751 wait_event_killable(sl->kwt_wq, kthread_should_stop() ||
752 test_bit(SLF_RXEVENT, &sl->flags) ||
753 test_bit(SLF_TXEVENT, &sl->flags) ||
754 test_bit(SLF_TMOUTEVENT, &sl->flags) ||
755 (((sl->lin_state == SLSTATE_IDLE) ||
756 (sl->lin_state == SLSTATE_RESPONSE_WAIT))
757 && test_bit(SLF_MSGEVENT, &sl->flags)));
759 if (test_and_clear_bit(SLF_RXEVENT, &sl->flags)) {
760 pr_debug("sllin: sllin_kthread RXEVENT\n");
763 if (test_and_clear_bit(SLF_TXEVENT, &sl->flags)) {
764 pr_debug("sllin: sllin_kthread TXEVENT\n");
767 if (test_and_clear_bit(SLF_TMOUTEVENT, &sl->flags)) {
768 pr_debug("sllin: sllin_kthread TMOUTEVENT\n");
771 sl->rx_lim = sl->lin_master ? 0 : SLLIN_BUFF_LEN;
774 sl->id_to_send = false;
775 sl->data_to_send = false;
777 sl->lin_state = SLSTATE_IDLE;
780 switch (sl->lin_state) {
782 if (!test_bit(SLF_MSGEVENT, &sl->flags))
785 cf = (struct can_frame *)sl->tx_req_skb->data;
787 /* SFF RTR CAN frame -> LIN header */
788 if (cf->can_id & CAN_RTR_FLAG) {
789 spin_lock(&sl->lock);
790 pr_debug("sllin: %s: RTR SFF CAN frame, ID = %x\n",
791 __FUNCTION__, cf->can_id & LIN_ID_MASK);
793 /* Is there Slave response in linfr_cache to be sent? */
794 if ((sl->linfr_cache[cf->can_id & LIN_ID_MASK].frame_fl &
796 && (sl->linfr_cache[cf->can_id & LIN_ID_MASK].dlc > 0)) {
798 pr_debug("sllin: Sending LIN response from linfr_cache\n");
799 lin_data = sl->linfr_cache[cf->can_id & LIN_ID_MASK].data;
800 lin_dlc = sl->linfr_cache[cf->can_id & LIN_ID_MASK].dlc;
801 if (lin_dlc > SLLIN_DATA_MAX)
802 lin_dlc = SLLIN_DATA_MAX;
803 memcpy(lin_data_buff, lin_data, lin_dlc);
804 lin_data = lin_data_buff;
807 lin_dlc = sl->linfr_cache[cf->can_id & LIN_ID_MASK].dlc;
809 spin_unlock(&sl->lock);
810 } else { /* SFF NON-RTR CAN frame -> LIN header + LIN response */
811 pr_debug("sllin: %s: NON-RTR SFF CAN frame, ID = %x\n",
812 __FUNCTION__, (int)cf->can_id & LIN_ID_MASK);
815 lin_dlc = cf->can_dlc;
816 if (lin_dlc > SLLIN_DATA_MAX)
817 lin_dlc = SLLIN_DATA_MAX;
821 if (sllin_setup_msg(sl, 0, cf->can_id & LIN_ID_MASK,
822 lin_data, lin_dlc) != -1) {
824 sl->id_to_send = true;
825 sl->data_to_send = (lin_data != NULL) ? true : false;
826 sl->resp_len_known = (lin_dlc > 0) ? true : false;
827 sl->dev->stats.tx_packets++;
828 sl->dev->stats.tx_bytes += tx_bytes;
831 clear_bit(SLF_MSGEVENT, &sl->flags);
832 kfree_skb(sl->tx_req_skb);
833 netif_wake_queue(sl->dev);
834 hrtimer_start(&sl->rx_timer,
835 ktime_add(ktime_get(), sl->rx_timer_timeout),
839 case SLSTATE_BREAK_SENT:
841 if (sl->rx_cnt <= SLLIN_BUFF_BREAK)
844 res = sltty_change_speed(tty, sl->lin_baud);
847 sl->lin_state = SLSTATE_ID_SENT;
848 sllin_send_tx_buff(sl);
851 case SLSTATE_ID_SENT:
852 hrtimer_cancel(&sl->rx_timer);
853 sl->id_to_send = false;
854 if (sl->data_to_send) {
855 sllin_send_tx_buff(sl);
856 sl->lin_state = SLSTATE_RESPONSE_SENT;
857 sl->rx_expect = sl->tx_lim;
858 goto slstate_response_sent;
860 if (sl->resp_len_known) {
861 sl->rx_expect = sl->rx_lim;
863 sl->rx_expect = SLLIN_BUFF_DATA + 2;
865 sl->lin_state = SLSTATE_RESPONSE_WAIT;
866 /* If we don't receive anything, timer will "unblock" us */
867 hrtimer_start(&sl->rx_timer,
868 ktime_add(ktime_get(), sl->rx_timer_timeout),
870 goto slstate_response_wait;
874 case SLSTATE_RESPONSE_WAIT:
875 slstate_response_wait:
876 if (test_bit(SLF_MSGEVENT, &sl->flags)) {
877 unsigned char *lin_buff;
878 cf = (struct can_frame *)sl->tx_req_skb->data;
880 lin_buff = (sl->lin_master) ? sl->tx_buff : sl->rx_buff;
881 if (cf->can_id == (lin_buff[SLLIN_BUFF_ID] & LIN_ID_MASK)) {
882 hrtimer_cancel(&sl->rx_timer);
883 pr_debug("sllin: received LIN response in a CAN frame.\n");
884 if (sllin_setup_msg(sl, SLLIN_STPMSG_RESPONLY,
885 cf->can_id & LIN_ID_MASK,
886 cf->data, cf->can_dlc) != -1) {
888 sl->rx_expect = sl->tx_lim;
889 sl->data_to_send = true;
890 sl->dev->stats.tx_packets++;
891 sl->dev->stats.tx_bytes += tx_bytes;
893 if (!sl->lin_master) {
894 sl->tx_cnt = SLLIN_BUFF_DATA;
897 sllin_send_tx_buff(sl);
898 clear_bit(SLF_MSGEVENT, &sl->flags);
899 kfree_skb(sl->tx_req_skb);
900 netif_wake_queue(sl->dev);
902 sl->lin_state = SLSTATE_RESPONSE_SENT;
903 goto slstate_response_sent;
906 sl->lin_state = SLSTATE_RESPONSE_WAIT_BUS;
910 /* Be aware, no BREAK here */
911 case SLSTATE_RESPONSE_WAIT_BUS:
912 if (sl->rx_cnt < sl->rx_expect)
915 hrtimer_cancel(&sl->rx_timer);
916 pr_debug("sllin: response received ID %d len %d\n",
917 sl->rx_buff[SLLIN_BUFF_ID], sl->rx_cnt - SLLIN_BUFF_DATA - 1);
919 if (sllin_rx_validate(sl) == -1) {
920 pr_debug("sllin: RX validation failed.\n");
921 sllin_report_error(sl, LIN_ERR_CHECKSUM);
923 /* Send CAN non-RTR frame with data */
924 pr_debug("sllin: sending NON-RTR CAN"
925 "frame with LIN payload.");
926 sll_bump(sl); /* send packet to the network layer */
929 sl->id_to_send = false;
930 sl->lin_state = SLSTATE_IDLE;
933 case SLSTATE_RESPONSE_SENT:
934 slstate_response_sent:
935 if (sl->rx_cnt < sl->tx_lim)
938 sll_bump(sl); /* send packet to the network layer */
939 pr_debug("sllin: response sent ID %d len %d\n",
940 sl->rx_buff[SLLIN_BUFF_ID], sl->rx_cnt - SLLIN_BUFF_DATA - 1);
942 sl->id_to_send = false;
943 sl->lin_state = SLSTATE_IDLE;
948 hrtimer_cancel(&sl->rx_timer);
949 pr_debug("sllin: sllin_kwthread stopped.\n");
955 /************************************
956 * sllin_open helper routines.
957 ************************************/
959 /* Collect hanged up channels */
960 static void sll_sync(void)
963 struct net_device *dev;
966 for (i = 0; i < maxdev; i++) {
971 sl = netdev_priv(dev);
974 if (dev->flags & IFF_UP)
979 /* Find a free SLLIN channel, and link in this `tty' line. */
980 static struct sllin *sll_alloc(dev_t line)
983 struct net_device *dev = NULL;
986 if (sllin_devs == NULL)
987 return NULL; /* Master array missing ! */
989 for (i = 0; i < maxdev; i++) {
996 /* Sorry, too many, all slots in use */
1001 sl = netdev_priv(dev);
1002 if (test_bit(SLF_INUSE, &sl->flags)) {
1003 unregister_netdevice(dev);
1005 sllin_devs[i] = NULL;
1010 char name[IFNAMSIZ];
1011 sprintf(name, "sllin%d", i);
1013 dev = alloc_netdev(sizeof(*sl), name, sll_setup);
1019 sl = netdev_priv(dev);
1020 /* Initialize channel control data */
1021 sl->magic = SLLIN_MAGIC;
1023 spin_lock_init(&sl->lock);
1024 sllin_devs[i] = dev;
1030 * Open the high-level part of the SLLIN channel.
1031 * This function is called by the TTY module when the
1032 * SLLIN line discipline is called for. Because we are
1033 * sure the tty line exists, we only have to link it to
1034 * a free SLLIN channel...
1036 * Called in process context serialized from other ldisc calls.
1039 static int sllin_open(struct tty_struct *tty)
1043 pr_debug("sllin: %s() invoked\n", __FUNCTION__);
1045 if (!capable(CAP_NET_ADMIN))
1048 if (tty->ops->write == NULL)
1051 /* RTnetlink lock is misused here to serialize concurrent
1052 opens of sllin channels. There are better ways, but it is
1057 /* Collect hanged up channels. */
1060 sl = tty->disc_data;
1063 /* First make sure we're not already connected. */
1064 if (sl && sl->magic == SLLIN_MAGIC)
1067 /* OK. Find a free SLLIN channel to use. */
1069 sl = sll_alloc(tty_devnum(tty));
1074 tty->disc_data = sl;
1075 sl->line = tty_devnum(tty);
1077 if (!test_bit(SLF_INUSE, &sl->flags)) {
1078 /* Perform the low-level SLLIN initialization. */
1079 sl->lin_master = true;
1083 sl->rx_lim = sl->lin_master ? 0 : SLLIN_BUFF_LEN;
1086 sl->id_to_send = false;
1087 sl->data_to_send = false;
1089 sl->lin_baud = 19200;
1091 sl->lin_state = SLSTATE_IDLE;
1093 hrtimer_init(&sl->rx_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
1094 sl->rx_timer.function = sllin_rx_timeout_handler;
1095 /* timeval_to_ktime(msg_head->ival1); */
1096 sl->rx_timer_timeout = ns_to_ktime(
1097 (1000000000l / sl->lin_baud) *
1098 SLLIN_SAMPLES_PER_CHAR * SLLIN_CHARS_TO_TIMEOUT);
1100 set_bit(SLF_INUSE, &sl->flags);
1102 init_waitqueue_head(&sl->kwt_wq);
1103 sl->kwthread = kthread_run(sllin_kwthread, sl, "sllin");
1104 if (sl->kwthread == NULL)
1107 err = register_netdevice(sl->dev);
1109 goto err_free_chan_and_thread;
1112 /* Done. We have linked the TTY line to a channel. */
1114 tty->receive_room = SLLIN_BUFF_LEN * 40; /* We don't flow control */
1116 /* TTY layer expects 0 on success */
1119 err_free_chan_and_thread:
1120 kthread_stop(sl->kwthread);
1121 sl->kwthread = NULL;
1125 tty->disc_data = NULL;
1126 clear_bit(SLF_INUSE, &sl->flags);
1131 /* Count references from TTY module */
1136 * Close down a SLLIN channel.
1137 * This means flushing out any pending queues, and then returning. This
1138 * call is serialized against other ldisc functions.
1140 * We also use this method for a hangup event.
1143 static void sllin_close(struct tty_struct *tty)
1145 struct sllin *sl = (struct sllin *) tty->disc_data;
1147 /* First make sure we're connected. */
1148 if (!sl || sl->magic != SLLIN_MAGIC || sl->tty != tty)
1151 kthread_stop(sl->kwthread);
1152 sl->kwthread = NULL;
1154 tty->disc_data = NULL;
1157 /* Flush network side */
1158 unregister_netdev(sl->dev);
1159 /* This will complete via sl_free_netdev */
1162 static int sllin_hangup(struct tty_struct *tty)
1168 /* Perform I/O control on an active SLLIN channel. */
1169 static int sllin_ioctl(struct tty_struct *tty, struct file *file,
1170 unsigned int cmd, unsigned long arg)
1172 struct sllin *sl = (struct sllin *) tty->disc_data;
1175 /* First make sure we're connected. */
1176 if (!sl || sl->magic != SLLIN_MAGIC)
1181 tmp = strlen(sl->dev->name) + 1;
1182 if (copy_to_user((void __user *)arg, sl->dev->name, tmp))
1190 return tty_mode_ioctl(tty, file, cmd, arg);
1194 static struct tty_ldisc_ops sll_ldisc = {
1195 .owner = THIS_MODULE,
1196 .magic = TTY_LDISC_MAGIC,
1199 .close = sllin_close,
1200 .hangup = sllin_hangup,
1201 .ioctl = sllin_ioctl,
1202 .receive_buf = sllin_receive_buf,
1203 .write_wakeup = sllin_write_wakeup,
1206 static int __init sllin_init(void)
1211 maxdev = 4; /* Sanity */
1214 pr_debug("sllin: %d dynamic interface channels.\n", maxdev);
1216 sllin_devs = kzalloc(sizeof(struct net_device *)*maxdev, GFP_KERNEL);
1218 printk(KERN_ERR "sllin: can't allocate sllin device array!\n");
1222 /* Fill in our line protocol discipline, and register it */
1223 status = tty_register_ldisc(N_SLLIN, &sll_ldisc);
1225 printk(KERN_ERR "sllin: can't register line discipline\n");
1229 #ifdef BREAK_BY_BAUD
1230 pr_debug("sllin: Break is generated by baud-rate change.");
1232 pr_debug("sllin: Break is generated manually with tiny sleep.");
1238 static void __exit sllin_exit(void)
1241 struct net_device *dev;
1243 unsigned long timeout = jiffies + HZ;
1246 if (sllin_devs == NULL)
1249 /* First of all: check for active disciplines and hangup them.
1253 msleep_interruptible(100);
1256 for (i = 0; i < maxdev; i++) {
1257 dev = sllin_devs[i];
1260 sl = netdev_priv(dev);
1261 spin_lock_bh(&sl->lock);
1264 tty_hangup(sl->tty);
1266 spin_unlock_bh(&sl->lock);
1268 } while (busy && time_before(jiffies, timeout));
1270 /* FIXME: hangup is async so we should wait when doing this second
1273 for (i = 0; i < maxdev; i++) {
1274 dev = sllin_devs[i];
1277 sllin_devs[i] = NULL;
1279 sl = netdev_priv(dev);
1281 printk(KERN_ERR "%s: tty discipline still running\n",
1283 /* Intentionally leak the control block. */
1284 dev->destructor = NULL;
1287 unregister_netdev(dev);
1293 i = tty_unregister_ldisc(N_SLLIN);
1295 printk(KERN_ERR "sllin: can't unregister ldisc (err %d)\n", i);
1298 module_init(sllin_init);
1299 module_exit(sllin_exit);