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>
62 /* Should be in include/linux/tty.h */
64 /* -------------------------------- */
66 static __initdata const char banner[] =
67 KERN_INFO "sllin: serial line LIN interface driver\n";
69 MODULE_ALIAS_LDISC(N_SLLIN);
70 MODULE_DESCRIPTION("serial line LIN interface");
71 MODULE_LICENSE("GPL");
74 #define SLLIN_MAGIC 0x53CA
75 /* #define BREAK_BY_BAUD */
77 static int maxdev = 10; /* MAX number of SLLIN channels;
78 This can be overridden with
79 insmod sllin.ko maxdev=nnn */
80 module_param(maxdev, int, 0);
81 MODULE_PARM_DESC(maxdev, "Maximum number of sllin interfaces");
83 /* maximum buffer len to store whole LIN message*/
84 #define SLLIN_DATA_MAX 8
85 #define SLLIN_BUFF_LEN (1 /*break*/ + 1 /*sync*/ + 1 /*ID*/ + \
86 SLLIN_DATA_MAX + 1 /*checksum*/)
87 #define SLLIN_BUFF_BREAK 0
88 #define SLLIN_BUFF_SYNC 1
89 #define SLLIN_BUFF_ID 2
90 #define SLLIN_BUFF_DATA 3
92 #define SLLIN_ID_MASK 0x3f
93 #define SLLIN_ID_MAX SLLIN_ID_MASK
94 #define SLLIN_CTRL_FRAME CAN_EFF_FLAG
96 #define SLLIN_SAMPLES_PER_CHAR 10
97 #define SLLIN_CHARS_TO_TIMEOUT 12
103 SLSTATE_RESPONSE_WAIT, /* Wait for response */
104 SLSTATE_RESPONSE_WAIT_BUS, /* Wait for response from LIN bus
105 only (CAN frames from network stack
106 are not processed in this moment) */
107 SLSTATE_RESPONSE_SENT,
110 struct sllin_conf_entry {
111 int dlc; /* Length of data in LIN frame */
112 #define SLLIN_CANFR_FLAGS_OFFS 6 /* Lower 6 bits in can_id correspond to LIN ID */
113 /* Save configuration for particular LIN ID */
114 #define SLLIN_LIN_ID_CONF (1 << SLLIN_CANFR_FLAGS_OFFS)
115 /* Publisher of particular LIN response is SLLIN Master */
116 #define SLLIN_SRC_MASTER (1 << (SLLIN_CANFR_FLAGS_OFFS + 1))
117 #define SLLIN_SRC_SLAVE (1 << (SLLIN_CANFR_FLAGS_OFFS + 2))
118 #define SLLIN_SLAVE_LOCAL (1 << (SLLIN_CANFR_FLAGS_OFFS + 3))
119 #define SLLIN_SLAVE_REMOTE (1 << (SLLIN_CANFR_FLAGS_OFFS + 4))
120 #define SLLIN_LOC_SLAVE_CACHE (1 << (SLLIN_CANFR_FLAGS_OFFS + 5))
121 #define SLLIN_CHECKSUM_EXTENDED (1 << (SLLIN_CANFR_FLAGS_OFFS + 6))
123 #define SLLIN_ERR_RX_TIMEOUT (1 << (SLLIN_CANFR_FLAGS_OFFS + 7))
124 #define SLLIN_ERR_CHECKSUM (1 << (SLLIN_CANFR_FLAGS_OFFS + 8))
125 //#define SLLIN_ERR_FRAMING (1 << (SLLIN_CANFR_FLAGS_OFFS + 9))
127 canid_t frame_fl; /* LIN frame flags. Passed from userspace as canid_t data type */
128 u8 data[8]; /* LIN frame data payload */
134 /* Various fields. */
135 struct tty_struct *tty; /* ptr to TTY structure */
136 struct net_device *dev; /* easy for intr handling */
139 /* LIN message buffer and actual processed data counts */
140 unsigned char rx_buff[SLLIN_BUFF_LEN]; /* LIN Rx buffer */
141 unsigned char tx_buff[SLLIN_BUFF_LEN]; /* LIN Tx buffer */
142 int rx_expect; /* expected number of Rx chars */
143 int rx_lim; /* maximum Rx chars for current frame */
144 int rx_cnt; /* message buffer Rx fill level */
145 int tx_lim; /* actual limit of bytes to Tx */
146 int tx_cnt; /* number of already Tx bytes */
147 char lin_master; /* node is a master node */
148 int lin_baud; /* LIN baudrate */
149 int lin_state; /* state */
150 char id_to_send; /* there is ID to be sent */
151 char data_to_send; /* there are data to be sent */
152 char resp_len_known; /* Length of the response is known */
154 unsigned long flags; /* Flag values/ mode etc */
155 #define SLF_INUSE 0 /* Channel in use */
156 #define SLF_ERROR 1 /* Parity, etc. error */
157 #define SLF_RXEVENT 2 /* Rx wake event */
158 #define SLF_TXEVENT 3 /* Tx wake event */
159 #define SLF_MSGEVENT 4 /* CAN message to sent */
160 #define SLF_TMOUTEVENT 5 /* Timeout on received data */
163 struct task_struct *kwthread;
164 wait_queue_head_t kwt_wq; /* Wait queue used by kwthread */
165 struct hrtimer rx_timer; /* RX timeout timer */
166 ktime_t rx_timer_timeout; /* RX timeout timer value */
167 struct sk_buff *tx_req_skb; /* Socket buffer with CAN frame received
170 struct sllin_conf_entry linfr_cache[SLLIN_ID_MAX + 1]; /* List with configurations for
171 each of 0 to SLLIN_ID_MAX LIN IDs */
174 static struct net_device **sllin_devs;
175 static int sllin_configure_frame_cache(struct sllin *sl, struct can_frame *cf);
178 /* Values of two parity bits in LIN Protected
179 Identifier for each particular LIN ID */
180 const unsigned char sllin_id_parity_table[] = {
181 0x80, 0xc0, 0x40, 0x00, 0xc0, 0x80, 0x00, 0x40,
182 0x00, 0x40, 0xc0, 0x80, 0x40, 0x00, 0x80, 0xc0,
183 0x40, 0x00, 0x80, 0xc0, 0x00, 0x40, 0xc0, 0x80,
184 0xc0, 0x80, 0x00, 0x40, 0x80, 0xc0, 0x40, 0x00,
185 0x00, 0x40, 0xc0, 0x80, 0x40, 0x00, 0x80, 0xc0,
186 0x80, 0xc0, 0x40, 0x00, 0xc0, 0x80, 0x00, 0x40,
187 0xc0, 0x80, 0x00, 0x40, 0x80, 0xc0, 0x40, 0x00,
188 0x40, 0x00, 0x80, 0xc0, 0x00, 0x40, 0xc0, 0x80
192 * sltty_change_speed() -- Change baudrate of Serial device belonging to particular @tty
194 * @tty: Pointer to TTY to change speed for.
195 * @speed: Integer value of new speed. It is possible to
196 * assign non-standard values, i.e. those which
197 * are not defined in termbits.h.
199 static int sltty_change_speed(struct tty_struct *tty, unsigned speed)
201 struct ktermios old_termios;
204 mutex_lock(&tty->termios_mutex);
206 old_termios = *(tty->termios);
207 cflag = tty->termios->c_cflag;
208 cflag &= ~(CBAUD | CIBAUD);
210 tty->termios->c_cflag = cflag;
212 tty_encode_baud_rate(tty, speed, speed);
214 if (tty->ops->set_termios)
215 tty->ops->set_termios(tty, &old_termios);
217 mutex_unlock(&tty->termios_mutex);
223 /* Send one can_frame to the network layer */
224 static void sllin_send_canfr(struct sllin *sl, canid_t id, char *data, int len)
231 if (cf.can_dlc > 0) {
232 memcpy(&cf.data, data, cf.can_dlc);
235 skb = dev_alloc_skb(sizeof(struct can_frame));
240 skb->protocol = htons(ETH_P_CAN);
241 skb->pkt_type = PACKET_BROADCAST;
242 skb->ip_summed = CHECKSUM_UNNECESSARY;
243 memcpy(skb_put(skb, sizeof(struct can_frame)),
244 &cf, sizeof(struct can_frame));
247 sl->dev->stats.rx_packets++;
248 sl->dev->stats.rx_bytes += cf.can_dlc;
254 * sll_bump() -- Send data of received LIN frame (existing in sl->rx_buff) as CAN frame
258 static void sll_bump(struct sllin *sl)
260 sllin_send_canfr(sl, sl->rx_buff[SLLIN_BUFF_ID] & SLLIN_ID_MASK,
261 sl->rx_buff + SLLIN_BUFF_DATA,
262 sl->rx_cnt - SLLIN_BUFF_DATA - 1); /* without checksum */
266 * Called by the driver when there's room for more data. If we have
267 * more packets to send, we send them here.
269 static void sllin_write_wakeup(struct tty_struct *tty)
273 struct sllin *sl = (struct sllin *) tty->disc_data;
275 /* First make sure we're connected. */
276 if (!sl || sl->magic != SLLIN_MAGIC || !netif_running(sl->dev))
279 if (sl->lin_state != SLSTATE_BREAK_SENT)
280 remains = sl->tx_lim - sl->tx_cnt;
282 remains = SLLIN_BUFF_BREAK + 1 - sl->tx_cnt;
285 actual = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt, sl->tx_cnt - sl->tx_lim);
286 sl->tx_cnt += actual;
288 if (sl->tx_cnt < sl->tx_lim) {
289 pr_debug("sllin: sllin_write_wakeup sent %d, remains %d, waiting\n",
290 sl->tx_cnt, sl->tx_lim - sl->tx_cnt);
295 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
296 set_bit(SLF_TXEVENT, &sl->flags);
297 wake_up(&sl->kwt_wq);
299 pr_debug("sllin: sllin_write_wakeup sent %d, wakeup\n", sl->tx_cnt);
303 * sll_xmit() -- Send a can_frame to a TTY queue.
305 * @skb: Pointer to Socket buffer to be sent.
306 * @dev: Network device where @skb will be sent.
308 static netdev_tx_t sll_xmit(struct sk_buff *skb, struct net_device *dev)
310 struct sllin *sl = netdev_priv(dev);
311 struct can_frame *cf;
313 if (skb->len != sizeof(struct can_frame))
316 spin_lock(&sl->lock);
317 if (!netif_running(dev)) {
318 printk(KERN_WARNING "%s: xmit: iface is down\n", dev->name);
321 if (sl->tty == NULL) {
325 cf = (struct can_frame *) skb->data;
326 if (cf->can_id & SLLIN_CTRL_FRAME) {
327 sllin_configure_frame_cache(sl, cf);
328 goto free_out_unlock;
331 netif_stop_queue(sl->dev);
333 sl->tx_req_skb = skb;
334 set_bit(SLF_MSGEVENT, &sl->flags);
335 wake_up(&sl->kwt_wq);
336 spin_unlock(&sl->lock);
341 spin_unlock(&sl->lock);
348 /******************************************
349 * Routines looking at netdevice side.
350 ******************************************/
352 /* Netdevice UP -> DOWN routine */
353 static int sll_close(struct net_device *dev)
355 struct sllin *sl = netdev_priv(dev);
357 spin_lock_bh(&sl->lock);
359 /* TTY discipline is running. */
360 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
362 netif_stop_queue(dev);
365 spin_unlock_bh(&sl->lock);
370 /* Netdevice DOWN -> UP routine */
371 static int sll_open(struct net_device *dev)
373 struct sllin *sl = netdev_priv(dev);
375 pr_debug("sllin: %s() invoked\n", __FUNCTION__);
380 sl->flags &= (1 << SLF_INUSE);
381 netif_start_queue(dev);
385 /* Hook the destructor so we can free sllin devs at the right point in time */
386 static void sll_free_netdev(struct net_device *dev)
388 int i = dev->base_addr;
390 sllin_devs[i] = NULL;
393 static const struct net_device_ops sll_netdev_ops = {
394 .ndo_open = sll_open,
395 .ndo_stop = sll_close,
396 .ndo_start_xmit = sll_xmit,
399 static void sll_setup(struct net_device *dev)
401 dev->netdev_ops = &sll_netdev_ops;
402 dev->destructor = sll_free_netdev;
404 dev->hard_header_len = 0;
406 dev->tx_queue_len = 10;
408 dev->mtu = sizeof(struct can_frame);
409 dev->type = ARPHRD_CAN;
411 /* New-style flags. */
412 dev->flags = IFF_NOARP;
413 dev->features = NETIF_F_NO_CSUM;
416 /******************************************
417 Routines looking at TTY side.
418 ******************************************/
420 static void sllin_receive_buf(struct tty_struct *tty,
421 const unsigned char *cp, char *fp, int count)
423 struct sllin *sl = (struct sllin *) tty->disc_data;
425 pr_debug("sllin: sllin_receive_buf invoked\n");
427 if (!sl || sl->magic != SLLIN_MAGIC || !netif_running(sl->dev))
430 /* Read the characters out of the buffer */
433 if (!test_and_set_bit(SLF_ERROR, &sl->flags))
434 sl->dev->stats.rx_errors++;
435 pr_debug("sllin: sllin_receive_buf char 0x%02x ignored "
436 "due marker 0x%02x, flags 0x%lx\n",
437 *cp, *(fp-1), sl->flags);
442 if (sl->rx_cnt < SLLIN_BUFF_LEN) {
443 #ifndef BREAK_BY_BAUD
444 /* We didn't receive Break character */
445 if ((sl->rx_cnt == SLLIN_BUFF_BREAK) && (*cp == 0x55)) {
446 sl->rx_buff[sl->rx_cnt++] = 0x00;
449 pr_debug("sllin: LIN_RX[%d]: 0x%02x\n", sl->rx_cnt, *cp);
450 sl->rx_buff[sl->rx_cnt++] = *cp++;
454 if (sl->rx_cnt >= sl->rx_expect) {
455 set_bit(SLF_RXEVENT, &sl->flags);
456 wake_up(&sl->kwt_wq);
457 pr_debug("sllin: sllin_receive_buf count %d, wakeup\n", sl->rx_cnt);
459 pr_debug("sllin: sllin_receive_buf count %d, waiting\n", sl->rx_cnt);
463 /*****************************************
464 * sllin message helper routines
465 *****************************************/
467 * sllin_report_error() -- Report an error by sending CAN frame \
468 * with particular error flag set in can_id
471 * @err: Error flag to be sent.
473 void sllin_report_error(struct sllin *sl, int err)
475 sllin_send_canfr(sl, 0 | CAN_EFF_FLAG |
476 (err & ~SLLIN_ID_MASK), NULL, 0);
480 * sllin_configure_frame_cache() -- Configure particular entry in linfr_cache
483 * @cf: Pointer to CAN frame sent to this driver
484 * holding configuration information
486 static int sllin_configure_frame_cache(struct sllin *sl, struct can_frame *cf)
488 struct sllin_conf_entry *sce;
489 if (!(cf->can_id & SLLIN_LIN_ID_CONF))
492 sce = &sl->linfr_cache[cf->can_id & SLLIN_ID_MASK];
493 pr_debug("sllin: Setting frame cache with EFF CAN frame. "
494 "LIN ID = %d\n", cf->can_id & SLLIN_ID_MASK);
496 sce->dlc = cf->can_dlc;
497 if (sce->dlc > SLLIN_DATA_MAX)
498 sce->dlc = SLLIN_DATA_MAX;
500 sce->frame_fl = (cf->can_id & ~SLLIN_ID_MASK) & CAN_EFF_MASK;
501 memcpy(sce->data, cf->data, cf->can_dlc);
507 * sllin_checksum() -- Count checksum for particular data
509 * @data: Pointer to the buffer containing whole LIN
510 * frame (i.e. including break and sync bytes).
511 * @length: Length of the buffer.
512 * @enhanced_fl: Flag determining whether Enhanced or Classic
513 * checksum should be counted.
515 static inline unsigned sllin_checksum(unsigned char *data, int length, int enhanced_fl)
526 for (; i < length; i++) {
535 #define SLLIN_STPMSG_RESPONLY (1) /* Message will be LIN Response only */
536 #define SLLIN_STPMSG_CHCKSUM_CLS (1 << 1)
537 #define SLLIN_STPMSG_CHCKSUM_ENH (1 << 2)
539 int sllin_setup_msg(struct sllin *sl, int mode, int id,
540 unsigned char *data, int len)
542 if (id > SLLIN_ID_MASK)
545 if (!(mode & SLLIN_STPMSG_RESPONLY)) {
549 sl->rx_lim = SLLIN_BUFF_LEN;
552 sl->tx_buff[SLLIN_BUFF_BREAK] = 0;
553 sl->tx_buff[SLLIN_BUFF_SYNC] = 0x55;
554 sl->tx_buff[SLLIN_BUFF_ID] = id | sllin_id_parity_table[id];
555 sl->tx_lim = SLLIN_BUFF_DATA;
557 if ((data != NULL) && len) {
559 memcpy(sl->tx_buff + SLLIN_BUFF_DATA, data, len);
560 sl->tx_buff[sl->tx_lim++] = sllin_checksum(sl->tx_buff,
561 sl->tx_lim, mode & SLLIN_STPMSG_CHCKSUM_ENH);
564 sl->rx_lim = SLLIN_BUFF_DATA + len + 1;
570 int sllin_send_tx_buff(struct sllin *sl)
572 struct tty_struct *tty = sl->tty;
577 if (sl->lin_state != SLSTATE_BREAK_SENT)
578 remains = sl->tx_lim - sl->tx_cnt;
582 remains = sl->tx_lim - sl->tx_cnt;
585 res = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt, remains);
593 set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
594 res = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt, remains);
596 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
604 pr_debug("sllin: sllin_send_tx_buff sent %d, remains %d\n",
605 sl->tx_cnt, remains);
611 int sllin_send_break(struct sllin *sl)
613 struct tty_struct *tty = sl->tty;
614 unsigned long break_baud;
617 break_baud = ((sl->lin_baud * 2) / 3);
618 sltty_change_speed(tty, break_baud);
620 tty->ops->flush_buffer(tty);
621 sl->rx_cnt = SLLIN_BUFF_BREAK;
623 sl->rx_expect = SLLIN_BUFF_BREAK + 1;
624 sl->lin_state = SLSTATE_BREAK_SENT;
626 res = sllin_send_tx_buff(sl);
628 sl->lin_state = SLSTATE_IDLE;
634 #else /* BREAK_BY_BAUD */
636 int sllin_send_break(struct sllin *sl)
638 struct tty_struct *tty = sl->tty;
640 unsigned long break_baud;
641 unsigned long usleep_range_min;
642 unsigned long usleep_range_max;
644 break_baud = ((sl->lin_baud * 2) / 3);
645 sl->rx_cnt = SLLIN_BUFF_BREAK;
646 sl->rx_expect = SLLIN_BUFF_BREAK + 1;
647 sl->lin_state = SLSTATE_BREAK_SENT;
649 /* Do the break ourselves; Inspired by
650 http://lxr.linux.no/#linux+v3.1.2/drivers/tty/tty_io.c#L2452 */
651 retval = tty->ops->break_ctl(tty, -1);
656 usleep_range_min = (1000000l * SLLIN_SAMPLES_PER_CHAR) / break_baud;
657 usleep_range_max = usleep_range_min + 50;
658 usleep_range(usleep_range_min, usleep_range_max);
660 retval = tty->ops->break_ctl(tty, 0);
661 usleep_range_min = (1000000l * 1 /* 1 bit */) / break_baud;
662 usleep_range_max = usleep_range_min + 30;
663 usleep_range(usleep_range_min, usleep_range_max);
665 tty->ops->flush_buffer(tty);
667 sl->tx_cnt = SLLIN_BUFF_SYNC;
669 pr_debug("sllin: Break sent.\n");
670 set_bit(SLF_RXEVENT, &sl->flags);
671 wake_up(&sl->kwt_wq);
675 #endif /* BREAK_BY_BAUD */
678 static enum hrtimer_restart sllin_rx_timeout_handler(struct hrtimer *hrtimer)
680 struct sllin *sl = container_of(hrtimer, struct sllin, rx_timer);
682 sllin_report_error(sl, SLLIN_ERR_RX_TIMEOUT);
683 set_bit(SLF_TMOUTEVENT, &sl->flags);
684 wake_up(&sl->kwt_wq);
686 return HRTIMER_NORESTART;
690 * sllin_rx_validate() -- Validate received frame, i,e. check checksum
694 static int sllin_rx_validate(struct sllin *sl)
699 unsigned char rec_chcksm = sl->rx_buff[sl->rx_cnt - 1];
700 struct sllin_conf_entry *scf;
702 actual_id = sl->rx_buff[SLLIN_BUFF_ID] & SLLIN_ID_MASK;
703 scf = &sl->linfr_cache[actual_id];
705 ext_chcks_fl = scf->frame_fl & SLLIN_CHECKSUM_EXTENDED;
707 if (sllin_checksum(sl->rx_buff, sl->rx_cnt - 1, ext_chcks_fl) !=
710 /* Type of checksum is configured for particular frame */
714 if (sllin_checksum(sl->rx_buff, sl->rx_cnt - 1,
715 !ext_chcks_fl) != rec_chcksm) {
724 /*****************************************
725 * sllin_kwthread - kernel worker thread
726 *****************************************/
728 int sllin_kwthread(void *ptr)
730 struct sllin *sl = (struct sllin *)ptr;
731 struct tty_struct *tty = sl->tty;
732 struct sched_param schparam = { .sched_priority = 40 };
733 int tx_bytes = 0; /* Used for Network statistics */
736 pr_debug("sllin: sllin_kwthread started.\n");
737 sched_setscheduler(current, SCHED_FIFO, &schparam);
739 clear_bit(SLF_ERROR, &sl->flags);
740 sltty_change_speed(tty, sl->lin_baud);
742 while (!kthread_should_stop()) {
743 struct can_frame *cf;
746 u8 lin_data_buff[SLLIN_DATA_MAX];
749 if ((sl->lin_state == SLSTATE_IDLE) && sl->lin_master &&
751 if(sllin_send_break(sl) < 0) {
752 /* error processing */
756 wait_event_killable(sl->kwt_wq, kthread_should_stop() ||
757 test_bit(SLF_RXEVENT, &sl->flags) ||
758 test_bit(SLF_TXEVENT, &sl->flags) ||
759 test_bit(SLF_TMOUTEVENT, &sl->flags) ||
760 (((sl->lin_state == SLSTATE_IDLE) ||
761 (sl->lin_state == SLSTATE_RESPONSE_WAIT))
762 && test_bit(SLF_MSGEVENT, &sl->flags)));
764 if (test_and_clear_bit(SLF_RXEVENT, &sl->flags)) {
765 pr_debug("sllin: sllin_kthread RXEVENT \n");
768 if (test_and_clear_bit(SLF_TXEVENT, &sl->flags)) {
769 pr_debug("sllin: sllin_kthread TXEVENT \n");
772 if (test_and_clear_bit(SLF_TMOUTEVENT, &sl->flags)) {
773 pr_debug("sllin: sllin_kthread TMOUTEVENT \n");
776 sl->rx_lim = sl->lin_master ? 0 : SLLIN_BUFF_LEN;
779 sl->id_to_send = false;
780 sl->data_to_send = false;
782 sl->lin_state = SLSTATE_IDLE;
785 switch (sl->lin_state) {
787 if (!test_bit(SLF_MSGEVENT, &sl->flags))
790 cf = (struct can_frame *)sl->tx_req_skb->data;
792 /* SFF RTR CAN frame -> LIN header */
793 if (cf->can_id & CAN_RTR_FLAG) {
794 spin_lock(&sl->lock);
795 pr_debug("sllin: %s: RTR SFF CAN frame, ID = %x\n",
796 __FUNCTION__, cf->can_id & SLLIN_ID_MASK);
798 /* Is there Slave response in linfr_cache to be sent? */
799 if ((sl->linfr_cache[cf->can_id & SLLIN_ID_MASK].frame_fl &
800 SLLIN_LOC_SLAVE_CACHE)
801 && (sl->linfr_cache[cf->can_id & SLLIN_ID_MASK].dlc > 0)) {
803 pr_debug("sllin: Sending LIN response from linfr_cache\n");
804 lin_data = sl->linfr_cache[cf->can_id & SLLIN_ID_MASK].data;
805 lin_dlc = sl->linfr_cache[cf->can_id & SLLIN_ID_MASK].dlc;
806 if (lin_dlc > SLLIN_DATA_MAX)
807 lin_dlc = SLLIN_DATA_MAX;
808 memcpy(lin_data_buff, lin_data, lin_dlc);
809 lin_data = lin_data_buff;
812 lin_dlc = sl->linfr_cache[cf->can_id & SLLIN_ID_MASK].dlc;
814 spin_unlock(&sl->lock);
815 } else { /* SFF NON-RTR CAN frame -> LIN header + LIN response */
816 pr_debug("sllin: %s: NON-RTR SFF CAN frame, ID = %x\n",
817 __FUNCTION__, (int)cf->can_id & SLLIN_ID_MASK);
820 lin_dlc = cf->can_dlc;
821 if (lin_dlc > SLLIN_DATA_MAX)
822 lin_dlc = SLLIN_DATA_MAX;
826 if (sllin_setup_msg(sl, 0, cf->can_id & SLLIN_ID_MASK,
827 lin_data, lin_dlc) != -1) {
829 sl->id_to_send = true;
830 sl->data_to_send = (lin_data != NULL) ? true : false;
831 sl->resp_len_known = (lin_dlc > 0) ? true : false;
832 sl->dev->stats.tx_packets++;
833 sl->dev->stats.tx_bytes += tx_bytes;
836 clear_bit(SLF_MSGEVENT, &sl->flags);
837 kfree_skb(sl->tx_req_skb);
838 netif_wake_queue(sl->dev);
841 case SLSTATE_BREAK_SENT:
843 if (sl->rx_cnt <= SLLIN_BUFF_BREAK)
846 res = sltty_change_speed(tty, sl->lin_baud);
849 sl->lin_state = SLSTATE_ID_SENT;
850 sllin_send_tx_buff(sl);
853 case SLSTATE_ID_SENT:
854 sl->id_to_send = false;
855 if (sl->data_to_send) {
856 sllin_send_tx_buff(sl);
857 sl->lin_state = SLSTATE_RESPONSE_SENT;
858 sl->rx_expect = sl->tx_lim;
859 goto slstate_response_sent;
861 if (sl->resp_len_known) {
862 sl->rx_expect = sl->rx_lim;
864 sl->rx_expect = SLLIN_BUFF_DATA + 2;
866 sl->lin_state = SLSTATE_RESPONSE_WAIT;
867 /* If we don't receive anything, timer will "unblock" us */
868 hrtimer_start(&sl->rx_timer,
869 ktime_add(ktime_get(), sl->rx_timer_timeout),
871 goto slstate_response_wait;
875 case SLSTATE_RESPONSE_WAIT:
876 slstate_response_wait:
877 if (test_bit(SLF_MSGEVENT, &sl->flags)) {
878 unsigned char *lin_buff;
879 cf = (struct can_frame *)sl->tx_req_skb->data;
881 lin_buff = (sl->lin_master) ? sl->tx_buff : sl->rx_buff;
882 if (cf->can_id == (lin_buff[SLLIN_BUFF_ID] & SLLIN_ID_MASK)) {
883 if (sllin_setup_msg(sl, SLLIN_STPMSG_RESPONLY,
884 cf->can_id & SLLIN_ID_MASK,
885 cf->data, cf->can_dlc) != -1) {
887 sl->rx_expect = sl->tx_lim;
888 sl->data_to_send = true;
889 sl->dev->stats.tx_packets++;
890 sl->dev->stats.tx_bytes += tx_bytes;
892 if (!sl->lin_master) {
893 sl->tx_cnt = SLLIN_BUFF_DATA;
896 sllin_send_tx_buff(sl);
897 clear_bit(SLF_MSGEVENT, &sl->flags);
898 kfree_skb(sl->tx_req_skb);
899 netif_wake_queue(sl->dev);
901 sl->lin_state = SLSTATE_RESPONSE_SENT;
902 goto slstate_response_sent;
905 sl->lin_state = SLSTATE_RESPONSE_WAIT_BUS;
909 case SLSTATE_RESPONSE_WAIT_BUS:
910 if (sl->rx_cnt < sl->rx_expect)
913 hrtimer_cancel(&sl->rx_timer);
914 pr_debug("sllin: response received ID %d len %d\n",
915 sl->rx_buff[SLLIN_BUFF_ID], sl->rx_cnt - SLLIN_BUFF_DATA - 1);
917 if (sllin_rx_validate(sl) == -1) {
918 pr_debug("sllin: RX validation failed.\n");
919 sllin_report_error(sl, SLLIN_ERR_CHECKSUM);
920 //FIXME tx_stat.err++
922 // send CAN non-RTR frame with data
923 pr_debug("sllin: sending NON-RTR CAN"
924 "frame with LIN payload.");
925 sll_bump(sl); //send packet to the network layer
928 sl->id_to_send = false;
929 sl->lin_state = SLSTATE_IDLE;
932 case SLSTATE_RESPONSE_SENT:
933 slstate_response_sent:
934 if (sl->rx_cnt < sl->tx_lim)
937 sll_bump(sl); //send packet to the network layer
938 pr_debug("sllin: response sent ID %d len %d\n",
939 sl->rx_buff[SLLIN_BUFF_ID], sl->rx_cnt - SLLIN_BUFF_DATA - 1);
941 sl->id_to_send = false;
942 sl->lin_state = SLSTATE_IDLE;
949 /* sl->dev->stats.tx_packets++; send frames statistic */
950 /* netif_wake_queue(sl->dev); allow next Tx packet arrival */
953 hrtimer_cancel(&sl->rx_timer);
954 pr_debug("sllin: sllin_kwthread stopped.\n");
960 /************************************
961 * sllin_open helper routines.
962 ************************************/
964 /* Collect hanged up channels */
965 static void sll_sync(void)
968 struct net_device *dev;
971 for (i = 0; i < maxdev; i++) {
976 sl = netdev_priv(dev);
979 if (dev->flags & IFF_UP)
984 /* Find a free SLLIN channel, and link in this `tty' line. */
985 static struct sllin *sll_alloc(dev_t line)
988 struct net_device *dev = NULL;
991 if (sllin_devs == NULL)
992 return NULL; /* Master array missing ! */
994 for (i = 0; i < maxdev; i++) {
1001 /* Sorry, too many, all slots in use */
1006 sl = netdev_priv(dev);
1007 if (test_bit(SLF_INUSE, &sl->flags)) {
1008 unregister_netdevice(dev);
1010 sllin_devs[i] = NULL;
1015 char name[IFNAMSIZ];
1016 sprintf(name, "sllin%d", i);
1018 dev = alloc_netdev(sizeof(*sl), name, sll_setup);
1024 sl = netdev_priv(dev);
1025 /* Initialize channel control data */
1026 sl->magic = SLLIN_MAGIC;
1028 spin_lock_init(&sl->lock);
1029 sllin_devs[i] = dev;
1035 * Open the high-level part of the SLLIN channel.
1036 * This function is called by the TTY module when the
1037 * SLLIN line discipline is called for. Because we are
1038 * sure the tty line exists, we only have to link it to
1039 * a free SLLIN channel...
1041 * Called in process context serialized from other ldisc calls.
1044 static int sllin_open(struct tty_struct *tty)
1048 pr_debug("sllin: %s() invoked\n", __FUNCTION__);
1050 if (!capable(CAP_NET_ADMIN))
1053 if (tty->ops->write == NULL)
1056 /* RTnetlink lock is misused here to serialize concurrent
1057 opens of sllin channels. There are better ways, but it is
1062 /* Collect hanged up channels. */
1065 sl = tty->disc_data;
1068 /* First make sure we're not already connected. */
1069 if (sl && sl->magic == SLLIN_MAGIC)
1072 /* OK. Find a free SLLIN channel to use. */
1074 sl = sll_alloc(tty_devnum(tty));
1079 tty->disc_data = sl;
1080 sl->line = tty_devnum(tty);
1082 if (!test_bit(SLF_INUSE, &sl->flags)) {
1083 /* Perform the low-level SLLIN initialization. */
1084 sl->lin_master = true;
1088 sl->rx_lim = sl->lin_master ? 0 : SLLIN_BUFF_LEN;
1091 sl->id_to_send = false;
1092 sl->data_to_send = false;
1094 sl->lin_baud = 19200;
1096 sl->lin_state = SLSTATE_IDLE;
1098 hrtimer_init(&sl->rx_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
1099 sl->rx_timer.function = sllin_rx_timeout_handler;
1100 /* timeval_to_ktime(msg_head->ival1); */
1101 sl->rx_timer_timeout = ns_to_ktime(
1102 (1000000000l / sl->lin_baud) *
1103 SLLIN_SAMPLES_PER_CHAR * SLLIN_CHARS_TO_TIMEOUT);
1105 set_bit(SLF_INUSE, &sl->flags);
1107 init_waitqueue_head(&sl->kwt_wq);
1108 sl->kwthread = kthread_run(sllin_kwthread, sl, "sllin");
1109 if (sl->kwthread == NULL)
1112 err = register_netdevice(sl->dev);
1114 goto err_free_chan_and_thread;
1117 /* Done. We have linked the TTY line to a channel. */
1119 tty->receive_room = SLLIN_BUFF_LEN * 40; /* We don't flow control */
1121 /* TTY layer expects 0 on success */
1124 err_free_chan_and_thread:
1125 kthread_stop(sl->kwthread);
1126 sl->kwthread = NULL;
1130 tty->disc_data = NULL;
1131 clear_bit(SLF_INUSE, &sl->flags);
1136 /* Count references from TTY module */
1141 * Close down a SLLIN channel.
1142 * This means flushing out any pending queues, and then returning. This
1143 * call is serialized against other ldisc functions.
1145 * We also use this method for a hangup event.
1148 static void sllin_close(struct tty_struct *tty)
1150 struct sllin *sl = (struct sllin *) tty->disc_data;
1152 /* First make sure we're connected. */
1153 if (!sl || sl->magic != SLLIN_MAGIC || sl->tty != tty)
1156 kthread_stop(sl->kwthread);
1157 sl->kwthread = NULL;
1159 tty->disc_data = NULL;
1162 /* Flush network side */
1163 unregister_netdev(sl->dev);
1164 /* This will complete via sl_free_netdev */
1167 static int sllin_hangup(struct tty_struct *tty)
1173 /* Perform I/O control on an active SLLIN channel. */
1174 static int sllin_ioctl(struct tty_struct *tty, struct file *file,
1175 unsigned int cmd, unsigned long arg)
1177 struct sllin *sl = (struct sllin *) tty->disc_data;
1180 /* First make sure we're connected. */
1181 if (!sl || sl->magic != SLLIN_MAGIC)
1186 tmp = strlen(sl->dev->name) + 1;
1187 if (copy_to_user((void __user *)arg, sl->dev->name, tmp))
1195 return tty_mode_ioctl(tty, file, cmd, arg);
1199 static struct tty_ldisc_ops sll_ldisc = {
1200 .owner = THIS_MODULE,
1201 .magic = TTY_LDISC_MAGIC,
1204 .close = sllin_close,
1205 .hangup = sllin_hangup,
1206 .ioctl = sllin_ioctl,
1207 .receive_buf = sllin_receive_buf,
1208 .write_wakeup = sllin_write_wakeup,
1211 static int __init sllin_init(void)
1216 maxdev = 4; /* Sanity */
1219 pr_debug("sllin: %d dynamic interface channels.\n", maxdev);
1221 sllin_devs = kzalloc(sizeof(struct net_device *)*maxdev, GFP_KERNEL);
1223 printk(KERN_ERR "sllin: can't allocate sllin device array!\n");
1227 /* Fill in our line protocol discipline, and register it */
1228 status = tty_register_ldisc(N_SLLIN, &sll_ldisc);
1230 printk(KERN_ERR "sllin: can't register line discipline\n");
1234 #ifdef BREAK_BY_BAUD
1235 pr_debug("sllin: Break is generated by baud-rate change.");
1237 pr_debug("sllin: Break is generated manually with tiny sleep.");
1243 static void __exit sllin_exit(void)
1246 struct net_device *dev;
1248 unsigned long timeout = jiffies + HZ;
1251 if (sllin_devs == NULL)
1254 /* First of all: check for active disciplines and hangup them.
1258 msleep_interruptible(100);
1261 for (i = 0; i < maxdev; i++) {
1262 dev = sllin_devs[i];
1265 sl = netdev_priv(dev);
1266 spin_lock_bh(&sl->lock);
1269 tty_hangup(sl->tty);
1271 spin_unlock_bh(&sl->lock);
1273 } while (busy && time_before(jiffies, timeout));
1275 /* FIXME: hangup is async so we should wait when doing this second
1278 for (i = 0; i < maxdev; i++) {
1279 dev = sllin_devs[i];
1282 sllin_devs[i] = NULL;
1284 sl = netdev_priv(dev);
1286 printk(KERN_ERR "%s: tty discipline still running\n",
1288 /* Intentionally leak the control block. */
1289 dev->destructor = NULL;
1292 unregister_netdev(dev);
1298 i = tty_unregister_ldisc(N_SLLIN);
1300 printk(KERN_ERR "sllin: can't unregister ldisc (err %d)\n", i);
1303 module_init(sllin_init);
1304 module_exit(sllin_exit);