Merge tag 'tty-3.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
Pull tty/serial patches from Greg Kroah-Hartman: "Here's the big tty/serial driver patches for 3.9-rc1. More tty port rework and fixes from Jiri here, as well as lots of individual serial driver updates and fixes. All of these have been in the linux-next tree for a while." * tag 'tty-3.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: (140 commits) tty: mxser: improve error handling in mxser_probe() and mxser_module_init() serial: imx: fix uninitialized variable warning serial: tegra: assume CONFIG_OF TTY: do not update atime/mtime on read/write lguest: select CONFIG_TTY to build properly. ARM defconfigs: add missing inclusions of linux/platform_device.h fb/exynos: include platform_device.h ARM: sa1100/assabet: include platform_device.h directly serial: imx: Fix recursive locking bug pps: Fix build breakage from decoupling pps from tty tty: Remove ancient hardpps() pps: Additional cleanups in uart_handle_dcd_change pps: Move timestamp read into PPS code proper pps: Don't crash the machine when exiting will do pps: Fix a use-after free bug when unregistering a source. pps: Use pps_lookup_dev to reduce ldisc coupling pps: Add pps_lookup_dev() function tty: serial: uartlite: Support uartlite on big and little endian systems tty: serial: uartlite: Fix sparse and checkpatch warnings serial/arc-uart: Miscll DT related updates (Grant's review comments) ... Fix up trivial conflicts, mostly just due to the TTY config option clashing with the EXPERIMENTAL removal.
This commit is contained in:
@@ -6,7 +6,7 @@ comment "USB Device Class drivers"
|
||||
|
||||
config USB_ACM
|
||||
tristate "USB Modem (CDC ACM) support"
|
||||
depends on USB
|
||||
depends on USB && TTY
|
||||
---help---
|
||||
This driver supports USB modems and ISDN adapters which support the
|
||||
Communication Device Class Abstract Control Model interface.
|
||||
|
@@ -410,19 +410,12 @@ static int acm_submit_read_urbs(struct acm *acm, gfp_t mem_flags)
|
||||
|
||||
static void acm_process_read_urb(struct acm *acm, struct urb *urb)
|
||||
{
|
||||
struct tty_struct *tty;
|
||||
|
||||
if (!urb->actual_length)
|
||||
return;
|
||||
|
||||
tty = tty_port_tty_get(&acm->port);
|
||||
if (!tty)
|
||||
return;
|
||||
|
||||
tty_insert_flip_string(tty, urb->transfer_buffer, urb->actual_length);
|
||||
tty_flip_buffer_push(tty);
|
||||
|
||||
tty_kref_put(tty);
|
||||
tty_insert_flip_string(&acm->port, urb->transfer_buffer,
|
||||
urb->actual_length);
|
||||
tty_flip_buffer_push(&acm->port);
|
||||
}
|
||||
|
||||
static void acm_read_bulk_callback(struct urb *urb)
|
||||
|
@@ -762,6 +762,7 @@ config USB_GADGET_TARGET
|
||||
|
||||
config USB_G_SERIAL
|
||||
tristate "Serial Gadget (with CDC ACM and CDC OBEX support)"
|
||||
depends on TTY
|
||||
select USB_U_SERIAL
|
||||
select USB_F_ACM
|
||||
select USB_LIBCOMPOSITE
|
||||
@@ -813,6 +814,8 @@ config USB_G_PRINTER
|
||||
For more information, see Documentation/usb/gadget_printer.txt
|
||||
which includes sample code for accessing the device file.
|
||||
|
||||
if TTY
|
||||
|
||||
config USB_CDC_COMPOSITE
|
||||
tristate "CDC Composite Device (Ethernet and ACM)"
|
||||
depends on NET
|
||||
@@ -900,6 +903,8 @@ config USB_G_MULTI_CDC
|
||||
|
||||
If unsure, say "y".
|
||||
|
||||
endif # TTY
|
||||
|
||||
config USB_G_HID
|
||||
tristate "HID Gadget"
|
||||
select USB_LIBCOMPOSITE
|
||||
@@ -916,6 +921,7 @@ config USB_G_HID
|
||||
# Standalone / single function gadgets
|
||||
config USB_G_DBGP
|
||||
tristate "EHCI Debug Device Gadget"
|
||||
depends on TTY
|
||||
select USB_LIBCOMPOSITE
|
||||
help
|
||||
This gadget emulates an EHCI Debug device. This is useful when you want
|
||||
|
@@ -496,12 +496,8 @@ static void gs_rx_push(unsigned long _port)
|
||||
|
||||
req = list_first_entry(queue, struct usb_request, list);
|
||||
|
||||
/* discard data if tty was closed */
|
||||
if (!tty)
|
||||
goto recycle;
|
||||
|
||||
/* leave data queued if tty was rx throttled */
|
||||
if (test_bit(TTY_THROTTLED, &tty->flags))
|
||||
if (tty && test_bit(TTY_THROTTLED, &tty->flags))
|
||||
break;
|
||||
|
||||
switch (req->status) {
|
||||
@@ -534,7 +530,8 @@ static void gs_rx_push(unsigned long _port)
|
||||
size -= n;
|
||||
}
|
||||
|
||||
count = tty_insert_flip_string(tty, packet, size);
|
||||
count = tty_insert_flip_string(&port->port, packet,
|
||||
size);
|
||||
if (count)
|
||||
do_push = true;
|
||||
if (count != size) {
|
||||
@@ -547,7 +544,7 @@ static void gs_rx_push(unsigned long _port)
|
||||
}
|
||||
port->n_read = 0;
|
||||
}
|
||||
recycle:
|
||||
|
||||
list_move(&req->list, &port->read_pool);
|
||||
port->read_started--;
|
||||
}
|
||||
@@ -555,8 +552,8 @@ recycle:
|
||||
/* Push from tty to ldisc; without low_latency set this is handled by
|
||||
* a workqueue, so we won't get callbacks and can hold port_lock
|
||||
*/
|
||||
if (tty && do_push)
|
||||
tty_flip_buffer_push(tty);
|
||||
if (do_push)
|
||||
tty_flip_buffer_push(&port->port);
|
||||
|
||||
|
||||
/* We want our data queue to become empty ASAP, keeping data
|
||||
|
@@ -4,7 +4,7 @@
|
||||
|
||||
menuconfig USB_SERIAL
|
||||
tristate "USB Serial Converter support"
|
||||
depends on USB
|
||||
depends on USB && TTY
|
||||
---help---
|
||||
Say Y here if you have a USB device that provides normal serial
|
||||
ports, or acts like a serial device, and you want to connect it to
|
||||
|
@@ -119,9 +119,8 @@ static int aircable_probe(struct usb_serial *serial,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int aircable_process_packet(struct tty_struct *tty,
|
||||
struct usb_serial_port *port, int has_headers,
|
||||
char *packet, int len)
|
||||
static int aircable_process_packet(struct usb_serial_port *port,
|
||||
int has_headers, char *packet, int len)
|
||||
{
|
||||
if (has_headers) {
|
||||
len -= HCI_HEADER_LENGTH;
|
||||
@@ -132,7 +131,7 @@ static int aircable_process_packet(struct tty_struct *tty,
|
||||
return 0;
|
||||
}
|
||||
|
||||
tty_insert_flip_string(tty, packet, len);
|
||||
tty_insert_flip_string(&port->port, packet, len);
|
||||
|
||||
return len;
|
||||
}
|
||||
@@ -141,28 +140,22 @@ static void aircable_process_read_urb(struct urb *urb)
|
||||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
char *data = (char *)urb->transfer_buffer;
|
||||
struct tty_struct *tty;
|
||||
int has_headers;
|
||||
int count;
|
||||
int len;
|
||||
int i;
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (!tty)
|
||||
return;
|
||||
|
||||
has_headers = (urb->actual_length > 2 && data[0] == RX_HEADER_0);
|
||||
|
||||
count = 0;
|
||||
for (i = 0; i < urb->actual_length; i += HCI_COMPLETE_FRAME) {
|
||||
len = min_t(int, urb->actual_length - i, HCI_COMPLETE_FRAME);
|
||||
count += aircable_process_packet(tty, port, has_headers,
|
||||
count += aircable_process_packet(port, has_headers,
|
||||
&data[i], len);
|
||||
}
|
||||
|
||||
if (count)
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_kref_put(tty);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
|
||||
static struct usb_serial_driver aircable_device = {
|
||||
|
@@ -674,7 +674,6 @@ static void ark3116_process_read_urb(struct urb *urb)
|
||||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
struct ark3116_private *priv = usb_get_serial_port_data(port);
|
||||
struct tty_struct *tty;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
char tty_flag = TTY_NORMAL;
|
||||
unsigned long flags;
|
||||
@@ -689,10 +688,6 @@ static void ark3116_process_read_urb(struct urb *urb)
|
||||
if (!urb->actual_length)
|
||||
return;
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (!tty)
|
||||
return;
|
||||
|
||||
if (lsr & UART_LSR_BRK_ERROR_BITS) {
|
||||
if (lsr & UART_LSR_BI)
|
||||
tty_flag = TTY_BREAK;
|
||||
@@ -703,12 +698,11 @@ static void ark3116_process_read_urb(struct urb *urb)
|
||||
|
||||
/* overrun is special, not associated with a char */
|
||||
if (lsr & UART_LSR_OE)
|
||||
tty_insert_flip_char(tty, 0, TTY_OVERRUN);
|
||||
tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
|
||||
}
|
||||
tty_insert_flip_string_fixed_flag(tty, data, tty_flag,
|
||||
tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,
|
||||
urb->actual_length);
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_kref_put(tty);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
|
||||
static struct usb_serial_driver ark3116_device = {
|
||||
|
@@ -242,7 +242,6 @@ static void belkin_sa_process_read_urb(struct urb *urb)
|
||||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
struct belkin_sa_private *priv = usb_get_serial_port_data(port);
|
||||
struct tty_struct *tty;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
unsigned long flags;
|
||||
unsigned char status;
|
||||
@@ -259,10 +258,6 @@ static void belkin_sa_process_read_urb(struct urb *urb)
|
||||
if (!urb->actual_length)
|
||||
return;
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (!tty)
|
||||
return;
|
||||
|
||||
if (status & BELKIN_SA_LSR_ERR) {
|
||||
/* Break takes precedence over parity, which takes precedence
|
||||
* over framing errors. */
|
||||
@@ -276,13 +271,12 @@ static void belkin_sa_process_read_urb(struct urb *urb)
|
||||
|
||||
/* Overrun is special, not associated with a char. */
|
||||
if (status & BELKIN_SA_LSR_OE)
|
||||
tty_insert_flip_char(tty, 0, TTY_OVERRUN);
|
||||
tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
|
||||
}
|
||||
|
||||
tty_insert_flip_string_fixed_flag(tty, data, tty_flag,
|
||||
tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,
|
||||
urb->actual_length);
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_kref_put(tty);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
|
||||
static void belkin_sa_set_termios(struct tty_struct *tty,
|
||||
|
@@ -324,7 +324,6 @@ static void cyberjack_read_bulk_callback(struct urb *urb)
|
||||
struct usb_serial_port *port = urb->context;
|
||||
struct cyberjack_private *priv = usb_get_serial_port_data(port);
|
||||
struct device *dev = &port->dev;
|
||||
struct tty_struct *tty;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
short todo;
|
||||
int result;
|
||||
@@ -337,16 +336,10 @@ static void cyberjack_read_bulk_callback(struct urb *urb)
|
||||
return;
|
||||
}
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (!tty) {
|
||||
dev_dbg(dev, "%s - ignoring since device not open\n", __func__);
|
||||
return;
|
||||
}
|
||||
if (urb->actual_length) {
|
||||
tty_insert_flip_string(tty, data, urb->actual_length);
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_insert_flip_string(&port->port, data, urb->actual_length);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
tty_kref_put(tty);
|
||||
|
||||
spin_lock(&priv->lock);
|
||||
|
||||
|
@@ -1214,10 +1214,10 @@ static void cypress_read_int_callback(struct urb *urb)
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
/* process read if there is data other than line status */
|
||||
if (tty && bytes > i) {
|
||||
tty_insert_flip_string_fixed_flag(tty, data + i,
|
||||
if (bytes > i) {
|
||||
tty_insert_flip_string_fixed_flag(&port->port, data + i,
|
||||
tty_flag, bytes - i);
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
|
@@ -1399,9 +1399,7 @@ static void digi_read_bulk_callback(struct urb *urb)
|
||||
|
||||
static int digi_read_inb_callback(struct urb *urb)
|
||||
{
|
||||
|
||||
struct usb_serial_port *port = urb->context;
|
||||
struct tty_struct *tty;
|
||||
struct digi_port *priv = usb_get_serial_port_data(port);
|
||||
int opcode = ((unsigned char *)urb->transfer_buffer)[0];
|
||||
int len = ((unsigned char *)urb->transfer_buffer)[1];
|
||||
@@ -1425,7 +1423,6 @@ static int digi_read_inb_callback(struct urb *urb)
|
||||
return -1;
|
||||
}
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
spin_lock(&priv->dp_port_lock);
|
||||
|
||||
/* check for throttle; if set, do not resubmit read urb */
|
||||
@@ -1435,13 +1432,13 @@ static int digi_read_inb_callback(struct urb *urb)
|
||||
priv->dp_throttle_restart = 1;
|
||||
|
||||
/* receive data */
|
||||
if (tty && opcode == DIGI_CMD_RECEIVE_DATA) {
|
||||
if (opcode == DIGI_CMD_RECEIVE_DATA) {
|
||||
/* get flag from port_status */
|
||||
flag = 0;
|
||||
|
||||
/* overrun is special, not associated with a char */
|
||||
if (port_status & DIGI_OVERRUN_ERROR)
|
||||
tty_insert_flip_char(tty, 0, TTY_OVERRUN);
|
||||
tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
|
||||
|
||||
/* break takes precedence over parity, */
|
||||
/* which takes precedence over framing errors */
|
||||
@@ -1455,13 +1452,12 @@ static int digi_read_inb_callback(struct urb *urb)
|
||||
/* data length is len-1 (one byte of len is port_status) */
|
||||
--len;
|
||||
if (len > 0) {
|
||||
tty_insert_flip_string_fixed_flag(tty, data, flag,
|
||||
len);
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_insert_flip_string_fixed_flag(&port->port, data,
|
||||
flag, len);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
}
|
||||
spin_unlock(&priv->dp_port_lock);
|
||||
tty_kref_put(tty);
|
||||
|
||||
if (opcode == DIGI_CMD_RECEIVE_DISABLE)
|
||||
dev_dbg(&port->dev, "%s: got RECEIVE_DISABLE\n", __func__);
|
||||
|
@@ -100,7 +100,6 @@ static void f81232_process_read_urb(struct urb *urb)
|
||||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
struct f81232_private *priv = usb_get_serial_port_data(port);
|
||||
struct tty_struct *tty;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
char tty_flag = TTY_NORMAL;
|
||||
unsigned long flags;
|
||||
@@ -117,10 +116,6 @@ static void f81232_process_read_urb(struct urb *urb)
|
||||
if (!urb->actual_length)
|
||||
return;
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (!tty)
|
||||
return;
|
||||
|
||||
/* break takes precedence over parity, */
|
||||
/* which takes precedence over framing errors */
|
||||
if (line_status & UART_BREAK_ERROR)
|
||||
@@ -133,19 +128,19 @@ static void f81232_process_read_urb(struct urb *urb)
|
||||
|
||||
/* overrun is special, not associated with a char */
|
||||
if (line_status & UART_OVERRUN_ERROR)
|
||||
tty_insert_flip_char(tty, 0, TTY_OVERRUN);
|
||||
tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
|
||||
|
||||
if (port->port.console && port->sysrq) {
|
||||
for (i = 0; i < urb->actual_length; ++i)
|
||||
if (!usb_serial_handle_sysrq_char(port, data[i]))
|
||||
tty_insert_flip_char(tty, data[i], tty_flag);
|
||||
tty_insert_flip_char(&port->port, data[i],
|
||||
tty_flag);
|
||||
} else {
|
||||
tty_insert_flip_string_fixed_flag(tty, data, tty_flag,
|
||||
tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,
|
||||
urb->actual_length);
|
||||
}
|
||||
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_kref_put(tty);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
|
||||
static int set_control_lines(struct usb_device *dev, u8 value)
|
||||
|
@@ -1960,9 +1960,8 @@ static int ftdi_prepare_write_buffer(struct usb_serial_port *port,
|
||||
|
||||
#define FTDI_RS_ERR_MASK (FTDI_RS_BI | FTDI_RS_PE | FTDI_RS_FE | FTDI_RS_OE)
|
||||
|
||||
static int ftdi_process_packet(struct tty_struct *tty,
|
||||
struct usb_serial_port *port, struct ftdi_private *priv,
|
||||
char *packet, int len)
|
||||
static int ftdi_process_packet(struct usb_serial_port *port,
|
||||
struct ftdi_private *priv, char *packet, int len)
|
||||
{
|
||||
int i;
|
||||
char status;
|
||||
@@ -2012,7 +2011,7 @@ static int ftdi_process_packet(struct tty_struct *tty,
|
||||
/* Overrun is special, not associated with a char */
|
||||
if (packet[1] & FTDI_RS_OE) {
|
||||
priv->icount.overrun++;
|
||||
tty_insert_flip_char(tty, 0, TTY_OVERRUN);
|
||||
tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2031,10 +2030,10 @@ static int ftdi_process_packet(struct tty_struct *tty,
|
||||
if (port->port.console && port->sysrq) {
|
||||
for (i = 0; i < len; i++, ch++) {
|
||||
if (!usb_serial_handle_sysrq_char(port, *ch))
|
||||
tty_insert_flip_char(tty, *ch, flag);
|
||||
tty_insert_flip_char(&port->port, *ch, flag);
|
||||
}
|
||||
} else {
|
||||
tty_insert_flip_string_fixed_flag(tty, ch, flag, len);
|
||||
tty_insert_flip_string_fixed_flag(&port->port, ch, flag, len);
|
||||
}
|
||||
|
||||
return len;
|
||||
@@ -2043,25 +2042,19 @@ static int ftdi_process_packet(struct tty_struct *tty,
|
||||
static void ftdi_process_read_urb(struct urb *urb)
|
||||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
struct tty_struct *tty;
|
||||
struct ftdi_private *priv = usb_get_serial_port_data(port);
|
||||
char *data = (char *)urb->transfer_buffer;
|
||||
int i;
|
||||
int len;
|
||||
int count = 0;
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (!tty)
|
||||
return;
|
||||
|
||||
for (i = 0; i < urb->actual_length; i += priv->max_packet_size) {
|
||||
len = min_t(int, urb->actual_length - i, priv->max_packet_size);
|
||||
count += ftdi_process_packet(tty, port, priv, &data[i], len);
|
||||
count += ftdi_process_packet(port, priv, &data[i], len);
|
||||
}
|
||||
|
||||
if (count)
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_kref_put(tty);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
|
||||
static void ftdi_break_ctl(struct tty_struct *tty, int break_state)
|
||||
|
@@ -252,14 +252,11 @@ static inline int isAbortTrfCmnd(const unsigned char *buf)
|
||||
static void send_to_tty(struct usb_serial_port *port,
|
||||
char *data, unsigned int actual_length)
|
||||
{
|
||||
struct tty_struct *tty = tty_port_tty_get(&port->port);
|
||||
|
||||
if (tty && actual_length) {
|
||||
if (actual_length) {
|
||||
usb_serial_debug_data(&port->dev, __func__, actual_length, data);
|
||||
tty_insert_flip_string(tty, data, actual_length);
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_insert_flip_string(&port->port, data, actual_length);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -313,30 +313,24 @@ EXPORT_SYMBOL_GPL(usb_serial_generic_submit_read_urbs);
|
||||
void usb_serial_generic_process_read_urb(struct urb *urb)
|
||||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
struct tty_struct *tty;
|
||||
char *ch = (char *)urb->transfer_buffer;
|
||||
int i;
|
||||
|
||||
if (!urb->actual_length)
|
||||
return;
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (!tty)
|
||||
return;
|
||||
|
||||
/* The per character mucking around with sysrq path it too slow for
|
||||
stuff like 3G modems, so shortcircuit it in the 99.9999999% of cases
|
||||
where the USB serial is not a console anyway */
|
||||
if (!port->port.console || !port->sysrq)
|
||||
tty_insert_flip_string(tty, ch, urb->actual_length);
|
||||
tty_insert_flip_string(&port->port, ch, urb->actual_length);
|
||||
else {
|
||||
for (i = 0; i < urb->actual_length; i++, ch++) {
|
||||
if (!usb_serial_handle_sysrq_char(port, *ch))
|
||||
tty_insert_flip_char(tty, *ch, TTY_NORMAL);
|
||||
tty_insert_flip_char(&port->port, *ch, TTY_NORMAL);
|
||||
}
|
||||
}
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_kref_put(tty);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(usb_serial_generic_process_read_urb);
|
||||
|
||||
|
@@ -232,8 +232,8 @@ static void process_rcvd_data(struct edgeport_serial *edge_serial,
|
||||
unsigned char *buffer, __u16 bufferLength);
|
||||
static void process_rcvd_status(struct edgeport_serial *edge_serial,
|
||||
__u8 byte2, __u8 byte3);
|
||||
static void edge_tty_recv(struct device *dev, struct tty_struct *tty,
|
||||
unsigned char *data, int length);
|
||||
static void edge_tty_recv(struct usb_serial_port *port, unsigned char *data,
|
||||
int length);
|
||||
static void handle_new_msr(struct edgeport_port *edge_port, __u8 newMsr);
|
||||
static void handle_new_lsr(struct edgeport_port *edge_port, __u8 lsrData,
|
||||
__u8 lsr, __u8 data);
|
||||
@@ -1752,7 +1752,6 @@ static void process_rcvd_data(struct edgeport_serial *edge_serial,
|
||||
struct device *dev = &edge_serial->serial->dev->dev;
|
||||
struct usb_serial_port *port;
|
||||
struct edgeport_port *edge_port;
|
||||
struct tty_struct *tty;
|
||||
__u16 lastBufferLength;
|
||||
__u16 rxLen;
|
||||
|
||||
@@ -1860,14 +1859,11 @@ static void process_rcvd_data(struct edgeport_serial *edge_serial,
|
||||
edge_serial->rxPort];
|
||||
edge_port = usb_get_serial_port_data(port);
|
||||
if (edge_port->open) {
|
||||
tty = tty_port_tty_get(
|
||||
&edge_port->port->port);
|
||||
if (tty) {
|
||||
dev_dbg(dev, "%s - Sending %d bytes to TTY for port %d\n",
|
||||
__func__, rxLen, edge_serial->rxPort);
|
||||
edge_tty_recv(&edge_serial->serial->dev->dev, tty, buffer, rxLen);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
dev_dbg(dev, "%s - Sending %d bytes to TTY for port %d\n",
|
||||
__func__, rxLen,
|
||||
edge_serial->rxPort);
|
||||
edge_tty_recv(edge_port->port, buffer,
|
||||
rxLen);
|
||||
edge_port->icount.rx += rxLen;
|
||||
}
|
||||
buffer += rxLen;
|
||||
@@ -2017,20 +2013,20 @@ static void process_rcvd_status(struct edgeport_serial *edge_serial,
|
||||
* edge_tty_recv
|
||||
* this function passes data on to the tty flip buffer
|
||||
*****************************************************************************/
|
||||
static void edge_tty_recv(struct device *dev, struct tty_struct *tty,
|
||||
unsigned char *data, int length)
|
||||
static void edge_tty_recv(struct usb_serial_port *port, unsigned char *data,
|
||||
int length)
|
||||
{
|
||||
int cnt;
|
||||
|
||||
cnt = tty_insert_flip_string(tty, data, length);
|
||||
cnt = tty_insert_flip_string(&port->port, data, length);
|
||||
if (cnt < length) {
|
||||
dev_err(dev, "%s - dropping data, %d bytes lost\n",
|
||||
dev_err(&port->dev, "%s - dropping data, %d bytes lost\n",
|
||||
__func__, length - cnt);
|
||||
}
|
||||
data += cnt;
|
||||
length -= cnt;
|
||||
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
|
||||
|
||||
@@ -2086,14 +2082,9 @@ static void handle_new_lsr(struct edgeport_port *edge_port, __u8 lsrData,
|
||||
}
|
||||
|
||||
/* Place LSR data byte into Rx buffer */
|
||||
if (lsrData) {
|
||||
struct tty_struct *tty =
|
||||
tty_port_tty_get(&edge_port->port->port);
|
||||
if (tty) {
|
||||
edge_tty_recv(&edge_port->port->dev, tty, &data, 1);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
}
|
||||
if (lsrData)
|
||||
edge_tty_recv(edge_port->port, &data, 1);
|
||||
|
||||
/* update input line counters */
|
||||
icount = &edge_port->icount;
|
||||
if (newLsr & LSR_BREAK)
|
||||
|
@@ -201,8 +201,8 @@ static int closing_wait = EDGE_CLOSING_WAIT;
|
||||
static bool ignore_cpu_rev;
|
||||
static int default_uart_mode; /* RS232 */
|
||||
|
||||
static void edge_tty_recv(struct device *dev, struct tty_struct *tty,
|
||||
unsigned char *data, int length);
|
||||
static void edge_tty_recv(struct usb_serial_port *port, unsigned char *data,
|
||||
int length);
|
||||
|
||||
static void stop_read(struct edgeport_port *edge_port);
|
||||
static int restart_read(struct edgeport_port *edge_port);
|
||||
@@ -1484,7 +1484,6 @@ static void handle_new_lsr(struct edgeport_port *edge_port, int lsr_data,
|
||||
struct async_icount *icount;
|
||||
__u8 new_lsr = (__u8)(lsr & (__u8)(LSR_OVER_ERR | LSR_PAR_ERR |
|
||||
LSR_FRM_ERR | LSR_BREAK));
|
||||
struct tty_struct *tty;
|
||||
|
||||
dev_dbg(&edge_port->port->dev, "%s - %02x\n", __func__, new_lsr);
|
||||
|
||||
@@ -1498,13 +1497,8 @@ static void handle_new_lsr(struct edgeport_port *edge_port, int lsr_data,
|
||||
new_lsr &= (__u8)(LSR_OVER_ERR | LSR_BREAK);
|
||||
|
||||
/* Place LSR data byte into Rx buffer */
|
||||
if (lsr_data) {
|
||||
tty = tty_port_tty_get(&edge_port->port->port);
|
||||
if (tty) {
|
||||
edge_tty_recv(&edge_port->port->dev, tty, &data, 1);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
}
|
||||
if (lsr_data)
|
||||
edge_tty_recv(edge_port->port, &data, 1);
|
||||
|
||||
/* update input line counters */
|
||||
icount = &edge_port->icount;
|
||||
@@ -1620,7 +1614,6 @@ static void edge_bulk_in_callback(struct urb *urb)
|
||||
struct edgeport_port *edge_port = urb->context;
|
||||
struct device *dev = &edge_port->port->dev;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
struct tty_struct *tty;
|
||||
int retval = 0;
|
||||
int port_number;
|
||||
int status = urb->status;
|
||||
@@ -1659,17 +1652,16 @@ static void edge_bulk_in_callback(struct urb *urb)
|
||||
++data;
|
||||
}
|
||||
|
||||
tty = tty_port_tty_get(&edge_port->port->port);
|
||||
if (tty && urb->actual_length) {
|
||||
if (urb->actual_length) {
|
||||
usb_serial_debug_data(dev, __func__, urb->actual_length, data);
|
||||
if (edge_port->close_pending)
|
||||
dev_dbg(dev, "%s - close pending, dropping data on the floor\n",
|
||||
__func__);
|
||||
else
|
||||
edge_tty_recv(dev, tty, data, urb->actual_length);
|
||||
edge_tty_recv(edge_port->port, data,
|
||||
urb->actual_length);
|
||||
edge_port->icount.rx += urb->actual_length;
|
||||
}
|
||||
tty_kref_put(tty);
|
||||
|
||||
exit:
|
||||
/* continue read unless stopped */
|
||||
@@ -1684,16 +1676,16 @@ exit:
|
||||
dev_err(dev, "%s - usb_submit_urb failed with result %d\n", __func__, retval);
|
||||
}
|
||||
|
||||
static void edge_tty_recv(struct device *dev, struct tty_struct *tty,
|
||||
unsigned char *data, int length)
|
||||
static void edge_tty_recv(struct usb_serial_port *port, unsigned char *data,
|
||||
int length)
|
||||
{
|
||||
int queued;
|
||||
|
||||
queued = tty_insert_flip_string(tty, data, length);
|
||||
queued = tty_insert_flip_string(&port->port, data, length);
|
||||
if (queued < length)
|
||||
dev_err(dev, "%s - dropping data, %d bytes lost\n",
|
||||
dev_err(&port->dev, "%s - dropping data, %d bytes lost\n",
|
||||
__func__, length - queued);
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
|
||||
static void edge_bulk_out_callback(struct urb *urb)
|
||||
|
@@ -287,7 +287,6 @@ static void ir_process_read_urb(struct urb *urb)
|
||||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
struct tty_struct *tty;
|
||||
|
||||
if (!urb->actual_length)
|
||||
return;
|
||||
@@ -302,12 +301,8 @@ static void ir_process_read_urb(struct urb *urb)
|
||||
if (urb->actual_length == 1)
|
||||
return;
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (!tty)
|
||||
return;
|
||||
tty_insert_flip_string(tty, data + 1, urb->actual_length - 1);
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_kref_put(tty);
|
||||
tty_insert_flip_string(&port->port, data + 1, urb->actual_length - 1);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
|
||||
static void ir_set_termios_callback(struct urb *urb)
|
||||
|
@@ -581,7 +581,6 @@ static void read_buf_callback(struct urb *urb)
|
||||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
struct tty_struct *tty;
|
||||
int status = urb->status;
|
||||
|
||||
if (status) {
|
||||
@@ -592,14 +591,12 @@ static void read_buf_callback(struct urb *urb)
|
||||
}
|
||||
|
||||
dev_dbg(&port->dev, "%s - %i chars to write\n", __func__, urb->actual_length);
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (data == NULL)
|
||||
dev_dbg(&port->dev, "%s - data is NULL !!!\n", __func__);
|
||||
if (tty && urb->actual_length && data) {
|
||||
tty_insert_flip_string(tty, data, urb->actual_length);
|
||||
tty_flip_buffer_push(tty);
|
||||
if (urb->actual_length && data) {
|
||||
tty_insert_flip_string(&port->port, data, urb->actual_length);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
tty_kref_put(tty);
|
||||
iuu_led_activity_on(urb);
|
||||
}
|
||||
|
||||
|
@@ -291,7 +291,6 @@ static void usa26_indat_callback(struct urb *urb)
|
||||
int i, err;
|
||||
int endpoint;
|
||||
struct usb_serial_port *port;
|
||||
struct tty_struct *tty;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
int status = urb->status;
|
||||
|
||||
@@ -304,8 +303,7 @@ static void usa26_indat_callback(struct urb *urb)
|
||||
}
|
||||
|
||||
port = urb->context;
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (tty && urb->actual_length) {
|
||||
if (urb->actual_length) {
|
||||
/* 0x80 bit is error flag */
|
||||
if ((data[0] & 0x80) == 0) {
|
||||
/* no errors on individual bytes, only
|
||||
@@ -315,7 +313,7 @@ static void usa26_indat_callback(struct urb *urb)
|
||||
else
|
||||
err = 0;
|
||||
for (i = 1; i < urb->actual_length ; ++i)
|
||||
tty_insert_flip_char(tty, data[i], err);
|
||||
tty_insert_flip_char(&port->port, data[i], err);
|
||||
} else {
|
||||
/* some bytes had errors, every byte has status */
|
||||
dev_dbg(&port->dev, "%s - RX error!!!!\n", __func__);
|
||||
@@ -328,12 +326,12 @@ static void usa26_indat_callback(struct urb *urb)
|
||||
if (stat & RXERROR_PARITY)
|
||||
flag |= TTY_PARITY;
|
||||
/* XXX should handle break (0x10) */
|
||||
tty_insert_flip_char(tty, data[i+1], flag);
|
||||
tty_insert_flip_char(&port->port, data[i+1],
|
||||
flag);
|
||||
}
|
||||
}
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
tty_kref_put(tty);
|
||||
|
||||
/* Resubmit urb so we continue receiving */
|
||||
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
@@ -446,7 +444,6 @@ static void usa28_indat_callback(struct urb *urb)
|
||||
{
|
||||
int err;
|
||||
struct usb_serial_port *port;
|
||||
struct tty_struct *tty;
|
||||
unsigned char *data;
|
||||
struct keyspan_port_private *p_priv;
|
||||
int status = urb->status;
|
||||
@@ -469,12 +466,11 @@ static void usa28_indat_callback(struct urb *urb)
|
||||
p_priv = usb_get_serial_port_data(port);
|
||||
data = urb->transfer_buffer;
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (tty && urb->actual_length) {
|
||||
tty_insert_flip_string(tty, data, urb->actual_length);
|
||||
tty_flip_buffer_push(tty);
|
||||
if (urb->actual_length) {
|
||||
tty_insert_flip_string(&port->port, data,
|
||||
urb->actual_length);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
tty_kref_put(tty);
|
||||
|
||||
/* Resubmit urb so we continue receiving */
|
||||
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
@@ -669,7 +665,6 @@ static void usa49_indat_callback(struct urb *urb)
|
||||
int i, err;
|
||||
int endpoint;
|
||||
struct usb_serial_port *port;
|
||||
struct tty_struct *tty;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
int status = urb->status;
|
||||
|
||||
@@ -682,12 +677,11 @@ static void usa49_indat_callback(struct urb *urb)
|
||||
}
|
||||
|
||||
port = urb->context;
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (tty && urb->actual_length) {
|
||||
if (urb->actual_length) {
|
||||
/* 0x80 bit is error flag */
|
||||
if ((data[0] & 0x80) == 0) {
|
||||
/* no error on any byte */
|
||||
tty_insert_flip_string(tty, data + 1,
|
||||
tty_insert_flip_string(&port->port, data + 1,
|
||||
urb->actual_length - 1);
|
||||
} else {
|
||||
/* some bytes had errors, every byte has status */
|
||||
@@ -700,12 +694,12 @@ static void usa49_indat_callback(struct urb *urb)
|
||||
if (stat & RXERROR_PARITY)
|
||||
flag |= TTY_PARITY;
|
||||
/* XXX should handle break (0x10) */
|
||||
tty_insert_flip_char(tty, data[i+1], flag);
|
||||
tty_insert_flip_char(&port->port, data[i+1],
|
||||
flag);
|
||||
}
|
||||
}
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
tty_kref_put(tty);
|
||||
|
||||
/* Resubmit urb so we continue receiving */
|
||||
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
@@ -718,7 +712,6 @@ static void usa49wg_indat_callback(struct urb *urb)
|
||||
int i, len, x, err;
|
||||
struct usb_serial *serial;
|
||||
struct usb_serial_port *port;
|
||||
struct tty_struct *tty;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
int status = urb->status;
|
||||
|
||||
@@ -743,7 +736,6 @@ static void usa49wg_indat_callback(struct urb *urb)
|
||||
return;
|
||||
}
|
||||
port = serial->port[data[i++]];
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
len = data[i++];
|
||||
|
||||
/* 0x80 bit is error flag */
|
||||
@@ -751,7 +743,8 @@ static void usa49wg_indat_callback(struct urb *urb)
|
||||
/* no error on any byte */
|
||||
i++;
|
||||
for (x = 1; x < len ; ++x)
|
||||
tty_insert_flip_char(tty, data[i++], 0);
|
||||
tty_insert_flip_char(&port->port,
|
||||
data[i++], 0);
|
||||
} else {
|
||||
/*
|
||||
* some bytes had errors, every byte has status
|
||||
@@ -765,13 +758,12 @@ static void usa49wg_indat_callback(struct urb *urb)
|
||||
if (stat & RXERROR_PARITY)
|
||||
flag |= TTY_PARITY;
|
||||
/* XXX should handle break (0x10) */
|
||||
tty_insert_flip_char(tty,
|
||||
tty_insert_flip_char(&port->port,
|
||||
data[i+1], flag);
|
||||
i += 2;
|
||||
}
|
||||
}
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_kref_put(tty);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -792,7 +784,6 @@ static void usa90_indat_callback(struct urb *urb)
|
||||
int endpoint;
|
||||
struct usb_serial_port *port;
|
||||
struct keyspan_port_private *p_priv;
|
||||
struct tty_struct *tty;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
int status = urb->status;
|
||||
|
||||
@@ -808,12 +799,12 @@ static void usa90_indat_callback(struct urb *urb)
|
||||
p_priv = usb_get_serial_port_data(port);
|
||||
|
||||
if (urb->actual_length) {
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
/* if current mode is DMA, looks like usa28 format
|
||||
otherwise looks like usa26 data format */
|
||||
|
||||
if (p_priv->baud > 57600)
|
||||
tty_insert_flip_string(tty, data, urb->actual_length);
|
||||
tty_insert_flip_string(&port->port, data,
|
||||
urb->actual_length);
|
||||
else {
|
||||
/* 0x80 bit is error flag */
|
||||
if ((data[0] & 0x80) == 0) {
|
||||
@@ -824,8 +815,8 @@ static void usa90_indat_callback(struct urb *urb)
|
||||
else
|
||||
err = 0;
|
||||
for (i = 1; i < urb->actual_length ; ++i)
|
||||
tty_insert_flip_char(tty, data[i],
|
||||
err);
|
||||
tty_insert_flip_char(&port->port,
|
||||
data[i], err);
|
||||
} else {
|
||||
/* some bytes had errors, every byte has status */
|
||||
dev_dbg(&port->dev, "%s - RX error!!!!\n", __func__);
|
||||
@@ -838,13 +829,12 @@ static void usa90_indat_callback(struct urb *urb)
|
||||
if (stat & RXERROR_PARITY)
|
||||
flag |= TTY_PARITY;
|
||||
/* XXX should handle break (0x10) */
|
||||
tty_insert_flip_char(tty, data[i+1],
|
||||
flag);
|
||||
tty_insert_flip_char(&port->port,
|
||||
data[i+1], flag);
|
||||
}
|
||||
}
|
||||
}
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_kref_put(tty);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
|
||||
/* Resubmit urb so we continue receiving */
|
||||
|
@@ -138,7 +138,6 @@ static void keyspan_pda_request_unthrottle(struct work_struct *work)
|
||||
static void keyspan_pda_rx_interrupt(struct urb *urb)
|
||||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
struct tty_struct *tty;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
int retval;
|
||||
int status = urb->status;
|
||||
@@ -163,14 +162,12 @@ static void keyspan_pda_rx_interrupt(struct urb *urb)
|
||||
/* see if the message is data or a status interrupt */
|
||||
switch (data[0]) {
|
||||
case 0:
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
/* rest of message is rx data */
|
||||
if (tty && urb->actual_length) {
|
||||
tty_insert_flip_string(tty, data + 1,
|
||||
if (urb->actual_length) {
|
||||
tty_insert_flip_string(&port->port, data + 1,
|
||||
urb->actual_length - 1);
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
tty_kref_put(tty);
|
||||
break;
|
||||
case 1:
|
||||
/* status interrupt */
|
||||
|
@@ -389,7 +389,6 @@ static void klsi_105_process_read_urb(struct urb *urb)
|
||||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
struct tty_struct *tty;
|
||||
unsigned len;
|
||||
|
||||
/* empty urbs seem to happen, we ignore them */
|
||||
@@ -401,19 +400,14 @@ static void klsi_105_process_read_urb(struct urb *urb)
|
||||
return;
|
||||
}
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (!tty)
|
||||
return;
|
||||
|
||||
len = get_unaligned_le16(data);
|
||||
if (len > urb->actual_length - KLSI_HDR_LEN) {
|
||||
dev_dbg(&port->dev, "%s - packet length mismatch\n", __func__);
|
||||
len = urb->actual_length - KLSI_HDR_LEN;
|
||||
}
|
||||
|
||||
tty_insert_flip_string(tty, data + KLSI_HDR_LEN, len);
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_kref_put(tty);
|
||||
tty_insert_flip_string(&port->port, data + KLSI_HDR_LEN, len);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
|
||||
static void klsi_105_set_termios(struct tty_struct *tty,
|
||||
|
@@ -324,7 +324,6 @@ static void kobil_read_int_callback(struct urb *urb)
|
||||
{
|
||||
int result;
|
||||
struct usb_serial_port *port = urb->context;
|
||||
struct tty_struct *tty;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
int status = urb->status;
|
||||
|
||||
@@ -333,8 +332,7 @@ static void kobil_read_int_callback(struct urb *urb)
|
||||
return;
|
||||
}
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (tty && urb->actual_length) {
|
||||
if (urb->actual_length) {
|
||||
|
||||
/* BEGIN DEBUG */
|
||||
/*
|
||||
@@ -353,10 +351,9 @@ static void kobil_read_int_callback(struct urb *urb)
|
||||
*/
|
||||
/* END DEBUG */
|
||||
|
||||
tty_insert_flip_string(tty, data, urb->actual_length);
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_insert_flip_string(&port->port, data, urb->actual_length);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
tty_kref_put(tty);
|
||||
|
||||
result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
|
||||
dev_dbg(&port->dev, "%s - Send read URB returns: %i\n", __func__, result);
|
||||
|
@@ -527,7 +527,6 @@ static void mct_u232_read_int_callback(struct urb *urb)
|
||||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
struct mct_u232_private *priv = usb_get_serial_port_data(port);
|
||||
struct tty_struct *tty;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
int retval;
|
||||
int status = urb->status;
|
||||
@@ -557,13 +556,9 @@ static void mct_u232_read_int_callback(struct urb *urb)
|
||||
*/
|
||||
if (urb->transfer_buffer_length > 2) {
|
||||
if (urb->actual_length) {
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (tty) {
|
||||
tty_insert_flip_string(tty, data,
|
||||
urb->actual_length);
|
||||
tty_flip_buffer_push(tty);
|
||||
}
|
||||
tty_kref_put(tty);
|
||||
tty_insert_flip_string(&port->port, data,
|
||||
urb->actual_length);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
goto exit;
|
||||
}
|
||||
|
@@ -95,7 +95,6 @@ static void metrousb_read_int_callback(struct urb *urb)
|
||||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
struct metrousb_private *metro_priv = usb_get_serial_port_data(port);
|
||||
struct tty_struct *tty;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
int throttled = 0;
|
||||
int result = 0;
|
||||
@@ -124,15 +123,13 @@ static void metrousb_read_int_callback(struct urb *urb)
|
||||
|
||||
|
||||
/* Set the data read from the usb port into the serial port buffer. */
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (tty && urb->actual_length) {
|
||||
if (urb->actual_length) {
|
||||
/* Loop through the data copying each byte to the tty layer. */
|
||||
tty_insert_flip_string(tty, data, urb->actual_length);
|
||||
tty_insert_flip_string(&port->port, data, urb->actual_length);
|
||||
|
||||
/* Force the data to the tty layer. */
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
tty_kref_put(tty);
|
||||
|
||||
/* Set any port variables. */
|
||||
spin_lock_irqsave(&metro_priv->lock, flags);
|
||||
|
@@ -899,7 +899,6 @@ static void mos7720_bulk_in_callback(struct urb *urb)
|
||||
int retval;
|
||||
unsigned char *data ;
|
||||
struct usb_serial_port *port;
|
||||
struct tty_struct *tty;
|
||||
int status = urb->status;
|
||||
|
||||
if (status) {
|
||||
@@ -913,12 +912,10 @@ static void mos7720_bulk_in_callback(struct urb *urb)
|
||||
|
||||
data = urb->transfer_buffer;
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (tty && urb->actual_length) {
|
||||
tty_insert_flip_string(tty, data, urb->actual_length);
|
||||
tty_flip_buffer_push(tty);
|
||||
if (urb->actual_length) {
|
||||
tty_insert_flip_string(&port->port, data, urb->actual_length);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
tty_kref_put(tty);
|
||||
|
||||
if (port->read_urb->status != -EINPROGRESS) {
|
||||
retval = usb_submit_urb(port->read_urb, GFP_ATOMIC);
|
||||
|
@@ -744,7 +744,6 @@ static void mos7840_bulk_in_callback(struct urb *urb)
|
||||
struct usb_serial *serial;
|
||||
struct usb_serial_port *port;
|
||||
struct moschip_port *mos7840_port;
|
||||
struct tty_struct *tty;
|
||||
int status = urb->status;
|
||||
|
||||
mos7840_port = urb->context;
|
||||
@@ -773,12 +772,9 @@ static void mos7840_bulk_in_callback(struct urb *urb)
|
||||
usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data);
|
||||
|
||||
if (urb->actual_length) {
|
||||
tty = tty_port_tty_get(&mos7840_port->port->port);
|
||||
if (tty) {
|
||||
tty_insert_flip_string(tty, data, urb->actual_length);
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
struct tty_port *tport = &mos7840_port->port->port;
|
||||
tty_insert_flip_string(tport, data, urb->actual_length);
|
||||
tty_flip_buffer_push(tport);
|
||||
mos7840_port->icount.rx += urb->actual_length;
|
||||
smp_wmb();
|
||||
dev_dbg(&port->dev, "mos7840_port->icount.rx is %d:\n", mos7840_port->icount.rx);
|
||||
|
@@ -32,7 +32,6 @@ static void navman_read_int_callback(struct urb *urb)
|
||||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
struct tty_struct *tty;
|
||||
int status = urb->status;
|
||||
int result;
|
||||
|
||||
@@ -55,12 +54,10 @@ static void navman_read_int_callback(struct urb *urb)
|
||||
|
||||
usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data);
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (tty && urb->actual_length) {
|
||||
tty_insert_flip_string(tty, data, urb->actual_length);
|
||||
tty_flip_buffer_push(tty);
|
||||
if (urb->actual_length) {
|
||||
tty_insert_flip_string(&port->port, data, urb->actual_length);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
tty_kref_put(tty);
|
||||
|
||||
exit:
|
||||
result = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
|
@@ -174,13 +174,9 @@ static void omninet_read_bulk_callback(struct urb *urb)
|
||||
}
|
||||
|
||||
if (urb->actual_length && header->oh_len) {
|
||||
struct tty_struct *tty = tty_port_tty_get(&port->port);
|
||||
if (tty) {
|
||||
tty_insert_flip_string(tty, data + OMNINET_DATAOFFSET,
|
||||
header->oh_len);
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
tty_insert_flip_string(&port->port, data + OMNINET_DATAOFFSET,
|
||||
header->oh_len);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
|
||||
/* Continue trying to always read */
|
||||
|
@@ -51,15 +51,8 @@ struct opticon_private {
|
||||
static void opticon_process_data_packet(struct usb_serial_port *port,
|
||||
const unsigned char *buf, size_t len)
|
||||
{
|
||||
struct tty_struct *tty;
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (!tty)
|
||||
return;
|
||||
|
||||
tty_insert_flip_string(tty, buf, len);
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_kref_put(tty);
|
||||
tty_insert_flip_string(&port->port, buf, len);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
|
||||
static void opticon_process_status_packet(struct usb_serial_port *port,
|
||||
|
@@ -820,7 +820,6 @@ static void oti6858_read_bulk_callback(struct urb *urb)
|
||||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
struct oti6858_private *priv = usb_get_serial_port_data(port);
|
||||
struct tty_struct *tty;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
unsigned long flags;
|
||||
int status = urb->status;
|
||||
@@ -835,12 +834,10 @@ static void oti6858_read_bulk_callback(struct urb *urb)
|
||||
return;
|
||||
}
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (tty != NULL && urb->actual_length > 0) {
|
||||
tty_insert_flip_string(tty, data, urb->actual_length);
|
||||
tty_flip_buffer_push(tty);
|
||||
if (urb->actual_length > 0) {
|
||||
tty_insert_flip_string(&port->port, data, urb->actual_length);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
tty_kref_put(tty);
|
||||
|
||||
/* schedule the interrupt urb */
|
||||
result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
|
||||
|
@@ -772,7 +772,6 @@ static void pl2303_process_read_urb(struct urb *urb)
|
||||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
struct pl2303_private *priv = usb_get_serial_port_data(port);
|
||||
struct tty_struct *tty;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
char tty_flag = TTY_NORMAL;
|
||||
unsigned long flags;
|
||||
@@ -789,10 +788,6 @@ static void pl2303_process_read_urb(struct urb *urb)
|
||||
if (!urb->actual_length)
|
||||
return;
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (!tty)
|
||||
return;
|
||||
|
||||
/* break takes precedence over parity, */
|
||||
/* which takes precedence over framing errors */
|
||||
if (line_status & UART_BREAK_ERROR)
|
||||
@@ -805,19 +800,19 @@ static void pl2303_process_read_urb(struct urb *urb)
|
||||
|
||||
/* overrun is special, not associated with a char */
|
||||
if (line_status & UART_OVERRUN_ERROR)
|
||||
tty_insert_flip_char(tty, 0, TTY_OVERRUN);
|
||||
tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
|
||||
|
||||
if (port->port.console && port->sysrq) {
|
||||
for (i = 0; i < urb->actual_length; ++i)
|
||||
if (!usb_serial_handle_sysrq_char(port, data[i]))
|
||||
tty_insert_flip_char(tty, data[i], tty_flag);
|
||||
tty_insert_flip_char(&port->port, data[i],
|
||||
tty_flag);
|
||||
} else {
|
||||
tty_insert_flip_string_fixed_flag(tty, data, tty_flag,
|
||||
tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,
|
||||
urb->actual_length);
|
||||
}
|
||||
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_kref_put(tty);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
|
||||
/* All of the device info needed for the PL2303 SIO serial converter */
|
||||
|
@@ -609,7 +609,6 @@ void qt2_process_read_urb(struct urb *urb)
|
||||
struct qt2_serial_private *serial_priv;
|
||||
struct usb_serial_port *port;
|
||||
struct qt2_port_private *port_priv;
|
||||
struct tty_struct *tty;
|
||||
bool escapeflag;
|
||||
unsigned char *ch;
|
||||
int i;
|
||||
@@ -620,15 +619,11 @@ void qt2_process_read_urb(struct urb *urb)
|
||||
return;
|
||||
|
||||
ch = urb->transfer_buffer;
|
||||
tty = NULL;
|
||||
serial = urb->context;
|
||||
serial_priv = usb_get_serial_data(serial);
|
||||
port = serial->port[serial_priv->current_port];
|
||||
port_priv = usb_get_serial_port_data(port);
|
||||
|
||||
if (port_priv->is_open)
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
|
||||
for (i = 0; i < urb->actual_length; i++) {
|
||||
ch = (unsigned char *)urb->transfer_buffer + i;
|
||||
if ((i <= (len - 3)) &&
|
||||
@@ -666,10 +661,7 @@ void qt2_process_read_urb(struct urb *urb)
|
||||
__func__);
|
||||
break;
|
||||
}
|
||||
if (tty) {
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
tty_flip_buffer_push(&port->port);
|
||||
|
||||
newport = *(ch + 3);
|
||||
|
||||
@@ -683,10 +675,6 @@ void qt2_process_read_urb(struct urb *urb)
|
||||
serial_priv->current_port = newport;
|
||||
port = serial->port[serial_priv->current_port];
|
||||
port_priv = usb_get_serial_port_data(port);
|
||||
if (port_priv->is_open)
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
else
|
||||
tty = NULL;
|
||||
i += 3;
|
||||
escapeflag = true;
|
||||
break;
|
||||
@@ -697,8 +685,8 @@ void qt2_process_read_urb(struct urb *urb)
|
||||
escapeflag = true;
|
||||
break;
|
||||
case QT2_CONTROL_ESCAPE:
|
||||
tty_buffer_request_room(tty, 2);
|
||||
tty_insert_flip_string(tty, ch, 2);
|
||||
tty_buffer_request_room(&port->port, 2);
|
||||
tty_insert_flip_string(&port->port, ch, 2);
|
||||
i += 2;
|
||||
escapeflag = true;
|
||||
break;
|
||||
@@ -712,16 +700,11 @@ void qt2_process_read_urb(struct urb *urb)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (tty) {
|
||||
tty_buffer_request_room(tty, 1);
|
||||
tty_insert_flip_string(tty, ch, 1);
|
||||
}
|
||||
tty_buffer_request_room(&port->port, 1);
|
||||
tty_insert_flip_string(&port->port, ch, 1);
|
||||
}
|
||||
|
||||
if (tty) {
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
|
||||
static void qt2_write_bulk_callback(struct urb *urb)
|
||||
|
@@ -207,38 +207,31 @@ static void safe_process_read_urb(struct urb *urb)
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
unsigned char length = urb->actual_length;
|
||||
int actual_length;
|
||||
struct tty_struct *tty;
|
||||
__u16 fcs;
|
||||
|
||||
if (!length)
|
||||
return;
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (!tty)
|
||||
return;
|
||||
|
||||
if (!safe)
|
||||
goto out;
|
||||
|
||||
fcs = fcs_compute10(data, length, CRC10_INITFCS);
|
||||
if (fcs) {
|
||||
dev_err(&port->dev, "%s - bad CRC %x\n", __func__, fcs);
|
||||
goto err;
|
||||
return;
|
||||
}
|
||||
|
||||
actual_length = data[length - 2] >> 2;
|
||||
if (actual_length > (length - 2)) {
|
||||
dev_err(&port->dev, "%s - inconsistent lengths %d:%d\n",
|
||||
__func__, actual_length, length);
|
||||
goto err;
|
||||
return;
|
||||
}
|
||||
dev_info(&urb->dev->dev, "%s - actual: %d\n", __func__, actual_length);
|
||||
length = actual_length;
|
||||
out:
|
||||
tty_insert_flip_string(tty, data, length);
|
||||
tty_flip_buffer_push(tty);
|
||||
err:
|
||||
tty_kref_put(tty);
|
||||
tty_insert_flip_string(&port->port, data, length);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
|
||||
static int safe_prepare_write_buffer(struct usb_serial_port *port,
|
||||
|
@@ -569,7 +569,6 @@ static void sierra_indat_callback(struct urb *urb)
|
||||
int err;
|
||||
int endpoint;
|
||||
struct usb_serial_port *port;
|
||||
struct tty_struct *tty;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
int status = urb->status;
|
||||
|
||||
@@ -581,16 +580,12 @@ static void sierra_indat_callback(struct urb *urb)
|
||||
" endpoint %02x\n", __func__, status, endpoint);
|
||||
} else {
|
||||
if (urb->actual_length) {
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (tty) {
|
||||
tty_insert_flip_string(tty, data,
|
||||
urb->actual_length);
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_insert_flip_string(&port->port, data,
|
||||
urb->actual_length);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
|
||||
tty_kref_put(tty);
|
||||
usb_serial_debug_data(&port->dev, __func__,
|
||||
urb->actual_length, data);
|
||||
}
|
||||
usb_serial_debug_data(&port->dev, __func__,
|
||||
urb->actual_length, data);
|
||||
} else {
|
||||
dev_dbg(&port->dev, "%s: empty read urb"
|
||||
" received\n", __func__);
|
||||
|
@@ -462,7 +462,6 @@ static void spcp8x5_process_read_urb(struct urb *urb)
|
||||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
struct spcp8x5_private *priv = usb_get_serial_port_data(port);
|
||||
struct tty_struct *tty;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
unsigned long flags;
|
||||
u8 status;
|
||||
@@ -481,9 +480,6 @@ static void spcp8x5_process_read_urb(struct urb *urb)
|
||||
if (!urb->actual_length)
|
||||
return;
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (!tty)
|
||||
return;
|
||||
|
||||
if (status & UART_STATE_TRANSIENT_MASK) {
|
||||
/* break takes precedence over parity, which takes precedence
|
||||
@@ -498,17 +494,21 @@ static void spcp8x5_process_read_urb(struct urb *urb)
|
||||
|
||||
/* overrun is special, not associated with a char */
|
||||
if (status & UART_OVERRUN_ERROR)
|
||||
tty_insert_flip_char(tty, 0, TTY_OVERRUN);
|
||||
tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
|
||||
|
||||
if (status & UART_DCD)
|
||||
usb_serial_handle_dcd_change(port, tty,
|
||||
priv->line_status & MSR_STATUS_LINE_DCD);
|
||||
if (status & UART_DCD) {
|
||||
struct tty_struct *tty = tty_port_tty_get(&port->port);
|
||||
if (tty) {
|
||||
usb_serial_handle_dcd_change(port, tty,
|
||||
priv->line_status & MSR_STATUS_LINE_DCD);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tty_insert_flip_string_fixed_flag(tty, data, tty_flag,
|
||||
tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,
|
||||
urb->actual_length);
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_kref_put(tty);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
|
||||
static int spcp8x5_wait_modem_info(struct usb_serial_port *port,
|
||||
|
@@ -579,8 +579,7 @@ static void ssu100_update_lsr(struct usb_serial_port *port, u8 lsr,
|
||||
|
||||
}
|
||||
|
||||
static int ssu100_process_packet(struct urb *urb,
|
||||
struct tty_struct *tty)
|
||||
static void ssu100_process_read_urb(struct urb *urb)
|
||||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
char *packet = (char *)urb->transfer_buffer;
|
||||
@@ -595,7 +594,8 @@ static int ssu100_process_packet(struct urb *urb,
|
||||
if (packet[2] == 0x00) {
|
||||
ssu100_update_lsr(port, packet[3], &flag);
|
||||
if (flag == TTY_OVERRUN)
|
||||
tty_insert_flip_char(tty, 0, TTY_OVERRUN);
|
||||
tty_insert_flip_char(&port->port, 0,
|
||||
TTY_OVERRUN);
|
||||
}
|
||||
if (packet[2] == 0x01)
|
||||
ssu100_update_msr(port, packet[3]);
|
||||
@@ -606,34 +606,17 @@ static int ssu100_process_packet(struct urb *urb,
|
||||
ch = packet;
|
||||
|
||||
if (!len)
|
||||
return 0; /* status only */
|
||||
return; /* status only */
|
||||
|
||||
if (port->port.console && port->sysrq) {
|
||||
for (i = 0; i < len; i++, ch++) {
|
||||
if (!usb_serial_handle_sysrq_char(port, *ch))
|
||||
tty_insert_flip_char(tty, *ch, flag);
|
||||
tty_insert_flip_char(&port->port, *ch, flag);
|
||||
}
|
||||
} else
|
||||
tty_insert_flip_string_fixed_flag(tty, ch, flag, len);
|
||||
tty_insert_flip_string_fixed_flag(&port->port, ch, flag, len);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
static void ssu100_process_read_urb(struct urb *urb)
|
||||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
struct tty_struct *tty;
|
||||
int count;
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (!tty)
|
||||
return;
|
||||
|
||||
count = ssu100_process_packet(urb, tty);
|
||||
|
||||
if (count)
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_kref_put(tty);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
|
||||
static struct usb_serial_driver ssu100_device = {
|
||||
|
@@ -48,7 +48,6 @@ static void symbol_int_callback(struct urb *urb)
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
struct usb_serial_port *port = priv->port;
|
||||
int status = urb->status;
|
||||
struct tty_struct *tty;
|
||||
int result;
|
||||
int data_length;
|
||||
|
||||
@@ -82,12 +81,8 @@ static void symbol_int_callback(struct urb *urb)
|
||||
* we pretty much just ignore the size and send everything
|
||||
* else to the tty layer.
|
||||
*/
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (tty) {
|
||||
tty_insert_flip_string(tty, &data[1], data_length);
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
tty_insert_flip_string(&port->port, &data[1], data_length);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
} else {
|
||||
dev_dbg(&priv->udev->dev,
|
||||
"Improper amount of data received from the device, "
|
||||
|
@@ -121,8 +121,8 @@ static void ti_interrupt_callback(struct urb *urb);
|
||||
static void ti_bulk_in_callback(struct urb *urb);
|
||||
static void ti_bulk_out_callback(struct urb *urb);
|
||||
|
||||
static void ti_recv(struct device *dev, struct tty_struct *tty,
|
||||
unsigned char *data, int length);
|
||||
static void ti_recv(struct usb_serial_port *port, unsigned char *data,
|
||||
int length);
|
||||
static void ti_send(struct ti_port *tport);
|
||||
static int ti_set_mcr(struct ti_port *tport, unsigned int mcr);
|
||||
static int ti_get_lsr(struct ti_port *tport);
|
||||
@@ -1118,7 +1118,6 @@ static void ti_bulk_in_callback(struct urb *urb)
|
||||
struct device *dev = &urb->dev->dev;
|
||||
int status = urb->status;
|
||||
int retval = 0;
|
||||
struct tty_struct *tty;
|
||||
|
||||
switch (status) {
|
||||
case 0:
|
||||
@@ -1145,24 +1144,18 @@ static void ti_bulk_in_callback(struct urb *urb)
|
||||
return;
|
||||
}
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (tty) {
|
||||
if (urb->actual_length) {
|
||||
usb_serial_debug_data(dev, __func__, urb->actual_length,
|
||||
urb->transfer_buffer);
|
||||
if (urb->actual_length) {
|
||||
usb_serial_debug_data(dev, __func__, urb->actual_length,
|
||||
urb->transfer_buffer);
|
||||
|
||||
if (!tport->tp_is_open)
|
||||
dev_dbg(dev, "%s - port closed, dropping data\n",
|
||||
__func__);
|
||||
else
|
||||
ti_recv(&urb->dev->dev, tty,
|
||||
urb->transfer_buffer,
|
||||
urb->actual_length);
|
||||
spin_lock(&tport->tp_lock);
|
||||
tport->tp_icount.rx += urb->actual_length;
|
||||
spin_unlock(&tport->tp_lock);
|
||||
}
|
||||
tty_kref_put(tty);
|
||||
if (!tport->tp_is_open)
|
||||
dev_dbg(dev, "%s - port closed, dropping data\n",
|
||||
__func__);
|
||||
else
|
||||
ti_recv(port, urb->transfer_buffer, urb->actual_length);
|
||||
spin_lock(&tport->tp_lock);
|
||||
tport->tp_icount.rx += urb->actual_length;
|
||||
spin_unlock(&tport->tp_lock);
|
||||
}
|
||||
|
||||
exit:
|
||||
@@ -1210,24 +1203,23 @@ static void ti_bulk_out_callback(struct urb *urb)
|
||||
}
|
||||
|
||||
|
||||
static void ti_recv(struct device *dev, struct tty_struct *tty,
|
||||
unsigned char *data, int length)
|
||||
static void ti_recv(struct usb_serial_port *port, unsigned char *data,
|
||||
int length)
|
||||
{
|
||||
int cnt;
|
||||
|
||||
do {
|
||||
cnt = tty_insert_flip_string(tty, data, length);
|
||||
cnt = tty_insert_flip_string(&port->port, data, length);
|
||||
if (cnt < length) {
|
||||
dev_err(dev, "%s - dropping data, %d bytes lost\n",
|
||||
dev_err(&port->dev, "%s - dropping data, %d bytes lost\n",
|
||||
__func__, length - cnt);
|
||||
if (cnt == 0)
|
||||
break;
|
||||
}
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
data += cnt;
|
||||
length -= cnt;
|
||||
} while (length > 0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@@ -273,7 +273,6 @@ static void usb_wwan_indat_callback(struct urb *urb)
|
||||
int err;
|
||||
int endpoint;
|
||||
struct usb_serial_port *port;
|
||||
struct tty_struct *tty;
|
||||
struct device *dev;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
int status = urb->status;
|
||||
@@ -286,16 +285,12 @@ static void usb_wwan_indat_callback(struct urb *urb)
|
||||
dev_dbg(dev, "%s: nonzero status: %d on endpoint %02x.\n",
|
||||
__func__, status, endpoint);
|
||||
} else {
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (tty) {
|
||||
if (urb->actual_length) {
|
||||
tty_insert_flip_string(tty, data,
|
||||
urb->actual_length);
|
||||
tty_flip_buffer_push(tty);
|
||||
} else
|
||||
dev_dbg(dev, "%s: empty read urb received\n", __func__);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
if (urb->actual_length) {
|
||||
tty_insert_flip_string(&port->port, data,
|
||||
urb->actual_length);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
} else
|
||||
dev_dbg(dev, "%s: empty read urb received\n", __func__);
|
||||
|
||||
/* Resubmit urb so we continue receiving */
|
||||
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
|
Reference in New Issue
Block a user