Lines Matching +full:dcd +full:- +full:override
1 // SPDX-License-Identifier: GPL-2.0+
5 * Copyright (C) 2009 - 2013
7 * Copyright (C) 1999 - 2001
8 * Greg Kroah-Hartman (greg@kroah.com)
13 * See Documentation/usb/usb-serial.rst for more information on using this
16 * See http://ftdi-usb-sio.sourceforge.net for up to date testing info
24 /* Bill Ryder - bryder@sgi.com - wrote the FTDI_SIO implementation */
28 assimilated :-) */
47 #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Bill Ryder <bryder@sgi.com>, Kuba Ober …
75 u16 last_set_data_value; /* the last data state set - needed for doing
84 speed_t force_baud; /* if non-zero, force the baud rate to
86 int force_rtscts; /* if non-zero, force RTS-CTS to always
142 * - it can support MUCH higher baudrates; up to:
146 * - it has a two byte status code.
147 * - it returns characters every 16ms (the FTDI does it every 40ms)
160 * /sys/bus/usb-serial/drivers/ftdi_sio/new_id and send a patch or report.
1051 /* ICP DAS I-756xU devices */
1072 /* U-Blox devices */
1119 [FTX] = "FT-X",
1195 /* hi-speed baud rate is 10-bit sampling instead of 16-bit */ in ftdi_2232h_baud_base_to_divisor()
1226 struct device *dev = &port->dev; in update_mctrl()
1231 dev_dbg(dev, "%s - DTR|RTS not being set|cleared\n", __func__); in update_mctrl()
1245 rv = usb_control_msg(port->serial->dev, in update_mctrl()
1246 usb_sndctrlpipe(port->serial->dev, 0), in update_mctrl()
1249 value, priv->channel, in update_mctrl()
1258 dev_dbg(dev, "%s - DTR %s, RTS %s\n", __func__, in update_mctrl()
1262 priv->last_dtr_rts = (priv->last_dtr_rts & ~clear) | set; in update_mctrl()
1272 struct device *dev = &port->dev; in get_ftdi_divisor()
1278 dev_dbg(dev, "%s - tty_get_baud_rate reports speed %d\n", __func__, baud); in get_ftdi_divisor()
1281 * Observe deprecated async-compatible custom_divisor hack, update in get_ftdi_divisor()
1285 ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) && in get_ftdi_divisor()
1286 (priv->custom_divisor)) { in get_ftdi_divisor()
1287 baud = priv->baud_base / priv->custom_divisor; in get_ftdi_divisor()
1288 dev_dbg(dev, "%s - custom divisor %d sets baud rate to %d\n", in get_ftdi_divisor()
1289 __func__, priv->custom_divisor, baud); in get_ftdi_divisor()
1294 switch (priv->chip_type) { in get_ftdi_divisor()
1308 dev_dbg(dev, "%s - Baudrate (%d) requested is not supported\n", in get_ftdi_divisor()
1319 dev_dbg(dev, "%s - Baud rate too high!\n", __func__); in get_ftdi_divisor()
1331 port->serial->dev->descriptor.idProduct); in get_ftdi_divisor()
1342 dev_dbg(dev, "%s - Baud rate too high!\n", __func__); in get_ftdi_divisor()
1354 dev_dbg(dev, "%s - Baud rate too high!\n", __func__); in get_ftdi_divisor()
1363 dev_dbg(dev, "%s - Baud rate set to %d (divisor 0x%lX) on chip %s\n", in get_ftdi_divisor()
1365 ftdi_chip_name[priv->chip_type]); in get_ftdi_divisor()
1383 if (priv->channel) in change_speed()
1384 index = (u16)((index << 8) | priv->channel); in change_speed()
1386 rv = usb_control_msg(port->serial->dev, in change_speed()
1387 usb_sndctrlpipe(port->serial->dev, 0), in change_speed()
1398 struct usb_device *udev = port->serial->dev; in write_latency_timer()
1400 int l = priv->latency; in write_latency_timer()
1402 if (priv->chip_type == SIO || priv->chip_type == FT232A) in write_latency_timer()
1403 return -EINVAL; in write_latency_timer()
1405 if (priv->flags & ASYNC_LOW_LATENCY) in write_latency_timer()
1408 dev_dbg(&port->dev, "%s: setting latency timer = %i\n", __func__, l); in write_latency_timer()
1414 l, priv->channel, in write_latency_timer()
1417 dev_err(&port->dev, "Unable to write latency timer: %i\n", rv); in write_latency_timer()
1424 struct usb_device *udev = port->serial->dev; in _read_latency_timer()
1430 priv->channel, &buf, 1, WDR_TIMEOUT, in _read_latency_timer()
1443 if (priv->chip_type == SIO || priv->chip_type == FT232A) in read_latency_timer()
1444 return -EINVAL; in read_latency_timer()
1448 dev_err(&port->dev, "Unable to read latency timer: %i\n", rv); in read_latency_timer()
1452 priv->latency = rv; in read_latency_timer()
1459 struct usb_serial_port *port = tty->driver_data; in get_serial_info()
1462 mutex_lock(&priv->cfg_lock); in get_serial_info()
1463 ss->flags = priv->flags; in get_serial_info()
1464 ss->baud_base = priv->baud_base; in get_serial_info()
1465 ss->custom_divisor = priv->custom_divisor; in get_serial_info()
1466 mutex_unlock(&priv->cfg_lock); in get_serial_info()
1471 struct usb_serial_port *port = tty->driver_data; in set_serial_info()
1475 mutex_lock(&priv->cfg_lock); in set_serial_info()
1478 if ((ss->flags ^ priv->flags) & ~ASYNC_USR_MASK) { in set_serial_info()
1479 mutex_unlock(&priv->cfg_lock); in set_serial_info()
1480 return -EPERM; in set_serial_info()
1484 old_flags = priv->flags; in set_serial_info()
1485 old_divisor = priv->custom_divisor; in set_serial_info()
1487 priv->flags = ss->flags & ASYNC_FLAGS; in set_serial_info()
1488 priv->custom_divisor = ss->custom_divisor; in set_serial_info()
1492 if ((priv->flags ^ old_flags) & ASYNC_SPD_MASK || in set_serial_info()
1493 ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST && in set_serial_info()
1494 priv->custom_divisor != old_divisor)) { in set_serial_info()
1497 if (priv->flags & ASYNC_SPD_MASK) in set_serial_info()
1498 dev_warn_ratelimited(&port->dev, "use of SPD flags is deprecated\n"); in set_serial_info()
1502 mutex_unlock(&priv->cfg_lock); in set_serial_info()
1512 if (priv->transmit_empty) in get_lsr_info()
1516 return -EFAULT; in get_lsr_info()
1523 struct usb_serial *serial = port->serial; in ftdi_determine_type()
1524 struct usb_device *udev = serial->dev; in ftdi_determine_type()
1527 version = le16_to_cpu(udev->descriptor.bcdDevice); in ftdi_determine_type()
1528 ifnum = serial->interface->cur_altsetting->desc.bInterfaceNumber; in ftdi_determine_type()
1530 /* Assume Hi-Speed type */ in ftdi_determine_type()
1531 priv->baud_base = 120000000 / 2; in ftdi_determine_type()
1532 priv->channel = CHANNEL_A + ifnum; in ftdi_determine_type()
1536 priv->chip_type = FT232A; in ftdi_determine_type()
1537 priv->baud_base = 48000000 / 2; in ftdi_determine_type()
1538 priv->channel = 0; in ftdi_determine_type()
1544 if (udev->descriptor.iSerialNumber == 0 && in ftdi_determine_type()
1546 priv->chip_type = FT232B; in ftdi_determine_type()
1550 priv->chip_type = FT232B; in ftdi_determine_type()
1551 priv->baud_base = 48000000 / 2; in ftdi_determine_type()
1552 priv->channel = 0; in ftdi_determine_type()
1555 priv->chip_type = FT2232C; in ftdi_determine_type()
1556 priv->baud_base = 48000000 / 2; in ftdi_determine_type()
1559 priv->chip_type = FT232R; in ftdi_determine_type()
1560 priv->baud_base = 48000000 / 2; in ftdi_determine_type()
1561 priv->channel = 0; in ftdi_determine_type()
1564 priv->chip_type = FT2232H; in ftdi_determine_type()
1567 priv->chip_type = FT4232H; in ftdi_determine_type()
1570 priv->chip_type = FT232H; in ftdi_determine_type()
1573 priv->chip_type = FTX; in ftdi_determine_type()
1574 priv->baud_base = 48000000 / 2; in ftdi_determine_type()
1577 priv->chip_type = FT2233HP; in ftdi_determine_type()
1580 priv->chip_type = FT4233HP; in ftdi_determine_type()
1583 priv->chip_type = FT2232HP; in ftdi_determine_type()
1586 priv->chip_type = FT4232HP; in ftdi_determine_type()
1589 priv->chip_type = FT233HP; in ftdi_determine_type()
1592 priv->chip_type = FT232HP; in ftdi_determine_type()
1595 priv->chip_type = FT4232HA; in ftdi_determine_type()
1599 priv->chip_type = SIO; in ftdi_determine_type()
1600 priv->baud_base = 12000000 / 16; in ftdi_determine_type()
1601 priv->channel = 0; in ftdi_determine_type()
1603 dev_err(&port->dev, "unknown device type: 0x%02x\n", version); in ftdi_determine_type()
1604 return -ENODEV; in ftdi_determine_type()
1608 dev_info(&udev->dev, "Detected %s\n", ftdi_chip_name[priv->chip_type]); in ftdi_determine_type()
1622 struct usb_interface *interface = port->serial->interface; in ftdi_set_max_packet_size()
1627 num_endpoints = interface->cur_altsetting->desc.bNumEndpoints; in ftdi_set_max_packet_size()
1633 * with an endpoint size of 0 - not good. In this case, we in ftdi_set_max_packet_size()
1634 * want to override the endpoint descriptor setting and use a in ftdi_set_max_packet_size()
1638 ep_desc = &interface->cur_altsetting->endpoint[i].desc; in ftdi_set_max_packet_size()
1639 if (!ep_desc->wMaxPacketSize) { in ftdi_set_max_packet_size()
1640 ep_desc->wMaxPacketSize = cpu_to_le16(0x40); in ftdi_set_max_packet_size()
1641 dev_warn(&port->dev, "Overriding wMaxPacketSize on endpoint %d\n", in ftdi_set_max_packet_size()
1647 priv->max_packet_size = usb_endpoint_maxp(ep_desc); in ftdi_set_max_packet_size()
1662 if (priv->flags & ASYNC_LOW_LATENCY) in latency_timer_show()
1665 return sprintf(buf, "%u\n", priv->latency); in latency_timer_show()
1679 return -EINVAL; in latency_timer_store()
1681 priv->latency = v; in latency_timer_store()
1684 return -EIO; in latency_timer_store()
1696 struct usb_device *udev = port->serial->dev; in event_char_store()
1701 return -EINVAL; in event_char_store()
1703 dev_dbg(&port->dev, "%s: setting event char = 0x%03x\n", __func__, v); in event_char_store()
1709 v, priv->channel, in event_char_store()
1712 dev_dbg(&port->dev, "Unable to write event character: %i\n", rv); in event_char_store()
1713 return -EIO; in event_char_store()
1731 enum ftdi_chip_type type = priv->chip_type; in ftdi_is_visible()
1743 return attr->mode; in ftdi_is_visible()
1761 struct usb_serial *serial = port->serial; in ftdi_set_bitmode()
1765 result = usb_autopm_get_interface(serial->interface); in ftdi_set_bitmode()
1769 val = (mode << 8) | (priv->gpio_output << 4) | priv->gpio_value; in ftdi_set_bitmode()
1770 result = usb_control_msg(serial->dev, in ftdi_set_bitmode()
1771 usb_sndctrlpipe(serial->dev, 0), in ftdi_set_bitmode()
1774 priv->channel, NULL, 0, WDR_TIMEOUT); in ftdi_set_bitmode()
1776 dev_err(&serial->interface->dev, in ftdi_set_bitmode()
1781 usb_autopm_put_interface(serial->interface); in ftdi_set_bitmode()
1795 priv->gpio_output = 0; in ftdi_exit_cbus_mode()
1796 priv->gpio_value = 0; in ftdi_exit_cbus_mode()
1806 mutex_lock(&priv->gpio_lock); in ftdi_gpio_request()
1807 if (!priv->gpio_used) { in ftdi_gpio_request()
1809 priv->gpio_output = 0x00; in ftdi_gpio_request()
1810 priv->gpio_value = 0x00; in ftdi_gpio_request()
1813 mutex_unlock(&priv->gpio_lock); in ftdi_gpio_request()
1817 priv->gpio_used = true; in ftdi_gpio_request()
1819 mutex_unlock(&priv->gpio_lock); in ftdi_gpio_request()
1827 struct usb_serial *serial = port->serial; in ftdi_read_cbus_pins()
1831 result = usb_autopm_get_interface(serial->interface); in ftdi_read_cbus_pins()
1835 result = usb_control_msg_recv(serial->dev, 0, in ftdi_read_cbus_pins()
1838 priv->channel, &buf, 1, WDR_TIMEOUT, in ftdi_read_cbus_pins()
1843 usb_autopm_put_interface(serial->interface); in ftdi_read_cbus_pins()
1865 mutex_lock(&priv->gpio_lock); in ftdi_gpio_set()
1868 priv->gpio_value |= BIT(gpio); in ftdi_gpio_set()
1870 priv->gpio_value &= ~BIT(gpio); in ftdi_gpio_set()
1874 mutex_unlock(&priv->gpio_lock); in ftdi_gpio_set()
1898 mutex_lock(&priv->gpio_lock); in ftdi_gpio_set_multiple()
1900 priv->gpio_value &= ~(*mask); in ftdi_gpio_set_multiple()
1901 priv->gpio_value |= *bits & *mask; in ftdi_gpio_set_multiple()
1904 mutex_unlock(&priv->gpio_lock); in ftdi_gpio_set_multiple()
1912 return !(priv->gpio_output & BIT(gpio)); in ftdi_gpio_direction_get()
1921 mutex_lock(&priv->gpio_lock); in ftdi_gpio_direction_input()
1923 priv->gpio_output &= ~BIT(gpio); in ftdi_gpio_direction_input()
1926 mutex_unlock(&priv->gpio_lock); in ftdi_gpio_direction_input()
1938 mutex_lock(&priv->gpio_lock); in ftdi_gpio_direction_output()
1940 priv->gpio_output |= BIT(gpio); in ftdi_gpio_direction_output()
1942 priv->gpio_value |= BIT(gpio); in ftdi_gpio_direction_output()
1944 priv->gpio_value &= ~BIT(gpio); in ftdi_gpio_direction_output()
1948 mutex_unlock(&priv->gpio_lock); in ftdi_gpio_direction_output()
1959 unsigned long map = priv->gpio_altfunc; in ftdi_gpio_init_valid_mask()
1964 dev_dbg(&port->dev, "no CBUS pin configured for GPIO\n"); in ftdi_gpio_init_valid_mask()
1966 dev_dbg(&port->dev, "CBUS%*pbl configured for GPIO\n", ngpios, in ftdi_gpio_init_valid_mask()
1978 return -EINVAL; in ftdi_read_eeprom()
1980 return -EINVAL; in ftdi_read_eeprom()
1986 rv = usb_control_msg(serial->dev, in ftdi_read_eeprom()
1987 usb_rcvctrlpipe(serial->dev, 0), in ftdi_read_eeprom()
1994 return -EIO; in ftdi_read_eeprom()
2015 return -ENOMEM; in ftdi_gpio_init_ft232h()
2017 ret = ftdi_read_eeprom(port->serial, buf, 0x1a, 4); in ftdi_gpio_init_ft232h()
2024 * 0x1a: X- (upper nibble -> AC5) in ftdi_gpio_init_ft232h()
2025 * 0x1b: -X (lower nibble -> AC6) in ftdi_gpio_init_ft232h()
2026 * 0x1c: XX (upper nibble -> AC9 | lower nibble -> AC8) in ftdi_gpio_init_ft232h()
2030 priv->gc.ngpio = 4; in ftdi_gpio_init_ft232h()
2031 priv->gpio_altfunc = 0xff; in ftdi_gpio_init_ft232h()
2033 for (i = 0; i < priv->gc.ngpio; ++i) { in ftdi_gpio_init_ft232h()
2035 priv->gpio_altfunc &= ~BIT(i); in ftdi_gpio_init_ft232h()
2055 return -ENOMEM; in ftdi_gpio_init_ft232r()
2057 ret = ftdi_read_eeprom(port->serial, buf, 0x14, 2); in ftdi_gpio_init_ft232r()
2062 dev_dbg(&port->dev, "cbus_config = 0x%04x\n", cbus_config); in ftdi_gpio_init_ft232r()
2064 priv->gc.ngpio = 4; in ftdi_gpio_init_ft232r()
2066 priv->gpio_altfunc = 0xff; in ftdi_gpio_init_ft232r()
2067 for (i = 0; i < priv->gc.ngpio; ++i) { in ftdi_gpio_init_ft232r()
2069 priv->gpio_altfunc &= ~BIT(i); in ftdi_gpio_init_ft232r()
2081 struct usb_serial *serial = port->serial; in ftdi_gpio_init_ftx()
2090 return -ENOMEM; in ftdi_gpio_init_ftx()
2098 priv->gc.ngpio = 4; in ftdi_gpio_init_ftx()
2101 priv->gpio_altfunc = 0xff; in ftdi_gpio_init_ftx()
2102 for (i = 0; i < priv->gc.ngpio; ++i) { in ftdi_gpio_init_ftx()
2104 priv->gpio_altfunc &= ~BIT(i); in ftdi_gpio_init_ftx()
2116 struct usb_serial *serial = port->serial; in ftdi_gpio_init()
2119 switch (priv->chip_type) { in ftdi_gpio_init()
2136 mutex_init(&priv->gpio_lock); in ftdi_gpio_init()
2138 priv->gc.label = "ftdi-cbus"; in ftdi_gpio_init()
2139 priv->gc.request = ftdi_gpio_request; in ftdi_gpio_init()
2140 priv->gc.get_direction = ftdi_gpio_direction_get; in ftdi_gpio_init()
2141 priv->gc.direction_input = ftdi_gpio_direction_input; in ftdi_gpio_init()
2142 priv->gc.direction_output = ftdi_gpio_direction_output; in ftdi_gpio_init()
2143 priv->gc.init_valid_mask = ftdi_gpio_init_valid_mask; in ftdi_gpio_init()
2144 priv->gc.get = ftdi_gpio_get; in ftdi_gpio_init()
2145 priv->gc.set = ftdi_gpio_set; in ftdi_gpio_init()
2146 priv->gc.get_multiple = ftdi_gpio_get_multiple; in ftdi_gpio_init()
2147 priv->gc.set_multiple = ftdi_gpio_set_multiple; in ftdi_gpio_init()
2148 priv->gc.owner = THIS_MODULE; in ftdi_gpio_init()
2149 priv->gc.parent = &serial->interface->dev; in ftdi_gpio_init()
2150 priv->gc.base = -1; in ftdi_gpio_init()
2151 priv->gc.can_sleep = true; in ftdi_gpio_init()
2153 result = gpiochip_add_data(&priv->gc, port); in ftdi_gpio_init()
2155 priv->gpio_registered = true; in ftdi_gpio_init()
2164 if (priv->gpio_registered) { in ftdi_gpio_remove()
2165 gpiochip_remove(&priv->gc); in ftdi_gpio_remove()
2166 priv->gpio_registered = false; in ftdi_gpio_remove()
2169 if (priv->gpio_used) { in ftdi_gpio_remove()
2170 /* Exiting CBUS-mode does not reset pin states. */ in ftdi_gpio_remove()
2172 priv->gpio_used = false; in ftdi_gpio_remove()
2195 const struct ftdi_quirk *quirk = (struct ftdi_quirk *)id->driver_info; in ftdi_probe()
2197 if (quirk && quirk->probe) { in ftdi_probe()
2198 int ret = quirk->probe(serial); in ftdi_probe()
2203 usb_set_serial_data(serial, (void *)id->driver_info); in ftdi_probe()
2210 const struct ftdi_quirk *quirk = usb_get_serial_data(port->serial); in ftdi_port_probe()
2216 return -ENOMEM; in ftdi_port_probe()
2218 mutex_init(&priv->cfg_lock); in ftdi_port_probe()
2220 if (quirk && quirk->port_probe) in ftdi_port_probe()
2221 quirk->port_probe(priv); in ftdi_port_probe()
2231 priv->latency = 16; in ftdi_port_probe()
2236 dev_err(&port->serial->interface->dev, in ftdi_port_probe()
2249 /* Setup for the USB-UIRT device, which requires hardwired
2254 priv->flags |= ASYNC_SPD_CUST; in ftdi_USB_UIRT_setup()
2255 priv->custom_divisor = 77; in ftdi_USB_UIRT_setup()
2256 priv->force_baud = 38400; in ftdi_USB_UIRT_setup()
2259 /* Setup for the HE-TIRA1 device, which requires hardwired
2260 * baudrate (38400 gets mapped to 100000) and RTS-CTS enabled. */
2264 priv->flags |= ASYNC_SPD_CUST; in ftdi_HE_TIRA1_setup()
2265 priv->custom_divisor = 240; in ftdi_HE_TIRA1_setup()
2266 priv->force_baud = 38400; in ftdi_HE_TIRA1_setup()
2267 priv->force_rtscts = 1; in ftdi_HE_TIRA1_setup()
2271 * Module parameter to control latency timer for NDI FTDI-based USB devices.
2277 /* Setup for the NDI FTDI-based USB devices, which requires hardwired
2284 struct usb_device *udev = serial->dev; in ftdi_NDI_device_setup()
2292 dev_dbg(&udev->dev, "%s setting NDI device latency to %d\n", __func__, latency); in ftdi_NDI_device_setup()
2293 dev_info(&udev->dev, "NDI device with a latency value of %d\n", latency); in ftdi_NDI_device_setup()
2304 * First port on JTAG adaptors such as Olimex arm-usb-ocd or the FIC/OpenMoko
2310 struct usb_interface *intf = serial->interface; in ftdi_jtag_probe()
2311 int ifnum = intf->cur_altsetting->desc.bInterfaceNumber; in ftdi_jtag_probe()
2314 dev_info(&intf->dev, "Ignoring interface reserved for JTAG\n"); in ftdi_jtag_probe()
2315 return -ENODEV; in ftdi_jtag_probe()
2323 struct usb_device *udev = serial->dev; in ftdi_8u2232c_probe()
2325 if (udev->manufacturer && !strcmp(udev->manufacturer, "CALAO Systems")) in ftdi_8u2232c_probe()
2328 if (udev->product && in ftdi_8u2232c_probe()
2329 (!strcmp(udev->product, "Arrow USB Blaster") || in ftdi_8u2232c_probe()
2330 !strcmp(udev->product, "BeagleBone/XDS100V2") || in ftdi_8u2232c_probe()
2331 !strcmp(udev->product, "SNAP Connect E10"))) in ftdi_8u2232c_probe()
2339 * ST Micro Connect Lite are reserved for JTAG or other non-UART interfaces and
2342 * a conventional RS-232 UART.
2346 struct usb_interface *intf = serial->interface; in ftdi_stmclite_probe()
2347 int ifnum = intf->cur_altsetting->desc.bInterfaceNumber; in ftdi_stmclite_probe()
2350 dev_info(&intf->dev, "Ignoring interface reserved for JTAG\n"); in ftdi_stmclite_probe()
2351 return -ENODEV; in ftdi_stmclite_probe()
2368 struct usb_device *dev = port->serial->dev; in ftdi_open()
2376 priv->channel, NULL, 0, WDR_TIMEOUT); in ftdi_open()
2379 port->tty->termios - this would lose speed settings, etc. in ftdi_open()
2380 This is same behaviour as serial.c/rs_open() - Kuba */ in ftdi_open()
2395 if (usb_control_msg(port->serial->dev, in ftdi_dtr_rts()
2396 usb_sndctrlpipe(port->serial->dev, 0), in ftdi_dtr_rts()
2399 0, priv->channel, NULL, 0, in ftdi_dtr_rts()
2401 dev_err(&port->dev, "error from flowcontrol urb\n"); in ftdi_dtr_rts()
2427 if (priv->chip_type == SIO) { in ftdi_prepare_write_buffer()
2432 spin_lock_irqsave(&port->lock, flags); in ftdi_prepare_write_buffer()
2433 for (i = 0; i < size - 1; i += priv->max_packet_size) { in ftdi_prepare_write_buffer()
2434 len = min_t(int, size - i, priv->max_packet_size) - 1; in ftdi_prepare_write_buffer()
2435 c = kfifo_out(&port->write_fifo, &buffer[i + 1], len); in ftdi_prepare_write_buffer()
2438 port->icount.tx += c; in ftdi_prepare_write_buffer()
2442 spin_unlock_irqrestore(&port->lock, flags); in ftdi_prepare_write_buffer()
2444 count = kfifo_out_locked(&port->write_fifo, dest, size, in ftdi_prepare_write_buffer()
2445 &port->lock); in ftdi_prepare_write_buffer()
2446 port->icount.tx += count; in ftdi_prepare_write_buffer()
2463 dev_dbg(&port->dev, "malformed packet\n"); in ftdi_process_packet()
2471 if (status != priv->prev_status) { in ftdi_process_packet()
2472 char diff_status = status ^ priv->prev_status; in ftdi_process_packet()
2475 port->icount.cts++; in ftdi_process_packet()
2477 port->icount.dsr++; in ftdi_process_packet()
2479 port->icount.rng++; in ftdi_process_packet()
2483 port->icount.dcd++; in ftdi_process_packet()
2484 tty = tty_port_tty_get(&port->port); in ftdi_process_packet()
2491 wake_up_interruptible(&port->port.delta_msr_wait); in ftdi_process_packet()
2492 priv->prev_status = status; in ftdi_process_packet()
2497 priv->transmit_empty = 1; in ftdi_process_packet()
2499 priv->transmit_empty = 0; in ftdi_process_packet()
2506 * data payload to avoid over-reporting. in ftdi_process_packet()
2516 if (buf[1] & FTDI_RS_BI && buf[len - 1] == '\0') { in ftdi_process_packet()
2517 port->icount.brk++; in ftdi_process_packet()
2522 port->icount.parity++; in ftdi_process_packet()
2525 port->icount.frame++; in ftdi_process_packet()
2529 port->icount.overrun++; in ftdi_process_packet()
2530 tty_insert_flip_char(&port->port, 0, TTY_OVERRUN); in ftdi_process_packet()
2534 port->icount.rx += len - 2; in ftdi_process_packet()
2536 if (brkint || port->sysrq) { in ftdi_process_packet()
2538 if (brkint && i == len - 1) { in ftdi_process_packet()
2540 return len - 3; in ftdi_process_packet()
2545 tty_insert_flip_char(&port->port, buf[i], flag); in ftdi_process_packet()
2548 tty_insert_flip_string_fixed_flag(&port->port, buf + 2, flag, in ftdi_process_packet()
2549 len - 2); in ftdi_process_packet()
2552 return len - 2; in ftdi_process_packet()
2557 struct usb_serial_port *port = urb->context; in ftdi_process_read_urb()
2559 char *data = urb->transfer_buffer; in ftdi_process_read_urb()
2564 for (i = 0; i < urb->actual_length; i += priv->max_packet_size) { in ftdi_process_read_urb()
2565 len = min_t(int, urb->actual_length - i, priv->max_packet_size); in ftdi_process_read_urb()
2570 tty_flip_buffer_push(&port->port); in ftdi_process_read_urb()
2575 struct usb_serial_port *port = tty->driver_data; in ftdi_break_ctl()
2580 /* break_state = -1 to turn on break, and 0 to turn off break */ in ftdi_break_ctl()
2585 value = priv->last_set_data_value | FTDI_SIO_SET_BREAK; in ftdi_break_ctl()
2587 value = priv->last_set_data_value; in ftdi_break_ctl()
2589 ret = usb_control_msg(port->serial->dev, in ftdi_break_ctl()
2590 usb_sndctrlpipe(port->serial->dev, 0), in ftdi_break_ctl()
2593 value, priv->channel, in ftdi_break_ctl()
2596 dev_err(&port->dev, "%s FAILED to enable/disable break state (state was %d)\n", in ftdi_break_ctl()
2601 dev_dbg(&port->dev, "%s break state is %d - urb is %d\n", __func__, in ftdi_break_ctl()
2621 /* old_termios contains the original termios settings and tty->termios contains
2629 struct usb_device *dev = port->serial->dev; in ftdi_set_termios()
2630 struct device *ddev = &port->dev; in ftdi_set_termios()
2632 struct ktermios *termios = &tty->termios; in ftdi_set_termios()
2639 if (priv->force_baud && ((termios->c_cflag & CBAUD) != B0)) { in ftdi_set_termios()
2641 tty_encode_baud_rate(tty, priv->force_baud, in ftdi_set_termios()
2642 priv->force_baud); in ftdi_set_termios()
2645 /* Force RTS-CTS if this device requires it. */ in ftdi_set_termios()
2646 if (priv->force_rtscts) { in ftdi_set_termios()
2648 termios->c_cflag |= CRTSCTS; in ftdi_set_termios()
2668 termios->c_cflag &= ~CSIZE; in ftdi_set_termios()
2670 termios->c_cflag |= old_termios->c_cflag & CSIZE; in ftdi_set_termios()
2672 termios->c_cflag |= CS8; in ftdi_set_termios()
2675 cflag = termios->c_cflag; in ftdi_set_termios()
2680 if (old_termios->c_cflag == termios->c_cflag in ftdi_set_termios()
2681 && old_termios->c_ispeed == termios->c_ispeed in ftdi_set_termios()
2682 && old_termios->c_ospeed == termios->c_ospeed) in ftdi_set_termios()
2686 ftdi_sio_read_bulk_callback - need to examine what this means - in ftdi_set_termios()
2689 if ((old_termios->c_cflag & (CSIZE|PARODD|PARENB|CMSPAR|CSTOPB)) == in ftdi_set_termios()
2690 (termios->c_cflag & (CSIZE|PARODD|PARENB|CMSPAR|CSTOPB))) in ftdi_set_termios()
2727 - but is or'ed with this value */ in ftdi_set_termios()
2728 priv->last_set_data_value = value; in ftdi_set_termios()
2733 value, priv->channel, in ftdi_set_termios()
2746 0, priv->channel, in ftdi_set_termios()
2755 mutex_lock(&priv->cfg_lock); in ftdi_set_termios()
2758 mutex_unlock(&priv->cfg_lock); in ftdi_set_termios()
2760 if (old_termios && (old_termios->c_cflag & CBAUD) == B0) in ftdi_set_termios()
2765 /* Set hardware-assisted flow control */ in ftdi_set_termios()
2769 dev_dbg(&port->dev, "enabling rts/cts flow control\n"); in ftdi_set_termios()
2772 dev_dbg(&port->dev, "enabling xon/xoff flow control\n"); in ftdi_set_termios()
2776 dev_dbg(&port->dev, "disabling flow control\n"); in ftdi_set_termios()
2780 index |= priv->channel; in ftdi_set_termios()
2787 dev_err(&port->dev, "failed to set flow control: %d\n", ret); in ftdi_set_termios()
2791 * Get modem-control status.
2806 return -ENOMEM; in ftdi_get_modem_status()
2811 if (priv->chip_type == SIO) in ftdi_get_modem_status()
2816 ret = usb_control_msg(port->serial->dev, in ftdi_get_modem_status()
2817 usb_rcvctrlpipe(port->serial->dev, 0), in ftdi_get_modem_status()
2820 0, priv->channel, in ftdi_get_modem_status()
2825 dev_err(&port->dev, "failed to get modem status: %d\n", ret); in ftdi_get_modem_status()
2827 ret = -EIO; in ftdi_get_modem_status()
2838 dev_dbg(&port->dev, "%s - 0x%02x%02x\n", __func__, status[0], in ftdi_get_modem_status()
2848 struct usb_serial_port *port = tty->driver_data; in ftdi_tiocmget()
2861 priv->last_dtr_rts; in ftdi_tiocmget()
2869 struct usb_serial_port *port = tty->driver_data; in ftdi_tiocmset()
2877 struct usb_serial_port *port = tty->driver_data; in ftdi_ioctl()
2887 return -ENOIOCTLCMD; in ftdi_ioctl()
2931 MODULE_PARM_DESC(ndi_latency_timer, "NDI device latency timer override");