diff options
Diffstat (limited to 'drivers/usb/serial/safe_serial.c')
| -rw-r--r-- | drivers/usb/serial/safe_serial.c | 43 |
1 files changed, 21 insertions, 22 deletions
diff --git a/drivers/usb/serial/safe_serial.c b/drivers/usb/serial/safe_serial.c index d9af5c5ed9e8..a36e2313eed0 100644 --- a/drivers/usb/serial/safe_serial.c +++ b/drivers/usb/serial/safe_serial.c | |||
| @@ -218,7 +218,9 @@ static void safe_process_read_urb(struct urb *urb) | |||
| 218 | struct usb_serial_port *port = urb->context; | 218 | struct usb_serial_port *port = urb->context; |
| 219 | unsigned char *data = urb->transfer_buffer; | 219 | unsigned char *data = urb->transfer_buffer; |
| 220 | unsigned char length = urb->actual_length; | 220 | unsigned char length = urb->actual_length; |
| 221 | int actual_length; | ||
| 221 | struct tty_struct *tty; | 222 | struct tty_struct *tty; |
| 223 | __u16 fcs; | ||
| 222 | 224 | ||
| 223 | if (!length) | 225 | if (!length) |
| 224 | return; | 226 | return; |
| @@ -227,30 +229,27 @@ static void safe_process_read_urb(struct urb *urb) | |||
| 227 | if (!tty) | 229 | if (!tty) |
| 228 | return; | 230 | return; |
| 229 | 231 | ||
| 230 | if (safe) { | 232 | if (!safe) |
| 231 | __u16 fcs; | 233 | goto out; |
| 232 | fcs = fcs_compute10(data, length, CRC10_INITFCS); | 234 | |
| 233 | if (!fcs) { | 235 | fcs = fcs_compute10(data, length, CRC10_INITFCS); |
| 234 | int actual_length = data[length - 2] >> 2; | 236 | if (fcs) { |
| 235 | if (actual_length <= (length - 2)) { | 237 | dev_err(&port->dev, "%s - bad CRC %x\n", __func__, fcs); |
| 236 | dev_info(&urb->dev->dev, "%s - actual: %d\n", | 238 | goto err; |
| 237 | __func__, actual_length); | ||
| 238 | tty_insert_flip_string(tty, | ||
| 239 | data, actual_length); | ||
| 240 | tty_flip_buffer_push(tty); | ||
| 241 | } else { | ||
| 242 | dev_err(&port->dev, | ||
| 243 | "%s - inconsistent lengths %d:%d\n", | ||
| 244 | __func__, actual_length, length); | ||
| 245 | } | ||
| 246 | } else { | ||
| 247 | dev_err(&port->dev, "%s - bad CRC %x\n", __func__, fcs); | ||
| 248 | } | ||
| 249 | } else { | ||
| 250 | tty_insert_flip_string(tty, data, length); | ||
| 251 | tty_flip_buffer_push(tty); | ||
| 252 | } | 239 | } |
| 253 | 240 | ||
| 241 | actual_length = data[length - 2] >> 2; | ||
| 242 | if (actual_length > (length - 2)) { | ||
| 243 | dev_err(&port->dev, "%s - inconsistent lengths %d:%d\n", | ||
| 244 | __func__, actual_length, length); | ||
| 245 | goto err; | ||
| 246 | } | ||
| 247 | dev_info(&urb->dev->dev, "%s - actual: %d\n", __func__, actual_length); | ||
| 248 | length = actual_length; | ||
| 249 | out: | ||
| 250 | tty_insert_flip_string(tty, data, length); | ||
| 251 | tty_flip_buffer_push(tty); | ||
| 252 | err: | ||
| 254 | tty_kref_put(tty); | 253 | tty_kref_put(tty); |
| 255 | } | 254 | } |
| 256 | 255 | ||
