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

Commit bbbd527b authored by YAMANE Toshiaki's avatar YAMANE Toshiaki Committed by Greg Kroah-Hartman
Browse files

staging/serqt_usb2: refactor qt_read_bulk_callback() in serqt_usb2.c



Modified to eliminate the deep nesting and redundant description.

Signed-off-by: default avatarYAMANE Toshiaki <yamanetoshi@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 01295448
Loading
Loading
Loading
Loading
+80 −67
Original line number Diff line number Diff line
@@ -291,22 +291,89 @@ static void qt_interrupt_callback(struct urb *urb)
	/* FIXME */
}

static int qt_status_change(unsigned int limit,
			    unsigned char *data,
			    int i,
			    struct quatech_port *qt_port,
			    struct usb_serial_port *port)
{
	void (*fn)(struct quatech_port *, unsigned char);

	if (0x00 == data[i + 2]) {
		dev_dbg(&port->dev, "Line status status.\n");
		fn = ProcessLineStatus;
	} else {
		dev_dbg(&port->dev, "Modem status status.\n");
		fn = ProcessModemStatus;
	}

	if (i > limit) {
		dev_dbg(&port->dev,
			"Illegal escape seuences in received data\n");
		return 0;
	}

	(*fn)(qt_port, data[i + 3]);

	return 1;
}

static void qt_status_change_check(struct tty_struct *tty,
				   struct urb *urb,
				   struct quatech_port *qt_port,
				   struct usb_serial_port *port)
{
	int flag, i;
	unsigned char *data = urb->transfer_buffer;
	unsigned int RxCount = urb->actual_length;

	for (i = 0; i < RxCount; ++i) {
		/* Look ahead code here */
		if ((i <= (RxCount - 3)) && (data[i] == 0x1b)
		    && (data[i + 1] == 0x1b)) {
			flag = 0;
			switch (data[i + 2]) {
			case 0x00:
			case 0x01:
				flag = qt_status_change((RxCount - 4), data, i,
							qt_port, port);
				if (flag == 1)
					i += 3;
				break;

			case 0xff:
				dev_dbg(&port->dev, "No status sequence.\n");

				ProcessRxChar(tty, port, data[i]);
				ProcessRxChar(tty, port, data[i + 1]);

				i += 2;
				break;
			}
			if (flag == 1)
				continue;
		}

		if (tty && urb->actual_length)
			tty_insert_flip_char(tty, data[i], TTY_NORMAL);

	}
	tty_flip_buffer_push(tty);
}

static void qt_read_bulk_callback(struct urb *urb)
{

	struct usb_serial_port *port = urb->context;
	struct usb_serial *serial = get_usb_serial(port, __func__);
	struct quatech_port *qt_port = qt_get_port_private(port);
	unsigned char *data;
	struct tty_struct *tty;
	unsigned int index;
	unsigned int RxCount;
	int i, result;
	int flag, flag_data;
	int result;

	if (urb->status) {
		qt_port->ReadBulkStopped = 1;
		dev_dbg(&urb->dev->dev, "%s - nonzero write bulk status received: %d\n",
		dev_dbg(&urb->dev->dev,
			"%s - nonzero write bulk status received: %d\n",
			__func__, urb->status);
		return;
	}
@@ -315,13 +382,6 @@ static void qt_read_bulk_callback(struct urb *urb)
	if (!tty)
		return;

	data = urb->transfer_buffer;

	RxCount = urb->actual_length;

	/* index = MINOR(port->tty->device) - serial->minor; */
	index = tty->index - serial->minor;

	dev_dbg(&port->dev,
		"%s - port->RxHolding = %d\n", __func__, qt_port->RxHolding);

@@ -354,62 +414,14 @@ static void qt_read_bulk_callback(struct urb *urb)
	if (urb->status) {
		qt_port->ReadBulkStopped = 1;

		dev_dbg(&port->dev, "%s - nonzero read bulk status received: %d\n",
		dev_dbg(&port->dev,
			"%s - nonzero read bulk status received: %d\n",
			__func__, urb->status);
		goto exit;
	}

	if (RxCount) {
		flag_data = 0;
		for (i = 0; i < RxCount; ++i) {
			/* Look ahead code here */
			if ((i <= (RxCount - 3)) && (data[i] == 0x1b)
			    && (data[i + 1] == 0x1b)) {
				flag = 0;
				switch (data[i + 2]) {
				case 0x00:
					/* line status change 4th byte must follow */
					if (i > (RxCount - 4)) {
						dev_dbg(&port->dev, "Illegal escape seuences in received data\n");
						break;
					}
					ProcessLineStatus(qt_port, data[i + 3]);
					i += 3;
					flag = 1;
					break;

				case 0x01:
					/* Modem status status change 4th byte must follow */
					dev_dbg(&port->dev, "Modem status status.\n");
					if (i > (RxCount - 4)) {
						dev_dbg(&port->dev, "Illegal escape sequences in received data\n");
						break;
					}
					ProcessModemStatus(qt_port,
							   data[i + 3]);
					i += 3;
					flag = 1;
					break;
				case 0xff:
					dev_dbg(&port->dev, "No status sequence.\n");

					if (tty) {
						ProcessRxChar(tty, port, data[i]);
						ProcessRxChar(tty, port, data[i + 1]);
					}
					i += 2;
					break;
				}
				if (flag == 1)
					continue;
			}

			if (tty && urb->actual_length)
				tty_insert_flip_char(tty, data[i], TTY_NORMAL);

		}
		tty_flip_buffer_push(tty);
	}
	if (urb->actual_length)
		qt_status_change_check(tty, urb, qt_port, port);

	/* Continue trying to always read  */
	usb_fill_bulk_urb(port->read_urb, serial->dev,
@@ -420,10 +432,11 @@ static void qt_read_bulk_callback(struct urb *urb)
			  qt_read_bulk_callback, port);
	result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
	if (result)
		dev_dbg(&port->dev, "%s - failed resubmitting read urb, error %d",
		dev_dbg(&port->dev,
			"%s - failed resubmitting read urb, error %d",
			__func__, result);
	else {
		if (RxCount) {
		if (urb->actual_length) {
			tty_flip_buffer_push(tty);
			tty_schedule_flip(tty);
		}