cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

digi_acceleport.c (43350B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3*  Digi AccelePort USB-4 and USB-2 Serial Converters
      4*
      5*  Copyright 2000 by Digi International
      6*
      7*  Shamelessly based on Brian Warner's keyspan_pda.c and Greg Kroah-Hartman's
      8*  usb-serial driver.
      9*
     10*  Peter Berger (pberger@brimson.com)
     11*  Al Borchers (borchers@steinerpoint.com)
     12*/
     13
     14#include <linux/kernel.h>
     15#include <linux/errno.h>
     16#include <linux/slab.h>
     17#include <linux/tty.h>
     18#include <linux/tty_driver.h>
     19#include <linux/tty_flip.h>
     20#include <linux/module.h>
     21#include <linux/spinlock.h>
     22#include <linux/uaccess.h>
     23#include <linux/usb.h>
     24#include <linux/wait.h>
     25#include <linux/sched/signal.h>
     26#include <linux/usb/serial.h>
     27
     28/* Defines */
     29
     30#define DRIVER_AUTHOR "Peter Berger <pberger@brimson.com>, Al Borchers <borchers@steinerpoint.com>"
     31#define DRIVER_DESC "Digi AccelePort USB-2/USB-4 Serial Converter driver"
     32
     33/* port output buffer length -- must be <= transfer buffer length - 2 */
     34/* so we can be sure to send the full buffer in one urb */
     35#define DIGI_OUT_BUF_SIZE		8
     36
     37/* port input buffer length -- must be >= transfer buffer length - 3 */
     38/* so we can be sure to hold at least one full buffer from one urb */
     39#define DIGI_IN_BUF_SIZE		64
     40
     41/* retry timeout while sleeping */
     42#define DIGI_RETRY_TIMEOUT		(HZ/10)
     43
     44/* timeout while waiting for tty output to drain in close */
     45/* this delay is used twice in close, so the total delay could */
     46/* be twice this value */
     47#define DIGI_CLOSE_TIMEOUT		(5*HZ)
     48
     49
     50/* AccelePort USB Defines */
     51
     52/* ids */
     53#define DIGI_VENDOR_ID			0x05c5
     54#define DIGI_2_ID			0x0002	/* USB-2 */
     55#define DIGI_4_ID			0x0004	/* USB-4 */
     56
     57/* commands
     58 * "INB": can be used on the in-band endpoint
     59 * "OOB": can be used on the out-of-band endpoint
     60 */
     61#define DIGI_CMD_SET_BAUD_RATE			0	/* INB, OOB */
     62#define DIGI_CMD_SET_WORD_SIZE			1	/* INB, OOB */
     63#define DIGI_CMD_SET_PARITY			2	/* INB, OOB */
     64#define DIGI_CMD_SET_STOP_BITS			3	/* INB, OOB */
     65#define DIGI_CMD_SET_INPUT_FLOW_CONTROL		4	/* INB, OOB */
     66#define DIGI_CMD_SET_OUTPUT_FLOW_CONTROL	5	/* INB, OOB */
     67#define DIGI_CMD_SET_DTR_SIGNAL			6	/* INB, OOB */
     68#define DIGI_CMD_SET_RTS_SIGNAL			7	/* INB, OOB */
     69#define DIGI_CMD_READ_INPUT_SIGNALS		8	/*      OOB */
     70#define DIGI_CMD_IFLUSH_FIFO			9	/*      OOB */
     71#define DIGI_CMD_RECEIVE_ENABLE			10	/* INB, OOB */
     72#define DIGI_CMD_BREAK_CONTROL			11	/* INB, OOB */
     73#define DIGI_CMD_LOCAL_LOOPBACK			12	/* INB, OOB */
     74#define DIGI_CMD_TRANSMIT_IDLE			13	/* INB, OOB */
     75#define DIGI_CMD_READ_UART_REGISTER		14	/*      OOB */
     76#define DIGI_CMD_WRITE_UART_REGISTER		15	/* INB, OOB */
     77#define DIGI_CMD_AND_UART_REGISTER		16	/* INB, OOB */
     78#define DIGI_CMD_OR_UART_REGISTER		17	/* INB, OOB */
     79#define DIGI_CMD_SEND_DATA			18	/* INB      */
     80#define DIGI_CMD_RECEIVE_DATA			19	/* INB      */
     81#define DIGI_CMD_RECEIVE_DISABLE		20	/* INB      */
     82#define DIGI_CMD_GET_PORT_TYPE			21	/*      OOB */
     83
     84/* baud rates */
     85#define DIGI_BAUD_50				0
     86#define DIGI_BAUD_75				1
     87#define DIGI_BAUD_110				2
     88#define DIGI_BAUD_150				3
     89#define DIGI_BAUD_200				4
     90#define DIGI_BAUD_300				5
     91#define DIGI_BAUD_600				6
     92#define DIGI_BAUD_1200				7
     93#define DIGI_BAUD_1800				8
     94#define DIGI_BAUD_2400				9
     95#define DIGI_BAUD_4800				10
     96#define DIGI_BAUD_7200				11
     97#define DIGI_BAUD_9600				12
     98#define DIGI_BAUD_14400				13
     99#define DIGI_BAUD_19200				14
    100#define DIGI_BAUD_28800				15
    101#define DIGI_BAUD_38400				16
    102#define DIGI_BAUD_57600				17
    103#define DIGI_BAUD_76800				18
    104#define DIGI_BAUD_115200			19
    105#define DIGI_BAUD_153600			20
    106#define DIGI_BAUD_230400			21
    107#define DIGI_BAUD_460800			22
    108
    109/* arguments */
    110#define DIGI_WORD_SIZE_5			0
    111#define DIGI_WORD_SIZE_6			1
    112#define DIGI_WORD_SIZE_7			2
    113#define DIGI_WORD_SIZE_8			3
    114
    115#define DIGI_PARITY_NONE			0
    116#define DIGI_PARITY_ODD				1
    117#define DIGI_PARITY_EVEN			2
    118#define DIGI_PARITY_MARK			3
    119#define DIGI_PARITY_SPACE			4
    120
    121#define DIGI_STOP_BITS_1			0
    122#define DIGI_STOP_BITS_2			1
    123
    124#define DIGI_INPUT_FLOW_CONTROL_XON_XOFF	1
    125#define DIGI_INPUT_FLOW_CONTROL_RTS		2
    126#define DIGI_INPUT_FLOW_CONTROL_DTR		4
    127
    128#define DIGI_OUTPUT_FLOW_CONTROL_XON_XOFF	1
    129#define DIGI_OUTPUT_FLOW_CONTROL_CTS		2
    130#define DIGI_OUTPUT_FLOW_CONTROL_DSR		4
    131
    132#define DIGI_DTR_INACTIVE			0
    133#define DIGI_DTR_ACTIVE				1
    134#define DIGI_DTR_INPUT_FLOW_CONTROL		2
    135
    136#define DIGI_RTS_INACTIVE			0
    137#define DIGI_RTS_ACTIVE				1
    138#define DIGI_RTS_INPUT_FLOW_CONTROL		2
    139#define DIGI_RTS_TOGGLE				3
    140
    141#define DIGI_FLUSH_TX				1
    142#define DIGI_FLUSH_RX				2
    143#define DIGI_RESUME_TX				4 /* clears xoff condition */
    144
    145#define DIGI_TRANSMIT_NOT_IDLE			0
    146#define DIGI_TRANSMIT_IDLE			1
    147
    148#define DIGI_DISABLE				0
    149#define DIGI_ENABLE				1
    150
    151#define DIGI_DEASSERT				0
    152#define DIGI_ASSERT				1
    153
    154/* in band status codes */
    155#define DIGI_OVERRUN_ERROR			4
    156#define DIGI_PARITY_ERROR			8
    157#define DIGI_FRAMING_ERROR			16
    158#define DIGI_BREAK_ERROR			32
    159
    160/* out of band status */
    161#define DIGI_NO_ERROR				0
    162#define DIGI_BAD_FIRST_PARAMETER		1
    163#define DIGI_BAD_SECOND_PARAMETER		2
    164#define DIGI_INVALID_LINE			3
    165#define DIGI_INVALID_OPCODE			4
    166
    167/* input signals */
    168#define DIGI_READ_INPUT_SIGNALS_SLOT		1
    169#define DIGI_READ_INPUT_SIGNALS_ERR		2
    170#define DIGI_READ_INPUT_SIGNALS_BUSY		4
    171#define DIGI_READ_INPUT_SIGNALS_PE		8
    172#define DIGI_READ_INPUT_SIGNALS_CTS		16
    173#define DIGI_READ_INPUT_SIGNALS_DSR		32
    174#define DIGI_READ_INPUT_SIGNALS_RI		64
    175#define DIGI_READ_INPUT_SIGNALS_DCD		128
    176
    177
    178/* Structures */
    179
    180struct digi_serial {
    181	spinlock_t ds_serial_lock;
    182	struct usb_serial_port *ds_oob_port;	/* out-of-band port */
    183	int ds_oob_port_num;			/* index of out-of-band port */
    184	int ds_device_started;
    185};
    186
    187struct digi_port {
    188	spinlock_t dp_port_lock;
    189	int dp_port_num;
    190	int dp_out_buf_len;
    191	unsigned char dp_out_buf[DIGI_OUT_BUF_SIZE];
    192	int dp_write_urb_in_use;
    193	unsigned int dp_modem_signals;
    194	int dp_transmit_idle;
    195	wait_queue_head_t dp_transmit_idle_wait;
    196	int dp_throttled;
    197	int dp_throttle_restart;
    198	wait_queue_head_t dp_flush_wait;
    199	wait_queue_head_t dp_close_wait;	/* wait queue for close */
    200	wait_queue_head_t write_wait;
    201	struct usb_serial_port *dp_port;
    202};
    203
    204
    205/* Local Function Declarations */
    206
    207static int digi_write_oob_command(struct usb_serial_port *port,
    208	unsigned char *buf, int count, int interruptible);
    209static int digi_write_inb_command(struct usb_serial_port *port,
    210	unsigned char *buf, int count, unsigned long timeout);
    211static int digi_set_modem_signals(struct usb_serial_port *port,
    212	unsigned int modem_signals, int interruptible);
    213static int digi_transmit_idle(struct usb_serial_port *port,
    214	unsigned long timeout);
    215static void digi_rx_throttle(struct tty_struct *tty);
    216static void digi_rx_unthrottle(struct tty_struct *tty);
    217static void digi_set_termios(struct tty_struct *tty,
    218		struct usb_serial_port *port, struct ktermios *old_termios);
    219static void digi_break_ctl(struct tty_struct *tty, int break_state);
    220static int digi_tiocmget(struct tty_struct *tty);
    221static int digi_tiocmset(struct tty_struct *tty, unsigned int set,
    222		unsigned int clear);
    223static int digi_write(struct tty_struct *tty, struct usb_serial_port *port,
    224		const unsigned char *buf, int count);
    225static void digi_write_bulk_callback(struct urb *urb);
    226static unsigned int digi_write_room(struct tty_struct *tty);
    227static unsigned int digi_chars_in_buffer(struct tty_struct *tty);
    228static int digi_open(struct tty_struct *tty, struct usb_serial_port *port);
    229static void digi_close(struct usb_serial_port *port);
    230static void digi_dtr_rts(struct usb_serial_port *port, int on);
    231static int digi_startup_device(struct usb_serial *serial);
    232static int digi_startup(struct usb_serial *serial);
    233static void digi_disconnect(struct usb_serial *serial);
    234static void digi_release(struct usb_serial *serial);
    235static int digi_port_probe(struct usb_serial_port *port);
    236static void digi_port_remove(struct usb_serial_port *port);
    237static void digi_read_bulk_callback(struct urb *urb);
    238static int digi_read_inb_callback(struct urb *urb);
    239static int digi_read_oob_callback(struct urb *urb);
    240
    241
    242static const struct usb_device_id id_table_combined[] = {
    243	{ USB_DEVICE(DIGI_VENDOR_ID, DIGI_2_ID) },
    244	{ USB_DEVICE(DIGI_VENDOR_ID, DIGI_4_ID) },
    245	{ }						/* Terminating entry */
    246};
    247
    248static const struct usb_device_id id_table_2[] = {
    249	{ USB_DEVICE(DIGI_VENDOR_ID, DIGI_2_ID) },
    250	{ }						/* Terminating entry */
    251};
    252
    253static const struct usb_device_id id_table_4[] = {
    254	{ USB_DEVICE(DIGI_VENDOR_ID, DIGI_4_ID) },
    255	{ }						/* Terminating entry */
    256};
    257
    258MODULE_DEVICE_TABLE(usb, id_table_combined);
    259
    260/* device info needed for the Digi serial converter */
    261
    262static struct usb_serial_driver digi_acceleport_2_device = {
    263	.driver = {
    264		.owner =		THIS_MODULE,
    265		.name =			"digi_2",
    266	},
    267	.description =			"Digi 2 port USB adapter",
    268	.id_table =			id_table_2,
    269	.num_ports =			3,
    270	.num_bulk_in =			4,
    271	.num_bulk_out =			4,
    272	.open =				digi_open,
    273	.close =			digi_close,
    274	.dtr_rts =			digi_dtr_rts,
    275	.write =			digi_write,
    276	.write_room =			digi_write_room,
    277	.write_bulk_callback = 		digi_write_bulk_callback,
    278	.read_bulk_callback =		digi_read_bulk_callback,
    279	.chars_in_buffer =		digi_chars_in_buffer,
    280	.throttle =			digi_rx_throttle,
    281	.unthrottle =			digi_rx_unthrottle,
    282	.set_termios =			digi_set_termios,
    283	.break_ctl =			digi_break_ctl,
    284	.tiocmget =			digi_tiocmget,
    285	.tiocmset =			digi_tiocmset,
    286	.attach =			digi_startup,
    287	.disconnect =			digi_disconnect,
    288	.release =			digi_release,
    289	.port_probe =			digi_port_probe,
    290	.port_remove =			digi_port_remove,
    291};
    292
    293static struct usb_serial_driver digi_acceleport_4_device = {
    294	.driver = {
    295		.owner =		THIS_MODULE,
    296		.name =			"digi_4",
    297	},
    298	.description =			"Digi 4 port USB adapter",
    299	.id_table =			id_table_4,
    300	.num_ports =			4,
    301	.num_bulk_in =			5,
    302	.num_bulk_out =			5,
    303	.open =				digi_open,
    304	.close =			digi_close,
    305	.write =			digi_write,
    306	.write_room =			digi_write_room,
    307	.write_bulk_callback = 		digi_write_bulk_callback,
    308	.read_bulk_callback =		digi_read_bulk_callback,
    309	.chars_in_buffer =		digi_chars_in_buffer,
    310	.throttle =			digi_rx_throttle,
    311	.unthrottle =			digi_rx_unthrottle,
    312	.set_termios =			digi_set_termios,
    313	.break_ctl =			digi_break_ctl,
    314	.tiocmget =			digi_tiocmget,
    315	.tiocmset =			digi_tiocmset,
    316	.attach =			digi_startup,
    317	.disconnect =			digi_disconnect,
    318	.release =			digi_release,
    319	.port_probe =			digi_port_probe,
    320	.port_remove =			digi_port_remove,
    321};
    322
    323static struct usb_serial_driver * const serial_drivers[] = {
    324	&digi_acceleport_2_device, &digi_acceleport_4_device, NULL
    325};
    326
    327/* Functions */
    328
    329/*
    330 *  Cond Wait Interruptible Timeout Irqrestore
    331 *
    332 *  Do spin_unlock_irqrestore and interruptible_sleep_on_timeout
    333 *  so that wake ups are not lost if they occur between the unlock
    334 *  and the sleep.  In other words, spin_unlock_irqrestore and
    335 *  interruptible_sleep_on_timeout are "atomic" with respect to
    336 *  wake ups.  This is used to implement condition variables.
    337 *
    338 *  interruptible_sleep_on_timeout is deprecated and has been replaced
    339 *  with the equivalent code.
    340 */
    341
    342static long cond_wait_interruptible_timeout_irqrestore(
    343	wait_queue_head_t *q, long timeout,
    344	spinlock_t *lock, unsigned long flags)
    345__releases(lock)
    346{
    347	DEFINE_WAIT(wait);
    348
    349	prepare_to_wait(q, &wait, TASK_INTERRUPTIBLE);
    350	spin_unlock_irqrestore(lock, flags);
    351	timeout = schedule_timeout(timeout);
    352	finish_wait(q, &wait);
    353
    354	return timeout;
    355}
    356
    357/*
    358 *  Digi Write OOB Command
    359 *
    360 *  Write commands on the out of band port.  Commands are 4
    361 *  bytes each, multiple commands can be sent at once, and
    362 *  no command will be split across USB packets.  Returns 0
    363 *  if successful, -EINTR if interrupted while sleeping and
    364 *  the interruptible flag is true, or a negative error
    365 *  returned by usb_submit_urb.
    366 */
    367
    368static int digi_write_oob_command(struct usb_serial_port *port,
    369	unsigned char *buf, int count, int interruptible)
    370{
    371	int ret = 0;
    372	int len;
    373	struct usb_serial_port *oob_port = (struct usb_serial_port *)((struct digi_serial *)(usb_get_serial_data(port->serial)))->ds_oob_port;
    374	struct digi_port *oob_priv = usb_get_serial_port_data(oob_port);
    375	unsigned long flags;
    376
    377	dev_dbg(&port->dev,
    378		"digi_write_oob_command: TOP: port=%d, count=%d\n",
    379		oob_priv->dp_port_num, count);
    380
    381	spin_lock_irqsave(&oob_priv->dp_port_lock, flags);
    382	while (count > 0) {
    383		while (oob_priv->dp_write_urb_in_use) {
    384			cond_wait_interruptible_timeout_irqrestore(
    385				&oob_priv->write_wait, DIGI_RETRY_TIMEOUT,
    386				&oob_priv->dp_port_lock, flags);
    387			if (interruptible && signal_pending(current))
    388				return -EINTR;
    389			spin_lock_irqsave(&oob_priv->dp_port_lock, flags);
    390		}
    391
    392		/* len must be a multiple of 4, so commands are not split */
    393		len = min(count, oob_port->bulk_out_size);
    394		if (len > 4)
    395			len &= ~3;
    396		memcpy(oob_port->write_urb->transfer_buffer, buf, len);
    397		oob_port->write_urb->transfer_buffer_length = len;
    398		ret = usb_submit_urb(oob_port->write_urb, GFP_ATOMIC);
    399		if (ret == 0) {
    400			oob_priv->dp_write_urb_in_use = 1;
    401			count -= len;
    402			buf += len;
    403		}
    404	}
    405	spin_unlock_irqrestore(&oob_priv->dp_port_lock, flags);
    406	if (ret)
    407		dev_err(&port->dev, "%s: usb_submit_urb failed, ret=%d\n",
    408			__func__, ret);
    409	return ret;
    410
    411}
    412
    413
    414/*
    415 *  Digi Write In Band Command
    416 *
    417 *  Write commands on the given port.  Commands are 4
    418 *  bytes each, multiple commands can be sent at once, and
    419 *  no command will be split across USB packets.  If timeout
    420 *  is non-zero, write in band command will return after
    421 *  waiting unsuccessfully for the URB status to clear for
    422 *  timeout ticks.  Returns 0 if successful, or a negative
    423 *  error returned by digi_write.
    424 */
    425
    426static int digi_write_inb_command(struct usb_serial_port *port,
    427	unsigned char *buf, int count, unsigned long timeout)
    428{
    429	int ret = 0;
    430	int len;
    431	struct digi_port *priv = usb_get_serial_port_data(port);
    432	unsigned char *data = port->write_urb->transfer_buffer;
    433	unsigned long flags;
    434
    435	dev_dbg(&port->dev, "digi_write_inb_command: TOP: port=%d, count=%d\n",
    436		priv->dp_port_num, count);
    437
    438	if (timeout)
    439		timeout += jiffies;
    440	else
    441		timeout = ULONG_MAX;
    442
    443	spin_lock_irqsave(&priv->dp_port_lock, flags);
    444	while (count > 0 && ret == 0) {
    445		while (priv->dp_write_urb_in_use &&
    446		       time_before(jiffies, timeout)) {
    447			cond_wait_interruptible_timeout_irqrestore(
    448				&priv->write_wait, DIGI_RETRY_TIMEOUT,
    449				&priv->dp_port_lock, flags);
    450			if (signal_pending(current))
    451				return -EINTR;
    452			spin_lock_irqsave(&priv->dp_port_lock, flags);
    453		}
    454
    455		/* len must be a multiple of 4 and small enough to */
    456		/* guarantee the write will send buffered data first, */
    457		/* so commands are in order with data and not split */
    458		len = min(count, port->bulk_out_size-2-priv->dp_out_buf_len);
    459		if (len > 4)
    460			len &= ~3;
    461
    462		/* write any buffered data first */
    463		if (priv->dp_out_buf_len > 0) {
    464			data[0] = DIGI_CMD_SEND_DATA;
    465			data[1] = priv->dp_out_buf_len;
    466			memcpy(data + 2, priv->dp_out_buf,
    467				priv->dp_out_buf_len);
    468			memcpy(data + 2 + priv->dp_out_buf_len, buf, len);
    469			port->write_urb->transfer_buffer_length
    470				= priv->dp_out_buf_len + 2 + len;
    471		} else {
    472			memcpy(data, buf, len);
    473			port->write_urb->transfer_buffer_length = len;
    474		}
    475
    476		ret = usb_submit_urb(port->write_urb, GFP_ATOMIC);
    477		if (ret == 0) {
    478			priv->dp_write_urb_in_use = 1;
    479			priv->dp_out_buf_len = 0;
    480			count -= len;
    481			buf += len;
    482		}
    483
    484	}
    485	spin_unlock_irqrestore(&priv->dp_port_lock, flags);
    486
    487	if (ret)
    488		dev_err(&port->dev,
    489			"%s: usb_submit_urb failed, ret=%d, port=%d\n",
    490			__func__, ret, priv->dp_port_num);
    491	return ret;
    492}
    493
    494
    495/*
    496 *  Digi Set Modem Signals
    497 *
    498 *  Sets or clears DTR and RTS on the port, according to the
    499 *  modem_signals argument.  Use TIOCM_DTR and TIOCM_RTS flags
    500 *  for the modem_signals argument.  Returns 0 if successful,
    501 *  -EINTR if interrupted while sleeping, or a non-zero error
    502 *  returned by usb_submit_urb.
    503 */
    504
    505static int digi_set_modem_signals(struct usb_serial_port *port,
    506	unsigned int modem_signals, int interruptible)
    507{
    508
    509	int ret;
    510	struct digi_port *port_priv = usb_get_serial_port_data(port);
    511	struct usb_serial_port *oob_port = (struct usb_serial_port *) ((struct digi_serial *)(usb_get_serial_data(port->serial)))->ds_oob_port;
    512	struct digi_port *oob_priv = usb_get_serial_port_data(oob_port);
    513	unsigned char *data = oob_port->write_urb->transfer_buffer;
    514	unsigned long flags;
    515
    516	dev_dbg(&port->dev,
    517		"digi_set_modem_signals: TOP: port=%d, modem_signals=0x%x\n",
    518		port_priv->dp_port_num, modem_signals);
    519
    520	spin_lock_irqsave(&oob_priv->dp_port_lock, flags);
    521	spin_lock(&port_priv->dp_port_lock);
    522
    523	while (oob_priv->dp_write_urb_in_use) {
    524		spin_unlock(&port_priv->dp_port_lock);
    525		cond_wait_interruptible_timeout_irqrestore(
    526			&oob_priv->write_wait, DIGI_RETRY_TIMEOUT,
    527			&oob_priv->dp_port_lock, flags);
    528		if (interruptible && signal_pending(current))
    529			return -EINTR;
    530		spin_lock_irqsave(&oob_priv->dp_port_lock, flags);
    531		spin_lock(&port_priv->dp_port_lock);
    532	}
    533	data[0] = DIGI_CMD_SET_DTR_SIGNAL;
    534	data[1] = port_priv->dp_port_num;
    535	data[2] = (modem_signals & TIOCM_DTR) ?
    536					DIGI_DTR_ACTIVE : DIGI_DTR_INACTIVE;
    537	data[3] = 0;
    538	data[4] = DIGI_CMD_SET_RTS_SIGNAL;
    539	data[5] = port_priv->dp_port_num;
    540	data[6] = (modem_signals & TIOCM_RTS) ?
    541					DIGI_RTS_ACTIVE : DIGI_RTS_INACTIVE;
    542	data[7] = 0;
    543
    544	oob_port->write_urb->transfer_buffer_length = 8;
    545
    546	ret = usb_submit_urb(oob_port->write_urb, GFP_ATOMIC);
    547	if (ret == 0) {
    548		oob_priv->dp_write_urb_in_use = 1;
    549		port_priv->dp_modem_signals &= ~(TIOCM_DTR | TIOCM_RTS);
    550		port_priv->dp_modem_signals |=
    551				modem_signals & (TIOCM_DTR | TIOCM_RTS);
    552	}
    553	spin_unlock(&port_priv->dp_port_lock);
    554	spin_unlock_irqrestore(&oob_priv->dp_port_lock, flags);
    555	if (ret)
    556		dev_err(&port->dev, "%s: usb_submit_urb failed, ret=%d\n",
    557			__func__, ret);
    558	return ret;
    559}
    560
    561/*
    562 *  Digi Transmit Idle
    563 *
    564 *  Digi transmit idle waits, up to timeout ticks, for the transmitter
    565 *  to go idle.  It returns 0 if successful or a negative error.
    566 *
    567 *  There are race conditions here if more than one process is calling
    568 *  digi_transmit_idle on the same port at the same time.  However, this
    569 *  is only called from close, and only one process can be in close on a
    570 *  port at a time, so its ok.
    571 */
    572
    573static int digi_transmit_idle(struct usb_serial_port *port,
    574	unsigned long timeout)
    575{
    576	int ret;
    577	unsigned char buf[2];
    578	struct digi_port *priv = usb_get_serial_port_data(port);
    579	unsigned long flags;
    580
    581	spin_lock_irqsave(&priv->dp_port_lock, flags);
    582	priv->dp_transmit_idle = 0;
    583	spin_unlock_irqrestore(&priv->dp_port_lock, flags);
    584
    585	buf[0] = DIGI_CMD_TRANSMIT_IDLE;
    586	buf[1] = 0;
    587
    588	timeout += jiffies;
    589
    590	ret = digi_write_inb_command(port, buf, 2, timeout - jiffies);
    591	if (ret != 0)
    592		return ret;
    593
    594	spin_lock_irqsave(&priv->dp_port_lock, flags);
    595
    596	while (time_before(jiffies, timeout) && !priv->dp_transmit_idle) {
    597		cond_wait_interruptible_timeout_irqrestore(
    598			&priv->dp_transmit_idle_wait, DIGI_RETRY_TIMEOUT,
    599			&priv->dp_port_lock, flags);
    600		if (signal_pending(current))
    601			return -EINTR;
    602		spin_lock_irqsave(&priv->dp_port_lock, flags);
    603	}
    604	priv->dp_transmit_idle = 0;
    605	spin_unlock_irqrestore(&priv->dp_port_lock, flags);
    606	return 0;
    607
    608}
    609
    610
    611static void digi_rx_throttle(struct tty_struct *tty)
    612{
    613	unsigned long flags;
    614	struct usb_serial_port *port = tty->driver_data;
    615	struct digi_port *priv = usb_get_serial_port_data(port);
    616
    617	/* stop receiving characters by not resubmitting the read urb */
    618	spin_lock_irqsave(&priv->dp_port_lock, flags);
    619	priv->dp_throttled = 1;
    620	priv->dp_throttle_restart = 0;
    621	spin_unlock_irqrestore(&priv->dp_port_lock, flags);
    622}
    623
    624
    625static void digi_rx_unthrottle(struct tty_struct *tty)
    626{
    627	int ret = 0;
    628	unsigned long flags;
    629	struct usb_serial_port *port = tty->driver_data;
    630	struct digi_port *priv = usb_get_serial_port_data(port);
    631
    632	spin_lock_irqsave(&priv->dp_port_lock, flags);
    633
    634	/* restart read chain */
    635	if (priv->dp_throttle_restart)
    636		ret = usb_submit_urb(port->read_urb, GFP_ATOMIC);
    637
    638	/* turn throttle off */
    639	priv->dp_throttled = 0;
    640	priv->dp_throttle_restart = 0;
    641
    642	spin_unlock_irqrestore(&priv->dp_port_lock, flags);
    643
    644	if (ret)
    645		dev_err(&port->dev,
    646			"%s: usb_submit_urb failed, ret=%d, port=%d\n",
    647			__func__, ret, priv->dp_port_num);
    648}
    649
    650
    651static void digi_set_termios(struct tty_struct *tty,
    652		struct usb_serial_port *port, struct ktermios *old_termios)
    653{
    654	struct digi_port *priv = usb_get_serial_port_data(port);
    655	struct device *dev = &port->dev;
    656	unsigned int iflag = tty->termios.c_iflag;
    657	unsigned int cflag = tty->termios.c_cflag;
    658	unsigned int old_iflag = old_termios->c_iflag;
    659	unsigned int old_cflag = old_termios->c_cflag;
    660	unsigned char buf[32];
    661	unsigned int modem_signals;
    662	int arg, ret;
    663	int i = 0;
    664	speed_t baud;
    665
    666	dev_dbg(dev,
    667		"digi_set_termios: TOP: port=%d, iflag=0x%x, old_iflag=0x%x, cflag=0x%x, old_cflag=0x%x\n",
    668		priv->dp_port_num, iflag, old_iflag, cflag, old_cflag);
    669
    670	/* set baud rate */
    671	baud = tty_get_baud_rate(tty);
    672	if (baud != tty_termios_baud_rate(old_termios)) {
    673		arg = -1;
    674
    675		/* reassert DTR and (maybe) RTS on transition from B0 */
    676		if ((old_cflag & CBAUD) == B0) {
    677			/* don't set RTS if using hardware flow control */
    678			/* and throttling input */
    679			modem_signals = TIOCM_DTR;
    680			if (!C_CRTSCTS(tty) || !tty_throttled(tty))
    681				modem_signals |= TIOCM_RTS;
    682			digi_set_modem_signals(port, modem_signals, 1);
    683		}
    684		switch (baud) {
    685		/* drop DTR and RTS on transition to B0 */
    686		case 0: digi_set_modem_signals(port, 0, 1); break;
    687		case 50: arg = DIGI_BAUD_50; break;
    688		case 75: arg = DIGI_BAUD_75; break;
    689		case 110: arg = DIGI_BAUD_110; break;
    690		case 150: arg = DIGI_BAUD_150; break;
    691		case 200: arg = DIGI_BAUD_200; break;
    692		case 300: arg = DIGI_BAUD_300; break;
    693		case 600: arg = DIGI_BAUD_600; break;
    694		case 1200: arg = DIGI_BAUD_1200; break;
    695		case 1800: arg = DIGI_BAUD_1800; break;
    696		case 2400: arg = DIGI_BAUD_2400; break;
    697		case 4800: arg = DIGI_BAUD_4800; break;
    698		case 9600: arg = DIGI_BAUD_9600; break;
    699		case 19200: arg = DIGI_BAUD_19200; break;
    700		case 38400: arg = DIGI_BAUD_38400; break;
    701		case 57600: arg = DIGI_BAUD_57600; break;
    702		case 115200: arg = DIGI_BAUD_115200; break;
    703		case 230400: arg = DIGI_BAUD_230400; break;
    704		case 460800: arg = DIGI_BAUD_460800; break;
    705		default:
    706			arg = DIGI_BAUD_9600;
    707			baud = 9600;
    708			break;
    709		}
    710		if (arg != -1) {
    711			buf[i++] = DIGI_CMD_SET_BAUD_RATE;
    712			buf[i++] = priv->dp_port_num;
    713			buf[i++] = arg;
    714			buf[i++] = 0;
    715		}
    716	}
    717	/* set parity */
    718	tty->termios.c_cflag &= ~CMSPAR;
    719
    720	if ((cflag & (PARENB | PARODD)) != (old_cflag & (PARENB | PARODD))) {
    721		if (cflag & PARENB) {
    722			if (cflag & PARODD)
    723				arg = DIGI_PARITY_ODD;
    724			else
    725				arg = DIGI_PARITY_EVEN;
    726		} else {
    727			arg = DIGI_PARITY_NONE;
    728		}
    729		buf[i++] = DIGI_CMD_SET_PARITY;
    730		buf[i++] = priv->dp_port_num;
    731		buf[i++] = arg;
    732		buf[i++] = 0;
    733	}
    734	/* set word size */
    735	if ((cflag & CSIZE) != (old_cflag & CSIZE)) {
    736		arg = -1;
    737		switch (cflag & CSIZE) {
    738		case CS5: arg = DIGI_WORD_SIZE_5; break;
    739		case CS6: arg = DIGI_WORD_SIZE_6; break;
    740		case CS7: arg = DIGI_WORD_SIZE_7; break;
    741		case CS8: arg = DIGI_WORD_SIZE_8; break;
    742		default:
    743			dev_dbg(dev,
    744				"digi_set_termios: can't handle word size %d\n",
    745				cflag & CSIZE);
    746			break;
    747		}
    748
    749		if (arg != -1) {
    750			buf[i++] = DIGI_CMD_SET_WORD_SIZE;
    751			buf[i++] = priv->dp_port_num;
    752			buf[i++] = arg;
    753			buf[i++] = 0;
    754		}
    755
    756	}
    757
    758	/* set stop bits */
    759	if ((cflag & CSTOPB) != (old_cflag & CSTOPB)) {
    760
    761		if ((cflag & CSTOPB))
    762			arg = DIGI_STOP_BITS_2;
    763		else
    764			arg = DIGI_STOP_BITS_1;
    765
    766		buf[i++] = DIGI_CMD_SET_STOP_BITS;
    767		buf[i++] = priv->dp_port_num;
    768		buf[i++] = arg;
    769		buf[i++] = 0;
    770
    771	}
    772
    773	/* set input flow control */
    774	if ((iflag & IXOFF) != (old_iflag & IXOFF) ||
    775			(cflag & CRTSCTS) != (old_cflag & CRTSCTS)) {
    776		arg = 0;
    777		if (iflag & IXOFF)
    778			arg |= DIGI_INPUT_FLOW_CONTROL_XON_XOFF;
    779		else
    780			arg &= ~DIGI_INPUT_FLOW_CONTROL_XON_XOFF;
    781
    782		if (cflag & CRTSCTS) {
    783			arg |= DIGI_INPUT_FLOW_CONTROL_RTS;
    784
    785			/* On USB-4 it is necessary to assert RTS prior */
    786			/* to selecting RTS input flow control.  */
    787			buf[i++] = DIGI_CMD_SET_RTS_SIGNAL;
    788			buf[i++] = priv->dp_port_num;
    789			buf[i++] = DIGI_RTS_ACTIVE;
    790			buf[i++] = 0;
    791
    792		} else {
    793			arg &= ~DIGI_INPUT_FLOW_CONTROL_RTS;
    794		}
    795		buf[i++] = DIGI_CMD_SET_INPUT_FLOW_CONTROL;
    796		buf[i++] = priv->dp_port_num;
    797		buf[i++] = arg;
    798		buf[i++] = 0;
    799	}
    800
    801	/* set output flow control */
    802	if ((iflag & IXON) != (old_iflag & IXON) ||
    803			(cflag & CRTSCTS) != (old_cflag & CRTSCTS)) {
    804		arg = 0;
    805		if (iflag & IXON)
    806			arg |= DIGI_OUTPUT_FLOW_CONTROL_XON_XOFF;
    807		else
    808			arg &= ~DIGI_OUTPUT_FLOW_CONTROL_XON_XOFF;
    809
    810		if (cflag & CRTSCTS)
    811			arg |= DIGI_OUTPUT_FLOW_CONTROL_CTS;
    812		else
    813			arg &= ~DIGI_OUTPUT_FLOW_CONTROL_CTS;
    814
    815		buf[i++] = DIGI_CMD_SET_OUTPUT_FLOW_CONTROL;
    816		buf[i++] = priv->dp_port_num;
    817		buf[i++] = arg;
    818		buf[i++] = 0;
    819	}
    820
    821	/* set receive enable/disable */
    822	if ((cflag & CREAD) != (old_cflag & CREAD)) {
    823		if (cflag & CREAD)
    824			arg = DIGI_ENABLE;
    825		else
    826			arg = DIGI_DISABLE;
    827
    828		buf[i++] = DIGI_CMD_RECEIVE_ENABLE;
    829		buf[i++] = priv->dp_port_num;
    830		buf[i++] = arg;
    831		buf[i++] = 0;
    832	}
    833	ret = digi_write_oob_command(port, buf, i, 1);
    834	if (ret != 0)
    835		dev_dbg(dev, "digi_set_termios: write oob failed, ret=%d\n", ret);
    836	tty_encode_baud_rate(tty, baud, baud);
    837}
    838
    839
    840static void digi_break_ctl(struct tty_struct *tty, int break_state)
    841{
    842	struct usb_serial_port *port = tty->driver_data;
    843	unsigned char buf[4];
    844
    845	buf[0] = DIGI_CMD_BREAK_CONTROL;
    846	buf[1] = 2;				/* length */
    847	buf[2] = break_state ? 1 : 0;
    848	buf[3] = 0;				/* pad */
    849	digi_write_inb_command(port, buf, 4, 0);
    850}
    851
    852
    853static int digi_tiocmget(struct tty_struct *tty)
    854{
    855	struct usb_serial_port *port = tty->driver_data;
    856	struct digi_port *priv = usb_get_serial_port_data(port);
    857	unsigned int val;
    858	unsigned long flags;
    859
    860	spin_lock_irqsave(&priv->dp_port_lock, flags);
    861	val = priv->dp_modem_signals;
    862	spin_unlock_irqrestore(&priv->dp_port_lock, flags);
    863	return val;
    864}
    865
    866
    867static int digi_tiocmset(struct tty_struct *tty,
    868					unsigned int set, unsigned int clear)
    869{
    870	struct usb_serial_port *port = tty->driver_data;
    871	struct digi_port *priv = usb_get_serial_port_data(port);
    872	unsigned int val;
    873	unsigned long flags;
    874
    875	spin_lock_irqsave(&priv->dp_port_lock, flags);
    876	val = (priv->dp_modem_signals & ~clear) | set;
    877	spin_unlock_irqrestore(&priv->dp_port_lock, flags);
    878	return digi_set_modem_signals(port, val, 1);
    879}
    880
    881
    882static int digi_write(struct tty_struct *tty, struct usb_serial_port *port,
    883					const unsigned char *buf, int count)
    884{
    885
    886	int ret, data_len, new_len;
    887	struct digi_port *priv = usb_get_serial_port_data(port);
    888	unsigned char *data = port->write_urb->transfer_buffer;
    889	unsigned long flags;
    890
    891	dev_dbg(&port->dev, "digi_write: TOP: port=%d, count=%d\n",
    892		priv->dp_port_num, count);
    893
    894	/* copy user data (which can sleep) before getting spin lock */
    895	count = min(count, port->bulk_out_size-2);
    896	count = min(64, count);
    897
    898	/* be sure only one write proceeds at a time */
    899	/* there are races on the port private buffer */
    900	spin_lock_irqsave(&priv->dp_port_lock, flags);
    901
    902	/* wait for urb status clear to submit another urb */
    903	if (priv->dp_write_urb_in_use) {
    904		/* buffer data if count is 1 (probably put_char) if possible */
    905		if (count == 1 && priv->dp_out_buf_len < DIGI_OUT_BUF_SIZE) {
    906			priv->dp_out_buf[priv->dp_out_buf_len++] = *buf;
    907			new_len = 1;
    908		} else {
    909			new_len = 0;
    910		}
    911		spin_unlock_irqrestore(&priv->dp_port_lock, flags);
    912		return new_len;
    913	}
    914
    915	/* allow space for any buffered data and for new data, up to */
    916	/* transfer buffer size - 2 (for command and length bytes) */
    917	new_len = min(count, port->bulk_out_size-2-priv->dp_out_buf_len);
    918	data_len = new_len + priv->dp_out_buf_len;
    919
    920	if (data_len == 0) {
    921		spin_unlock_irqrestore(&priv->dp_port_lock, flags);
    922		return 0;
    923	}
    924
    925	port->write_urb->transfer_buffer_length = data_len+2;
    926
    927	*data++ = DIGI_CMD_SEND_DATA;
    928	*data++ = data_len;
    929
    930	/* copy in buffered data first */
    931	memcpy(data, priv->dp_out_buf, priv->dp_out_buf_len);
    932	data += priv->dp_out_buf_len;
    933
    934	/* copy in new data */
    935	memcpy(data, buf, new_len);
    936
    937	ret = usb_submit_urb(port->write_urb, GFP_ATOMIC);
    938	if (ret == 0) {
    939		priv->dp_write_urb_in_use = 1;
    940		ret = new_len;
    941		priv->dp_out_buf_len = 0;
    942	}
    943
    944	/* return length of new data written, or error */
    945	spin_unlock_irqrestore(&priv->dp_port_lock, flags);
    946	if (ret < 0)
    947		dev_err_console(port,
    948			"%s: usb_submit_urb failed, ret=%d, port=%d\n",
    949			__func__, ret, priv->dp_port_num);
    950	dev_dbg(&port->dev, "digi_write: returning %d\n", ret);
    951	return ret;
    952
    953}
    954
    955static void digi_write_bulk_callback(struct urb *urb)
    956{
    957
    958	struct usb_serial_port *port = urb->context;
    959	struct usb_serial *serial;
    960	struct digi_port *priv;
    961	struct digi_serial *serial_priv;
    962	unsigned long flags;
    963	int ret = 0;
    964	int status = urb->status;
    965	bool wakeup;
    966
    967	/* port and serial sanity check */
    968	if (port == NULL || (priv = usb_get_serial_port_data(port)) == NULL) {
    969		pr_err("%s: port or port->private is NULL, status=%d\n",
    970			__func__, status);
    971		return;
    972	}
    973	serial = port->serial;
    974	if (serial == NULL || (serial_priv = usb_get_serial_data(serial)) == NULL) {
    975		dev_err(&port->dev,
    976			"%s: serial or serial->private is NULL, status=%d\n",
    977			__func__, status);
    978		return;
    979	}
    980
    981	/* handle oob callback */
    982	if (priv->dp_port_num == serial_priv->ds_oob_port_num) {
    983		dev_dbg(&port->dev, "digi_write_bulk_callback: oob callback\n");
    984		spin_lock_irqsave(&priv->dp_port_lock, flags);
    985		priv->dp_write_urb_in_use = 0;
    986		wake_up_interruptible(&priv->write_wait);
    987		spin_unlock_irqrestore(&priv->dp_port_lock, flags);
    988		return;
    989	}
    990
    991	/* try to send any buffered data on this port */
    992	wakeup = true;
    993	spin_lock_irqsave(&priv->dp_port_lock, flags);
    994	priv->dp_write_urb_in_use = 0;
    995	if (priv->dp_out_buf_len > 0) {
    996		*((unsigned char *)(port->write_urb->transfer_buffer))
    997			= (unsigned char)DIGI_CMD_SEND_DATA;
    998		*((unsigned char *)(port->write_urb->transfer_buffer) + 1)
    999			= (unsigned char)priv->dp_out_buf_len;
   1000		port->write_urb->transfer_buffer_length =
   1001						priv->dp_out_buf_len + 2;
   1002		memcpy(port->write_urb->transfer_buffer + 2, priv->dp_out_buf,
   1003			priv->dp_out_buf_len);
   1004		ret = usb_submit_urb(port->write_urb, GFP_ATOMIC);
   1005		if (ret == 0) {
   1006			priv->dp_write_urb_in_use = 1;
   1007			priv->dp_out_buf_len = 0;
   1008			wakeup = false;
   1009		}
   1010	}
   1011	spin_unlock_irqrestore(&priv->dp_port_lock, flags);
   1012
   1013	if (ret && ret != -EPERM)
   1014		dev_err_console(port,
   1015			"%s: usb_submit_urb failed, ret=%d, port=%d\n",
   1016			__func__, ret, priv->dp_port_num);
   1017
   1018	if (wakeup)
   1019		tty_port_tty_wakeup(&port->port);
   1020}
   1021
   1022static unsigned int digi_write_room(struct tty_struct *tty)
   1023{
   1024	struct usb_serial_port *port = tty->driver_data;
   1025	struct digi_port *priv = usb_get_serial_port_data(port);
   1026	unsigned long flags;
   1027	unsigned int room;
   1028
   1029	spin_lock_irqsave(&priv->dp_port_lock, flags);
   1030
   1031	if (priv->dp_write_urb_in_use)
   1032		room = 0;
   1033	else
   1034		room = port->bulk_out_size - 2 - priv->dp_out_buf_len;
   1035
   1036	spin_unlock_irqrestore(&priv->dp_port_lock, flags);
   1037	dev_dbg(&port->dev, "digi_write_room: port=%d, room=%u\n", priv->dp_port_num, room);
   1038	return room;
   1039
   1040}
   1041
   1042static unsigned int digi_chars_in_buffer(struct tty_struct *tty)
   1043{
   1044	struct usb_serial_port *port = tty->driver_data;
   1045	struct digi_port *priv = usb_get_serial_port_data(port);
   1046	unsigned long flags;
   1047	unsigned int chars;
   1048
   1049	spin_lock_irqsave(&priv->dp_port_lock, flags);
   1050	if (priv->dp_write_urb_in_use)
   1051		chars = port->bulk_out_size - 2;
   1052	else
   1053		chars = priv->dp_out_buf_len;
   1054	spin_unlock_irqrestore(&priv->dp_port_lock, flags);
   1055
   1056	dev_dbg(&port->dev, "%s: port=%d, chars=%d\n", __func__,
   1057			priv->dp_port_num, chars);
   1058	return chars;
   1059}
   1060
   1061static void digi_dtr_rts(struct usb_serial_port *port, int on)
   1062{
   1063	/* Adjust DTR and RTS */
   1064	digi_set_modem_signals(port, on * (TIOCM_DTR | TIOCM_RTS), 1);
   1065}
   1066
   1067static int digi_open(struct tty_struct *tty, struct usb_serial_port *port)
   1068{
   1069	int ret;
   1070	unsigned char buf[32];
   1071	struct digi_port *priv = usb_get_serial_port_data(port);
   1072	struct ktermios not_termios;
   1073
   1074	/* be sure the device is started up */
   1075	if (digi_startup_device(port->serial) != 0)
   1076		return -ENXIO;
   1077
   1078	/* read modem signals automatically whenever they change */
   1079	buf[0] = DIGI_CMD_READ_INPUT_SIGNALS;
   1080	buf[1] = priv->dp_port_num;
   1081	buf[2] = DIGI_ENABLE;
   1082	buf[3] = 0;
   1083
   1084	/* flush fifos */
   1085	buf[4] = DIGI_CMD_IFLUSH_FIFO;
   1086	buf[5] = priv->dp_port_num;
   1087	buf[6] = DIGI_FLUSH_TX | DIGI_FLUSH_RX;
   1088	buf[7] = 0;
   1089
   1090	ret = digi_write_oob_command(port, buf, 8, 1);
   1091	if (ret != 0)
   1092		dev_dbg(&port->dev, "digi_open: write oob failed, ret=%d\n", ret);
   1093
   1094	/* set termios settings */
   1095	if (tty) {
   1096		not_termios.c_cflag = ~tty->termios.c_cflag;
   1097		not_termios.c_iflag = ~tty->termios.c_iflag;
   1098		digi_set_termios(tty, port, &not_termios);
   1099	}
   1100	return 0;
   1101}
   1102
   1103
   1104static void digi_close(struct usb_serial_port *port)
   1105{
   1106	DEFINE_WAIT(wait);
   1107	int ret;
   1108	unsigned char buf[32];
   1109	struct digi_port *priv = usb_get_serial_port_data(port);
   1110
   1111	mutex_lock(&port->serial->disc_mutex);
   1112	/* if disconnected, just clear flags */
   1113	if (port->serial->disconnected)
   1114		goto exit;
   1115
   1116	/* FIXME: Transmit idle belongs in the wait_unti_sent path */
   1117	digi_transmit_idle(port, DIGI_CLOSE_TIMEOUT);
   1118
   1119	/* disable input flow control */
   1120	buf[0] = DIGI_CMD_SET_INPUT_FLOW_CONTROL;
   1121	buf[1] = priv->dp_port_num;
   1122	buf[2] = DIGI_DISABLE;
   1123	buf[3] = 0;
   1124
   1125	/* disable output flow control */
   1126	buf[4] = DIGI_CMD_SET_OUTPUT_FLOW_CONTROL;
   1127	buf[5] = priv->dp_port_num;
   1128	buf[6] = DIGI_DISABLE;
   1129	buf[7] = 0;
   1130
   1131	/* disable reading modem signals automatically */
   1132	buf[8] = DIGI_CMD_READ_INPUT_SIGNALS;
   1133	buf[9] = priv->dp_port_num;
   1134	buf[10] = DIGI_DISABLE;
   1135	buf[11] = 0;
   1136
   1137	/* disable receive */
   1138	buf[12] = DIGI_CMD_RECEIVE_ENABLE;
   1139	buf[13] = priv->dp_port_num;
   1140	buf[14] = DIGI_DISABLE;
   1141	buf[15] = 0;
   1142
   1143	/* flush fifos */
   1144	buf[16] = DIGI_CMD_IFLUSH_FIFO;
   1145	buf[17] = priv->dp_port_num;
   1146	buf[18] = DIGI_FLUSH_TX | DIGI_FLUSH_RX;
   1147	buf[19] = 0;
   1148
   1149	ret = digi_write_oob_command(port, buf, 20, 0);
   1150	if (ret != 0)
   1151		dev_dbg(&port->dev, "digi_close: write oob failed, ret=%d\n",
   1152									ret);
   1153	/* wait for final commands on oob port to complete */
   1154	prepare_to_wait(&priv->dp_flush_wait, &wait,
   1155			TASK_INTERRUPTIBLE);
   1156	schedule_timeout(DIGI_CLOSE_TIMEOUT);
   1157	finish_wait(&priv->dp_flush_wait, &wait);
   1158
   1159	/* shutdown any outstanding bulk writes */
   1160	usb_kill_urb(port->write_urb);
   1161exit:
   1162	spin_lock_irq(&priv->dp_port_lock);
   1163	priv->dp_write_urb_in_use = 0;
   1164	wake_up_interruptible(&priv->dp_close_wait);
   1165	spin_unlock_irq(&priv->dp_port_lock);
   1166	mutex_unlock(&port->serial->disc_mutex);
   1167}
   1168
   1169
   1170/*
   1171 *  Digi Startup Device
   1172 *
   1173 *  Starts reads on all ports.  Must be called AFTER startup, with
   1174 *  urbs initialized.  Returns 0 if successful, non-zero error otherwise.
   1175 */
   1176
   1177static int digi_startup_device(struct usb_serial *serial)
   1178{
   1179	int i, ret = 0;
   1180	struct digi_serial *serial_priv = usb_get_serial_data(serial);
   1181	struct usb_serial_port *port;
   1182
   1183	/* be sure this happens exactly once */
   1184	spin_lock(&serial_priv->ds_serial_lock);
   1185	if (serial_priv->ds_device_started) {
   1186		spin_unlock(&serial_priv->ds_serial_lock);
   1187		return 0;
   1188	}
   1189	serial_priv->ds_device_started = 1;
   1190	spin_unlock(&serial_priv->ds_serial_lock);
   1191
   1192	/* start reading from each bulk in endpoint for the device */
   1193	/* set USB_DISABLE_SPD flag for write bulk urbs */
   1194	for (i = 0; i < serial->type->num_ports + 1; i++) {
   1195		port = serial->port[i];
   1196		ret = usb_submit_urb(port->read_urb, GFP_KERNEL);
   1197		if (ret != 0) {
   1198			dev_err(&port->dev,
   1199				"%s: usb_submit_urb failed, ret=%d, port=%d\n",
   1200				__func__, ret, i);
   1201			break;
   1202		}
   1203	}
   1204	return ret;
   1205}
   1206
   1207static int digi_port_init(struct usb_serial_port *port, unsigned port_num)
   1208{
   1209	struct digi_port *priv;
   1210
   1211	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
   1212	if (!priv)
   1213		return -ENOMEM;
   1214
   1215	spin_lock_init(&priv->dp_port_lock);
   1216	priv->dp_port_num = port_num;
   1217	init_waitqueue_head(&priv->dp_transmit_idle_wait);
   1218	init_waitqueue_head(&priv->dp_flush_wait);
   1219	init_waitqueue_head(&priv->dp_close_wait);
   1220	init_waitqueue_head(&priv->write_wait);
   1221	priv->dp_port = port;
   1222
   1223	usb_set_serial_port_data(port, priv);
   1224
   1225	return 0;
   1226}
   1227
   1228static int digi_startup(struct usb_serial *serial)
   1229{
   1230	struct digi_serial *serial_priv;
   1231	int ret;
   1232
   1233	serial_priv = kzalloc(sizeof(*serial_priv), GFP_KERNEL);
   1234	if (!serial_priv)
   1235		return -ENOMEM;
   1236
   1237	spin_lock_init(&serial_priv->ds_serial_lock);
   1238	serial_priv->ds_oob_port_num = serial->type->num_ports;
   1239	serial_priv->ds_oob_port = serial->port[serial_priv->ds_oob_port_num];
   1240
   1241	ret = digi_port_init(serial_priv->ds_oob_port,
   1242						serial_priv->ds_oob_port_num);
   1243	if (ret) {
   1244		kfree(serial_priv);
   1245		return ret;
   1246	}
   1247
   1248	usb_set_serial_data(serial, serial_priv);
   1249
   1250	return 0;
   1251}
   1252
   1253
   1254static void digi_disconnect(struct usb_serial *serial)
   1255{
   1256	int i;
   1257
   1258	/* stop reads and writes on all ports */
   1259	for (i = 0; i < serial->type->num_ports + 1; i++) {
   1260		usb_kill_urb(serial->port[i]->read_urb);
   1261		usb_kill_urb(serial->port[i]->write_urb);
   1262	}
   1263}
   1264
   1265
   1266static void digi_release(struct usb_serial *serial)
   1267{
   1268	struct digi_serial *serial_priv;
   1269	struct digi_port *priv;
   1270
   1271	serial_priv = usb_get_serial_data(serial);
   1272
   1273	priv = usb_get_serial_port_data(serial_priv->ds_oob_port);
   1274	kfree(priv);
   1275
   1276	kfree(serial_priv);
   1277}
   1278
   1279static int digi_port_probe(struct usb_serial_port *port)
   1280{
   1281	return digi_port_init(port, port->port_number);
   1282}
   1283
   1284static void digi_port_remove(struct usb_serial_port *port)
   1285{
   1286	struct digi_port *priv;
   1287
   1288	priv = usb_get_serial_port_data(port);
   1289	kfree(priv);
   1290}
   1291
   1292static void digi_read_bulk_callback(struct urb *urb)
   1293{
   1294	struct usb_serial_port *port = urb->context;
   1295	struct digi_port *priv;
   1296	struct digi_serial *serial_priv;
   1297	int ret;
   1298	int status = urb->status;
   1299
   1300	/* port sanity check, do not resubmit if port is not valid */
   1301	if (port == NULL)
   1302		return;
   1303	priv = usb_get_serial_port_data(port);
   1304	if (priv == NULL) {
   1305		dev_err(&port->dev, "%s: port->private is NULL, status=%d\n",
   1306			__func__, status);
   1307		return;
   1308	}
   1309	if (port->serial == NULL ||
   1310		(serial_priv = usb_get_serial_data(port->serial)) == NULL) {
   1311		dev_err(&port->dev, "%s: serial is bad or serial->private "
   1312			"is NULL, status=%d\n", __func__, status);
   1313		return;
   1314	}
   1315
   1316	/* do not resubmit urb if it has any status error */
   1317	if (status) {
   1318		dev_err(&port->dev,
   1319			"%s: nonzero read bulk status: status=%d, port=%d\n",
   1320			__func__, status, priv->dp_port_num);
   1321		return;
   1322	}
   1323
   1324	/* handle oob or inb callback, do not resubmit if error */
   1325	if (priv->dp_port_num == serial_priv->ds_oob_port_num) {
   1326		if (digi_read_oob_callback(urb) != 0)
   1327			return;
   1328	} else {
   1329		if (digi_read_inb_callback(urb) != 0)
   1330			return;
   1331	}
   1332
   1333	/* continue read */
   1334	ret = usb_submit_urb(urb, GFP_ATOMIC);
   1335	if (ret != 0 && ret != -EPERM) {
   1336		dev_err(&port->dev,
   1337			"%s: failed resubmitting urb, ret=%d, port=%d\n",
   1338			__func__, ret, priv->dp_port_num);
   1339	}
   1340
   1341}
   1342
   1343/*
   1344 *  Digi Read INB Callback
   1345 *
   1346 *  Digi Read INB Callback handles reads on the in band ports, sending
   1347 *  the data on to the tty subsystem.  When called we know port and
   1348 *  port->private are not NULL and port->serial has been validated.
   1349 *  It returns 0 if successful, 1 if successful but the port is
   1350 *  throttled, and -1 if the sanity checks failed.
   1351 */
   1352
   1353static int digi_read_inb_callback(struct urb *urb)
   1354{
   1355	struct usb_serial_port *port = urb->context;
   1356	struct digi_port *priv = usb_get_serial_port_data(port);
   1357	unsigned char *buf = urb->transfer_buffer;
   1358	unsigned long flags;
   1359	int opcode;
   1360	int len;
   1361	int port_status;
   1362	unsigned char *data;
   1363	int tty_flag, throttled;
   1364
   1365	/* short/multiple packet check */
   1366	if (urb->actual_length < 2) {
   1367		dev_warn(&port->dev, "short packet received\n");
   1368		return -1;
   1369	}
   1370
   1371	opcode = buf[0];
   1372	len = buf[1];
   1373
   1374	if (urb->actual_length != len + 2) {
   1375		dev_err(&port->dev, "malformed packet received: port=%d, opcode=%d, len=%d, actual_length=%u\n",
   1376			priv->dp_port_num, opcode, len, urb->actual_length);
   1377		return -1;
   1378	}
   1379
   1380	if (opcode == DIGI_CMD_RECEIVE_DATA && len < 1) {
   1381		dev_err(&port->dev, "malformed data packet received\n");
   1382		return -1;
   1383	}
   1384
   1385	spin_lock_irqsave(&priv->dp_port_lock, flags);
   1386
   1387	/* check for throttle; if set, do not resubmit read urb */
   1388	/* indicate the read chain needs to be restarted on unthrottle */
   1389	throttled = priv->dp_throttled;
   1390	if (throttled)
   1391		priv->dp_throttle_restart = 1;
   1392
   1393	/* receive data */
   1394	if (opcode == DIGI_CMD_RECEIVE_DATA) {
   1395		port_status = buf[2];
   1396		data = &buf[3];
   1397
   1398		/* get flag from port_status */
   1399		tty_flag = 0;
   1400
   1401		/* overrun is special, not associated with a char */
   1402		if (port_status & DIGI_OVERRUN_ERROR)
   1403			tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
   1404
   1405		/* break takes precedence over parity, */
   1406		/* which takes precedence over framing errors */
   1407		if (port_status & DIGI_BREAK_ERROR)
   1408			tty_flag = TTY_BREAK;
   1409		else if (port_status & DIGI_PARITY_ERROR)
   1410			tty_flag = TTY_PARITY;
   1411		else if (port_status & DIGI_FRAMING_ERROR)
   1412			tty_flag = TTY_FRAME;
   1413
   1414		/* data length is len-1 (one byte of len is port_status) */
   1415		--len;
   1416		if (len > 0) {
   1417			tty_insert_flip_string_fixed_flag(&port->port, data,
   1418					tty_flag, len);
   1419			tty_flip_buffer_push(&port->port);
   1420		}
   1421	}
   1422	spin_unlock_irqrestore(&priv->dp_port_lock, flags);
   1423
   1424	if (opcode == DIGI_CMD_RECEIVE_DISABLE)
   1425		dev_dbg(&port->dev, "%s: got RECEIVE_DISABLE\n", __func__);
   1426	else if (opcode != DIGI_CMD_RECEIVE_DATA)
   1427		dev_dbg(&port->dev, "%s: unknown opcode: %d\n", __func__, opcode);
   1428
   1429	return throttled ? 1 : 0;
   1430
   1431}
   1432
   1433
   1434/*
   1435 *  Digi Read OOB Callback
   1436 *
   1437 *  Digi Read OOB Callback handles reads on the out of band port.
   1438 *  When called we know port and port->private are not NULL and
   1439 *  the port->serial is valid.  It returns 0 if successful, and
   1440 *  -1 if the sanity checks failed.
   1441 */
   1442
   1443static int digi_read_oob_callback(struct urb *urb)
   1444{
   1445
   1446	struct usb_serial_port *port = urb->context;
   1447	struct usb_serial *serial = port->serial;
   1448	struct tty_struct *tty;
   1449	struct digi_port *priv;
   1450	unsigned char *buf = urb->transfer_buffer;
   1451	int opcode, line, status, val;
   1452	unsigned long flags;
   1453	int i;
   1454	unsigned int rts;
   1455
   1456	if (urb->actual_length < 4)
   1457		return -1;
   1458
   1459	/* handle each oob command */
   1460	for (i = 0; i < urb->actual_length - 3; i += 4) {
   1461		opcode = buf[i];
   1462		line = buf[i + 1];
   1463		status = buf[i + 2];
   1464		val = buf[i + 3];
   1465
   1466		dev_dbg(&port->dev, "digi_read_oob_callback: opcode=%d, line=%d, status=%d, val=%d\n",
   1467			opcode, line, status, val);
   1468
   1469		if (status != 0 || line >= serial->type->num_ports)
   1470			continue;
   1471
   1472		port = serial->port[line];
   1473
   1474		priv = usb_get_serial_port_data(port);
   1475		if (priv == NULL)
   1476			return -1;
   1477
   1478		tty = tty_port_tty_get(&port->port);
   1479
   1480		rts = 0;
   1481		if (tty)
   1482			rts = C_CRTSCTS(tty);
   1483
   1484		if (tty && opcode == DIGI_CMD_READ_INPUT_SIGNALS) {
   1485			bool wakeup = false;
   1486
   1487			spin_lock_irqsave(&priv->dp_port_lock, flags);
   1488			/* convert from digi flags to termiox flags */
   1489			if (val & DIGI_READ_INPUT_SIGNALS_CTS) {
   1490				priv->dp_modem_signals |= TIOCM_CTS;
   1491				if (rts)
   1492					wakeup = true;
   1493			} else {
   1494				priv->dp_modem_signals &= ~TIOCM_CTS;
   1495				/* port must be open to use tty struct */
   1496			}
   1497			if (val & DIGI_READ_INPUT_SIGNALS_DSR)
   1498				priv->dp_modem_signals |= TIOCM_DSR;
   1499			else
   1500				priv->dp_modem_signals &= ~TIOCM_DSR;
   1501			if (val & DIGI_READ_INPUT_SIGNALS_RI)
   1502				priv->dp_modem_signals |= TIOCM_RI;
   1503			else
   1504				priv->dp_modem_signals &= ~TIOCM_RI;
   1505			if (val & DIGI_READ_INPUT_SIGNALS_DCD)
   1506				priv->dp_modem_signals |= TIOCM_CD;
   1507			else
   1508				priv->dp_modem_signals &= ~TIOCM_CD;
   1509
   1510			spin_unlock_irqrestore(&priv->dp_port_lock, flags);
   1511
   1512			if (wakeup)
   1513				tty_port_tty_wakeup(&port->port);
   1514		} else if (opcode == DIGI_CMD_TRANSMIT_IDLE) {
   1515			spin_lock_irqsave(&priv->dp_port_lock, flags);
   1516			priv->dp_transmit_idle = 1;
   1517			wake_up_interruptible(&priv->dp_transmit_idle_wait);
   1518			spin_unlock_irqrestore(&priv->dp_port_lock, flags);
   1519		} else if (opcode == DIGI_CMD_IFLUSH_FIFO) {
   1520			wake_up_interruptible(&priv->dp_flush_wait);
   1521		}
   1522		tty_kref_put(tty);
   1523	}
   1524	return 0;
   1525
   1526}
   1527
   1528module_usb_serial_driver(serial_drivers, id_table_combined);
   1529
   1530MODULE_AUTHOR(DRIVER_AUTHOR);
   1531MODULE_DESCRIPTION(DRIVER_DESC);
   1532MODULE_LICENSE("GPL");