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 24
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);
192 cflag = CS8 | CREAD | CLOCAL | HUPCL;
193 cflag &= ~(CBAUD | CIBAUD);
195 tty->termios->c_cflag = cflag;
196 tty->termios->c_oflag = 0;
197 tty->termios->c_lflag = 0;
199 /* Enable interrupt when UART-Break or Framing error received */
200 tty->termios->c_iflag = BRKINT | INPCK;
202 tty_encode_baud_rate(tty, speed, speed);
204 if (tty->ops->set_termios)
205 tty->ops->set_termios(tty, &old_termios);
207 mutex_unlock(&tty->termios_mutex);
212 /* Send one can_frame to the network layer */
213 static void sllin_send_canfr(struct sllin *sl, canid_t id, char *data, int len)
220 if (cf.can_dlc > 0) {
221 memcpy(&cf.data, data, cf.can_dlc);
224 skb = dev_alloc_skb(sizeof(struct can_frame));
229 skb->protocol = htons(ETH_P_CAN);
230 skb->pkt_type = PACKET_BROADCAST;
231 skb->ip_summed = CHECKSUM_UNNECESSARY;
232 memcpy(skb_put(skb, sizeof(struct can_frame)),
233 &cf, sizeof(struct can_frame));
236 sl->dev->stats.rx_packets++;
237 sl->dev->stats.rx_bytes += cf.can_dlc;
241 * sll_bump() -- Send data of received LIN frame (existing in sl->rx_buff)
246 static void sll_bump(struct sllin *sl)
248 sllin_send_canfr(sl, sl->rx_buff[SLLIN_BUFF_ID] & LIN_ID_MASK,
249 sl->rx_buff + SLLIN_BUFF_DATA,
250 sl->rx_cnt - SLLIN_BUFF_DATA - 1); /* without checksum */
254 * Called by the driver when there's room for more data. If we have
255 * more packets to send, we send them here.
257 static void sllin_write_wakeup(struct tty_struct *tty)
261 struct sllin *sl = (struct sllin *) tty->disc_data;
263 /* First make sure we're connected. */
264 if (!sl || sl->magic != SLLIN_MAGIC || !netif_running(sl->dev))
267 if (sl->lin_state != SLSTATE_BREAK_SENT)
268 remains = sl->tx_lim - sl->tx_cnt;
270 remains = SLLIN_BUFF_BREAK + 1 - sl->tx_cnt;
273 actual = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt,
274 sl->tx_cnt - sl->tx_lim);
275 sl->tx_cnt += actual;
277 if (sl->tx_cnt < sl->tx_lim) {
278 pr_debug("sllin: sllin_write_wakeup sent %d, "
279 "remains %d, waiting\n",
280 sl->tx_cnt, sl->tx_lim - sl->tx_cnt);
285 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
286 set_bit(SLF_TXEVENT, &sl->flags);
287 wake_up(&sl->kwt_wq);
289 pr_debug("sllin: sllin_write_wakeup sent %d, wakeup\n", sl->tx_cnt);
293 * sll_xmit() -- Send a can_frame to a TTY queue.
295 * @skb: Pointer to Socket buffer to be sent.
296 * @dev: Network device where @skb will be sent.
298 static netdev_tx_t sll_xmit(struct sk_buff *skb, struct net_device *dev)
300 struct sllin *sl = netdev_priv(dev);
301 struct can_frame *cf;
303 if (skb->len != sizeof(struct can_frame))
306 spin_lock(&sl->lock);
307 if (!netif_running(dev)) {
308 printk(KERN_WARNING "%s: xmit: iface is down\n", dev->name);
311 if (sl->tty == NULL) {
315 cf = (struct can_frame *) skb->data;
316 if (cf->can_id & LIN_CTRL_FRAME) {
317 sllin_configure_frame_cache(sl, cf);
318 goto free_out_unlock;
321 netif_stop_queue(sl->dev);
323 sl->tx_req_skb = skb;
324 set_bit(SLF_MSGEVENT, &sl->flags);
325 wake_up(&sl->kwt_wq);
326 spin_unlock(&sl->lock);
331 spin_unlock(&sl->lock);
338 /******************************************
339 * Routines looking at netdevice side.
340 ******************************************/
342 /* Netdevice UP -> DOWN routine */
343 static int sll_close(struct net_device *dev)
345 struct sllin *sl = netdev_priv(dev);
347 spin_lock_bh(&sl->lock);
349 /* TTY discipline is running. */
350 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
352 netif_stop_queue(dev);
355 spin_unlock_bh(&sl->lock);
360 /* Netdevice DOWN -> UP routine */
361 static int sll_open(struct net_device *dev)
363 struct sllin *sl = netdev_priv(dev);
365 pr_debug("sllin: %s() invoked\n", __FUNCTION__);
370 sl->flags &= (1 << SLF_INUSE);
371 netif_start_queue(dev);
375 /* Hook the destructor so we can free sllin devs at the right point in time */
376 static void sll_free_netdev(struct net_device *dev)
378 int i = dev->base_addr;
380 sllin_devs[i] = NULL;
383 static const struct net_device_ops sll_netdev_ops = {
384 .ndo_open = sll_open,
385 .ndo_stop = sll_close,
386 .ndo_start_xmit = sll_xmit,
389 static void sll_setup(struct net_device *dev)
391 dev->netdev_ops = &sll_netdev_ops;
392 dev->destructor = sll_free_netdev;
394 dev->hard_header_len = 0;
396 dev->tx_queue_len = 10;
398 dev->mtu = sizeof(struct can_frame);
399 dev->type = ARPHRD_CAN;
401 /* New-style flags. */
402 dev->flags = IFF_NOARP;
403 dev->features = NETIF_F_NO_CSUM;
406 /******************************************
407 Routines looking at TTY side.
408 ******************************************/
410 static void sllin_receive_buf(struct tty_struct *tty,
411 const unsigned char *cp, char *fp, int count)
413 struct sllin *sl = (struct sllin *) tty->disc_data;
415 pr_debug("sllin: sllin_receive_buf invoked\n");
417 if (!sl || sl->magic != SLLIN_MAGIC || !netif_running(sl->dev))
420 /* Read the characters out of the buffer */
423 if (sl->rx_cnt > SLLIN_BUFF_BREAK) {
424 set_bit(SLF_ERROR, &sl->flags);
426 pr_debug("sllin: sllin_receive_buf char 0x%02x ignored "
427 "due marker 0x%02x, flags 0x%lx\n",
428 *cp, *(fp-1), sl->flags);
430 if (sl->lin_master == true) {
431 wake_up(&sl->kwt_wq);
440 if (sl->rx_cnt < SLLIN_BUFF_LEN) {
441 #ifndef BREAK_BY_BAUD
442 /* We didn't receive Break character */
443 if ((sl->rx_cnt == SLLIN_BUFF_BREAK) && (*cp == 0x55)) {
444 sl->rx_buff[sl->rx_cnt++] = 0x00;
447 pr_debug("sllin: LIN_RX[%d]: 0x%02x\n", sl->rx_cnt, *cp);
448 sl->rx_buff[sl->rx_cnt++] = *cp++;
452 if (sl->rx_cnt >= sl->rx_expect) {
453 set_bit(SLF_RXEVENT, &sl->flags);
454 wake_up(&sl->kwt_wq);
455 pr_debug("sllin: sllin_receive_buf count %d, wakeup\n", sl->rx_cnt);
457 pr_debug("sllin: sllin_receive_buf count %d, waiting\n", sl->rx_cnt);
461 /*****************************************
462 * sllin message helper routines
463 *****************************************/
465 * sllin_report_error() -- Report an error by sending CAN frame
466 * with particular error flag set in can_id
469 * @err: Error flag to be sent.
471 void sllin_report_error(struct sllin *sl, int err)
474 case LIN_ERR_CHECKSUM:
475 sl->dev->stats.rx_crc_errors++;
478 case LIN_ERR_RX_TIMEOUT:
479 sl->dev->stats.rx_errors++;
482 case LIN_ERR_FRAMING:
483 sl->dev->stats.rx_frame_errors++;
487 sllin_send_canfr(sl, 0 | CAN_EFF_FLAG |
488 (err & ~LIN_ID_MASK), NULL, 0);
492 * sllin_configure_frame_cache() -- Configure particular entry in linfr_cache
495 * @cf: Pointer to CAN frame sent to this driver
496 * holding configuration information
498 static int sllin_configure_frame_cache(struct sllin *sl, struct can_frame *cf)
500 struct sllin_conf_entry *sce;
501 if (!(cf->can_id & LIN_ID_CONF))
504 sce = &sl->linfr_cache[cf->can_id & LIN_ID_MASK];
505 pr_debug("sllin: Setting frame cache with EFF CAN frame. "
506 "LIN ID = %d\n", cf->can_id & LIN_ID_MASK);
508 sce->dlc = cf->can_dlc;
509 if (sce->dlc > SLLIN_DATA_MAX)
510 sce->dlc = SLLIN_DATA_MAX;
512 sce->frame_fl = (cf->can_id & ~LIN_ID_MASK) & CAN_EFF_MASK;
513 memcpy(sce->data, cf->data, cf->can_dlc);
519 * sllin_checksum() -- Count checksum for particular data
521 * @data: Pointer to the buffer containing whole LIN
522 * frame (i.e. including break and sync bytes).
523 * @length: Length of the buffer.
524 * @enhanced_fl: Flag determining whether Enhanced or Classic
525 * checksum should be counted.
527 static inline unsigned sllin_checksum(unsigned char *data, int length, int enhanced_fl)
538 for (; i < length; i++) {
547 #define SLLIN_STPMSG_RESPONLY (1) /* Message will be LIN Response only */
548 #define SLLIN_STPMSG_CHCKSUM_CLS (1 << 1)
549 #define SLLIN_STPMSG_CHCKSUM_ENH (1 << 2)
551 int sllin_setup_msg(struct sllin *sl, int mode, int id,
552 unsigned char *data, int len)
554 if (id > LIN_ID_MASK)
557 if (!(mode & SLLIN_STPMSG_RESPONLY)) {
561 sl->rx_lim = SLLIN_BUFF_LEN;
564 sl->tx_buff[SLLIN_BUFF_BREAK] = 0;
565 sl->tx_buff[SLLIN_BUFF_SYNC] = 0x55;
566 sl->tx_buff[SLLIN_BUFF_ID] = id | sllin_id_parity_table[id];
567 sl->tx_lim = SLLIN_BUFF_DATA;
569 if ((data != NULL) && len) {
571 memcpy(sl->tx_buff + SLLIN_BUFF_DATA, data, len);
572 sl->tx_buff[sl->tx_lim++] = sllin_checksum(sl->tx_buff,
573 sl->tx_lim, mode & SLLIN_STPMSG_CHCKSUM_ENH);
576 sl->rx_lim = SLLIN_BUFF_DATA + len + 1;
581 static void sllin_reset_buffs(struct sllin *sl)
585 sl->rx_lim = sl->lin_master ? 0 : SLLIN_BUFF_LEN;
588 sl->id_to_send = false;
589 sl->data_to_send = false;
592 int sllin_send_tx_buff(struct sllin *sl)
594 struct tty_struct *tty = sl->tty;
599 if (sl->lin_state != SLSTATE_BREAK_SENT)
600 remains = sl->tx_lim - sl->tx_cnt;
604 remains = sl->tx_lim - sl->tx_cnt;
607 res = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt, remains);
615 set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
616 res = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt, remains);
618 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
626 pr_debug("sllin: sllin_send_tx_buff sent %d, remains %d\n",
627 sl->tx_cnt, remains);
633 int sllin_send_break(struct sllin *sl)
635 struct tty_struct *tty = sl->tty;
636 unsigned long break_baud;
639 break_baud = ((sl->lin_baud * 2) / 3);
640 sltty_change_speed(tty, break_baud);
642 tty->ops->flush_buffer(tty);
643 sl->rx_cnt = SLLIN_BUFF_BREAK;
645 sl->rx_expect = SLLIN_BUFF_BREAK + 1;
646 sl->lin_state = SLSTATE_BREAK_SENT;
648 res = sllin_send_tx_buff(sl);
650 sl->lin_state = SLSTATE_IDLE;
656 #else /* BREAK_BY_BAUD */
658 int sllin_send_break(struct sllin *sl)
660 struct tty_struct *tty = sl->tty;
662 unsigned long break_baud;
663 unsigned long usleep_range_min;
664 unsigned long usleep_range_max;
666 break_baud = ((sl->lin_baud * 2) / 3);
667 sl->rx_cnt = SLLIN_BUFF_BREAK;
668 sl->rx_expect = SLLIN_BUFF_BREAK + 1;
669 sl->lin_state = SLSTATE_BREAK_SENT;
671 /* Do the break ourselves; Inspired by
672 http://lxr.linux.no/#linux+v3.1.2/drivers/tty/tty_io.c#L2452 */
673 retval = tty->ops->break_ctl(tty, -1);
678 usleep_range_min = (1000000l * SLLIN_SAMPLES_PER_CHAR) / break_baud;
679 usleep_range_max = usleep_range_min + 50;
680 usleep_range(usleep_range_min, usleep_range_max);
682 retval = tty->ops->break_ctl(tty, 0);
683 usleep_range_min = (1000000l * 1 /* 1 bit */) / break_baud;
684 usleep_range_max = usleep_range_min + 30;
685 usleep_range(usleep_range_min, usleep_range_max);
687 tty->ops->flush_buffer(tty);
689 sl->tx_cnt = SLLIN_BUFF_SYNC;
691 pr_debug("sllin: Break sent.\n");
692 set_bit(SLF_RXEVENT, &sl->flags);
693 wake_up(&sl->kwt_wq);
697 #endif /* BREAK_BY_BAUD */
700 static enum hrtimer_restart sllin_rx_timeout_handler(struct hrtimer *hrtimer)
702 struct sllin *sl = container_of(hrtimer, struct sllin, rx_timer);
704 sllin_report_error(sl, LIN_ERR_RX_TIMEOUT);
705 set_bit(SLF_TMOUTEVENT, &sl->flags);
706 wake_up(&sl->kwt_wq);
708 return HRTIMER_NORESTART;
712 * sllin_rx_validate() -- Validate received frame, i,e. check checksum
716 static int sllin_rx_validate(struct sllin *sl)
721 unsigned char rec_chcksm = sl->rx_buff[sl->rx_cnt - 1];
722 struct sllin_conf_entry *scf;
724 actual_id = sl->rx_buff[SLLIN_BUFF_ID] & LIN_ID_MASK;
725 scf = &sl->linfr_cache[actual_id];
727 ext_chcks_fl = scf->frame_fl & LIN_CHECKSUM_EXTENDED;
729 if (sllin_checksum(sl->rx_buff, sl->rx_cnt - 1, ext_chcks_fl) !=
732 /* Type of checksum is configured for particular frame */
736 if (sllin_checksum(sl->rx_buff, sl->rx_cnt - 1,
737 !ext_chcks_fl) != rec_chcksm) {
746 /*****************************************
747 * sllin_kwthread - kernel worker thread
748 *****************************************/
750 int sllin_kwthread(void *ptr)
752 struct sllin *sl = (struct sllin *)ptr;
753 struct tty_struct *tty = sl->tty;
754 struct sched_param schparam = { .sched_priority = 40 };
755 int tx_bytes = 0; /* Used for Network statistics */
758 pr_debug("sllin: sllin_kwthread started.\n");
759 sched_setscheduler(current, SCHED_FIFO, &schparam);
761 clear_bit(SLF_ERROR, &sl->flags);
762 sltty_change_speed(tty, sl->lin_baud);
764 while (!kthread_should_stop()) {
765 struct can_frame *cf;
768 u8 lin_data_buff[SLLIN_DATA_MAX];
771 if ((sl->lin_state == SLSTATE_IDLE) && sl->lin_master &&
773 if(sllin_send_break(sl) < 0) {
774 /* error processing */
778 wait_event_killable(sl->kwt_wq, kthread_should_stop() ||
779 test_bit(SLF_RXEVENT, &sl->flags) ||
780 test_bit(SLF_TXEVENT, &sl->flags) ||
781 test_bit(SLF_TMOUTEVENT, &sl->flags) ||
782 test_bit(SLF_ERROR, &sl->flags) ||
783 (((sl->lin_state == SLSTATE_IDLE) ||
784 (sl->lin_state == SLSTATE_RESPONSE_WAIT))
785 && test_bit(SLF_MSGEVENT, &sl->flags)));
787 if (test_and_clear_bit(SLF_RXEVENT, &sl->flags)) {
788 pr_debug("sllin: sllin_kthread RXEVENT\n");
791 if (test_and_clear_bit(SLF_ERROR, &sl->flags)) {
792 unsigned long usleep_range_min;
793 unsigned long usleep_range_max;
794 hrtimer_cancel(&sl->rx_timer);
795 pr_debug("sllin: sllin_kthread ERROR\n");
797 if (sl->lin_state != SLSTATE_IDLE)
798 sllin_report_error(sl, LIN_ERR_FRAMING);
800 usleep_range_min = (1000000l * SLLIN_SAMPLES_PER_CHAR * 10) /
802 usleep_range_max = usleep_range_min + 50;
803 usleep_range(usleep_range_min, usleep_range_max);
804 sllin_reset_buffs(sl);
805 sl->lin_state = SLSTATE_IDLE;
808 if (test_and_clear_bit(SLF_TXEVENT, &sl->flags)) {
809 pr_debug("sllin: sllin_kthread TXEVENT\n");
812 if (test_and_clear_bit(SLF_TMOUTEVENT, &sl->flags)) {
813 pr_debug("sllin: sllin_kthread TMOUTEVENT\n");
814 sllin_reset_buffs(sl);
816 sl->lin_state = SLSTATE_IDLE;
819 switch (sl->lin_state) {
821 if (!test_bit(SLF_MSGEVENT, &sl->flags))
824 cf = (struct can_frame *)sl->tx_req_skb->data;
826 /* SFF RTR CAN frame -> LIN header */
827 if (cf->can_id & CAN_RTR_FLAG) {
828 spin_lock(&sl->lock);
829 pr_debug("sllin: %s: RTR SFF CAN frame, ID = %x\n",
830 __FUNCTION__, cf->can_id & LIN_ID_MASK);
832 /* Is there Slave response in linfr_cache to be sent? */
833 if ((sl->linfr_cache[cf->can_id & LIN_ID_MASK].frame_fl &
835 && (sl->linfr_cache[cf->can_id & LIN_ID_MASK].dlc > 0)) {
837 pr_debug("sllin: Sending LIN response from linfr_cache\n");
838 lin_data = sl->linfr_cache[cf->can_id & LIN_ID_MASK].data;
839 lin_dlc = sl->linfr_cache[cf->can_id & LIN_ID_MASK].dlc;
840 if (lin_dlc > SLLIN_DATA_MAX)
841 lin_dlc = SLLIN_DATA_MAX;
842 memcpy(lin_data_buff, lin_data, lin_dlc);
843 lin_data = lin_data_buff;
846 lin_dlc = sl->linfr_cache[cf->can_id & LIN_ID_MASK].dlc;
848 spin_unlock(&sl->lock);
849 } else { /* SFF NON-RTR CAN frame -> LIN header + LIN response */
850 pr_debug("sllin: %s: NON-RTR SFF CAN frame, ID = %x\n",
851 __FUNCTION__, (int)cf->can_id & LIN_ID_MASK);
854 lin_dlc = cf->can_dlc;
855 if (lin_dlc > SLLIN_DATA_MAX)
856 lin_dlc = SLLIN_DATA_MAX;
860 if (sllin_setup_msg(sl, 0, cf->can_id & LIN_ID_MASK,
861 lin_data, lin_dlc) != -1) {
863 sl->id_to_send = true;
864 sl->data_to_send = (lin_data != NULL) ? true : false;
865 sl->resp_len_known = (lin_dlc > 0) ? true : false;
866 sl->dev->stats.tx_packets++;
867 sl->dev->stats.tx_bytes += tx_bytes;
870 clear_bit(SLF_MSGEVENT, &sl->flags);
871 kfree_skb(sl->tx_req_skb);
872 netif_wake_queue(sl->dev);
873 hrtimer_start(&sl->rx_timer,
874 ktime_add(ktime_get(), sl->rx_timer_timeout),
878 case SLSTATE_BREAK_SENT:
880 if (sl->rx_cnt <= SLLIN_BUFF_BREAK)
883 res = sltty_change_speed(tty, sl->lin_baud);
886 sl->lin_state = SLSTATE_ID_SENT;
887 sllin_send_tx_buff(sl);
890 case SLSTATE_ID_SENT:
891 hrtimer_cancel(&sl->rx_timer);
892 sl->id_to_send = false;
893 if (sl->data_to_send) {
894 sllin_send_tx_buff(sl);
895 sl->lin_state = SLSTATE_RESPONSE_SENT;
896 sl->rx_expect = sl->tx_lim;
897 goto slstate_response_sent;
899 if (sl->resp_len_known) {
900 sl->rx_expect = sl->rx_lim;
902 sl->rx_expect = SLLIN_BUFF_DATA + 2;
904 sl->lin_state = SLSTATE_RESPONSE_WAIT;
905 /* If we don't receive anything, timer will "unblock" us */
906 hrtimer_start(&sl->rx_timer,
907 ktime_add(ktime_get(), sl->rx_timer_timeout),
909 goto slstate_response_wait;
913 case SLSTATE_RESPONSE_WAIT:
914 slstate_response_wait:
915 if (test_bit(SLF_MSGEVENT, &sl->flags)) {
916 unsigned char *lin_buff;
917 cf = (struct can_frame *)sl->tx_req_skb->data;
919 lin_buff = (sl->lin_master) ? sl->tx_buff : sl->rx_buff;
920 if (cf->can_id == (lin_buff[SLLIN_BUFF_ID] & LIN_ID_MASK)) {
921 hrtimer_cancel(&sl->rx_timer);
922 pr_debug("sllin: received LIN response in a CAN frame.\n");
923 if (sllin_setup_msg(sl, SLLIN_STPMSG_RESPONLY,
924 cf->can_id & LIN_ID_MASK,
925 cf->data, cf->can_dlc) != -1) {
927 sl->rx_expect = sl->tx_lim;
928 sl->data_to_send = true;
929 sl->dev->stats.tx_packets++;
930 sl->dev->stats.tx_bytes += tx_bytes;
932 if (!sl->lin_master) {
933 sl->tx_cnt = SLLIN_BUFF_DATA;
936 sllin_send_tx_buff(sl);
937 clear_bit(SLF_MSGEVENT, &sl->flags);
938 kfree_skb(sl->tx_req_skb);
939 netif_wake_queue(sl->dev);
941 sl->lin_state = SLSTATE_RESPONSE_SENT;
942 goto slstate_response_sent;
945 sl->lin_state = SLSTATE_RESPONSE_WAIT_BUS;
949 /* Be aware, no BREAK here */
950 case SLSTATE_RESPONSE_WAIT_BUS:
951 if (sl->rx_cnt < sl->rx_expect)
954 hrtimer_cancel(&sl->rx_timer);
955 pr_debug("sllin: response received ID %d len %d\n",
956 sl->rx_buff[SLLIN_BUFF_ID], sl->rx_cnt - SLLIN_BUFF_DATA - 1);
958 if (sllin_rx_validate(sl) == -1) {
959 pr_debug("sllin: RX validation failed.\n");
960 sllin_report_error(sl, LIN_ERR_CHECKSUM);
962 /* Send CAN non-RTR frame with data */
963 pr_debug("sllin: sending NON-RTR CAN"
964 "frame with LIN payload.");
965 sll_bump(sl); /* send packet to the network layer */
968 sl->id_to_send = false;
969 sl->lin_state = SLSTATE_IDLE;
972 case SLSTATE_RESPONSE_SENT:
973 slstate_response_sent:
974 if (sl->rx_cnt < sl->tx_lim)
977 hrtimer_cancel(&sl->rx_timer);
978 sll_bump(sl); /* send packet to the network layer */
979 pr_debug("sllin: response sent ID %d len %d\n",
980 sl->rx_buff[SLLIN_BUFF_ID], sl->rx_cnt - SLLIN_BUFF_DATA - 1);
982 sl->id_to_send = false;
983 sl->lin_state = SLSTATE_IDLE;
988 hrtimer_cancel(&sl->rx_timer);
989 pr_debug("sllin: sllin_kwthread stopped.\n");
995 /************************************
996 * sllin_open helper routines.
997 ************************************/
999 /* Collect hanged up channels */
1000 static void sll_sync(void)
1003 struct net_device *dev;
1006 for (i = 0; i < maxdev; i++) {
1007 dev = sllin_devs[i];
1011 sl = netdev_priv(dev);
1014 if (dev->flags & IFF_UP)
1019 /* Find a free SLLIN channel, and link in this `tty' line. */
1020 static struct sllin *sll_alloc(dev_t line)
1023 struct net_device *dev = NULL;
1026 if (sllin_devs == NULL)
1027 return NULL; /* Master array missing ! */
1029 for (i = 0; i < maxdev; i++) {
1030 dev = sllin_devs[i];
1036 /* Sorry, too many, all slots in use */
1041 sl = netdev_priv(dev);
1042 if (test_bit(SLF_INUSE, &sl->flags)) {
1043 unregister_netdevice(dev);
1045 sllin_devs[i] = NULL;
1050 char name[IFNAMSIZ];
1051 sprintf(name, "sllin%d", i);
1053 dev = alloc_netdev(sizeof(*sl), name, sll_setup);
1059 sl = netdev_priv(dev);
1060 /* Initialize channel control data */
1061 sl->magic = SLLIN_MAGIC;
1063 spin_lock_init(&sl->lock);
1064 sllin_devs[i] = dev;
1070 * Open the high-level part of the SLLIN channel.
1071 * This function is called by the TTY module when the
1072 * SLLIN line discipline is called for. Because we are
1073 * sure the tty line exists, we only have to link it to
1074 * a free SLLIN channel...
1076 * Called in process context serialized from other ldisc calls.
1079 static int sllin_open(struct tty_struct *tty)
1083 pr_debug("sllin: %s() invoked\n", __FUNCTION__);
1085 if (!capable(CAP_NET_ADMIN))
1088 if (tty->ops->write == NULL)
1091 /* RTnetlink lock is misused here to serialize concurrent
1092 opens of sllin channels. There are better ways, but it is
1097 /* Collect hanged up channels. */
1100 sl = tty->disc_data;
1103 /* First make sure we're not already connected. */
1104 if (sl && sl->magic == SLLIN_MAGIC)
1107 /* OK. Find a free SLLIN channel to use. */
1109 sl = sll_alloc(tty_devnum(tty));
1114 tty->disc_data = sl;
1115 sl->line = tty_devnum(tty);
1117 if (!test_bit(SLF_INUSE, &sl->flags)) {
1118 /* Perform the low-level SLLIN initialization. */
1119 sl->lin_master = true;
1121 sllin_reset_buffs(sl);
1123 sl->lin_baud = 19200;
1125 sl->lin_state = SLSTATE_IDLE;
1127 hrtimer_init(&sl->rx_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
1128 sl->rx_timer.function = sllin_rx_timeout_handler;
1129 /* timeval_to_ktime(msg_head->ival1); */
1130 sl->rx_timer_timeout = ns_to_ktime(
1131 (1000000000l / sl->lin_baud) *
1132 SLLIN_SAMPLES_PER_CHAR * SLLIN_CHARS_TO_TIMEOUT);
1134 set_bit(SLF_INUSE, &sl->flags);
1136 init_waitqueue_head(&sl->kwt_wq);
1137 sl->kwthread = kthread_run(sllin_kwthread, sl, "sllin");
1138 if (sl->kwthread == NULL)
1141 err = register_netdevice(sl->dev);
1143 goto err_free_chan_and_thread;
1146 /* Done. We have linked the TTY line to a channel. */
1148 tty->receive_room = SLLIN_BUFF_LEN * 40; /* We don't flow control */
1150 /* TTY layer expects 0 on success */
1153 err_free_chan_and_thread:
1154 kthread_stop(sl->kwthread);
1155 sl->kwthread = NULL;
1159 tty->disc_data = NULL;
1160 clear_bit(SLF_INUSE, &sl->flags);
1165 /* Count references from TTY module */
1170 * Close down a SLLIN channel.
1171 * This means flushing out any pending queues, and then returning. This
1172 * call is serialized against other ldisc functions.
1174 * We also use this method for a hangup event.
1177 static void sllin_close(struct tty_struct *tty)
1179 struct sllin *sl = (struct sllin *) tty->disc_data;
1181 /* First make sure we're connected. */
1182 if (!sl || sl->magic != SLLIN_MAGIC || sl->tty != tty)
1185 kthread_stop(sl->kwthread);
1186 sl->kwthread = NULL;
1188 tty->disc_data = NULL;
1191 /* Flush network side */
1192 unregister_netdev(sl->dev);
1193 /* This will complete via sl_free_netdev */
1196 static int sllin_hangup(struct tty_struct *tty)
1202 /* Perform I/O control on an active SLLIN channel. */
1203 static int sllin_ioctl(struct tty_struct *tty, struct file *file,
1204 unsigned int cmd, unsigned long arg)
1206 struct sllin *sl = (struct sllin *) tty->disc_data;
1209 /* First make sure we're connected. */
1210 if (!sl || sl->magic != SLLIN_MAGIC)
1215 tmp = strlen(sl->dev->name) + 1;
1216 if (copy_to_user((void __user *)arg, sl->dev->name, tmp))
1224 return tty_mode_ioctl(tty, file, cmd, arg);
1228 static struct tty_ldisc_ops sll_ldisc = {
1229 .owner = THIS_MODULE,
1230 .magic = TTY_LDISC_MAGIC,
1233 .close = sllin_close,
1234 .hangup = sllin_hangup,
1235 .ioctl = sllin_ioctl,
1236 .receive_buf = sllin_receive_buf,
1237 .write_wakeup = sllin_write_wakeup,
1240 static int __init sllin_init(void)
1245 maxdev = 4; /* Sanity */
1248 pr_debug("sllin: %d dynamic interface channels.\n", maxdev);
1250 sllin_devs = kzalloc(sizeof(struct net_device *)*maxdev, GFP_KERNEL);
1252 printk(KERN_ERR "sllin: can't allocate sllin device array!\n");
1256 /* Fill in our line protocol discipline, and register it */
1257 status = tty_register_ldisc(N_SLLIN, &sll_ldisc);
1259 printk(KERN_ERR "sllin: can't register line discipline\n");
1263 #ifdef BREAK_BY_BAUD
1264 pr_debug("sllin: Break is generated by baud-rate change.");
1266 pr_debug("sllin: Break is generated manually with tiny sleep.");
1272 static void __exit sllin_exit(void)
1275 struct net_device *dev;
1277 unsigned long timeout = jiffies + HZ;
1280 if (sllin_devs == NULL)
1283 /* First of all: check for active disciplines and hangup them.
1287 msleep_interruptible(100);
1290 for (i = 0; i < maxdev; i++) {
1291 dev = sllin_devs[i];
1294 sl = netdev_priv(dev);
1295 spin_lock_bh(&sl->lock);
1298 tty_hangup(sl->tty);
1300 spin_unlock_bh(&sl->lock);
1302 } while (busy && time_before(jiffies, timeout));
1304 /* FIXME: hangup is async so we should wait when doing this second
1307 for (i = 0; i < maxdev; i++) {
1308 dev = sllin_devs[i];
1311 sllin_devs[i] = NULL;
1313 sl = netdev_priv(dev);
1315 printk(KERN_ERR "%s: tty discipline still running\n",
1317 /* Intentionally leak the control block. */
1318 dev->destructor = NULL;
1321 unregister_netdev(dev);
1327 i = tty_unregister_ldisc(N_SLLIN);
1329 printk(KERN_ERR "sllin: can't unregister ldisc (err %d)\n", i);
1332 module_init(sllin_init);
1333 module_exit(sllin_exit);