Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a5b6f60c authored by Alan Cox's avatar Alan Cox Committed by Greg Kroah-Hartman
Browse files

usb serial: more fixes and groundwork for tty changes



 - If a termios change fails due to lack of memory we should copy the
   old settings back over as the device has not changed
 - Note various locking problems
 - kl5kusb105 had various remaining tty flag handling problems
 - Make safe_serial use tty_insert_flip_string not open coded loops
 - set termios speed properly in usb_serial

Signed-off-by: default avatarAlan Cox <alan@redhat.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 441b62c1
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -192,6 +192,7 @@ static void ark3116_set_termios(struct usb_serial_port *port,
	buf = kmalloc(1, GFP_KERNEL);
	if (!buf) {
		dbg("error kmalloc");
		*port->tty->termios = *old_termios;
		return;
	}

+16 −15
Original line number Diff line number Diff line
@@ -209,7 +209,7 @@ static int cyberjack_write (struct usb_serial_port *port, const unsigned char *b

	if (count == 0) {
		dbg("%s - write request of 0 bytes", __func__);
		return (0);
		return 0;
	}

	spin_lock_bh(&port->lock);
@@ -226,9 +226,9 @@ static int cyberjack_write (struct usb_serial_port *port, const unsigned char *b
	if( (count+priv->wrfilled) > sizeof(priv->wrbuf) ) {
		/* To much data for buffer. Reset buffer. */
		priv->wrfilled = 0;
		spin_unlock_irqrestore(&priv->lock, flags);
		port->write_urb_busy = 0;
		return (0);
		spin_unlock_irqrestore(&priv->lock, flags);
		return 0;
	}

	/* Copy data */
@@ -294,6 +294,7 @@ static int cyberjack_write (struct usb_serial_port *port, const unsigned char *b

static int cyberjack_write_room( struct usb_serial_port *port )
{
	/* FIXME: .... */
	return CYBERJACK_LOCAL_BUF_SIZE;
}

+3 −2
Original line number Diff line number Diff line
@@ -262,13 +262,14 @@ int usb_serial_generic_write_room (struct usb_serial_port *port)

	dbg("%s - port %d", __func__, port->number);

	/* FIXME: Locking */
	if (serial->num_bulk_out) {
		if (!(port->write_urb_busy))
			room = port->bulk_out_size;
	}

	dbg("%s - returns %d", __func__, room);
	return (room);
	return room;
}

int usb_serial_generic_chars_in_buffer (struct usb_serial_port *port)
@@ -278,6 +279,7 @@ int usb_serial_generic_chars_in_buffer (struct usb_serial_port *port)

	dbg("%s - port %d", __func__, port->number);

	/* FIXME: Locking */
	if (serial->num_bulk_out) {
		if (port->write_urb_busy)
			chars = port->write_urb->transfer_buffer_length;
@@ -368,7 +370,6 @@ void usb_serial_generic_write_bulk_callback (struct urb *urb)
		    __func__, status);
		return;
	}

	usb_serial_port_softint(port);
}
EXPORT_SYMBOL_GPL(usb_serial_generic_write_bulk_callback);
+10 −9
Original line number Diff line number Diff line
@@ -1187,6 +1187,7 @@ static int keyspan_write_room (struct usb_serial_port *port)
	p_priv = usb_get_serial_port_data(port);
	d_details = p_priv->device_details;

	/* FIXME: locking */
	if (d_details->msg_format == msg_usa90)
   		data_len = 64;
	else
@@ -1203,13 +1204,13 @@ static int keyspan_write_room (struct usb_serial_port *port)
			if (this_urb->status != -EINPROGRESS)
				return (data_len);
	}
	return (0);
	return 0;
}


static int keyspan_chars_in_buffer (struct usb_serial_port *port)
{
	return (0);
	return 0;
}


@@ -1289,7 +1290,7 @@ static int keyspan_open (struct usb_serial_port *port, struct file *filp)
	//mdelay(100);
	//keyspan_set_termios(port, NULL);

	return (0);
	return 0;
}

static inline void stop_urb(struct urb *urb)
@@ -2006,7 +2007,7 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial,
	}
#endif

	return (0);
	return 0;
}

static int keyspan_usa28_send_setup(struct usb_serial *serial,
@@ -2131,7 +2132,7 @@ static int keyspan_usa28_send_setup(struct usb_serial *serial,
	}
#endif

	return (0);
	return 0;
}

static int keyspan_usa49_send_setup(struct usb_serial *serial,
@@ -2317,7 +2318,7 @@ static int keyspan_usa49_send_setup(struct usb_serial *serial,
	}
#endif

	return (0);
	return 0;
}

static int keyspan_usa90_send_setup(struct usb_serial *serial,
@@ -2455,7 +2456,7 @@ static int keyspan_usa90_send_setup(struct usb_serial *serial,
	if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) {
		dbg("%s - usb_submit_urb(setup) failed (%d)", __func__, err);
	}
	return (0);
	return 0;
}

static int keyspan_usa67_send_setup(struct usb_serial *serial,
@@ -2603,7 +2604,7 @@ static int keyspan_usa67_send_setup(struct usb_serial *serial,
	if (err != 0)
		dbg("%s - usb_submit_urb(setup) failed (%d)", __func__,
				err);
	return (0);
	return 0;
}

static void keyspan_send_setup(struct usb_serial_port *port, int reset_port)
@@ -2696,7 +2697,7 @@ static int keyspan_startup (struct usb_serial *serial)
				err);
	}
			
	return (0);
	return 0;
}

static void keyspan_shutdown (struct usb_serial *serial)
+7 −2
Original line number Diff line number Diff line
@@ -636,14 +636,19 @@ static int keyspan_pda_write_room (struct usb_serial_port *port)
static int keyspan_pda_chars_in_buffer (struct usb_serial_port *port)
{
	struct keyspan_pda_private *priv;
	unsigned long flags;
	int ret = 0;

	priv = usb_get_serial_port_data(port);

	/* when throttled, return at least WAKEUP_CHARS to tell select() (via
	   n_tty.c:normal_poll() ) that we're not writeable. */

	spin_lock_irqsave(&port->lock, flags);
	if (port->write_urb_busy || priv->tx_throttled)
		return 256;
	return 0;
		ret = 256;
	spin_unlock_irqrestore(&port->lock, flags);
	return ret;
}


Loading