mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-10 06:09:23 -04:00
usb: f_qdss: Flush connect_work in qdss close
When qdss open and close are called back to back at a high rate, connect_work that gets queued in qdss open can execute after qdss close. For qdss HW path the connect work that gets scheduled as part of the next qdss open results in ep config failure as the ep is already configured during previous connect work. Now before queuing the request if there is a qdss close it would reset the dbm ep configuration thus routing this request via software path instead of dbm path. The subsequent dequeue would lead to a NULL pointer dereference of completion callback. Fix this by flushing connect_work as part of qdss close for graceful termination. Change-Id: I8edf73ea1f87e297297828e6e25c7c14a422ec3a Signed-off-by: Elson Roy Serrao <eserrao@codeaurora.org>
This commit is contained in:
parent
5bbfc7877b
commit
4aba93633a
1 changed files with 4 additions and 2 deletions
|
|
@ -591,8 +591,8 @@ static void usb_qdss_connect_work(struct work_struct *work)
|
|||
|
||||
qdss = container_of(work, struct f_qdss, connect_w);
|
||||
|
||||
/* If qdss is closed or cable is removed, discard connect_work */
|
||||
if (qdss->qdss_close || qdss->usb_connected == 0) {
|
||||
/* If cable is removed, discard connect_work */
|
||||
if (qdss->usb_connected == 0) {
|
||||
cancel_work_sync(&qdss->disconnect_w);
|
||||
return;
|
||||
}
|
||||
|
|
@ -927,6 +927,8 @@ void usb_qdss_close(struct usb_qdss_ch *ch)
|
|||
|
||||
if (qdss->endless_req) {
|
||||
spin_unlock_irqrestore(&channel_lock, flags);
|
||||
/* Flush connect work before proceeding with de-queue */
|
||||
flush_work(&qdss->connect_w);
|
||||
usb_ep_dequeue(qdss->port.data, qdss->endless_req);
|
||||
spin_lock_irqsave(&channel_lock, flags);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue