static int __enable_ep(struct usb_ep *ep, struct usb_endpoint_descriptor *desc)
 {
-       int err = usb_ep_enable(ep, desc);
+       int err;
+       ep->desc = desc;
+       err = usb_ep_enable(ep);
        ep->driver_data = dbgp.gadget;
        return err;
 }
        dbgp.serial->in = dbgp.i_ep;
        dbgp.serial->out = dbgp.o_ep;
 
-       dbgp.serial->in_desc = &i_desc;
-       dbgp.serial->out_desc = &o_desc;
+       dbgp.serial->in->desc = &i_desc;
+       dbgp.serial->out->desc = &o_desc;
 
        if (gserial_setup(gadget, 1) < 0) {
                stp = 3;
 
        struct acm_ep_descs             hs;
 
        struct usb_ep                   *notify;
-       struct usb_endpoint_descriptor  *notify_desc;
        struct usb_request              *notify_req;
 
        struct usb_cdc_line_coding      port_line_coding;       /* 8-N-1 etc */
                        usb_ep_disable(acm->notify);
                } else {
                        VDBG(cdev, "init acm ctrl interface %d\n", intf);
-                       acm->notify_desc = ep_choose(cdev->gadget,
+                       acm->notify->desc = ep_choose(cdev->gadget,
                                        acm->hs.notify,
                                        acm->fs.notify);
                }
-               usb_ep_enable(acm->notify, acm->notify_desc);
+               usb_ep_enable(acm->notify);
                acm->notify->driver_data = acm;
 
        } else if (intf == acm->data_id) {
                        gserial_disconnect(&acm->port);
                } else {
                        DBG(cdev, "activate acm ttyGS%d\n", acm->port_num);
-                       acm->port.in_desc = ep_choose(cdev->gadget,
+                       acm->port.in->desc = ep_choose(cdev->gadget,
                                        acm->hs.in, acm->fs.in);
-                       acm->port.out_desc = ep_choose(cdev->gadget,
+                       acm->port.out->desc = ep_choose(cdev->gadget,
                                        acm->hs.out, acm->fs.out);
                }
                gserial_connect(&acm->port, acm->port_num);
 
 
        /* endpoints handle full and/or high speeds */
        struct usb_ep                   *out_ep;
-       struct usb_endpoint_descriptor  *out_desc;
 
        spinlock_t                      lock;
        struct f_audio_buf *copy_buf;
 
        if (intf == 1) {
                if (alt == 1) {
-                       usb_ep_enable(out_ep, audio->out_desc);
+                       usb_ep_enable(out_ep);
                        out_ep->driver_data = audio;
                        audio->copy_buf = f_audio_buffer_alloc(audio_buf_size);
                        if (IS_ERR(audio->copy_buf))
        if (!ep)
                goto fail;
        audio->out_ep = ep;
+       audio->out_ep->desc = &as_out_ep_desc;
        ep->driver_data = cdev; /* claim */
 
        status = -ENOMEM;
        audio->card.func.set_alt = f_audio_set_alt;
        audio->card.func.setup = f_audio_setup;
        audio->card.func.disable = f_audio_disable;
-       audio->out_desc = &as_out_ep_desc;
 
        control_selector_init(audio);
 
 
        struct ecm_ep_descs             hs;
 
        struct usb_ep                   *notify;
-       struct usb_endpoint_descriptor  *notify_desc;
        struct usb_request              *notify_req;
        u8                              notify_state;
        bool                            is_open;
                        usb_ep_disable(ecm->notify);
                } else {
                        VDBG(cdev, "init ecm ctrl %d\n", intf);
-                       ecm->notify_desc = ep_choose(cdev->gadget,
+                       ecm->notify->desc = ep_choose(cdev->gadget,
                                        ecm->hs.notify,
                                        ecm->fs.notify);
                }
-               usb_ep_enable(ecm->notify, ecm->notify_desc);
+               usb_ep_enable(ecm->notify);
                ecm->notify->driver_data = ecm;
 
        /* Data interface has two altsettings, 0 and 1 */
                        gether_disconnect(&ecm->port);
                }
 
-               if (!ecm->port.in) {
+               if (!ecm->port.in_ep->desc) {
                        DBG(cdev, "init ecm\n");
-                       ecm->port.in = ep_choose(cdev->gadget,
+                       ecm->port.in_ep->desc = ep_choose(cdev->gadget,
                                        ecm->hs.in, ecm->fs.in);
-                       ecm->port.out = ep_choose(cdev->gadget,
+                       ecm->port.out_ep->desc = ep_choose(cdev->gadget,
                                        ecm->hs.out, ecm->fs.out);
                }
 
        if (ecm->notify->driver_data) {
                usb_ep_disable(ecm->notify);
                ecm->notify->driver_data = NULL;
-               ecm->notify_desc = NULL;
+               ecm->notify->desc = NULL;
        }
 }
 
        /* we might as well release our claims on endpoints */
        if (ecm->notify)
                ecm->notify->driver_data = NULL;
-       if (ecm->port.out)
+       if (ecm->port.out_ep->desc)
                ecm->port.out_ep->driver_data = NULL;
-       if (ecm->port.in)
+       if (ecm->port.in_ep->desc)
                ecm->port.in_ep->driver_data = NULL;
 
        ERROR(cdev, "%s: can't bind, err %d\n", f->name, status);
 
                        gether_disconnect(&eem->port);
                }
 
-               if (!eem->port.in) {
+               if (!eem->port.in_ep->desc) {
                        DBG(cdev, "init eem\n");
-                       eem->port.in = ep_choose(cdev->gadget,
+                       eem->port.in_ep->desc = ep_choose(cdev->gadget,
                                        eem->hs.in, eem->fs.in);
-                       eem->port.out = ep_choose(cdev->gadget,
+                       eem->port.out_ep->desc = ep_choose(cdev->gadget,
                                        eem->hs.out, eem->fs.out);
                }
 
                usb_free_descriptors(f->descriptors);
 
        /* we might as well release our claims on endpoints */
-       if (eem->port.out)
+       if (eem->port.out_ep->desc)
                eem->port.out_ep->driver_data = NULL;
-       if (eem->port.in)
+       if (eem->port.in_ep->desc)
                eem->port.in_ep->driver_data = NULL;
 
        ERROR(cdev, "%s: can't bind, err %d\n", f->name, status);
 
                ds = ep->descs[ep->descs[1] ? 1 : 0];
 
                ep->ep->driver_data = ep;
-               ret = usb_ep_enable(ep->ep, ds);
+               ep->ep->desc = ds;
+               ret = usb_ep_enable(ep->ep);
                if (likely(!ret)) {
                        epfile->ep = ep;
                        epfile->in = usb_endpoint_dir_in(ds);
 
 {
        struct usb_composite_dev                *cdev = f->config->cdev;
        struct f_hidg                           *hidg = func_to_hidg(f);
-       const struct usb_endpoint_descriptor    *ep_desc;
        int status = 0;
 
        VDBG(cdev, "hidg_set_alt intf:%d alt:%d\n", intf, alt);
                if (hidg->in_ep->driver_data != NULL)
                        usb_ep_disable(hidg->in_ep);
 
-               ep_desc = ep_choose(f->config->cdev->gadget,
+               hidg->in_ep->desc = ep_choose(f->config->cdev->gadget,
                                hidg->hs_in_ep_desc, hidg->fs_in_ep_desc);
-               status = usb_ep_enable(hidg->in_ep, ep_desc);
+               status = usb_ep_enable(hidg->in_ep);
                if (status < 0) {
                        ERROR(cdev, "Enable endpoint FAILED!\n");
                        goto fail;
 
 enable_loopback(struct usb_composite_dev *cdev, struct f_loopback *loop)
 {
        int                                     result = 0;
-       const struct usb_endpoint_descriptor    *src, *sink;
        struct usb_ep                           *ep;
        struct usb_request                      *req;
        unsigned                                i;
 
-       src = ep_choose(cdev->gadget,
-                       &hs_loop_source_desc, &fs_loop_source_desc);
-       sink = ep_choose(cdev->gadget,
-                       &hs_loop_sink_desc, &fs_loop_sink_desc);
-
        /* one endpoint writes data back IN to the host */
        ep = loop->in_ep;
-       result = usb_ep_enable(ep, src);
+       ep->desc = ep_choose(cdev->gadget,
+                       &hs_loop_source_desc, &fs_loop_source_desc);
+       result = usb_ep_enable(ep);
        if (result < 0)
                return result;
        ep->driver_data = loop;
 
        /* one endpoint just reads OUT packets */
        ep = loop->out_ep;
-       result = usb_ep_enable(ep, sink);
+       ep->desc = ep_choose(cdev->gadget,
+                       &hs_loop_sink_desc, &fs_loop_sink_desc);
+       result = usb_ep_enable(ep);
        if (result < 0) {
 fail0:
                ep = loop->in_ep;
 
        int     rc;
 
        ep->driver_data = common;
-       rc = usb_ep_enable(ep, d);
+       ep->desc = (struct usb_endpoint_descriptor *)d;
+       rc = usb_ep_enable(ep);
        if (rc)
                ERROR(common, "can't enable %s, result %d\n", ep->name, rc);
        return rc;
 
        struct ncm_ep_descs             hs;
 
        struct usb_ep                   *notify;
-       struct usb_endpoint_descriptor  *notify_desc;
        struct usb_request              *notify_req;
        u8                              notify_state;
        bool                            is_open;
                        usb_ep_disable(ncm->notify);
                } else {
                        DBG(cdev, "init ncm ctrl %d\n", intf);
-                       ncm->notify_desc = ep_choose(cdev->gadget,
+                       ncm->notify->desc = ep_choose(cdev->gadget,
                                        ncm->hs.notify,
                                        ncm->fs.notify);
                }
-               usb_ep_enable(ncm->notify, ncm->notify_desc);
+               usb_ep_enable(ncm->notify);
                ncm->notify->driver_data = ncm;
 
        /* Data interface has two altsettings, 0 and 1 */
                if (alt == 1) {
                        struct net_device       *net;
 
-                       if (!ncm->port.in) {
+                       if (!ncm->port.in_ep->desc) {
                                DBG(cdev, "init ncm\n");
-                               ncm->port.in = ep_choose(cdev->gadget,
+                               ncm->port.in_ep->desc = ep_choose(cdev->gadget,
                                                         ncm->hs.in,
                                                         ncm->fs.in);
-                               ncm->port.out = ep_choose(cdev->gadget,
+                               ncm->port.out_ep->desc = ep_choose(cdev->gadget,
                                                          ncm->hs.out,
                                                          ncm->fs.out);
                        }
        if (ncm->notify->driver_data) {
                usb_ep_disable(ncm->notify);
                ncm->notify->driver_data = NULL;
-               ncm->notify_desc = NULL;
+               ncm->notify->desc = NULL;
        }
 }
 
        /* we might as well release our claims on endpoints */
        if (ncm->notify)
                ncm->notify->driver_data = NULL;
-       if (ncm->port.out)
+       if (ncm->port.out_ep->desc)
                ncm->port.out_ep->driver_data = NULL;
-       if (ncm->port.in)
+       if (ncm->port.in_ep->desc)
                ncm->port.in_ep->driver_data = NULL;
 
        ERROR(cdev, "%s: can't bind, err %d\n", f->name, status);
 
                        gserial_disconnect(&obex->port);
                }
 
-               if (!obex->port.in_desc) {
+               if (!obex->port.in->desc) {
                        DBG(cdev, "init obex ttyGS%d\n", obex->port_num);
-                       obex->port.in_desc = ep_choose(cdev->gadget,
+                       obex->port.in->desc = ep_choose(cdev->gadget,
                                        obex->hs.obex_in, obex->fs.obex_in);
-                       obex->port.out_desc = ep_choose(cdev->gadget,
+                       obex->port.out->desc = ep_choose(cdev->gadget,
                                        obex->hs.obex_out, obex->fs.obex_out);
                }
 
 
                spin_lock(&port->lock);
                __pn_reset(f);
                if (alt == 1) {
-                       struct usb_endpoint_descriptor *out, *in;
                        int i;
 
-                       out = ep_choose(gadget,
+                       fp->out_ep->desc = ep_choose(gadget,
                                        &pn_hs_sink_desc,
                                        &pn_fs_sink_desc);
-                       in = ep_choose(gadget,
+                       fp->in_ep->desc = ep_choose(gadget,
                                        &pn_hs_source_desc,
                                        &pn_fs_source_desc);
-                       usb_ep_enable(fp->out_ep, out);
-                       usb_ep_enable(fp->in_ep, in);
+                       usb_ep_enable(fp->out_ep);
+                       usb_ep_enable(fp->in_ep);
 
                        port->usb = fp;
                        fp->out_ep->driver_data = fp;
 
        struct rndis_ep_descs           hs;
 
        struct usb_ep                   *notify;
-       struct usb_endpoint_descriptor  *notify_desc;
        struct usb_request              *notify_req;
        atomic_t                        notify_count;
 };
                        usb_ep_disable(rndis->notify);
                } else {
                        VDBG(cdev, "init rndis ctrl %d\n", intf);
-                       rndis->notify_desc = ep_choose(cdev->gadget,
+                       rndis->notify->desc = ep_choose(cdev->gadget,
                                        rndis->hs.notify,
                                        rndis->fs.notify);
                }
-               usb_ep_enable(rndis->notify, rndis->notify_desc);
+               usb_ep_enable(rndis->notify);
                rndis->notify->driver_data = rndis;
 
        } else if (intf == rndis->data_id) {
                        gether_disconnect(&rndis->port);
                }
 
-               if (!rndis->port.in) {
+               if (!rndis->port.in_ep->desc) {
                        DBG(cdev, "init rndis\n");
-                       rndis->port.in = ep_choose(cdev->gadget,
+                       rndis->port.in_ep->desc = ep_choose(cdev->gadget,
                                        rndis->hs.in, rndis->fs.in);
-                       rndis->port.out = ep_choose(cdev->gadget,
+                       rndis->port.out_ep->desc = ep_choose(cdev->gadget,
                                        rndis->hs.out, rndis->fs.out);
                }
 
        /* we might as well release our claims on endpoints */
        if (rndis->notify)
                rndis->notify->driver_data = NULL;
-       if (rndis->port.out)
+       if (rndis->port.out_ep->desc)
                rndis->port.out_ep->driver_data = NULL;
-       if (rndis->port.in)
+       if (rndis->port.in_ep->desc)
                rndis->port.in_ep->driver_data = NULL;
 
        ERROR(cdev, "%s: can't bind, err %d\n", f->name, status);
 
                gserial_disconnect(&gser->port);
        } else {
                DBG(cdev, "activate generic ttyGS%d\n", gser->port_num);
-               gser->port.in_desc = ep_choose(cdev->gadget,
+               gser->port.in->desc = ep_choose(cdev->gadget,
                                gser->hs.in, gser->fs.in);
-               gser->port.out_desc = ep_choose(cdev->gadget,
+               gser->port.out->desc = ep_choose(cdev->gadget,
                                gser->hs.out, gser->fs.out);
        }
        gserial_connect(&gser->port, gser->port_num);
 
 enable_source_sink(struct usb_composite_dev *cdev, struct f_sourcesink *ss)
 {
        int                                     result = 0;
-       const struct usb_endpoint_descriptor    *src, *sink;
        struct usb_ep                           *ep;
 
-       src = ep_choose(cdev->gadget, &hs_source_desc, &fs_source_desc);
-       sink = ep_choose(cdev->gadget, &hs_sink_desc, &fs_sink_desc);
-
        /* one endpoint writes (sources) zeroes IN (to the host) */
        ep = ss->in_ep;
-       result = usb_ep_enable(ep, src);
+       ep->desc = ep_choose(cdev->gadget, &hs_source_desc, &fs_source_desc);
+       result = usb_ep_enable(ep);
        if (result < 0)
                return result;
        ep->driver_data = ss;
 
        /* one endpoint reads (sinks) anything OUT (from the host) */
        ep = ss->out_ep;
-       result = usb_ep_enable(ep, sink);
+       ep->desc = ep_choose(cdev->gadget, &hs_sink_desc, &fs_sink_desc);
+       result = usb_ep_enable(ep);
        if (result < 0)
                goto fail;
        ep->driver_data = ss;
 
        }
 
        DBG(cdev, "init + activate cdc subset\n");
-       geth->port.in = ep_choose(cdev->gadget,
+       geth->port.in_ep->desc = ep_choose(cdev->gadget,
                        geth->hs.in, geth->fs.in);
-       geth->port.out = ep_choose(cdev->gadget,
+       geth->port.out_ep->desc = ep_choose(cdev->gadget,
                        geth->hs.out, geth->fs.out);
 
        net = gether_connect(&geth->port);
 
 fail:
        /* we might as well release our claims on endpoints */
-       if (geth->port.out)
+       if (geth->port.out_ep->desc)
                geth->port.out_ep->driver_data = NULL;
-       if (geth->port.in)
+       if (geth->port.in_ep->desc)
                geth->port.in_ep->driver_data = NULL;
 
        ERROR(cdev, "%s: can't bind, err %d\n", f->name, status);
 
                if (uvc->state != UVC_STATE_CONNECTED)
                        return 0;
 
-               if (uvc->video.ep)
-                       usb_ep_enable(uvc->video.ep, &uvc_streaming_ep);
+               if (uvc->video.ep) {
+                       uvc->video.ep->desc = &uvc_streaming_ep;
+                       usb_ep_enable(uvc->video.ep);
+               }
 
                memset(&v4l2_event, 0, sizeof(v4l2_event));
                v4l2_event.type = UVC_EVENT_STREAMON;
 
        int     rc;
 
        ep->driver_data = fsg;
-       rc = usb_ep_enable(ep, d);
+       ep->desc = d;
+       rc = usb_ep_enable(ep);
        if (rc)
                ERROR(fsg, "can't enable %s, result %d\n", ep->name, rc);
        return rc;
 
        struct usb_ep *ep;
        unsigned i;
 
-       err = usb_ep_enable(dev->in_ep, &bulk_in_desc);
+       dev->in_ep->desc = &bulk_in_desc;
+       err = usb_ep_enable(dev->in_ep);
        if (err) {
                ERROR(dev, "can't start %s: %d\n", dev->in_ep->name, err);
                goto fail;
        }
        dev->in_ep->driver_data = dev;
 
-       err = usb_ep_enable(dev->out_ep, &bulk_out_desc);
+       dev->out_ep->desc = &bulk_out_desc;
+       err = usb_ep_enable(dev->out_ep);
        if (err) {
                ERROR(dev, "can't start %s: %d\n", dev->out_ep->name, err);
                goto fail;
 
        switch (data->dev->gadget->speed) {
        case USB_SPEED_LOW:
        case USB_SPEED_FULL:
-               value = usb_ep_enable (ep, &data->desc);
+               ep->desc = &data->desc;
+               value = usb_ep_enable(ep);
                if (value == 0)
                        data->state = STATE_EP_ENABLED;
                break;
 #ifdef CONFIG_USB_GADGET_DUALSPEED
        case USB_SPEED_HIGH:
                /* fails if caller didn't provide that descriptor... */
-               value = usb_ep_enable (ep, &data->hs_desc);
+               ep->desc = &data->hs_desc;
+               value = usb_ep_enable(ep);
                if (value == 0)
                        data->state = STATE_EP_ENABLED;
                break;
 
        u8                      config;
        s8                      interface;
        struct usb_ep           *in_ep, *out_ep;
-       const struct usb_endpoint_descriptor
-                               *in, *out;
+
        struct list_head        rx_reqs;        /* List of free RX structs */
        struct list_head        rx_reqs_active; /* List of Active RX xfers */
        struct list_head        rx_buffers;     /* List of completed xfers */
 {
        int                     result = 0;
 
-       dev->in = ep_desc(dev->gadget, &hs_ep_in_desc, &fs_ep_in_desc);
+       dev->in_ep->desc = ep_desc(dev->gadget, &hs_ep_in_desc, &fs_ep_in_desc);
        dev->in_ep->driver_data = dev;
 
-       dev->out = ep_desc(dev->gadget, &hs_ep_out_desc, &fs_ep_out_desc);
+       dev->out_ep->desc = ep_desc(dev->gadget, &hs_ep_out_desc,
+                                   &fs_ep_out_desc);
        dev->out_ep->driver_data = dev;
 
-       result = usb_ep_enable(dev->in_ep, dev->in);
+       result = usb_ep_enable(dev->in_ep);
        if (result != 0) {
                DBG(dev, "enable %s --> %d\n", dev->in_ep->name, result);
                goto done;
        }
 
-       result = usb_ep_enable(dev->out_ep, dev->out);
+       result = usb_ep_enable(dev->out_ep);
        if (result != 0) {
                DBG(dev, "enable %s --> %d\n", dev->in_ep->name, result);
                goto done;
        if (result != 0) {
                (void) usb_ep_disable(dev->in_ep);
                (void) usb_ep_disable(dev->out_ep);
-               dev->in = NULL;
-               dev->out = NULL;
+               dev->in_ep->desc = NULL;
+               dev->out_ep->desc = NULL;
        }
 
        /* caller is responsible for cleanup on error */
 
        DBG(dev, "%s\n", __func__);
 
-       if (dev->in)
+       if (dev->in_ep->desc)
                usb_ep_disable(dev->in_ep);
 
-       if (dev->out)
+       if (dev->out_ep->desc)
                usb_ep_disable(dev->out_ep);
 
+       dev->in_ep->desc = NULL;
+       dev->out_ep->desc = NULL;
        dev->interface = -1;
 }
 
                list_add(&req->list, &dev->tx_reqs);
        }
 
-       if (usb_ep_enable(dev->in_ep, dev->in))
+       if (usb_ep_enable(dev->in_ep))
                DBG(dev, "Failed to enable USB in_ep\n");
-       if (usb_ep_enable(dev->out_ep, dev->out))
+       if (usb_ep_enable(dev->out_ep))
                DBG(dev, "Failed to enable USB out_ep\n");
 
        wake_up_interruptible(&dev->rx_wait);
 
                usb_ep_disable(link->out_ep);
                if (netif_carrier_ok(net)) {
                        DBG(dev, "host still using in/out endpoints\n");
-                       usb_ep_enable(link->in_ep, link->in);
-                       usb_ep_enable(link->out_ep, link->out);
+                       usb_ep_enable(link->in_ep);
+                       usb_ep_enable(link->out_ep);
                }
        }
        spin_unlock_irqrestore(&dev->lock, flags);
                return ERR_PTR(-EINVAL);
 
        link->in_ep->driver_data = dev;
-       result = usb_ep_enable(link->in_ep, link->in);
+       result = usb_ep_enable(link->in_ep);
        if (result != 0) {
                DBG(dev, "enable %s --> %d\n",
                        link->in_ep->name, result);
        }
 
        link->out_ep->driver_data = dev;
-       result = usb_ep_enable(link->out_ep, link->out);
+       result = usb_ep_enable(link->out_ep);
        if (result != 0) {
                DBG(dev, "enable %s --> %d\n",
                        link->out_ep->name, result);
        }
        spin_unlock(&dev->req_lock);
        link->in_ep->driver_data = NULL;
-       link->in = NULL;
+       link->in_ep->desc = NULL;
 
        usb_ep_disable(link->out_ep);
        spin_lock(&dev->req_lock);
        }
        spin_unlock(&dev->req_lock);
        link->out_ep->driver_data = NULL;
-       link->out = NULL;
+       link->out_ep->desc = NULL;
 
        /* finish forgetting about this USB link episode */
        dev->header_len = 0;
 
        struct usb_ep                   *in_ep;
        struct usb_ep                   *out_ep;
 
-       /* descriptors match device speed at gether_connect() time */
-       struct usb_endpoint_descriptor  *in;
-       struct usb_endpoint_descriptor  *out;
-
        bool                            is_zlp_ok;
 
        u16                             cdc_filter;
 
        port = ports[port_num].port;
 
        /* activate the endpoints */
-       status = usb_ep_enable(gser->in, gser->in_desc);
+       status = usb_ep_enable(gser->in);
        if (status < 0)
                return status;
        gser->in->driver_data = port;
 
-       status = usb_ep_enable(gser->out, gser->out_desc);
+       status = usb_ep_enable(gser->out);
        if (status < 0)
                goto fail_out;
        gser->out->driver_data = port;
 
 
        struct usb_ep                   *in;
        struct usb_ep                   *out;
-       struct usb_endpoint_descriptor  *in_desc;
-       struct usb_endpoint_descriptor  *out_desc;
 
        /* REVISIT avoid this CDC-ACM support harder ... */
        struct usb_cdc_line_coding port_line_coding;    /* 9600-8-N-1 etc */
 
  * @maxpacket:The maximum packet size used on this endpoint.  The initial
  *     value can sometimes be reduced (hardware allowing), according to
  *      the endpoint descriptor used to configure the endpoint.
- * @driver_data:for use by the gadget driver.  all other fields are
- *     read-only to gadget drivers.
+ * @driver_data:for use by the gadget driver.
+ * @desc: endpoint descriptor.  This pointer is set before the endpoint is
+ *     enabled and remains valid until the endpoint is disabled.
  *
  * the bus controller driver lists all the general purpose endpoints in
  * gadget->ep_list.  the control endpoint (gadget->ep0) is not in that list,
        const struct usb_ep_ops *ops;
        struct list_head        ep_list;
        unsigned                maxpacket:16;
+       const struct usb_endpoint_descriptor    *desc;
 };
 
 /*-------------------------------------------------------------------------*/
  * usb_ep_enable - configure endpoint, making it usable
  * @ep:the endpoint being configured.  may not be the endpoint named "ep0".
  *     drivers discover endpoints through the ep_list of a usb_gadget.
- * @desc:descriptor for desired behavior.  caller guarantees this pointer
- *     remains valid until the endpoint is disabled; the data byte order
- *     is little-endian (usb-standard).
  *
- * when configurations are set, or when interface settings change, the driver
+ * When configurations are set, or when interface settings change, the driver
  * will enable or disable the relevant endpoints.  while it is enabled, an
  * endpoint may be used for i/o until the driver receives a disconnect() from
  * the host or until the endpoint is disabled.
  *
  * returns zero, or a negative error code.
  */
-static inline int usb_ep_enable(struct usb_ep *ep,
-                               const struct usb_endpoint_descriptor *desc)
+static inline int usb_ep_enable(struct usb_ep *ep)
 {
-       return ep->ops->enable(ep, desc);
+       return ep->ops->enable(ep, ep->desc);
 }
 
 /**