usb: dwc3: gadget: add dwc3_request status tracking
authorFelipe Balbi <felipe.balbi@linux.intel.com>
Fri, 11 Jan 2019 10:57:09 +0000 (12:57 +0200)
committerFelipe Balbi <felipe.balbi@linux.intel.com>
Mon, 28 Jan 2019 10:53:15 +0000 (12:53 +0200)
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: Felipe Balbi <felipe.balbi@linux.intel.com>
drivers/usb/dwc3/core.h
drivers/usb/dwc3/gadget.c
drivers/usb/dwc3/gadget.h

index df87641..5c3ee74 100644 (file)
@@ -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;
index d478d46..9fde486 100644 (file)
@@ -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
index 023a473..6aebe8c 100644 (file)
@@ -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);
 }