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

Commit b0cda8c5 authored by Elina Pasheva's avatar Elina Pasheva Committed by Greg Kroah-Hartman
Browse files

USB: serial: sierra driver read path bug fix



This patch fixes a problem in function sierra_indat_callback() which
would stop receiving traffic from a modem if a number of URB failures
occur.  Failed URBs are not resubmitted for the next read and there is
only a limited number of URBs allocated for the IN path. After this
number of failures, the receive path stops working on a particular
interface.

Signed-off-by: default avatarElina Pasheva <epasheva@sierrawireless.com>
parent 40d2ff32
Loading
Loading
Loading
Loading
+17 −11
Original line number Diff line number Diff line
@@ -509,24 +509,30 @@ static void sierra_indat_callback(struct urb *urb)
	unsigned char *data = urb->transfer_buffer;
	int status = urb->status;

	dbg("%s: %p", __func__, urb);

	endpoint = usb_pipeendpoint(urb->pipe);
	port = urb->context;

	dev_dbg(&port->dev, "%s: %p\n", __func__, urb);

	if (status) {
		dev_dbg(&port->dev, "%s: nonzero status: %d on"
			" endpoint %02x\n", __func__, status, endpoint);
	} else {
		if (urb->actual_length) {
			tty = tty_port_tty_get(&port->port);

			tty_buffer_request_room(tty, urb->actual_length);
			tty_insert_flip_string(tty, data, urb->actual_length);
			tty_flip_buffer_push(tty);

			tty_kref_put(tty);
		} else
			usb_serial_debug_data(debug, &port->dev, __func__,
				urb->actual_length, data);
		} else {
			dev_dbg(&port->dev, "%s: empty read urb"
				" received\n", __func__);
		}
	}

	/* Resubmit urb so we continue receiving */
	if (port->port.count && status != -ESHUTDOWN && status != -EPERM) {
@@ -535,7 +541,7 @@ static void sierra_indat_callback(struct urb *urb)
			dev_err(&port->dev, "resubmit read urb failed."
				"(%d)\n", err);
	}
	}

	return;
}