root/drivers/usb/serial/digi_acceleport.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. cond_wait_interruptible_timeout_irqrestore
  2. digi_wakeup_write_lock
  3. digi_write_oob_command
  4. digi_write_inb_command
  5. digi_set_modem_signals
  6. digi_transmit_idle
  7. digi_rx_throttle
  8. digi_rx_unthrottle
  9. digi_set_termios
  10. digi_break_ctl
  11. digi_tiocmget
  12. digi_tiocmset
  13. digi_write
  14. digi_write_bulk_callback
  15. digi_write_room
  16. digi_chars_in_buffer
  17. digi_dtr_rts
  18. digi_open
  19. digi_close
  20. digi_startup_device
  21. digi_port_init
  22. digi_startup
  23. digi_disconnect
  24. digi_release
  25. digi_port_probe
  26. digi_port_remove
  27. digi_read_bulk_callback
  28. digi_read_inb_callback
  29. digi_read_oob_callback

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

/* [<][>][^][v][top][bottom][index][help] */