static struct usb_request *
 ci_ep_alloc_request(struct usb_ep *ep, unsigned int gfp_flags)
 {
+       struct ci_ep *ci_ep = container_of(ep, struct ci_ep, ep);
+       int num;
        struct ci_req *ci_req;
 
+       num = ci_ep->desc->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
+       if (num == 0 && controller.ep0_req)
+               return &controller.ep0_req->req;
+
        ci_req = memalign(ARCH_DMA_MINALIGN, sizeof(*ci_req));
        if (!ci_req)
                return NULL;
        INIT_LIST_HEAD(&ci_req->queue);
        ci_req->b_buf = 0;
 
+       if (num == 0)
+               controller.ep0_req = ci_req;
+
        return &ci_req->req;
 }
 
        int num, in, _num, _in, i;
        char *buf;
 
-       ci_req = list_first_entry(&ci_ep->queue, struct ci_req, queue);
+       ci_req = controller.ep0_req;
        req = &ci_req->req;
        head = ci_get_qh(0, 0); /* EP0 OUT */
 
                              &controller.gadget.ep_list);
        }
 
+       ci_ep_alloc_request(&controller.ep[0].ep, 0);
+       if (!controller.ep0_req) {
+               free(controller.epts);
+               return -ENOMEM;
+       }
+
        return 0;
 }
 
 
 
 struct ci_drv {
        struct usb_gadget               gadget;
+       struct ci_req                   *ep0_req;
        struct usb_gadget_driver        *driver;
        struct ehci_ctrl                *ctrl;
        struct ept_queue_head           *epts;