mirror of https://gitee.com/openkylin/linux.git
USB: pl2303: add error handling to line requests
Refactor and add error handling to line requests. Signed-off-by: Johan Hovold <jhovold@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
a6ec8245bf
commit
383d19c587
|
@ -344,6 +344,52 @@ static void pl2303_encode_baudrate(struct tty_struct *tty,
|
||||||
dev_dbg(&port->dev, "baud set = %d\n", baud);
|
dev_dbg(&port->dev, "baud set = %d\n", baud);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int pl2303_get_line_request(struct usb_serial_port *port,
|
||||||
|
unsigned char buf[7])
|
||||||
|
{
|
||||||
|
struct usb_device *udev = port->serial->dev;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
|
||||||
|
GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
|
||||||
|
0, 0, buf, 7, 100);
|
||||||
|
if (ret != 7) {
|
||||||
|
dev_err(&port->dev, "%s - failed: %d\n", __func__, ret);
|
||||||
|
|
||||||
|
if (ret > 0)
|
||||||
|
ret = -EIO;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
dev_dbg(&port->dev, "%s - %7ph\n", __func__, buf);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int pl2303_set_line_request(struct usb_serial_port *port,
|
||||||
|
unsigned char buf[7])
|
||||||
|
{
|
||||||
|
struct usb_device *udev = port->serial->dev;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
|
||||||
|
SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
|
||||||
|
0, 0, buf, 7, 100);
|
||||||
|
if (ret != 7) {
|
||||||
|
dev_err(&port->dev, "%s - failed: %d\n", __func__, ret);
|
||||||
|
|
||||||
|
if (ret > 0)
|
||||||
|
ret = -EIO;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
dev_dbg(&port->dev, "%s - %7ph\n", __func__, buf);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void pl2303_set_termios(struct tty_struct *tty,
|
static void pl2303_set_termios(struct tty_struct *tty,
|
||||||
struct usb_serial_port *port, struct ktermios *old_termios)
|
struct usb_serial_port *port, struct ktermios *old_termios)
|
||||||
{
|
{
|
||||||
|
@ -352,7 +398,7 @@ static void pl2303_set_termios(struct tty_struct *tty,
|
||||||
struct pl2303_private *priv = usb_get_serial_port_data(port);
|
struct pl2303_private *priv = usb_get_serial_port_data(port);
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned char *buf;
|
unsigned char *buf;
|
||||||
int i;
|
int ret;
|
||||||
u8 control;
|
u8 control;
|
||||||
|
|
||||||
if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios))
|
if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios))
|
||||||
|
@ -366,10 +412,7 @@ static void pl2303_set_termios(struct tty_struct *tty,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
|
pl2303_get_line_request(port, buf);
|
||||||
GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
|
|
||||||
0, 0, buf, 7, 100);
|
|
||||||
dev_dbg(&port->dev, "0xa1:0x21:0:0 %d - %7ph\n", i, buf);
|
|
||||||
|
|
||||||
switch (C_CSIZE(tty)) {
|
switch (C_CSIZE(tty)) {
|
||||||
case CS5:
|
case CS5:
|
||||||
|
@ -451,14 +494,8 @@ static void pl2303_set_termios(struct tty_struct *tty,
|
||||||
* only used in set_termios, which is serialised against itself.
|
* only used in set_termios, which is serialised against itself.
|
||||||
*/
|
*/
|
||||||
if (!old_termios || memcmp(buf, priv->line_settings, 7)) {
|
if (!old_termios || memcmp(buf, priv->line_settings, 7)) {
|
||||||
i = usb_control_msg(serial->dev,
|
ret = pl2303_set_line_request(port, buf);
|
||||||
usb_sndctrlpipe(serial->dev, 0),
|
if (!ret)
|
||||||
SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
|
|
||||||
0, 0, buf, 7, 100);
|
|
||||||
|
|
||||||
dev_dbg(&port->dev, "0x21:0x20:0:0 %d\n", i);
|
|
||||||
|
|
||||||
if (i == 7)
|
|
||||||
memcpy(priv->line_settings, buf, 7);
|
memcpy(priv->line_settings, buf, 7);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -478,10 +515,7 @@ static void pl2303_set_termios(struct tty_struct *tty,
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(buf, 0, 7);
|
memset(buf, 0, 7);
|
||||||
i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
|
pl2303_get_line_request(port, buf);
|
||||||
GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
|
|
||||||
0, 0, buf, 7, 100);
|
|
||||||
dev_dbg(&port->dev, "0xa1:0x21:0:0 %d - %7ph\n", i, buf);
|
|
||||||
|
|
||||||
if (C_CRTSCTS(tty)) {
|
if (C_CRTSCTS(tty)) {
|
||||||
if (spriv->type == HX)
|
if (spriv->type == HX)
|
||||||
|
|
Loading…
Reference in New Issue