diff options
26 files changed, 111 insertions, 117 deletions
diff --git a/drivers/usb/gadget/dbgp.c b/drivers/usb/gadget/dbgp.c index dbe92ee88477..052209e89271 100644 --- a/drivers/usb/gadget/dbgp.c +++ b/drivers/usb/gadget/dbgp.c | |||
@@ -173,7 +173,9 @@ fail_1: | |||
173 | 173 | ||
174 | static int __enable_ep(struct usb_ep *ep, struct usb_endpoint_descriptor *desc) | 174 | static int __enable_ep(struct usb_ep *ep, struct usb_endpoint_descriptor *desc) |
175 | { | 175 | { |
176 | int err = usb_ep_enable(ep, desc); | 176 | int err; |
177 | ep->desc = desc; | ||
178 | err = usb_ep_enable(ep); | ||
177 | ep->driver_data = dbgp.gadget; | 179 | ep->driver_data = dbgp.gadget; |
178 | return err; | 180 | return err; |
179 | } | 181 | } |
@@ -268,8 +270,8 @@ static int __init dbgp_configure_endpoints(struct usb_gadget *gadget) | |||
268 | dbgp.serial->in = dbgp.i_ep; | 270 | dbgp.serial->in = dbgp.i_ep; |
269 | dbgp.serial->out = dbgp.o_ep; | 271 | dbgp.serial->out = dbgp.o_ep; |
270 | 272 | ||
271 | dbgp.serial->in_desc = &i_desc; | 273 | dbgp.serial->in->desc = &i_desc; |
272 | dbgp.serial->out_desc = &o_desc; | 274 | dbgp.serial->out->desc = &o_desc; |
273 | 275 | ||
274 | if (gserial_setup(gadget, 1) < 0) { | 276 | if (gserial_setup(gadget, 1) < 0) { |
275 | stp = 3; | 277 | stp = 3; |
diff --git a/drivers/usb/gadget/f_acm.c b/drivers/usb/gadget/f_acm.c index bd6226cbae86..d04b4a68220d 100644 --- a/drivers/usb/gadget/f_acm.c +++ b/drivers/usb/gadget/f_acm.c | |||
@@ -62,7 +62,6 @@ struct f_acm { | |||
62 | struct acm_ep_descs hs; | 62 | struct acm_ep_descs hs; |
63 | 63 | ||
64 | struct usb_ep *notify; | 64 | struct usb_ep *notify; |
65 | struct usb_endpoint_descriptor *notify_desc; | ||
66 | struct usb_request *notify_req; | 65 | struct usb_request *notify_req; |
67 | 66 | ||
68 | struct usb_cdc_line_coding port_line_coding; /* 8-N-1 etc */ | 67 | struct usb_cdc_line_coding port_line_coding; /* 8-N-1 etc */ |
@@ -405,11 +404,11 @@ static int acm_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
405 | usb_ep_disable(acm->notify); | 404 | usb_ep_disable(acm->notify); |
406 | } else { | 405 | } else { |
407 | VDBG(cdev, "init acm ctrl interface %d\n", intf); | 406 | VDBG(cdev, "init acm ctrl interface %d\n", intf); |
408 | acm->notify_desc = ep_choose(cdev->gadget, | 407 | acm->notify->desc = ep_choose(cdev->gadget, |
409 | acm->hs.notify, | 408 | acm->hs.notify, |
410 | acm->fs.notify); | 409 | acm->fs.notify); |
411 | } | 410 | } |
412 | usb_ep_enable(acm->notify, acm->notify_desc); | 411 | usb_ep_enable(acm->notify); |
413 | acm->notify->driver_data = acm; | 412 | acm->notify->driver_data = acm; |
414 | 413 | ||
415 | } else if (intf == acm->data_id) { | 414 | } else if (intf == acm->data_id) { |
@@ -418,9 +417,9 @@ static int acm_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
418 | gserial_disconnect(&acm->port); | 417 | gserial_disconnect(&acm->port); |
419 | } else { | 418 | } else { |
420 | DBG(cdev, "activate acm ttyGS%d\n", acm->port_num); | 419 | DBG(cdev, "activate acm ttyGS%d\n", acm->port_num); |
421 | acm->port.in_desc = ep_choose(cdev->gadget, | 420 | acm->port.in->desc = ep_choose(cdev->gadget, |
422 | acm->hs.in, acm->fs.in); | 421 | acm->hs.in, acm->fs.in); |
423 | acm->port.out_desc = ep_choose(cdev->gadget, | 422 | acm->port.out->desc = ep_choose(cdev->gadget, |
424 | acm->hs.out, acm->fs.out); | 423 | acm->hs.out, acm->fs.out); |
425 | } | 424 | } |
426 | gserial_connect(&acm->port, acm->port_num); | 425 | gserial_connect(&acm->port, acm->port_num); |
diff --git a/drivers/usb/gadget/f_audio.c b/drivers/usb/gadget/f_audio.c index 8ee330a2ab58..02a02700b51d 100644 --- a/drivers/usb/gadget/f_audio.c +++ b/drivers/usb/gadget/f_audio.c | |||
@@ -279,7 +279,6 @@ struct f_audio { | |||
279 | 279 | ||
280 | /* endpoints handle full and/or high speeds */ | 280 | /* endpoints handle full and/or high speeds */ |
281 | struct usb_ep *out_ep; | 281 | struct usb_ep *out_ep; |
282 | struct usb_endpoint_descriptor *out_desc; | ||
283 | 282 | ||
284 | spinlock_t lock; | 283 | spinlock_t lock; |
285 | struct f_audio_buf *copy_buf; | 284 | struct f_audio_buf *copy_buf; |
@@ -575,7 +574,7 @@ static int f_audio_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
575 | 574 | ||
576 | if (intf == 1) { | 575 | if (intf == 1) { |
577 | if (alt == 1) { | 576 | if (alt == 1) { |
578 | usb_ep_enable(out_ep, audio->out_desc); | 577 | usb_ep_enable(out_ep); |
579 | out_ep->driver_data = audio; | 578 | out_ep->driver_data = audio; |
580 | audio->copy_buf = f_audio_buffer_alloc(audio_buf_size); | 579 | audio->copy_buf = f_audio_buffer_alloc(audio_buf_size); |
581 | if (IS_ERR(audio->copy_buf)) | 580 | if (IS_ERR(audio->copy_buf)) |
@@ -677,6 +676,7 @@ f_audio_bind(struct usb_configuration *c, struct usb_function *f) | |||
677 | if (!ep) | 676 | if (!ep) |
678 | goto fail; | 677 | goto fail; |
679 | audio->out_ep = ep; | 678 | audio->out_ep = ep; |
679 | audio->out_ep->desc = &as_out_ep_desc; | ||
680 | ep->driver_data = cdev; /* claim */ | 680 | ep->driver_data = cdev; /* claim */ |
681 | 681 | ||
682 | status = -ENOMEM; | 682 | status = -ENOMEM; |
@@ -776,7 +776,6 @@ int __init audio_bind_config(struct usb_configuration *c) | |||
776 | audio->card.func.set_alt = f_audio_set_alt; | 776 | audio->card.func.set_alt = f_audio_set_alt; |
777 | audio->card.func.setup = f_audio_setup; | 777 | audio->card.func.setup = f_audio_setup; |
778 | audio->card.func.disable = f_audio_disable; | 778 | audio->card.func.disable = f_audio_disable; |
779 | audio->out_desc = &as_out_ep_desc; | ||
780 | 779 | ||
781 | control_selector_init(audio); | 780 | control_selector_init(audio); |
782 | 781 | ||
diff --git a/drivers/usb/gadget/f_ecm.c b/drivers/usb/gadget/f_ecm.c index 544257a89ed2..7c996f271ccb 100644 --- a/drivers/usb/gadget/f_ecm.c +++ b/drivers/usb/gadget/f_ecm.c | |||
@@ -68,7 +68,6 @@ struct f_ecm { | |||
68 | struct ecm_ep_descs hs; | 68 | struct ecm_ep_descs hs; |
69 | 69 | ||
70 | struct usb_ep *notify; | 70 | struct usb_ep *notify; |
71 | struct usb_endpoint_descriptor *notify_desc; | ||
72 | struct usb_request *notify_req; | 71 | struct usb_request *notify_req; |
73 | u8 notify_state; | 72 | u8 notify_state; |
74 | bool is_open; | 73 | bool is_open; |
@@ -466,11 +465,11 @@ static int ecm_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
466 | usb_ep_disable(ecm->notify); | 465 | usb_ep_disable(ecm->notify); |
467 | } else { | 466 | } else { |
468 | VDBG(cdev, "init ecm ctrl %d\n", intf); | 467 | VDBG(cdev, "init ecm ctrl %d\n", intf); |
469 | ecm->notify_desc = ep_choose(cdev->gadget, | 468 | ecm->notify->desc = ep_choose(cdev->gadget, |
470 | ecm->hs.notify, | 469 | ecm->hs.notify, |
471 | ecm->fs.notify); | 470 | ecm->fs.notify); |
472 | } | 471 | } |
473 | usb_ep_enable(ecm->notify, ecm->notify_desc); | 472 | usb_ep_enable(ecm->notify); |
474 | ecm->notify->driver_data = ecm; | 473 | ecm->notify->driver_data = ecm; |
475 | 474 | ||
476 | /* Data interface has two altsettings, 0 and 1 */ | 475 | /* Data interface has two altsettings, 0 and 1 */ |
@@ -483,11 +482,11 @@ static int ecm_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
483 | gether_disconnect(&ecm->port); | 482 | gether_disconnect(&ecm->port); |
484 | } | 483 | } |
485 | 484 | ||
486 | if (!ecm->port.in) { | 485 | if (!ecm->port.in_ep->desc) { |
487 | DBG(cdev, "init ecm\n"); | 486 | DBG(cdev, "init ecm\n"); |
488 | ecm->port.in = ep_choose(cdev->gadget, | 487 | ecm->port.in_ep->desc = ep_choose(cdev->gadget, |
489 | ecm->hs.in, ecm->fs.in); | 488 | ecm->hs.in, ecm->fs.in); |
490 | ecm->port.out = ep_choose(cdev->gadget, | 489 | ecm->port.out_ep->desc = ep_choose(cdev->gadget, |
491 | ecm->hs.out, ecm->fs.out); | 490 | ecm->hs.out, ecm->fs.out); |
492 | } | 491 | } |
493 | 492 | ||
@@ -549,7 +548,7 @@ static void ecm_disable(struct usb_function *f) | |||
549 | if (ecm->notify->driver_data) { | 548 | if (ecm->notify->driver_data) { |
550 | usb_ep_disable(ecm->notify); | 549 | usb_ep_disable(ecm->notify); |
551 | ecm->notify->driver_data = NULL; | 550 | ecm->notify->driver_data = NULL; |
552 | ecm->notify_desc = NULL; | 551 | ecm->notify->desc = NULL; |
553 | } | 552 | } |
554 | } | 553 | } |
555 | 554 | ||
@@ -723,9 +722,9 @@ fail: | |||
723 | /* we might as well release our claims on endpoints */ | 722 | /* we might as well release our claims on endpoints */ |
724 | if (ecm->notify) | 723 | if (ecm->notify) |
725 | ecm->notify->driver_data = NULL; | 724 | ecm->notify->driver_data = NULL; |
726 | if (ecm->port.out) | 725 | if (ecm->port.out_ep->desc) |
727 | ecm->port.out_ep->driver_data = NULL; | 726 | ecm->port.out_ep->driver_data = NULL; |
728 | if (ecm->port.in) | 727 | if (ecm->port.in_ep->desc) |
729 | ecm->port.in_ep->driver_data = NULL; | 728 | ecm->port.in_ep->driver_data = NULL; |
730 | 729 | ||
731 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); | 730 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); |
diff --git a/drivers/usb/gadget/f_eem.c b/drivers/usb/gadget/f_eem.c index b3c304290150..fea8e3b08b5f 100644 --- a/drivers/usb/gadget/f_eem.c +++ b/drivers/usb/gadget/f_eem.c | |||
@@ -176,11 +176,11 @@ static int eem_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
176 | gether_disconnect(&eem->port); | 176 | gether_disconnect(&eem->port); |
177 | } | 177 | } |
178 | 178 | ||
179 | if (!eem->port.in) { | 179 | if (!eem->port.in_ep->desc) { |
180 | DBG(cdev, "init eem\n"); | 180 | DBG(cdev, "init eem\n"); |
181 | eem->port.in = ep_choose(cdev->gadget, | 181 | eem->port.in_ep->desc = ep_choose(cdev->gadget, |
182 | eem->hs.in, eem->fs.in); | 182 | eem->hs.in, eem->fs.in); |
183 | eem->port.out = ep_choose(cdev->gadget, | 183 | eem->port.out_ep->desc = ep_choose(cdev->gadget, |
184 | eem->hs.out, eem->fs.out); | 184 | eem->hs.out, eem->fs.out); |
185 | } | 185 | } |
186 | 186 | ||
@@ -289,9 +289,9 @@ fail: | |||
289 | usb_free_descriptors(f->descriptors); | 289 | usb_free_descriptors(f->descriptors); |
290 | 290 | ||
291 | /* we might as well release our claims on endpoints */ | 291 | /* we might as well release our claims on endpoints */ |
292 | if (eem->port.out) | 292 | if (eem->port.out_ep->desc) |
293 | eem->port.out_ep->driver_data = NULL; | 293 | eem->port.out_ep->driver_data = NULL; |
294 | if (eem->port.in) | 294 | if (eem->port.in_ep->desc) |
295 | eem->port.in_ep->driver_data = NULL; | 295 | eem->port.in_ep->driver_data = NULL; |
296 | 296 | ||
297 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); | 297 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); |
diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c index 19fffccc370d..c161a9aaeb7e 100644 --- a/drivers/usb/gadget/f_fs.c +++ b/drivers/usb/gadget/f_fs.c | |||
@@ -1544,7 +1544,8 @@ static int ffs_func_eps_enable(struct ffs_function *func) | |||
1544 | ds = ep->descs[ep->descs[1] ? 1 : 0]; | 1544 | ds = ep->descs[ep->descs[1] ? 1 : 0]; |
1545 | 1545 | ||
1546 | ep->ep->driver_data = ep; | 1546 | ep->ep->driver_data = ep; |
1547 | ret = usb_ep_enable(ep->ep, ds); | 1547 | ep->ep->desc = ds; |
1548 | ret = usb_ep_enable(ep->ep); | ||
1548 | if (likely(!ret)) { | 1549 | if (likely(!ret)) { |
1549 | epfile->ep = ep; | 1550 | epfile->ep = ep; |
1550 | epfile->in = usb_endpoint_dir_in(ds); | 1551 | epfile->in = usb_endpoint_dir_in(ds); |
diff --git a/drivers/usb/gadget/f_hid.c b/drivers/usb/gadget/f_hid.c index 598e7e2ab80c..12879b6f787c 100644 --- a/drivers/usb/gadget/f_hid.c +++ b/drivers/usb/gadget/f_hid.c | |||
@@ -416,7 +416,6 @@ static int hidg_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
416 | { | 416 | { |
417 | struct usb_composite_dev *cdev = f->config->cdev; | 417 | struct usb_composite_dev *cdev = f->config->cdev; |
418 | struct f_hidg *hidg = func_to_hidg(f); | 418 | struct f_hidg *hidg = func_to_hidg(f); |
419 | const struct usb_endpoint_descriptor *ep_desc; | ||
420 | int status = 0; | 419 | int status = 0; |
421 | 420 | ||
422 | VDBG(cdev, "hidg_set_alt intf:%d alt:%d\n", intf, alt); | 421 | VDBG(cdev, "hidg_set_alt intf:%d alt:%d\n", intf, alt); |
@@ -426,9 +425,9 @@ static int hidg_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
426 | if (hidg->in_ep->driver_data != NULL) | 425 | if (hidg->in_ep->driver_data != NULL) |
427 | usb_ep_disable(hidg->in_ep); | 426 | usb_ep_disable(hidg->in_ep); |
428 | 427 | ||
429 | ep_desc = ep_choose(f->config->cdev->gadget, | 428 | hidg->in_ep->desc = ep_choose(f->config->cdev->gadget, |
430 | hidg->hs_in_ep_desc, hidg->fs_in_ep_desc); | 429 | hidg->hs_in_ep_desc, hidg->fs_in_ep_desc); |
431 | status = usb_ep_enable(hidg->in_ep, ep_desc); | 430 | status = usb_ep_enable(hidg->in_ep); |
432 | if (status < 0) { | 431 | if (status < 0) { |
433 | ERROR(cdev, "Enable endpoint FAILED!\n"); | 432 | ERROR(cdev, "Enable endpoint FAILED!\n"); |
434 | goto fail; | 433 | goto fail; |
diff --git a/drivers/usb/gadget/f_loopback.c b/drivers/usb/gadget/f_loopback.c index b37960f9e753..34e3ccaf0884 100644 --- a/drivers/usb/gadget/f_loopback.c +++ b/drivers/usb/gadget/f_loopback.c | |||
@@ -250,26 +250,24 @@ static int | |||
250 | enable_loopback(struct usb_composite_dev *cdev, struct f_loopback *loop) | 250 | enable_loopback(struct usb_composite_dev *cdev, struct f_loopback *loop) |
251 | { | 251 | { |
252 | int result = 0; | 252 | int result = 0; |
253 | const struct usb_endpoint_descriptor *src, *sink; | ||
254 | struct usb_ep *ep; | 253 | struct usb_ep *ep; |
255 | struct usb_request *req; | 254 | struct usb_request *req; |
256 | unsigned i; | 255 | unsigned i; |
257 | 256 | ||
258 | src = ep_choose(cdev->gadget, | ||
259 | &hs_loop_source_desc, &fs_loop_source_desc); | ||
260 | sink = ep_choose(cdev->gadget, | ||
261 | &hs_loop_sink_desc, &fs_loop_sink_desc); | ||
262 | |||
263 | /* one endpoint writes data back IN to the host */ | 257 | /* one endpoint writes data back IN to the host */ |
264 | ep = loop->in_ep; | 258 | ep = loop->in_ep; |
265 | result = usb_ep_enable(ep, src); | 259 | ep->desc = ep_choose(cdev->gadget, |
260 | &hs_loop_source_desc, &fs_loop_source_desc); | ||
261 | result = usb_ep_enable(ep); | ||
266 | if (result < 0) | 262 | if (result < 0) |
267 | return result; | 263 | return result; |
268 | ep->driver_data = loop; | 264 | ep->driver_data = loop; |
269 | 265 | ||
270 | /* one endpoint just reads OUT packets */ | 266 | /* one endpoint just reads OUT packets */ |
271 | ep = loop->out_ep; | 267 | ep = loop->out_ep; |
272 | result = usb_ep_enable(ep, sink); | 268 | ep->desc = ep_choose(cdev->gadget, |
269 | &hs_loop_sink_desc, &fs_loop_sink_desc); | ||
270 | result = usb_ep_enable(ep); | ||
273 | if (result < 0) { | 271 | if (result < 0) { |
274 | fail0: | 272 | fail0: |
275 | ep = loop->in_ep; | 273 | ep = loop->in_ep; |
diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c index efb58f9f5aa9..4eee43412121 100644 --- a/drivers/usb/gadget/f_mass_storage.c +++ b/drivers/usb/gadget/f_mass_storage.c | |||
@@ -2330,7 +2330,8 @@ static int enable_endpoint(struct fsg_common *common, struct usb_ep *ep, | |||
2330 | int rc; | 2330 | int rc; |
2331 | 2331 | ||
2332 | ep->driver_data = common; | 2332 | ep->driver_data = common; |
2333 | rc = usb_ep_enable(ep, d); | 2333 | ep->desc = (struct usb_endpoint_descriptor *)d; |
2334 | rc = usb_ep_enable(ep); | ||
2334 | if (rc) | 2335 | if (rc) |
2335 | ERROR(common, "can't enable %s, result %d\n", ep->name, rc); | 2336 | ERROR(common, "can't enable %s, result %d\n", ep->name, rc); |
2336 | return rc; | 2337 | return rc; |
diff --git a/drivers/usb/gadget/f_ncm.c b/drivers/usb/gadget/f_ncm.c index 86902a60bcdb..06daa1bc9ffd 100644 --- a/drivers/usb/gadget/f_ncm.c +++ b/drivers/usb/gadget/f_ncm.c | |||
@@ -70,7 +70,6 @@ struct f_ncm { | |||
70 | struct ncm_ep_descs hs; | 70 | struct ncm_ep_descs hs; |
71 | 71 | ||
72 | struct usb_ep *notify; | 72 | struct usb_ep *notify; |
73 | struct usb_endpoint_descriptor *notify_desc; | ||
74 | struct usb_request *notify_req; | 73 | struct usb_request *notify_req; |
75 | u8 notify_state; | 74 | u8 notify_state; |
76 | bool is_open; | 75 | bool is_open; |
@@ -804,11 +803,11 @@ static int ncm_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
804 | usb_ep_disable(ncm->notify); | 803 | usb_ep_disable(ncm->notify); |
805 | } else { | 804 | } else { |
806 | DBG(cdev, "init ncm ctrl %d\n", intf); | 805 | DBG(cdev, "init ncm ctrl %d\n", intf); |
807 | ncm->notify_desc = ep_choose(cdev->gadget, | 806 | ncm->notify->desc = ep_choose(cdev->gadget, |
808 | ncm->hs.notify, | 807 | ncm->hs.notify, |
809 | ncm->fs.notify); | 808 | ncm->fs.notify); |
810 | } | 809 | } |
811 | usb_ep_enable(ncm->notify, ncm->notify_desc); | 810 | usb_ep_enable(ncm->notify); |
812 | ncm->notify->driver_data = ncm; | 811 | ncm->notify->driver_data = ncm; |
813 | 812 | ||
814 | /* Data interface has two altsettings, 0 and 1 */ | 813 | /* Data interface has two altsettings, 0 and 1 */ |
@@ -829,12 +828,12 @@ static int ncm_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
829 | if (alt == 1) { | 828 | if (alt == 1) { |
830 | struct net_device *net; | 829 | struct net_device *net; |
831 | 830 | ||
832 | if (!ncm->port.in) { | 831 | if (!ncm->port.in_ep->desc) { |
833 | DBG(cdev, "init ncm\n"); | 832 | DBG(cdev, "init ncm\n"); |
834 | ncm->port.in = ep_choose(cdev->gadget, | 833 | ncm->port.in_ep->desc = ep_choose(cdev->gadget, |
835 | ncm->hs.in, | 834 | ncm->hs.in, |
836 | ncm->fs.in); | 835 | ncm->fs.in); |
837 | ncm->port.out = ep_choose(cdev->gadget, | 836 | ncm->port.out_ep->desc = ep_choose(cdev->gadget, |
838 | ncm->hs.out, | 837 | ncm->hs.out, |
839 | ncm->fs.out); | 838 | ncm->fs.out); |
840 | } | 839 | } |
@@ -1111,7 +1110,7 @@ static void ncm_disable(struct usb_function *f) | |||
1111 | if (ncm->notify->driver_data) { | 1110 | if (ncm->notify->driver_data) { |
1112 | usb_ep_disable(ncm->notify); | 1111 | usb_ep_disable(ncm->notify); |
1113 | ncm->notify->driver_data = NULL; | 1112 | ncm->notify->driver_data = NULL; |
1114 | ncm->notify_desc = NULL; | 1113 | ncm->notify->desc = NULL; |
1115 | } | 1114 | } |
1116 | } | 1115 | } |
1117 | 1116 | ||
@@ -1288,9 +1287,9 @@ fail: | |||
1288 | /* we might as well release our claims on endpoints */ | 1287 | /* we might as well release our claims on endpoints */ |
1289 | if (ncm->notify) | 1288 | if (ncm->notify) |
1290 | ncm->notify->driver_data = NULL; | 1289 | ncm->notify->driver_data = NULL; |
1291 | if (ncm->port.out) | 1290 | if (ncm->port.out_ep->desc) |
1292 | ncm->port.out_ep->driver_data = NULL; | 1291 | ncm->port.out_ep->driver_data = NULL; |
1293 | if (ncm->port.in) | 1292 | if (ncm->port.in_ep->desc) |
1294 | ncm->port.in_ep->driver_data = NULL; | 1293 | ncm->port.in_ep->driver_data = NULL; |
1295 | 1294 | ||
1296 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); | 1295 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); |
diff --git a/drivers/usb/gadget/f_obex.c b/drivers/usb/gadget/f_obex.c index 8f8c64371475..a6dbda090ca5 100644 --- a/drivers/usb/gadget/f_obex.c +++ b/drivers/usb/gadget/f_obex.c | |||
@@ -227,11 +227,11 @@ static int obex_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
227 | gserial_disconnect(&obex->port); | 227 | gserial_disconnect(&obex->port); |
228 | } | 228 | } |
229 | 229 | ||
230 | if (!obex->port.in_desc) { | 230 | if (!obex->port.in->desc) { |
231 | DBG(cdev, "init obex ttyGS%d\n", obex->port_num); | 231 | DBG(cdev, "init obex ttyGS%d\n", obex->port_num); |
232 | obex->port.in_desc = ep_choose(cdev->gadget, | 232 | obex->port.in->desc = ep_choose(cdev->gadget, |
233 | obex->hs.obex_in, obex->fs.obex_in); | 233 | obex->hs.obex_in, obex->fs.obex_in); |
234 | obex->port.out_desc = ep_choose(cdev->gadget, | 234 | obex->port.out->desc = ep_choose(cdev->gadget, |
235 | obex->hs.obex_out, obex->fs.obex_out); | 235 | obex->hs.obex_out, obex->fs.obex_out); |
236 | } | 236 | } |
237 | 237 | ||
diff --git a/drivers/usb/gadget/f_phonet.c b/drivers/usb/gadget/f_phonet.c index 5e1495097ec3..dc63f161a10a 100644 --- a/drivers/usb/gadget/f_phonet.c +++ b/drivers/usb/gadget/f_phonet.c | |||
@@ -427,17 +427,16 @@ static int pn_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
427 | spin_lock(&port->lock); | 427 | spin_lock(&port->lock); |
428 | __pn_reset(f); | 428 | __pn_reset(f); |
429 | if (alt == 1) { | 429 | if (alt == 1) { |
430 | struct usb_endpoint_descriptor *out, *in; | ||
431 | int i; | 430 | int i; |
432 | 431 | ||
433 | out = ep_choose(gadget, | 432 | fp->out_ep->desc = ep_choose(gadget, |
434 | &pn_hs_sink_desc, | 433 | &pn_hs_sink_desc, |
435 | &pn_fs_sink_desc); | 434 | &pn_fs_sink_desc); |
436 | in = ep_choose(gadget, | 435 | fp->in_ep->desc = ep_choose(gadget, |
437 | &pn_hs_source_desc, | 436 | &pn_hs_source_desc, |
438 | &pn_fs_source_desc); | 437 | &pn_fs_source_desc); |
439 | usb_ep_enable(fp->out_ep, out); | 438 | usb_ep_enable(fp->out_ep); |
440 | usb_ep_enable(fp->in_ep, in); | 439 | usb_ep_enable(fp->in_ep); |
441 | 440 | ||
442 | port->usb = fp; | 441 | port->usb = fp; |
443 | fp->out_ep->driver_data = fp; | 442 | fp->out_ep->driver_data = fp; |
diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c index fa12ec8364ef..4646254a8924 100644 --- a/drivers/usb/gadget/f_rndis.c +++ b/drivers/usb/gadget/f_rndis.c | |||
@@ -92,7 +92,6 @@ struct f_rndis { | |||
92 | struct rndis_ep_descs hs; | 92 | struct rndis_ep_descs hs; |
93 | 93 | ||
94 | struct usb_ep *notify; | 94 | struct usb_ep *notify; |
95 | struct usb_endpoint_descriptor *notify_desc; | ||
96 | struct usb_request *notify_req; | 95 | struct usb_request *notify_req; |
97 | atomic_t notify_count; | 96 | atomic_t notify_count; |
98 | }; | 97 | }; |
@@ -486,11 +485,11 @@ static int rndis_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
486 | usb_ep_disable(rndis->notify); | 485 | usb_ep_disable(rndis->notify); |
487 | } else { | 486 | } else { |
488 | VDBG(cdev, "init rndis ctrl %d\n", intf); | 487 | VDBG(cdev, "init rndis ctrl %d\n", intf); |
489 | rndis->notify_desc = ep_choose(cdev->gadget, | 488 | rndis->notify->desc = ep_choose(cdev->gadget, |
490 | rndis->hs.notify, | 489 | rndis->hs.notify, |
491 | rndis->fs.notify); | 490 | rndis->fs.notify); |
492 | } | 491 | } |
493 | usb_ep_enable(rndis->notify, rndis->notify_desc); | 492 | usb_ep_enable(rndis->notify); |
494 | rndis->notify->driver_data = rndis; | 493 | rndis->notify->driver_data = rndis; |
495 | 494 | ||
496 | } else if (intf == rndis->data_id) { | 495 | } else if (intf == rndis->data_id) { |
@@ -501,11 +500,11 @@ static int rndis_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
501 | gether_disconnect(&rndis->port); | 500 | gether_disconnect(&rndis->port); |
502 | } | 501 | } |
503 | 502 | ||
504 | if (!rndis->port.in) { | 503 | if (!rndis->port.in_ep->desc) { |
505 | DBG(cdev, "init rndis\n"); | 504 | DBG(cdev, "init rndis\n"); |
506 | rndis->port.in = ep_choose(cdev->gadget, | 505 | rndis->port.in_ep->desc = ep_choose(cdev->gadget, |
507 | rndis->hs.in, rndis->fs.in); | 506 | rndis->hs.in, rndis->fs.in); |
508 | rndis->port.out = ep_choose(cdev->gadget, | 507 | rndis->port.out_ep->desc = ep_choose(cdev->gadget, |
509 | rndis->hs.out, rndis->fs.out); | 508 | rndis->hs.out, rndis->fs.out); |
510 | } | 509 | } |
511 | 510 | ||
@@ -738,9 +737,9 @@ fail: | |||
738 | /* we might as well release our claims on endpoints */ | 737 | /* we might as well release our claims on endpoints */ |
739 | if (rndis->notify) | 738 | if (rndis->notify) |
740 | rndis->notify->driver_data = NULL; | 739 | rndis->notify->driver_data = NULL; |
741 | if (rndis->port.out) | 740 | if (rndis->port.out_ep->desc) |
742 | rndis->port.out_ep->driver_data = NULL; | 741 | rndis->port.out_ep->driver_data = NULL; |
743 | if (rndis->port.in) | 742 | if (rndis->port.in_ep->desc) |
744 | rndis->port.in_ep->driver_data = NULL; | 743 | rndis->port.in_ep->driver_data = NULL; |
745 | 744 | ||
746 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); | 745 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); |
diff --git a/drivers/usb/gadget/f_serial.c b/drivers/usb/gadget/f_serial.c index 490b00b01a7d..a9ce6261d156 100644 --- a/drivers/usb/gadget/f_serial.c +++ b/drivers/usb/gadget/f_serial.c | |||
@@ -138,9 +138,9 @@ static int gser_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
138 | gserial_disconnect(&gser->port); | 138 | gserial_disconnect(&gser->port); |
139 | } else { | 139 | } else { |
140 | DBG(cdev, "activate generic ttyGS%d\n", gser->port_num); | 140 | DBG(cdev, "activate generic ttyGS%d\n", gser->port_num); |
141 | gser->port.in_desc = ep_choose(cdev->gadget, | 141 | gser->port.in->desc = ep_choose(cdev->gadget, |
142 | gser->hs.in, gser->fs.in); | 142 | gser->hs.in, gser->fs.in); |
143 | gser->port.out_desc = ep_choose(cdev->gadget, | 143 | gser->port.out->desc = ep_choose(cdev->gadget, |
144 | gser->hs.out, gser->fs.out); | 144 | gser->hs.out, gser->fs.out); |
145 | } | 145 | } |
146 | gserial_connect(&gser->port, gser->port_num); | 146 | gserial_connect(&gser->port, gser->port_num); |
diff --git a/drivers/usb/gadget/f_sourcesink.c b/drivers/usb/gadget/f_sourcesink.c index e403a534dd55..0ffddd33a55c 100644 --- a/drivers/usb/gadget/f_sourcesink.c +++ b/drivers/usb/gadget/f_sourcesink.c | |||
@@ -343,15 +343,12 @@ static int | |||
343 | enable_source_sink(struct usb_composite_dev *cdev, struct f_sourcesink *ss) | 343 | enable_source_sink(struct usb_composite_dev *cdev, struct f_sourcesink *ss) |
344 | { | 344 | { |
345 | int result = 0; | 345 | int result = 0; |
346 | const struct usb_endpoint_descriptor *src, *sink; | ||
347 | struct usb_ep *ep; | 346 | struct usb_ep *ep; |
348 | 347 | ||
349 | src = ep_choose(cdev->gadget, &hs_source_desc, &fs_source_desc); | ||
350 | sink = ep_choose(cdev->gadget, &hs_sink_desc, &fs_sink_desc); | ||
351 | |||
352 | /* one endpoint writes (sources) zeroes IN (to the host) */ | 348 | /* one endpoint writes (sources) zeroes IN (to the host) */ |
353 | ep = ss->in_ep; | 349 | ep = ss->in_ep; |
354 | result = usb_ep_enable(ep, src); | 350 | ep->desc = ep_choose(cdev->gadget, &hs_source_desc, &fs_source_desc); |
351 | result = usb_ep_enable(ep); | ||
355 | if (result < 0) | 352 | if (result < 0) |
356 | return result; | 353 | return result; |
357 | ep->driver_data = ss; | 354 | ep->driver_data = ss; |
@@ -367,7 +364,8 @@ fail: | |||
367 | 364 | ||
368 | /* one endpoint reads (sinks) anything OUT (from the host) */ | 365 | /* one endpoint reads (sinks) anything OUT (from the host) */ |
369 | ep = ss->out_ep; | 366 | ep = ss->out_ep; |
370 | result = usb_ep_enable(ep, sink); | 367 | ep->desc = ep_choose(cdev->gadget, &hs_sink_desc, &fs_sink_desc); |
368 | result = usb_ep_enable(ep); | ||
371 | if (result < 0) | 369 | if (result < 0) |
372 | goto fail; | 370 | goto fail; |
373 | ep->driver_data = ss; | 371 | ep->driver_data = ss; |
diff --git a/drivers/usb/gadget/f_subset.c b/drivers/usb/gadget/f_subset.c index 8675ca415329..aecaed1724aa 100644 --- a/drivers/usb/gadget/f_subset.c +++ b/drivers/usb/gadget/f_subset.c | |||
@@ -243,9 +243,9 @@ static int geth_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
243 | } | 243 | } |
244 | 244 | ||
245 | DBG(cdev, "init + activate cdc subset\n"); | 245 | DBG(cdev, "init + activate cdc subset\n"); |
246 | geth->port.in = ep_choose(cdev->gadget, | 246 | geth->port.in_ep->desc = ep_choose(cdev->gadget, |
247 | geth->hs.in, geth->fs.in); | 247 | geth->hs.in, geth->fs.in); |
248 | geth->port.out = ep_choose(cdev->gadget, | 248 | geth->port.out_ep->desc = ep_choose(cdev->gadget, |
249 | geth->hs.out, geth->fs.out); | 249 | geth->hs.out, geth->fs.out); |
250 | 250 | ||
251 | net = gether_connect(&geth->port); | 251 | net = gether_connect(&geth->port); |
@@ -334,9 +334,9 @@ geth_bind(struct usb_configuration *c, struct usb_function *f) | |||
334 | 334 | ||
335 | fail: | 335 | fail: |
336 | /* we might as well release our claims on endpoints */ | 336 | /* we might as well release our claims on endpoints */ |
337 | if (geth->port.out) | 337 | if (geth->port.out_ep->desc) |
338 | geth->port.out_ep->driver_data = NULL; | 338 | geth->port.out_ep->driver_data = NULL; |
339 | if (geth->port.in) | 339 | if (geth->port.in_ep->desc) |
340 | geth->port.in_ep->driver_data = NULL; | 340 | geth->port.in_ep->driver_data = NULL; |
341 | 341 | ||
342 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); | 342 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); |
diff --git a/drivers/usb/gadget/f_uvc.c b/drivers/usb/gadget/f_uvc.c index be446b7e7eaa..df74d0311910 100644 --- a/drivers/usb/gadget/f_uvc.c +++ b/drivers/usb/gadget/f_uvc.c | |||
@@ -262,8 +262,10 @@ uvc_function_set_alt(struct usb_function *f, unsigned interface, unsigned alt) | |||
262 | if (uvc->state != UVC_STATE_CONNECTED) | 262 | if (uvc->state != UVC_STATE_CONNECTED) |
263 | return 0; | 263 | return 0; |
264 | 264 | ||
265 | if (uvc->video.ep) | 265 | if (uvc->video.ep) { |
266 | usb_ep_enable(uvc->video.ep, &uvc_streaming_ep); | 266 | uvc->video.ep->desc = &uvc_streaming_ep; |
267 | usb_ep_enable(uvc->video.ep); | ||
268 | } | ||
267 | 269 | ||
268 | memset(&v4l2_event, 0, sizeof(v4l2_event)); | 270 | memset(&v4l2_event, 0, sizeof(v4l2_event)); |
269 | v4l2_event.type = UVC_EVENT_STREAMON; | 271 | v4l2_event.type = UVC_EVENT_STREAMON; |
diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c index 83bee30cdb94..738591a64bb4 100644 --- a/drivers/usb/gadget/file_storage.c +++ b/drivers/usb/gadget/file_storage.c | |||
@@ -2713,7 +2713,8 @@ static int enable_endpoint(struct fsg_dev *fsg, struct usb_ep *ep, | |||
2713 | int rc; | 2713 | int rc; |
2714 | 2714 | ||
2715 | ep->driver_data = fsg; | 2715 | ep->driver_data = fsg; |
2716 | rc = usb_ep_enable(ep, d); | 2716 | ep->desc = d; |
2717 | rc = usb_ep_enable(ep); | ||
2717 | if (rc) | 2718 | if (rc) |
2718 | ERROR(fsg, "can't enable %s, result %d\n", ep->name, rc); | 2719 | ERROR(fsg, "can't enable %s, result %d\n", ep->name, rc); |
2719 | return rc; | 2720 | return rc; |
diff --git a/drivers/usb/gadget/gmidi.c b/drivers/usb/gadget/gmidi.c index 47b86b99d449..4f40f1467438 100644 --- a/drivers/usb/gadget/gmidi.c +++ b/drivers/usb/gadget/gmidi.c | |||
@@ -537,14 +537,16 @@ static int set_gmidi_config(struct gmidi_device *dev, gfp_t gfp_flags) | |||
537 | struct usb_ep *ep; | 537 | struct usb_ep *ep; |
538 | unsigned i; | 538 | unsigned i; |
539 | 539 | ||
540 | err = usb_ep_enable(dev->in_ep, &bulk_in_desc); | 540 | dev->in_ep->desc = &bulk_in_desc; |
541 | err = usb_ep_enable(dev->in_ep); | ||
541 | if (err) { | 542 | if (err) { |
542 | ERROR(dev, "can't start %s: %d\n", dev->in_ep->name, err); | 543 | ERROR(dev, "can't start %s: %d\n", dev->in_ep->name, err); |
543 | goto fail; | 544 | goto fail; |
544 | } | 545 | } |
545 | dev->in_ep->driver_data = dev; | 546 | dev->in_ep->driver_data = dev; |
546 | 547 | ||
547 | err = usb_ep_enable(dev->out_ep, &bulk_out_desc); | 548 | dev->out_ep->desc = &bulk_out_desc; |
549 | err = usb_ep_enable(dev->out_ep); | ||
548 | if (err) { | 550 | if (err) { |
549 | ERROR(dev, "can't start %s: %d\n", dev->out_ep->name, err); | 551 | ERROR(dev, "can't start %s: %d\n", dev->out_ep->name, err); |
550 | goto fail; | 552 | goto fail; |
diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c index a56876aaf76c..a9a455692397 100644 --- a/drivers/usb/gadget/inode.c +++ b/drivers/usb/gadget/inode.c | |||
@@ -832,14 +832,16 @@ ep_config (struct file *fd, const char __user *buf, size_t len, loff_t *ptr) | |||
832 | switch (data->dev->gadget->speed) { | 832 | switch (data->dev->gadget->speed) { |
833 | case USB_SPEED_LOW: | 833 | case USB_SPEED_LOW: |
834 | case USB_SPEED_FULL: | 834 | case USB_SPEED_FULL: |
835 | value = usb_ep_enable (ep, &data->desc); | 835 | ep->desc = &data->desc; |
836 | value = usb_ep_enable(ep); | ||
836 | if (value == 0) | 837 | if (value == 0) |
837 | data->state = STATE_EP_ENABLED; | 838 | data->state = STATE_EP_ENABLED; |
838 | break; | 839 | break; |
839 | #ifdef CONFIG_USB_GADGET_DUALSPEED | 840 | #ifdef CONFIG_USB_GADGET_DUALSPEED |
840 | case USB_SPEED_HIGH: | 841 | case USB_SPEED_HIGH: |
841 | /* fails if caller didn't provide that descriptor... */ | 842 | /* fails if caller didn't provide that descriptor... */ |
842 | value = usb_ep_enable (ep, &data->hs_desc); | 843 | ep->desc = &data->hs_desc; |
844 | value = usb_ep_enable(ep); | ||
843 | if (value == 0) | 845 | if (value == 0) |
844 | data->state = STATE_EP_ENABLED; | 846 | data->state = STATE_EP_ENABLED; |
845 | break; | 847 | break; |
diff --git a/drivers/usb/gadget/printer.c b/drivers/usb/gadget/printer.c index 271ef94668e7..00e5f19c75ba 100644 --- a/drivers/usb/gadget/printer.c +++ b/drivers/usb/gadget/printer.c | |||
@@ -89,8 +89,7 @@ struct printer_dev { | |||
89 | u8 config; | 89 | u8 config; |
90 | s8 interface; | 90 | s8 interface; |
91 | struct usb_ep *in_ep, *out_ep; | 91 | struct usb_ep *in_ep, *out_ep; |
92 | const struct usb_endpoint_descriptor | 92 | |
93 | *in, *out; | ||
94 | struct list_head rx_reqs; /* List of free RX structs */ | 93 | struct list_head rx_reqs; /* List of free RX structs */ |
95 | struct list_head rx_reqs_active; /* List of Active RX xfers */ | 94 | struct list_head rx_reqs_active; /* List of Active RX xfers */ |
96 | struct list_head rx_buffers; /* List of completed xfers */ | 95 | struct list_head rx_buffers; /* List of completed xfers */ |
@@ -895,19 +894,20 @@ set_printer_interface(struct printer_dev *dev) | |||
895 | { | 894 | { |
896 | int result = 0; | 895 | int result = 0; |
897 | 896 | ||
898 | dev->in = ep_desc(dev->gadget, &hs_ep_in_desc, &fs_ep_in_desc); | 897 | dev->in_ep->desc = ep_desc(dev->gadget, &hs_ep_in_desc, &fs_ep_in_desc); |
899 | dev->in_ep->driver_data = dev; | 898 | dev->in_ep->driver_data = dev; |
900 | 899 | ||
901 | dev->out = ep_desc(dev->gadget, &hs_ep_out_desc, &fs_ep_out_desc); | 900 | dev->out_ep->desc = ep_desc(dev->gadget, &hs_ep_out_desc, |
901 | &fs_ep_out_desc); | ||
902 | dev->out_ep->driver_data = dev; | 902 | dev->out_ep->driver_data = dev; |
903 | 903 | ||
904 | result = usb_ep_enable(dev->in_ep, dev->in); | 904 | result = usb_ep_enable(dev->in_ep); |
905 | if (result != 0) { | 905 | if (result != 0) { |
906 | DBG(dev, "enable %s --> %d\n", dev->in_ep->name, result); | 906 | DBG(dev, "enable %s --> %d\n", dev->in_ep->name, result); |
907 | goto done; | 907 | goto done; |
908 | } | 908 | } |
909 | 909 | ||
910 | result = usb_ep_enable(dev->out_ep, dev->out); | 910 | result = usb_ep_enable(dev->out_ep); |
911 | if (result != 0) { | 911 | if (result != 0) { |
912 | DBG(dev, "enable %s --> %d\n", dev->in_ep->name, result); | 912 | DBG(dev, "enable %s --> %d\n", dev->in_ep->name, result); |
913 | goto done; | 913 | goto done; |
@@ -918,8 +918,8 @@ done: | |||
918 | if (result != 0) { | 918 | if (result != 0) { |
919 | (void) usb_ep_disable(dev->in_ep); | 919 | (void) usb_ep_disable(dev->in_ep); |
920 | (void) usb_ep_disable(dev->out_ep); | 920 | (void) usb_ep_disable(dev->out_ep); |
921 | dev->in = NULL; | 921 | dev->in_ep->desc = NULL; |
922 | dev->out = NULL; | 922 | dev->out_ep->desc = NULL; |
923 | } | 923 | } |
924 | 924 | ||
925 | /* caller is responsible for cleanup on error */ | 925 | /* caller is responsible for cleanup on error */ |
@@ -933,12 +933,14 @@ static void printer_reset_interface(struct printer_dev *dev) | |||
933 | 933 | ||
934 | DBG(dev, "%s\n", __func__); | 934 | DBG(dev, "%s\n", __func__); |
935 | 935 | ||
936 | if (dev->in) | 936 | if (dev->in_ep->desc) |
937 | usb_ep_disable(dev->in_ep); | 937 | usb_ep_disable(dev->in_ep); |
938 | 938 | ||
939 | if (dev->out) | 939 | if (dev->out_ep->desc) |
940 | usb_ep_disable(dev->out_ep); | 940 | usb_ep_disable(dev->out_ep); |
941 | 941 | ||
942 | dev->in_ep->desc = NULL; | ||
943 | dev->out_ep->desc = NULL; | ||
942 | dev->interface = -1; | 944 | dev->interface = -1; |
943 | } | 945 | } |
944 | 946 | ||
@@ -1104,9 +1106,9 @@ static void printer_soft_reset(struct printer_dev *dev) | |||
1104 | list_add(&req->list, &dev->tx_reqs); | 1106 | list_add(&req->list, &dev->tx_reqs); |
1105 | } | 1107 | } |
1106 | 1108 | ||
1107 | if (usb_ep_enable(dev->in_ep, dev->in)) | 1109 | if (usb_ep_enable(dev->in_ep)) |
1108 | DBG(dev, "Failed to enable USB in_ep\n"); | 1110 | DBG(dev, "Failed to enable USB in_ep\n"); |
1109 | if (usb_ep_enable(dev->out_ep, dev->out)) | 1111 | if (usb_ep_enable(dev->out_ep)) |
1110 | DBG(dev, "Failed to enable USB out_ep\n"); | 1112 | DBG(dev, "Failed to enable USB out_ep\n"); |
1111 | 1113 | ||
1112 | wake_up_interruptible(&dev->rx_wait); | 1114 | wake_up_interruptible(&dev->rx_wait); |
diff --git a/drivers/usb/gadget/u_ether.c b/drivers/usb/gadget/u_ether.c index 2ac1d2147325..b91363e88db7 100644 --- a/drivers/usb/gadget/u_ether.c +++ b/drivers/usb/gadget/u_ether.c | |||
@@ -693,8 +693,8 @@ static int eth_stop(struct net_device *net) | |||
693 | usb_ep_disable(link->out_ep); | 693 | usb_ep_disable(link->out_ep); |
694 | if (netif_carrier_ok(net)) { | 694 | if (netif_carrier_ok(net)) { |
695 | DBG(dev, "host still using in/out endpoints\n"); | 695 | DBG(dev, "host still using in/out endpoints\n"); |
696 | usb_ep_enable(link->in_ep, link->in); | 696 | usb_ep_enable(link->in_ep); |
697 | usb_ep_enable(link->out_ep, link->out); | 697 | usb_ep_enable(link->out_ep); |
698 | } | 698 | } |
699 | } | 699 | } |
700 | spin_unlock_irqrestore(&dev->lock, flags); | 700 | spin_unlock_irqrestore(&dev->lock, flags); |
@@ -871,7 +871,7 @@ struct net_device *gether_connect(struct gether *link) | |||
871 | return ERR_PTR(-EINVAL); | 871 | return ERR_PTR(-EINVAL); |
872 | 872 | ||
873 | link->in_ep->driver_data = dev; | 873 | link->in_ep->driver_data = dev; |
874 | result = usb_ep_enable(link->in_ep, link->in); | 874 | result = usb_ep_enable(link->in_ep); |
875 | if (result != 0) { | 875 | if (result != 0) { |
876 | DBG(dev, "enable %s --> %d\n", | 876 | DBG(dev, "enable %s --> %d\n", |
877 | link->in_ep->name, result); | 877 | link->in_ep->name, result); |
@@ -879,7 +879,7 @@ struct net_device *gether_connect(struct gether *link) | |||
879 | } | 879 | } |
880 | 880 | ||
881 | link->out_ep->driver_data = dev; | 881 | link->out_ep->driver_data = dev; |
882 | result = usb_ep_enable(link->out_ep, link->out); | 882 | result = usb_ep_enable(link->out_ep); |
883 | if (result != 0) { | 883 | if (result != 0) { |
884 | DBG(dev, "enable %s --> %d\n", | 884 | DBG(dev, "enable %s --> %d\n", |
885 | link->out_ep->name, result); | 885 | link->out_ep->name, result); |
@@ -969,7 +969,7 @@ void gether_disconnect(struct gether *link) | |||
969 | } | 969 | } |
970 | spin_unlock(&dev->req_lock); | 970 | spin_unlock(&dev->req_lock); |
971 | link->in_ep->driver_data = NULL; | 971 | link->in_ep->driver_data = NULL; |
972 | link->in = NULL; | 972 | link->in_ep->desc = NULL; |
973 | 973 | ||
974 | usb_ep_disable(link->out_ep); | 974 | usb_ep_disable(link->out_ep); |
975 | spin_lock(&dev->req_lock); | 975 | spin_lock(&dev->req_lock); |
@@ -984,7 +984,7 @@ void gether_disconnect(struct gether *link) | |||
984 | } | 984 | } |
985 | spin_unlock(&dev->req_lock); | 985 | spin_unlock(&dev->req_lock); |
986 | link->out_ep->driver_data = NULL; | 986 | link->out_ep->driver_data = NULL; |
987 | link->out = NULL; | 987 | link->out_ep->desc = NULL; |
988 | 988 | ||
989 | /* finish forgetting about this USB link episode */ | 989 | /* finish forgetting about this USB link episode */ |
990 | dev->header_len = 0; | 990 | dev->header_len = 0; |
diff --git a/drivers/usb/gadget/u_ether.h b/drivers/usb/gadget/u_ether.h index b56e1e7d423c..c966440ddd70 100644 --- a/drivers/usb/gadget/u_ether.h +++ b/drivers/usb/gadget/u_ether.h | |||
@@ -52,10 +52,6 @@ struct gether { | |||
52 | struct usb_ep *in_ep; | 52 | struct usb_ep *in_ep; |
53 | struct usb_ep *out_ep; | 53 | struct usb_ep *out_ep; |
54 | 54 | ||
55 | /* descriptors match device speed at gether_connect() time */ | ||
56 | struct usb_endpoint_descriptor *in; | ||
57 | struct usb_endpoint_descriptor *out; | ||
58 | |||
59 | bool is_zlp_ok; | 55 | bool is_zlp_ok; |
60 | 56 | ||
61 | u16 cdc_filter; | 57 | u16 cdc_filter; |
diff --git a/drivers/usb/gadget/u_serial.c b/drivers/usb/gadget/u_serial.c index 40f7716b31fc..a8aa46962d81 100644 --- a/drivers/usb/gadget/u_serial.c +++ b/drivers/usb/gadget/u_serial.c | |||
@@ -1247,12 +1247,12 @@ int gserial_connect(struct gserial *gser, u8 port_num) | |||
1247 | port = ports[port_num].port; | 1247 | port = ports[port_num].port; |
1248 | 1248 | ||
1249 | /* activate the endpoints */ | 1249 | /* activate the endpoints */ |
1250 | status = usb_ep_enable(gser->in, gser->in_desc); | 1250 | status = usb_ep_enable(gser->in); |
1251 | if (status < 0) | 1251 | if (status < 0) |
1252 | return status; | 1252 | return status; |
1253 | gser->in->driver_data = port; | 1253 | gser->in->driver_data = port; |
1254 | 1254 | ||
1255 | status = usb_ep_enable(gser->out, gser->out_desc); | 1255 | status = usb_ep_enable(gser->out); |
1256 | if (status < 0) | 1256 | if (status < 0) |
1257 | goto fail_out; | 1257 | goto fail_out; |
1258 | gser->out->driver_data = port; | 1258 | gser->out->driver_data = port; |
diff --git a/drivers/usb/gadget/u_serial.h b/drivers/usb/gadget/u_serial.h index 300f0ed9475d..9b0fe6450fbf 100644 --- a/drivers/usb/gadget/u_serial.h +++ b/drivers/usb/gadget/u_serial.h | |||
@@ -35,8 +35,6 @@ struct gserial { | |||
35 | 35 | ||
36 | struct usb_ep *in; | 36 | struct usb_ep *in; |
37 | struct usb_ep *out; | 37 | struct usb_ep *out; |
38 | struct usb_endpoint_descriptor *in_desc; | ||
39 | struct usb_endpoint_descriptor *out_desc; | ||
40 | 38 | ||
41 | /* REVISIT avoid this CDC-ACM support harder ... */ | 39 | /* REVISIT avoid this CDC-ACM support harder ... */ |
42 | struct usb_cdc_line_coding port_line_coding; /* 9600-8-N-1 etc */ | 40 | struct usb_cdc_line_coding port_line_coding; /* 9600-8-N-1 etc */ |
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index 18979cfb6d66..fe50912585f8 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h | |||
@@ -132,8 +132,9 @@ struct usb_ep_ops { | |||
132 | * @maxpacket:The maximum packet size used on this endpoint. The initial | 132 | * @maxpacket:The maximum packet size used on this endpoint. The initial |
133 | * value can sometimes be reduced (hardware allowing), according to | 133 | * value can sometimes be reduced (hardware allowing), according to |
134 | * the endpoint descriptor used to configure the endpoint. | 134 | * the endpoint descriptor used to configure the endpoint. |
135 | * @driver_data:for use by the gadget driver. all other fields are | 135 | * @driver_data:for use by the gadget driver. |
136 | * read-only to gadget drivers. | 136 | * @desc: endpoint descriptor. This pointer is set before the endpoint is |
137 | * enabled and remains valid until the endpoint is disabled. | ||
137 | * | 138 | * |
138 | * the bus controller driver lists all the general purpose endpoints in | 139 | * the bus controller driver lists all the general purpose endpoints in |
139 | * gadget->ep_list. the control endpoint (gadget->ep0) is not in that list, | 140 | * gadget->ep_list. the control endpoint (gadget->ep0) is not in that list, |
@@ -146,6 +147,7 @@ struct usb_ep { | |||
146 | const struct usb_ep_ops *ops; | 147 | const struct usb_ep_ops *ops; |
147 | struct list_head ep_list; | 148 | struct list_head ep_list; |
148 | unsigned maxpacket:16; | 149 | unsigned maxpacket:16; |
150 | const struct usb_endpoint_descriptor *desc; | ||
149 | }; | 151 | }; |
150 | 152 | ||
151 | /*-------------------------------------------------------------------------*/ | 153 | /*-------------------------------------------------------------------------*/ |
@@ -154,11 +156,8 @@ struct usb_ep { | |||
154 | * usb_ep_enable - configure endpoint, making it usable | 156 | * usb_ep_enable - configure endpoint, making it usable |
155 | * @ep:the endpoint being configured. may not be the endpoint named "ep0". | 157 | * @ep:the endpoint being configured. may not be the endpoint named "ep0". |
156 | * drivers discover endpoints through the ep_list of a usb_gadget. | 158 | * drivers discover endpoints through the ep_list of a usb_gadget. |
157 | * @desc:descriptor for desired behavior. caller guarantees this pointer | ||
158 | * remains valid until the endpoint is disabled; the data byte order | ||
159 | * is little-endian (usb-standard). | ||
160 | * | 159 | * |
161 | * when configurations are set, or when interface settings change, the driver | 160 | * When configurations are set, or when interface settings change, the driver |
162 | * will enable or disable the relevant endpoints. while it is enabled, an | 161 | * will enable or disable the relevant endpoints. while it is enabled, an |
163 | * endpoint may be used for i/o until the driver receives a disconnect() from | 162 | * endpoint may be used for i/o until the driver receives a disconnect() from |
164 | * the host or until the endpoint is disabled. | 163 | * the host or until the endpoint is disabled. |
@@ -173,10 +172,9 @@ struct usb_ep { | |||
173 | * | 172 | * |
174 | * returns zero, or a negative error code. | 173 | * returns zero, or a negative error code. |
175 | */ | 174 | */ |
176 | static inline int usb_ep_enable(struct usb_ep *ep, | 175 | static inline int usb_ep_enable(struct usb_ep *ep) |
177 | const struct usb_endpoint_descriptor *desc) | ||
178 | { | 176 | { |
179 | return ep->ops->enable(ep, desc); | 177 | return ep->ops->enable(ep, ep->desc); |
180 | } | 178 | } |
181 | 179 | ||
182 | /** | 180 | /** |