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;
238 * sll_bump() -- Send data of received LIN frame (existing in sl->rx_buff)
243 static void sll_bump(struct sllin *sl)
245 sllin_send_canfr(sl, sl->rx_buff[SLLIN_BUFF_ID] & LIN_ID_MASK,
246 sl->rx_buff + SLLIN_BUFF_DATA,
247 sl->rx_cnt - SLLIN_BUFF_DATA - 1); /* without checksum */
251 * Called by the driver when there's room for more data. If we have
252 * more packets to send, we send them here.
254 static void sllin_write_wakeup(struct tty_struct *tty)
258 struct sllin *sl = (struct sllin *) tty->disc_data;
260 /* First make sure we're connected. */
261 if (!sl || sl->magic != SLLIN_MAGIC || !netif_running(sl->dev))
264 if (sl->lin_state != SLSTATE_BREAK_SENT)
265 remains = sl->tx_lim - sl->tx_cnt;
267 remains = SLLIN_BUFF_BREAK + 1 - sl->tx_cnt;
270 actual = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt,
271 sl->tx_cnt - sl->tx_lim);
272 sl->tx_cnt += actual;
274 if (sl->tx_cnt < sl->tx_lim) {
275 pr_debug("sllin: sllin_write_wakeup sent %d, "
276 "remains %d, waiting\n",
277 sl->tx_cnt, sl->tx_lim - sl->tx_cnt);
282 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
283 set_bit(SLF_TXEVENT, &sl->flags);
284 wake_up(&sl->kwt_wq);
286 pr_debug("sllin: sllin_write_wakeup sent %d, wakeup\n", sl->tx_cnt);
290 * sll_xmit() -- Send a can_frame to a TTY queue.
292 * @skb: Pointer to Socket buffer to be sent.
293 * @dev: Network device where @skb will be sent.
295 static netdev_tx_t sll_xmit(struct sk_buff *skb, struct net_device *dev)
297 struct sllin *sl = netdev_priv(dev);
298 struct can_frame *cf;
300 if (skb->len != sizeof(struct can_frame))
303 spin_lock(&sl->lock);
304 if (!netif_running(dev)) {
305 printk(KERN_WARNING "%s: xmit: iface is down\n", dev->name);
308 if (sl->tty == NULL) {
312 cf = (struct can_frame *) skb->data;
313 if (cf->can_id & LIN_CTRL_FRAME) {
314 sllin_configure_frame_cache(sl, cf);
315 goto free_out_unlock;
318 netif_stop_queue(sl->dev);
320 sl->tx_req_skb = skb;
321 set_bit(SLF_MSGEVENT, &sl->flags);
322 wake_up(&sl->kwt_wq);
323 spin_unlock(&sl->lock);
328 spin_unlock(&sl->lock);
335 /******************************************
336 * Routines looking at netdevice side.
337 ******************************************/
339 /* Netdevice UP -> DOWN routine */
340 static int sll_close(struct net_device *dev)
342 struct sllin *sl = netdev_priv(dev);
344 spin_lock_bh(&sl->lock);
346 /* TTY discipline is running. */
347 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
349 netif_stop_queue(dev);
352 spin_unlock_bh(&sl->lock);
357 /* Netdevice DOWN -> UP routine */
358 static int sll_open(struct net_device *dev)
360 struct sllin *sl = netdev_priv(dev);
362 pr_debug("sllin: %s() invoked\n", __FUNCTION__);
367 sl->flags &= (1 << SLF_INUSE);
368 netif_start_queue(dev);
372 /* Hook the destructor so we can free sllin devs at the right point in time */
373 static void sll_free_netdev(struct net_device *dev)
375 int i = dev->base_addr;
377 sllin_devs[i] = NULL;
380 static const struct net_device_ops sll_netdev_ops = {
381 .ndo_open = sll_open,
382 .ndo_stop = sll_close,
383 .ndo_start_xmit = sll_xmit,
386 static void sll_setup(struct net_device *dev)
388 dev->netdev_ops = &sll_netdev_ops;
389 dev->destructor = sll_free_netdev;
391 dev->hard_header_len = 0;
393 dev->tx_queue_len = 10;
395 dev->mtu = sizeof(struct can_frame);
396 dev->type = ARPHRD_CAN;
398 /* New-style flags. */
399 dev->flags = IFF_NOARP;
400 dev->features = NETIF_F_NO_CSUM;
403 /******************************************
404 Routines looking at TTY side.
405 ******************************************/
407 static void sllin_receive_buf(struct tty_struct *tty,
408 const unsigned char *cp, char *fp, int count)
410 struct sllin *sl = (struct sllin *) tty->disc_data;
412 pr_debug("sllin: sllin_receive_buf invoked\n");
414 if (!sl || sl->magic != SLLIN_MAGIC || !netif_running(sl->dev))
417 /* Read the characters out of the buffer */
420 if (!test_and_set_bit(SLF_ERROR, &sl->flags))
421 sl->dev->stats.rx_errors++;
422 pr_debug("sllin: sllin_receive_buf char 0x%02x ignored "
423 "due marker 0x%02x, flags 0x%lx\n",
424 *cp, *(fp-1), sl->flags);
429 if (sl->rx_cnt < SLLIN_BUFF_LEN) {
430 #ifndef BREAK_BY_BAUD
431 /* We didn't receive Break character */
432 if ((sl->rx_cnt == SLLIN_BUFF_BREAK) && (*cp == 0x55)) {
433 sl->rx_buff[sl->rx_cnt++] = 0x00;
436 pr_debug("sllin: LIN_RX[%d]: 0x%02x\n", sl->rx_cnt, *cp);
437 sl->rx_buff[sl->rx_cnt++] = *cp++;
441 if (sl->rx_cnt >= sl->rx_expect) {
442 set_bit(SLF_RXEVENT, &sl->flags);
443 wake_up(&sl->kwt_wq);
444 pr_debug("sllin: sllin_receive_buf count %d, wakeup\n", sl->rx_cnt);
446 pr_debug("sllin: sllin_receive_buf count %d, waiting\n", sl->rx_cnt);
450 /*****************************************
451 * sllin message helper routines
452 *****************************************/
454 * sllin_report_error() -- Report an error by sending CAN frame
455 * with particular error flag set in can_id
458 * @err: Error flag to be sent.
460 void sllin_report_error(struct sllin *sl, int err)
462 sllin_send_canfr(sl, 0 | CAN_EFF_FLAG |
463 (err & ~LIN_ID_MASK), NULL, 0);
467 * sllin_configure_frame_cache() -- Configure particular entry in linfr_cache
470 * @cf: Pointer to CAN frame sent to this driver
471 * holding configuration information
473 static int sllin_configure_frame_cache(struct sllin *sl, struct can_frame *cf)
475 struct sllin_conf_entry *sce;
476 if (!(cf->can_id & LIN_ID_CONF))
479 sce = &sl->linfr_cache[cf->can_id & LIN_ID_MASK];
480 pr_debug("sllin: Setting frame cache with EFF CAN frame. "
481 "LIN ID = %d\n", cf->can_id & LIN_ID_MASK);
483 sce->dlc = cf->can_dlc;
484 if (sce->dlc > SLLIN_DATA_MAX)
485 sce->dlc = SLLIN_DATA_MAX;
487 sce->frame_fl = (cf->can_id & ~LIN_ID_MASK) & CAN_EFF_MASK;
488 memcpy(sce->data, cf->data, cf->can_dlc);
494 * sllin_checksum() -- Count checksum for particular data
496 * @data: Pointer to the buffer containing whole LIN
497 * frame (i.e. including break and sync bytes).
498 * @length: Length of the buffer.
499 * @enhanced_fl: Flag determining whether Enhanced or Classic
500 * checksum should be counted.
502 static inline unsigned sllin_checksum(unsigned char *data, int length, int enhanced_fl)
513 for (; i < length; i++) {
522 #define SLLIN_STPMSG_RESPONLY (1) /* Message will be LIN Response only */
523 #define SLLIN_STPMSG_CHCKSUM_CLS (1 << 1)
524 #define SLLIN_STPMSG_CHCKSUM_ENH (1 << 2)
526 int sllin_setup_msg(struct sllin *sl, int mode, int id,
527 unsigned char *data, int len)
529 if (id > LIN_ID_MASK)
532 if (!(mode & SLLIN_STPMSG_RESPONLY)) {
536 sl->rx_lim = SLLIN_BUFF_LEN;
539 sl->tx_buff[SLLIN_BUFF_BREAK] = 0;
540 sl->tx_buff[SLLIN_BUFF_SYNC] = 0x55;
541 sl->tx_buff[SLLIN_BUFF_ID] = id | sllin_id_parity_table[id];
542 sl->tx_lim = SLLIN_BUFF_DATA;
544 if ((data != NULL) && len) {
546 memcpy(sl->tx_buff + SLLIN_BUFF_DATA, data, len);
547 sl->tx_buff[sl->tx_lim++] = sllin_checksum(sl->tx_buff,
548 sl->tx_lim, mode & SLLIN_STPMSG_CHCKSUM_ENH);
551 sl->rx_lim = SLLIN_BUFF_DATA + len + 1;
557 int sllin_send_tx_buff(struct sllin *sl)
559 struct tty_struct *tty = sl->tty;
564 if (sl->lin_state != SLSTATE_BREAK_SENT)
565 remains = sl->tx_lim - sl->tx_cnt;
569 remains = sl->tx_lim - sl->tx_cnt;
572 res = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt, remains);
580 set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
581 res = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt, remains);
583 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
591 pr_debug("sllin: sllin_send_tx_buff sent %d, remains %d\n",
592 sl->tx_cnt, remains);
598 int sllin_send_break(struct sllin *sl)
600 struct tty_struct *tty = sl->tty;
601 unsigned long break_baud;
604 break_baud = ((sl->lin_baud * 2) / 3);
605 sltty_change_speed(tty, break_baud);
607 tty->ops->flush_buffer(tty);
608 sl->rx_cnt = SLLIN_BUFF_BREAK;
610 sl->rx_expect = SLLIN_BUFF_BREAK + 1;
611 sl->lin_state = SLSTATE_BREAK_SENT;
613 res = sllin_send_tx_buff(sl);
615 sl->lin_state = SLSTATE_IDLE;
621 #else /* BREAK_BY_BAUD */
623 int sllin_send_break(struct sllin *sl)
625 struct tty_struct *tty = sl->tty;
627 unsigned long break_baud;
628 unsigned long usleep_range_min;
629 unsigned long usleep_range_max;
631 break_baud = ((sl->lin_baud * 2) / 3);
632 sl->rx_cnt = SLLIN_BUFF_BREAK;
633 sl->rx_expect = SLLIN_BUFF_BREAK + 1;
634 sl->lin_state = SLSTATE_BREAK_SENT;
636 /* Do the break ourselves; Inspired by
637 http://lxr.linux.no/#linux+v3.1.2/drivers/tty/tty_io.c#L2452 */
638 retval = tty->ops->break_ctl(tty, -1);
643 usleep_range_min = (1000000l * SLLIN_SAMPLES_PER_CHAR) / break_baud;
644 usleep_range_max = usleep_range_min + 50;
645 usleep_range(usleep_range_min, usleep_range_max);
647 retval = tty->ops->break_ctl(tty, 0);
648 usleep_range_min = (1000000l * 1 /* 1 bit */) / break_baud;
649 usleep_range_max = usleep_range_min + 30;
650 usleep_range(usleep_range_min, usleep_range_max);
652 tty->ops->flush_buffer(tty);
654 sl->tx_cnt = SLLIN_BUFF_SYNC;
656 pr_debug("sllin: Break sent.\n");
657 set_bit(SLF_RXEVENT, &sl->flags);
658 wake_up(&sl->kwt_wq);
662 #endif /* BREAK_BY_BAUD */
665 static enum hrtimer_restart sllin_rx_timeout_handler(struct hrtimer *hrtimer)
667 struct sllin *sl = container_of(hrtimer, struct sllin, rx_timer);
669 sllin_report_error(sl, LIN_ERR_RX_TIMEOUT);
670 set_bit(SLF_TMOUTEVENT, &sl->flags);
671 wake_up(&sl->kwt_wq);
673 return HRTIMER_NORESTART;
677 * sllin_rx_validate() -- Validate received frame, i,e. check checksum
681 static int sllin_rx_validate(struct sllin *sl)
686 unsigned char rec_chcksm = sl->rx_buff[sl->rx_cnt - 1];
687 struct sllin_conf_entry *scf;
689 actual_id = sl->rx_buff[SLLIN_BUFF_ID] & LIN_ID_MASK;
690 scf = &sl->linfr_cache[actual_id];
692 ext_chcks_fl = scf->frame_fl & LIN_CHECKSUM_EXTENDED;
694 if (sllin_checksum(sl->rx_buff, sl->rx_cnt - 1, ext_chcks_fl) !=
697 /* Type of checksum is configured for particular frame */
701 if (sllin_checksum(sl->rx_buff, sl->rx_cnt - 1,
702 !ext_chcks_fl) != rec_chcksm) {
711 /*****************************************
712 * sllin_kwthread - kernel worker thread
713 *****************************************/
715 int sllin_kwthread(void *ptr)
717 struct sllin *sl = (struct sllin *)ptr;
718 struct tty_struct *tty = sl->tty;
719 struct sched_param schparam = { .sched_priority = 40 };
720 int tx_bytes = 0; /* Used for Network statistics */
723 pr_debug("sllin: sllin_kwthread started.\n");
724 sched_setscheduler(current, SCHED_FIFO, &schparam);
726 clear_bit(SLF_ERROR, &sl->flags);
727 sltty_change_speed(tty, sl->lin_baud);
729 while (!kthread_should_stop()) {
730 struct can_frame *cf;
733 u8 lin_data_buff[SLLIN_DATA_MAX];
736 if ((sl->lin_state == SLSTATE_IDLE) && sl->lin_master &&
738 if(sllin_send_break(sl) < 0) {
739 /* error processing */
743 wait_event_killable(sl->kwt_wq, kthread_should_stop() ||
744 test_bit(SLF_RXEVENT, &sl->flags) ||
745 test_bit(SLF_TXEVENT, &sl->flags) ||
746 test_bit(SLF_TMOUTEVENT, &sl->flags) ||
747 (((sl->lin_state == SLSTATE_IDLE) ||
748 (sl->lin_state == SLSTATE_RESPONSE_WAIT))
749 && test_bit(SLF_MSGEVENT, &sl->flags)));
751 if (test_and_clear_bit(SLF_RXEVENT, &sl->flags)) {
752 pr_debug("sllin: sllin_kthread RXEVENT\n");
755 if (test_and_clear_bit(SLF_TXEVENT, &sl->flags)) {
756 pr_debug("sllin: sllin_kthread TXEVENT\n");
759 if (test_and_clear_bit(SLF_TMOUTEVENT, &sl->flags)) {
760 pr_debug("sllin: sllin_kthread TMOUTEVENT\n");
763 sl->rx_lim = sl->lin_master ? 0 : SLLIN_BUFF_LEN;
766 sl->id_to_send = false;
767 sl->data_to_send = false;
769 sl->lin_state = SLSTATE_IDLE;
772 switch (sl->lin_state) {
774 if (!test_bit(SLF_MSGEVENT, &sl->flags))
777 cf = (struct can_frame *)sl->tx_req_skb->data;
779 /* SFF RTR CAN frame -> LIN header */
780 if (cf->can_id & CAN_RTR_FLAG) {
781 spin_lock(&sl->lock);
782 pr_debug("sllin: %s: RTR SFF CAN frame, ID = %x\n",
783 __FUNCTION__, cf->can_id & LIN_ID_MASK);
785 /* Is there Slave response in linfr_cache to be sent? */
786 if ((sl->linfr_cache[cf->can_id & LIN_ID_MASK].frame_fl &
788 && (sl->linfr_cache[cf->can_id & LIN_ID_MASK].dlc > 0)) {
790 pr_debug("sllin: Sending LIN response from linfr_cache\n");
791 lin_data = sl->linfr_cache[cf->can_id & LIN_ID_MASK].data;
792 lin_dlc = sl->linfr_cache[cf->can_id & LIN_ID_MASK].dlc;
793 if (lin_dlc > SLLIN_DATA_MAX)
794 lin_dlc = SLLIN_DATA_MAX;
795 memcpy(lin_data_buff, lin_data, lin_dlc);
796 lin_data = lin_data_buff;
799 lin_dlc = sl->linfr_cache[cf->can_id & LIN_ID_MASK].dlc;
801 spin_unlock(&sl->lock);
802 } else { /* SFF NON-RTR CAN frame -> LIN header + LIN response */
803 pr_debug("sllin: %s: NON-RTR SFF CAN frame, ID = %x\n",
804 __FUNCTION__, (int)cf->can_id & LIN_ID_MASK);
807 lin_dlc = cf->can_dlc;
808 if (lin_dlc > SLLIN_DATA_MAX)
809 lin_dlc = SLLIN_DATA_MAX;
813 if (sllin_setup_msg(sl, 0, cf->can_id & LIN_ID_MASK,
814 lin_data, lin_dlc) != -1) {
816 sl->id_to_send = true;
817 sl->data_to_send = (lin_data != NULL) ? true : false;
818 sl->resp_len_known = (lin_dlc > 0) ? true : false;
819 sl->dev->stats.tx_packets++;
820 sl->dev->stats.tx_bytes += tx_bytes;
823 clear_bit(SLF_MSGEVENT, &sl->flags);
824 kfree_skb(sl->tx_req_skb);
825 netif_wake_queue(sl->dev);
828 case SLSTATE_BREAK_SENT:
830 if (sl->rx_cnt <= SLLIN_BUFF_BREAK)
833 res = sltty_change_speed(tty, sl->lin_baud);
836 sl->lin_state = SLSTATE_ID_SENT;
837 sllin_send_tx_buff(sl);
840 case SLSTATE_ID_SENT:
841 sl->id_to_send = false;
842 if (sl->data_to_send) {
843 sllin_send_tx_buff(sl);
844 sl->lin_state = SLSTATE_RESPONSE_SENT;
845 sl->rx_expect = sl->tx_lim;
846 goto slstate_response_sent;
848 if (sl->resp_len_known) {
849 sl->rx_expect = sl->rx_lim;
851 sl->rx_expect = SLLIN_BUFF_DATA + 2;
853 sl->lin_state = SLSTATE_RESPONSE_WAIT;
854 /* If we don't receive anything, timer will "unblock" us */
855 hrtimer_start(&sl->rx_timer,
856 ktime_add(ktime_get(), sl->rx_timer_timeout),
858 goto slstate_response_wait;
862 case SLSTATE_RESPONSE_WAIT:
863 slstate_response_wait:
864 if (test_bit(SLF_MSGEVENT, &sl->flags)) {
865 unsigned char *lin_buff;
866 cf = (struct can_frame *)sl->tx_req_skb->data;
868 lin_buff = (sl->lin_master) ? sl->tx_buff : sl->rx_buff;
869 if (cf->can_id == (lin_buff[SLLIN_BUFF_ID] & LIN_ID_MASK)) {
870 if (sllin_setup_msg(sl, SLLIN_STPMSG_RESPONLY,
871 cf->can_id & LIN_ID_MASK,
872 cf->data, cf->can_dlc) != -1) {
874 sl->rx_expect = sl->tx_lim;
875 sl->data_to_send = true;
876 sl->dev->stats.tx_packets++;
877 sl->dev->stats.tx_bytes += tx_bytes;
879 if (!sl->lin_master) {
880 sl->tx_cnt = SLLIN_BUFF_DATA;
883 sllin_send_tx_buff(sl);
884 clear_bit(SLF_MSGEVENT, &sl->flags);
885 kfree_skb(sl->tx_req_skb);
886 netif_wake_queue(sl->dev);
888 sl->lin_state = SLSTATE_RESPONSE_SENT;
889 goto slstate_response_sent;
892 sl->lin_state = SLSTATE_RESPONSE_WAIT_BUS;
896 /* Be aware, no BREAK here */
897 case SLSTATE_RESPONSE_WAIT_BUS:
898 if (sl->rx_cnt < sl->rx_expect)
901 hrtimer_cancel(&sl->rx_timer);
902 pr_debug("sllin: response received ID %d len %d\n",
903 sl->rx_buff[SLLIN_BUFF_ID], sl->rx_cnt - SLLIN_BUFF_DATA - 1);
905 if (sllin_rx_validate(sl) == -1) {
906 pr_debug("sllin: RX validation failed.\n");
907 sllin_report_error(sl, LIN_ERR_CHECKSUM);
908 /* FIXME tx_stat.err++ */
910 /* Send CAN non-RTR frame with data */
911 pr_debug("sllin: sending NON-RTR CAN"
912 "frame with LIN payload.");
913 sll_bump(sl); /* send packet to the network layer */
916 sl->id_to_send = false;
917 sl->lin_state = SLSTATE_IDLE;
920 case SLSTATE_RESPONSE_SENT:
921 slstate_response_sent:
922 if (sl->rx_cnt < sl->tx_lim)
925 sll_bump(sl); /* send packet to the network layer */
926 pr_debug("sllin: response sent ID %d len %d\n",
927 sl->rx_buff[SLLIN_BUFF_ID], sl->rx_cnt - SLLIN_BUFF_DATA - 1);
929 sl->id_to_send = false;
930 sl->lin_state = SLSTATE_IDLE;
937 /* sl->dev->stats.tx_packets++; send frames statistic */
938 /* netif_wake_queue(sl->dev); allow next Tx packet arrival */
941 hrtimer_cancel(&sl->rx_timer);
942 pr_debug("sllin: sllin_kwthread stopped.\n");
948 /************************************
949 * sllin_open helper routines.
950 ************************************/
952 /* Collect hanged up channels */
953 static void sll_sync(void)
956 struct net_device *dev;
959 for (i = 0; i < maxdev; i++) {
964 sl = netdev_priv(dev);
967 if (dev->flags & IFF_UP)
972 /* Find a free SLLIN channel, and link in this `tty' line. */
973 static struct sllin *sll_alloc(dev_t line)
976 struct net_device *dev = NULL;
979 if (sllin_devs == NULL)
980 return NULL; /* Master array missing ! */
982 for (i = 0; i < maxdev; i++) {
989 /* Sorry, too many, all slots in use */
994 sl = netdev_priv(dev);
995 if (test_bit(SLF_INUSE, &sl->flags)) {
996 unregister_netdevice(dev);
998 sllin_devs[i] = NULL;
1003 char name[IFNAMSIZ];
1004 sprintf(name, "sllin%d", i);
1006 dev = alloc_netdev(sizeof(*sl), name, sll_setup);
1012 sl = netdev_priv(dev);
1013 /* Initialize channel control data */
1014 sl->magic = SLLIN_MAGIC;
1016 spin_lock_init(&sl->lock);
1017 sllin_devs[i] = dev;
1023 * Open the high-level part of the SLLIN channel.
1024 * This function is called by the TTY module when the
1025 * SLLIN line discipline is called for. Because we are
1026 * sure the tty line exists, we only have to link it to
1027 * a free SLLIN channel...
1029 * Called in process context serialized from other ldisc calls.
1032 static int sllin_open(struct tty_struct *tty)
1036 pr_debug("sllin: %s() invoked\n", __FUNCTION__);
1038 if (!capable(CAP_NET_ADMIN))
1041 if (tty->ops->write == NULL)
1044 /* RTnetlink lock is misused here to serialize concurrent
1045 opens of sllin channels. There are better ways, but it is
1050 /* Collect hanged up channels. */
1053 sl = tty->disc_data;
1056 /* First make sure we're not already connected. */
1057 if (sl && sl->magic == SLLIN_MAGIC)
1060 /* OK. Find a free SLLIN channel to use. */
1062 sl = sll_alloc(tty_devnum(tty));
1067 tty->disc_data = sl;
1068 sl->line = tty_devnum(tty);
1070 if (!test_bit(SLF_INUSE, &sl->flags)) {
1071 /* Perform the low-level SLLIN initialization. */
1072 sl->lin_master = true;
1076 sl->rx_lim = sl->lin_master ? 0 : SLLIN_BUFF_LEN;
1079 sl->id_to_send = false;
1080 sl->data_to_send = false;
1082 sl->lin_baud = 19200;
1084 sl->lin_state = SLSTATE_IDLE;
1086 hrtimer_init(&sl->rx_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
1087 sl->rx_timer.function = sllin_rx_timeout_handler;
1088 /* timeval_to_ktime(msg_head->ival1); */
1089 sl->rx_timer_timeout = ns_to_ktime(
1090 (1000000000l / sl->lin_baud) *
1091 SLLIN_SAMPLES_PER_CHAR * SLLIN_CHARS_TO_TIMEOUT);
1093 set_bit(SLF_INUSE, &sl->flags);
1095 init_waitqueue_head(&sl->kwt_wq);
1096 sl->kwthread = kthread_run(sllin_kwthread, sl, "sllin");
1097 if (sl->kwthread == NULL)
1100 err = register_netdevice(sl->dev);
1102 goto err_free_chan_and_thread;
1105 /* Done. We have linked the TTY line to a channel. */
1107 tty->receive_room = SLLIN_BUFF_LEN * 40; /* We don't flow control */
1109 /* TTY layer expects 0 on success */
1112 err_free_chan_and_thread:
1113 kthread_stop(sl->kwthread);
1114 sl->kwthread = NULL;
1118 tty->disc_data = NULL;
1119 clear_bit(SLF_INUSE, &sl->flags);
1124 /* Count references from TTY module */
1129 * Close down a SLLIN channel.
1130 * This means flushing out any pending queues, and then returning. This
1131 * call is serialized against other ldisc functions.
1133 * We also use this method for a hangup event.
1136 static void sllin_close(struct tty_struct *tty)
1138 struct sllin *sl = (struct sllin *) tty->disc_data;
1140 /* First make sure we're connected. */
1141 if (!sl || sl->magic != SLLIN_MAGIC || sl->tty != tty)
1144 kthread_stop(sl->kwthread);
1145 sl->kwthread = NULL;
1147 tty->disc_data = NULL;
1150 /* Flush network side */
1151 unregister_netdev(sl->dev);
1152 /* This will complete via sl_free_netdev */
1155 static int sllin_hangup(struct tty_struct *tty)
1161 /* Perform I/O control on an active SLLIN channel. */
1162 static int sllin_ioctl(struct tty_struct *tty, struct file *file,
1163 unsigned int cmd, unsigned long arg)
1165 struct sllin *sl = (struct sllin *) tty->disc_data;
1168 /* First make sure we're connected. */
1169 if (!sl || sl->magic != SLLIN_MAGIC)
1174 tmp = strlen(sl->dev->name) + 1;
1175 if (copy_to_user((void __user *)arg, sl->dev->name, tmp))
1183 return tty_mode_ioctl(tty, file, cmd, arg);
1187 static struct tty_ldisc_ops sll_ldisc = {
1188 .owner = THIS_MODULE,
1189 .magic = TTY_LDISC_MAGIC,
1192 .close = sllin_close,
1193 .hangup = sllin_hangup,
1194 .ioctl = sllin_ioctl,
1195 .receive_buf = sllin_receive_buf,
1196 .write_wakeup = sllin_write_wakeup,
1199 static int __init sllin_init(void)
1204 maxdev = 4; /* Sanity */
1207 pr_debug("sllin: %d dynamic interface channels.\n", maxdev);
1209 sllin_devs = kzalloc(sizeof(struct net_device *)*maxdev, GFP_KERNEL);
1211 printk(KERN_ERR "sllin: can't allocate sllin device array!\n");
1215 /* Fill in our line protocol discipline, and register it */
1216 status = tty_register_ldisc(N_SLLIN, &sll_ldisc);
1218 printk(KERN_ERR "sllin: can't register line discipline\n");
1222 #ifdef BREAK_BY_BAUD
1223 pr_debug("sllin: Break is generated by baud-rate change.");
1225 pr_debug("sllin: Break is generated manually with tiny sleep.");
1231 static void __exit sllin_exit(void)
1234 struct net_device *dev;
1236 unsigned long timeout = jiffies + HZ;
1239 if (sllin_devs == NULL)
1242 /* First of all: check for active disciplines and hangup them.
1246 msleep_interruptible(100);
1249 for (i = 0; i < maxdev; i++) {
1250 dev = sllin_devs[i];
1253 sl = netdev_priv(dev);
1254 spin_lock_bh(&sl->lock);
1257 tty_hangup(sl->tty);
1259 spin_unlock_bh(&sl->lock);
1261 } while (busy && time_before(jiffies, timeout));
1263 /* FIXME: hangup is async so we should wait when doing this second
1266 for (i = 0; i < maxdev; i++) {
1267 dev = sllin_devs[i];
1270 sllin_devs[i] = NULL;
1272 sl = netdev_priv(dev);
1274 printk(KERN_ERR "%s: tty discipline still running\n",
1276 /* Intentionally leak the control block. */
1277 dev->destructor = NULL;
1280 unregister_netdev(dev);
1286 i = tty_unregister_ldisc(N_SLLIN);
1288 printk(KERN_ERR "sllin: can't unregister ldisc (err %d)\n", i);
1291 module_init(sllin_init);
1292 module_exit(sllin_exit);