1 /* 2 * f_sourcesink.c - USB peripheral source/sink configuration driver 3 * 4 * Copyright (C) 2003-2008 David Brownell 5 * Copyright (C) 2008 by Nokia Corporation 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 */ 12 13 /* #define VERBOSE_DEBUG */ 14 15 #include <linux/slab.h> 16 #include <linux/kernel.h> 17 #include <linux/device.h> 18 #include <linux/module.h> 19 #include <linux/usb/composite.h> 20 #include <linux/err.h> 21 22 #include "g_zero.h" 23 #include "u_f.h" 24 25 /* 26 * SOURCE/SINK FUNCTION ... a primary testing vehicle for USB peripheral 27 * controller drivers. 28 * 29 * This just sinks bulk packets OUT to the peripheral and sources them IN 30 * to the host, optionally with specific data patterns for integrity tests. 31 * As such it supports basic functionality and load tests. 32 * 33 * In terms of control messaging, this supports all the standard requests 34 * plus two that support control-OUT tests. If the optional "autoresume" 35 * mode is enabled, it provides good functional coverage for the "USBCV" 36 * test harness from USB-IF. 37 */ 38 struct f_sourcesink { 39 struct usb_function function; 40 41 struct usb_ep *in_ep; 42 struct usb_ep *out_ep; 43 struct usb_ep *iso_in_ep; 44 struct usb_ep *iso_out_ep; 45 int cur_alt; 46 47 unsigned pattern; 48 unsigned isoc_interval; 49 unsigned isoc_maxpacket; 50 unsigned isoc_mult; 51 unsigned isoc_maxburst; 52 unsigned buflen; 53 unsigned bulk_qlen; 54 unsigned iso_qlen; 55 }; 56 57 static inline struct f_sourcesink *func_to_ss(struct usb_function *f) 58 { 59 return container_of(f, struct f_sourcesink, function); 60 } 61 62 /*-------------------------------------------------------------------------*/ 63 64 static struct usb_interface_descriptor source_sink_intf_alt0 = { 65 .bLength = USB_DT_INTERFACE_SIZE, 66 .bDescriptorType = USB_DT_INTERFACE, 67 68 .bAlternateSetting = 0, 69 .bNumEndpoints = 2, 70 .bInterfaceClass = USB_CLASS_VENDOR_SPEC, 71 /* .iInterface = DYNAMIC */ 72 }; 73 74 static struct usb_interface_descriptor source_sink_intf_alt1 = { 75 .bLength = USB_DT_INTERFACE_SIZE, 76 .bDescriptorType = USB_DT_INTERFACE, 77 78 .bAlternateSetting = 1, 79 .bNumEndpoints = 4, 80 .bInterfaceClass = USB_CLASS_VENDOR_SPEC, 81 /* .iInterface = DYNAMIC */ 82 }; 83 84 /* full speed support: */ 85 86 static struct usb_endpoint_descriptor fs_source_desc = { 87 .bLength = USB_DT_ENDPOINT_SIZE, 88 .bDescriptorType = USB_DT_ENDPOINT, 89 90 .bEndpointAddress = USB_DIR_IN, 91 .bmAttributes = USB_ENDPOINT_XFER_BULK, 92 }; 93 94 static struct usb_endpoint_descriptor fs_sink_desc = { 95 .bLength = USB_DT_ENDPOINT_SIZE, 96 .bDescriptorType = USB_DT_ENDPOINT, 97 98 .bEndpointAddress = USB_DIR_OUT, 99 .bmAttributes = USB_ENDPOINT_XFER_BULK, 100 }; 101 102 static struct usb_endpoint_descriptor fs_iso_source_desc = { 103 .bLength = USB_DT_ENDPOINT_SIZE, 104 .bDescriptorType = USB_DT_ENDPOINT, 105 106 .bEndpointAddress = USB_DIR_IN, 107 .bmAttributes = USB_ENDPOINT_XFER_ISOC, 108 .wMaxPacketSize = cpu_to_le16(1023), 109 .bInterval = 4, 110 }; 111 112 static struct usb_endpoint_descriptor fs_iso_sink_desc = { 113 .bLength = USB_DT_ENDPOINT_SIZE, 114 .bDescriptorType = USB_DT_ENDPOINT, 115 116 .bEndpointAddress = USB_DIR_OUT, 117 .bmAttributes = USB_ENDPOINT_XFER_ISOC, 118 .wMaxPacketSize = cpu_to_le16(1023), 119 .bInterval = 4, 120 }; 121 122 static struct usb_descriptor_header *fs_source_sink_descs[] = { 123 (struct usb_descriptor_header *) &source_sink_intf_alt0, 124 (struct usb_descriptor_header *) &fs_sink_desc, 125 (struct usb_descriptor_header *) &fs_source_desc, 126 (struct usb_descriptor_header *) &source_sink_intf_alt1, 127 #define FS_ALT_IFC_1_OFFSET 3 128 (struct usb_descriptor_header *) &fs_sink_desc, 129 (struct usb_descriptor_header *) &fs_source_desc, 130 (struct usb_descriptor_header *) &fs_iso_sink_desc, 131 (struct usb_descriptor_header *) &fs_iso_source_desc, 132 NULL, 133 }; 134 135 /* high speed support: */ 136 137 static struct usb_endpoint_descriptor hs_source_desc = { 138 .bLength = USB_DT_ENDPOINT_SIZE, 139 .bDescriptorType = USB_DT_ENDPOINT, 140 141 .bmAttributes = USB_ENDPOINT_XFER_BULK, 142 .wMaxPacketSize = cpu_to_le16(512), 143 }; 144 145 static struct usb_endpoint_descriptor hs_sink_desc = { 146 .bLength = USB_DT_ENDPOINT_SIZE, 147 .bDescriptorType = USB_DT_ENDPOINT, 148 149 .bmAttributes = USB_ENDPOINT_XFER_BULK, 150 .wMaxPacketSize = cpu_to_le16(512), 151 }; 152 153 static struct usb_endpoint_descriptor hs_iso_source_desc = { 154 .bLength = USB_DT_ENDPOINT_SIZE, 155 .bDescriptorType = USB_DT_ENDPOINT, 156 157 .bmAttributes = USB_ENDPOINT_XFER_ISOC, 158 .wMaxPacketSize = cpu_to_le16(1024), 159 .bInterval = 4, 160 }; 161 162 static struct usb_endpoint_descriptor hs_iso_sink_desc = { 163 .bLength = USB_DT_ENDPOINT_SIZE, 164 .bDescriptorType = USB_DT_ENDPOINT, 165 166 .bmAttributes = USB_ENDPOINT_XFER_ISOC, 167 .wMaxPacketSize = cpu_to_le16(1024), 168 .bInterval = 4, 169 }; 170 171 static struct usb_descriptor_header *hs_source_sink_descs[] = { 172 (struct usb_descriptor_header *) &source_sink_intf_alt0, 173 (struct usb_descriptor_header *) &hs_source_desc, 174 (struct usb_descriptor_header *) &hs_sink_desc, 175 (struct usb_descriptor_header *) &source_sink_intf_alt1, 176 #define HS_ALT_IFC_1_OFFSET 3 177 (struct usb_descriptor_header *) &hs_source_desc, 178 (struct usb_descriptor_header *) &hs_sink_desc, 179 (struct usb_descriptor_header *) &hs_iso_source_desc, 180 (struct usb_descriptor_header *) &hs_iso_sink_desc, 181 NULL, 182 }; 183 184 /* super speed support: */ 185 186 static struct usb_endpoint_descriptor ss_source_desc = { 187 .bLength = USB_DT_ENDPOINT_SIZE, 188 .bDescriptorType = USB_DT_ENDPOINT, 189 190 .bmAttributes = USB_ENDPOINT_XFER_BULK, 191 .wMaxPacketSize = cpu_to_le16(1024), 192 }; 193 194 static struct usb_ss_ep_comp_descriptor ss_source_comp_desc = { 195 .bLength = USB_DT_SS_EP_COMP_SIZE, 196 .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 197 198 .bMaxBurst = 0, 199 .bmAttributes = 0, 200 .wBytesPerInterval = 0, 201 }; 202 203 static struct usb_endpoint_descriptor ss_sink_desc = { 204 .bLength = USB_DT_ENDPOINT_SIZE, 205 .bDescriptorType = USB_DT_ENDPOINT, 206 207 .bmAttributes = USB_ENDPOINT_XFER_BULK, 208 .wMaxPacketSize = cpu_to_le16(1024), 209 }; 210 211 static struct usb_ss_ep_comp_descriptor ss_sink_comp_desc = { 212 .bLength = USB_DT_SS_EP_COMP_SIZE, 213 .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 214 215 .bMaxBurst = 0, 216 .bmAttributes = 0, 217 .wBytesPerInterval = 0, 218 }; 219 220 static struct usb_endpoint_descriptor ss_iso_source_desc = { 221 .bLength = USB_DT_ENDPOINT_SIZE, 222 .bDescriptorType = USB_DT_ENDPOINT, 223 224 .bmAttributes = USB_ENDPOINT_XFER_ISOC, 225 .wMaxPacketSize = cpu_to_le16(1024), 226 .bInterval = 4, 227 }; 228 229 static struct usb_ss_ep_comp_descriptor ss_iso_source_comp_desc = { 230 .bLength = USB_DT_SS_EP_COMP_SIZE, 231 .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 232 233 .bMaxBurst = 0, 234 .bmAttributes = 0, 235 .wBytesPerInterval = cpu_to_le16(1024), 236 }; 237 238 static struct usb_endpoint_descriptor ss_iso_sink_desc = { 239 .bLength = USB_DT_ENDPOINT_SIZE, 240 .bDescriptorType = USB_DT_ENDPOINT, 241 242 .bmAttributes = USB_ENDPOINT_XFER_ISOC, 243 .wMaxPacketSize = cpu_to_le16(1024), 244 .bInterval = 4, 245 }; 246 247 static struct usb_ss_ep_comp_descriptor ss_iso_sink_comp_desc = { 248 .bLength = USB_DT_SS_EP_COMP_SIZE, 249 .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 250 251 .bMaxBurst = 0, 252 .bmAttributes = 0, 253 .wBytesPerInterval = cpu_to_le16(1024), 254 }; 255 256 static struct usb_descriptor_header *ss_source_sink_descs[] = { 257 (struct usb_descriptor_header *) &source_sink_intf_alt0, 258 (struct usb_descriptor_header *) &ss_source_desc, 259 (struct usb_descriptor_header *) &ss_source_comp_desc, 260 (struct usb_descriptor_header *) &ss_sink_desc, 261 (struct usb_descriptor_header *) &ss_sink_comp_desc, 262 (struct usb_descriptor_header *) &source_sink_intf_alt1, 263 #define SS_ALT_IFC_1_OFFSET 5 264 (struct usb_descriptor_header *) &ss_source_desc, 265 (struct usb_descriptor_header *) &ss_source_comp_desc, 266 (struct usb_descriptor_header *) &ss_sink_desc, 267 (struct usb_descriptor_header *) &ss_sink_comp_desc, 268 (struct usb_descriptor_header *) &ss_iso_source_desc, 269 (struct usb_descriptor_header *) &ss_iso_source_comp_desc, 270 (struct usb_descriptor_header *) &ss_iso_sink_desc, 271 (struct usb_descriptor_header *) &ss_iso_sink_comp_desc, 272 NULL, 273 }; 274 275 /* function-specific strings: */ 276 277 static struct usb_string strings_sourcesink[] = { 278 [0].s = "source and sink data", 279 { } /* end of list */ 280 }; 281 282 static struct usb_gadget_strings stringtab_sourcesink = { 283 .language = 0x0409, /* en-us */ 284 .strings = strings_sourcesink, 285 }; 286 287 static struct usb_gadget_strings *sourcesink_strings[] = { 288 &stringtab_sourcesink, 289 NULL, 290 }; 291 292 /*-------------------------------------------------------------------------*/ 293 294 static inline struct usb_request *ss_alloc_ep_req(struct usb_ep *ep, int len) 295 { 296 struct f_sourcesink *ss = ep->driver_data; 297 298 return alloc_ep_req(ep, len, ss->buflen); 299 } 300 301 static void disable_ep(struct usb_composite_dev *cdev, struct usb_ep *ep) 302 { 303 int value; 304 305 value = usb_ep_disable(ep); 306 if (value < 0) 307 DBG(cdev, "disable %s --> %d\n", ep->name, value); 308 } 309 310 void disable_endpoints(struct usb_composite_dev *cdev, 311 struct usb_ep *in, struct usb_ep *out, 312 struct usb_ep *iso_in, struct usb_ep *iso_out) 313 { 314 disable_ep(cdev, in); 315 disable_ep(cdev, out); 316 if (iso_in) 317 disable_ep(cdev, iso_in); 318 if (iso_out) 319 disable_ep(cdev, iso_out); 320 } 321 322 static int 323 sourcesink_bind(struct usb_configuration *c, struct usb_function *f) 324 { 325 struct usb_composite_dev *cdev = c->cdev; 326 struct f_sourcesink *ss = func_to_ss(f); 327 int id; 328 int ret; 329 330 /* allocate interface ID(s) */ 331 id = usb_interface_id(c, f); 332 if (id < 0) 333 return id; 334 source_sink_intf_alt0.bInterfaceNumber = id; 335 source_sink_intf_alt1.bInterfaceNumber = id; 336 337 /* allocate bulk endpoints */ 338 ss->in_ep = usb_ep_autoconfig(cdev->gadget, &fs_source_desc); 339 if (!ss->in_ep) { 340 autoconf_fail: 341 ERROR(cdev, "%s: can't autoconfigure on %s\n", 342 f->name, cdev->gadget->name); 343 return -ENODEV; 344 } 345 346 ss->out_ep = usb_ep_autoconfig(cdev->gadget, &fs_sink_desc); 347 if (!ss->out_ep) 348 goto autoconf_fail; 349 350 /* sanity check the isoc module parameters */ 351 if (ss->isoc_interval < 1) 352 ss->isoc_interval = 1; 353 if (ss->isoc_interval > 16) 354 ss->isoc_interval = 16; 355 if (ss->isoc_mult > 2) 356 ss->isoc_mult = 2; 357 if (ss->isoc_maxburst > 15) 358 ss->isoc_maxburst = 15; 359 360 /* fill in the FS isoc descriptors from the module parameters */ 361 fs_iso_source_desc.wMaxPacketSize = ss->isoc_maxpacket > 1023 ? 362 1023 : ss->isoc_maxpacket; 363 fs_iso_source_desc.bInterval = ss->isoc_interval; 364 fs_iso_sink_desc.wMaxPacketSize = ss->isoc_maxpacket > 1023 ? 365 1023 : ss->isoc_maxpacket; 366 fs_iso_sink_desc.bInterval = ss->isoc_interval; 367 368 /* allocate iso endpoints */ 369 ss->iso_in_ep = usb_ep_autoconfig(cdev->gadget, &fs_iso_source_desc); 370 if (!ss->iso_in_ep) 371 goto no_iso; 372 373 ss->iso_out_ep = usb_ep_autoconfig(cdev->gadget, &fs_iso_sink_desc); 374 if (!ss->iso_out_ep) { 375 usb_ep_autoconfig_release(ss->iso_in_ep); 376 ss->iso_in_ep = NULL; 377 no_iso: 378 /* 379 * We still want to work even if the UDC doesn't have isoc 380 * endpoints, so null out the alt interface that contains 381 * them and continue. 382 */ 383 fs_source_sink_descs[FS_ALT_IFC_1_OFFSET] = NULL; 384 hs_source_sink_descs[HS_ALT_IFC_1_OFFSET] = NULL; 385 ss_source_sink_descs[SS_ALT_IFC_1_OFFSET] = NULL; 386 } 387 388 if (ss->isoc_maxpacket > 1024) 389 ss->isoc_maxpacket = 1024; 390 391 /* support high speed hardware */ 392 hs_source_desc.bEndpointAddress = fs_source_desc.bEndpointAddress; 393 hs_sink_desc.bEndpointAddress = fs_sink_desc.bEndpointAddress; 394 395 /* 396 * Fill in the HS isoc descriptors from the module parameters. 397 * We assume that the user knows what they are doing and won't 398 * give parameters that their UDC doesn't support. 399 */ 400 hs_iso_source_desc.wMaxPacketSize = ss->isoc_maxpacket; 401 hs_iso_source_desc.wMaxPacketSize |= ss->isoc_mult << 11; 402 hs_iso_source_desc.bInterval = ss->isoc_interval; 403 hs_iso_source_desc.bEndpointAddress = 404 fs_iso_source_desc.bEndpointAddress; 405 406 hs_iso_sink_desc.wMaxPacketSize = ss->isoc_maxpacket; 407 hs_iso_sink_desc.wMaxPacketSize |= ss->isoc_mult << 11; 408 hs_iso_sink_desc.bInterval = ss->isoc_interval; 409 hs_iso_sink_desc.bEndpointAddress = fs_iso_sink_desc.bEndpointAddress; 410 411 /* support super speed hardware */ 412 ss_source_desc.bEndpointAddress = 413 fs_source_desc.bEndpointAddress; 414 ss_sink_desc.bEndpointAddress = 415 fs_sink_desc.bEndpointAddress; 416 417 /* 418 * Fill in the SS isoc descriptors from the module parameters. 419 * We assume that the user knows what they are doing and won't 420 * give parameters that their UDC doesn't support. 421 */ 422 ss_iso_source_desc.wMaxPacketSize = ss->isoc_maxpacket; 423 ss_iso_source_desc.bInterval = ss->isoc_interval; 424 ss_iso_source_comp_desc.bmAttributes = ss->isoc_mult; 425 ss_iso_source_comp_desc.bMaxBurst = ss->isoc_maxburst; 426 ss_iso_source_comp_desc.wBytesPerInterval = ss->isoc_maxpacket * 427 (ss->isoc_mult + 1) * (ss->isoc_maxburst + 1); 428 ss_iso_source_desc.bEndpointAddress = 429 fs_iso_source_desc.bEndpointAddress; 430 431 ss_iso_sink_desc.wMaxPacketSize = ss->isoc_maxpacket; 432 ss_iso_sink_desc.bInterval = ss->isoc_interval; 433 ss_iso_sink_comp_desc.bmAttributes = ss->isoc_mult; 434 ss_iso_sink_comp_desc.bMaxBurst = ss->isoc_maxburst; 435 ss_iso_sink_comp_desc.wBytesPerInterval = ss->isoc_maxpacket * 436 (ss->isoc_mult + 1) * (ss->isoc_maxburst + 1); 437 ss_iso_sink_desc.bEndpointAddress = fs_iso_sink_desc.bEndpointAddress; 438 439 ret = usb_assign_descriptors(f, fs_source_sink_descs, 440 hs_source_sink_descs, ss_source_sink_descs, NULL); 441 if (ret) 442 return ret; 443 444 DBG(cdev, "%s speed %s: IN/%s, OUT/%s, ISO-IN/%s, ISO-OUT/%s\n", 445 (gadget_is_superspeed(c->cdev->gadget) ? "super" : 446 (gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full")), 447 f->name, ss->in_ep->name, ss->out_ep->name, 448 ss->iso_in_ep ? ss->iso_in_ep->name : "<none>", 449 ss->iso_out_ep ? ss->iso_out_ep->name : "<none>"); 450 return 0; 451 } 452 453 static void 454 sourcesink_free_func(struct usb_function *f) 455 { 456 struct f_ss_opts *opts; 457 458 opts = container_of(f->fi, struct f_ss_opts, func_inst); 459 460 mutex_lock(&opts->lock); 461 opts->refcnt--; 462 mutex_unlock(&opts->lock); 463 464 usb_free_all_descriptors(f); 465 kfree(func_to_ss(f)); 466 } 467 468 /* optionally require specific source/sink data patterns */ 469 static int check_read_data(struct f_sourcesink *ss, struct usb_request *req) 470 { 471 unsigned i; 472 u8 *buf = req->buf; 473 struct usb_composite_dev *cdev = ss->function.config->cdev; 474 int max_packet_size = le16_to_cpu(ss->out_ep->desc->wMaxPacketSize); 475 476 if (ss->pattern == 2) 477 return 0; 478 479 for (i = 0; i < req->actual; i++, buf++) { 480 switch (ss->pattern) { 481 482 /* all-zeroes has no synchronization issues */ 483 case 0: 484 if (*buf == 0) 485 continue; 486 break; 487 488 /* "mod63" stays in sync with short-terminated transfers, 489 * OR otherwise when host and gadget agree on how large 490 * each usb transfer request should be. Resync is done 491 * with set_interface or set_config. (We *WANT* it to 492 * get quickly out of sync if controllers or their drivers 493 * stutter for any reason, including buffer duplication...) 494 */ 495 case 1: 496 if (*buf == (u8)((i % max_packet_size) % 63)) 497 continue; 498 break; 499 } 500 ERROR(cdev, "bad OUT byte, buf[%d] = %d\n", i, *buf); 501 usb_ep_set_halt(ss->out_ep); 502 return -EINVAL; 503 } 504 return 0; 505 } 506 507 static void reinit_write_data(struct usb_ep *ep, struct usb_request *req) 508 { 509 unsigned i; 510 u8 *buf = req->buf; 511 int max_packet_size = le16_to_cpu(ep->desc->wMaxPacketSize); 512 struct f_sourcesink *ss = ep->driver_data; 513 514 switch (ss->pattern) { 515 case 0: 516 memset(req->buf, 0, req->length); 517 break; 518 case 1: 519 for (i = 0; i < req->length; i++) 520 *buf++ = (u8) ((i % max_packet_size) % 63); 521 break; 522 case 2: 523 break; 524 } 525 } 526 527 static void source_sink_complete(struct usb_ep *ep, struct usb_request *req) 528 { 529 struct usb_composite_dev *cdev; 530 struct f_sourcesink *ss = ep->driver_data; 531 int status = req->status; 532 533 /* driver_data will be null if ep has been disabled */ 534 if (!ss) 535 return; 536 537 cdev = ss->function.config->cdev; 538 539 switch (status) { 540 541 case 0: /* normal completion? */ 542 if (ep == ss->out_ep) { 543 check_read_data(ss, req); 544 if (ss->pattern != 2) 545 memset(req->buf, 0x55, req->length); 546 } 547 break; 548 549 /* this endpoint is normally active while we're configured */ 550 case -ECONNABORTED: /* hardware forced ep reset */ 551 case -ECONNRESET: /* request dequeued */ 552 case -ESHUTDOWN: /* disconnect from host */ 553 VDBG(cdev, "%s gone (%d), %d/%d\n", ep->name, status, 554 req->actual, req->length); 555 if (ep == ss->out_ep) 556 check_read_data(ss, req); 557 free_ep_req(ep, req); 558 return; 559 560 case -EOVERFLOW: /* buffer overrun on read means that 561 * we didn't provide a big enough 562 * buffer. 563 */ 564 default: 565 #if 1 566 DBG(cdev, "%s complete --> %d, %d/%d\n", ep->name, 567 status, req->actual, req->length); 568 #endif 569 case -EREMOTEIO: /* short read */ 570 break; 571 } 572 573 status = usb_ep_queue(ep, req, GFP_ATOMIC); 574 if (status) { 575 ERROR(cdev, "kill %s: resubmit %d bytes --> %d\n", 576 ep->name, req->length, status); 577 usb_ep_set_halt(ep); 578 /* FIXME recover later ... somehow */ 579 } 580 } 581 582 static int source_sink_start_ep(struct f_sourcesink *ss, bool is_in, 583 bool is_iso, int speed) 584 { 585 struct usb_ep *ep; 586 struct usb_request *req; 587 int i, size, qlen, status = 0; 588 589 if (is_iso) { 590 switch (speed) { 591 case USB_SPEED_SUPER: 592 size = ss->isoc_maxpacket * 593 (ss->isoc_mult + 1) * 594 (ss->isoc_maxburst + 1); 595 break; 596 case USB_SPEED_HIGH: 597 size = ss->isoc_maxpacket * (ss->isoc_mult + 1); 598 break; 599 default: 600 size = ss->isoc_maxpacket > 1023 ? 601 1023 : ss->isoc_maxpacket; 602 break; 603 } 604 ep = is_in ? ss->iso_in_ep : ss->iso_out_ep; 605 qlen = ss->iso_qlen; 606 } else { 607 ep = is_in ? ss->in_ep : ss->out_ep; 608 qlen = ss->bulk_qlen; 609 size = 0; 610 } 611 612 for (i = 0; i < qlen; i++) { 613 req = ss_alloc_ep_req(ep, size); 614 if (!req) 615 return -ENOMEM; 616 617 req->complete = source_sink_complete; 618 if (is_in) 619 reinit_write_data(ep, req); 620 else if (ss->pattern != 2) 621 memset(req->buf, 0x55, req->length); 622 623 status = usb_ep_queue(ep, req, GFP_ATOMIC); 624 if (status) { 625 struct usb_composite_dev *cdev; 626 627 cdev = ss->function.config->cdev; 628 ERROR(cdev, "start %s%s %s --> %d\n", 629 is_iso ? "ISO-" : "", is_in ? "IN" : "OUT", 630 ep->name, status); 631 free_ep_req(ep, req); 632 return status; 633 } 634 } 635 636 return status; 637 } 638 639 static void disable_source_sink(struct f_sourcesink *ss) 640 { 641 struct usb_composite_dev *cdev; 642 643 cdev = ss->function.config->cdev; 644 disable_endpoints(cdev, ss->in_ep, ss->out_ep, ss->iso_in_ep, 645 ss->iso_out_ep); 646 VDBG(cdev, "%s disabled\n", ss->function.name); 647 } 648 649 static int 650 enable_source_sink(struct usb_composite_dev *cdev, struct f_sourcesink *ss, 651 int alt) 652 { 653 int result = 0; 654 int speed = cdev->gadget->speed; 655 struct usb_ep *ep; 656 657 /* one bulk endpoint writes (sources) zeroes IN (to the host) */ 658 ep = ss->in_ep; 659 result = config_ep_by_speed(cdev->gadget, &(ss->function), ep); 660 if (result) 661 return result; 662 result = usb_ep_enable(ep); 663 if (result < 0) 664 return result; 665 ep->driver_data = ss; 666 667 result = source_sink_start_ep(ss, true, false, speed); 668 if (result < 0) { 669 fail: 670 ep = ss->in_ep; 671 usb_ep_disable(ep); 672 return result; 673 } 674 675 /* one bulk endpoint reads (sinks) anything OUT (from the host) */ 676 ep = ss->out_ep; 677 result = config_ep_by_speed(cdev->gadget, &(ss->function), ep); 678 if (result) 679 goto fail; 680 result = usb_ep_enable(ep); 681 if (result < 0) 682 goto fail; 683 ep->driver_data = ss; 684 685 result = source_sink_start_ep(ss, false, false, speed); 686 if (result < 0) { 687 fail2: 688 ep = ss->out_ep; 689 usb_ep_disable(ep); 690 goto fail; 691 } 692 693 if (alt == 0) 694 goto out; 695 696 /* one iso endpoint writes (sources) zeroes IN (to the host) */ 697 ep = ss->iso_in_ep; 698 if (ep) { 699 result = config_ep_by_speed(cdev->gadget, &(ss->function), ep); 700 if (result) 701 goto fail2; 702 result = usb_ep_enable(ep); 703 if (result < 0) 704 goto fail2; 705 ep->driver_data = ss; 706 707 result = source_sink_start_ep(ss, true, true, speed); 708 if (result < 0) { 709 fail3: 710 ep = ss->iso_in_ep; 711 if (ep) 712 usb_ep_disable(ep); 713 goto fail2; 714 } 715 } 716 717 /* one iso endpoint reads (sinks) anything OUT (from the host) */ 718 ep = ss->iso_out_ep; 719 if (ep) { 720 result = config_ep_by_speed(cdev->gadget, &(ss->function), ep); 721 if (result) 722 goto fail3; 723 result = usb_ep_enable(ep); 724 if (result < 0) 725 goto fail3; 726 ep->driver_data = ss; 727 728 result = source_sink_start_ep(ss, false, true, speed); 729 if (result < 0) { 730 usb_ep_disable(ep); 731 goto fail3; 732 } 733 } 734 out: 735 ss->cur_alt = alt; 736 737 DBG(cdev, "%s enabled, alt intf %d\n", ss->function.name, alt); 738 return result; 739 } 740 741 static int sourcesink_set_alt(struct usb_function *f, 742 unsigned intf, unsigned alt) 743 { 744 struct f_sourcesink *ss = func_to_ss(f); 745 struct usb_composite_dev *cdev = f->config->cdev; 746 747 disable_source_sink(ss); 748 return enable_source_sink(cdev, ss, alt); 749 } 750 751 static int sourcesink_get_alt(struct usb_function *f, unsigned intf) 752 { 753 struct f_sourcesink *ss = func_to_ss(f); 754 755 return ss->cur_alt; 756 } 757 758 static void sourcesink_disable(struct usb_function *f) 759 { 760 struct f_sourcesink *ss = func_to_ss(f); 761 762 disable_source_sink(ss); 763 } 764 765 /*-------------------------------------------------------------------------*/ 766 767 static int sourcesink_setup(struct usb_function *f, 768 const struct usb_ctrlrequest *ctrl) 769 { 770 struct usb_configuration *c = f->config; 771 struct usb_request *req = c->cdev->req; 772 int value = -EOPNOTSUPP; 773 u16 w_index = le16_to_cpu(ctrl->wIndex); 774 u16 w_value = le16_to_cpu(ctrl->wValue); 775 u16 w_length = le16_to_cpu(ctrl->wLength); 776 777 req->length = USB_COMP_EP0_BUFSIZ; 778 779 /* composite driver infrastructure handles everything except 780 * the two control test requests. 781 */ 782 switch (ctrl->bRequest) { 783 784 /* 785 * These are the same vendor-specific requests supported by 786 * Intel's USB 2.0 compliance test devices. We exceed that 787 * device spec by allowing multiple-packet requests. 788 * 789 * NOTE: the Control-OUT data stays in req->buf ... better 790 * would be copying it into a scratch buffer, so that other 791 * requests may safely intervene. 792 */ 793 case 0x5b: /* control WRITE test -- fill the buffer */ 794 if (ctrl->bRequestType != (USB_DIR_OUT|USB_TYPE_VENDOR)) 795 goto unknown; 796 if (w_value || w_index) 797 break; 798 /* just read that many bytes into the buffer */ 799 if (w_length > req->length) 800 break; 801 value = w_length; 802 break; 803 case 0x5c: /* control READ test -- return the buffer */ 804 if (ctrl->bRequestType != (USB_DIR_IN|USB_TYPE_VENDOR)) 805 goto unknown; 806 if (w_value || w_index) 807 break; 808 /* expect those bytes are still in the buffer; send back */ 809 if (w_length > req->length) 810 break; 811 value = w_length; 812 break; 813 814 default: 815 unknown: 816 VDBG(c->cdev, 817 "unknown control req%02x.%02x v%04x i%04x l%d\n", 818 ctrl->bRequestType, ctrl->bRequest, 819 w_value, w_index, w_length); 820 } 821 822 /* respond with data transfer or status phase? */ 823 if (value >= 0) { 824 VDBG(c->cdev, "source/sink req%02x.%02x v%04x i%04x l%d\n", 825 ctrl->bRequestType, ctrl->bRequest, 826 w_value, w_index, w_length); 827 req->zero = 0; 828 req->length = value; 829 value = usb_ep_queue(c->cdev->gadget->ep0, req, GFP_ATOMIC); 830 if (value < 0) 831 ERROR(c->cdev, "source/sink response, err %d\n", 832 value); 833 } 834 835 /* device either stalls (value < 0) or reports success */ 836 return value; 837 } 838 839 static struct usb_function *source_sink_alloc_func( 840 struct usb_function_instance *fi) 841 { 842 struct f_sourcesink *ss; 843 struct f_ss_opts *ss_opts; 844 845 ss = kzalloc(sizeof(*ss), GFP_KERNEL); 846 if (!ss) 847 return NULL; 848 849 ss_opts = container_of(fi, struct f_ss_opts, func_inst); 850 851 mutex_lock(&ss_opts->lock); 852 ss_opts->refcnt++; 853 mutex_unlock(&ss_opts->lock); 854 855 ss->pattern = ss_opts->pattern; 856 ss->isoc_interval = ss_opts->isoc_interval; 857 ss->isoc_maxpacket = ss_opts->isoc_maxpacket; 858 ss->isoc_mult = ss_opts->isoc_mult; 859 ss->isoc_maxburst = ss_opts->isoc_maxburst; 860 ss->buflen = ss_opts->bulk_buflen; 861 ss->bulk_qlen = ss_opts->bulk_qlen; 862 ss->iso_qlen = ss_opts->iso_qlen; 863 864 ss->function.name = "source/sink"; 865 ss->function.bind = sourcesink_bind; 866 ss->function.set_alt = sourcesink_set_alt; 867 ss->function.get_alt = sourcesink_get_alt; 868 ss->function.disable = sourcesink_disable; 869 ss->function.setup = sourcesink_setup; 870 ss->function.strings = sourcesink_strings; 871 872 ss->function.free_func = sourcesink_free_func; 873 874 return &ss->function; 875 } 876 877 static inline struct f_ss_opts *to_f_ss_opts(struct config_item *item) 878 { 879 return container_of(to_config_group(item), struct f_ss_opts, 880 func_inst.group); 881 } 882 883 static void ss_attr_release(struct config_item *item) 884 { 885 struct f_ss_opts *ss_opts = to_f_ss_opts(item); 886 887 usb_put_function_instance(&ss_opts->func_inst); 888 } 889 890 static struct configfs_item_operations ss_item_ops = { 891 .release = ss_attr_release, 892 }; 893 894 static ssize_t f_ss_opts_pattern_show(struct config_item *item, char *page) 895 { 896 struct f_ss_opts *opts = to_f_ss_opts(item); 897 int result; 898 899 mutex_lock(&opts->lock); 900 result = sprintf(page, "%u\n", opts->pattern); 901 mutex_unlock(&opts->lock); 902 903 return result; 904 } 905 906 static ssize_t f_ss_opts_pattern_store(struct config_item *item, 907 const char *page, size_t len) 908 { 909 struct f_ss_opts *opts = to_f_ss_opts(item); 910 int ret; 911 u8 num; 912 913 mutex_lock(&opts->lock); 914 if (opts->refcnt) { 915 ret = -EBUSY; 916 goto end; 917 } 918 919 ret = kstrtou8(page, 0, &num); 920 if (ret) 921 goto end; 922 923 if (num != 0 && num != 1 && num != 2) { 924 ret = -EINVAL; 925 goto end; 926 } 927 928 opts->pattern = num; 929 ret = len; 930 end: 931 mutex_unlock(&opts->lock); 932 return ret; 933 } 934 935 CONFIGFS_ATTR(f_ss_opts_, pattern); 936 937 static ssize_t f_ss_opts_isoc_interval_show(struct config_item *item, char *page) 938 { 939 struct f_ss_opts *opts = to_f_ss_opts(item); 940 int result; 941 942 mutex_lock(&opts->lock); 943 result = sprintf(page, "%u\n", opts->isoc_interval); 944 mutex_unlock(&opts->lock); 945 946 return result; 947 } 948 949 static ssize_t f_ss_opts_isoc_interval_store(struct config_item *item, 950 const char *page, size_t len) 951 { 952 struct f_ss_opts *opts = to_f_ss_opts(item); 953 int ret; 954 u8 num; 955 956 mutex_lock(&opts->lock); 957 if (opts->refcnt) { 958 ret = -EBUSY; 959 goto end; 960 } 961 962 ret = kstrtou8(page, 0, &num); 963 if (ret) 964 goto end; 965 966 if (num > 16) { 967 ret = -EINVAL; 968 goto end; 969 } 970 971 opts->isoc_interval = num; 972 ret = len; 973 end: 974 mutex_unlock(&opts->lock); 975 return ret; 976 } 977 978 CONFIGFS_ATTR(f_ss_opts_, isoc_interval); 979 980 static ssize_t f_ss_opts_isoc_maxpacket_show(struct config_item *item, char *page) 981 { 982 struct f_ss_opts *opts = to_f_ss_opts(item); 983 int result; 984 985 mutex_lock(&opts->lock); 986 result = sprintf(page, "%u\n", opts->isoc_maxpacket); 987 mutex_unlock(&opts->lock); 988 989 return result; 990 } 991 992 static ssize_t f_ss_opts_isoc_maxpacket_store(struct config_item *item, 993 const char *page, size_t len) 994 { 995 struct f_ss_opts *opts = to_f_ss_opts(item); 996 int ret; 997 u16 num; 998 999 mutex_lock(&opts->lock); 1000 if (opts->refcnt) { 1001 ret = -EBUSY; 1002 goto end; 1003 } 1004 1005 ret = kstrtou16(page, 0, &num); 1006 if (ret) 1007 goto end; 1008 1009 if (num > 1024) { 1010 ret = -EINVAL; 1011 goto end; 1012 } 1013 1014 opts->isoc_maxpacket = num; 1015 ret = len; 1016 end: 1017 mutex_unlock(&opts->lock); 1018 return ret; 1019 } 1020 1021 CONFIGFS_ATTR(f_ss_opts_, isoc_maxpacket); 1022 1023 static ssize_t f_ss_opts_isoc_mult_show(struct config_item *item, char *page) 1024 { 1025 struct f_ss_opts *opts = to_f_ss_opts(item); 1026 int result; 1027 1028 mutex_lock(&opts->lock); 1029 result = sprintf(page, "%u\n", opts->isoc_mult); 1030 mutex_unlock(&opts->lock); 1031 1032 return result; 1033 } 1034 1035 static ssize_t f_ss_opts_isoc_mult_store(struct config_item *item, 1036 const char *page, size_t len) 1037 { 1038 struct f_ss_opts *opts = to_f_ss_opts(item); 1039 int ret; 1040 u8 num; 1041 1042 mutex_lock(&opts->lock); 1043 if (opts->refcnt) { 1044 ret = -EBUSY; 1045 goto end; 1046 } 1047 1048 ret = kstrtou8(page, 0, &num); 1049 if (ret) 1050 goto end; 1051 1052 if (num > 2) { 1053 ret = -EINVAL; 1054 goto end; 1055 } 1056 1057 opts->isoc_mult = num; 1058 ret = len; 1059 end: 1060 mutex_unlock(&opts->lock); 1061 return ret; 1062 } 1063 1064 CONFIGFS_ATTR(f_ss_opts_, isoc_mult); 1065 1066 static ssize_t f_ss_opts_isoc_maxburst_show(struct config_item *item, char *page) 1067 { 1068 struct f_ss_opts *opts = to_f_ss_opts(item); 1069 int result; 1070 1071 mutex_lock(&opts->lock); 1072 result = sprintf(page, "%u\n", opts->isoc_maxburst); 1073 mutex_unlock(&opts->lock); 1074 1075 return result; 1076 } 1077 1078 static ssize_t f_ss_opts_isoc_maxburst_store(struct config_item *item, 1079 const char *page, size_t len) 1080 { 1081 struct f_ss_opts *opts = to_f_ss_opts(item); 1082 int ret; 1083 u8 num; 1084 1085 mutex_lock(&opts->lock); 1086 if (opts->refcnt) { 1087 ret = -EBUSY; 1088 goto end; 1089 } 1090 1091 ret = kstrtou8(page, 0, &num); 1092 if (ret) 1093 goto end; 1094 1095 if (num > 15) { 1096 ret = -EINVAL; 1097 goto end; 1098 } 1099 1100 opts->isoc_maxburst = num; 1101 ret = len; 1102 end: 1103 mutex_unlock(&opts->lock); 1104 return ret; 1105 } 1106 1107 CONFIGFS_ATTR(f_ss_opts_, isoc_maxburst); 1108 1109 static ssize_t f_ss_opts_bulk_buflen_show(struct config_item *item, char *page) 1110 { 1111 struct f_ss_opts *opts = to_f_ss_opts(item); 1112 int result; 1113 1114 mutex_lock(&opts->lock); 1115 result = sprintf(page, "%u\n", opts->bulk_buflen); 1116 mutex_unlock(&opts->lock); 1117 1118 return result; 1119 } 1120 1121 static ssize_t f_ss_opts_bulk_buflen_store(struct config_item *item, 1122 const char *page, size_t len) 1123 { 1124 struct f_ss_opts *opts = to_f_ss_opts(item); 1125 int ret; 1126 u32 num; 1127 1128 mutex_lock(&opts->lock); 1129 if (opts->refcnt) { 1130 ret = -EBUSY; 1131 goto end; 1132 } 1133 1134 ret = kstrtou32(page, 0, &num); 1135 if (ret) 1136 goto end; 1137 1138 opts->bulk_buflen = num; 1139 ret = len; 1140 end: 1141 mutex_unlock(&opts->lock); 1142 return ret; 1143 } 1144 1145 CONFIGFS_ATTR(f_ss_opts_, bulk_buflen); 1146 1147 static ssize_t f_ss_opts_bulk_qlen_show(struct config_item *item, char *page) 1148 { 1149 struct f_ss_opts *opts = to_f_ss_opts(item); 1150 int result; 1151 1152 mutex_lock(&opts->lock); 1153 result = sprintf(page, "%u\n", opts->bulk_qlen); 1154 mutex_unlock(&opts->lock); 1155 1156 return result; 1157 } 1158 1159 static ssize_t f_ss_opts_bulk_qlen_store(struct config_item *item, 1160 const char *page, size_t len) 1161 { 1162 struct f_ss_opts *opts = to_f_ss_opts(item); 1163 int ret; 1164 u32 num; 1165 1166 mutex_lock(&opts->lock); 1167 if (opts->refcnt) { 1168 ret = -EBUSY; 1169 goto end; 1170 } 1171 1172 ret = kstrtou32(page, 0, &num); 1173 if (ret) 1174 goto end; 1175 1176 opts->bulk_qlen = num; 1177 ret = len; 1178 end: 1179 mutex_unlock(&opts->lock); 1180 return ret; 1181 } 1182 1183 CONFIGFS_ATTR(f_ss_opts_, bulk_qlen); 1184 1185 static ssize_t f_ss_opts_iso_qlen_show(struct config_item *item, char *page) 1186 { 1187 struct f_ss_opts *opts = to_f_ss_opts(item); 1188 int result; 1189 1190 mutex_lock(&opts->lock); 1191 result = sprintf(page, "%u\n", opts->iso_qlen); 1192 mutex_unlock(&opts->lock); 1193 1194 return result; 1195 } 1196 1197 static ssize_t f_ss_opts_iso_qlen_store(struct config_item *item, 1198 const char *page, size_t len) 1199 { 1200 struct f_ss_opts *opts = to_f_ss_opts(item); 1201 int ret; 1202 u32 num; 1203 1204 mutex_lock(&opts->lock); 1205 if (opts->refcnt) { 1206 ret = -EBUSY; 1207 goto end; 1208 } 1209 1210 ret = kstrtou32(page, 0, &num); 1211 if (ret) 1212 goto end; 1213 1214 opts->iso_qlen = num; 1215 ret = len; 1216 end: 1217 mutex_unlock(&opts->lock); 1218 return ret; 1219 } 1220 1221 CONFIGFS_ATTR(f_ss_opts_, iso_qlen); 1222 1223 static struct configfs_attribute *ss_attrs[] = { 1224 &f_ss_opts_attr_pattern, 1225 &f_ss_opts_attr_isoc_interval, 1226 &f_ss_opts_attr_isoc_maxpacket, 1227 &f_ss_opts_attr_isoc_mult, 1228 &f_ss_opts_attr_isoc_maxburst, 1229 &f_ss_opts_attr_bulk_buflen, 1230 &f_ss_opts_attr_bulk_qlen, 1231 &f_ss_opts_attr_iso_qlen, 1232 NULL, 1233 }; 1234 1235 static struct config_item_type ss_func_type = { 1236 .ct_item_ops = &ss_item_ops, 1237 .ct_attrs = ss_attrs, 1238 .ct_owner = THIS_MODULE, 1239 }; 1240 1241 static void source_sink_free_instance(struct usb_function_instance *fi) 1242 { 1243 struct f_ss_opts *ss_opts; 1244 1245 ss_opts = container_of(fi, struct f_ss_opts, func_inst); 1246 kfree(ss_opts); 1247 } 1248 1249 static struct usb_function_instance *source_sink_alloc_inst(void) 1250 { 1251 struct f_ss_opts *ss_opts; 1252 1253 ss_opts = kzalloc(sizeof(*ss_opts), GFP_KERNEL); 1254 if (!ss_opts) 1255 return ERR_PTR(-ENOMEM); 1256 mutex_init(&ss_opts->lock); 1257 ss_opts->func_inst.free_func_inst = source_sink_free_instance; 1258 ss_opts->isoc_interval = GZERO_ISOC_INTERVAL; 1259 ss_opts->isoc_maxpacket = GZERO_ISOC_MAXPACKET; 1260 ss_opts->bulk_buflen = GZERO_BULK_BUFLEN; 1261 ss_opts->bulk_qlen = GZERO_SS_BULK_QLEN; 1262 ss_opts->iso_qlen = GZERO_SS_ISO_QLEN; 1263 1264 config_group_init_type_name(&ss_opts->func_inst.group, "", 1265 &ss_func_type); 1266 1267 return &ss_opts->func_inst; 1268 } 1269 DECLARE_USB_FUNCTION(SourceSink, source_sink_alloc_inst, 1270 source_sink_alloc_func); 1271 1272 static int __init sslb_modinit(void) 1273 { 1274 int ret; 1275 1276 ret = usb_function_register(&SourceSinkusb_func); 1277 if (ret) 1278 return ret; 1279 ret = lb_modinit(); 1280 if (ret) 1281 usb_function_unregister(&SourceSinkusb_func); 1282 return ret; 1283 } 1284 static void __exit sslb_modexit(void) 1285 { 1286 usb_function_unregister(&SourceSinkusb_func); 1287 lb_modexit(); 1288 } 1289 module_init(sslb_modinit); 1290 module_exit(sslb_modexit); 1291 1292 MODULE_LICENSE("GPL"); 1293