Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: cdnsp: Fix incorrect usb_request status

Fix changes incorrect usb_request->status returned during disabling
endpoints. Before fix the status returned during dequeuing requests
while disabling endpoint was ECONNRESET.
Patch change it to ESHUTDOWN.

Patch fixes issue detected during testing UVC gadget.
During stopping streaming the class starts dequeuing usb requests and
controller driver returns the -ECONNRESET status. After completion
requests the class or application "uvc-gadget" try to queue this
request again. Changing this status to ESHUTDOWN cause that UVC assumes
that endpoint is disabled, or device is disconnected and stops
re-queuing usb requests.

Fixes: 3d82904559f4 ("usb: cdnsp: cdns3 Add main part of Cadence USBSSP DRD Driver")
cc: stable@vger.kernel.org
Signed-off-by: Pawel Laszczak <pawell@cadence.com>
Reviewed-by: Peter Chen <peter.chen@kernel.org>
Link: https://lore.kernel.org/r/PH7PR07MB9538E8CA7A2096AAF6A3718FDD9E2@PH7PR07MB9538.namprd07.prod.outlook.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Pawel Laszczak and committed by
Greg Kroah-Hartman
1702bec4 77e85107

+4 -2
+4 -2
drivers/usb/cdns3/cdnsp-ring.c
··· 718 718 seg = cdnsp_trb_in_td(pdev, cur_td->start_seg, cur_td->first_trb, 719 719 cur_td->last_trb, hw_deq); 720 720 721 - if (seg && (pep->ep_state & EP_ENABLED)) 721 + if (seg && (pep->ep_state & EP_ENABLED) && 722 + !(pep->ep_state & EP_DIS_IN_RROGRESS)) 722 723 cdnsp_find_new_dequeue_state(pdev, pep, preq->request.stream_id, 723 724 cur_td, &deq_state); 724 725 else ··· 737 736 * During disconnecting all endpoint will be disabled so we don't 738 737 * have to worry about updating dequeue pointer. 739 738 */ 740 - if (pdev->cdnsp_state & CDNSP_STATE_DISCONNECT_PENDING) { 739 + if (pdev->cdnsp_state & CDNSP_STATE_DISCONNECT_PENDING || 740 + pep->ep_state & EP_DIS_IN_RROGRESS) { 741 741 status = -ESHUTDOWN; 742 742 ret = cdnsp_cmd_set_deq(pdev, pep, &deq_state); 743 743 }