diff options
Diffstat (limited to 'drivers/usb/gadget/f_loopback.c')
| -rw-r--r-- | drivers/usb/gadget/f_loopback.c | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/drivers/usb/gadget/f_loopback.c b/drivers/usb/gadget/f_loopback.c index 7275706caeb0..bb39cb2bb3a3 100644 --- a/drivers/usb/gadget/f_loopback.c +++ b/drivers/usb/gadget/f_loopback.c | |||
| @@ -177,6 +177,7 @@ loopback_bind(struct usb_configuration *c, struct usb_function *f) | |||
| 177 | struct usb_composite_dev *cdev = c->cdev; | 177 | struct usb_composite_dev *cdev = c->cdev; |
| 178 | struct f_loopback *loop = func_to_loop(f); | 178 | struct f_loopback *loop = func_to_loop(f); |
| 179 | int id; | 179 | int id; |
| 180 | int ret; | ||
| 180 | 181 | ||
| 181 | /* allocate interface ID(s) */ | 182 | /* allocate interface ID(s) */ |
| 182 | id = usb_interface_id(c, f); | 183 | id = usb_interface_id(c, f); |
| @@ -201,22 +202,19 @@ autoconf_fail: | |||
| 201 | loop->out_ep->driver_data = cdev; /* claim */ | 202 | loop->out_ep->driver_data = cdev; /* claim */ |
| 202 | 203 | ||
| 203 | /* support high speed hardware */ | 204 | /* support high speed hardware */ |
| 204 | if (gadget_is_dualspeed(c->cdev->gadget)) { | 205 | hs_loop_source_desc.bEndpointAddress = |
| 205 | hs_loop_source_desc.bEndpointAddress = | 206 | fs_loop_source_desc.bEndpointAddress; |
| 206 | fs_loop_source_desc.bEndpointAddress; | 207 | hs_loop_sink_desc.bEndpointAddress = fs_loop_sink_desc.bEndpointAddress; |
| 207 | hs_loop_sink_desc.bEndpointAddress = | ||
| 208 | fs_loop_sink_desc.bEndpointAddress; | ||
| 209 | f->hs_descriptors = hs_loopback_descs; | ||
| 210 | } | ||
| 211 | 208 | ||
| 212 | /* support super speed hardware */ | 209 | /* support super speed hardware */ |
| 213 | if (gadget_is_superspeed(c->cdev->gadget)) { | 210 | ss_loop_source_desc.bEndpointAddress = |
| 214 | ss_loop_source_desc.bEndpointAddress = | 211 | fs_loop_source_desc.bEndpointAddress; |
| 215 | fs_loop_source_desc.bEndpointAddress; | 212 | ss_loop_sink_desc.bEndpointAddress = fs_loop_sink_desc.bEndpointAddress; |
| 216 | ss_loop_sink_desc.bEndpointAddress = | 213 | |
| 217 | fs_loop_sink_desc.bEndpointAddress; | 214 | ret = usb_assign_descriptors(f, fs_loopback_descs, hs_loopback_descs, |
| 218 | f->ss_descriptors = ss_loopback_descs; | 215 | ss_loopback_descs); |
| 219 | } | 216 | if (ret) |
| 217 | return ret; | ||
| 220 | 218 | ||
| 221 | DBG(cdev, "%s speed %s: IN/%s, OUT/%s\n", | 219 | DBG(cdev, "%s speed %s: IN/%s, OUT/%s\n", |
| 222 | (gadget_is_superspeed(c->cdev->gadget) ? "super" : | 220 | (gadget_is_superspeed(c->cdev->gadget) ? "super" : |
| @@ -228,6 +226,7 @@ autoconf_fail: | |||
| 228 | static void | 226 | static void |
| 229 | loopback_unbind(struct usb_configuration *c, struct usb_function *f) | 227 | loopback_unbind(struct usb_configuration *c, struct usb_function *f) |
| 230 | { | 228 | { |
| 229 | usb_free_all_descriptors(f); | ||
| 231 | kfree(func_to_loop(f)); | 230 | kfree(func_to_loop(f)); |
| 232 | } | 231 | } |
| 233 | 232 | ||
| @@ -379,7 +378,6 @@ static int __init loopback_bind_config(struct usb_configuration *c) | |||
| 379 | return -ENOMEM; | 378 | return -ENOMEM; |
| 380 | 379 | ||
| 381 | loop->function.name = "loopback"; | 380 | loop->function.name = "loopback"; |
| 382 | loop->function.descriptors = fs_loopback_descs; | ||
| 383 | loop->function.bind = loopback_bind; | 381 | loop->function.bind = loopback_bind; |
| 384 | loop->function.unbind = loopback_unbind; | 382 | loop->function.unbind = loopback_unbind; |
| 385 | loop->function.set_alt = loopback_set_alt; | 383 | loop->function.set_alt = loopback_set_alt; |
