xref: /openbmc/linux/drivers/net/can/slcan/slcan-core.c (revision 892bc209)
198b12064SDario Binacchi /*
298b12064SDario Binacchi  * slcan.c - serial line CAN interface driver (using tty line discipline)
398b12064SDario Binacchi  *
4cfcb4465SDario Binacchi  * This file is derived from linux/drivers/net/slip/slip.c and got
5cfcb4465SDario Binacchi  * inspiration from linux/drivers/net/can/can327.c for the rework made
6cfcb4465SDario Binacchi  * on the line discipline code.
798b12064SDario Binacchi  *
898b12064SDario Binacchi  * slip.c Authors  : Laurence Culhane <loz@holmes.demon.co.uk>
998b12064SDario Binacchi  *                   Fred N. van Kempen <waltje@uwalt.nl.mugnet.org>
1098b12064SDario Binacchi  * slcan.c Author  : Oliver Hartkopp <socketcan@hartkopp.net>
11cfcb4465SDario Binacchi  * can327.c Author : Max Staudt <max-linux@enpas.org>
1298b12064SDario Binacchi  *
1398b12064SDario Binacchi  * This program is free software; you can redistribute it and/or modify it
1498b12064SDario Binacchi  * under the terms of the GNU General Public License as published by the
1598b12064SDario Binacchi  * Free Software Foundation; either version 2 of the License, or (at your
1698b12064SDario Binacchi  * option) any later version.
1798b12064SDario Binacchi  *
1898b12064SDario Binacchi  * This program is distributed in the hope that it will be useful, but
1998b12064SDario Binacchi  * WITHOUT ANY WARRANTY; without even the implied warranty of
2098b12064SDario Binacchi  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2198b12064SDario Binacchi  * General Public License for more details.
2298b12064SDario Binacchi  *
2398b12064SDario Binacchi  * You should have received a copy of the GNU General Public License along
2498b12064SDario Binacchi  * with this program; if not, see http://www.gnu.org/licenses/gpl.html
2598b12064SDario Binacchi  *
2698b12064SDario Binacchi  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2798b12064SDario Binacchi  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2898b12064SDario Binacchi  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2998b12064SDario Binacchi  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3098b12064SDario Binacchi  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3198b12064SDario Binacchi  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3298b12064SDario Binacchi  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3398b12064SDario Binacchi  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3498b12064SDario Binacchi  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3598b12064SDario Binacchi  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3698b12064SDario Binacchi  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
3798b12064SDario Binacchi  * DAMAGE.
3898b12064SDario Binacchi  *
3998b12064SDario Binacchi  */
4098b12064SDario Binacchi 
41e2c9bb02SVincent Mailhol #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
42e2c9bb02SVincent Mailhol 
4398b12064SDario Binacchi #include <linux/module.h>
4498b12064SDario Binacchi 
4598b12064SDario Binacchi #include <linux/uaccess.h>
4698b12064SDario Binacchi #include <linux/bitops.h>
4798b12064SDario Binacchi #include <linux/string.h>
4898b12064SDario Binacchi #include <linux/tty.h>
4998b12064SDario Binacchi #include <linux/errno.h>
5098b12064SDario Binacchi #include <linux/netdevice.h>
5198b12064SDario Binacchi #include <linux/skbuff.h>
5298b12064SDario Binacchi #include <linux/rtnetlink.h>
5398b12064SDario Binacchi #include <linux/init.h>
5498b12064SDario Binacchi #include <linux/kernel.h>
5598b12064SDario Binacchi #include <linux/workqueue.h>
5698b12064SDario Binacchi #include <linux/can.h>
5798b12064SDario Binacchi #include <linux/can/dev.h>
5898b12064SDario Binacchi #include <linux/can/skb.h>
5998b12064SDario Binacchi 
604de0e8efSDario Binacchi #include "slcan.h"
614de0e8efSDario Binacchi 
6298b12064SDario Binacchi MODULE_ALIAS_LDISC(N_SLCAN);
6398b12064SDario Binacchi MODULE_DESCRIPTION("serial line CAN interface");
6498b12064SDario Binacchi MODULE_LICENSE("GPL");
6598b12064SDario Binacchi MODULE_AUTHOR("Oliver Hartkopp <socketcan@hartkopp.net>");
664aeccfd8SDario Binacchi MODULE_AUTHOR("Dario Binacchi <dario.binacchi@amarulasolutions.com>");
6798b12064SDario Binacchi 
6898b12064SDario Binacchi /* maximum rx buffer len: extended CAN frame with timestamp */
690cef03b1SDario Binacchi #define SLCAN_MTU (sizeof("T1111222281122334455667788EA5F\r") + 1)
7098b12064SDario Binacchi 
710cef03b1SDario Binacchi #define SLCAN_CMD_LEN 1
720cef03b1SDario Binacchi #define SLCAN_SFF_ID_LEN 3
730cef03b1SDario Binacchi #define SLCAN_EFF_ID_LEN 8
740cef03b1SDario Binacchi #define SLCAN_STATE_LEN 1
750cef03b1SDario Binacchi #define SLCAN_STATE_BE_RXCNT_LEN 3
760cef03b1SDario Binacchi #define SLCAN_STATE_BE_TXCNT_LEN 3
770cef03b1SDario Binacchi #define SLCAN_STATE_FRAME_LEN       (1 + SLCAN_CMD_LEN + \
780cef03b1SDario Binacchi 				     SLCAN_STATE_BE_RXCNT_LEN + \
790cef03b1SDario Binacchi 				     SLCAN_STATE_BE_TXCNT_LEN)
8098b12064SDario Binacchi struct slcan {
8198b12064SDario Binacchi 	struct can_priv         can;
8298b12064SDario Binacchi 
8398b12064SDario Binacchi 	/* Various fields. */
8498b12064SDario Binacchi 	struct tty_struct	*tty;		/* ptr to TTY structure	     */
8598b12064SDario Binacchi 	struct net_device	*dev;		/* easy for intr handling    */
8698b12064SDario Binacchi 	spinlock_t		lock;
8798b12064SDario Binacchi 	struct work_struct	tx_work;	/* Flushes transmit buffer   */
8898b12064SDario Binacchi 
8998b12064SDario Binacchi 	/* These are pointers to the malloc()ed frame buffers. */
900cef03b1SDario Binacchi 	unsigned char		rbuff[SLCAN_MTU];	/* receiver buffer   */
9198b12064SDario Binacchi 	int			rcount;         /* received chars counter    */
920cef03b1SDario Binacchi 	unsigned char		xbuff[SLCAN_MTU];	/* transmitter buffer*/
9398b12064SDario Binacchi 	unsigned char		*xhead;         /* pointer to next XMIT byte */
9498b12064SDario Binacchi 	int			xleft;          /* bytes left in XMIT queue  */
9598b12064SDario Binacchi 
9698b12064SDario Binacchi 	unsigned long		flags;		/* Flag values/ mode etc     */
97cfcb4465SDario Binacchi #define SLF_ERROR		0               /* Parity, etc. error        */
98cfcb4465SDario Binacchi #define SLF_XCMD		1               /* Command transmission      */
994de0e8efSDario Binacchi 	unsigned long           cmd_flags;      /* Command flags             */
1004de0e8efSDario Binacchi #define CF_ERR_RST		0               /* Reset errors on open      */
10198b12064SDario Binacchi 	wait_queue_head_t       xcmd_wait;      /* Wait queue for commands   */
10298b12064SDario Binacchi 						/* transmission              */
10398b12064SDario Binacchi };
10498b12064SDario Binacchi 
10598b12064SDario Binacchi static const u32 slcan_bitrate_const[] = {
10698b12064SDario Binacchi 	10000, 20000, 50000, 100000, 125000,
10798b12064SDario Binacchi 	250000, 500000, 800000, 1000000
10898b12064SDario Binacchi };
10998b12064SDario Binacchi 
slcan_err_rst_on_open(struct net_device * ndev)1104de0e8efSDario Binacchi bool slcan_err_rst_on_open(struct net_device *ndev)
1114de0e8efSDario Binacchi {
1124de0e8efSDario Binacchi 	struct slcan *sl = netdev_priv(ndev);
1134de0e8efSDario Binacchi 
1144de0e8efSDario Binacchi 	return !!test_bit(CF_ERR_RST, &sl->cmd_flags);
1154de0e8efSDario Binacchi }
1164de0e8efSDario Binacchi 
slcan_enable_err_rst_on_open(struct net_device * ndev,bool on)1174de0e8efSDario Binacchi int slcan_enable_err_rst_on_open(struct net_device *ndev, bool on)
1184de0e8efSDario Binacchi {
1194de0e8efSDario Binacchi 	struct slcan *sl = netdev_priv(ndev);
1204de0e8efSDario Binacchi 
1214de0e8efSDario Binacchi 	if (netif_running(ndev))
1224de0e8efSDario Binacchi 		return -EBUSY;
1234de0e8efSDario Binacchi 
1244de0e8efSDario Binacchi 	if (on)
1254de0e8efSDario Binacchi 		set_bit(CF_ERR_RST, &sl->cmd_flags);
1264de0e8efSDario Binacchi 	else
1274de0e8efSDario Binacchi 		clear_bit(CF_ERR_RST, &sl->cmd_flags);
1284de0e8efSDario Binacchi 
1294de0e8efSDario Binacchi 	return 0;
1304de0e8efSDario Binacchi }
1314de0e8efSDario Binacchi 
13271f3a4ccSMarc Kleine-Budde /*************************************************************************
13398b12064SDario Binacchi  *			SLCAN ENCAPSULATION FORMAT			 *
13471f3a4ccSMarc Kleine-Budde  *************************************************************************/
13598b12064SDario Binacchi 
13671f3a4ccSMarc Kleine-Budde /* A CAN frame has a can_id (11 bit standard frame format OR 29 bit extended
13798b12064SDario Binacchi  * frame format) a data length code (len) which can be from 0 to 8
13898b12064SDario Binacchi  * and up to <len> data bytes as payload.
13998b12064SDario Binacchi  * Additionally a CAN frame may become a remote transmission frame if the
14098b12064SDario Binacchi  * RTR-bit is set. This causes another ECU to send a CAN frame with the
14198b12064SDario Binacchi  * given can_id.
14298b12064SDario Binacchi  *
14398b12064SDario Binacchi  * The SLCAN ASCII representation of these different frame types is:
14498b12064SDario Binacchi  * <type> <id> <dlc> <data>*
14598b12064SDario Binacchi  *
14698b12064SDario Binacchi  * Extended frames (29 bit) are defined by capital characters in the type.
14798b12064SDario Binacchi  * RTR frames are defined as 'r' types - normal frames have 't' type:
14898b12064SDario Binacchi  * t => 11 bit data frame
14998b12064SDario Binacchi  * r => 11 bit RTR frame
15098b12064SDario Binacchi  * T => 29 bit data frame
15198b12064SDario Binacchi  * R => 29 bit RTR frame
15298b12064SDario Binacchi  *
15398b12064SDario Binacchi  * The <id> is 3 (standard) or 8 (extended) bytes in ASCII Hex (base64).
15498b12064SDario Binacchi  * The <dlc> is a one byte ASCII number ('0' - '8')
15598b12064SDario Binacchi  * The <data> section has at much ASCII Hex bytes as defined by the <dlc>
15698b12064SDario Binacchi  *
15798b12064SDario Binacchi  * Examples:
15898b12064SDario Binacchi  *
15998b12064SDario Binacchi  * t1230 : can_id 0x123, len 0, no data
16098b12064SDario Binacchi  * t4563112233 : can_id 0x456, len 3, data 0x11 0x22 0x33
16198b12064SDario Binacchi  * T12ABCDEF2AA55 : extended can_id 0x12ABCDEF, len 2, data 0xAA 0x55
16298b12064SDario Binacchi  * r1230 : can_id 0x123, len 0, no data, remote transmission request
16398b12064SDario Binacchi  *
16498b12064SDario Binacchi  */
16598b12064SDario Binacchi 
16671f3a4ccSMarc Kleine-Budde /*************************************************************************
16798b12064SDario Binacchi  *			STANDARD SLCAN DECAPSULATION			 *
16871f3a4ccSMarc Kleine-Budde  *************************************************************************/
16998b12064SDario Binacchi 
17098b12064SDario Binacchi /* Send one completely decapsulated can_frame to the network layer */
slcan_bump_frame(struct slcan * sl)1710cef03b1SDario Binacchi static void slcan_bump_frame(struct slcan *sl)
17298b12064SDario Binacchi {
17398b12064SDario Binacchi 	struct sk_buff *skb;
17498b12064SDario Binacchi 	struct can_frame *cf;
17598b12064SDario Binacchi 	int i, tmp;
17698b12064SDario Binacchi 	u32 tmpid;
17798b12064SDario Binacchi 	char *cmd = sl->rbuff;
17898b12064SDario Binacchi 
17998b12064SDario Binacchi 	skb = alloc_can_skb(sl->dev, &cf);
18098b12064SDario Binacchi 	if (unlikely(!skb)) {
18198b12064SDario Binacchi 		sl->dev->stats.rx_dropped++;
18298b12064SDario Binacchi 		return;
18398b12064SDario Binacchi 	}
18498b12064SDario Binacchi 
18598b12064SDario Binacchi 	switch (*cmd) {
18698b12064SDario Binacchi 	case 'r':
18798b12064SDario Binacchi 		cf->can_id = CAN_RTR_FLAG;
18898b12064SDario Binacchi 		fallthrough;
18998b12064SDario Binacchi 	case 't':
19098b12064SDario Binacchi 		/* store dlc ASCII value and terminate SFF CAN ID string */
1910cef03b1SDario Binacchi 		cf->len = sl->rbuff[SLCAN_CMD_LEN + SLCAN_SFF_ID_LEN];
1920cef03b1SDario Binacchi 		sl->rbuff[SLCAN_CMD_LEN + SLCAN_SFF_ID_LEN] = 0;
19398b12064SDario Binacchi 		/* point to payload data behind the dlc */
1940cef03b1SDario Binacchi 		cmd += SLCAN_CMD_LEN + SLCAN_SFF_ID_LEN + 1;
19598b12064SDario Binacchi 		break;
19698b12064SDario Binacchi 	case 'R':
19798b12064SDario Binacchi 		cf->can_id = CAN_RTR_FLAG;
19898b12064SDario Binacchi 		fallthrough;
19998b12064SDario Binacchi 	case 'T':
20098b12064SDario Binacchi 		cf->can_id |= CAN_EFF_FLAG;
20198b12064SDario Binacchi 		/* store dlc ASCII value and terminate EFF CAN ID string */
2020cef03b1SDario Binacchi 		cf->len = sl->rbuff[SLCAN_CMD_LEN + SLCAN_EFF_ID_LEN];
2030cef03b1SDario Binacchi 		sl->rbuff[SLCAN_CMD_LEN + SLCAN_EFF_ID_LEN] = 0;
20498b12064SDario Binacchi 		/* point to payload data behind the dlc */
2050cef03b1SDario Binacchi 		cmd += SLCAN_CMD_LEN + SLCAN_EFF_ID_LEN + 1;
20698b12064SDario Binacchi 		break;
20798b12064SDario Binacchi 	default:
20898b12064SDario Binacchi 		goto decode_failed;
20998b12064SDario Binacchi 	}
21098b12064SDario Binacchi 
2110cef03b1SDario Binacchi 	if (kstrtou32(sl->rbuff + SLCAN_CMD_LEN, 16, &tmpid))
21298b12064SDario Binacchi 		goto decode_failed;
21398b12064SDario Binacchi 
21498b12064SDario Binacchi 	cf->can_id |= tmpid;
21598b12064SDario Binacchi 
21698b12064SDario Binacchi 	/* get len from sanitized ASCII value */
21798b12064SDario Binacchi 	if (cf->len >= '0' && cf->len < '9')
21898b12064SDario Binacchi 		cf->len -= '0';
21998b12064SDario Binacchi 	else
22098b12064SDario Binacchi 		goto decode_failed;
22198b12064SDario Binacchi 
22298b12064SDario Binacchi 	/* RTR frames may have a dlc > 0 but they never have any data bytes */
22398b12064SDario Binacchi 	if (!(cf->can_id & CAN_RTR_FLAG)) {
22498b12064SDario Binacchi 		for (i = 0; i < cf->len; i++) {
22598b12064SDario Binacchi 			tmp = hex_to_bin(*cmd++);
22698b12064SDario Binacchi 			if (tmp < 0)
22798b12064SDario Binacchi 				goto decode_failed;
22898b12064SDario Binacchi 
22998b12064SDario Binacchi 			cf->data[i] = (tmp << 4);
23098b12064SDario Binacchi 			tmp = hex_to_bin(*cmd++);
23198b12064SDario Binacchi 			if (tmp < 0)
23298b12064SDario Binacchi 				goto decode_failed;
23398b12064SDario Binacchi 
23498b12064SDario Binacchi 			cf->data[i] |= tmp;
23598b12064SDario Binacchi 		}
23698b12064SDario Binacchi 	}
23798b12064SDario Binacchi 
23898b12064SDario Binacchi 	sl->dev->stats.rx_packets++;
23998b12064SDario Binacchi 	if (!(cf->can_id & CAN_RTR_FLAG))
24098b12064SDario Binacchi 		sl->dev->stats.rx_bytes += cf->len;
24198b12064SDario Binacchi 
24298b12064SDario Binacchi 	netif_rx(skb);
24398b12064SDario Binacchi 	return;
24498b12064SDario Binacchi 
24598b12064SDario Binacchi decode_failed:
24698b12064SDario Binacchi 	sl->dev->stats.rx_errors++;
24798b12064SDario Binacchi 	dev_kfree_skb(skb);
24898b12064SDario Binacchi }
24998b12064SDario Binacchi 
2500a9cdcf0SDario Binacchi /* A change state frame must contain state info and receive and transmit
2510a9cdcf0SDario Binacchi  * error counters.
2520a9cdcf0SDario Binacchi  *
2530a9cdcf0SDario Binacchi  * Examples:
2540a9cdcf0SDario Binacchi  *
2550a9cdcf0SDario Binacchi  * sb256256 : state bus-off: rx counter 256, tx counter 256
2560a9cdcf0SDario Binacchi  * sa057033 : state active, rx counter 57, tx counter 33
2570a9cdcf0SDario Binacchi  */
slcan_bump_state(struct slcan * sl)2580cef03b1SDario Binacchi static void slcan_bump_state(struct slcan *sl)
2590a9cdcf0SDario Binacchi {
2600a9cdcf0SDario Binacchi 	struct net_device *dev = sl->dev;
2610a9cdcf0SDario Binacchi 	struct sk_buff *skb;
2620a9cdcf0SDario Binacchi 	struct can_frame *cf;
2630a9cdcf0SDario Binacchi 	char *cmd = sl->rbuff;
2640a9cdcf0SDario Binacchi 	u32 rxerr, txerr;
2650a9cdcf0SDario Binacchi 	enum can_state state, rx_state, tx_state;
2660a9cdcf0SDario Binacchi 
2670a9cdcf0SDario Binacchi 	switch (cmd[1]) {
2680a9cdcf0SDario Binacchi 	case 'a':
2690a9cdcf0SDario Binacchi 		state = CAN_STATE_ERROR_ACTIVE;
2700a9cdcf0SDario Binacchi 		break;
2710a9cdcf0SDario Binacchi 	case 'w':
2720a9cdcf0SDario Binacchi 		state = CAN_STATE_ERROR_WARNING;
2730a9cdcf0SDario Binacchi 		break;
2740a9cdcf0SDario Binacchi 	case 'p':
2750a9cdcf0SDario Binacchi 		state = CAN_STATE_ERROR_PASSIVE;
2760a9cdcf0SDario Binacchi 		break;
2770a9cdcf0SDario Binacchi 	case 'b':
2780a9cdcf0SDario Binacchi 		state = CAN_STATE_BUS_OFF;
2790a9cdcf0SDario Binacchi 		break;
2800a9cdcf0SDario Binacchi 	default:
2810a9cdcf0SDario Binacchi 		return;
2820a9cdcf0SDario Binacchi 	}
2830a9cdcf0SDario Binacchi 
2840cef03b1SDario Binacchi 	if (state == sl->can.state || sl->rcount < SLCAN_STATE_FRAME_LEN)
2850a9cdcf0SDario Binacchi 		return;
2860a9cdcf0SDario Binacchi 
2870cef03b1SDario Binacchi 	cmd += SLCAN_STATE_BE_RXCNT_LEN + SLCAN_CMD_LEN + 1;
2880cef03b1SDario Binacchi 	cmd[SLCAN_STATE_BE_TXCNT_LEN] = 0;
2890a9cdcf0SDario Binacchi 	if (kstrtou32(cmd, 10, &txerr))
2900a9cdcf0SDario Binacchi 		return;
2910a9cdcf0SDario Binacchi 
2920a9cdcf0SDario Binacchi 	*cmd = 0;
2930cef03b1SDario Binacchi 	cmd -= SLCAN_STATE_BE_RXCNT_LEN;
2940a9cdcf0SDario Binacchi 	if (kstrtou32(cmd, 10, &rxerr))
2950a9cdcf0SDario Binacchi 		return;
2960a9cdcf0SDario Binacchi 
2970a9cdcf0SDario Binacchi 	skb = alloc_can_err_skb(dev, &cf);
2980a9cdcf0SDario Binacchi 
2990a9cdcf0SDario Binacchi 	tx_state = txerr >= rxerr ? state : 0;
3000a9cdcf0SDario Binacchi 	rx_state = txerr <= rxerr ? state : 0;
3010a9cdcf0SDario Binacchi 	can_change_state(dev, cf, tx_state, rx_state);
3020a9cdcf0SDario Binacchi 
303ce0e7aebSVincent Mailhol 	if (state == CAN_STATE_BUS_OFF) {
3040a9cdcf0SDario Binacchi 		can_bus_off(dev);
305ce0e7aebSVincent Mailhol 	} else if (skb) {
3063e5c291cSVincent Mailhol 		cf->can_id |= CAN_ERR_CNT;
307ce0e7aebSVincent Mailhol 		cf->data[6] = txerr;
308ce0e7aebSVincent Mailhol 		cf->data[7] = rxerr;
309ce0e7aebSVincent Mailhol 	}
3100a9cdcf0SDario Binacchi 
3110a9cdcf0SDario Binacchi 	if (skb)
3120a9cdcf0SDario Binacchi 		netif_rx(skb);
3130a9cdcf0SDario Binacchi }
3140a9cdcf0SDario Binacchi 
315b32ff466SDario Binacchi /* An error frame can contain more than one type of error.
316b32ff466SDario Binacchi  *
317b32ff466SDario Binacchi  * Examples:
318b32ff466SDario Binacchi  *
319b32ff466SDario Binacchi  * e1a : len 1, errors: ACK error
320b32ff466SDario Binacchi  * e3bcO: len 3, errors: Bit0 error, CRC error, Tx overrun error
321b32ff466SDario Binacchi  */
slcan_bump_err(struct slcan * sl)3220cef03b1SDario Binacchi static void slcan_bump_err(struct slcan *sl)
323b32ff466SDario Binacchi {
324b32ff466SDario Binacchi 	struct net_device *dev = sl->dev;
325b32ff466SDario Binacchi 	struct sk_buff *skb;
326b32ff466SDario Binacchi 	struct can_frame *cf;
327b32ff466SDario Binacchi 	char *cmd = sl->rbuff;
328b32ff466SDario Binacchi 	bool rx_errors = false, tx_errors = false, rx_over_errors = false;
329b32ff466SDario Binacchi 	int i, len;
330b32ff466SDario Binacchi 
331b32ff466SDario Binacchi 	/* get len from sanitized ASCII value */
332b32ff466SDario Binacchi 	len = cmd[1];
333b32ff466SDario Binacchi 	if (len >= '0' && len < '9')
334b32ff466SDario Binacchi 		len -= '0';
335b32ff466SDario Binacchi 	else
336b32ff466SDario Binacchi 		return;
337b32ff466SDario Binacchi 
3380cef03b1SDario Binacchi 	if ((len + SLCAN_CMD_LEN + 1) > sl->rcount)
339b32ff466SDario Binacchi 		return;
340b32ff466SDario Binacchi 
341b32ff466SDario Binacchi 	skb = alloc_can_err_skb(dev, &cf);
342b32ff466SDario Binacchi 
343b32ff466SDario Binacchi 	if (skb)
344b32ff466SDario Binacchi 		cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;
345b32ff466SDario Binacchi 
3460cef03b1SDario Binacchi 	cmd += SLCAN_CMD_LEN + 1;
347b32ff466SDario Binacchi 	for (i = 0; i < len; i++, cmd++) {
348b32ff466SDario Binacchi 		switch (*cmd) {
349b32ff466SDario Binacchi 		case 'a':
350b32ff466SDario Binacchi 			netdev_dbg(dev, "ACK error\n");
351b32ff466SDario Binacchi 			tx_errors = true;
352b32ff466SDario Binacchi 			if (skb) {
353b32ff466SDario Binacchi 				cf->can_id |= CAN_ERR_ACK;
354b32ff466SDario Binacchi 				cf->data[3] = CAN_ERR_PROT_LOC_ACK;
355b32ff466SDario Binacchi 			}
356b32ff466SDario Binacchi 
357b32ff466SDario Binacchi 			break;
358b32ff466SDario Binacchi 		case 'b':
359b32ff466SDario Binacchi 			netdev_dbg(dev, "Bit0 error\n");
360b32ff466SDario Binacchi 			tx_errors = true;
361b32ff466SDario Binacchi 			if (skb)
362b32ff466SDario Binacchi 				cf->data[2] |= CAN_ERR_PROT_BIT0;
363b32ff466SDario Binacchi 
364b32ff466SDario Binacchi 			break;
365b32ff466SDario Binacchi 		case 'B':
366b32ff466SDario Binacchi 			netdev_dbg(dev, "Bit1 error\n");
367b32ff466SDario Binacchi 			tx_errors = true;
368b32ff466SDario Binacchi 			if (skb)
369b32ff466SDario Binacchi 				cf->data[2] |= CAN_ERR_PROT_BIT1;
370b32ff466SDario Binacchi 
371b32ff466SDario Binacchi 			break;
372b32ff466SDario Binacchi 		case 'c':
373b32ff466SDario Binacchi 			netdev_dbg(dev, "CRC error\n");
374b32ff466SDario Binacchi 			rx_errors = true;
375b32ff466SDario Binacchi 			if (skb) {
376b32ff466SDario Binacchi 				cf->data[2] |= CAN_ERR_PROT_BIT;
377b32ff466SDario Binacchi 				cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ;
378b32ff466SDario Binacchi 			}
379b32ff466SDario Binacchi 
380b32ff466SDario Binacchi 			break;
381b32ff466SDario Binacchi 		case 'f':
382b32ff466SDario Binacchi 			netdev_dbg(dev, "Form Error\n");
383b32ff466SDario Binacchi 			rx_errors = true;
384b32ff466SDario Binacchi 			if (skb)
385b32ff466SDario Binacchi 				cf->data[2] |= CAN_ERR_PROT_FORM;
386b32ff466SDario Binacchi 
387b32ff466SDario Binacchi 			break;
388b32ff466SDario Binacchi 		case 'o':
389b32ff466SDario Binacchi 			netdev_dbg(dev, "Rx overrun error\n");
390b32ff466SDario Binacchi 			rx_over_errors = true;
391b32ff466SDario Binacchi 			rx_errors = true;
392b32ff466SDario Binacchi 			if (skb) {
393b32ff466SDario Binacchi 				cf->can_id |= CAN_ERR_CRTL;
394b32ff466SDario Binacchi 				cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
395b32ff466SDario Binacchi 			}
396b32ff466SDario Binacchi 
397b32ff466SDario Binacchi 			break;
398b32ff466SDario Binacchi 		case 'O':
399b32ff466SDario Binacchi 			netdev_dbg(dev, "Tx overrun error\n");
400b32ff466SDario Binacchi 			tx_errors = true;
401b32ff466SDario Binacchi 			if (skb) {
402b32ff466SDario Binacchi 				cf->can_id |= CAN_ERR_CRTL;
403b32ff466SDario Binacchi 				cf->data[1] = CAN_ERR_CRTL_TX_OVERFLOW;
404b32ff466SDario Binacchi 			}
405b32ff466SDario Binacchi 
406b32ff466SDario Binacchi 			break;
407b32ff466SDario Binacchi 		case 's':
408b32ff466SDario Binacchi 			netdev_dbg(dev, "Stuff error\n");
409b32ff466SDario Binacchi 			rx_errors = true;
410b32ff466SDario Binacchi 			if (skb)
411b32ff466SDario Binacchi 				cf->data[2] |= CAN_ERR_PROT_STUFF;
412b32ff466SDario Binacchi 
413b32ff466SDario Binacchi 			break;
414b32ff466SDario Binacchi 		default:
415b32ff466SDario Binacchi 			if (skb)
416b32ff466SDario Binacchi 				dev_kfree_skb(skb);
417b32ff466SDario Binacchi 
418b32ff466SDario Binacchi 			return;
419b32ff466SDario Binacchi 		}
420b32ff466SDario Binacchi 	}
421b32ff466SDario Binacchi 
422b32ff466SDario Binacchi 	if (rx_errors)
423b32ff466SDario Binacchi 		dev->stats.rx_errors++;
424b32ff466SDario Binacchi 
425b32ff466SDario Binacchi 	if (rx_over_errors)
426b32ff466SDario Binacchi 		dev->stats.rx_over_errors++;
427b32ff466SDario Binacchi 
428b32ff466SDario Binacchi 	if (tx_errors)
429b32ff466SDario Binacchi 		dev->stats.tx_errors++;
430b32ff466SDario Binacchi 
431b32ff466SDario Binacchi 	if (skb)
432b32ff466SDario Binacchi 		netif_rx(skb);
433b32ff466SDario Binacchi }
434b32ff466SDario Binacchi 
slcan_bump(struct slcan * sl)4350cef03b1SDario Binacchi static void slcan_bump(struct slcan *sl)
436b32ff466SDario Binacchi {
437b32ff466SDario Binacchi 	switch (sl->rbuff[0]) {
438b32ff466SDario Binacchi 	case 'r':
439b32ff466SDario Binacchi 		fallthrough;
440b32ff466SDario Binacchi 	case 't':
441b32ff466SDario Binacchi 		fallthrough;
442b32ff466SDario Binacchi 	case 'R':
443b32ff466SDario Binacchi 		fallthrough;
444b32ff466SDario Binacchi 	case 'T':
4450cef03b1SDario Binacchi 		return slcan_bump_frame(sl);
446b32ff466SDario Binacchi 	case 'e':
4470cef03b1SDario Binacchi 		return slcan_bump_err(sl);
4480a9cdcf0SDario Binacchi 	case 's':
4490cef03b1SDario Binacchi 		return slcan_bump_state(sl);
450b32ff466SDario Binacchi 	default:
451b32ff466SDario Binacchi 		return;
452b32ff466SDario Binacchi 	}
453b32ff466SDario Binacchi }
454b32ff466SDario Binacchi 
45598b12064SDario Binacchi /* parse tty input stream */
slcan_unesc(struct slcan * sl,unsigned char s)45698b12064SDario Binacchi static void slcan_unesc(struct slcan *sl, unsigned char s)
45798b12064SDario Binacchi {
45898b12064SDario Binacchi 	if ((s == '\r') || (s == '\a')) { /* CR or BEL ends the pdu */
45998b12064SDario Binacchi 		if (!test_and_clear_bit(SLF_ERROR, &sl->flags) &&
46018de712aSMarc Kleine-Budde 		    sl->rcount > 4)
4610cef03b1SDario Binacchi 			slcan_bump(sl);
46218de712aSMarc Kleine-Budde 
46398b12064SDario Binacchi 		sl->rcount = 0;
46498b12064SDario Binacchi 	} else {
46598b12064SDario Binacchi 		if (!test_bit(SLF_ERROR, &sl->flags))  {
4660cef03b1SDario Binacchi 			if (sl->rcount < SLCAN_MTU)  {
46798b12064SDario Binacchi 				sl->rbuff[sl->rcount++] = s;
46898b12064SDario Binacchi 				return;
46918de712aSMarc Kleine-Budde 			}
47018de712aSMarc Kleine-Budde 
47198b12064SDario Binacchi 			sl->dev->stats.rx_over_errors++;
47298b12064SDario Binacchi 			set_bit(SLF_ERROR, &sl->flags);
47398b12064SDario Binacchi 		}
47498b12064SDario Binacchi 	}
47598b12064SDario Binacchi }
47698b12064SDario Binacchi 
47771f3a4ccSMarc Kleine-Budde /*************************************************************************
47898b12064SDario Binacchi  *			STANDARD SLCAN ENCAPSULATION			 *
47971f3a4ccSMarc Kleine-Budde  *************************************************************************/
48098b12064SDario Binacchi 
48198b12064SDario Binacchi /* Encapsulate one can_frame and stuff into a TTY queue. */
slcan_encaps(struct slcan * sl,struct can_frame * cf)4820cef03b1SDario Binacchi static void slcan_encaps(struct slcan *sl, struct can_frame *cf)
48398b12064SDario Binacchi {
48498b12064SDario Binacchi 	int actual, i;
48598b12064SDario Binacchi 	unsigned char *pos;
48698b12064SDario Binacchi 	unsigned char *endpos;
48798b12064SDario Binacchi 	canid_t id = cf->can_id;
48898b12064SDario Binacchi 
48998b12064SDario Binacchi 	pos = sl->xbuff;
49098b12064SDario Binacchi 
49198b12064SDario Binacchi 	if (cf->can_id & CAN_RTR_FLAG)
49298b12064SDario Binacchi 		*pos = 'R'; /* becomes 'r' in standard frame format (SFF) */
49398b12064SDario Binacchi 	else
49498b12064SDario Binacchi 		*pos = 'T'; /* becomes 't' in standard frame format (SSF) */
49598b12064SDario Binacchi 
49698b12064SDario Binacchi 	/* determine number of chars for the CAN-identifier */
49798b12064SDario Binacchi 	if (cf->can_id & CAN_EFF_FLAG) {
49898b12064SDario Binacchi 		id &= CAN_EFF_MASK;
4990cef03b1SDario Binacchi 		endpos = pos + SLCAN_EFF_ID_LEN;
50098b12064SDario Binacchi 	} else {
50198b12064SDario Binacchi 		*pos |= 0x20; /* convert R/T to lower case for SFF */
50298b12064SDario Binacchi 		id &= CAN_SFF_MASK;
5030cef03b1SDario Binacchi 		endpos = pos + SLCAN_SFF_ID_LEN;
50498b12064SDario Binacchi 	}
50598b12064SDario Binacchi 
50698b12064SDario Binacchi 	/* build 3 (SFF) or 8 (EFF) digit CAN identifier */
50798b12064SDario Binacchi 	pos++;
50898b12064SDario Binacchi 	while (endpos >= pos) {
50998b12064SDario Binacchi 		*endpos-- = hex_asc_upper[id & 0xf];
51098b12064SDario Binacchi 		id >>= 4;
51198b12064SDario Binacchi 	}
51298b12064SDario Binacchi 
5130cef03b1SDario Binacchi 	pos += (cf->can_id & CAN_EFF_FLAG) ?
5140cef03b1SDario Binacchi 		SLCAN_EFF_ID_LEN : SLCAN_SFF_ID_LEN;
51598b12064SDario Binacchi 
51698b12064SDario Binacchi 	*pos++ = cf->len + '0';
51798b12064SDario Binacchi 
51898b12064SDario Binacchi 	/* RTR frames may have a dlc > 0 but they never have any data bytes */
51998b12064SDario Binacchi 	if (!(cf->can_id & CAN_RTR_FLAG)) {
52098b12064SDario Binacchi 		for (i = 0; i < cf->len; i++)
52198b12064SDario Binacchi 			pos = hex_byte_pack_upper(pos, cf->data[i]);
52298b12064SDario Binacchi 
52398b12064SDario Binacchi 		sl->dev->stats.tx_bytes += cf->len;
52498b12064SDario Binacchi 	}
52598b12064SDario Binacchi 
52698b12064SDario Binacchi 	*pos++ = '\r';
52798b12064SDario Binacchi 
52898b12064SDario Binacchi 	/* Order of next two lines is *very* important.
52998b12064SDario Binacchi 	 * When we are sending a little amount of data,
53098b12064SDario Binacchi 	 * the transfer may be completed inside the ops->write()
53198b12064SDario Binacchi 	 * routine, because it's running with interrupts enabled.
53298b12064SDario Binacchi 	 * In this case we *never* got WRITE_WAKEUP event,
53398b12064SDario Binacchi 	 * if we did not request it before write operation.
53498b12064SDario Binacchi 	 *       14 Oct 1994  Dmitry Gorodchanin.
53598b12064SDario Binacchi 	 */
53698b12064SDario Binacchi 	set_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
53798b12064SDario Binacchi 	actual = sl->tty->ops->write(sl->tty, sl->xbuff, pos - sl->xbuff);
53898b12064SDario Binacchi 	sl->xleft = (pos - sl->xbuff) - actual;
53998b12064SDario Binacchi 	sl->xhead = sl->xbuff + actual;
54098b12064SDario Binacchi }
54198b12064SDario Binacchi 
54298b12064SDario Binacchi /* Write out any remaining transmit buffer. Scheduled when tty is writable */
slcan_transmit(struct work_struct * work)54398b12064SDario Binacchi static void slcan_transmit(struct work_struct *work)
54498b12064SDario Binacchi {
54598b12064SDario Binacchi 	struct slcan *sl = container_of(work, struct slcan, tx_work);
54698b12064SDario Binacchi 	int actual;
54798b12064SDario Binacchi 
54898b12064SDario Binacchi 	spin_lock_bh(&sl->lock);
54998b12064SDario Binacchi 	/* First make sure we're connected. */
550cfcb4465SDario Binacchi 	if (unlikely(!netif_running(sl->dev)) &&
551cfcb4465SDario Binacchi 	    likely(!test_bit(SLF_XCMD, &sl->flags))) {
55298b12064SDario Binacchi 		spin_unlock_bh(&sl->lock);
55398b12064SDario Binacchi 		return;
55498b12064SDario Binacchi 	}
55598b12064SDario Binacchi 
55698b12064SDario Binacchi 	if (sl->xleft <= 0)  {
55798b12064SDario Binacchi 		if (unlikely(test_bit(SLF_XCMD, &sl->flags))) {
55898b12064SDario Binacchi 			clear_bit(SLF_XCMD, &sl->flags);
55998b12064SDario Binacchi 			clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
56098b12064SDario Binacchi 			spin_unlock_bh(&sl->lock);
56198b12064SDario Binacchi 			wake_up(&sl->xcmd_wait);
56298b12064SDario Binacchi 			return;
56398b12064SDario Binacchi 		}
56498b12064SDario Binacchi 
56598b12064SDario Binacchi 		/* Now serial buffer is almost free & we can start
56671f3a4ccSMarc Kleine-Budde 		 * transmission of another packet
56771f3a4ccSMarc Kleine-Budde 		 */
56898b12064SDario Binacchi 		sl->dev->stats.tx_packets++;
56998b12064SDario Binacchi 		clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
57098b12064SDario Binacchi 		spin_unlock_bh(&sl->lock);
57198b12064SDario Binacchi 		netif_wake_queue(sl->dev);
57298b12064SDario Binacchi 		return;
57398b12064SDario Binacchi 	}
57498b12064SDario Binacchi 
57598b12064SDario Binacchi 	actual = sl->tty->ops->write(sl->tty, sl->xhead, sl->xleft);
57698b12064SDario Binacchi 	sl->xleft -= actual;
57798b12064SDario Binacchi 	sl->xhead += actual;
57898b12064SDario Binacchi 	spin_unlock_bh(&sl->lock);
57998b12064SDario Binacchi }
58098b12064SDario Binacchi 
58171f3a4ccSMarc Kleine-Budde /* Called by the driver when there's room for more data.
58298b12064SDario Binacchi  * Schedule the transmit.
58398b12064SDario Binacchi  */
slcan_write_wakeup(struct tty_struct * tty)58498b12064SDario Binacchi static void slcan_write_wakeup(struct tty_struct *tty)
58598b12064SDario Binacchi {
5860e4a23ceSJiri Slaby 	struct slcan *sl = tty->disc_data;
58798b12064SDario Binacchi 
58898b12064SDario Binacchi 	schedule_work(&sl->tx_work);
58998b12064SDario Binacchi }
59098b12064SDario Binacchi 
59198b12064SDario Binacchi /* Send a can_frame to a TTY queue. */
slcan_netdev_xmit(struct sk_buff * skb,struct net_device * dev)5920cef03b1SDario Binacchi static netdev_tx_t slcan_netdev_xmit(struct sk_buff *skb,
5930cef03b1SDario Binacchi 				     struct net_device *dev)
59498b12064SDario Binacchi {
59598b12064SDario Binacchi 	struct slcan *sl = netdev_priv(dev);
59698b12064SDario Binacchi 
597ae64438bSOliver Hartkopp 	if (can_dev_dropped_skb(dev, skb))
59898b12064SDario Binacchi 		return NETDEV_TX_OK;
59998b12064SDario Binacchi 
60098b12064SDario Binacchi 	spin_lock(&sl->lock);
60198b12064SDario Binacchi 	if (!netif_running(dev))  {
60298b12064SDario Binacchi 		spin_unlock(&sl->lock);
60398b12064SDario Binacchi 		netdev_warn(dev, "xmit: iface is down\n");
60498b12064SDario Binacchi 		goto out;
60598b12064SDario Binacchi 	}
60669a65396SMarc Kleine-Budde 	if (!sl->tty) {
60798b12064SDario Binacchi 		spin_unlock(&sl->lock);
60898b12064SDario Binacchi 		goto out;
60998b12064SDario Binacchi 	}
61098b12064SDario Binacchi 
61198b12064SDario Binacchi 	netif_stop_queue(sl->dev);
6120cef03b1SDario Binacchi 	slcan_encaps(sl, (struct can_frame *)skb->data); /* encaps & send */
61398b12064SDario Binacchi 	spin_unlock(&sl->lock);
61498b12064SDario Binacchi 
6156153a7eaSVincent Mailhol 	skb_tx_timestamp(skb);
6166153a7eaSVincent Mailhol 
61798b12064SDario Binacchi out:
61898b12064SDario Binacchi 	kfree_skb(skb);
61998b12064SDario Binacchi 	return NETDEV_TX_OK;
62098b12064SDario Binacchi }
62198b12064SDario Binacchi 
62298b12064SDario Binacchi /******************************************
62398b12064SDario Binacchi  *   Routines looking at netdevice side.
62498b12064SDario Binacchi  ******************************************/
62598b12064SDario Binacchi 
slcan_transmit_cmd(struct slcan * sl,const unsigned char * cmd)62698b12064SDario Binacchi static int slcan_transmit_cmd(struct slcan *sl, const unsigned char *cmd)
62798b12064SDario Binacchi {
62898b12064SDario Binacchi 	int ret, actual, n;
62998b12064SDario Binacchi 
63098b12064SDario Binacchi 	spin_lock(&sl->lock);
63198b12064SDario Binacchi 	if (!sl->tty) {
63298b12064SDario Binacchi 		spin_unlock(&sl->lock);
63398b12064SDario Binacchi 		return -ENODEV;
63498b12064SDario Binacchi 	}
63598b12064SDario Binacchi 
6360159a930SDan Carpenter 	n = scnprintf(sl->xbuff, sizeof(sl->xbuff), "%s", cmd);
63798b12064SDario Binacchi 	set_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
63898b12064SDario Binacchi 	actual = sl->tty->ops->write(sl->tty, sl->xbuff, n);
63998b12064SDario Binacchi 	sl->xleft = n - actual;
64098b12064SDario Binacchi 	sl->xhead = sl->xbuff + actual;
64198b12064SDario Binacchi 	set_bit(SLF_XCMD, &sl->flags);
64298b12064SDario Binacchi 	spin_unlock(&sl->lock);
64398b12064SDario Binacchi 	ret = wait_event_interruptible_timeout(sl->xcmd_wait,
64498b12064SDario Binacchi 					       !test_bit(SLF_XCMD, &sl->flags),
64598b12064SDario Binacchi 					       HZ);
64698b12064SDario Binacchi 	clear_bit(SLF_XCMD, &sl->flags);
64798b12064SDario Binacchi 	if (ret == -ERESTARTSYS)
64898b12064SDario Binacchi 		return ret;
64998b12064SDario Binacchi 
65098b12064SDario Binacchi 	if (ret == 0)
65198b12064SDario Binacchi 		return -ETIMEDOUT;
65298b12064SDario Binacchi 
65398b12064SDario Binacchi 	return 0;
65498b12064SDario Binacchi }
65598b12064SDario Binacchi 
65698b12064SDario Binacchi /* Netdevice UP -> DOWN routine */
slcan_netdev_close(struct net_device * dev)6570cef03b1SDario Binacchi static int slcan_netdev_close(struct net_device *dev)
65898b12064SDario Binacchi {
65998b12064SDario Binacchi 	struct slcan *sl = netdev_priv(dev);
66098b12064SDario Binacchi 	int err;
66198b12064SDario Binacchi 
66298b12064SDario Binacchi 	if (sl->can.bittiming.bitrate &&
66398b12064SDario Binacchi 	    sl->can.bittiming.bitrate != CAN_BITRATE_UNKNOWN) {
66498b12064SDario Binacchi 		err = slcan_transmit_cmd(sl, "C\r");
66598b12064SDario Binacchi 		if (err)
66698b12064SDario Binacchi 			netdev_warn(dev,
66798b12064SDario Binacchi 				    "failed to send close command 'C\\r'\n");
66898b12064SDario Binacchi 	}
66998b12064SDario Binacchi 
67098b12064SDario Binacchi 	/* TTY discipline is running. */
67198b12064SDario Binacchi 	clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
672cfcb4465SDario Binacchi 	flush_work(&sl->tx_work);
673cfcb4465SDario Binacchi 
67498b12064SDario Binacchi 	netif_stop_queue(dev);
675c6887023SDario Binacchi 	sl->rcount   = 0;
676c6887023SDario Binacchi 	sl->xleft    = 0;
67798b12064SDario Binacchi 	close_candev(dev);
67898b12064SDario Binacchi 	sl->can.state = CAN_STATE_STOPPED;
67998b12064SDario Binacchi 	if (sl->can.bittiming.bitrate == CAN_BITRATE_UNKNOWN)
68098b12064SDario Binacchi 		sl->can.bittiming.bitrate = CAN_BITRATE_UNSET;
68198b12064SDario Binacchi 
68298b12064SDario Binacchi 	return 0;
68398b12064SDario Binacchi }
68498b12064SDario Binacchi 
68598b12064SDario Binacchi /* Netdevice DOWN -> UP routine */
slcan_netdev_open(struct net_device * dev)6860cef03b1SDario Binacchi static int slcan_netdev_open(struct net_device *dev)
68798b12064SDario Binacchi {
68898b12064SDario Binacchi 	struct slcan *sl = netdev_priv(dev);
6890cef03b1SDario Binacchi 	unsigned char cmd[SLCAN_MTU];
69098b12064SDario Binacchi 	int err, s;
69198b12064SDario Binacchi 
69298b12064SDario Binacchi 	/* The baud rate is not set with the command
69398b12064SDario Binacchi 	 * `ip link set <iface> type can bitrate <baud>' and therefore
69498b12064SDario Binacchi 	 * can.bittiming.bitrate is CAN_BITRATE_UNSET (0), causing
69598b12064SDario Binacchi 	 * open_candev() to fail. So let's set to a fake value.
69698b12064SDario Binacchi 	 */
69798b12064SDario Binacchi 	if (sl->can.bittiming.bitrate == CAN_BITRATE_UNSET)
69898b12064SDario Binacchi 		sl->can.bittiming.bitrate = CAN_BITRATE_UNKNOWN;
69998b12064SDario Binacchi 
70098b12064SDario Binacchi 	err = open_candev(dev);
70198b12064SDario Binacchi 	if (err) {
70298b12064SDario Binacchi 		netdev_err(dev, "failed to open can device\n");
70398b12064SDario Binacchi 		return err;
70498b12064SDario Binacchi 	}
70598b12064SDario Binacchi 
70698b12064SDario Binacchi 	if (sl->can.bittiming.bitrate != CAN_BITRATE_UNKNOWN) {
70798b12064SDario Binacchi 		for (s = 0; s < ARRAY_SIZE(slcan_bitrate_const); s++) {
70898b12064SDario Binacchi 			if (sl->can.bittiming.bitrate == slcan_bitrate_const[s])
70998b12064SDario Binacchi 				break;
71098b12064SDario Binacchi 		}
71198b12064SDario Binacchi 
71298b12064SDario Binacchi 		/* The CAN framework has already validate the bitrate value,
71398b12064SDario Binacchi 		 * so we can avoid to check if `s' has been properly set.
71498b12064SDario Binacchi 		 */
71598b12064SDario Binacchi 		snprintf(cmd, sizeof(cmd), "C\rS%d\r", s);
71698b12064SDario Binacchi 		err = slcan_transmit_cmd(sl, cmd);
71798b12064SDario Binacchi 		if (err) {
71898b12064SDario Binacchi 			netdev_err(dev,
71998b12064SDario Binacchi 				   "failed to send bitrate command 'C\\rS%d\\r'\n",
72098b12064SDario Binacchi 				   s);
72198b12064SDario Binacchi 			goto cmd_transmit_failed;
72298b12064SDario Binacchi 		}
72398b12064SDario Binacchi 
7244de0e8efSDario Binacchi 		if (test_bit(CF_ERR_RST, &sl->cmd_flags)) {
7254de0e8efSDario Binacchi 			err = slcan_transmit_cmd(sl, "F\r");
7264de0e8efSDario Binacchi 			if (err) {
7274de0e8efSDario Binacchi 				netdev_err(dev,
7284de0e8efSDario Binacchi 					   "failed to send error command 'F\\r'\n");
7294de0e8efSDario Binacchi 				goto cmd_transmit_failed;
7304de0e8efSDario Binacchi 			}
7314de0e8efSDario Binacchi 		}
7324de0e8efSDario Binacchi 
7333e720131SDario Binacchi 		if (sl->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) {
7343e720131SDario Binacchi 			err = slcan_transmit_cmd(sl, "L\r");
7353e720131SDario Binacchi 			if (err) {
7363e720131SDario Binacchi 				netdev_err(dev,
7373e720131SDario Binacchi 					   "failed to send listen-only command 'L\\r'\n");
7383e720131SDario Binacchi 				goto cmd_transmit_failed;
7393e720131SDario Binacchi 			}
7403e720131SDario Binacchi 		} else {
74198b12064SDario Binacchi 			err = slcan_transmit_cmd(sl, "O\r");
74298b12064SDario Binacchi 			if (err) {
7433e720131SDario Binacchi 				netdev_err(dev,
7443e720131SDario Binacchi 					   "failed to send open command 'O\\r'\n");
74598b12064SDario Binacchi 				goto cmd_transmit_failed;
74698b12064SDario Binacchi 			}
74798b12064SDario Binacchi 		}
7483e720131SDario Binacchi 	}
74998b12064SDario Binacchi 
75098b12064SDario Binacchi 	sl->can.state = CAN_STATE_ERROR_ACTIVE;
75198b12064SDario Binacchi 	netif_start_queue(dev);
75298b12064SDario Binacchi 	return 0;
75398b12064SDario Binacchi 
75498b12064SDario Binacchi cmd_transmit_failed:
75598b12064SDario Binacchi 	close_candev(dev);
75698b12064SDario Binacchi 	return err;
75798b12064SDario Binacchi }
75898b12064SDario Binacchi 
7590cef03b1SDario Binacchi static const struct net_device_ops slcan_netdev_ops = {
7600cef03b1SDario Binacchi 	.ndo_open               = slcan_netdev_open,
7610cef03b1SDario Binacchi 	.ndo_stop               = slcan_netdev_close,
7620cef03b1SDario Binacchi 	.ndo_start_xmit         = slcan_netdev_xmit,
763341c5724SDario Binacchi 	.ndo_change_mtu         = can_change_mtu,
76498b12064SDario Binacchi };
76598b12064SDario Binacchi 
76698b12064SDario Binacchi /******************************************
76771f3a4ccSMarc Kleine-Budde  *  Routines looking at TTY side.
76898b12064SDario Binacchi  ******************************************/
76998b12064SDario Binacchi 
77071f3a4ccSMarc Kleine-Budde /* Handle the 'receiver data ready' interrupt.
77198b12064SDario Binacchi  * This function is called by the 'tty_io' module in the kernel when
77298b12064SDario Binacchi  * a block of SLCAN data has been received, which can now be decapsulated
77398b12064SDario Binacchi  * and sent on to some IP layer for further processing. This will not
77498b12064SDario Binacchi  * be re-entered while running but other ldisc functions may be called
77598b12064SDario Binacchi  * in parallel
77698b12064SDario Binacchi  */
slcan_receive_buf(struct tty_struct * tty,const u8 * cp,const u8 * fp,size_t count)777a8d9cd23SJiri Slaby (SUSE) static void slcan_receive_buf(struct tty_struct *tty, const u8 *cp,
778*892bc209SJiri Slaby (SUSE) 			      const u8 *fp, size_t count)
77998b12064SDario Binacchi {
7800e4a23ceSJiri Slaby 	struct slcan *sl = tty->disc_data;
78198b12064SDario Binacchi 
782cfcb4465SDario Binacchi 	if (!netif_running(sl->dev))
78398b12064SDario Binacchi 		return;
78498b12064SDario Binacchi 
78598b12064SDario Binacchi 	/* Read the characters out of the buffer */
78698b12064SDario Binacchi 	while (count--) {
78798b12064SDario Binacchi 		if (fp && *fp++) {
78898b12064SDario Binacchi 			if (!test_and_set_bit(SLF_ERROR, &sl->flags))
78998b12064SDario Binacchi 				sl->dev->stats.rx_errors++;
79098b12064SDario Binacchi 			cp++;
79198b12064SDario Binacchi 			continue;
79298b12064SDario Binacchi 		}
79398b12064SDario Binacchi 		slcan_unesc(sl, *cp++);
79498b12064SDario Binacchi 	}
79598b12064SDario Binacchi }
79698b12064SDario Binacchi 
79771f3a4ccSMarc Kleine-Budde /* Open the high-level part of the SLCAN channel.
79898b12064SDario Binacchi  * This function is called by the TTY module when the
799cfcb4465SDario Binacchi  * SLCAN line discipline is called for.
80098b12064SDario Binacchi  *
80198b12064SDario Binacchi  * Called in process context serialized from other ldisc calls.
80298b12064SDario Binacchi  */
slcan_open(struct tty_struct * tty)80398b12064SDario Binacchi static int slcan_open(struct tty_struct *tty)
80498b12064SDario Binacchi {
805cfcb4465SDario Binacchi 	struct net_device *dev;
80698b12064SDario Binacchi 	struct slcan *sl;
80798b12064SDario Binacchi 	int err;
80898b12064SDario Binacchi 
80998b12064SDario Binacchi 	if (!capable(CAP_NET_ADMIN))
81098b12064SDario Binacchi 		return -EPERM;
81198b12064SDario Binacchi 
81269a65396SMarc Kleine-Budde 	if (!tty->ops->write)
81398b12064SDario Binacchi 		return -EOPNOTSUPP;
81498b12064SDario Binacchi 
815cfcb4465SDario Binacchi 	dev = alloc_candev(sizeof(*sl), 1);
816cfcb4465SDario Binacchi 	if (!dev)
817cfcb4465SDario Binacchi 		return -ENFILE;
81898b12064SDario Binacchi 
819cfcb4465SDario Binacchi 	sl = netdev_priv(dev);
82098b12064SDario Binacchi 
821cfcb4465SDario Binacchi 	/* Configure TTY interface */
822cfcb4465SDario Binacchi 	tty->receive_room = 65536; /* We don't flow control */
823cfcb4465SDario Binacchi 	sl->rcount = 0;
824cfcb4465SDario Binacchi 	sl->xleft = 0;
825cfcb4465SDario Binacchi 	spin_lock_init(&sl->lock);
826cfcb4465SDario Binacchi 	INIT_WORK(&sl->tx_work, slcan_transmit);
827cfcb4465SDario Binacchi 	init_waitqueue_head(&sl->xcmd_wait);
82898b12064SDario Binacchi 
829cfcb4465SDario Binacchi 	/* Configure CAN metadata */
830cfcb4465SDario Binacchi 	sl->can.bitrate_const = slcan_bitrate_const;
831cfcb4465SDario Binacchi 	sl->can.bitrate_const_cnt = ARRAY_SIZE(slcan_bitrate_const);
8323e720131SDario Binacchi 	sl->can.ctrlmode_supported = CAN_CTRLMODE_LISTENONLY;
83398b12064SDario Binacchi 
834cfcb4465SDario Binacchi 	/* Configure netdev interface */
835cfcb4465SDario Binacchi 	sl->dev	= dev;
8360cef03b1SDario Binacchi 	dev->netdev_ops = &slcan_netdev_ops;
837cfcb4465SDario Binacchi 	dev->ethtool_ops = &slcan_ethtool_ops;
83898b12064SDario Binacchi 
839cfcb4465SDario Binacchi 	/* Mark ldisc channel as alive */
84098b12064SDario Binacchi 	sl->tty = tty;
84198b12064SDario Binacchi 	tty->disc_data = sl;
84298b12064SDario Binacchi 
843cfcb4465SDario Binacchi 	err = register_candev(dev);
84498b12064SDario Binacchi 	if (err) {
845cfcb4465SDario Binacchi 		free_candev(dev);
846e2c9bb02SVincent Mailhol 		pr_err("can't register candev\n");
847cfcb4465SDario Binacchi 		return err;
84898b12064SDario Binacchi 	}
84998b12064SDario Binacchi 
850cfcb4465SDario Binacchi 	netdev_info(dev, "slcan on %s.\n", tty->name);
85198b12064SDario Binacchi 	/* TTY layer expects 0 on success */
85298b12064SDario Binacchi 	return 0;
85398b12064SDario Binacchi }
85498b12064SDario Binacchi 
85571f3a4ccSMarc Kleine-Budde /* Close down a SLCAN channel.
85698b12064SDario Binacchi  * This means flushing out any pending queues, and then returning. This
85798b12064SDario Binacchi  * call is serialized against other ldisc functions.
858cfcb4465SDario Binacchi  * Once this is called, no other ldisc function of ours is entered.
85998b12064SDario Binacchi  *
86098b12064SDario Binacchi  * We also use this method for a hangup event.
86198b12064SDario Binacchi  */
slcan_close(struct tty_struct * tty)86298b12064SDario Binacchi static void slcan_close(struct tty_struct *tty)
86398b12064SDario Binacchi {
8640e4a23ceSJiri Slaby 	struct slcan *sl = tty->disc_data;
86598b12064SDario Binacchi 
866cfcb4465SDario Binacchi 	unregister_candev(sl->dev);
86798b12064SDario Binacchi 
868fb855e9fSJiri Slaby (SUSE) 	/*
869fb855e9fSJiri Slaby (SUSE) 	 * The netdev needn't be UP (so .ndo_stop() is not called). Hence make
870fb855e9fSJiri Slaby (SUSE) 	 * sure this is not running before freeing it up.
871fb855e9fSJiri Slaby (SUSE) 	 */
872fb855e9fSJiri Slaby (SUSE) 	flush_work(&sl->tx_work);
873fb855e9fSJiri Slaby (SUSE) 
874cfcb4465SDario Binacchi 	/* Mark channel as dead */
87598b12064SDario Binacchi 	spin_lock_bh(&sl->lock);
876cfcb4465SDario Binacchi 	tty->disc_data = NULL;
87798b12064SDario Binacchi 	sl->tty = NULL;
87898b12064SDario Binacchi 	spin_unlock_bh(&sl->lock);
87998b12064SDario Binacchi 
880cfcb4465SDario Binacchi 	netdev_info(sl->dev, "slcan off %s.\n", tty->name);
881cfcb4465SDario Binacchi 	free_candev(sl->dev);
88298b12064SDario Binacchi }
88398b12064SDario Binacchi 
88498b12064SDario Binacchi /* Perform I/O control on an active SLCAN channel. */
slcan_ioctl(struct tty_struct * tty,unsigned int cmd,unsigned long arg)88598b12064SDario Binacchi static int slcan_ioctl(struct tty_struct *tty, unsigned int cmd,
88698b12064SDario Binacchi 		       unsigned long arg)
88798b12064SDario Binacchi {
8880e4a23ceSJiri Slaby 	struct slcan *sl = tty->disc_data;
88998b12064SDario Binacchi 	unsigned int tmp;
89098b12064SDario Binacchi 
89198b12064SDario Binacchi 	switch (cmd) {
89298b12064SDario Binacchi 	case SIOCGIFNAME:
89398b12064SDario Binacchi 		tmp = strlen(sl->dev->name) + 1;
89498b12064SDario Binacchi 		if (copy_to_user((void __user *)arg, sl->dev->name, tmp))
89598b12064SDario Binacchi 			return -EFAULT;
89698b12064SDario Binacchi 		return 0;
89798b12064SDario Binacchi 
89898b12064SDario Binacchi 	case SIOCSIFHWADDR:
89998b12064SDario Binacchi 		return -EINVAL;
90098b12064SDario Binacchi 
90198b12064SDario Binacchi 	default:
90298b12064SDario Binacchi 		return tty_mode_ioctl(tty, cmd, arg);
90398b12064SDario Binacchi 	}
90498b12064SDario Binacchi }
90598b12064SDario Binacchi 
9060cef03b1SDario Binacchi static struct tty_ldisc_ops slcan_ldisc = {
90798b12064SDario Binacchi 	.owner		= THIS_MODULE,
90898b12064SDario Binacchi 	.num		= N_SLCAN,
909e2c9bb02SVincent Mailhol 	.name		= KBUILD_MODNAME,
91098b12064SDario Binacchi 	.open		= slcan_open,
91198b12064SDario Binacchi 	.close		= slcan_close,
91298b12064SDario Binacchi 	.ioctl		= slcan_ioctl,
91398b12064SDario Binacchi 	.receive_buf	= slcan_receive_buf,
91498b12064SDario Binacchi 	.write_wakeup	= slcan_write_wakeup,
91598b12064SDario Binacchi };
91698b12064SDario Binacchi 
slcan_init(void)91798b12064SDario Binacchi static int __init slcan_init(void)
91898b12064SDario Binacchi {
91998b12064SDario Binacchi 	int status;
92098b12064SDario Binacchi 
921e2c9bb02SVincent Mailhol 	pr_info("serial line CAN interface driver\n");
92298b12064SDario Binacchi 
92398b12064SDario Binacchi 	/* Fill in our line protocol discipline, and register it */
9240cef03b1SDario Binacchi 	status = tty_register_ldisc(&slcan_ldisc);
925cfcb4465SDario Binacchi 	if (status)
926e2c9bb02SVincent Mailhol 		pr_err("can't register line discipline\n");
927cfcb4465SDario Binacchi 
92898b12064SDario Binacchi 	return status;
92998b12064SDario Binacchi }
93098b12064SDario Binacchi 
slcan_exit(void)93198b12064SDario Binacchi static void __exit slcan_exit(void)
93298b12064SDario Binacchi {
933cfcb4465SDario Binacchi 	/* This will only be called when all channels have been closed by
934cfcb4465SDario Binacchi 	 * userspace - tty_ldisc.c takes care of the module's refcount.
93598b12064SDario Binacchi 	 */
9360cef03b1SDario Binacchi 	tty_unregister_ldisc(&slcan_ldisc);
93798b12064SDario Binacchi }
93898b12064SDario Binacchi 
93998b12064SDario Binacchi module_init(slcan_init);
94098b12064SDario Binacchi module_exit(slcan_exit);
941