usb: musb: gadget: do not poke with gadget's list_head
[pandora-kernel.git] / drivers / usb / musb / musb_gadget_ep0.c
index 6dd03f4..75a542e 100644 (file)
@@ -304,8 +304,7 @@ __acquires(musb->lock)
                                }
 
                                /* Maybe start the first request in the queue */
-                               request = to_musb_request(
-                                               next_request(musb_ep));
+                               request = next_request(musb_ep);
                                if (!musb_ep->busy && request) {
                                        DBG(3, "restarting the request\n");
                                        musb_ep_restart(musb, request);
@@ -491,10 +490,12 @@ stall:
 static void ep0_rxstate(struct musb *musb)
 {
        void __iomem            *regs = musb->control_ep->regs;
+       struct musb_request     *request;
        struct usb_request      *req;
        u16                     count, csr;
 
-       req = next_ep0_request(musb);
+       request = next_ep0_request(musb);
+       req = &request->request;
 
        /* read packet and ack; or stall because of gadget driver bug:
         * should have provided the rx buffer before setup() returned.
@@ -544,17 +545,20 @@ static void ep0_rxstate(struct musb *musb)
 static void ep0_txstate(struct musb *musb)
 {
        void __iomem            *regs = musb->control_ep->regs;
-       struct usb_request      *request = next_ep0_request(musb);
+       struct musb_request     *req = next_ep0_request(musb);
+       struct usb_request      *request;
        u16                     csr = MUSB_CSR0_TXPKTRDY;
        u8                      *fifo_src;
        u8                      fifo_count;
 
-       if (!request) {
+       if (!req) {
                /* WARN_ON(1); */
                DBG(2, "odd; csr0 %04x\n", musb_readw(regs, MUSB_CSR0));
                return;
        }
 
+       request = &req->request;
+
        /* load the data */
        fifo_src = (u8 *) request->buf + request->actual;
        fifo_count = min((unsigned) MUSB_EP0_FIFOSIZE,
@@ -598,7 +602,7 @@ static void ep0_txstate(struct musb *musb)
 static void
 musb_read_setup(struct musb *musb, struct usb_ctrlrequest *req)
 {
-       struct usb_request      *r;
+       struct musb_request     *r;
        void __iomem            *regs = musb->control_ep->regs;
 
        musb_read_fifo(&musb->endpoints[0], sizeof *req, (u8 *)req);
@@ -616,7 +620,7 @@ musb_read_setup(struct musb *musb, struct usb_ctrlrequest *req)
        /* clean up any leftover transfers */
        r = next_ep0_request(musb);
        if (r)
-               musb_g_ep0_giveback(musb, r);
+               musb_g_ep0_giveback(musb, &r->request);
 
        /* For zero-data requests we want to delay the STATUS stage to
         * avoid SETUPEND errors.  If we read data (OUT), delay accepting
@@ -758,11 +762,11 @@ irqreturn_t musb_g_ep0_irq(struct musb *musb)
        case MUSB_EP0_STAGE_STATUSOUT:
                /* end of sequence #1: write to host (TX state) */
                {
-                       struct usb_request      *req;
+                       struct musb_request     *req;
 
                        req = next_ep0_request(musb);
                        if (req)
-                               musb_g_ep0_giveback(musb, req);
+                               musb_g_ep0_giveback(musb, &req->request);
                }
 
                /*
@@ -961,7 +965,7 @@ musb_g_ep0_queue(struct usb_ep *e, struct usb_request *r, gfp_t gfp_flags)
        }
 
        /* add request to the list */
-       list_add_tail(&(req->request.list), &(ep->req_list));
+       list_add_tail(&req->list, &ep->req_list);
 
        DBG(3, "queue to %s (%s), length=%d\n",
                        ep->name, ep->is_in ? "IN/TX" : "OUT/RX",