Commit a3af5e3a authored by Felipe Balbi's avatar Felipe Balbi
Browse files

usb: dwc3: gadget: add dwc3_request status tracking



This patch starts tracking dwc3_request status. A following patch will
build on top of this to prevent a request from being queued twice.

Signed-off-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
parent 546970fd
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -863,6 +863,7 @@ struct dwc3_hwparams {
 * @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
 * @trb: pointer to struct dwc3_trb
 * @trb_dma: DMA address of @trb
@@ -883,6 +884,14 @@ struct dwc3_request {
	unsigned		num_pending_sgs;
	unsigned int		num_queued_sgs;
	unsigned		remaining;

	unsigned int		status;
#define DWC3_REQUEST_STATUS_QUEUED	0
#define DWC3_REQUEST_STATUS_STARTED	1
#define DWC3_REQUEST_STATUS_CANCELLED	2
#define DWC3_REQUEST_STATUS_COMPLETED	3
#define DWC3_REQUEST_STATUS_UNKNOWN	-1

	u8			epnum;
	struct dwc3_trb		*trb;
	dma_addr_t		trb_dma;
+3 −0
Original line number Diff line number Diff line
@@ -209,6 +209,7 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req,
	struct dwc3			*dwc = dep->dwc;

	dwc3_gadget_del_and_unmap_request(dep, req, status);
	req->status = DWC3_REQUEST_STATUS_COMPLETED;

	spin_unlock(&dwc->lock);
	usb_gadget_giveback_request(&dep->endpoint, &req->request);
@@ -847,6 +848,7 @@ static struct usb_request *dwc3_gadget_ep_alloc_request(struct usb_ep *ep,
	req->direction	= dep->direction;
	req->epnum	= dep->number;
	req->dep	= dep;
	req->status	= DWC3_REQUEST_STATUS_UNKNOWN;

	trace_dwc3_alloc_request(req);

@@ -1443,6 +1445,7 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
	trace_dwc3_ep_queue(req);

	list_add_tail(&req->list, &dep->pending_list);
	req->status = DWC3_REQUEST_STATUS_QUEUED;

	/*
	 * NOTICE: Isochronous endpoints should NEVER be prestarted. We must
+2 −0
Original line number Diff line number Diff line
@@ -76,6 +76,7 @@ static inline void dwc3_gadget_move_started_request(struct dwc3_request *req)
	struct dwc3_ep		*dep = req->dep;

	req->started = true;
	req->status = DWC3_REQUEST_STATUS_STARTED;
	list_move_tail(&req->list, &dep->started_list);
}

@@ -91,6 +92,7 @@ static inline void dwc3_gadget_move_cancelled_request(struct dwc3_request *req)
	struct dwc3_ep		*dep = req->dep;

	req->started = false;
	req->status = DWC3_REQUEST_STATUS_CANCELLED;
	list_move_tail(&req->list, &dep->cancelled_list);
}