|
@@ -284,9 +284,15 @@ static int mos7840_get_reg_sync(struct usb_serial_port *port, __u16 reg,
|
|
|
ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), MCS_RDREQ,
|
|
|
MCS_RD_RTYPE, 0, reg, buf, VENDOR_READ_LENGTH,
|
|
|
MOS_WDR_TIMEOUT);
|
|
|
+ if (ret < VENDOR_READ_LENGTH) {
|
|
|
+ if (ret >= 0)
|
|
|
+ ret = -EIO;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
*val = buf[0];
|
|
|
dev_dbg(&port->dev, "%s offset is %x, return val %x\n", __func__, reg, *val);
|
|
|
-
|
|
|
+out:
|
|
|
kfree(buf);
|
|
|
return ret;
|
|
|
}
|
|
@@ -352,8 +358,13 @@ static int mos7840_get_uart_reg(struct usb_serial_port *port, __u16 reg,
|
|
|
ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), MCS_RDREQ,
|
|
|
MCS_RD_RTYPE, Wval, reg, buf, VENDOR_READ_LENGTH,
|
|
|
MOS_WDR_TIMEOUT);
|
|
|
+ if (ret < VENDOR_READ_LENGTH) {
|
|
|
+ if (ret >= 0)
|
|
|
+ ret = -EIO;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
*val = buf[0];
|
|
|
-
|
|
|
+out:
|
|
|
kfree(buf);
|
|
|
return ret;
|
|
|
}
|
|
@@ -1479,10 +1490,10 @@ static int mos7840_tiocmget(struct tty_struct *tty)
|
|
|
return -ENODEV;
|
|
|
|
|
|
status = mos7840_get_uart_reg(port, MODEM_STATUS_REGISTER, &msr);
|
|
|
- if (status != 1)
|
|
|
+ if (status < 0)
|
|
|
return -EIO;
|
|
|
status = mos7840_get_uart_reg(port, MODEM_CONTROL_REGISTER, &mcr);
|
|
|
- if (status != 1)
|
|
|
+ if (status < 0)
|
|
|
return -EIO;
|
|
|
result = ((mcr & MCR_DTR) ? TIOCM_DTR : 0)
|
|
|
| ((mcr & MCR_RTS) ? TIOCM_RTS : 0)
|