if (dev->out) {
                usb_ep_disable (dev->out_ep);
                if (dev->rx_req) {
-                       usb_ep_free_request (dev->in_ep, dev->rx_req);
+                       usb_ep_free_request (dev->out_ep, dev->rx_req);
                        dev->rx_req=NULL;
                }
        }
 
        debug("%s...\n", __func__);
 
+       /* we've already been disconnected ... no i/o is active */
+       if (dev->req) {
+               usb_ep_free_request (gadget->ep0, dev->req);
+               dev->req = NULL;
+       }
        if (dev->stat_req) {
                usb_ep_free_request (dev->status_ep, dev->stat_req);
                dev->stat_req = NULL;
        }
 
        if (dev->rx_req) {
-               usb_ep_free_request (dev->in_ep, dev->rx_req);
+               usb_ep_free_request (dev->out_ep, dev->rx_req);
                dev->rx_req=NULL;
        }