xref: /linux/drivers/net/can/can327.c (revision 892bc209)
143da2f07SMax Staudt // SPDX-License-Identifier: GPL-2.0
243da2f07SMax Staudt /* ELM327 based CAN interface driver (tty line discipline)
343da2f07SMax Staudt  *
443da2f07SMax Staudt  * This driver started as a derivative of linux/drivers/net/can/slcan.c
543da2f07SMax Staudt  * and my thanks go to the original authors for their inspiration.
643da2f07SMax Staudt  *
743da2f07SMax Staudt  * can327.c Author : Max Staudt <max-linux@enpas.org>
843da2f07SMax Staudt  * slcan.c Author  : Oliver Hartkopp <socketcan@hartkopp.net>
943da2f07SMax Staudt  * slip.c Authors  : Laurence Culhane <loz@holmes.demon.co.uk>
1043da2f07SMax Staudt  *                   Fred N. van Kempen <waltje@uwalt.nl.mugnet.org>
1143da2f07SMax Staudt  */
1243da2f07SMax Staudt 
1363fe8567SVincent Mailhol #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
1443da2f07SMax Staudt 
1543da2f07SMax Staudt #include <linux/init.h>
1643da2f07SMax Staudt #include <linux/module.h>
1743da2f07SMax Staudt 
1843da2f07SMax Staudt #include <linux/bitops.h>
1943da2f07SMax Staudt #include <linux/ctype.h>
2043da2f07SMax Staudt #include <linux/errno.h>
2143da2f07SMax Staudt #include <linux/kernel.h>
2243da2f07SMax Staudt #include <linux/list.h>
2343da2f07SMax Staudt #include <linux/lockdep.h>
2443da2f07SMax Staudt #include <linux/netdevice.h>
2543da2f07SMax Staudt #include <linux/skbuff.h>
2643da2f07SMax Staudt #include <linux/spinlock.h>
2743da2f07SMax Staudt #include <linux/string.h>
2843da2f07SMax Staudt #include <linux/tty.h>
2943da2f07SMax Staudt #include <linux/tty_ldisc.h>
3043da2f07SMax Staudt #include <linux/workqueue.h>
3143da2f07SMax Staudt 
3243da2f07SMax Staudt #include <uapi/linux/tty.h>
3343da2f07SMax Staudt 
3443da2f07SMax Staudt #include <linux/can.h>
3543da2f07SMax Staudt #include <linux/can/dev.h>
3643da2f07SMax Staudt #include <linux/can/error.h>
3743da2f07SMax Staudt #include <linux/can/rx-offload.h>
3843da2f07SMax Staudt 
3943da2f07SMax Staudt #define CAN327_NAPI_WEIGHT 4
4043da2f07SMax Staudt 
4143da2f07SMax Staudt #define CAN327_SIZE_TXBUF 32
4243da2f07SMax Staudt #define CAN327_SIZE_RXBUF 1024
4343da2f07SMax Staudt 
4443da2f07SMax Staudt #define CAN327_CAN_CONFIG_SEND_SFF 0x8000
4543da2f07SMax Staudt #define CAN327_CAN_CONFIG_VARIABLE_DLC 0x4000
4643da2f07SMax Staudt #define CAN327_CAN_CONFIG_RECV_BOTH_SFF_EFF 0x2000
4743da2f07SMax Staudt #define CAN327_CAN_CONFIG_BAUDRATE_MULT_8_7 0x1000
4843da2f07SMax Staudt 
4943da2f07SMax Staudt #define CAN327_DUMMY_CHAR 'y'
5043da2f07SMax Staudt #define CAN327_DUMMY_STRING "y"
5143da2f07SMax Staudt #define CAN327_READY_CHAR '>'
5243da2f07SMax Staudt 
5343da2f07SMax Staudt /* Bits in elm->cmds_todo */
5443da2f07SMax Staudt enum can327_tx_do {
5543da2f07SMax Staudt 	CAN327_TX_DO_CAN_DATA = 0,
5643da2f07SMax Staudt 	CAN327_TX_DO_CANID_11BIT,
5743da2f07SMax Staudt 	CAN327_TX_DO_CANID_29BIT_LOW,
5843da2f07SMax Staudt 	CAN327_TX_DO_CANID_29BIT_HIGH,
5943da2f07SMax Staudt 	CAN327_TX_DO_CAN_CONFIG_PART2,
6043da2f07SMax Staudt 	CAN327_TX_DO_CAN_CONFIG,
6143da2f07SMax Staudt 	CAN327_TX_DO_RESPONSES,
6243da2f07SMax Staudt 	CAN327_TX_DO_SILENT_MONITOR,
6343da2f07SMax Staudt 	CAN327_TX_DO_INIT,
6443da2f07SMax Staudt };
6543da2f07SMax Staudt 
6643da2f07SMax Staudt struct can327 {
6743da2f07SMax Staudt 	/* This must be the first member when using alloc_candev() */
6843da2f07SMax Staudt 	struct can_priv can;
6943da2f07SMax Staudt 
7043da2f07SMax Staudt 	struct can_rx_offload offload;
7143da2f07SMax Staudt 
7243da2f07SMax Staudt 	/* TTY buffers */
7343da2f07SMax Staudt 	u8 txbuf[CAN327_SIZE_TXBUF];
7443da2f07SMax Staudt 	u8 rxbuf[CAN327_SIZE_RXBUF];
7543da2f07SMax Staudt 
7643da2f07SMax Staudt 	/* Per-channel lock */
7743da2f07SMax Staudt 	spinlock_t lock;
7843da2f07SMax Staudt 
7943da2f07SMax Staudt 	/* TTY and netdev devices that we're bridging */
8043da2f07SMax Staudt 	struct tty_struct *tty;
8143da2f07SMax Staudt 	struct net_device *dev;
8243da2f07SMax Staudt 
8343da2f07SMax Staudt 	/* TTY buffer accounting */
8443da2f07SMax Staudt 	struct work_struct tx_work;	/* Flushes TTY TX buffer */
8543da2f07SMax Staudt 	u8 *txhead;			/* Next TX byte */
8643da2f07SMax Staudt 	size_t txleft;			/* Bytes left to TX */
8743da2f07SMax Staudt 	int rxfill;			/* Bytes already RX'd in buffer */
8843da2f07SMax Staudt 
8943da2f07SMax Staudt 	/* State machine */
9043da2f07SMax Staudt 	enum {
9143da2f07SMax Staudt 		CAN327_STATE_NOTINIT = 0,
9243da2f07SMax Staudt 		CAN327_STATE_GETDUMMYCHAR,
9343da2f07SMax Staudt 		CAN327_STATE_GETPROMPT,
9443da2f07SMax Staudt 		CAN327_STATE_RECEIVING,
9543da2f07SMax Staudt 	} state;
9643da2f07SMax Staudt 
9743da2f07SMax Staudt 	/* Things we have yet to send */
9843da2f07SMax Staudt 	char **next_init_cmd;
9943da2f07SMax Staudt 	unsigned long cmds_todo;
10043da2f07SMax Staudt 
10143da2f07SMax Staudt 	/* The CAN frame and config the ELM327 is sending/using,
10243da2f07SMax Staudt 	 * or will send/use after finishing all cmds_todo
10343da2f07SMax Staudt 	 */
10443da2f07SMax Staudt 	struct can_frame can_frame_to_send;
10543da2f07SMax Staudt 	u16 can_config;
10643da2f07SMax Staudt 	u8 can_bitrate_divisor;
10743da2f07SMax Staudt 
10843da2f07SMax Staudt 	/* Parser state */
10943da2f07SMax Staudt 	bool drop_next_line;
11043da2f07SMax Staudt 
11143da2f07SMax Staudt 	/* Stop the channel on UART side hardware failure, e.g. stray
11243da2f07SMax Staudt 	 * characters or neverending lines. This may be caused by bad
11343da2f07SMax Staudt 	 * UART wiring, a bad ELM327, a bad UART bridge...
11443da2f07SMax Staudt 	 * Once this is true, nothing will be sent to the TTY.
11543da2f07SMax Staudt 	 */
11643da2f07SMax Staudt 	bool uart_side_failure;
11743da2f07SMax Staudt };
11843da2f07SMax Staudt 
11943da2f07SMax Staudt static inline void can327_uart_side_failure(struct can327 *elm);
12043da2f07SMax Staudt 
can327_send(struct can327 * elm,const void * buf,size_t len)12143da2f07SMax Staudt static void can327_send(struct can327 *elm, const void *buf, size_t len)
12243da2f07SMax Staudt {
12343da2f07SMax Staudt 	int written;
12443da2f07SMax Staudt 
12543da2f07SMax Staudt 	lockdep_assert_held(&elm->lock);
12643da2f07SMax Staudt 
12743da2f07SMax Staudt 	if (elm->uart_side_failure)
12843da2f07SMax Staudt 		return;
12943da2f07SMax Staudt 
13043da2f07SMax Staudt 	memcpy(elm->txbuf, buf, len);
13143da2f07SMax Staudt 
13243da2f07SMax Staudt 	/* Order of next two lines is *very* important.
13343da2f07SMax Staudt 	 * When we are sending a little amount of data,
13443da2f07SMax Staudt 	 * the transfer may be completed inside the ops->write()
13543da2f07SMax Staudt 	 * routine, because it's running with interrupts enabled.
13643da2f07SMax Staudt 	 * In this case we *never* got WRITE_WAKEUP event,
13743da2f07SMax Staudt 	 * if we did not request it before write operation.
13843da2f07SMax Staudt 	 *       14 Oct 1994  Dmitry Gorodchanin.
13943da2f07SMax Staudt 	 */
14043da2f07SMax Staudt 	set_bit(TTY_DO_WRITE_WAKEUP, &elm->tty->flags);
14143da2f07SMax Staudt 	written = elm->tty->ops->write(elm->tty, elm->txbuf, len);
14243da2f07SMax Staudt 	if (written < 0) {
14343da2f07SMax Staudt 		netdev_err(elm->dev, "Failed to write to tty %s.\n",
14443da2f07SMax Staudt 			   elm->tty->name);
14543da2f07SMax Staudt 		can327_uart_side_failure(elm);
14643da2f07SMax Staudt 		return;
14743da2f07SMax Staudt 	}
14843da2f07SMax Staudt 
14943da2f07SMax Staudt 	elm->txleft = len - written;
15043da2f07SMax Staudt 	elm->txhead = elm->txbuf + written;
15143da2f07SMax Staudt }
15243da2f07SMax Staudt 
15343da2f07SMax Staudt /* Take the ELM327 out of almost any state and back into command mode.
15443da2f07SMax Staudt  * We send CAN327_DUMMY_CHAR which will either abort any running
15543da2f07SMax Staudt  * operation, or be echoed back to us in case we're already in command
15643da2f07SMax Staudt  * mode.
15743da2f07SMax Staudt  */
can327_kick_into_cmd_mode(struct can327 * elm)15843da2f07SMax Staudt static void can327_kick_into_cmd_mode(struct can327 *elm)
15943da2f07SMax Staudt {
16043da2f07SMax Staudt 	lockdep_assert_held(&elm->lock);
16143da2f07SMax Staudt 
16243da2f07SMax Staudt 	if (elm->state != CAN327_STATE_GETDUMMYCHAR &&
16343da2f07SMax Staudt 	    elm->state != CAN327_STATE_GETPROMPT) {
16443da2f07SMax Staudt 		can327_send(elm, CAN327_DUMMY_STRING, 1);
16543da2f07SMax Staudt 
16643da2f07SMax Staudt 		elm->state = CAN327_STATE_GETDUMMYCHAR;
16743da2f07SMax Staudt 	}
16843da2f07SMax Staudt }
16943da2f07SMax Staudt 
17043da2f07SMax Staudt /* Schedule a CAN frame and necessary config changes to be sent to the TTY. */
can327_send_frame(struct can327 * elm,struct can_frame * frame)17143da2f07SMax Staudt static void can327_send_frame(struct can327 *elm, struct can_frame *frame)
17243da2f07SMax Staudt {
17343da2f07SMax Staudt 	lockdep_assert_held(&elm->lock);
17443da2f07SMax Staudt 
17543da2f07SMax Staudt 	/* Schedule any necessary changes in ELM327's CAN configuration */
17643da2f07SMax Staudt 	if (elm->can_frame_to_send.can_id != frame->can_id) {
17743da2f07SMax Staudt 		/* Set the new CAN ID for transmission. */
17843da2f07SMax Staudt 		if ((frame->can_id ^ elm->can_frame_to_send.can_id)
17943da2f07SMax Staudt 		    & CAN_EFF_FLAG) {
18043da2f07SMax Staudt 			elm->can_config =
18143da2f07SMax Staudt 				(frame->can_id & CAN_EFF_FLAG ? 0 : CAN327_CAN_CONFIG_SEND_SFF) |
18243da2f07SMax Staudt 				CAN327_CAN_CONFIG_VARIABLE_DLC |
18343da2f07SMax Staudt 				CAN327_CAN_CONFIG_RECV_BOTH_SFF_EFF |
18443da2f07SMax Staudt 				elm->can_bitrate_divisor;
18543da2f07SMax Staudt 
18643da2f07SMax Staudt 			set_bit(CAN327_TX_DO_CAN_CONFIG, &elm->cmds_todo);
18743da2f07SMax Staudt 		}
18843da2f07SMax Staudt 
18943da2f07SMax Staudt 		if (frame->can_id & CAN_EFF_FLAG) {
19043da2f07SMax Staudt 			clear_bit(CAN327_TX_DO_CANID_11BIT, &elm->cmds_todo);
19143da2f07SMax Staudt 			set_bit(CAN327_TX_DO_CANID_29BIT_LOW, &elm->cmds_todo);
19243da2f07SMax Staudt 			set_bit(CAN327_TX_DO_CANID_29BIT_HIGH, &elm->cmds_todo);
19343da2f07SMax Staudt 		} else {
19443da2f07SMax Staudt 			set_bit(CAN327_TX_DO_CANID_11BIT, &elm->cmds_todo);
19543da2f07SMax Staudt 			clear_bit(CAN327_TX_DO_CANID_29BIT_LOW,
19643da2f07SMax Staudt 				  &elm->cmds_todo);
19743da2f07SMax Staudt 			clear_bit(CAN327_TX_DO_CANID_29BIT_HIGH,
19843da2f07SMax Staudt 				  &elm->cmds_todo);
19943da2f07SMax Staudt 		}
20043da2f07SMax Staudt 	}
20143da2f07SMax Staudt 
20243da2f07SMax Staudt 	/* Schedule the CAN frame itself. */
20343da2f07SMax Staudt 	elm->can_frame_to_send = *frame;
20443da2f07SMax Staudt 	set_bit(CAN327_TX_DO_CAN_DATA, &elm->cmds_todo);
20543da2f07SMax Staudt 
20643da2f07SMax Staudt 	can327_kick_into_cmd_mode(elm);
20743da2f07SMax Staudt }
20843da2f07SMax Staudt 
20943da2f07SMax Staudt /* ELM327 initialisation sequence.
21043da2f07SMax Staudt  * The line length is limited by the buffer in can327_handle_prompt().
21143da2f07SMax Staudt  */
21243da2f07SMax Staudt static char *can327_init_script[] = {
21343da2f07SMax Staudt 	"AT WS\r",        /* v1.0: Warm Start */
21443da2f07SMax Staudt 	"AT PP FF OFF\r", /* v1.0: All Programmable Parameters Off */
21543da2f07SMax Staudt 	"AT M0\r",        /* v1.0: Memory Off */
21643da2f07SMax Staudt 	"AT AL\r",        /* v1.0: Allow Long messages */
21743da2f07SMax Staudt 	"AT BI\r",        /* v1.0: Bypass Initialisation */
21843da2f07SMax Staudt 	"AT CAF0\r",      /* v1.0: CAN Auto Formatting Off */
21943da2f07SMax Staudt 	"AT CFC0\r",      /* v1.0: CAN Flow Control Off */
22043da2f07SMax Staudt 	"AT CF 000\r",    /* v1.0: Reset CAN ID Filter */
22143da2f07SMax Staudt 	"AT CM 000\r",    /* v1.0: Reset CAN ID Mask */
22243da2f07SMax Staudt 	"AT E1\r",        /* v1.0: Echo On */
22343da2f07SMax Staudt 	"AT H1\r",        /* v1.0: Headers On */
22443da2f07SMax Staudt 	"AT L0\r",        /* v1.0: Linefeeds Off */
22543da2f07SMax Staudt 	"AT SH 7DF\r",    /* v1.0: Set CAN sending ID to 0x7df */
22643da2f07SMax Staudt 	"AT ST FF\r",     /* v1.0: Set maximum Timeout for response after TX */
22743da2f07SMax Staudt 	"AT AT0\r",       /* v1.2: Adaptive Timing Off */
22843da2f07SMax Staudt 	"AT D1\r",        /* v1.3: Print DLC On */
22943da2f07SMax Staudt 	"AT S1\r",        /* v1.3: Spaces On */
23043da2f07SMax Staudt 	"AT TP B\r",      /* v1.0: Try Protocol B */
23143da2f07SMax Staudt 	NULL
23243da2f07SMax Staudt };
23343da2f07SMax Staudt 
can327_init_device(struct can327 * elm)23443da2f07SMax Staudt static void can327_init_device(struct can327 *elm)
23543da2f07SMax Staudt {
23643da2f07SMax Staudt 	lockdep_assert_held(&elm->lock);
23743da2f07SMax Staudt 
23843da2f07SMax Staudt 	elm->state = CAN327_STATE_NOTINIT;
23943da2f07SMax Staudt 	elm->can_frame_to_send.can_id = 0x7df; /* ELM327 HW default */
24043da2f07SMax Staudt 	elm->rxfill = 0;
24143da2f07SMax Staudt 	elm->drop_next_line = 0;
24243da2f07SMax Staudt 
24343da2f07SMax Staudt 	/* We can only set the bitrate as a fraction of 500000.
24443da2f07SMax Staudt 	 * The bitrates listed in can327_bitrate_const will
24543da2f07SMax Staudt 	 * limit the user to the right values.
24643da2f07SMax Staudt 	 */
24743da2f07SMax Staudt 	elm->can_bitrate_divisor = 500000 / elm->can.bittiming.bitrate;
24843da2f07SMax Staudt 	elm->can_config =
24943da2f07SMax Staudt 		CAN327_CAN_CONFIG_SEND_SFF | CAN327_CAN_CONFIG_VARIABLE_DLC |
25043da2f07SMax Staudt 		CAN327_CAN_CONFIG_RECV_BOTH_SFF_EFF | elm->can_bitrate_divisor;
25143da2f07SMax Staudt 
25243da2f07SMax Staudt 	/* Configure ELM327 and then start monitoring */
25343da2f07SMax Staudt 	elm->next_init_cmd = &can327_init_script[0];
25443da2f07SMax Staudt 	set_bit(CAN327_TX_DO_INIT, &elm->cmds_todo);
25543da2f07SMax Staudt 	set_bit(CAN327_TX_DO_SILENT_MONITOR, &elm->cmds_todo);
25643da2f07SMax Staudt 	set_bit(CAN327_TX_DO_RESPONSES, &elm->cmds_todo);
25743da2f07SMax Staudt 	set_bit(CAN327_TX_DO_CAN_CONFIG, &elm->cmds_todo);
25843da2f07SMax Staudt 
25943da2f07SMax Staudt 	can327_kick_into_cmd_mode(elm);
26043da2f07SMax Staudt }
26143da2f07SMax Staudt 
can327_feed_frame_to_netdev(struct can327 * elm,struct sk_buff * skb)26243da2f07SMax Staudt static void can327_feed_frame_to_netdev(struct can327 *elm, struct sk_buff *skb)
26343da2f07SMax Staudt {
26443da2f07SMax Staudt 	lockdep_assert_held(&elm->lock);
26543da2f07SMax Staudt 
2668fa452cfSZiyang Xuan 	if (!netif_running(elm->dev)) {
2678fa452cfSZiyang Xuan 		kfree_skb(skb);
26843da2f07SMax Staudt 		return;
2698fa452cfSZiyang Xuan 	}
27043da2f07SMax Staudt 
27143da2f07SMax Staudt 	/* Queue for NAPI pickup.
27243da2f07SMax Staudt 	 * rx-offload will update stats and LEDs for us.
27343da2f07SMax Staudt 	 */
27443da2f07SMax Staudt 	if (can_rx_offload_queue_tail(&elm->offload, skb))
27543da2f07SMax Staudt 		elm->dev->stats.rx_fifo_errors++;
27643da2f07SMax Staudt 
27743da2f07SMax Staudt 	/* Wake NAPI */
27843da2f07SMax Staudt 	can_rx_offload_irq_finish(&elm->offload);
27943da2f07SMax Staudt }
28043da2f07SMax Staudt 
28143da2f07SMax Staudt /* Called when we're out of ideas and just want it all to end. */
can327_uart_side_failure(struct can327 * elm)28243da2f07SMax Staudt static inline void can327_uart_side_failure(struct can327 *elm)
28343da2f07SMax Staudt {
28443da2f07SMax Staudt 	struct can_frame *frame;
28543da2f07SMax Staudt 	struct sk_buff *skb;
28643da2f07SMax Staudt 
28743da2f07SMax Staudt 	lockdep_assert_held(&elm->lock);
28843da2f07SMax Staudt 
28943da2f07SMax Staudt 	elm->uart_side_failure = true;
29043da2f07SMax Staudt 
29143da2f07SMax Staudt 	clear_bit(TTY_DO_WRITE_WAKEUP, &elm->tty->flags);
29243da2f07SMax Staudt 
29343da2f07SMax Staudt 	elm->can.can_stats.bus_off++;
29443da2f07SMax Staudt 	netif_stop_queue(elm->dev);
29543da2f07SMax Staudt 	elm->can.state = CAN_STATE_BUS_OFF;
29643da2f07SMax Staudt 	can_bus_off(elm->dev);
29743da2f07SMax Staudt 
29843da2f07SMax Staudt 	netdev_err(elm->dev,
29943da2f07SMax Staudt 		   "ELM327 misbehaved. Blocking further communication.\n");
30043da2f07SMax Staudt 
30143da2f07SMax Staudt 	skb = alloc_can_err_skb(elm->dev, &frame);
30243da2f07SMax Staudt 	if (!skb)
30343da2f07SMax Staudt 		return;
30443da2f07SMax Staudt 
30543da2f07SMax Staudt 	frame->can_id |= CAN_ERR_BUSOFF;
30643da2f07SMax Staudt 	can327_feed_frame_to_netdev(elm, skb);
30743da2f07SMax Staudt }
30843da2f07SMax Staudt 
30943da2f07SMax Staudt /* Compares a byte buffer (non-NUL terminated) to the payload part of
31043da2f07SMax Staudt  * a string, and returns true iff the buffer (content *and* length) is
31143da2f07SMax Staudt  * exactly that string, without the terminating NUL byte.
31243da2f07SMax Staudt  *
31343da2f07SMax Staudt  * Example: If reference is "BUS ERROR", then this returns true iff nbytes == 9
31443da2f07SMax Staudt  *          and !memcmp(buf, "BUS ERROR", 9).
31543da2f07SMax Staudt  *
31643da2f07SMax Staudt  * The reason to use strings is so we can easily include them in the C
31743da2f07SMax Staudt  * code, and to avoid hardcoding lengths.
31843da2f07SMax Staudt  */
can327_rxbuf_cmp(const u8 * buf,size_t nbytes,const char * reference)31943da2f07SMax Staudt static inline bool can327_rxbuf_cmp(const u8 *buf, size_t nbytes,
32043da2f07SMax Staudt 				    const char *reference)
32143da2f07SMax Staudt {
32243da2f07SMax Staudt 	size_t ref_len = strlen(reference);
32343da2f07SMax Staudt 
32443da2f07SMax Staudt 	return (nbytes == ref_len) && !memcmp(buf, reference, ref_len);
32543da2f07SMax Staudt }
32643da2f07SMax Staudt 
can327_parse_error(struct can327 * elm,size_t len)32743da2f07SMax Staudt static void can327_parse_error(struct can327 *elm, size_t len)
32843da2f07SMax Staudt {
32943da2f07SMax Staudt 	struct can_frame *frame;
33043da2f07SMax Staudt 	struct sk_buff *skb;
33143da2f07SMax Staudt 
33243da2f07SMax Staudt 	lockdep_assert_held(&elm->lock);
33343da2f07SMax Staudt 
33443da2f07SMax Staudt 	skb = alloc_can_err_skb(elm->dev, &frame);
33543da2f07SMax Staudt 	if (!skb)
33643da2f07SMax Staudt 		/* It's okay to return here:
33743da2f07SMax Staudt 		 * The outer parsing loop will drop this UART buffer.
33843da2f07SMax Staudt 		 */
33943da2f07SMax Staudt 		return;
34043da2f07SMax Staudt 
34143da2f07SMax Staudt 	/* Filter possible error messages based on length of RX'd line */
34243da2f07SMax Staudt 	if (can327_rxbuf_cmp(elm->rxbuf, len, "UNABLE TO CONNECT")) {
34343da2f07SMax Staudt 		netdev_err(elm->dev,
34443da2f07SMax Staudt 			   "ELM327 reported UNABLE TO CONNECT. Please check your setup.\n");
34543da2f07SMax Staudt 	} else if (can327_rxbuf_cmp(elm->rxbuf, len, "BUFFER FULL")) {
34643da2f07SMax Staudt 		/* This will only happen if the last data line was complete.
34743da2f07SMax Staudt 		 * Otherwise, can327_parse_frame() will heuristically
34843da2f07SMax Staudt 		 * emit this kind of error frame instead.
34943da2f07SMax Staudt 		 */
35043da2f07SMax Staudt 		frame->can_id |= CAN_ERR_CRTL;
35143da2f07SMax Staudt 		frame->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
35243da2f07SMax Staudt 	} else if (can327_rxbuf_cmp(elm->rxbuf, len, "BUS ERROR")) {
35343da2f07SMax Staudt 		frame->can_id |= CAN_ERR_BUSERROR;
35443da2f07SMax Staudt 	} else if (can327_rxbuf_cmp(elm->rxbuf, len, "CAN ERROR")) {
35543da2f07SMax Staudt 		frame->can_id |= CAN_ERR_PROT;
35643da2f07SMax Staudt 	} else if (can327_rxbuf_cmp(elm->rxbuf, len, "<RX ERROR")) {
35743da2f07SMax Staudt 		frame->can_id |= CAN_ERR_PROT;
35843da2f07SMax Staudt 	} else if (can327_rxbuf_cmp(elm->rxbuf, len, "BUS BUSY")) {
35943da2f07SMax Staudt 		frame->can_id |= CAN_ERR_PROT;
36043da2f07SMax Staudt 		frame->data[2] = CAN_ERR_PROT_OVERLOAD;
36143da2f07SMax Staudt 	} else if (can327_rxbuf_cmp(elm->rxbuf, len, "FB ERROR")) {
36243da2f07SMax Staudt 		frame->can_id |= CAN_ERR_PROT;
36343da2f07SMax Staudt 		frame->data[2] = CAN_ERR_PROT_TX;
36443da2f07SMax Staudt 	} else if (len == 5 && !memcmp(elm->rxbuf, "ERR", 3)) {
36543da2f07SMax Staudt 		/* ERR is followed by two digits, hence line length 5 */
36643da2f07SMax Staudt 		netdev_err(elm->dev, "ELM327 reported an ERR%c%c. Please power it off and on again.\n",
36743da2f07SMax Staudt 			   elm->rxbuf[3], elm->rxbuf[4]);
36843da2f07SMax Staudt 		frame->can_id |= CAN_ERR_CRTL;
36943da2f07SMax Staudt 	} else {
37043da2f07SMax Staudt 		/* Something else has happened.
37143da2f07SMax Staudt 		 * Maybe garbage on the UART line.
37243da2f07SMax Staudt 		 * Emit a generic error frame.
37343da2f07SMax Staudt 		 */
37443da2f07SMax Staudt 	}
37543da2f07SMax Staudt 
37643da2f07SMax Staudt 	can327_feed_frame_to_netdev(elm, skb);
37743da2f07SMax Staudt }
37843da2f07SMax Staudt 
37943da2f07SMax Staudt /* Parse CAN frames coming as ASCII from ELM327.
38043da2f07SMax Staudt  * They can be of various formats:
38143da2f07SMax Staudt  *
38243da2f07SMax Staudt  * 29-bit ID (EFF):  12 34 56 78 D PL PL PL PL PL PL PL PL
38343da2f07SMax Staudt  * 11-bit ID (!EFF): 123 D PL PL PL PL PL PL PL PL
38443da2f07SMax Staudt  *
38543da2f07SMax Staudt  * where D = DLC, PL = payload byte
38643da2f07SMax Staudt  *
38743da2f07SMax Staudt  * Instead of a payload, RTR indicates a remote request.
38843da2f07SMax Staudt  *
38943da2f07SMax Staudt  * We will use the spaces and line length to guess the format.
39043da2f07SMax Staudt  */
can327_parse_frame(struct can327 * elm,size_t len)39143da2f07SMax Staudt static int can327_parse_frame(struct can327 *elm, size_t len)
39243da2f07SMax Staudt {
39343da2f07SMax Staudt 	struct can_frame *frame;
39443da2f07SMax Staudt 	struct sk_buff *skb;
39543da2f07SMax Staudt 	int hexlen;
39643da2f07SMax Staudt 	int datastart;
39743da2f07SMax Staudt 	int i;
39843da2f07SMax Staudt 
39943da2f07SMax Staudt 	lockdep_assert_held(&elm->lock);
40043da2f07SMax Staudt 
40143da2f07SMax Staudt 	skb = alloc_can_skb(elm->dev, &frame);
40243da2f07SMax Staudt 	if (!skb)
40343da2f07SMax Staudt 		return -ENOMEM;
40443da2f07SMax Staudt 
40543da2f07SMax Staudt 	/* Find first non-hex and non-space character:
40643da2f07SMax Staudt 	 *  - In the simplest case, there is none.
40743da2f07SMax Staudt 	 *  - For RTR frames, 'R' is the first non-hex character.
40843da2f07SMax Staudt 	 *  - An error message may replace the end of the data line.
40943da2f07SMax Staudt 	 */
41043da2f07SMax Staudt 	for (hexlen = 0; hexlen <= len; hexlen++) {
41143da2f07SMax Staudt 		if (hex_to_bin(elm->rxbuf[hexlen]) < 0 &&
41243da2f07SMax Staudt 		    elm->rxbuf[hexlen] != ' ') {
41343da2f07SMax Staudt 			break;
41443da2f07SMax Staudt 		}
41543da2f07SMax Staudt 	}
41643da2f07SMax Staudt 
41743da2f07SMax Staudt 	/* Sanity check whether the line is really a clean hexdump,
41843da2f07SMax Staudt 	 * or terminated by an error message, or contains garbage.
41943da2f07SMax Staudt 	 */
42043da2f07SMax Staudt 	if (hexlen < len && !isdigit(elm->rxbuf[hexlen]) &&
42143da2f07SMax Staudt 	    !isupper(elm->rxbuf[hexlen]) && '<' != elm->rxbuf[hexlen] &&
42243da2f07SMax Staudt 	    ' ' != elm->rxbuf[hexlen]) {
42343da2f07SMax Staudt 		/* The line is likely garbled anyway, so bail.
42443da2f07SMax Staudt 		 * The main code will restart listening.
42543da2f07SMax Staudt 		 */
42643da2f07SMax Staudt 		kfree_skb(skb);
42743da2f07SMax Staudt 		return -ENODATA;
42843da2f07SMax Staudt 	}
42943da2f07SMax Staudt 
43043da2f07SMax Staudt 	/* Use spaces in CAN ID to distinguish 29 or 11 bit address length.
43143da2f07SMax Staudt 	 * No out-of-bounds access:
43243da2f07SMax Staudt 	 * We use the fact that we can always read from elm->rxbuf.
43343da2f07SMax Staudt 	 */
43443da2f07SMax Staudt 	if (elm->rxbuf[2] == ' ' && elm->rxbuf[5] == ' ' &&
43543da2f07SMax Staudt 	    elm->rxbuf[8] == ' ' && elm->rxbuf[11] == ' ' &&
43643da2f07SMax Staudt 	    elm->rxbuf[13] == ' ') {
43743da2f07SMax Staudt 		frame->can_id = CAN_EFF_FLAG;
43843da2f07SMax Staudt 		datastart = 14;
43943da2f07SMax Staudt 	} else if (elm->rxbuf[3] == ' ' && elm->rxbuf[5] == ' ') {
44043da2f07SMax Staudt 		datastart = 6;
44143da2f07SMax Staudt 	} else {
44243da2f07SMax Staudt 		/* This is not a well-formatted data line.
44343da2f07SMax Staudt 		 * Assume it's an error message.
44443da2f07SMax Staudt 		 */
44543da2f07SMax Staudt 		kfree_skb(skb);
44643da2f07SMax Staudt 		return -ENODATA;
44743da2f07SMax Staudt 	}
44843da2f07SMax Staudt 
44943da2f07SMax Staudt 	if (hexlen < datastart) {
45043da2f07SMax Staudt 		/* The line is too short to be a valid frame hex dump.
45143da2f07SMax Staudt 		 * Something interrupted the hex dump or it is invalid.
45243da2f07SMax Staudt 		 */
45343da2f07SMax Staudt 		kfree_skb(skb);
45443da2f07SMax Staudt 		return -ENODATA;
45543da2f07SMax Staudt 	}
45643da2f07SMax Staudt 
45743da2f07SMax Staudt 	/* From here on all chars up to buf[hexlen] are hex or spaces,
45843da2f07SMax Staudt 	 * at well-defined offsets.
45943da2f07SMax Staudt 	 */
46043da2f07SMax Staudt 
46143da2f07SMax Staudt 	/* Read CAN data length */
46243da2f07SMax Staudt 	frame->len = (hex_to_bin(elm->rxbuf[datastart - 2]) << 0);
46343da2f07SMax Staudt 
46443da2f07SMax Staudt 	/* Read CAN ID */
46543da2f07SMax Staudt 	if (frame->can_id & CAN_EFF_FLAG) {
46643da2f07SMax Staudt 		frame->can_id |= (hex_to_bin(elm->rxbuf[0]) << 28) |
46743da2f07SMax Staudt 				 (hex_to_bin(elm->rxbuf[1]) << 24) |
46843da2f07SMax Staudt 				 (hex_to_bin(elm->rxbuf[3]) << 20) |
46943da2f07SMax Staudt 				 (hex_to_bin(elm->rxbuf[4]) << 16) |
47043da2f07SMax Staudt 				 (hex_to_bin(elm->rxbuf[6]) << 12) |
47143da2f07SMax Staudt 				 (hex_to_bin(elm->rxbuf[7]) << 8) |
47243da2f07SMax Staudt 				 (hex_to_bin(elm->rxbuf[9]) << 4) |
47343da2f07SMax Staudt 				 (hex_to_bin(elm->rxbuf[10]) << 0);
47443da2f07SMax Staudt 	} else {
47543da2f07SMax Staudt 		frame->can_id |= (hex_to_bin(elm->rxbuf[0]) << 8) |
47643da2f07SMax Staudt 				 (hex_to_bin(elm->rxbuf[1]) << 4) |
47743da2f07SMax Staudt 				 (hex_to_bin(elm->rxbuf[2]) << 0);
47843da2f07SMax Staudt 	}
47943da2f07SMax Staudt 
48043da2f07SMax Staudt 	/* Check for RTR frame */
48143da2f07SMax Staudt 	if (elm->rxfill >= hexlen + 3 &&
48243da2f07SMax Staudt 	    !memcmp(&elm->rxbuf[hexlen], "RTR", 3)) {
48343da2f07SMax Staudt 		frame->can_id |= CAN_RTR_FLAG;
48443da2f07SMax Staudt 	}
48543da2f07SMax Staudt 
48643da2f07SMax Staudt 	/* Is the line long enough to hold the advertised payload?
48743da2f07SMax Staudt 	 * Note: RTR frames have a DLC, but no actual payload.
48843da2f07SMax Staudt 	 */
48943da2f07SMax Staudt 	if (!(frame->can_id & CAN_RTR_FLAG) &&
49043da2f07SMax Staudt 	    (hexlen < frame->len * 3 + datastart)) {
49143da2f07SMax Staudt 		/* Incomplete frame.
49243da2f07SMax Staudt 		 * Probably the ELM327's RS232 TX buffer was full.
49343da2f07SMax Staudt 		 * Emit an error frame and exit.
49443da2f07SMax Staudt 		 */
49543da2f07SMax Staudt 		frame->can_id = CAN_ERR_FLAG | CAN_ERR_CRTL;
49643da2f07SMax Staudt 		frame->len = CAN_ERR_DLC;
49743da2f07SMax Staudt 		frame->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
49843da2f07SMax Staudt 		can327_feed_frame_to_netdev(elm, skb);
49943da2f07SMax Staudt 
50043da2f07SMax Staudt 		/* Signal failure to parse.
50143da2f07SMax Staudt 		 * The line will be re-parsed as an error line, which will fail.
50243da2f07SMax Staudt 		 * However, this will correctly drop the state machine back into
50343da2f07SMax Staudt 		 * command mode.
50443da2f07SMax Staudt 		 */
50543da2f07SMax Staudt 		return -ENODATA;
50643da2f07SMax Staudt 	}
50743da2f07SMax Staudt 
50843da2f07SMax Staudt 	/* Parse the data nibbles. */
50943da2f07SMax Staudt 	for (i = 0; i < frame->len; i++) {
51043da2f07SMax Staudt 		frame->data[i] =
51143da2f07SMax Staudt 			(hex_to_bin(elm->rxbuf[datastart + 3 * i]) << 4) |
51243da2f07SMax Staudt 			(hex_to_bin(elm->rxbuf[datastart + 3 * i + 1]));
51343da2f07SMax Staudt 	}
51443da2f07SMax Staudt 
51543da2f07SMax Staudt 	/* Feed the frame to the network layer. */
51643da2f07SMax Staudt 	can327_feed_frame_to_netdev(elm, skb);
51743da2f07SMax Staudt 
51843da2f07SMax Staudt 	return 0;
51943da2f07SMax Staudt }
52043da2f07SMax Staudt 
can327_parse_line(struct can327 * elm,size_t len)52143da2f07SMax Staudt static void can327_parse_line(struct can327 *elm, size_t len)
52243da2f07SMax Staudt {
52343da2f07SMax Staudt 	lockdep_assert_held(&elm->lock);
52443da2f07SMax Staudt 
52543da2f07SMax Staudt 	/* Skip empty lines */
52643da2f07SMax Staudt 	if (!len)
52743da2f07SMax Staudt 		return;
52843da2f07SMax Staudt 
52943da2f07SMax Staudt 	/* Skip echo lines */
53043da2f07SMax Staudt 	if (elm->drop_next_line) {
53143da2f07SMax Staudt 		elm->drop_next_line = 0;
53243da2f07SMax Staudt 		return;
53343da2f07SMax Staudt 	} else if (!memcmp(elm->rxbuf, "AT", 2)) {
53443da2f07SMax Staudt 		return;
53543da2f07SMax Staudt 	}
53643da2f07SMax Staudt 
53743da2f07SMax Staudt 	/* Regular parsing */
53843da2f07SMax Staudt 	if (elm->state == CAN327_STATE_RECEIVING &&
53943da2f07SMax Staudt 	    can327_parse_frame(elm, len)) {
54043da2f07SMax Staudt 		/* Parse an error line. */
54143da2f07SMax Staudt 		can327_parse_error(elm, len);
54243da2f07SMax Staudt 
54343da2f07SMax Staudt 		/* Start afresh. */
54443da2f07SMax Staudt 		can327_kick_into_cmd_mode(elm);
54543da2f07SMax Staudt 	}
54643da2f07SMax Staudt }
54743da2f07SMax Staudt 
can327_handle_prompt(struct can327 * elm)54843da2f07SMax Staudt static void can327_handle_prompt(struct can327 *elm)
54943da2f07SMax Staudt {
55043da2f07SMax Staudt 	struct can_frame *frame = &elm->can_frame_to_send;
55143da2f07SMax Staudt 	/* Size this buffer for the largest ELM327 line we may generate,
55243da2f07SMax Staudt 	 * which is currently an 8 byte CAN frame's payload hexdump.
55343da2f07SMax Staudt 	 * Items in can327_init_script must fit here, too!
55443da2f07SMax Staudt 	 */
55543da2f07SMax Staudt 	char local_txbuf[sizeof("0102030405060708\r")];
55643da2f07SMax Staudt 
55743da2f07SMax Staudt 	lockdep_assert_held(&elm->lock);
55843da2f07SMax Staudt 
55943da2f07SMax Staudt 	if (!elm->cmds_todo) {
56043da2f07SMax Staudt 		/* Enter CAN monitor mode */
56143da2f07SMax Staudt 		can327_send(elm, "ATMA\r", 5);
56243da2f07SMax Staudt 		elm->state = CAN327_STATE_RECEIVING;
56343da2f07SMax Staudt 
56443da2f07SMax Staudt 		/* We will be in the default state once this command is
56543da2f07SMax Staudt 		 * sent, so enable the TX packet queue.
56643da2f07SMax Staudt 		 */
56743da2f07SMax Staudt 		netif_wake_queue(elm->dev);
56843da2f07SMax Staudt 
56943da2f07SMax Staudt 		return;
57043da2f07SMax Staudt 	}
57143da2f07SMax Staudt 
57243da2f07SMax Staudt 	/* Reconfigure ELM327 step by step as indicated by elm->cmds_todo */
57343da2f07SMax Staudt 	if (test_bit(CAN327_TX_DO_INIT, &elm->cmds_todo)) {
57443da2f07SMax Staudt 		snprintf(local_txbuf, sizeof(local_txbuf), "%s",
57543da2f07SMax Staudt 			 *elm->next_init_cmd);
57643da2f07SMax Staudt 
57743da2f07SMax Staudt 		elm->next_init_cmd++;
57843da2f07SMax Staudt 		if (!(*elm->next_init_cmd)) {
57943da2f07SMax Staudt 			clear_bit(CAN327_TX_DO_INIT, &elm->cmds_todo);
58043da2f07SMax Staudt 			/* Init finished. */
58143da2f07SMax Staudt 		}
58243da2f07SMax Staudt 
58343da2f07SMax Staudt 	} else if (test_and_clear_bit(CAN327_TX_DO_SILENT_MONITOR, &elm->cmds_todo)) {
58443da2f07SMax Staudt 		snprintf(local_txbuf, sizeof(local_txbuf),
58543da2f07SMax Staudt 			 "ATCSM%i\r",
58643da2f07SMax Staudt 			 !!(elm->can.ctrlmode & CAN_CTRLMODE_LISTENONLY));
58743da2f07SMax Staudt 
58843da2f07SMax Staudt 	} else if (test_and_clear_bit(CAN327_TX_DO_RESPONSES, &elm->cmds_todo)) {
58943da2f07SMax Staudt 		snprintf(local_txbuf, sizeof(local_txbuf),
59043da2f07SMax Staudt 			 "ATR%i\r",
59143da2f07SMax Staudt 			 !(elm->can.ctrlmode & CAN_CTRLMODE_LISTENONLY));
59243da2f07SMax Staudt 
59343da2f07SMax Staudt 	} else if (test_and_clear_bit(CAN327_TX_DO_CAN_CONFIG, &elm->cmds_todo)) {
59443da2f07SMax Staudt 		snprintf(local_txbuf, sizeof(local_txbuf),
59543da2f07SMax Staudt 			 "ATPC\r");
59643da2f07SMax Staudt 		set_bit(CAN327_TX_DO_CAN_CONFIG_PART2, &elm->cmds_todo);
59743da2f07SMax Staudt 
59843da2f07SMax Staudt 	} else if (test_and_clear_bit(CAN327_TX_DO_CAN_CONFIG_PART2, &elm->cmds_todo)) {
59943da2f07SMax Staudt 		snprintf(local_txbuf, sizeof(local_txbuf),
60043da2f07SMax Staudt 			 "ATPB%04X\r",
60143da2f07SMax Staudt 			 elm->can_config);
60243da2f07SMax Staudt 
60343da2f07SMax Staudt 	} else if (test_and_clear_bit(CAN327_TX_DO_CANID_29BIT_HIGH, &elm->cmds_todo)) {
60443da2f07SMax Staudt 		snprintf(local_txbuf, sizeof(local_txbuf),
60543da2f07SMax Staudt 			 "ATCP%02X\r",
60643da2f07SMax Staudt 			 (frame->can_id & CAN_EFF_MASK) >> 24);
60743da2f07SMax Staudt 
60843da2f07SMax Staudt 	} else if (test_and_clear_bit(CAN327_TX_DO_CANID_29BIT_LOW, &elm->cmds_todo)) {
60943da2f07SMax Staudt 		snprintf(local_txbuf, sizeof(local_txbuf),
61043da2f07SMax Staudt 			 "ATSH%06X\r",
61143da2f07SMax Staudt 			 frame->can_id & CAN_EFF_MASK & ((1 << 24) - 1));
61243da2f07SMax Staudt 
61343da2f07SMax Staudt 	} else if (test_and_clear_bit(CAN327_TX_DO_CANID_11BIT, &elm->cmds_todo)) {
61443da2f07SMax Staudt 		snprintf(local_txbuf, sizeof(local_txbuf),
61543da2f07SMax Staudt 			 "ATSH%03X\r",
61643da2f07SMax Staudt 			 frame->can_id & CAN_SFF_MASK);
61743da2f07SMax Staudt 
61843da2f07SMax Staudt 	} else if (test_and_clear_bit(CAN327_TX_DO_CAN_DATA, &elm->cmds_todo)) {
61943da2f07SMax Staudt 		if (frame->can_id & CAN_RTR_FLAG) {
62043da2f07SMax Staudt 			/* Send an RTR frame. Their DLC is fixed.
62143da2f07SMax Staudt 			 * Some chips don't send them at all.
62243da2f07SMax Staudt 			 */
62343da2f07SMax Staudt 			snprintf(local_txbuf, sizeof(local_txbuf), "ATRTR\r");
62443da2f07SMax Staudt 		} else {
62543da2f07SMax Staudt 			/* Send a regular CAN data frame */
62643da2f07SMax Staudt 			int i;
62743da2f07SMax Staudt 
62843da2f07SMax Staudt 			for (i = 0; i < frame->len; i++) {
62943da2f07SMax Staudt 				snprintf(&local_txbuf[2 * i],
63043da2f07SMax Staudt 					 sizeof(local_txbuf), "%02X",
63143da2f07SMax Staudt 					 frame->data[i]);
63243da2f07SMax Staudt 			}
63343da2f07SMax Staudt 
63443da2f07SMax Staudt 			snprintf(&local_txbuf[2 * i], sizeof(local_txbuf),
63543da2f07SMax Staudt 				 "\r");
63643da2f07SMax Staudt 		}
63743da2f07SMax Staudt 
63843da2f07SMax Staudt 		elm->drop_next_line = 1;
63943da2f07SMax Staudt 		elm->state = CAN327_STATE_RECEIVING;
64043da2f07SMax Staudt 
64143da2f07SMax Staudt 		/* We will be in the default state once this command is
64243da2f07SMax Staudt 		 * sent, so enable the TX packet queue.
64343da2f07SMax Staudt 		 */
64443da2f07SMax Staudt 		netif_wake_queue(elm->dev);
64543da2f07SMax Staudt 	}
64643da2f07SMax Staudt 
64743da2f07SMax Staudt 	can327_send(elm, local_txbuf, strlen(local_txbuf));
64843da2f07SMax Staudt }
64943da2f07SMax Staudt 
can327_is_ready_char(char c)65043da2f07SMax Staudt static bool can327_is_ready_char(char c)
65143da2f07SMax Staudt {
65243da2f07SMax Staudt 	/* Bits 0xc0 are sometimes set (randomly), hence the mask.
65343da2f07SMax Staudt 	 * Probably bad hardware.
65443da2f07SMax Staudt 	 */
65543da2f07SMax Staudt 	return (c & 0x3f) == CAN327_READY_CHAR;
65643da2f07SMax Staudt }
65743da2f07SMax Staudt 
can327_drop_bytes(struct can327 * elm,size_t i)65843da2f07SMax Staudt static void can327_drop_bytes(struct can327 *elm, size_t i)
65943da2f07SMax Staudt {
66043da2f07SMax Staudt 	lockdep_assert_held(&elm->lock);
66143da2f07SMax Staudt 
66243da2f07SMax Staudt 	memmove(&elm->rxbuf[0], &elm->rxbuf[i], CAN327_SIZE_RXBUF - i);
66343da2f07SMax Staudt 	elm->rxfill -= i;
66443da2f07SMax Staudt }
66543da2f07SMax Staudt 
can327_parse_rxbuf(struct can327 * elm,size_t first_new_char_idx)66643da2f07SMax Staudt static void can327_parse_rxbuf(struct can327 *elm, size_t first_new_char_idx)
66743da2f07SMax Staudt {
66843da2f07SMax Staudt 	size_t len, pos;
66943da2f07SMax Staudt 
67043da2f07SMax Staudt 	lockdep_assert_held(&elm->lock);
67143da2f07SMax Staudt 
67243da2f07SMax Staudt 	switch (elm->state) {
67343da2f07SMax Staudt 	case CAN327_STATE_NOTINIT:
67443da2f07SMax Staudt 		elm->rxfill = 0;
67543da2f07SMax Staudt 		break;
67643da2f07SMax Staudt 
67743da2f07SMax Staudt 	case CAN327_STATE_GETDUMMYCHAR:
67843da2f07SMax Staudt 		/* Wait for 'y' or '>' */
67943da2f07SMax Staudt 		for (pos = 0; pos < elm->rxfill; pos++) {
68043da2f07SMax Staudt 			if (elm->rxbuf[pos] == CAN327_DUMMY_CHAR) {
68143da2f07SMax Staudt 				can327_send(elm, "\r", 1);
68243da2f07SMax Staudt 				elm->state = CAN327_STATE_GETPROMPT;
68343da2f07SMax Staudt 				pos++;
68443da2f07SMax Staudt 				break;
68543da2f07SMax Staudt 			} else if (can327_is_ready_char(elm->rxbuf[pos])) {
68643da2f07SMax Staudt 				can327_send(elm, CAN327_DUMMY_STRING, 1);
68743da2f07SMax Staudt 				pos++;
68843da2f07SMax Staudt 				break;
68943da2f07SMax Staudt 			}
69043da2f07SMax Staudt 		}
69143da2f07SMax Staudt 
69243da2f07SMax Staudt 		can327_drop_bytes(elm, pos);
69343da2f07SMax Staudt 		break;
69443da2f07SMax Staudt 
69543da2f07SMax Staudt 	case CAN327_STATE_GETPROMPT:
69643da2f07SMax Staudt 		/* Wait for '>' */
69743da2f07SMax Staudt 		if (can327_is_ready_char(elm->rxbuf[elm->rxfill - 1]))
69843da2f07SMax Staudt 			can327_handle_prompt(elm);
69943da2f07SMax Staudt 
70043da2f07SMax Staudt 		elm->rxfill = 0;
70143da2f07SMax Staudt 		break;
70243da2f07SMax Staudt 
70343da2f07SMax Staudt 	case CAN327_STATE_RECEIVING:
70443da2f07SMax Staudt 		/* Find <CR> delimiting feedback lines. */
70543da2f07SMax Staudt 		len = first_new_char_idx;
70643da2f07SMax Staudt 		while (len < elm->rxfill && elm->rxbuf[len] != '\r')
70743da2f07SMax Staudt 			len++;
70843da2f07SMax Staudt 
70943da2f07SMax Staudt 		if (len == CAN327_SIZE_RXBUF) {
71043da2f07SMax Staudt 			/* Assume the buffer ran full with garbage.
71143da2f07SMax Staudt 			 * Did we even connect at the right baud rate?
71243da2f07SMax Staudt 			 */
71343da2f07SMax Staudt 			netdev_err(elm->dev,
71443da2f07SMax Staudt 				   "RX buffer overflow. Faulty ELM327 or UART?\n");
71543da2f07SMax Staudt 			can327_uart_side_failure(elm);
71643da2f07SMax Staudt 		} else if (len == elm->rxfill) {
71743da2f07SMax Staudt 			if (can327_is_ready_char(elm->rxbuf[elm->rxfill - 1])) {
71843da2f07SMax Staudt 				/* The ELM327's AT ST response timeout ran out,
71943da2f07SMax Staudt 				 * so we got a prompt.
72043da2f07SMax Staudt 				 * Clear RX buffer and restart listening.
72143da2f07SMax Staudt 				 */
72243da2f07SMax Staudt 				elm->rxfill = 0;
72343da2f07SMax Staudt 
72443da2f07SMax Staudt 				can327_handle_prompt(elm);
72543da2f07SMax Staudt 			}
72643da2f07SMax Staudt 
72743da2f07SMax Staudt 			/* No <CR> found - we haven't received a full line yet.
72843da2f07SMax Staudt 			 * Wait for more data.
72943da2f07SMax Staudt 			 */
73043da2f07SMax Staudt 		} else {
73143da2f07SMax Staudt 			/* We have a full line to parse. */
73243da2f07SMax Staudt 			can327_parse_line(elm, len);
73343da2f07SMax Staudt 
73443da2f07SMax Staudt 			/* Remove parsed data from RX buffer. */
73543da2f07SMax Staudt 			can327_drop_bytes(elm, len + 1);
73643da2f07SMax Staudt 
73743da2f07SMax Staudt 			/* More data to parse? */
73843da2f07SMax Staudt 			if (elm->rxfill)
73943da2f07SMax Staudt 				can327_parse_rxbuf(elm, 0);
74043da2f07SMax Staudt 		}
74143da2f07SMax Staudt 	}
74243da2f07SMax Staudt }
74343da2f07SMax Staudt 
can327_netdev_open(struct net_device * dev)74443da2f07SMax Staudt static int can327_netdev_open(struct net_device *dev)
74543da2f07SMax Staudt {
74643da2f07SMax Staudt 	struct can327 *elm = netdev_priv(dev);
74743da2f07SMax Staudt 	int err;
74843da2f07SMax Staudt 
74943da2f07SMax Staudt 	spin_lock_bh(&elm->lock);
75043da2f07SMax Staudt 
75143da2f07SMax Staudt 	if (!elm->tty) {
75243da2f07SMax Staudt 		spin_unlock_bh(&elm->lock);
75343da2f07SMax Staudt 		return -ENODEV;
75443da2f07SMax Staudt 	}
75543da2f07SMax Staudt 
75643da2f07SMax Staudt 	if (elm->uart_side_failure)
75743da2f07SMax Staudt 		netdev_warn(elm->dev,
75843da2f07SMax Staudt 			    "Reopening netdev after a UART side fault has been detected.\n");
75943da2f07SMax Staudt 
76043da2f07SMax Staudt 	/* Clear TTY buffers */
76143da2f07SMax Staudt 	elm->rxfill = 0;
76243da2f07SMax Staudt 	elm->txleft = 0;
76343da2f07SMax Staudt 
76443da2f07SMax Staudt 	/* open_candev() checks for elm->can.bittiming.bitrate != 0 */
76543da2f07SMax Staudt 	err = open_candev(dev);
76643da2f07SMax Staudt 	if (err) {
76743da2f07SMax Staudt 		spin_unlock_bh(&elm->lock);
76843da2f07SMax Staudt 		return err;
76943da2f07SMax Staudt 	}
77043da2f07SMax Staudt 
77143da2f07SMax Staudt 	can327_init_device(elm);
77243da2f07SMax Staudt 	spin_unlock_bh(&elm->lock);
77343da2f07SMax Staudt 
77443da2f07SMax Staudt 	err = can_rx_offload_add_manual(dev, &elm->offload, CAN327_NAPI_WEIGHT);
77543da2f07SMax Staudt 	if (err) {
77643da2f07SMax Staudt 		close_candev(dev);
77743da2f07SMax Staudt 		return err;
77843da2f07SMax Staudt 	}
77943da2f07SMax Staudt 
78043da2f07SMax Staudt 	can_rx_offload_enable(&elm->offload);
78143da2f07SMax Staudt 
78243da2f07SMax Staudt 	elm->can.state = CAN_STATE_ERROR_ACTIVE;
78343da2f07SMax Staudt 	netif_start_queue(dev);
78443da2f07SMax Staudt 
78543da2f07SMax Staudt 	return 0;
78643da2f07SMax Staudt }
78743da2f07SMax Staudt 
can327_netdev_close(struct net_device * dev)78843da2f07SMax Staudt static int can327_netdev_close(struct net_device *dev)
78943da2f07SMax Staudt {
79043da2f07SMax Staudt 	struct can327 *elm = netdev_priv(dev);
79143da2f07SMax Staudt 
79243da2f07SMax Staudt 	/* Interrupt whatever the ELM327 is doing right now */
79343da2f07SMax Staudt 	spin_lock_bh(&elm->lock);
79443da2f07SMax Staudt 	can327_send(elm, CAN327_DUMMY_STRING, 1);
79543da2f07SMax Staudt 	spin_unlock_bh(&elm->lock);
79643da2f07SMax Staudt 
79743da2f07SMax Staudt 	netif_stop_queue(dev);
79843da2f07SMax Staudt 
799f4a4d121SMax Staudt 	/* We don't flush the UART TX queue here, as we want final stop
800f4a4d121SMax Staudt 	 * commands (like the above dummy char) to be flushed out.
801f4a4d121SMax Staudt 	 */
80243da2f07SMax Staudt 
80343da2f07SMax Staudt 	can_rx_offload_disable(&elm->offload);
80443da2f07SMax Staudt 	elm->can.state = CAN_STATE_STOPPED;
80543da2f07SMax Staudt 	can_rx_offload_del(&elm->offload);
80643da2f07SMax Staudt 	close_candev(dev);
80743da2f07SMax Staudt 
80843da2f07SMax Staudt 	return 0;
80943da2f07SMax Staudt }
81043da2f07SMax Staudt 
81143da2f07SMax Staudt /* Send a can_frame to a TTY. */
can327_netdev_start_xmit(struct sk_buff * skb,struct net_device * dev)81243da2f07SMax Staudt static netdev_tx_t can327_netdev_start_xmit(struct sk_buff *skb,
81343da2f07SMax Staudt 					    struct net_device *dev)
81443da2f07SMax Staudt {
81543da2f07SMax Staudt 	struct can327 *elm = netdev_priv(dev);
81643da2f07SMax Staudt 	struct can_frame *frame = (struct can_frame *)skb->data;
81743da2f07SMax Staudt 
818ae64438bSOliver Hartkopp 	if (can_dev_dropped_skb(dev, skb))
81943da2f07SMax Staudt 		return NETDEV_TX_OK;
82043da2f07SMax Staudt 
82143da2f07SMax Staudt 	/* We shouldn't get here after a hardware fault:
82243da2f07SMax Staudt 	 * can_bus_off() calls netif_carrier_off()
82343da2f07SMax Staudt 	 */
82443da2f07SMax Staudt 	if (elm->uart_side_failure) {
82543da2f07SMax Staudt 		WARN_ON_ONCE(elm->uart_side_failure);
82643da2f07SMax Staudt 		goto out;
82743da2f07SMax Staudt 	}
82843da2f07SMax Staudt 
82943da2f07SMax Staudt 	netif_stop_queue(dev);
83043da2f07SMax Staudt 
83143da2f07SMax Staudt 	/* BHs are already disabled, so no spin_lock_bh().
8327b584fbbSChristophe JAILLET 	 * See Documentation/networking/netdevices.rst
83343da2f07SMax Staudt 	 */
83443da2f07SMax Staudt 	spin_lock(&elm->lock);
83543da2f07SMax Staudt 	can327_send_frame(elm, frame);
83643da2f07SMax Staudt 	spin_unlock(&elm->lock);
83743da2f07SMax Staudt 
83843da2f07SMax Staudt 	dev->stats.tx_packets++;
83943da2f07SMax Staudt 	dev->stats.tx_bytes += frame->can_id & CAN_RTR_FLAG ? 0 : frame->len;
84043da2f07SMax Staudt 
841303066fcSVincent Mailhol 	skb_tx_timestamp(skb);
842303066fcSVincent Mailhol 
84343da2f07SMax Staudt out:
84443da2f07SMax Staudt 	kfree_skb(skb);
84543da2f07SMax Staudt 	return NETDEV_TX_OK;
84643da2f07SMax Staudt }
84743da2f07SMax Staudt 
84843da2f07SMax Staudt static const struct net_device_ops can327_netdev_ops = {
84943da2f07SMax Staudt 	.ndo_open = can327_netdev_open,
85043da2f07SMax Staudt 	.ndo_stop = can327_netdev_close,
85143da2f07SMax Staudt 	.ndo_start_xmit = can327_netdev_start_xmit,
85243da2f07SMax Staudt 	.ndo_change_mtu = can_change_mtu,
85343da2f07SMax Staudt };
85443da2f07SMax Staudt 
855409c188cSVincent Mailhol static const struct ethtool_ops can327_ethtool_ops = {
856409c188cSVincent Mailhol 	.get_ts_info = ethtool_op_get_ts_info,
857409c188cSVincent Mailhol };
858409c188cSVincent Mailhol 
can327_is_valid_rx_char(u8 c)85943da2f07SMax Staudt static bool can327_is_valid_rx_char(u8 c)
86043da2f07SMax Staudt {
86143da2f07SMax Staudt 	static const bool lut_char_is_valid['z'] = {
86243da2f07SMax Staudt 		['\r'] = true,
86343da2f07SMax Staudt 		[' '] = true,
86443da2f07SMax Staudt 		['.'] = true,
86543da2f07SMax Staudt 		['0'] = true, true, true, true, true,
86643da2f07SMax Staudt 		['5'] = true, true, true, true, true,
86743da2f07SMax Staudt 		['<'] = true,
86843da2f07SMax Staudt 		[CAN327_READY_CHAR] = true,
86943da2f07SMax Staudt 		['?'] = true,
87043da2f07SMax Staudt 		['A'] = true, true, true, true, true, true, true,
87143da2f07SMax Staudt 		['H'] = true, true, true, true, true, true, true,
87243da2f07SMax Staudt 		['O'] = true, true, true, true, true, true, true,
87343da2f07SMax Staudt 		['V'] = true, true, true, true, true,
87443da2f07SMax Staudt 		['a'] = true,
87543da2f07SMax Staudt 		['b'] = true,
87643da2f07SMax Staudt 		['v'] = true,
87743da2f07SMax Staudt 		[CAN327_DUMMY_CHAR] = true,
87843da2f07SMax Staudt 	};
87943da2f07SMax Staudt 	BUILD_BUG_ON(CAN327_DUMMY_CHAR >= 'z');
88043da2f07SMax Staudt 
88143da2f07SMax Staudt 	return (c < ARRAY_SIZE(lut_char_is_valid) && lut_char_is_valid[c]);
88243da2f07SMax Staudt }
88343da2f07SMax Staudt 
88443da2f07SMax Staudt /* Handle incoming ELM327 ASCII data.
88543da2f07SMax Staudt  * This will not be re-entered while running, but other ldisc
88643da2f07SMax Staudt  * functions may be called in parallel.
88743da2f07SMax Staudt  */
can327_ldisc_rx(struct tty_struct * tty,const u8 * cp,const u8 * fp,size_t count)888a8d9cd23SJiri Slaby (SUSE) static void can327_ldisc_rx(struct tty_struct *tty, const u8 *cp,
889*892bc209SJiri Slaby (SUSE) 			    const u8 *fp, size_t count)
89043da2f07SMax Staudt {
891a35f3899SJiri Slaby 	struct can327 *elm = tty->disc_data;
89243da2f07SMax Staudt 	size_t first_new_char_idx;
89343da2f07SMax Staudt 
89443da2f07SMax Staudt 	if (elm->uart_side_failure)
89543da2f07SMax Staudt 		return;
89643da2f07SMax Staudt 
89743da2f07SMax Staudt 	spin_lock_bh(&elm->lock);
89843da2f07SMax Staudt 
89943da2f07SMax Staudt 	/* Store old rxfill, so can327_parse_rxbuf() will have
90043da2f07SMax Staudt 	 * the option of skipping already checked characters.
90143da2f07SMax Staudt 	 */
90243da2f07SMax Staudt 	first_new_char_idx = elm->rxfill;
90343da2f07SMax Staudt 
90473048bd5SJiri Slaby (SUSE) 	while (count--) {
90573048bd5SJiri Slaby (SUSE) 		if (elm->rxfill >= CAN327_SIZE_RXBUF) {
90673048bd5SJiri Slaby (SUSE) 			netdev_err(elm->dev,
907e8161447SJiri Slaby (SUSE) 				   "Receive buffer overflowed. Bad chip or wiring? count = %zu",
90873048bd5SJiri Slaby (SUSE) 				   count);
90973048bd5SJiri Slaby (SUSE) 			goto uart_failure;
91073048bd5SJiri Slaby (SUSE) 		}
91143da2f07SMax Staudt 		if (fp && *fp++) {
91243da2f07SMax Staudt 			netdev_err(elm->dev,
91343da2f07SMax Staudt 				   "Error in received character stream. Check your wiring.");
91494b580e3SJiri Slaby (SUSE) 			goto uart_failure;
91543da2f07SMax Staudt 		}
91643da2f07SMax Staudt 
91743da2f07SMax Staudt 		/* Ignore NUL characters, which the PIC microcontroller may
91843da2f07SMax Staudt 		 * inadvertently insert due to a known hardware bug.
91943da2f07SMax Staudt 		 * See ELM327 documentation, which refers to a Microchip PIC
92043da2f07SMax Staudt 		 * bug description.
92143da2f07SMax Staudt 		 */
92243da2f07SMax Staudt 		if (*cp) {
92343da2f07SMax Staudt 			/* Check for stray characters on the UART line.
92443da2f07SMax Staudt 			 * Likely caused by bad hardware.
92543da2f07SMax Staudt 			 */
92643da2f07SMax Staudt 			if (!can327_is_valid_rx_char(*cp)) {
92743da2f07SMax Staudt 				netdev_err(elm->dev,
92843da2f07SMax Staudt 					   "Received illegal character %02x.\n",
92943da2f07SMax Staudt 					   *cp);
93094b580e3SJiri Slaby (SUSE) 				goto uart_failure;
93143da2f07SMax Staudt 			}
93243da2f07SMax Staudt 
93343da2f07SMax Staudt 			elm->rxbuf[elm->rxfill++] = *cp;
93443da2f07SMax Staudt 		}
93543da2f07SMax Staudt 
93643da2f07SMax Staudt 		cp++;
93743da2f07SMax Staudt 	}
93843da2f07SMax Staudt 
93943da2f07SMax Staudt 	can327_parse_rxbuf(elm, first_new_char_idx);
94043da2f07SMax Staudt 	spin_unlock_bh(&elm->lock);
94194b580e3SJiri Slaby (SUSE) 
94294b580e3SJiri Slaby (SUSE) 	return;
94394b580e3SJiri Slaby (SUSE) uart_failure:
94494b580e3SJiri Slaby (SUSE) 	can327_uart_side_failure(elm);
94594b580e3SJiri Slaby (SUSE) 	spin_unlock_bh(&elm->lock);
94643da2f07SMax Staudt }
94743da2f07SMax Staudt 
94843da2f07SMax Staudt /* Write out remaining transmit buffer.
94943da2f07SMax Staudt  * Scheduled when TTY is writable.
95043da2f07SMax Staudt  */
can327_ldisc_tx_worker(struct work_struct * work)95143da2f07SMax Staudt static void can327_ldisc_tx_worker(struct work_struct *work)
95243da2f07SMax Staudt {
95343da2f07SMax Staudt 	struct can327 *elm = container_of(work, struct can327, tx_work);
95443da2f07SMax Staudt 	ssize_t written;
95543da2f07SMax Staudt 
95643da2f07SMax Staudt 	if (elm->uart_side_failure)
95743da2f07SMax Staudt 		return;
95843da2f07SMax Staudt 
95943da2f07SMax Staudt 	spin_lock_bh(&elm->lock);
96043da2f07SMax Staudt 
96143da2f07SMax Staudt 	if (elm->txleft) {
96243da2f07SMax Staudt 		written = elm->tty->ops->write(elm->tty, elm->txhead,
96343da2f07SMax Staudt 					       elm->txleft);
96443da2f07SMax Staudt 		if (written < 0) {
96543da2f07SMax Staudt 			netdev_err(elm->dev, "Failed to write to tty %s.\n",
96643da2f07SMax Staudt 				   elm->tty->name);
96743da2f07SMax Staudt 			can327_uart_side_failure(elm);
96843da2f07SMax Staudt 
96943da2f07SMax Staudt 			spin_unlock_bh(&elm->lock);
97043da2f07SMax Staudt 			return;
97143da2f07SMax Staudt 		}
97243da2f07SMax Staudt 
97343da2f07SMax Staudt 		elm->txleft -= written;
97443da2f07SMax Staudt 		elm->txhead += written;
97543da2f07SMax Staudt 	}
97643da2f07SMax Staudt 
97743da2f07SMax Staudt 	if (!elm->txleft)
97843da2f07SMax Staudt 		clear_bit(TTY_DO_WRITE_WAKEUP, &elm->tty->flags);
97943da2f07SMax Staudt 
98043da2f07SMax Staudt 	spin_unlock_bh(&elm->lock);
98143da2f07SMax Staudt }
98243da2f07SMax Staudt 
98343da2f07SMax Staudt /* Called by the driver when there's room for more data. */
can327_ldisc_tx_wakeup(struct tty_struct * tty)98443da2f07SMax Staudt static void can327_ldisc_tx_wakeup(struct tty_struct *tty)
98543da2f07SMax Staudt {
986a35f3899SJiri Slaby 	struct can327 *elm = tty->disc_data;
98743da2f07SMax Staudt 
98843da2f07SMax Staudt 	schedule_work(&elm->tx_work);
98943da2f07SMax Staudt }
99043da2f07SMax Staudt 
99143da2f07SMax Staudt /* ELM327 can only handle bitrates that are integer divisors of 500 kHz,
99243da2f07SMax Staudt  * or 7/8 of that. Divisors are 1 to 64.
99343da2f07SMax Staudt  * Currently we don't implement support for 7/8 rates.
99443da2f07SMax Staudt  */
99543da2f07SMax Staudt static const u32 can327_bitrate_const[] = {
99643da2f07SMax Staudt 	7812,  7936,  8064,  8196,   8333,   8474,   8620,   8771,
99743da2f07SMax Staudt 	8928,  9090,  9259,  9433,   9615,   9803,   10000,  10204,
99843da2f07SMax Staudt 	10416, 10638, 10869, 11111,  11363,  11627,  11904,  12195,
99943da2f07SMax Staudt 	12500, 12820, 13157, 13513,  13888,  14285,  14705,  15151,
100043da2f07SMax Staudt 	15625, 16129, 16666, 17241,  17857,  18518,  19230,  20000,
100143da2f07SMax Staudt 	20833, 21739, 22727, 23809,  25000,  26315,  27777,  29411,
100243da2f07SMax Staudt 	31250, 33333, 35714, 38461,  41666,  45454,  50000,  55555,
100343da2f07SMax Staudt 	62500, 71428, 83333, 100000, 125000, 166666, 250000, 500000
100443da2f07SMax Staudt };
100543da2f07SMax Staudt 
can327_ldisc_open(struct tty_struct * tty)100643da2f07SMax Staudt static int can327_ldisc_open(struct tty_struct *tty)
100743da2f07SMax Staudt {
100843da2f07SMax Staudt 	struct net_device *dev;
100943da2f07SMax Staudt 	struct can327 *elm;
101043da2f07SMax Staudt 	int err;
101143da2f07SMax Staudt 
101243da2f07SMax Staudt 	if (!capable(CAP_NET_ADMIN))
101343da2f07SMax Staudt 		return -EPERM;
101443da2f07SMax Staudt 
101543da2f07SMax Staudt 	if (!tty->ops->write)
101643da2f07SMax Staudt 		return -EOPNOTSUPP;
101743da2f07SMax Staudt 
101843da2f07SMax Staudt 	dev = alloc_candev(sizeof(struct can327), 0);
101943da2f07SMax Staudt 	if (!dev)
102043da2f07SMax Staudt 		return -ENFILE;
102143da2f07SMax Staudt 	elm = netdev_priv(dev);
102243da2f07SMax Staudt 
102343da2f07SMax Staudt 	/* Configure TTY interface */
102443da2f07SMax Staudt 	tty->receive_room = 65536; /* We don't flow control */
102543da2f07SMax Staudt 	spin_lock_init(&elm->lock);
102643da2f07SMax Staudt 	INIT_WORK(&elm->tx_work, can327_ldisc_tx_worker);
102743da2f07SMax Staudt 
102843da2f07SMax Staudt 	/* Configure CAN metadata */
102943da2f07SMax Staudt 	elm->can.bitrate_const = can327_bitrate_const;
103043da2f07SMax Staudt 	elm->can.bitrate_const_cnt = ARRAY_SIZE(can327_bitrate_const);
103143da2f07SMax Staudt 	elm->can.ctrlmode_supported = CAN_CTRLMODE_LISTENONLY;
103243da2f07SMax Staudt 
103343da2f07SMax Staudt 	/* Configure netdev interface */
103443da2f07SMax Staudt 	elm->dev = dev;
103543da2f07SMax Staudt 	dev->netdev_ops = &can327_netdev_ops;
1036409c188cSVincent Mailhol 	dev->ethtool_ops = &can327_ethtool_ops;
103743da2f07SMax Staudt 
103843da2f07SMax Staudt 	/* Mark ldisc channel as alive */
103943da2f07SMax Staudt 	elm->tty = tty;
104043da2f07SMax Staudt 	tty->disc_data = elm;
104143da2f07SMax Staudt 
104243da2f07SMax Staudt 	/* Let 'er rip */
104343da2f07SMax Staudt 	err = register_candev(elm->dev);
104443da2f07SMax Staudt 	if (err) {
104543da2f07SMax Staudt 		free_candev(elm->dev);
104643da2f07SMax Staudt 		return err;
104743da2f07SMax Staudt 	}
104843da2f07SMax Staudt 
104943da2f07SMax Staudt 	netdev_info(elm->dev, "can327 on %s.\n", tty->name);
105043da2f07SMax Staudt 
105143da2f07SMax Staudt 	return 0;
105243da2f07SMax Staudt }
105343da2f07SMax Staudt 
105443da2f07SMax Staudt /* Close down a can327 channel.
105543da2f07SMax Staudt  * This means flushing out any pending queues, and then returning.
105643da2f07SMax Staudt  * This call is serialized against other ldisc functions:
105743da2f07SMax Staudt  * Once this is called, no other ldisc function of ours is entered.
105843da2f07SMax Staudt  *
105943da2f07SMax Staudt  * We also use this function for a hangup event.
106043da2f07SMax Staudt  */
can327_ldisc_close(struct tty_struct * tty)106143da2f07SMax Staudt static void can327_ldisc_close(struct tty_struct *tty)
106243da2f07SMax Staudt {
1063a35f3899SJiri Slaby 	struct can327 *elm = tty->disc_data;
106443da2f07SMax Staudt 
1065f4a4d121SMax Staudt 	/* unregister_netdev() calls .ndo_stop() so we don't have to. */
106643da2f07SMax Staudt 	unregister_candev(elm->dev);
106743da2f07SMax Staudt 
1068f4a4d121SMax Staudt 	/* Give UART one final chance to flush.
1069f4a4d121SMax Staudt 	 * No need to clear TTY_DO_WRITE_WAKEUP since .write_wakeup() is
1070f4a4d121SMax Staudt 	 * serialised against .close() and will not be called once we return.
1071f4a4d121SMax Staudt 	 */
1072f4a4d121SMax Staudt 	flush_work(&elm->tx_work);
1073f4a4d121SMax Staudt 
107443da2f07SMax Staudt 	/* Mark channel as dead */
107543da2f07SMax Staudt 	spin_lock_bh(&elm->lock);
107643da2f07SMax Staudt 	tty->disc_data = NULL;
107743da2f07SMax Staudt 	elm->tty = NULL;
107843da2f07SMax Staudt 	spin_unlock_bh(&elm->lock);
107943da2f07SMax Staudt 
108043da2f07SMax Staudt 	netdev_info(elm->dev, "can327 off %s.\n", tty->name);
108143da2f07SMax Staudt 
108243da2f07SMax Staudt 	free_candev(elm->dev);
108343da2f07SMax Staudt }
108443da2f07SMax Staudt 
can327_ldisc_ioctl(struct tty_struct * tty,unsigned int cmd,unsigned long arg)108543da2f07SMax Staudt static int can327_ldisc_ioctl(struct tty_struct *tty, unsigned int cmd,
108643da2f07SMax Staudt 			      unsigned long arg)
108743da2f07SMax Staudt {
1088a35f3899SJiri Slaby 	struct can327 *elm = tty->disc_data;
108943da2f07SMax Staudt 	unsigned int tmp;
109043da2f07SMax Staudt 
109143da2f07SMax Staudt 	switch (cmd) {
109243da2f07SMax Staudt 	case SIOCGIFNAME:
109343da2f07SMax Staudt 		tmp = strnlen(elm->dev->name, IFNAMSIZ - 1) + 1;
109443da2f07SMax Staudt 		if (copy_to_user((void __user *)arg, elm->dev->name, tmp))
109543da2f07SMax Staudt 			return -EFAULT;
109643da2f07SMax Staudt 		return 0;
109743da2f07SMax Staudt 
109843da2f07SMax Staudt 	case SIOCSIFHWADDR:
109943da2f07SMax Staudt 		return -EINVAL;
110043da2f07SMax Staudt 
110143da2f07SMax Staudt 	default:
110243da2f07SMax Staudt 		return tty_mode_ioctl(tty, cmd, arg);
110343da2f07SMax Staudt 	}
110443da2f07SMax Staudt }
110543da2f07SMax Staudt 
110643da2f07SMax Staudt static struct tty_ldisc_ops can327_ldisc = {
110743da2f07SMax Staudt 	.owner = THIS_MODULE,
110863fe8567SVincent Mailhol 	.name = KBUILD_MODNAME,
110943da2f07SMax Staudt 	.num = N_CAN327,
111043da2f07SMax Staudt 	.receive_buf = can327_ldisc_rx,
111143da2f07SMax Staudt 	.write_wakeup = can327_ldisc_tx_wakeup,
111243da2f07SMax Staudt 	.open = can327_ldisc_open,
111343da2f07SMax Staudt 	.close = can327_ldisc_close,
111443da2f07SMax Staudt 	.ioctl = can327_ldisc_ioctl,
111543da2f07SMax Staudt };
111643da2f07SMax Staudt 
can327_init(void)111743da2f07SMax Staudt static int __init can327_init(void)
111843da2f07SMax Staudt {
111943da2f07SMax Staudt 	int status;
112043da2f07SMax Staudt 
112143da2f07SMax Staudt 	status = tty_register_ldisc(&can327_ldisc);
112243da2f07SMax Staudt 	if (status)
112343da2f07SMax Staudt 		pr_err("Can't register line discipline\n");
112443da2f07SMax Staudt 
112543da2f07SMax Staudt 	return status;
112643da2f07SMax Staudt }
112743da2f07SMax Staudt 
can327_exit(void)112843da2f07SMax Staudt static void __exit can327_exit(void)
112943da2f07SMax Staudt {
113043da2f07SMax Staudt 	/* This will only be called when all channels have been closed by
113143da2f07SMax Staudt 	 * userspace - tty_ldisc.c takes care of the module's refcount.
113243da2f07SMax Staudt 	 */
113343da2f07SMax Staudt 	tty_unregister_ldisc(&can327_ldisc);
113443da2f07SMax Staudt }
113543da2f07SMax Staudt 
113643da2f07SMax Staudt module_init(can327_init);
113743da2f07SMax Staudt module_exit(can327_exit);
113843da2f07SMax Staudt 
113943da2f07SMax Staudt MODULE_ALIAS_LDISC(N_CAN327);
114043da2f07SMax Staudt MODULE_DESCRIPTION("ELM327 based CAN interface");
114143da2f07SMax Staudt MODULE_LICENSE("GPL");
114243da2f07SMax Staudt MODULE_AUTHOR("Max Staudt <max@enpas.org>");
1143