Commit fb8bceab authored by Udipto Goswami's avatar Udipto Goswami Committed by Gerrit - the friendly Code Review server
Browse files

usb: gadget: u_serial: Rectify the list operations is rx/tx path



Commit I714c7fe681 ("usb: gadget: u_serial: Dequeue request on
gserial_disconnect") had introduced additional two pools,
queued_write_pool & queued_read_pool in order to dequeue requests
on gserial_disconnect. Currently in the rx/tx paths, the driver
extracts the request from write/read_pool and moves it to the
queued pool. This is done before the request is queued.
Now when the completion is called, the request is added back
to the head write/read_pool.

The approach should be when the request is successfully queued,
only then move it to the queued pool and when the request_completion
is called move it back to the write/read pool. This will ensure
that the request is only one list either read/write pool or the
queued_read/write pool.

Change-Id: Ic16cb8ec09c5a58b3ea673750f06468f184e724c
Signed-off-by: default avatarUdipto Goswami <quic_ugoswami@quicinc.com>
parent b48d25e6
......@@ -281,6 +281,7 @@ __acquires(&port->port_lock)
break;
}
list_move_tail(&req->list, &port->queued_write_pool);
port->write_started++;
/* abort immediately after disconnect */
......@@ -319,7 +320,6 @@ __acquires(&port->port_lock)
break;
req = list_entry(pool->next, struct usb_request, list);
list_move_tail(&req->list, &port->queued_read_pool);
req->length = out->maxpacket;
/* drop lock while we call out; the controller driver
......@@ -335,6 +335,7 @@ __acquires(&port->port_lock)
list_add(&req->list, pool);
break;
}
list_move_tail(&req->list, &port->queued_read_pool);
port->read_started++;
/* abort immediately after disconnect */
......@@ -453,7 +454,7 @@ static void gs_read_complete(struct usb_ep *ep, struct usb_request *req)
/* Queue all received data until the tty layer is ready for it. */
spin_lock(&port->port_lock);
list_add_tail(&req->list, &port->read_queue);
list_move_tail(&req->list, &port->read_queue);
schedule_delayed_work(&port->push, 0);
spin_unlock(&port->port_lock);
}
......@@ -463,7 +464,7 @@ static void gs_write_complete(struct usb_ep *ep, struct usb_request *req)
struct gs_port *port = ep->driver_data;
spin_lock(&port->port_lock);
list_add(&req->list, &port->write_pool);
list_move_tail(&req->list, &port->write_pool);
port->write_started--;
switch (req->status) {
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment