mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
usb: dwc3: gadget: Cleanup SG handling
The current logic in dwc3 driver is tracking req->num_queued_sgs and req->sg. But they can be checked base on the num_pending_sgs and num_trbs. They are redundant and can complicate the SG logic. Let's remove them. Signed-off-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com> Link: https://lore.kernel.org/r/96c7bf8f6b3e91e607d5b78ea51cb1d00c614eaf.1731545781.git.Thinh.Nguyen@synopsys.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
b7fc65f514
commit
61440628a4
2 changed files with 7 additions and 38 deletions
|
@ -941,10 +941,8 @@ struct dwc3_hwparams {
|
|||
* @request: struct usb_request to be transferred
|
||||
* @list: a list_head used for request queueing
|
||||
* @dep: struct dwc3_ep owning this request
|
||||
* @sg: pointer to first incomplete sg
|
||||
* @start_sg: pointer to the sg which should be queued next
|
||||
* @num_pending_sgs: counter to pending sgs
|
||||
* @num_queued_sgs: counter to the number of sgs which already got queued
|
||||
* @remaining: amount of data remaining
|
||||
* @status: internal dwc3 request status tracking
|
||||
* @epnum: endpoint number to which this request refers
|
||||
|
@ -964,7 +962,6 @@ struct dwc3_request {
|
|||
struct scatterlist *start_sg;
|
||||
|
||||
unsigned int num_pending_sgs;
|
||||
unsigned int num_queued_sgs;
|
||||
unsigned int remaining;
|
||||
|
||||
unsigned int status;
|
||||
|
|
|
@ -1544,7 +1544,6 @@ static int dwc3_prepare_trbs_sg(struct dwc3_ep *dep,
|
|||
if (!last_sg)
|
||||
req->start_sg = sg_next(s);
|
||||
|
||||
req->num_queued_sgs++;
|
||||
req->num_pending_sgs--;
|
||||
|
||||
/*
|
||||
|
@ -1625,9 +1624,7 @@ static int dwc3_prepare_trbs(struct dwc3_ep *dep)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
req->sg = req->request.sg;
|
||||
req->start_sg = req->sg;
|
||||
req->num_queued_sgs = 0;
|
||||
req->start_sg = req->request.sg;
|
||||
req->num_pending_sgs = req->request.num_mapped_sgs;
|
||||
|
||||
if (req->num_pending_sgs > 0) {
|
||||
|
@ -3472,20 +3469,16 @@ static int dwc3_gadget_ep_reclaim_trb_sg(struct dwc3_ep *dep,
|
|||
int status)
|
||||
{
|
||||
struct dwc3_trb *trb;
|
||||
struct scatterlist *sg = req->sg;
|
||||
struct scatterlist *s;
|
||||
unsigned int num_queued = req->num_queued_sgs;
|
||||
unsigned int num_completed_trbs = req->num_trbs;
|
||||
unsigned int i;
|
||||
int ret = 0;
|
||||
|
||||
for_each_sg(sg, s, num_queued, i) {
|
||||
for (i = 0; i < num_completed_trbs; i++) {
|
||||
trb = &dep->trb_pool[dep->trb_dequeue];
|
||||
|
||||
req->sg = sg_next(s);
|
||||
req->num_queued_sgs--;
|
||||
|
||||
ret = dwc3_gadget_ep_reclaim_completed_trb(dep, req,
|
||||
trb, event, status, true);
|
||||
trb, event, status,
|
||||
!!(trb->ctrl & DWC3_TRB_CTRL_CHN));
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
|
@ -3493,19 +3486,9 @@ static int dwc3_gadget_ep_reclaim_trb_sg(struct dwc3_ep *dep,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int dwc3_gadget_ep_reclaim_trb_linear(struct dwc3_ep *dep,
|
||||
struct dwc3_request *req, const struct dwc3_event_depevt *event,
|
||||
int status)
|
||||
{
|
||||
struct dwc3_trb *trb = &dep->trb_pool[dep->trb_dequeue];
|
||||
|
||||
return dwc3_gadget_ep_reclaim_completed_trb(dep, req, trb,
|
||||
event, status, false);
|
||||
}
|
||||
|
||||
static bool dwc3_gadget_ep_request_completed(struct dwc3_request *req)
|
||||
{
|
||||
return req->num_pending_sgs == 0 && req->num_queued_sgs == 0;
|
||||
return req->num_pending_sgs == 0 && req->num_trbs == 0;
|
||||
}
|
||||
|
||||
static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep,
|
||||
|
@ -3515,24 +3498,13 @@ static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep,
|
|||
int request_status;
|
||||
int ret;
|
||||
|
||||
if (req->request.num_mapped_sgs)
|
||||
ret = dwc3_gadget_ep_reclaim_trb_sg(dep, req, event,
|
||||
status);
|
||||
else
|
||||
ret = dwc3_gadget_ep_reclaim_trb_linear(dep, req, event,
|
||||
status);
|
||||
ret = dwc3_gadget_ep_reclaim_trb_sg(dep, req, event, status);
|
||||
|
||||
req->request.actual = req->request.length - req->remaining;
|
||||
|
||||
if (!dwc3_gadget_ep_request_completed(req))
|
||||
goto out;
|
||||
|
||||
if (req->needs_extra_trb) {
|
||||
ret = dwc3_gadget_ep_reclaim_trb_linear(dep, req, event,
|
||||
status);
|
||||
req->needs_extra_trb = false;
|
||||
}
|
||||
|
||||
/*
|
||||
* The event status only reflects the status of the TRB with IOC set.
|
||||
* For the requests that don't set interrupt on completion, the driver
|
||||
|
|
Loading…
Add table
Reference in a new issue