USB: pl2303: disable break on shutdown
Currently an enabled break state is not disabled on final close nor on re-open and has to be disabled manually. Fix this by disabling break on port shutdown. Reported-by: Jari Ruusu <jariruusu@users.sourceforge.net> Tested-by: Jari Ruusu <jariruusu@users.sourceforge.net> Signed-off-by: Johan Hovold <johan@kernel.org>
This commit is contained in:
Родитель
db81de767e
Коммит
52772a7fd3
|
@ -132,6 +132,7 @@ MODULE_DEVICE_TABLE(usb, id_table);
|
|||
#define UART_OVERRUN_ERROR 0x40
|
||||
#define UART_CTS 0x80
|
||||
|
||||
static void pl2303_set_break(struct usb_serial_port *port, bool enable);
|
||||
|
||||
enum pl2303_type {
|
||||
TYPE_01, /* Type 0 and 1 (difference unknown) */
|
||||
|
@ -615,6 +616,7 @@ static void pl2303_close(struct usb_serial_port *port)
|
|||
{
|
||||
usb_serial_generic_close(port);
|
||||
usb_kill_urb(port->interrupt_in_urb);
|
||||
pl2303_set_break(port, false);
|
||||
}
|
||||
|
||||
static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
|
||||
|
@ -741,17 +743,16 @@ static int pl2303_ioctl(struct tty_struct *tty,
|
|||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
static void pl2303_break_ctl(struct tty_struct *tty, int break_state)
|
||||
static void pl2303_set_break(struct usb_serial_port *port, bool enable)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct usb_serial *serial = port->serial;
|
||||
u16 state;
|
||||
int result;
|
||||
|
||||
if (break_state == 0)
|
||||
state = BREAK_OFF;
|
||||
else
|
||||
if (enable)
|
||||
state = BREAK_ON;
|
||||
else
|
||||
state = BREAK_OFF;
|
||||
|
||||
dev_dbg(&port->dev, "%s - turning break %s\n", __func__,
|
||||
state == BREAK_OFF ? "off" : "on");
|
||||
|
@ -763,6 +764,13 @@ static void pl2303_break_ctl(struct tty_struct *tty, int break_state)
|
|||
dev_err(&port->dev, "error sending break = %d\n", result);
|
||||
}
|
||||
|
||||
static void pl2303_break_ctl(struct tty_struct *tty, int state)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
|
||||
pl2303_set_break(port, state);
|
||||
}
|
||||
|
||||
static void pl2303_update_line_status(struct usb_serial_port *port,
|
||||
unsigned char *data,
|
||||
unsigned int actual_length)
|
||||
|
|
Загрузка…
Ссылка в новой задаче