1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * USB Cypress M8 driver 4 * 5 * Copyright (C) 2004 6 * Lonnie Mendez (dignome@gmail.com) 7 * Copyright (C) 2003,2004 8 * Neil Whelchel (koyama@firstlight.net) 9 * 10 * See Documentation/usb/usb-serial.rst for more information on using this 11 * driver 12 * 13 * See http://geocities.com/i0xox0i for information on this driver and the 14 * earthmate usb device. 15 */ 16 17 /* Thanks to Neil Whelchel for writing the first cypress m8 implementation 18 for linux. */ 19 /* Thanks to cypress for providing references for the hid reports. */ 20 /* Thanks to Jiang Zhang for providing links and for general help. */ 21 /* Code originates and was built up from ftdi_sio, belkin, pl2303 and others.*/ 22 23 24 #include <linux/kernel.h> 25 #include <linux/errno.h> 26 #include <linux/slab.h> 27 #include <linux/tty.h> 28 #include <linux/tty_driver.h> 29 #include <linux/tty_flip.h> 30 #include <linux/module.h> 31 #include <linux/moduleparam.h> 32 #include <linux/spinlock.h> 33 #include <linux/usb.h> 34 #include <linux/usb/serial.h> 35 #include <linux/serial.h> 36 #include <linux/kfifo.h> 37 #include <linux/delay.h> 38 #include <linux/uaccess.h> 39 #include <linux/unaligned.h> 40 41 #include "cypress_m8.h" 42 43 44 static bool stats; 45 static int interval; 46 static bool unstable_bauds; 47 48 #define DRIVER_AUTHOR "Lonnie Mendez <dignome@gmail.com>, Neil Whelchel <koyama@firstlight.net>" 49 #define DRIVER_DESC "Cypress USB to Serial Driver" 50 51 /* write buffer size defines */ 52 #define CYPRESS_BUF_SIZE 1024 53 54 static const struct usb_device_id id_table_earthmate[] = { 55 { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB) }, 56 { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) }, 57 { } /* Terminating entry */ 58 }; 59 60 static const struct usb_device_id id_table_cyphidcomrs232[] = { 61 { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, 62 { USB_DEVICE(VENDOR_ID_SAI, PRODUCT_ID_CYPHIDCOM) }, 63 { USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) }, 64 { USB_DEVICE(VENDOR_ID_FRWD, PRODUCT_ID_CYPHIDCOM_FRWD) }, 65 { } /* Terminating entry */ 66 }; 67 68 static const struct usb_device_id id_table_nokiaca42v2[] = { 69 { USB_DEVICE(VENDOR_ID_DAZZLE, PRODUCT_ID_CA42) }, 70 { } /* Terminating entry */ 71 }; 72 73 static const struct usb_device_id id_table_combined[] = { 74 { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB) }, 75 { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) }, 76 { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, 77 { USB_DEVICE(VENDOR_ID_SAI, PRODUCT_ID_CYPHIDCOM) }, 78 { USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) }, 79 { USB_DEVICE(VENDOR_ID_FRWD, PRODUCT_ID_CYPHIDCOM_FRWD) }, 80 { USB_DEVICE(VENDOR_ID_DAZZLE, PRODUCT_ID_CA42) }, 81 { } /* Terminating entry */ 82 }; 83 84 MODULE_DEVICE_TABLE(usb, id_table_combined); 85 86 enum packet_format { 87 packet_format_1, /* b0:status, b1:payload count */ 88 packet_format_2 /* b0[7:3]:status, b0[2:0]:payload count */ 89 }; 90 91 struct cypress_private { 92 spinlock_t lock; /* private lock */ 93 int chiptype; /* identifier of device, for quirks/etc */ 94 int bytes_in; /* used for statistics */ 95 int bytes_out; /* used for statistics */ 96 int cmd_count; /* used for statistics */ 97 int cmd_ctrl; /* always set this to 1 before issuing a command */ 98 struct kfifo write_fifo; /* write fifo */ 99 int write_urb_in_use; /* write urb in use indicator */ 100 int write_urb_interval; /* interval to use for write urb */ 101 int read_urb_interval; /* interval to use for read urb */ 102 int comm_is_ok; /* true if communication is (still) ok */ 103 __u8 line_control; /* holds dtr / rts value */ 104 __u8 current_status; /* received from last read - info on dsr,cts,cd,ri,etc */ 105 __u8 current_config; /* stores the current configuration byte */ 106 __u8 rx_flags; /* throttling - used from whiteheat/ftdi_sio */ 107 enum packet_format pkt_fmt; /* format to use for packet send / receive */ 108 int get_cfg_unsafe; /* If true, the CYPRESS_GET_CONFIG is unsafe */ 109 int baud_rate; /* stores current baud rate in 110 integer form */ 111 char prev_status; /* used for TIOCMIWAIT */ 112 }; 113 114 /* function prototypes for the Cypress USB to serial device */ 115 static int cypress_earthmate_port_probe(struct usb_serial_port *port); 116 static int cypress_hidcom_port_probe(struct usb_serial_port *port); 117 static int cypress_ca42v2_port_probe(struct usb_serial_port *port); 118 static void cypress_port_remove(struct usb_serial_port *port); 119 static int cypress_open(struct tty_struct *tty, struct usb_serial_port *port); 120 static void cypress_close(struct usb_serial_port *port); 121 static void cypress_dtr_rts(struct usb_serial_port *port, int on); 122 static int cypress_write(struct tty_struct *tty, struct usb_serial_port *port, 123 const unsigned char *buf, int count); 124 static void cypress_send(struct usb_serial_port *port); 125 static unsigned int cypress_write_room(struct tty_struct *tty); 126 static void cypress_earthmate_init_termios(struct tty_struct *tty); 127 static void cypress_set_termios(struct tty_struct *tty, 128 struct usb_serial_port *port, 129 const struct ktermios *old_termios); 130 static int cypress_tiocmget(struct tty_struct *tty); 131 static int cypress_tiocmset(struct tty_struct *tty, 132 unsigned int set, unsigned int clear); 133 static unsigned int cypress_chars_in_buffer(struct tty_struct *tty); 134 static void cypress_throttle(struct tty_struct *tty); 135 static void cypress_unthrottle(struct tty_struct *tty); 136 static void cypress_set_dead(struct usb_serial_port *port); 137 static void cypress_read_int_callback(struct urb *urb); 138 static void cypress_write_int_callback(struct urb *urb); 139 140 static struct usb_serial_driver cypress_earthmate_device = { 141 .driver = { 142 .name = "earthmate", 143 }, 144 .description = "DeLorme Earthmate USB", 145 .id_table = id_table_earthmate, 146 .num_ports = 1, 147 .port_probe = cypress_earthmate_port_probe, 148 .port_remove = cypress_port_remove, 149 .open = cypress_open, 150 .close = cypress_close, 151 .dtr_rts = cypress_dtr_rts, 152 .write = cypress_write, 153 .write_room = cypress_write_room, 154 .init_termios = cypress_earthmate_init_termios, 155 .set_termios = cypress_set_termios, 156 .tiocmget = cypress_tiocmget, 157 .tiocmset = cypress_tiocmset, 158 .tiocmiwait = usb_serial_generic_tiocmiwait, 159 .chars_in_buffer = cypress_chars_in_buffer, 160 .throttle = cypress_throttle, 161 .unthrottle = cypress_unthrottle, 162 .read_int_callback = cypress_read_int_callback, 163 .write_int_callback = cypress_write_int_callback, 164 }; 165 166 static struct usb_serial_driver cypress_hidcom_device = { 167 .driver = { 168 .name = "cyphidcom", 169 }, 170 .description = "HID->COM RS232 Adapter", 171 .id_table = id_table_cyphidcomrs232, 172 .num_ports = 1, 173 .port_probe = cypress_hidcom_port_probe, 174 .port_remove = cypress_port_remove, 175 .open = cypress_open, 176 .close = cypress_close, 177 .dtr_rts = cypress_dtr_rts, 178 .write = cypress_write, 179 .write_room = cypress_write_room, 180 .set_termios = cypress_set_termios, 181 .tiocmget = cypress_tiocmget, 182 .tiocmset = cypress_tiocmset, 183 .tiocmiwait = usb_serial_generic_tiocmiwait, 184 .chars_in_buffer = cypress_chars_in_buffer, 185 .throttle = cypress_throttle, 186 .unthrottle = cypress_unthrottle, 187 .read_int_callback = cypress_read_int_callback, 188 .write_int_callback = cypress_write_int_callback, 189 }; 190 191 static struct usb_serial_driver cypress_ca42v2_device = { 192 .driver = { 193 .name = "nokiaca42v2", 194 }, 195 .description = "Nokia CA-42 V2 Adapter", 196 .id_table = id_table_nokiaca42v2, 197 .num_ports = 1, 198 .port_probe = cypress_ca42v2_port_probe, 199 .port_remove = cypress_port_remove, 200 .open = cypress_open, 201 .close = cypress_close, 202 .dtr_rts = cypress_dtr_rts, 203 .write = cypress_write, 204 .write_room = cypress_write_room, 205 .set_termios = cypress_set_termios, 206 .tiocmget = cypress_tiocmget, 207 .tiocmset = cypress_tiocmset, 208 .tiocmiwait = usb_serial_generic_tiocmiwait, 209 .chars_in_buffer = cypress_chars_in_buffer, 210 .throttle = cypress_throttle, 211 .unthrottle = cypress_unthrottle, 212 .read_int_callback = cypress_read_int_callback, 213 .write_int_callback = cypress_write_int_callback, 214 }; 215 216 static struct usb_serial_driver * const serial_drivers[] = { 217 &cypress_earthmate_device, &cypress_hidcom_device, 218 &cypress_ca42v2_device, NULL 219 }; 220 221 /***************************************************************************** 222 * Cypress serial helper functions 223 *****************************************************************************/ 224 225 /* FRWD Dongle hidcom needs to skip reset and speed checks */ 226 static inline bool is_frwd(struct usb_device *dev) 227 { 228 return ((le16_to_cpu(dev->descriptor.idVendor) == VENDOR_ID_FRWD) && 229 (le16_to_cpu(dev->descriptor.idProduct) == PRODUCT_ID_CYPHIDCOM_FRWD)); 230 } 231 232 static int analyze_baud_rate(struct usb_serial_port *port, speed_t new_rate) 233 { 234 struct cypress_private *priv; 235 priv = usb_get_serial_port_data(port); 236 237 if (unstable_bauds) 238 return new_rate; 239 240 /* FRWD Dongle uses 115200 bps */ 241 if (is_frwd(port->serial->dev)) 242 return new_rate; 243 244 /* 245 * The general purpose firmware for the Cypress M8 allows for 246 * a maximum speed of 57600bps (I have no idea whether DeLorme 247 * chose to use the general purpose firmware or not), if you 248 * need to modify this speed setting for your own project 249 * please add your own chiptype and modify the code likewise. 250 * The Cypress HID->COM device will work successfully up to 251 * 115200bps (but the actual throughput is around 3kBps). 252 */ 253 if (port->serial->dev->speed == USB_SPEED_LOW) { 254 /* 255 * Mike Isely <isely@pobox.com> 2-Feb-2008: The 256 * Cypress app note that describes this mechanism 257 * states that the low-speed part can't handle more 258 * than 800 bytes/sec, in which case 4800 baud is the 259 * safest speed for a part like that. 260 */ 261 if (new_rate > 4800) { 262 dev_dbg(&port->dev, 263 "%s - failed setting baud rate, device incapable speed %d\n", 264 __func__, new_rate); 265 return -1; 266 } 267 } 268 switch (priv->chiptype) { 269 case CT_EARTHMATE: 270 if (new_rate <= 600) { 271 /* 300 and 600 baud rates are supported under 272 * the generic firmware, but are not used with 273 * NMEA and SiRF protocols */ 274 dev_dbg(&port->dev, 275 "%s - failed setting baud rate, unsupported speed of %d on Earthmate GPS\n", 276 __func__, new_rate); 277 return -1; 278 } 279 break; 280 default: 281 break; 282 } 283 return new_rate; 284 } 285 286 287 /* This function can either set or retrieve the current serial line settings */ 288 static int cypress_serial_control(struct tty_struct *tty, 289 struct usb_serial_port *port, speed_t baud_rate, int data_bits, 290 int stop_bits, int parity_enable, int parity_type, int reset, 291 int cypress_request_type) 292 { 293 int new_baudrate = 0, retval = 0, tries = 0; 294 struct cypress_private *priv; 295 struct device *dev = &port->dev; 296 u8 *feature_buffer; 297 const unsigned int feature_len = 5; 298 unsigned long flags; 299 300 priv = usb_get_serial_port_data(port); 301 302 if (!priv->comm_is_ok) 303 return -ENODEV; 304 305 feature_buffer = kcalloc(feature_len, sizeof(u8), GFP_KERNEL); 306 if (!feature_buffer) 307 return -ENOMEM; 308 309 switch (cypress_request_type) { 310 case CYPRESS_SET_CONFIG: 311 /* 0 means 'Hang up' so doesn't change the true bit rate */ 312 new_baudrate = priv->baud_rate; 313 if (baud_rate && baud_rate != priv->baud_rate) { 314 dev_dbg(dev, "%s - baud rate is changing\n", __func__); 315 retval = analyze_baud_rate(port, baud_rate); 316 if (retval >= 0) { 317 new_baudrate = retval; 318 dev_dbg(dev, "%s - New baud rate set to %d\n", 319 __func__, new_baudrate); 320 } 321 } 322 dev_dbg(dev, "%s - baud rate is being sent as %d\n", __func__, 323 new_baudrate); 324 325 /* fill the feature_buffer with new configuration */ 326 put_unaligned_le32(new_baudrate, feature_buffer); 327 feature_buffer[4] |= data_bits - 5; /* assign data bits in 2 bit space ( max 3 ) */ 328 /* 1 bit gap */ 329 feature_buffer[4] |= (stop_bits << 3); /* assign stop bits in 1 bit space */ 330 feature_buffer[4] |= (parity_enable << 4); /* assign parity flag in 1 bit space */ 331 feature_buffer[4] |= (parity_type << 5); /* assign parity type in 1 bit space */ 332 /* 1 bit gap */ 333 feature_buffer[4] |= (reset << 7); /* assign reset at end of byte, 1 bit space */ 334 335 dev_dbg(dev, "%s - device is being sent this feature report:\n", __func__); 336 dev_dbg(dev, "%s - %02X - %02X - %02X - %02X - %02X\n", __func__, 337 feature_buffer[0], feature_buffer[1], 338 feature_buffer[2], feature_buffer[3], 339 feature_buffer[4]); 340 341 do { 342 retval = usb_control_msg(port->serial->dev, 343 usb_sndctrlpipe(port->serial->dev, 0), 344 HID_REQ_SET_REPORT, 345 USB_DIR_OUT | USB_RECIP_INTERFACE | USB_TYPE_CLASS, 346 0x0300, 0, feature_buffer, 347 feature_len, 500); 348 349 if (tries++ >= 3) 350 break; 351 352 } while (retval != feature_len && 353 retval != -ENODEV); 354 355 if (retval != feature_len) { 356 dev_err(dev, "%s - failed sending serial line settings - %d\n", 357 __func__, retval); 358 cypress_set_dead(port); 359 } else { 360 spin_lock_irqsave(&priv->lock, flags); 361 priv->baud_rate = new_baudrate; 362 priv->current_config = feature_buffer[4]; 363 spin_unlock_irqrestore(&priv->lock, flags); 364 /* If we asked for a speed change encode it */ 365 if (baud_rate) 366 tty_encode_baud_rate(tty, 367 new_baudrate, new_baudrate); 368 } 369 break; 370 case CYPRESS_GET_CONFIG: 371 if (priv->get_cfg_unsafe) { 372 /* Not implemented for this device, 373 and if we try to do it we're likely 374 to crash the hardware. */ 375 retval = -ENOTTY; 376 goto out; 377 } 378 dev_dbg(dev, "%s - retrieving serial line settings\n", __func__); 379 do { 380 retval = usb_control_msg(port->serial->dev, 381 usb_rcvctrlpipe(port->serial->dev, 0), 382 HID_REQ_GET_REPORT, 383 USB_DIR_IN | USB_RECIP_INTERFACE | USB_TYPE_CLASS, 384 0x0300, 0, feature_buffer, 385 feature_len, 500); 386 387 if (tries++ >= 3) 388 break; 389 } while (retval != feature_len 390 && retval != -ENODEV); 391 392 if (retval != feature_len) { 393 dev_err(dev, "%s - failed to retrieve serial line settings - %d\n", 394 __func__, retval); 395 cypress_set_dead(port); 396 goto out; 397 } else { 398 spin_lock_irqsave(&priv->lock, flags); 399 /* store the config in one byte, and later 400 use bit masks to check values */ 401 priv->current_config = feature_buffer[4]; 402 priv->baud_rate = get_unaligned_le32(feature_buffer); 403 spin_unlock_irqrestore(&priv->lock, flags); 404 } 405 } 406 spin_lock_irqsave(&priv->lock, flags); 407 ++priv->cmd_count; 408 spin_unlock_irqrestore(&priv->lock, flags); 409 out: 410 kfree(feature_buffer); 411 return retval; 412 } /* cypress_serial_control */ 413 414 415 static void cypress_set_dead(struct usb_serial_port *port) 416 { 417 struct cypress_private *priv = usb_get_serial_port_data(port); 418 unsigned long flags; 419 420 spin_lock_irqsave(&priv->lock, flags); 421 if (!priv->comm_is_ok) { 422 spin_unlock_irqrestore(&priv->lock, flags); 423 return; 424 } 425 priv->comm_is_ok = 0; 426 spin_unlock_irqrestore(&priv->lock, flags); 427 428 dev_err(&port->dev, "cypress_m8 suspending failing port %d - " 429 "interval might be too short\n", port->port_number); 430 } 431 432 433 /***************************************************************************** 434 * Cypress serial driver functions 435 *****************************************************************************/ 436 437 438 static int cypress_generic_port_probe(struct usb_serial_port *port) 439 { 440 struct usb_serial *serial = port->serial; 441 struct cypress_private *priv; 442 443 if (!port->interrupt_out_urb || !port->interrupt_in_urb) { 444 dev_err(&port->dev, "required endpoint is missing\n"); 445 return -ENODEV; 446 } 447 448 priv = kzalloc(sizeof(struct cypress_private), GFP_KERNEL); 449 if (!priv) 450 return -ENOMEM; 451 452 priv->comm_is_ok = !0; 453 spin_lock_init(&priv->lock); 454 if (kfifo_alloc(&priv->write_fifo, CYPRESS_BUF_SIZE, GFP_KERNEL)) { 455 kfree(priv); 456 return -ENOMEM; 457 } 458 459 /* Skip reset for FRWD device. It is a workaound: 460 device hangs if it receives SET_CONFIGURE in Configured 461 state. */ 462 if (!is_frwd(serial->dev)) 463 usb_reset_configuration(serial->dev); 464 465 priv->cmd_ctrl = 0; 466 priv->line_control = 0; 467 priv->rx_flags = 0; 468 /* Default packet format setting is determined by packet size. 469 Anything with a size larger then 9 must have a separate 470 count field since the 3 bit count field is otherwise too 471 small. Otherwise we can use the slightly more compact 472 format. This is in accordance with the cypress_m8 serial 473 converter app note. */ 474 if (port->interrupt_out_size > 9) 475 priv->pkt_fmt = packet_format_1; 476 else 477 priv->pkt_fmt = packet_format_2; 478 479 if (interval > 0) { 480 priv->write_urb_interval = interval; 481 priv->read_urb_interval = interval; 482 dev_dbg(&port->dev, "%s - read & write intervals forced to %d\n", 483 __func__, interval); 484 } else { 485 priv->write_urb_interval = port->interrupt_out_urb->interval; 486 priv->read_urb_interval = port->interrupt_in_urb->interval; 487 dev_dbg(&port->dev, "%s - intervals: read=%d write=%d\n", 488 __func__, priv->read_urb_interval, 489 priv->write_urb_interval); 490 } 491 usb_set_serial_port_data(port, priv); 492 493 port->port.drain_delay = 256; 494 495 return 0; 496 } 497 498 499 static int cypress_earthmate_port_probe(struct usb_serial_port *port) 500 { 501 struct usb_serial *serial = port->serial; 502 struct cypress_private *priv; 503 int ret; 504 505 ret = cypress_generic_port_probe(port); 506 if (ret) { 507 dev_dbg(&port->dev, "%s - Failed setting up port\n", __func__); 508 return ret; 509 } 510 511 priv = usb_get_serial_port_data(port); 512 priv->chiptype = CT_EARTHMATE; 513 /* All Earthmate devices use the separated-count packet 514 format! Idiotic. */ 515 priv->pkt_fmt = packet_format_1; 516 if (serial->dev->descriptor.idProduct != 517 cpu_to_le16(PRODUCT_ID_EARTHMATEUSB)) { 518 /* The old original USB Earthmate seemed able to 519 handle GET_CONFIG requests; everything they've 520 produced since that time crashes if this command is 521 attempted :-( */ 522 dev_dbg(&port->dev, 523 "%s - Marking this device as unsafe for GET_CONFIG commands\n", 524 __func__); 525 priv->get_cfg_unsafe = !0; 526 } 527 528 return 0; 529 } 530 531 static int cypress_hidcom_port_probe(struct usb_serial_port *port) 532 { 533 struct cypress_private *priv; 534 int ret; 535 536 ret = cypress_generic_port_probe(port); 537 if (ret) { 538 dev_dbg(&port->dev, "%s - Failed setting up port\n", __func__); 539 return ret; 540 } 541 542 priv = usb_get_serial_port_data(port); 543 priv->chiptype = CT_CYPHIDCOM; 544 545 return 0; 546 } 547 548 static int cypress_ca42v2_port_probe(struct usb_serial_port *port) 549 { 550 struct cypress_private *priv; 551 int ret; 552 553 ret = cypress_generic_port_probe(port); 554 if (ret) { 555 dev_dbg(&port->dev, "%s - Failed setting up port\n", __func__); 556 return ret; 557 } 558 559 priv = usb_get_serial_port_data(port); 560 priv->chiptype = CT_CA42V2; 561 562 return 0; 563 } 564 565 static void cypress_port_remove(struct usb_serial_port *port) 566 { 567 struct cypress_private *priv; 568 569 priv = usb_get_serial_port_data(port); 570 571 kfifo_free(&priv->write_fifo); 572 kfree(priv); 573 } 574 575 static int cypress_open(struct tty_struct *tty, struct usb_serial_port *port) 576 { 577 struct cypress_private *priv = usb_get_serial_port_data(port); 578 struct usb_serial *serial = port->serial; 579 unsigned long flags; 580 int result = 0; 581 582 if (!priv->comm_is_ok) 583 return -EIO; 584 585 /* clear halts before open */ 586 usb_clear_halt(serial->dev, 0x81); 587 usb_clear_halt(serial->dev, 0x02); 588 589 spin_lock_irqsave(&priv->lock, flags); 590 /* reset read/write statistics */ 591 priv->bytes_in = 0; 592 priv->bytes_out = 0; 593 priv->cmd_count = 0; 594 priv->rx_flags = 0; 595 spin_unlock_irqrestore(&priv->lock, flags); 596 597 /* Set termios */ 598 cypress_send(port); 599 600 if (tty) 601 cypress_set_termios(tty, port, NULL); 602 603 /* setup the port and start reading from the device */ 604 usb_fill_int_urb(port->interrupt_in_urb, serial->dev, 605 usb_rcvintpipe(serial->dev, port->interrupt_in_endpointAddress), 606 port->interrupt_in_urb->transfer_buffer, 607 port->interrupt_in_urb->transfer_buffer_length, 608 cypress_read_int_callback, port, priv->read_urb_interval); 609 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); 610 611 if (result) { 612 dev_err(&port->dev, 613 "%s - failed submitting read urb, error %d\n", 614 __func__, result); 615 cypress_set_dead(port); 616 } 617 618 return result; 619 } /* cypress_open */ 620 621 static void cypress_dtr_rts(struct usb_serial_port *port, int on) 622 { 623 struct cypress_private *priv = usb_get_serial_port_data(port); 624 /* drop dtr and rts */ 625 spin_lock_irq(&priv->lock); 626 if (on == 0) 627 priv->line_control = 0; 628 else 629 priv->line_control = CONTROL_DTR | CONTROL_RTS; 630 priv->cmd_ctrl = 1; 631 spin_unlock_irq(&priv->lock); 632 cypress_write(NULL, port, NULL, 0); 633 } 634 635 static void cypress_close(struct usb_serial_port *port) 636 { 637 struct cypress_private *priv = usb_get_serial_port_data(port); 638 unsigned long flags; 639 640 spin_lock_irqsave(&priv->lock, flags); 641 kfifo_reset_out(&priv->write_fifo); 642 spin_unlock_irqrestore(&priv->lock, flags); 643 644 dev_dbg(&port->dev, "%s - stopping urbs\n", __func__); 645 usb_kill_urb(port->interrupt_in_urb); 646 usb_kill_urb(port->interrupt_out_urb); 647 648 if (stats) 649 dev_info(&port->dev, "Statistics: %d Bytes In | %d Bytes Out | %d Commands Issued\n", 650 priv->bytes_in, priv->bytes_out, priv->cmd_count); 651 } /* cypress_close */ 652 653 654 static int cypress_write(struct tty_struct *tty, struct usb_serial_port *port, 655 const unsigned char *buf, int count) 656 { 657 struct cypress_private *priv = usb_get_serial_port_data(port); 658 659 dev_dbg(&port->dev, "%s - %d bytes\n", __func__, count); 660 661 /* line control commands, which need to be executed immediately, 662 are not put into the buffer for obvious reasons. 663 */ 664 if (priv->cmd_ctrl) { 665 count = 0; 666 goto finish; 667 } 668 669 if (!count) 670 return count; 671 672 count = kfifo_in_locked(&priv->write_fifo, buf, count, &priv->lock); 673 674 finish: 675 cypress_send(port); 676 677 return count; 678 } /* cypress_write */ 679 680 681 static void cypress_send(struct usb_serial_port *port) 682 { 683 int count = 0, result, offset, actual_size; 684 struct cypress_private *priv = usb_get_serial_port_data(port); 685 struct device *dev = &port->dev; 686 unsigned long flags; 687 688 if (!priv->comm_is_ok) 689 return; 690 691 dev_dbg(dev, "%s - interrupt out size is %d\n", __func__, 692 port->interrupt_out_size); 693 694 spin_lock_irqsave(&priv->lock, flags); 695 if (priv->write_urb_in_use) { 696 dev_dbg(dev, "%s - can't write, urb in use\n", __func__); 697 spin_unlock_irqrestore(&priv->lock, flags); 698 return; 699 } 700 spin_unlock_irqrestore(&priv->lock, flags); 701 702 /* clear buffer */ 703 memset(port->interrupt_out_urb->transfer_buffer, 0, 704 port->interrupt_out_size); 705 706 spin_lock_irqsave(&priv->lock, flags); 707 switch (priv->pkt_fmt) { 708 default: 709 case packet_format_1: 710 /* this is for the CY7C64013... */ 711 offset = 2; 712 port->interrupt_out_buffer[0] = priv->line_control; 713 break; 714 case packet_format_2: 715 /* this is for the CY7C63743... */ 716 offset = 1; 717 port->interrupt_out_buffer[0] = priv->line_control; 718 break; 719 } 720 721 if (priv->line_control & CONTROL_RESET) 722 priv->line_control &= ~CONTROL_RESET; 723 724 if (priv->cmd_ctrl) { 725 priv->cmd_count++; 726 dev_dbg(dev, "%s - line control command being issued\n", __func__); 727 spin_unlock_irqrestore(&priv->lock, flags); 728 goto send; 729 } else 730 spin_unlock_irqrestore(&priv->lock, flags); 731 732 count = kfifo_out_locked(&priv->write_fifo, 733 &port->interrupt_out_buffer[offset], 734 port->interrupt_out_size - offset, 735 &priv->lock); 736 if (count == 0) 737 return; 738 739 switch (priv->pkt_fmt) { 740 default: 741 case packet_format_1: 742 port->interrupt_out_buffer[1] = count; 743 break; 744 case packet_format_2: 745 port->interrupt_out_buffer[0] |= count; 746 } 747 748 dev_dbg(dev, "%s - count is %d\n", __func__, count); 749 750 send: 751 spin_lock_irqsave(&priv->lock, flags); 752 priv->write_urb_in_use = 1; 753 spin_unlock_irqrestore(&priv->lock, flags); 754 755 if (priv->cmd_ctrl) 756 actual_size = 1; 757 else 758 actual_size = count + 759 (priv->pkt_fmt == packet_format_1 ? 2 : 1); 760 761 usb_serial_debug_data(dev, __func__, port->interrupt_out_size, 762 port->interrupt_out_urb->transfer_buffer); 763 764 usb_fill_int_urb(port->interrupt_out_urb, port->serial->dev, 765 usb_sndintpipe(port->serial->dev, port->interrupt_out_endpointAddress), 766 port->interrupt_out_buffer, actual_size, 767 cypress_write_int_callback, port, priv->write_urb_interval); 768 result = usb_submit_urb(port->interrupt_out_urb, GFP_ATOMIC); 769 if (result) { 770 dev_err_console(port, 771 "%s - failed submitting write urb, error %d\n", 772 __func__, result); 773 priv->write_urb_in_use = 0; 774 cypress_set_dead(port); 775 } 776 777 spin_lock_irqsave(&priv->lock, flags); 778 if (priv->cmd_ctrl) 779 priv->cmd_ctrl = 0; 780 781 /* do not count the line control and size bytes */ 782 priv->bytes_out += count; 783 spin_unlock_irqrestore(&priv->lock, flags); 784 785 usb_serial_port_softint(port); 786 } /* cypress_send */ 787 788 789 /* returns how much space is available in the soft buffer */ 790 static unsigned int cypress_write_room(struct tty_struct *tty) 791 { 792 struct usb_serial_port *port = tty->driver_data; 793 struct cypress_private *priv = usb_get_serial_port_data(port); 794 unsigned int room; 795 unsigned long flags; 796 797 spin_lock_irqsave(&priv->lock, flags); 798 room = kfifo_avail(&priv->write_fifo); 799 spin_unlock_irqrestore(&priv->lock, flags); 800 801 dev_dbg(&port->dev, "%s - returns %u\n", __func__, room); 802 return room; 803 } 804 805 806 static int cypress_tiocmget(struct tty_struct *tty) 807 { 808 struct usb_serial_port *port = tty->driver_data; 809 struct cypress_private *priv = usb_get_serial_port_data(port); 810 __u8 status, control; 811 unsigned int result = 0; 812 unsigned long flags; 813 814 spin_lock_irqsave(&priv->lock, flags); 815 control = priv->line_control; 816 status = priv->current_status; 817 spin_unlock_irqrestore(&priv->lock, flags); 818 819 result = ((control & CONTROL_DTR) ? TIOCM_DTR : 0) 820 | ((control & CONTROL_RTS) ? TIOCM_RTS : 0) 821 | ((status & UART_CTS) ? TIOCM_CTS : 0) 822 | ((status & UART_DSR) ? TIOCM_DSR : 0) 823 | ((status & UART_RI) ? TIOCM_RI : 0) 824 | ((status & UART_CD) ? TIOCM_CD : 0); 825 826 dev_dbg(&port->dev, "%s - result = %x\n", __func__, result); 827 828 return result; 829 } 830 831 832 static int cypress_tiocmset(struct tty_struct *tty, 833 unsigned int set, unsigned int clear) 834 { 835 struct usb_serial_port *port = tty->driver_data; 836 struct cypress_private *priv = usb_get_serial_port_data(port); 837 unsigned long flags; 838 839 spin_lock_irqsave(&priv->lock, flags); 840 if (set & TIOCM_RTS) 841 priv->line_control |= CONTROL_RTS; 842 if (set & TIOCM_DTR) 843 priv->line_control |= CONTROL_DTR; 844 if (clear & TIOCM_RTS) 845 priv->line_control &= ~CONTROL_RTS; 846 if (clear & TIOCM_DTR) 847 priv->line_control &= ~CONTROL_DTR; 848 priv->cmd_ctrl = 1; 849 spin_unlock_irqrestore(&priv->lock, flags); 850 851 return cypress_write(tty, port, NULL, 0); 852 } 853 854 static void cypress_earthmate_init_termios(struct tty_struct *tty) 855 { 856 tty_encode_baud_rate(tty, 4800, 4800); 857 } 858 859 static void cypress_set_termios(struct tty_struct *tty, 860 struct usb_serial_port *port, 861 const struct ktermios *old_termios) 862 { 863 struct cypress_private *priv = usb_get_serial_port_data(port); 864 struct device *dev = &port->dev; 865 int data_bits, stop_bits, parity_type, parity_enable; 866 unsigned int cflag; 867 unsigned long flags; 868 __u8 oldlines; 869 int linechange = 0; 870 871 /* Unsupported features need clearing */ 872 tty->termios.c_cflag &= ~(CMSPAR|CRTSCTS); 873 874 cflag = tty->termios.c_cflag; 875 876 /* set number of data bits, parity, stop bits */ 877 /* when parity is disabled the parity type bit is ignored */ 878 879 /* 1 means 2 stop bits, 0 means 1 stop bit */ 880 stop_bits = cflag & CSTOPB ? 1 : 0; 881 882 if (cflag & PARENB) { 883 parity_enable = 1; 884 /* 1 means odd parity, 0 means even parity */ 885 parity_type = cflag & PARODD ? 1 : 0; 886 } else 887 parity_enable = parity_type = 0; 888 889 data_bits = tty_get_char_size(cflag); 890 891 spin_lock_irqsave(&priv->lock, flags); 892 oldlines = priv->line_control; 893 if ((cflag & CBAUD) == B0) { 894 /* drop dtr and rts */ 895 dev_dbg(dev, "%s - dropping the lines, baud rate 0bps\n", __func__); 896 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS); 897 } else 898 priv->line_control = (CONTROL_DTR | CONTROL_RTS); 899 spin_unlock_irqrestore(&priv->lock, flags); 900 901 dev_dbg(dev, "%s - sending %d stop_bits, %d parity_enable, %d parity_type, %d data_bits (+5)\n", 902 __func__, stop_bits, parity_enable, parity_type, data_bits); 903 904 cypress_serial_control(tty, port, tty_get_baud_rate(tty), 905 data_bits, stop_bits, 906 parity_enable, parity_type, 907 0, CYPRESS_SET_CONFIG); 908 909 /* we perform a CYPRESS_GET_CONFIG so that the current settings are 910 * filled into the private structure this should confirm that all is 911 * working if it returns what we just set */ 912 cypress_serial_control(tty, port, 0, 0, 0, 0, 0, 0, CYPRESS_GET_CONFIG); 913 914 /* Here we can define custom tty settings for devices; the main tty 915 * termios flag base comes from empeg.c */ 916 917 spin_lock_irqsave(&priv->lock, flags); 918 if (priv->chiptype == CT_EARTHMATE && priv->baud_rate == 4800) { 919 dev_dbg(dev, "Using custom termios settings for a baud rate of 4800bps.\n"); 920 /* define custom termios settings for NMEA protocol */ 921 922 tty->termios.c_iflag /* input modes - */ 923 &= ~(IGNBRK /* disable ignore break */ 924 | BRKINT /* disable break causes interrupt */ 925 | PARMRK /* disable mark parity errors */ 926 | ISTRIP /* disable clear high bit of input char */ 927 | INLCR /* disable translate NL to CR */ 928 | IGNCR /* disable ignore CR */ 929 | ICRNL /* disable translate CR to NL */ 930 | IXON); /* disable enable XON/XOFF flow control */ 931 932 tty->termios.c_oflag /* output modes */ 933 &= ~OPOST; /* disable postprocess output char */ 934 935 tty->termios.c_lflag /* line discipline modes */ 936 &= ~(ECHO /* disable echo input characters */ 937 | ECHONL /* disable echo new line */ 938 | ICANON /* disable erase, kill, werase, and rprnt 939 special characters */ 940 | ISIG /* disable interrupt, quit, and suspend 941 special characters */ 942 | IEXTEN); /* disable non-POSIX special characters */ 943 } /* CT_CYPHIDCOM: Application should handle this for device */ 944 945 linechange = (priv->line_control != oldlines); 946 spin_unlock_irqrestore(&priv->lock, flags); 947 948 /* if necessary, set lines */ 949 if (linechange) { 950 priv->cmd_ctrl = 1; 951 cypress_write(tty, port, NULL, 0); 952 } 953 } /* cypress_set_termios */ 954 955 956 /* returns amount of data still left in soft buffer */ 957 static unsigned int cypress_chars_in_buffer(struct tty_struct *tty) 958 { 959 struct usb_serial_port *port = tty->driver_data; 960 struct cypress_private *priv = usb_get_serial_port_data(port); 961 unsigned int chars; 962 unsigned long flags; 963 964 spin_lock_irqsave(&priv->lock, flags); 965 chars = kfifo_len(&priv->write_fifo); 966 spin_unlock_irqrestore(&priv->lock, flags); 967 968 dev_dbg(&port->dev, "%s - returns %u\n", __func__, chars); 969 return chars; 970 } 971 972 973 static void cypress_throttle(struct tty_struct *tty) 974 { 975 struct usb_serial_port *port = tty->driver_data; 976 struct cypress_private *priv = usb_get_serial_port_data(port); 977 978 spin_lock_irq(&priv->lock); 979 priv->rx_flags = THROTTLED; 980 spin_unlock_irq(&priv->lock); 981 } 982 983 984 static void cypress_unthrottle(struct tty_struct *tty) 985 { 986 struct usb_serial_port *port = tty->driver_data; 987 struct cypress_private *priv = usb_get_serial_port_data(port); 988 int actually_throttled, result; 989 990 spin_lock_irq(&priv->lock); 991 actually_throttled = priv->rx_flags & ACTUALLY_THROTTLED; 992 priv->rx_flags = 0; 993 spin_unlock_irq(&priv->lock); 994 995 if (!priv->comm_is_ok) 996 return; 997 998 if (actually_throttled) { 999 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); 1000 if (result) { 1001 dev_err(&port->dev, "%s - failed submitting read urb, " 1002 "error %d\n", __func__, result); 1003 cypress_set_dead(port); 1004 } 1005 } 1006 } 1007 1008 1009 static void cypress_read_int_callback(struct urb *urb) 1010 { 1011 struct usb_serial_port *port = urb->context; 1012 struct cypress_private *priv = usb_get_serial_port_data(port); 1013 struct device *dev = &urb->dev->dev; 1014 struct tty_struct *tty; 1015 unsigned char *data = urb->transfer_buffer; 1016 unsigned long flags; 1017 char tty_flag = TTY_NORMAL; 1018 int bytes = 0; 1019 int result; 1020 int i = 0; 1021 int status = urb->status; 1022 1023 switch (status) { 1024 case 0: /* success */ 1025 break; 1026 case -ECONNRESET: 1027 case -ENOENT: 1028 case -ESHUTDOWN: 1029 /* precursor to disconnect so just go away */ 1030 return; 1031 case -EPIPE: 1032 /* Can't call usb_clear_halt while in_interrupt */ 1033 fallthrough; 1034 default: 1035 /* something ugly is going on... */ 1036 dev_err(dev, "%s - unexpected nonzero read status received: %d\n", 1037 __func__, status); 1038 cypress_set_dead(port); 1039 return; 1040 } 1041 1042 spin_lock_irqsave(&priv->lock, flags); 1043 if (priv->rx_flags & THROTTLED) { 1044 dev_dbg(dev, "%s - now throttling\n", __func__); 1045 priv->rx_flags |= ACTUALLY_THROTTLED; 1046 spin_unlock_irqrestore(&priv->lock, flags); 1047 return; 1048 } 1049 spin_unlock_irqrestore(&priv->lock, flags); 1050 1051 tty = tty_port_tty_get(&port->port); 1052 if (!tty) { 1053 dev_dbg(dev, "%s - bad tty pointer - exiting\n", __func__); 1054 return; 1055 } 1056 1057 spin_lock_irqsave(&priv->lock, flags); 1058 result = urb->actual_length; 1059 switch (priv->pkt_fmt) { 1060 default: 1061 case packet_format_1: 1062 /* This is for the CY7C64013... */ 1063 priv->current_status = data[0] & 0xF8; 1064 bytes = data[1] + 2; 1065 i = 2; 1066 break; 1067 case packet_format_2: 1068 /* This is for the CY7C63743... */ 1069 priv->current_status = data[0] & 0xF8; 1070 bytes = (data[0] & 0x07) + 1; 1071 i = 1; 1072 break; 1073 } 1074 spin_unlock_irqrestore(&priv->lock, flags); 1075 if (result < bytes) { 1076 dev_dbg(dev, 1077 "%s - wrong packet size - received %d bytes but packet said %d bytes\n", 1078 __func__, result, bytes); 1079 goto continue_read; 1080 } 1081 1082 usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data); 1083 1084 spin_lock_irqsave(&priv->lock, flags); 1085 /* check to see if status has changed */ 1086 if (priv->current_status != priv->prev_status) { 1087 u8 delta = priv->current_status ^ priv->prev_status; 1088 1089 if (delta & UART_MSR_MASK) { 1090 if (delta & UART_CTS) 1091 port->icount.cts++; 1092 if (delta & UART_DSR) 1093 port->icount.dsr++; 1094 if (delta & UART_RI) 1095 port->icount.rng++; 1096 if (delta & UART_CD) 1097 port->icount.dcd++; 1098 1099 wake_up_interruptible(&port->port.delta_msr_wait); 1100 } 1101 1102 priv->prev_status = priv->current_status; 1103 } 1104 spin_unlock_irqrestore(&priv->lock, flags); 1105 1106 /* hangup, as defined in acm.c... this might be a bad place for it 1107 * though */ 1108 if (tty && !C_CLOCAL(tty) && !(priv->current_status & UART_CD)) { 1109 dev_dbg(dev, "%s - calling hangup\n", __func__); 1110 tty_hangup(tty); 1111 goto continue_read; 1112 } 1113 1114 /* There is one error bit... I'm assuming it is a parity error 1115 * indicator as the generic firmware will set this bit to 1 if a 1116 * parity error occurs. 1117 * I can not find reference to any other error events. */ 1118 spin_lock_irqsave(&priv->lock, flags); 1119 if (priv->current_status & CYP_ERROR) { 1120 spin_unlock_irqrestore(&priv->lock, flags); 1121 tty_flag = TTY_PARITY; 1122 dev_dbg(dev, "%s - Parity Error detected\n", __func__); 1123 } else 1124 spin_unlock_irqrestore(&priv->lock, flags); 1125 1126 /* process read if there is data other than line status */ 1127 if (bytes > i) { 1128 tty_insert_flip_string_fixed_flag(&port->port, data + i, 1129 tty_flag, bytes - i); 1130 tty_flip_buffer_push(&port->port); 1131 } 1132 1133 spin_lock_irqsave(&priv->lock, flags); 1134 /* control and status byte(s) are also counted */ 1135 priv->bytes_in += bytes; 1136 spin_unlock_irqrestore(&priv->lock, flags); 1137 1138 continue_read: 1139 tty_kref_put(tty); 1140 1141 /* Continue trying to always read */ 1142 1143 if (priv->comm_is_ok) { 1144 usb_fill_int_urb(port->interrupt_in_urb, port->serial->dev, 1145 usb_rcvintpipe(port->serial->dev, 1146 port->interrupt_in_endpointAddress), 1147 port->interrupt_in_urb->transfer_buffer, 1148 port->interrupt_in_urb->transfer_buffer_length, 1149 cypress_read_int_callback, port, 1150 priv->read_urb_interval); 1151 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); 1152 if (result && result != -EPERM) { 1153 dev_err(dev, "%s - failed resubmitting read urb, error %d\n", 1154 __func__, result); 1155 cypress_set_dead(port); 1156 } 1157 } 1158 } /* cypress_read_int_callback */ 1159 1160 1161 static void cypress_write_int_callback(struct urb *urb) 1162 { 1163 struct usb_serial_port *port = urb->context; 1164 struct cypress_private *priv = usb_get_serial_port_data(port); 1165 struct device *dev = &urb->dev->dev; 1166 int status = urb->status; 1167 1168 switch (status) { 1169 case 0: 1170 /* success */ 1171 break; 1172 case -ECONNRESET: 1173 case -ENOENT: 1174 case -ESHUTDOWN: 1175 /* this urb is terminated, clean up */ 1176 dev_dbg(dev, "%s - urb shutting down with status: %d\n", 1177 __func__, status); 1178 priv->write_urb_in_use = 0; 1179 return; 1180 case -EPIPE: 1181 /* Cannot call usb_clear_halt while in_interrupt */ 1182 fallthrough; 1183 default: 1184 dev_err(dev, "%s - unexpected nonzero write status received: %d\n", 1185 __func__, status); 1186 cypress_set_dead(port); 1187 break; 1188 } 1189 priv->write_urb_in_use = 0; 1190 1191 /* send any buffered data */ 1192 cypress_send(port); 1193 } 1194 1195 module_usb_serial_driver(serial_drivers, id_table_combined); 1196 1197 MODULE_AUTHOR(DRIVER_AUTHOR); 1198 MODULE_DESCRIPTION(DRIVER_DESC); 1199 MODULE_LICENSE("GPL"); 1200 1201 module_param(stats, bool, 0644); 1202 MODULE_PARM_DESC(stats, "Enable statistics or not"); 1203 module_param(interval, int, 0644); 1204 MODULE_PARM_DESC(interval, "Overrides interrupt interval"); 1205 module_param(unstable_bauds, bool, 0644); 1206 MODULE_PARM_DESC(unstable_bauds, "Allow unstable baud rates"); 1207