Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: gadget: tcm: factor out f_tcm

Prepare for converting tcm to new function registration interface.

Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
Acked-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>

authored by

Andrzej Pietrasiewicz and committed by
Nicholas Bellinger
08a1cb0f e2ffb77a

+2148 -2129
+2145
drivers/usb/gadget/function/f_tcm.c
··· 1 + /* Target based USB-Gadget 2 + * 3 + * UAS protocol handling, target callbacks, configfs handling, 4 + * BBB (USB Mass Storage Class Bulk-Only (BBB) and Transport protocol handling. 5 + * 6 + * Author: Sebastian Andrzej Siewior <bigeasy at linutronix dot de> 7 + * License: GPLv2 as published by FSF. 8 + */ 9 + #include <linux/kernel.h> 10 + #include <linux/module.h> 11 + #include <linux/types.h> 12 + #include <linux/string.h> 13 + #include <linux/configfs.h> 14 + #include <linux/ctype.h> 15 + #include <linux/usb/ch9.h> 16 + #include <linux/usb/composite.h> 17 + #include <linux/usb/gadget.h> 18 + #include <linux/usb/storage.h> 19 + #include <scsi/scsi_tcq.h> 20 + #include <target/target_core_base.h> 21 + #include <target/target_core_fabric.h> 22 + #include <asm/unaligned.h> 23 + 24 + #include "tcm.h" 25 + 26 + static inline struct f_uas *to_f_uas(struct usb_function *f) 27 + { 28 + return container_of(f, struct f_uas, function); 29 + } 30 + 31 + static void usbg_cmd_release(struct kref *); 32 + 33 + static inline void usbg_cleanup_cmd(struct usbg_cmd *cmd) 34 + { 35 + kref_put(&cmd->ref, usbg_cmd_release); 36 + } 37 + 38 + /* Start bot.c code */ 39 + 40 + static int bot_enqueue_cmd_cbw(struct f_uas *fu) 41 + { 42 + int ret; 43 + 44 + if (fu->flags & USBG_BOT_CMD_PEND) 45 + return 0; 46 + 47 + ret = usb_ep_queue(fu->ep_out, fu->cmd.req, GFP_ATOMIC); 48 + if (!ret) 49 + fu->flags |= USBG_BOT_CMD_PEND; 50 + return ret; 51 + } 52 + 53 + static void bot_status_complete(struct usb_ep *ep, struct usb_request *req) 54 + { 55 + struct usbg_cmd *cmd = req->context; 56 + struct f_uas *fu = cmd->fu; 57 + 58 + usbg_cleanup_cmd(cmd); 59 + if (req->status < 0) { 60 + pr_err("ERR %s(%d)\n", __func__, __LINE__); 61 + return; 62 + } 63 + 64 + /* CSW completed, wait for next CBW */ 65 + bot_enqueue_cmd_cbw(fu); 66 + } 67 + 68 + static void bot_enqueue_sense_code(struct f_uas *fu, struct usbg_cmd *cmd) 69 + { 70 + struct bulk_cs_wrap *csw = &fu->bot_status.csw; 71 + int ret; 72 + u8 *sense; 73 + unsigned int csw_stat; 74 + 75 + csw_stat = cmd->csw_code; 76 + 77 + /* 78 + * We can't send SENSE as a response. So we take ASC & ASCQ from our 79 + * sense buffer and queue it and hope the host sends a REQUEST_SENSE 80 + * command where it learns why we failed. 81 + */ 82 + sense = cmd->sense_iu.sense; 83 + 84 + csw->Tag = cmd->bot_tag; 85 + csw->Status = csw_stat; 86 + fu->bot_status.req->context = cmd; 87 + ret = usb_ep_queue(fu->ep_in, fu->bot_status.req, GFP_ATOMIC); 88 + if (ret) 89 + pr_err("%s(%d) ERR: %d\n", __func__, __LINE__, ret); 90 + } 91 + 92 + static void bot_err_compl(struct usb_ep *ep, struct usb_request *req) 93 + { 94 + struct usbg_cmd *cmd = req->context; 95 + struct f_uas *fu = cmd->fu; 96 + 97 + if (req->status < 0) 98 + pr_err("ERR %s(%d)\n", __func__, __LINE__); 99 + 100 + if (cmd->data_len) { 101 + if (cmd->data_len > ep->maxpacket) { 102 + req->length = ep->maxpacket; 103 + cmd->data_len -= ep->maxpacket; 104 + } else { 105 + req->length = cmd->data_len; 106 + cmd->data_len = 0; 107 + } 108 + 109 + usb_ep_queue(ep, req, GFP_ATOMIC); 110 + return; 111 + } 112 + bot_enqueue_sense_code(fu, cmd); 113 + } 114 + 115 + static void bot_send_bad_status(struct usbg_cmd *cmd) 116 + { 117 + struct f_uas *fu = cmd->fu; 118 + struct bulk_cs_wrap *csw = &fu->bot_status.csw; 119 + struct usb_request *req; 120 + struct usb_ep *ep; 121 + 122 + csw->Residue = cpu_to_le32(cmd->data_len); 123 + 124 + if (cmd->data_len) { 125 + if (cmd->is_read) { 126 + ep = fu->ep_in; 127 + req = fu->bot_req_in; 128 + } else { 129 + ep = fu->ep_out; 130 + req = fu->bot_req_out; 131 + } 132 + 133 + if (cmd->data_len > fu->ep_in->maxpacket) { 134 + req->length = ep->maxpacket; 135 + cmd->data_len -= ep->maxpacket; 136 + } else { 137 + req->length = cmd->data_len; 138 + cmd->data_len = 0; 139 + } 140 + req->complete = bot_err_compl; 141 + req->context = cmd; 142 + req->buf = fu->cmd.buf; 143 + usb_ep_queue(ep, req, GFP_KERNEL); 144 + } else { 145 + bot_enqueue_sense_code(fu, cmd); 146 + } 147 + } 148 + 149 + static int bot_send_status(struct usbg_cmd *cmd, bool moved_data) 150 + { 151 + struct f_uas *fu = cmd->fu; 152 + struct bulk_cs_wrap *csw = &fu->bot_status.csw; 153 + int ret; 154 + 155 + if (cmd->se_cmd.scsi_status == SAM_STAT_GOOD) { 156 + if (!moved_data && cmd->data_len) { 157 + /* 158 + * the host wants to move data, we don't. Fill / empty 159 + * the pipe and then send the csw with reside set. 160 + */ 161 + cmd->csw_code = US_BULK_STAT_OK; 162 + bot_send_bad_status(cmd); 163 + return 0; 164 + } 165 + 166 + csw->Tag = cmd->bot_tag; 167 + csw->Residue = cpu_to_le32(0); 168 + csw->Status = US_BULK_STAT_OK; 169 + fu->bot_status.req->context = cmd; 170 + 171 + ret = usb_ep_queue(fu->ep_in, fu->bot_status.req, GFP_KERNEL); 172 + if (ret) 173 + pr_err("%s(%d) ERR: %d\n", __func__, __LINE__, ret); 174 + } else { 175 + cmd->csw_code = US_BULK_STAT_FAIL; 176 + bot_send_bad_status(cmd); 177 + } 178 + return 0; 179 + } 180 + 181 + /* 182 + * Called after command (no data transfer) or after the write (to device) 183 + * operation is completed 184 + */ 185 + static int bot_send_status_response(struct usbg_cmd *cmd) 186 + { 187 + bool moved_data = false; 188 + 189 + if (!cmd->is_read) 190 + moved_data = true; 191 + return bot_send_status(cmd, moved_data); 192 + } 193 + 194 + /* Read request completed, now we have to send the CSW */ 195 + static void bot_read_compl(struct usb_ep *ep, struct usb_request *req) 196 + { 197 + struct usbg_cmd *cmd = req->context; 198 + 199 + if (req->status < 0) 200 + pr_err("ERR %s(%d)\n", __func__, __LINE__); 201 + 202 + bot_send_status(cmd, true); 203 + } 204 + 205 + static int bot_send_read_response(struct usbg_cmd *cmd) 206 + { 207 + struct f_uas *fu = cmd->fu; 208 + struct se_cmd *se_cmd = &cmd->se_cmd; 209 + struct usb_gadget *gadget = fuas_to_gadget(fu); 210 + int ret; 211 + 212 + if (!cmd->data_len) { 213 + cmd->csw_code = US_BULK_STAT_PHASE; 214 + bot_send_bad_status(cmd); 215 + return 0; 216 + } 217 + 218 + if (!gadget->sg_supported) { 219 + cmd->data_buf = kmalloc(se_cmd->data_length, GFP_ATOMIC); 220 + if (!cmd->data_buf) 221 + return -ENOMEM; 222 + 223 + sg_copy_to_buffer(se_cmd->t_data_sg, 224 + se_cmd->t_data_nents, 225 + cmd->data_buf, 226 + se_cmd->data_length); 227 + 228 + fu->bot_req_in->buf = cmd->data_buf; 229 + } else { 230 + fu->bot_req_in->buf = NULL; 231 + fu->bot_req_in->num_sgs = se_cmd->t_data_nents; 232 + fu->bot_req_in->sg = se_cmd->t_data_sg; 233 + } 234 + 235 + fu->bot_req_in->complete = bot_read_compl; 236 + fu->bot_req_in->length = se_cmd->data_length; 237 + fu->bot_req_in->context = cmd; 238 + ret = usb_ep_queue(fu->ep_in, fu->bot_req_in, GFP_ATOMIC); 239 + if (ret) 240 + pr_err("%s(%d)\n", __func__, __LINE__); 241 + return 0; 242 + } 243 + 244 + static void usbg_data_write_cmpl(struct usb_ep *, struct usb_request *); 245 + static int usbg_prepare_w_request(struct usbg_cmd *, struct usb_request *); 246 + 247 + static int bot_send_write_request(struct usbg_cmd *cmd) 248 + { 249 + struct f_uas *fu = cmd->fu; 250 + struct se_cmd *se_cmd = &cmd->se_cmd; 251 + struct usb_gadget *gadget = fuas_to_gadget(fu); 252 + int ret; 253 + 254 + init_completion(&cmd->write_complete); 255 + cmd->fu = fu; 256 + 257 + if (!cmd->data_len) { 258 + cmd->csw_code = US_BULK_STAT_PHASE; 259 + return -EINVAL; 260 + } 261 + 262 + if (!gadget->sg_supported) { 263 + cmd->data_buf = kmalloc(se_cmd->data_length, GFP_KERNEL); 264 + if (!cmd->data_buf) 265 + return -ENOMEM; 266 + 267 + fu->bot_req_out->buf = cmd->data_buf; 268 + } else { 269 + fu->bot_req_out->buf = NULL; 270 + fu->bot_req_out->num_sgs = se_cmd->t_data_nents; 271 + fu->bot_req_out->sg = se_cmd->t_data_sg; 272 + } 273 + 274 + fu->bot_req_out->complete = usbg_data_write_cmpl; 275 + fu->bot_req_out->length = se_cmd->data_length; 276 + fu->bot_req_out->context = cmd; 277 + 278 + ret = usbg_prepare_w_request(cmd, fu->bot_req_out); 279 + if (ret) 280 + goto cleanup; 281 + ret = usb_ep_queue(fu->ep_out, fu->bot_req_out, GFP_KERNEL); 282 + if (ret) 283 + pr_err("%s(%d)\n", __func__, __LINE__); 284 + 285 + wait_for_completion(&cmd->write_complete); 286 + target_execute_cmd(se_cmd); 287 + cleanup: 288 + return ret; 289 + } 290 + 291 + static int bot_submit_command(struct f_uas *, void *, unsigned int); 292 + 293 + static void bot_cmd_complete(struct usb_ep *ep, struct usb_request *req) 294 + { 295 + struct f_uas *fu = req->context; 296 + int ret; 297 + 298 + fu->flags &= ~USBG_BOT_CMD_PEND; 299 + 300 + if (req->status < 0) 301 + return; 302 + 303 + ret = bot_submit_command(fu, req->buf, req->actual); 304 + if (ret) 305 + pr_err("%s(%d): %d\n", __func__, __LINE__, ret); 306 + } 307 + 308 + static int bot_prepare_reqs(struct f_uas *fu) 309 + { 310 + int ret; 311 + 312 + fu->bot_req_in = usb_ep_alloc_request(fu->ep_in, GFP_KERNEL); 313 + if (!fu->bot_req_in) 314 + goto err; 315 + 316 + fu->bot_req_out = usb_ep_alloc_request(fu->ep_out, GFP_KERNEL); 317 + if (!fu->bot_req_out) 318 + goto err_out; 319 + 320 + fu->cmd.req = usb_ep_alloc_request(fu->ep_out, GFP_KERNEL); 321 + if (!fu->cmd.req) 322 + goto err_cmd; 323 + 324 + fu->bot_status.req = usb_ep_alloc_request(fu->ep_in, GFP_KERNEL); 325 + if (!fu->bot_status.req) 326 + goto err_sts; 327 + 328 + fu->bot_status.req->buf = &fu->bot_status.csw; 329 + fu->bot_status.req->length = US_BULK_CS_WRAP_LEN; 330 + fu->bot_status.req->complete = bot_status_complete; 331 + fu->bot_status.csw.Signature = cpu_to_le32(US_BULK_CS_SIGN); 332 + 333 + fu->cmd.buf = kmalloc(fu->ep_out->maxpacket, GFP_KERNEL); 334 + if (!fu->cmd.buf) 335 + goto err_buf; 336 + 337 + fu->cmd.req->complete = bot_cmd_complete; 338 + fu->cmd.req->buf = fu->cmd.buf; 339 + fu->cmd.req->length = fu->ep_out->maxpacket; 340 + fu->cmd.req->context = fu; 341 + 342 + ret = bot_enqueue_cmd_cbw(fu); 343 + if (ret) 344 + goto err_queue; 345 + return 0; 346 + err_queue: 347 + kfree(fu->cmd.buf); 348 + fu->cmd.buf = NULL; 349 + err_buf: 350 + usb_ep_free_request(fu->ep_in, fu->bot_status.req); 351 + err_sts: 352 + usb_ep_free_request(fu->ep_out, fu->cmd.req); 353 + fu->cmd.req = NULL; 354 + err_cmd: 355 + usb_ep_free_request(fu->ep_out, fu->bot_req_out); 356 + fu->bot_req_out = NULL; 357 + err_out: 358 + usb_ep_free_request(fu->ep_in, fu->bot_req_in); 359 + fu->bot_req_in = NULL; 360 + err: 361 + pr_err("BOT: endpoint setup failed\n"); 362 + return -ENOMEM; 363 + } 364 + 365 + static void bot_cleanup_old_alt(struct f_uas *fu) 366 + { 367 + if (!(fu->flags & USBG_ENABLED)) 368 + return; 369 + 370 + usb_ep_disable(fu->ep_in); 371 + usb_ep_disable(fu->ep_out); 372 + 373 + if (!fu->bot_req_in) 374 + return; 375 + 376 + usb_ep_free_request(fu->ep_in, fu->bot_req_in); 377 + usb_ep_free_request(fu->ep_out, fu->bot_req_out); 378 + usb_ep_free_request(fu->ep_out, fu->cmd.req); 379 + usb_ep_free_request(fu->ep_out, fu->bot_status.req); 380 + 381 + kfree(fu->cmd.buf); 382 + 383 + fu->bot_req_in = NULL; 384 + fu->bot_req_out = NULL; 385 + fu->cmd.req = NULL; 386 + fu->bot_status.req = NULL; 387 + fu->cmd.buf = NULL; 388 + } 389 + 390 + static void bot_set_alt(struct f_uas *fu) 391 + { 392 + struct usb_function *f = &fu->function; 393 + struct usb_gadget *gadget = f->config->cdev->gadget; 394 + int ret; 395 + 396 + fu->flags = USBG_IS_BOT; 397 + 398 + config_ep_by_speed(gadget, f, fu->ep_in); 399 + ret = usb_ep_enable(fu->ep_in); 400 + if (ret) 401 + goto err_b_in; 402 + 403 + config_ep_by_speed(gadget, f, fu->ep_out); 404 + ret = usb_ep_enable(fu->ep_out); 405 + if (ret) 406 + goto err_b_out; 407 + 408 + ret = bot_prepare_reqs(fu); 409 + if (ret) 410 + goto err_wq; 411 + fu->flags |= USBG_ENABLED; 412 + pr_info("Using the BOT protocol\n"); 413 + return; 414 + err_wq: 415 + usb_ep_disable(fu->ep_out); 416 + err_b_out: 417 + usb_ep_disable(fu->ep_in); 418 + err_b_in: 419 + fu->flags = USBG_IS_BOT; 420 + } 421 + 422 + static int usbg_bot_setup(struct usb_function *f, 423 + const struct usb_ctrlrequest *ctrl) 424 + { 425 + struct f_uas *fu = to_f_uas(f); 426 + struct usb_composite_dev *cdev = f->config->cdev; 427 + u16 w_value = le16_to_cpu(ctrl->wValue); 428 + u16 w_length = le16_to_cpu(ctrl->wLength); 429 + int luns; 430 + u8 *ret_lun; 431 + 432 + switch (ctrl->bRequest) { 433 + case US_BULK_GET_MAX_LUN: 434 + if (ctrl->bRequestType != (USB_DIR_IN | USB_TYPE_CLASS | 435 + USB_RECIP_INTERFACE)) 436 + return -ENOTSUPP; 437 + 438 + if (w_length < 1) 439 + return -EINVAL; 440 + if (w_value != 0) 441 + return -EINVAL; 442 + luns = atomic_read(&fu->tpg->tpg_port_count); 443 + if (!luns) { 444 + pr_err("No LUNs configured?\n"); 445 + return -EINVAL; 446 + } 447 + /* 448 + * If 4 LUNs are present we return 3 i.e. LUN 0..3 can be 449 + * accessed. The upper limit is 0xf 450 + */ 451 + luns--; 452 + if (luns > 0xf) { 453 + pr_info_once("Limiting the number of luns to 16\n"); 454 + luns = 0xf; 455 + } 456 + ret_lun = cdev->req->buf; 457 + *ret_lun = luns; 458 + cdev->req->length = 1; 459 + return usb_ep_queue(cdev->gadget->ep0, cdev->req, GFP_ATOMIC); 460 + 461 + case US_BULK_RESET_REQUEST: 462 + /* XXX maybe we should remove previous requests for IN + OUT */ 463 + bot_enqueue_cmd_cbw(fu); 464 + return 0; 465 + } 466 + return -ENOTSUPP; 467 + } 468 + 469 + /* Start uas.c code */ 470 + 471 + static void uasp_cleanup_one_stream(struct f_uas *fu, struct uas_stream *stream) 472 + { 473 + /* We have either all three allocated or none */ 474 + if (!stream->req_in) 475 + return; 476 + 477 + usb_ep_free_request(fu->ep_in, stream->req_in); 478 + usb_ep_free_request(fu->ep_out, stream->req_out); 479 + usb_ep_free_request(fu->ep_status, stream->req_status); 480 + 481 + stream->req_in = NULL; 482 + stream->req_out = NULL; 483 + stream->req_status = NULL; 484 + } 485 + 486 + static void uasp_free_cmdreq(struct f_uas *fu) 487 + { 488 + usb_ep_free_request(fu->ep_cmd, fu->cmd.req); 489 + kfree(fu->cmd.buf); 490 + fu->cmd.req = NULL; 491 + fu->cmd.buf = NULL; 492 + } 493 + 494 + static void uasp_cleanup_old_alt(struct f_uas *fu) 495 + { 496 + int i; 497 + 498 + if (!(fu->flags & USBG_ENABLED)) 499 + return; 500 + 501 + usb_ep_disable(fu->ep_in); 502 + usb_ep_disable(fu->ep_out); 503 + usb_ep_disable(fu->ep_status); 504 + usb_ep_disable(fu->ep_cmd); 505 + 506 + for (i = 0; i < UASP_SS_EP_COMP_NUM_STREAMS; i++) 507 + uasp_cleanup_one_stream(fu, &fu->stream[i]); 508 + uasp_free_cmdreq(fu); 509 + } 510 + 511 + static void uasp_status_data_cmpl(struct usb_ep *ep, struct usb_request *req); 512 + 513 + static int uasp_prepare_r_request(struct usbg_cmd *cmd) 514 + { 515 + struct se_cmd *se_cmd = &cmd->se_cmd; 516 + struct f_uas *fu = cmd->fu; 517 + struct usb_gadget *gadget = fuas_to_gadget(fu); 518 + struct uas_stream *stream = cmd->stream; 519 + 520 + if (!gadget->sg_supported) { 521 + cmd->data_buf = kmalloc(se_cmd->data_length, GFP_ATOMIC); 522 + if (!cmd->data_buf) 523 + return -ENOMEM; 524 + 525 + sg_copy_to_buffer(se_cmd->t_data_sg, 526 + se_cmd->t_data_nents, 527 + cmd->data_buf, 528 + se_cmd->data_length); 529 + 530 + stream->req_in->buf = cmd->data_buf; 531 + } else { 532 + stream->req_in->buf = NULL; 533 + stream->req_in->num_sgs = se_cmd->t_data_nents; 534 + stream->req_in->sg = se_cmd->t_data_sg; 535 + } 536 + 537 + stream->req_in->complete = uasp_status_data_cmpl; 538 + stream->req_in->length = se_cmd->data_length; 539 + stream->req_in->context = cmd; 540 + 541 + cmd->state = UASP_SEND_STATUS; 542 + return 0; 543 + } 544 + 545 + static void uasp_prepare_status(struct usbg_cmd *cmd) 546 + { 547 + struct se_cmd *se_cmd = &cmd->se_cmd; 548 + struct sense_iu *iu = &cmd->sense_iu; 549 + struct uas_stream *stream = cmd->stream; 550 + 551 + cmd->state = UASP_QUEUE_COMMAND; 552 + iu->iu_id = IU_ID_STATUS; 553 + iu->tag = cpu_to_be16(cmd->tag); 554 + 555 + /* 556 + * iu->status_qual = cpu_to_be16(STATUS QUALIFIER SAM-4. Where R U?); 557 + */ 558 + iu->len = cpu_to_be16(se_cmd->scsi_sense_length); 559 + iu->status = se_cmd->scsi_status; 560 + stream->req_status->context = cmd; 561 + stream->req_status->length = se_cmd->scsi_sense_length + 16; 562 + stream->req_status->buf = iu; 563 + stream->req_status->complete = uasp_status_data_cmpl; 564 + } 565 + 566 + static void uasp_status_data_cmpl(struct usb_ep *ep, struct usb_request *req) 567 + { 568 + struct usbg_cmd *cmd = req->context; 569 + struct uas_stream *stream = cmd->stream; 570 + struct f_uas *fu = cmd->fu; 571 + int ret; 572 + 573 + if (req->status < 0) 574 + goto cleanup; 575 + 576 + switch (cmd->state) { 577 + case UASP_SEND_DATA: 578 + ret = uasp_prepare_r_request(cmd); 579 + if (ret) 580 + goto cleanup; 581 + ret = usb_ep_queue(fu->ep_in, stream->req_in, GFP_ATOMIC); 582 + if (ret) 583 + pr_err("%s(%d) => %d\n", __func__, __LINE__, ret); 584 + break; 585 + 586 + case UASP_RECEIVE_DATA: 587 + ret = usbg_prepare_w_request(cmd, stream->req_out); 588 + if (ret) 589 + goto cleanup; 590 + ret = usb_ep_queue(fu->ep_out, stream->req_out, GFP_ATOMIC); 591 + if (ret) 592 + pr_err("%s(%d) => %d\n", __func__, __LINE__, ret); 593 + break; 594 + 595 + case UASP_SEND_STATUS: 596 + uasp_prepare_status(cmd); 597 + ret = usb_ep_queue(fu->ep_status, stream->req_status, 598 + GFP_ATOMIC); 599 + if (ret) 600 + pr_err("%s(%d) => %d\n", __func__, __LINE__, ret); 601 + break; 602 + 603 + case UASP_QUEUE_COMMAND: 604 + usbg_cleanup_cmd(cmd); 605 + usb_ep_queue(fu->ep_cmd, fu->cmd.req, GFP_ATOMIC); 606 + break; 607 + 608 + default: 609 + BUG(); 610 + } 611 + return; 612 + 613 + cleanup: 614 + usbg_cleanup_cmd(cmd); 615 + } 616 + 617 + static int uasp_send_status_response(struct usbg_cmd *cmd) 618 + { 619 + struct f_uas *fu = cmd->fu; 620 + struct uas_stream *stream = cmd->stream; 621 + struct sense_iu *iu = &cmd->sense_iu; 622 + 623 + iu->tag = cpu_to_be16(cmd->tag); 624 + stream->req_status->complete = uasp_status_data_cmpl; 625 + stream->req_status->context = cmd; 626 + cmd->fu = fu; 627 + uasp_prepare_status(cmd); 628 + return usb_ep_queue(fu->ep_status, stream->req_status, GFP_ATOMIC); 629 + } 630 + 631 + static int uasp_send_read_response(struct usbg_cmd *cmd) 632 + { 633 + struct f_uas *fu = cmd->fu; 634 + struct uas_stream *stream = cmd->stream; 635 + struct sense_iu *iu = &cmd->sense_iu; 636 + int ret; 637 + 638 + cmd->fu = fu; 639 + 640 + iu->tag = cpu_to_be16(cmd->tag); 641 + if (fu->flags & USBG_USE_STREAMS) { 642 + 643 + ret = uasp_prepare_r_request(cmd); 644 + if (ret) 645 + goto out; 646 + ret = usb_ep_queue(fu->ep_in, stream->req_in, GFP_ATOMIC); 647 + if (ret) { 648 + pr_err("%s(%d) => %d\n", __func__, __LINE__, ret); 649 + kfree(cmd->data_buf); 650 + cmd->data_buf = NULL; 651 + } 652 + 653 + } else { 654 + 655 + iu->iu_id = IU_ID_READ_READY; 656 + iu->tag = cpu_to_be16(cmd->tag); 657 + 658 + stream->req_status->complete = uasp_status_data_cmpl; 659 + stream->req_status->context = cmd; 660 + 661 + cmd->state = UASP_SEND_DATA; 662 + stream->req_status->buf = iu; 663 + stream->req_status->length = sizeof(struct iu); 664 + 665 + ret = usb_ep_queue(fu->ep_status, stream->req_status, 666 + GFP_ATOMIC); 667 + if (ret) 668 + pr_err("%s(%d) => %d\n", __func__, __LINE__, ret); 669 + } 670 + out: 671 + return ret; 672 + } 673 + 674 + static int uasp_send_write_request(struct usbg_cmd *cmd) 675 + { 676 + struct f_uas *fu = cmd->fu; 677 + struct se_cmd *se_cmd = &cmd->se_cmd; 678 + struct uas_stream *stream = cmd->stream; 679 + struct sense_iu *iu = &cmd->sense_iu; 680 + int ret; 681 + 682 + init_completion(&cmd->write_complete); 683 + cmd->fu = fu; 684 + 685 + iu->tag = cpu_to_be16(cmd->tag); 686 + 687 + if (fu->flags & USBG_USE_STREAMS) { 688 + 689 + ret = usbg_prepare_w_request(cmd, stream->req_out); 690 + if (ret) 691 + goto cleanup; 692 + ret = usb_ep_queue(fu->ep_out, stream->req_out, GFP_ATOMIC); 693 + if (ret) 694 + pr_err("%s(%d)\n", __func__, __LINE__); 695 + 696 + } else { 697 + 698 + iu->iu_id = IU_ID_WRITE_READY; 699 + iu->tag = cpu_to_be16(cmd->tag); 700 + 701 + stream->req_status->complete = uasp_status_data_cmpl; 702 + stream->req_status->context = cmd; 703 + 704 + cmd->state = UASP_RECEIVE_DATA; 705 + stream->req_status->buf = iu; 706 + stream->req_status->length = sizeof(struct iu); 707 + 708 + ret = usb_ep_queue(fu->ep_status, stream->req_status, 709 + GFP_ATOMIC); 710 + if (ret) 711 + pr_err("%s(%d)\n", __func__, __LINE__); 712 + } 713 + 714 + wait_for_completion(&cmd->write_complete); 715 + target_execute_cmd(se_cmd); 716 + cleanup: 717 + return ret; 718 + } 719 + 720 + static int usbg_submit_command(struct f_uas *, void *, unsigned int); 721 + 722 + static void uasp_cmd_complete(struct usb_ep *ep, struct usb_request *req) 723 + { 724 + struct f_uas *fu = req->context; 725 + int ret; 726 + 727 + if (req->status < 0) 728 + return; 729 + 730 + ret = usbg_submit_command(fu, req->buf, req->actual); 731 + /* 732 + * Once we tune for performance enqueue the command req here again so 733 + * we can receive a second command while we processing this one. Pay 734 + * attention to properly sync STAUS endpoint with DATA IN + OUT so you 735 + * don't break HS. 736 + */ 737 + if (!ret) 738 + return; 739 + usb_ep_queue(fu->ep_cmd, fu->cmd.req, GFP_ATOMIC); 740 + } 741 + 742 + static int uasp_alloc_stream_res(struct f_uas *fu, struct uas_stream *stream) 743 + { 744 + stream->req_in = usb_ep_alloc_request(fu->ep_in, GFP_KERNEL); 745 + if (!stream->req_in) 746 + goto out; 747 + 748 + stream->req_out = usb_ep_alloc_request(fu->ep_out, GFP_KERNEL); 749 + if (!stream->req_out) 750 + goto err_out; 751 + 752 + stream->req_status = usb_ep_alloc_request(fu->ep_status, GFP_KERNEL); 753 + if (!stream->req_status) 754 + goto err_sts; 755 + 756 + return 0; 757 + err_sts: 758 + usb_ep_free_request(fu->ep_status, stream->req_status); 759 + stream->req_status = NULL; 760 + err_out: 761 + usb_ep_free_request(fu->ep_out, stream->req_out); 762 + stream->req_out = NULL; 763 + out: 764 + return -ENOMEM; 765 + } 766 + 767 + static int uasp_alloc_cmd(struct f_uas *fu) 768 + { 769 + fu->cmd.req = usb_ep_alloc_request(fu->ep_cmd, GFP_KERNEL); 770 + if (!fu->cmd.req) 771 + goto err; 772 + 773 + fu->cmd.buf = kmalloc(fu->ep_cmd->maxpacket, GFP_KERNEL); 774 + if (!fu->cmd.buf) 775 + goto err_buf; 776 + 777 + fu->cmd.req->complete = uasp_cmd_complete; 778 + fu->cmd.req->buf = fu->cmd.buf; 779 + fu->cmd.req->length = fu->ep_cmd->maxpacket; 780 + fu->cmd.req->context = fu; 781 + return 0; 782 + 783 + err_buf: 784 + usb_ep_free_request(fu->ep_cmd, fu->cmd.req); 785 + err: 786 + return -ENOMEM; 787 + } 788 + 789 + static void uasp_setup_stream_res(struct f_uas *fu, int max_streams) 790 + { 791 + int i; 792 + 793 + for (i = 0; i < max_streams; i++) { 794 + struct uas_stream *s = &fu->stream[i]; 795 + 796 + s->req_in->stream_id = i + 1; 797 + s->req_out->stream_id = i + 1; 798 + s->req_status->stream_id = i + 1; 799 + } 800 + } 801 + 802 + static int uasp_prepare_reqs(struct f_uas *fu) 803 + { 804 + int ret; 805 + int i; 806 + int max_streams; 807 + 808 + if (fu->flags & USBG_USE_STREAMS) 809 + max_streams = UASP_SS_EP_COMP_NUM_STREAMS; 810 + else 811 + max_streams = 1; 812 + 813 + for (i = 0; i < max_streams; i++) { 814 + ret = uasp_alloc_stream_res(fu, &fu->stream[i]); 815 + if (ret) 816 + goto err_cleanup; 817 + } 818 + 819 + ret = uasp_alloc_cmd(fu); 820 + if (ret) 821 + goto err_free_stream; 822 + uasp_setup_stream_res(fu, max_streams); 823 + 824 + ret = usb_ep_queue(fu->ep_cmd, fu->cmd.req, GFP_ATOMIC); 825 + if (ret) 826 + goto err_free_stream; 827 + 828 + return 0; 829 + 830 + err_free_stream: 831 + uasp_free_cmdreq(fu); 832 + 833 + err_cleanup: 834 + if (i) { 835 + do { 836 + uasp_cleanup_one_stream(fu, &fu->stream[i - 1]); 837 + i--; 838 + } while (i); 839 + } 840 + pr_err("UASP: endpoint setup failed\n"); 841 + return ret; 842 + } 843 + 844 + static void uasp_set_alt(struct f_uas *fu) 845 + { 846 + struct usb_function *f = &fu->function; 847 + struct usb_gadget *gadget = f->config->cdev->gadget; 848 + int ret; 849 + 850 + fu->flags = USBG_IS_UAS; 851 + 852 + if (gadget->speed == USB_SPEED_SUPER) 853 + fu->flags |= USBG_USE_STREAMS; 854 + 855 + config_ep_by_speed(gadget, f, fu->ep_in); 856 + ret = usb_ep_enable(fu->ep_in); 857 + if (ret) 858 + goto err_b_in; 859 + 860 + config_ep_by_speed(gadget, f, fu->ep_out); 861 + ret = usb_ep_enable(fu->ep_out); 862 + if (ret) 863 + goto err_b_out; 864 + 865 + config_ep_by_speed(gadget, f, fu->ep_cmd); 866 + ret = usb_ep_enable(fu->ep_cmd); 867 + if (ret) 868 + goto err_cmd; 869 + config_ep_by_speed(gadget, f, fu->ep_status); 870 + ret = usb_ep_enable(fu->ep_status); 871 + if (ret) 872 + goto err_status; 873 + 874 + ret = uasp_prepare_reqs(fu); 875 + if (ret) 876 + goto err_wq; 877 + fu->flags |= USBG_ENABLED; 878 + 879 + pr_info("Using the UAS protocol\n"); 880 + return; 881 + err_wq: 882 + usb_ep_disable(fu->ep_status); 883 + err_status: 884 + usb_ep_disable(fu->ep_cmd); 885 + err_cmd: 886 + usb_ep_disable(fu->ep_out); 887 + err_b_out: 888 + usb_ep_disable(fu->ep_in); 889 + err_b_in: 890 + fu->flags = 0; 891 + } 892 + 893 + static int get_cmd_dir(const unsigned char *cdb) 894 + { 895 + int ret; 896 + 897 + switch (cdb[0]) { 898 + case READ_6: 899 + case READ_10: 900 + case READ_12: 901 + case READ_16: 902 + case INQUIRY: 903 + case MODE_SENSE: 904 + case MODE_SENSE_10: 905 + case SERVICE_ACTION_IN_16: 906 + case MAINTENANCE_IN: 907 + case PERSISTENT_RESERVE_IN: 908 + case SECURITY_PROTOCOL_IN: 909 + case ACCESS_CONTROL_IN: 910 + case REPORT_LUNS: 911 + case READ_BLOCK_LIMITS: 912 + case READ_POSITION: 913 + case READ_CAPACITY: 914 + case READ_TOC: 915 + case READ_FORMAT_CAPACITIES: 916 + case REQUEST_SENSE: 917 + ret = DMA_FROM_DEVICE; 918 + break; 919 + 920 + case WRITE_6: 921 + case WRITE_10: 922 + case WRITE_12: 923 + case WRITE_16: 924 + case MODE_SELECT: 925 + case MODE_SELECT_10: 926 + case WRITE_VERIFY: 927 + case WRITE_VERIFY_12: 928 + case PERSISTENT_RESERVE_OUT: 929 + case MAINTENANCE_OUT: 930 + case SECURITY_PROTOCOL_OUT: 931 + case ACCESS_CONTROL_OUT: 932 + ret = DMA_TO_DEVICE; 933 + break; 934 + case ALLOW_MEDIUM_REMOVAL: 935 + case TEST_UNIT_READY: 936 + case SYNCHRONIZE_CACHE: 937 + case START_STOP: 938 + case ERASE: 939 + case REZERO_UNIT: 940 + case SEEK_10: 941 + case SPACE: 942 + case VERIFY: 943 + case WRITE_FILEMARKS: 944 + ret = DMA_NONE; 945 + break; 946 + default: 947 + #define CMD_DIR_MSG "target: Unknown data direction for SCSI Opcode 0x%02x\n" 948 + pr_warn(CMD_DIR_MSG, cdb[0]); 949 + #undef CMD_DIR_MSG 950 + ret = -EINVAL; 951 + } 952 + return ret; 953 + } 954 + 955 + static void usbg_data_write_cmpl(struct usb_ep *ep, struct usb_request *req) 956 + { 957 + struct usbg_cmd *cmd = req->context; 958 + struct se_cmd *se_cmd = &cmd->se_cmd; 959 + 960 + if (req->status < 0) { 961 + pr_err("%s() state %d transfer failed\n", __func__, cmd->state); 962 + goto cleanup; 963 + } 964 + 965 + if (req->num_sgs == 0) { 966 + sg_copy_from_buffer(se_cmd->t_data_sg, 967 + se_cmd->t_data_nents, 968 + cmd->data_buf, 969 + se_cmd->data_length); 970 + } 971 + 972 + complete(&cmd->write_complete); 973 + return; 974 + 975 + cleanup: 976 + usbg_cleanup_cmd(cmd); 977 + } 978 + 979 + static int usbg_prepare_w_request(struct usbg_cmd *cmd, struct usb_request *req) 980 + { 981 + struct se_cmd *se_cmd = &cmd->se_cmd; 982 + struct f_uas *fu = cmd->fu; 983 + struct usb_gadget *gadget = fuas_to_gadget(fu); 984 + 985 + if (!gadget->sg_supported) { 986 + cmd->data_buf = kmalloc(se_cmd->data_length, GFP_ATOMIC); 987 + if (!cmd->data_buf) 988 + return -ENOMEM; 989 + 990 + req->buf = cmd->data_buf; 991 + } else { 992 + req->buf = NULL; 993 + req->num_sgs = se_cmd->t_data_nents; 994 + req->sg = se_cmd->t_data_sg; 995 + } 996 + 997 + req->complete = usbg_data_write_cmpl; 998 + req->length = se_cmd->data_length; 999 + req->context = cmd; 1000 + return 0; 1001 + } 1002 + 1003 + static int usbg_send_status_response(struct se_cmd *se_cmd) 1004 + { 1005 + struct usbg_cmd *cmd = container_of(se_cmd, struct usbg_cmd, 1006 + se_cmd); 1007 + struct f_uas *fu = cmd->fu; 1008 + 1009 + if (fu->flags & USBG_IS_BOT) 1010 + return bot_send_status_response(cmd); 1011 + else 1012 + return uasp_send_status_response(cmd); 1013 + } 1014 + 1015 + static int usbg_send_write_request(struct se_cmd *se_cmd) 1016 + { 1017 + struct usbg_cmd *cmd = container_of(se_cmd, struct usbg_cmd, 1018 + se_cmd); 1019 + struct f_uas *fu = cmd->fu; 1020 + 1021 + if (fu->flags & USBG_IS_BOT) 1022 + return bot_send_write_request(cmd); 1023 + else 1024 + return uasp_send_write_request(cmd); 1025 + } 1026 + 1027 + static int usbg_send_read_response(struct se_cmd *se_cmd) 1028 + { 1029 + struct usbg_cmd *cmd = container_of(se_cmd, struct usbg_cmd, 1030 + se_cmd); 1031 + struct f_uas *fu = cmd->fu; 1032 + 1033 + if (fu->flags & USBG_IS_BOT) 1034 + return bot_send_read_response(cmd); 1035 + else 1036 + return uasp_send_read_response(cmd); 1037 + } 1038 + 1039 + static void usbg_cmd_work(struct work_struct *work) 1040 + { 1041 + struct usbg_cmd *cmd = container_of(work, struct usbg_cmd, work); 1042 + struct se_cmd *se_cmd; 1043 + struct tcm_usbg_nexus *tv_nexus; 1044 + struct usbg_tpg *tpg; 1045 + int dir; 1046 + 1047 + se_cmd = &cmd->se_cmd; 1048 + tpg = cmd->fu->tpg; 1049 + tv_nexus = tpg->tpg_nexus; 1050 + dir = get_cmd_dir(cmd->cmd_buf); 1051 + if (dir < 0) { 1052 + transport_init_se_cmd(se_cmd, 1053 + tv_nexus->tvn_se_sess->se_tpg->se_tpg_tfo, 1054 + tv_nexus->tvn_se_sess, cmd->data_len, DMA_NONE, 1055 + cmd->prio_attr, cmd->sense_iu.sense); 1056 + goto out; 1057 + } 1058 + 1059 + if (target_submit_cmd(se_cmd, tv_nexus->tvn_se_sess, 1060 + cmd->cmd_buf, cmd->sense_iu.sense, cmd->unpacked_lun, 1061 + 0, cmd->prio_attr, dir, TARGET_SCF_UNKNOWN_SIZE) < 0) 1062 + goto out; 1063 + 1064 + return; 1065 + 1066 + out: 1067 + transport_send_check_condition_and_sense(se_cmd, 1068 + TCM_UNSUPPORTED_SCSI_OPCODE, 1); 1069 + usbg_cleanup_cmd(cmd); 1070 + } 1071 + 1072 + static int usbg_submit_command(struct f_uas *fu, 1073 + void *cmdbuf, unsigned int len) 1074 + { 1075 + struct command_iu *cmd_iu = cmdbuf; 1076 + struct usbg_cmd *cmd; 1077 + struct usbg_tpg *tpg; 1078 + struct se_cmd *se_cmd; 1079 + struct tcm_usbg_nexus *tv_nexus; 1080 + u32 cmd_len; 1081 + 1082 + if (cmd_iu->iu_id != IU_ID_COMMAND) { 1083 + pr_err("Unsupported type %d\n", cmd_iu->iu_id); 1084 + return -EINVAL; 1085 + } 1086 + 1087 + cmd = kzalloc(sizeof(*cmd), GFP_ATOMIC); 1088 + if (!cmd) 1089 + return -ENOMEM; 1090 + 1091 + cmd->fu = fu; 1092 + 1093 + /* XXX until I figure out why I can't free in on complete */ 1094 + kref_init(&cmd->ref); 1095 + kref_get(&cmd->ref); 1096 + 1097 + tpg = fu->tpg; 1098 + cmd_len = (cmd_iu->len & ~0x3) + 16; 1099 + if (cmd_len > USBG_MAX_CMD) 1100 + goto err; 1101 + 1102 + memcpy(cmd->cmd_buf, cmd_iu->cdb, cmd_len); 1103 + 1104 + cmd->tag = be16_to_cpup(&cmd_iu->tag); 1105 + cmd->se_cmd.tag = cmd->tag; 1106 + if (fu->flags & USBG_USE_STREAMS) { 1107 + if (cmd->tag > UASP_SS_EP_COMP_NUM_STREAMS) 1108 + goto err; 1109 + if (!cmd->tag) 1110 + cmd->stream = &fu->stream[0]; 1111 + else 1112 + cmd->stream = &fu->stream[cmd->tag - 1]; 1113 + } else { 1114 + cmd->stream = &fu->stream[0]; 1115 + } 1116 + 1117 + tv_nexus = tpg->tpg_nexus; 1118 + if (!tv_nexus) { 1119 + pr_err("Missing nexus, ignoring command\n"); 1120 + goto err; 1121 + } 1122 + 1123 + switch (cmd_iu->prio_attr & 0x7) { 1124 + case UAS_HEAD_TAG: 1125 + cmd->prio_attr = TCM_HEAD_TAG; 1126 + break; 1127 + case UAS_ORDERED_TAG: 1128 + cmd->prio_attr = TCM_ORDERED_TAG; 1129 + break; 1130 + case UAS_ACA: 1131 + cmd->prio_attr = TCM_ACA_TAG; 1132 + break; 1133 + default: 1134 + pr_debug_once("Unsupported prio_attr: %02x.\n", 1135 + cmd_iu->prio_attr); 1136 + case UAS_SIMPLE_TAG: 1137 + cmd->prio_attr = TCM_SIMPLE_TAG; 1138 + break; 1139 + } 1140 + 1141 + se_cmd = &cmd->se_cmd; 1142 + cmd->unpacked_lun = scsilun_to_int(&cmd_iu->lun); 1143 + 1144 + INIT_WORK(&cmd->work, usbg_cmd_work); 1145 + queue_work(tpg->workqueue, &cmd->work); 1146 + 1147 + return 0; 1148 + err: 1149 + kfree(cmd); 1150 + return -EINVAL; 1151 + } 1152 + 1153 + static void bot_cmd_work(struct work_struct *work) 1154 + { 1155 + struct usbg_cmd *cmd = container_of(work, struct usbg_cmd, work); 1156 + struct se_cmd *se_cmd; 1157 + struct tcm_usbg_nexus *tv_nexus; 1158 + struct usbg_tpg *tpg; 1159 + int dir; 1160 + 1161 + se_cmd = &cmd->se_cmd; 1162 + tpg = cmd->fu->tpg; 1163 + tv_nexus = tpg->tpg_nexus; 1164 + dir = get_cmd_dir(cmd->cmd_buf); 1165 + if (dir < 0) { 1166 + transport_init_se_cmd(se_cmd, 1167 + tv_nexus->tvn_se_sess->se_tpg->se_tpg_tfo, 1168 + tv_nexus->tvn_se_sess, cmd->data_len, DMA_NONE, 1169 + cmd->prio_attr, cmd->sense_iu.sense); 1170 + goto out; 1171 + } 1172 + 1173 + if (target_submit_cmd(se_cmd, tv_nexus->tvn_se_sess, 1174 + cmd->cmd_buf, cmd->sense_iu.sense, cmd->unpacked_lun, 1175 + cmd->data_len, cmd->prio_attr, dir, 0) < 0) 1176 + goto out; 1177 + 1178 + return; 1179 + 1180 + out: 1181 + transport_send_check_condition_and_sense(se_cmd, 1182 + TCM_UNSUPPORTED_SCSI_OPCODE, 1); 1183 + usbg_cleanup_cmd(cmd); 1184 + } 1185 + 1186 + static int bot_submit_command(struct f_uas *fu, 1187 + void *cmdbuf, unsigned int len) 1188 + { 1189 + struct bulk_cb_wrap *cbw = cmdbuf; 1190 + struct usbg_cmd *cmd; 1191 + struct usbg_tpg *tpg; 1192 + struct se_cmd *se_cmd; 1193 + struct tcm_usbg_nexus *tv_nexus; 1194 + u32 cmd_len; 1195 + 1196 + if (cbw->Signature != cpu_to_le32(US_BULK_CB_SIGN)) { 1197 + pr_err("Wrong signature on CBW\n"); 1198 + return -EINVAL; 1199 + } 1200 + if (len != 31) { 1201 + pr_err("Wrong length for CBW\n"); 1202 + return -EINVAL; 1203 + } 1204 + 1205 + cmd_len = cbw->Length; 1206 + if (cmd_len < 1 || cmd_len > 16) 1207 + return -EINVAL; 1208 + 1209 + cmd = kzalloc(sizeof(*cmd), GFP_ATOMIC); 1210 + if (!cmd) 1211 + return -ENOMEM; 1212 + 1213 + cmd->fu = fu; 1214 + 1215 + /* XXX until I figure out why I can't free in on complete */ 1216 + kref_init(&cmd->ref); 1217 + kref_get(&cmd->ref); 1218 + 1219 + tpg = fu->tpg; 1220 + 1221 + memcpy(cmd->cmd_buf, cbw->CDB, cmd_len); 1222 + 1223 + cmd->bot_tag = cbw->Tag; 1224 + 1225 + tv_nexus = tpg->tpg_nexus; 1226 + if (!tv_nexus) { 1227 + pr_err("Missing nexus, ignoring command\n"); 1228 + goto err; 1229 + } 1230 + 1231 + cmd->prio_attr = TCM_SIMPLE_TAG; 1232 + se_cmd = &cmd->se_cmd; 1233 + cmd->unpacked_lun = cbw->Lun; 1234 + cmd->is_read = cbw->Flags & US_BULK_FLAG_IN ? 1 : 0; 1235 + cmd->data_len = le32_to_cpu(cbw->DataTransferLength); 1236 + cmd->se_cmd.tag = le32_to_cpu(cmd->bot_tag); 1237 + 1238 + INIT_WORK(&cmd->work, bot_cmd_work); 1239 + queue_work(tpg->workqueue, &cmd->work); 1240 + 1241 + return 0; 1242 + err: 1243 + kfree(cmd); 1244 + return -EINVAL; 1245 + } 1246 + 1247 + /* Start fabric.c code */ 1248 + 1249 + static int usbg_check_true(struct se_portal_group *se_tpg) 1250 + { 1251 + return 1; 1252 + } 1253 + 1254 + static int usbg_check_false(struct se_portal_group *se_tpg) 1255 + { 1256 + return 0; 1257 + } 1258 + 1259 + static char *usbg_get_fabric_name(void) 1260 + { 1261 + return "usb_gadget"; 1262 + } 1263 + 1264 + static char *usbg_get_fabric_wwn(struct se_portal_group *se_tpg) 1265 + { 1266 + struct usbg_tpg *tpg = container_of(se_tpg, 1267 + struct usbg_tpg, se_tpg); 1268 + struct usbg_tport *tport = tpg->tport; 1269 + 1270 + return &tport->tport_name[0]; 1271 + } 1272 + 1273 + static u16 usbg_get_tag(struct se_portal_group *se_tpg) 1274 + { 1275 + struct usbg_tpg *tpg = container_of(se_tpg, 1276 + struct usbg_tpg, se_tpg); 1277 + return tpg->tport_tpgt; 1278 + } 1279 + 1280 + static u32 usbg_tpg_get_inst_index(struct se_portal_group *se_tpg) 1281 + { 1282 + return 1; 1283 + } 1284 + 1285 + static void usbg_cmd_release(struct kref *ref) 1286 + { 1287 + struct usbg_cmd *cmd = container_of(ref, struct usbg_cmd, 1288 + ref); 1289 + 1290 + transport_generic_free_cmd(&cmd->se_cmd, 0); 1291 + } 1292 + 1293 + static void usbg_release_cmd(struct se_cmd *se_cmd) 1294 + { 1295 + struct usbg_cmd *cmd = container_of(se_cmd, struct usbg_cmd, 1296 + se_cmd); 1297 + kfree(cmd->data_buf); 1298 + kfree(cmd); 1299 + } 1300 + 1301 + static int usbg_shutdown_session(struct se_session *se_sess) 1302 + { 1303 + return 0; 1304 + } 1305 + 1306 + static void usbg_close_session(struct se_session *se_sess) 1307 + { 1308 + } 1309 + 1310 + static u32 usbg_sess_get_index(struct se_session *se_sess) 1311 + { 1312 + return 0; 1313 + } 1314 + 1315 + /* 1316 + * XXX Error recovery: return != 0 if we expect writes. Dunno when that could be 1317 + */ 1318 + static int usbg_write_pending_status(struct se_cmd *se_cmd) 1319 + { 1320 + return 0; 1321 + } 1322 + 1323 + static void usbg_set_default_node_attrs(struct se_node_acl *nacl) 1324 + { 1325 + } 1326 + 1327 + static int usbg_get_cmd_state(struct se_cmd *se_cmd) 1328 + { 1329 + return 0; 1330 + } 1331 + 1332 + static void usbg_queue_tm_rsp(struct se_cmd *se_cmd) 1333 + { 1334 + } 1335 + 1336 + static void usbg_aborted_task(struct se_cmd *se_cmd) 1337 + { 1338 + } 1339 + 1340 + static const char *usbg_check_wwn(const char *name) 1341 + { 1342 + const char *n; 1343 + unsigned int len; 1344 + 1345 + n = strstr(name, "naa."); 1346 + if (!n) 1347 + return NULL; 1348 + n += 4; 1349 + len = strlen(n); 1350 + if (len == 0 || len > USBG_NAMELEN - 1) 1351 + return NULL; 1352 + return n; 1353 + } 1354 + 1355 + static int usbg_init_nodeacl(struct se_node_acl *se_nacl, const char *name) 1356 + { 1357 + if (!usbg_check_wwn(name)) 1358 + return -EINVAL; 1359 + return 0; 1360 + } 1361 + 1362 + struct usbg_tpg *the_only_tpg_I_currently_have; 1363 + 1364 + static struct se_portal_group *usbg_make_tpg( 1365 + struct se_wwn *wwn, 1366 + struct config_group *group, 1367 + const char *name) 1368 + { 1369 + struct usbg_tport *tport = container_of(wwn, struct usbg_tport, 1370 + tport_wwn); 1371 + struct usbg_tpg *tpg; 1372 + unsigned long tpgt; 1373 + int ret; 1374 + 1375 + if (strstr(name, "tpgt_") != name) 1376 + return ERR_PTR(-EINVAL); 1377 + if (kstrtoul(name + 5, 0, &tpgt) || tpgt > UINT_MAX) 1378 + return ERR_PTR(-EINVAL); 1379 + if (the_only_tpg_I_currently_have) { 1380 + pr_err("Until the gadget framework can't handle multiple\n"); 1381 + pr_err("gadgets, you can't do this here.\n"); 1382 + return ERR_PTR(-EBUSY); 1383 + } 1384 + 1385 + tpg = kzalloc(sizeof(struct usbg_tpg), GFP_KERNEL); 1386 + if (!tpg) 1387 + return ERR_PTR(-ENOMEM); 1388 + mutex_init(&tpg->tpg_mutex); 1389 + atomic_set(&tpg->tpg_port_count, 0); 1390 + tpg->workqueue = alloc_workqueue("tcm_usb_gadget", 0, 1); 1391 + if (!tpg->workqueue) { 1392 + kfree(tpg); 1393 + return NULL; 1394 + } 1395 + 1396 + tpg->tport = tport; 1397 + tpg->tport_tpgt = tpgt; 1398 + 1399 + /* 1400 + * SPC doesn't assign a protocol identifier for USB-SCSI, so we 1401 + * pretend to be SAS.. 1402 + */ 1403 + ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_SAS); 1404 + if (ret < 0) { 1405 + destroy_workqueue(tpg->workqueue); 1406 + kfree(tpg); 1407 + return NULL; 1408 + } 1409 + the_only_tpg_I_currently_have = tpg; 1410 + return &tpg->se_tpg; 1411 + } 1412 + 1413 + static int tcm_usbg_drop_nexus(struct usbg_tpg *); 1414 + 1415 + static void usbg_drop_tpg(struct se_portal_group *se_tpg) 1416 + { 1417 + struct usbg_tpg *tpg = container_of(se_tpg, 1418 + struct usbg_tpg, se_tpg); 1419 + 1420 + tcm_usbg_drop_nexus(tpg); 1421 + core_tpg_deregister(se_tpg); 1422 + destroy_workqueue(tpg->workqueue); 1423 + kfree(tpg); 1424 + the_only_tpg_I_currently_have = NULL; 1425 + } 1426 + 1427 + static struct se_wwn *usbg_make_tport( 1428 + struct target_fabric_configfs *tf, 1429 + struct config_group *group, 1430 + const char *name) 1431 + { 1432 + struct usbg_tport *tport; 1433 + const char *wnn_name; 1434 + u64 wwpn = 0; 1435 + 1436 + wnn_name = usbg_check_wwn(name); 1437 + if (!wnn_name) 1438 + return ERR_PTR(-EINVAL); 1439 + 1440 + tport = kzalloc(sizeof(struct usbg_tport), GFP_KERNEL); 1441 + if (!(tport)) 1442 + return ERR_PTR(-ENOMEM); 1443 + tport->tport_wwpn = wwpn; 1444 + snprintf(tport->tport_name, sizeof(tport->tport_name), "%s", wnn_name); 1445 + return &tport->tport_wwn; 1446 + } 1447 + 1448 + static void usbg_drop_tport(struct se_wwn *wwn) 1449 + { 1450 + struct usbg_tport *tport = container_of(wwn, 1451 + struct usbg_tport, tport_wwn); 1452 + kfree(tport); 1453 + } 1454 + 1455 + /* 1456 + * If somebody feels like dropping the version property, go ahead. 1457 + */ 1458 + static ssize_t usbg_wwn_version_show(struct config_item *item, char *page) 1459 + { 1460 + return sprintf(page, "usb-gadget fabric module\n"); 1461 + } 1462 + 1463 + CONFIGFS_ATTR_RO(usbg_wwn_, version); 1464 + 1465 + static struct configfs_attribute *usbg_wwn_attrs[] = { 1466 + &usbg_wwn_attr_version, 1467 + NULL, 1468 + }; 1469 + 1470 + static ssize_t tcm_usbg_tpg_enable_show(struct config_item *item, char *page) 1471 + { 1472 + struct se_portal_group *se_tpg = to_tpg(item); 1473 + struct usbg_tpg *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg); 1474 + 1475 + return snprintf(page, PAGE_SIZE, "%u\n", tpg->gadget_connect); 1476 + } 1477 + 1478 + static int usbg_attach(struct usbg_tpg *); 1479 + static void usbg_detach(struct usbg_tpg *); 1480 + 1481 + static ssize_t tcm_usbg_tpg_enable_store(struct config_item *item, 1482 + const char *page, size_t count) 1483 + { 1484 + struct se_portal_group *se_tpg = to_tpg(item); 1485 + struct usbg_tpg *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg); 1486 + bool op; 1487 + ssize_t ret; 1488 + 1489 + ret = strtobool(page, &op); 1490 + if (ret) 1491 + return ret; 1492 + 1493 + if ((op && tpg->gadget_connect) || (!op && !tpg->gadget_connect)) 1494 + return -EINVAL; 1495 + 1496 + if (op) 1497 + ret = usbg_attach(tpg); 1498 + else 1499 + usbg_detach(tpg); 1500 + if (ret) 1501 + return ret; 1502 + 1503 + tpg->gadget_connect = op; 1504 + 1505 + return count; 1506 + } 1507 + 1508 + static ssize_t tcm_usbg_tpg_nexus_show(struct config_item *item, char *page) 1509 + { 1510 + struct se_portal_group *se_tpg = to_tpg(item); 1511 + struct usbg_tpg *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg); 1512 + struct tcm_usbg_nexus *tv_nexus; 1513 + ssize_t ret; 1514 + 1515 + mutex_lock(&tpg->tpg_mutex); 1516 + tv_nexus = tpg->tpg_nexus; 1517 + if (!tv_nexus) { 1518 + ret = -ENODEV; 1519 + goto out; 1520 + } 1521 + ret = snprintf(page, PAGE_SIZE, "%s\n", 1522 + tv_nexus->tvn_se_sess->se_node_acl->initiatorname); 1523 + out: 1524 + mutex_unlock(&tpg->tpg_mutex); 1525 + return ret; 1526 + } 1527 + 1528 + static int tcm_usbg_make_nexus(struct usbg_tpg *tpg, char *name) 1529 + { 1530 + struct se_portal_group *se_tpg; 1531 + struct tcm_usbg_nexus *tv_nexus; 1532 + int ret; 1533 + 1534 + mutex_lock(&tpg->tpg_mutex); 1535 + if (tpg->tpg_nexus) { 1536 + ret = -EEXIST; 1537 + pr_debug("tpg->tpg_nexus already exists\n"); 1538 + goto err_unlock; 1539 + } 1540 + se_tpg = &tpg->se_tpg; 1541 + 1542 + ret = -ENOMEM; 1543 + tv_nexus = kzalloc(sizeof(*tv_nexus), GFP_KERNEL); 1544 + if (!tv_nexus) 1545 + goto err_unlock; 1546 + tv_nexus->tvn_se_sess = transport_init_session(TARGET_PROT_NORMAL); 1547 + if (IS_ERR(tv_nexus->tvn_se_sess)) 1548 + goto err_free; 1549 + 1550 + /* 1551 + * Since we are running in 'demo mode' this call with generate a 1552 + * struct se_node_acl for the tcm_vhost struct se_portal_group with 1553 + * the SCSI Initiator port name of the passed configfs group 'name'. 1554 + */ 1555 + tv_nexus->tvn_se_sess->se_node_acl = core_tpg_check_initiator_node_acl( 1556 + se_tpg, name); 1557 + if (!tv_nexus->tvn_se_sess->se_node_acl) { 1558 + #define MAKE_NEXUS_MSG "core_tpg_check_initiator_node_acl() failed for %s\n" 1559 + pr_debug(MAKE_NEXUS_MSG, name); 1560 + #undef MAKE_NEXUS_MSG 1561 + goto err_session; 1562 + } 1563 + /* 1564 + * Now register the TCM vHost virtual I_T Nexus as active. 1565 + */ 1566 + transport_register_session(se_tpg, tv_nexus->tvn_se_sess->se_node_acl, 1567 + tv_nexus->tvn_se_sess, tv_nexus); 1568 + tpg->tpg_nexus = tv_nexus; 1569 + mutex_unlock(&tpg->tpg_mutex); 1570 + return 0; 1571 + 1572 + err_session: 1573 + transport_free_session(tv_nexus->tvn_se_sess); 1574 + err_free: 1575 + kfree(tv_nexus); 1576 + err_unlock: 1577 + mutex_unlock(&tpg->tpg_mutex); 1578 + return ret; 1579 + } 1580 + 1581 + static int tcm_usbg_drop_nexus(struct usbg_tpg *tpg) 1582 + { 1583 + struct se_session *se_sess; 1584 + struct tcm_usbg_nexus *tv_nexus; 1585 + int ret = -ENODEV; 1586 + 1587 + mutex_lock(&tpg->tpg_mutex); 1588 + tv_nexus = tpg->tpg_nexus; 1589 + if (!tv_nexus) 1590 + goto out; 1591 + 1592 + se_sess = tv_nexus->tvn_se_sess; 1593 + if (!se_sess) 1594 + goto out; 1595 + 1596 + if (atomic_read(&tpg->tpg_port_count)) { 1597 + ret = -EPERM; 1598 + #define MSG "Unable to remove Host I_T Nexus with active TPG port count: %d\n" 1599 + pr_err(MSG, atomic_read(&tpg->tpg_port_count)); 1600 + #undef MSG 1601 + goto out; 1602 + } 1603 + 1604 + pr_debug("Removing I_T Nexus to Initiator Port: %s\n", 1605 + tv_nexus->tvn_se_sess->se_node_acl->initiatorname); 1606 + /* 1607 + * Release the SCSI I_T Nexus to the emulated vHost Target Port 1608 + */ 1609 + transport_deregister_session(tv_nexus->tvn_se_sess); 1610 + tpg->tpg_nexus = NULL; 1611 + 1612 + kfree(tv_nexus); 1613 + ret = 0; 1614 + out: 1615 + mutex_unlock(&tpg->tpg_mutex); 1616 + return ret; 1617 + } 1618 + 1619 + static ssize_t tcm_usbg_tpg_nexus_store(struct config_item *item, 1620 + const char *page, size_t count) 1621 + { 1622 + struct se_portal_group *se_tpg = to_tpg(item); 1623 + struct usbg_tpg *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg); 1624 + unsigned char i_port[USBG_NAMELEN], *ptr; 1625 + int ret; 1626 + 1627 + if (!strncmp(page, "NULL", 4)) { 1628 + ret = tcm_usbg_drop_nexus(tpg); 1629 + return (!ret) ? count : ret; 1630 + } 1631 + if (strlen(page) >= USBG_NAMELEN) { 1632 + 1633 + #define NEXUS_STORE_MSG "Emulated NAA Sas Address: %s, exceeds max: %d\n" 1634 + pr_err(NEXUS_STORE_MSG, page, USBG_NAMELEN); 1635 + #undef NEXUS_STORE_MSG 1636 + return -EINVAL; 1637 + } 1638 + snprintf(i_port, USBG_NAMELEN, "%s", page); 1639 + 1640 + ptr = strstr(i_port, "naa."); 1641 + if (!ptr) { 1642 + pr_err("Missing 'naa.' prefix\n"); 1643 + return -EINVAL; 1644 + } 1645 + 1646 + if (i_port[strlen(i_port) - 1] == '\n') 1647 + i_port[strlen(i_port) - 1] = '\0'; 1648 + 1649 + ret = tcm_usbg_make_nexus(tpg, &i_port[0]); 1650 + if (ret < 0) 1651 + return ret; 1652 + return count; 1653 + } 1654 + 1655 + CONFIGFS_ATTR(tcm_usbg_tpg_, enable); 1656 + CONFIGFS_ATTR(tcm_usbg_tpg_, nexus); 1657 + 1658 + static struct configfs_attribute *usbg_base_attrs[] = { 1659 + &tcm_usbg_tpg_attr_enable, 1660 + &tcm_usbg_tpg_attr_nexus, 1661 + NULL, 1662 + }; 1663 + 1664 + static int usbg_port_link(struct se_portal_group *se_tpg, struct se_lun *lun) 1665 + { 1666 + struct usbg_tpg *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg); 1667 + 1668 + atomic_inc(&tpg->tpg_port_count); 1669 + smp_mb__after_atomic(); 1670 + return 0; 1671 + } 1672 + 1673 + static void usbg_port_unlink(struct se_portal_group *se_tpg, 1674 + struct se_lun *se_lun) 1675 + { 1676 + struct usbg_tpg *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg); 1677 + 1678 + atomic_dec(&tpg->tpg_port_count); 1679 + smp_mb__after_atomic(); 1680 + } 1681 + 1682 + static int usbg_check_stop_free(struct se_cmd *se_cmd) 1683 + { 1684 + struct usbg_cmd *cmd = container_of(se_cmd, struct usbg_cmd, 1685 + se_cmd); 1686 + 1687 + kref_put(&cmd->ref, usbg_cmd_release); 1688 + return 1; 1689 + } 1690 + 1691 + static const struct target_core_fabric_ops usbg_ops = { 1692 + .module = THIS_MODULE, 1693 + .name = "usb_gadget", 1694 + .get_fabric_name = usbg_get_fabric_name, 1695 + .tpg_get_wwn = usbg_get_fabric_wwn, 1696 + .tpg_get_tag = usbg_get_tag, 1697 + .tpg_check_demo_mode = usbg_check_true, 1698 + .tpg_check_demo_mode_cache = usbg_check_false, 1699 + .tpg_check_demo_mode_write_protect = usbg_check_false, 1700 + .tpg_check_prod_mode_write_protect = usbg_check_false, 1701 + .tpg_get_inst_index = usbg_tpg_get_inst_index, 1702 + .release_cmd = usbg_release_cmd, 1703 + .shutdown_session = usbg_shutdown_session, 1704 + .close_session = usbg_close_session, 1705 + .sess_get_index = usbg_sess_get_index, 1706 + .sess_get_initiator_sid = NULL, 1707 + .write_pending = usbg_send_write_request, 1708 + .write_pending_status = usbg_write_pending_status, 1709 + .set_default_node_attributes = usbg_set_default_node_attrs, 1710 + .get_cmd_state = usbg_get_cmd_state, 1711 + .queue_data_in = usbg_send_read_response, 1712 + .queue_status = usbg_send_status_response, 1713 + .queue_tm_rsp = usbg_queue_tm_rsp, 1714 + .aborted_task = usbg_aborted_task, 1715 + .check_stop_free = usbg_check_stop_free, 1716 + 1717 + .fabric_make_wwn = usbg_make_tport, 1718 + .fabric_drop_wwn = usbg_drop_tport, 1719 + .fabric_make_tpg = usbg_make_tpg, 1720 + .fabric_drop_tpg = usbg_drop_tpg, 1721 + .fabric_post_link = usbg_port_link, 1722 + .fabric_pre_unlink = usbg_port_unlink, 1723 + .fabric_init_nodeacl = usbg_init_nodeacl, 1724 + 1725 + .tfc_wwn_attrs = usbg_wwn_attrs, 1726 + .tfc_tpg_base_attrs = usbg_base_attrs, 1727 + }; 1728 + 1729 + /* Start gadget.c code */ 1730 + 1731 + static struct usb_interface_descriptor bot_intf_desc = { 1732 + .bLength = sizeof(bot_intf_desc), 1733 + .bDescriptorType = USB_DT_INTERFACE, 1734 + .bNumEndpoints = 2, 1735 + .bAlternateSetting = USB_G_ALT_INT_BBB, 1736 + .bInterfaceClass = USB_CLASS_MASS_STORAGE, 1737 + .bInterfaceSubClass = USB_SC_SCSI, 1738 + .bInterfaceProtocol = USB_PR_BULK, 1739 + }; 1740 + 1741 + static struct usb_interface_descriptor uasp_intf_desc = { 1742 + .bLength = sizeof(uasp_intf_desc), 1743 + .bDescriptorType = USB_DT_INTERFACE, 1744 + .bNumEndpoints = 4, 1745 + .bAlternateSetting = USB_G_ALT_INT_UAS, 1746 + .bInterfaceClass = USB_CLASS_MASS_STORAGE, 1747 + .bInterfaceSubClass = USB_SC_SCSI, 1748 + .bInterfaceProtocol = USB_PR_UAS, 1749 + }; 1750 + 1751 + static struct usb_endpoint_descriptor uasp_bi_desc = { 1752 + .bLength = USB_DT_ENDPOINT_SIZE, 1753 + .bDescriptorType = USB_DT_ENDPOINT, 1754 + .bEndpointAddress = USB_DIR_IN, 1755 + .bmAttributes = USB_ENDPOINT_XFER_BULK, 1756 + .wMaxPacketSize = cpu_to_le16(512), 1757 + }; 1758 + 1759 + static struct usb_endpoint_descriptor uasp_fs_bi_desc = { 1760 + .bLength = USB_DT_ENDPOINT_SIZE, 1761 + .bDescriptorType = USB_DT_ENDPOINT, 1762 + .bEndpointAddress = USB_DIR_IN, 1763 + .bmAttributes = USB_ENDPOINT_XFER_BULK, 1764 + }; 1765 + 1766 + static struct usb_pipe_usage_descriptor uasp_bi_pipe_desc = { 1767 + .bLength = sizeof(uasp_bi_pipe_desc), 1768 + .bDescriptorType = USB_DT_PIPE_USAGE, 1769 + .bPipeID = DATA_IN_PIPE_ID, 1770 + }; 1771 + 1772 + static struct usb_endpoint_descriptor uasp_ss_bi_desc = { 1773 + .bLength = USB_DT_ENDPOINT_SIZE, 1774 + .bDescriptorType = USB_DT_ENDPOINT, 1775 + .bEndpointAddress = USB_DIR_IN, 1776 + .bmAttributes = USB_ENDPOINT_XFER_BULK, 1777 + .wMaxPacketSize = cpu_to_le16(1024), 1778 + }; 1779 + 1780 + static struct usb_ss_ep_comp_descriptor uasp_bi_ep_comp_desc = { 1781 + .bLength = sizeof(uasp_bi_ep_comp_desc), 1782 + .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 1783 + .bMaxBurst = 0, 1784 + .bmAttributes = UASP_SS_EP_COMP_LOG_STREAMS, 1785 + .wBytesPerInterval = 0, 1786 + }; 1787 + 1788 + static struct usb_ss_ep_comp_descriptor bot_bi_ep_comp_desc = { 1789 + .bLength = sizeof(bot_bi_ep_comp_desc), 1790 + .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 1791 + .bMaxBurst = 0, 1792 + }; 1793 + 1794 + static struct usb_endpoint_descriptor uasp_bo_desc = { 1795 + .bLength = USB_DT_ENDPOINT_SIZE, 1796 + .bDescriptorType = USB_DT_ENDPOINT, 1797 + .bEndpointAddress = USB_DIR_OUT, 1798 + .bmAttributes = USB_ENDPOINT_XFER_BULK, 1799 + .wMaxPacketSize = cpu_to_le16(512), 1800 + }; 1801 + 1802 + static struct usb_endpoint_descriptor uasp_fs_bo_desc = { 1803 + .bLength = USB_DT_ENDPOINT_SIZE, 1804 + .bDescriptorType = USB_DT_ENDPOINT, 1805 + .bEndpointAddress = USB_DIR_OUT, 1806 + .bmAttributes = USB_ENDPOINT_XFER_BULK, 1807 + }; 1808 + 1809 + static struct usb_pipe_usage_descriptor uasp_bo_pipe_desc = { 1810 + .bLength = sizeof(uasp_bo_pipe_desc), 1811 + .bDescriptorType = USB_DT_PIPE_USAGE, 1812 + .bPipeID = DATA_OUT_PIPE_ID, 1813 + }; 1814 + 1815 + static struct usb_endpoint_descriptor uasp_ss_bo_desc = { 1816 + .bLength = USB_DT_ENDPOINT_SIZE, 1817 + .bDescriptorType = USB_DT_ENDPOINT, 1818 + .bEndpointAddress = USB_DIR_OUT, 1819 + .bmAttributes = USB_ENDPOINT_XFER_BULK, 1820 + .wMaxPacketSize = cpu_to_le16(0x400), 1821 + }; 1822 + 1823 + static struct usb_ss_ep_comp_descriptor uasp_bo_ep_comp_desc = { 1824 + .bLength = sizeof(uasp_bo_ep_comp_desc), 1825 + .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 1826 + .bmAttributes = UASP_SS_EP_COMP_LOG_STREAMS, 1827 + }; 1828 + 1829 + static struct usb_ss_ep_comp_descriptor bot_bo_ep_comp_desc = { 1830 + .bLength = sizeof(bot_bo_ep_comp_desc), 1831 + .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 1832 + }; 1833 + 1834 + static struct usb_endpoint_descriptor uasp_status_desc = { 1835 + .bLength = USB_DT_ENDPOINT_SIZE, 1836 + .bDescriptorType = USB_DT_ENDPOINT, 1837 + .bEndpointAddress = USB_DIR_IN, 1838 + .bmAttributes = USB_ENDPOINT_XFER_BULK, 1839 + .wMaxPacketSize = cpu_to_le16(512), 1840 + }; 1841 + 1842 + static struct usb_endpoint_descriptor uasp_fs_status_desc = { 1843 + .bLength = USB_DT_ENDPOINT_SIZE, 1844 + .bDescriptorType = USB_DT_ENDPOINT, 1845 + .bEndpointAddress = USB_DIR_IN, 1846 + .bmAttributes = USB_ENDPOINT_XFER_BULK, 1847 + }; 1848 + 1849 + static struct usb_pipe_usage_descriptor uasp_status_pipe_desc = { 1850 + .bLength = sizeof(uasp_status_pipe_desc), 1851 + .bDescriptorType = USB_DT_PIPE_USAGE, 1852 + .bPipeID = STATUS_PIPE_ID, 1853 + }; 1854 + 1855 + static struct usb_endpoint_descriptor uasp_ss_status_desc = { 1856 + .bLength = USB_DT_ENDPOINT_SIZE, 1857 + .bDescriptorType = USB_DT_ENDPOINT, 1858 + .bEndpointAddress = USB_DIR_IN, 1859 + .bmAttributes = USB_ENDPOINT_XFER_BULK, 1860 + .wMaxPacketSize = cpu_to_le16(1024), 1861 + }; 1862 + 1863 + static struct usb_ss_ep_comp_descriptor uasp_status_in_ep_comp_desc = { 1864 + .bLength = sizeof(uasp_status_in_ep_comp_desc), 1865 + .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 1866 + .bmAttributes = UASP_SS_EP_COMP_LOG_STREAMS, 1867 + }; 1868 + 1869 + static struct usb_endpoint_descriptor uasp_cmd_desc = { 1870 + .bLength = USB_DT_ENDPOINT_SIZE, 1871 + .bDescriptorType = USB_DT_ENDPOINT, 1872 + .bEndpointAddress = USB_DIR_OUT, 1873 + .bmAttributes = USB_ENDPOINT_XFER_BULK, 1874 + .wMaxPacketSize = cpu_to_le16(512), 1875 + }; 1876 + 1877 + static struct usb_endpoint_descriptor uasp_fs_cmd_desc = { 1878 + .bLength = USB_DT_ENDPOINT_SIZE, 1879 + .bDescriptorType = USB_DT_ENDPOINT, 1880 + .bEndpointAddress = USB_DIR_OUT, 1881 + .bmAttributes = USB_ENDPOINT_XFER_BULK, 1882 + }; 1883 + 1884 + static struct usb_pipe_usage_descriptor uasp_cmd_pipe_desc = { 1885 + .bLength = sizeof(uasp_cmd_pipe_desc), 1886 + .bDescriptorType = USB_DT_PIPE_USAGE, 1887 + .bPipeID = CMD_PIPE_ID, 1888 + }; 1889 + 1890 + static struct usb_endpoint_descriptor uasp_ss_cmd_desc = { 1891 + .bLength = USB_DT_ENDPOINT_SIZE, 1892 + .bDescriptorType = USB_DT_ENDPOINT, 1893 + .bEndpointAddress = USB_DIR_OUT, 1894 + .bmAttributes = USB_ENDPOINT_XFER_BULK, 1895 + .wMaxPacketSize = cpu_to_le16(1024), 1896 + }; 1897 + 1898 + static struct usb_ss_ep_comp_descriptor uasp_cmd_comp_desc = { 1899 + .bLength = sizeof(uasp_cmd_comp_desc), 1900 + .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 1901 + }; 1902 + 1903 + static struct usb_descriptor_header *uasp_fs_function_desc[] = { 1904 + (struct usb_descriptor_header *) &bot_intf_desc, 1905 + (struct usb_descriptor_header *) &uasp_fs_bi_desc, 1906 + (struct usb_descriptor_header *) &uasp_fs_bo_desc, 1907 + 1908 + (struct usb_descriptor_header *) &uasp_intf_desc, 1909 + (struct usb_descriptor_header *) &uasp_fs_bi_desc, 1910 + (struct usb_descriptor_header *) &uasp_bi_pipe_desc, 1911 + (struct usb_descriptor_header *) &uasp_fs_bo_desc, 1912 + (struct usb_descriptor_header *) &uasp_bo_pipe_desc, 1913 + (struct usb_descriptor_header *) &uasp_fs_status_desc, 1914 + (struct usb_descriptor_header *) &uasp_status_pipe_desc, 1915 + (struct usb_descriptor_header *) &uasp_fs_cmd_desc, 1916 + (struct usb_descriptor_header *) &uasp_cmd_pipe_desc, 1917 + NULL, 1918 + }; 1919 + 1920 + static struct usb_descriptor_header *uasp_hs_function_desc[] = { 1921 + (struct usb_descriptor_header *) &bot_intf_desc, 1922 + (struct usb_descriptor_header *) &uasp_bi_desc, 1923 + (struct usb_descriptor_header *) &uasp_bo_desc, 1924 + 1925 + (struct usb_descriptor_header *) &uasp_intf_desc, 1926 + (struct usb_descriptor_header *) &uasp_bi_desc, 1927 + (struct usb_descriptor_header *) &uasp_bi_pipe_desc, 1928 + (struct usb_descriptor_header *) &uasp_bo_desc, 1929 + (struct usb_descriptor_header *) &uasp_bo_pipe_desc, 1930 + (struct usb_descriptor_header *) &uasp_status_desc, 1931 + (struct usb_descriptor_header *) &uasp_status_pipe_desc, 1932 + (struct usb_descriptor_header *) &uasp_cmd_desc, 1933 + (struct usb_descriptor_header *) &uasp_cmd_pipe_desc, 1934 + NULL, 1935 + }; 1936 + 1937 + static struct usb_descriptor_header *uasp_ss_function_desc[] = { 1938 + (struct usb_descriptor_header *) &bot_intf_desc, 1939 + (struct usb_descriptor_header *) &uasp_ss_bi_desc, 1940 + (struct usb_descriptor_header *) &bot_bi_ep_comp_desc, 1941 + (struct usb_descriptor_header *) &uasp_ss_bo_desc, 1942 + (struct usb_descriptor_header *) &bot_bo_ep_comp_desc, 1943 + 1944 + (struct usb_descriptor_header *) &uasp_intf_desc, 1945 + (struct usb_descriptor_header *) &uasp_ss_bi_desc, 1946 + (struct usb_descriptor_header *) &uasp_bi_ep_comp_desc, 1947 + (struct usb_descriptor_header *) &uasp_bi_pipe_desc, 1948 + (struct usb_descriptor_header *) &uasp_ss_bo_desc, 1949 + (struct usb_descriptor_header *) &uasp_bo_ep_comp_desc, 1950 + (struct usb_descriptor_header *) &uasp_bo_pipe_desc, 1951 + (struct usb_descriptor_header *) &uasp_ss_status_desc, 1952 + (struct usb_descriptor_header *) &uasp_status_in_ep_comp_desc, 1953 + (struct usb_descriptor_header *) &uasp_status_pipe_desc, 1954 + (struct usb_descriptor_header *) &uasp_ss_cmd_desc, 1955 + (struct usb_descriptor_header *) &uasp_cmd_comp_desc, 1956 + (struct usb_descriptor_header *) &uasp_cmd_pipe_desc, 1957 + NULL, 1958 + }; 1959 + 1960 + static struct usb_string tcm_us_strings[] = { 1961 + [USB_G_STR_INT_UAS].s = "USB Attached SCSI", 1962 + [USB_G_STR_INT_BBB].s = "Bulk Only Transport", 1963 + { }, 1964 + }; 1965 + 1966 + static struct usb_gadget_strings tcm_stringtab = { 1967 + .language = 0x0409, 1968 + .strings = tcm_us_strings, 1969 + }; 1970 + 1971 + static struct usb_gadget_strings *tcm_strings[] = { 1972 + &tcm_stringtab, 1973 + NULL, 1974 + }; 1975 + 1976 + static int tcm_bind(struct usb_configuration *c, struct usb_function *f) 1977 + { 1978 + struct f_uas *fu = to_f_uas(f); 1979 + struct usb_gadget *gadget = c->cdev->gadget; 1980 + struct usb_ep *ep; 1981 + int iface; 1982 + int ret; 1983 + 1984 + iface = usb_interface_id(c, f); 1985 + if (iface < 0) 1986 + return iface; 1987 + 1988 + bot_intf_desc.bInterfaceNumber = iface; 1989 + uasp_intf_desc.bInterfaceNumber = iface; 1990 + fu->iface = iface; 1991 + ep = usb_ep_autoconfig_ss(gadget, &uasp_ss_bi_desc, 1992 + &uasp_bi_ep_comp_desc); 1993 + if (!ep) 1994 + goto ep_fail; 1995 + 1996 + fu->ep_in = ep; 1997 + 1998 + ep = usb_ep_autoconfig_ss(gadget, &uasp_ss_bo_desc, 1999 + &uasp_bo_ep_comp_desc); 2000 + if (!ep) 2001 + goto ep_fail; 2002 + fu->ep_out = ep; 2003 + 2004 + ep = usb_ep_autoconfig_ss(gadget, &uasp_ss_status_desc, 2005 + &uasp_status_in_ep_comp_desc); 2006 + if (!ep) 2007 + goto ep_fail; 2008 + fu->ep_status = ep; 2009 + 2010 + ep = usb_ep_autoconfig_ss(gadget, &uasp_ss_cmd_desc, 2011 + &uasp_cmd_comp_desc); 2012 + if (!ep) 2013 + goto ep_fail; 2014 + fu->ep_cmd = ep; 2015 + 2016 + /* Assume endpoint addresses are the same for both speeds */ 2017 + uasp_bi_desc.bEndpointAddress = uasp_ss_bi_desc.bEndpointAddress; 2018 + uasp_bo_desc.bEndpointAddress = uasp_ss_bo_desc.bEndpointAddress; 2019 + uasp_status_desc.bEndpointAddress = 2020 + uasp_ss_status_desc.bEndpointAddress; 2021 + uasp_cmd_desc.bEndpointAddress = uasp_ss_cmd_desc.bEndpointAddress; 2022 + 2023 + uasp_fs_bi_desc.bEndpointAddress = uasp_ss_bi_desc.bEndpointAddress; 2024 + uasp_fs_bo_desc.bEndpointAddress = uasp_ss_bo_desc.bEndpointAddress; 2025 + uasp_fs_status_desc.bEndpointAddress = 2026 + uasp_ss_status_desc.bEndpointAddress; 2027 + uasp_fs_cmd_desc.bEndpointAddress = uasp_ss_cmd_desc.bEndpointAddress; 2028 + 2029 + ret = usb_assign_descriptors(f, uasp_fs_function_desc, 2030 + uasp_hs_function_desc, uasp_ss_function_desc); 2031 + if (ret) 2032 + goto ep_fail; 2033 + 2034 + return 0; 2035 + ep_fail: 2036 + pr_err("Can't claim all required eps\n"); 2037 + 2038 + return -ENOTSUPP; 2039 + } 2040 + 2041 + static void tcm_unbind(struct usb_configuration *c, struct usb_function *f) 2042 + { 2043 + struct f_uas *fu = to_f_uas(f); 2044 + 2045 + usb_free_all_descriptors(f); 2046 + kfree(fu); 2047 + } 2048 + 2049 + struct guas_setup_wq { 2050 + struct work_struct work; 2051 + struct f_uas *fu; 2052 + unsigned int alt; 2053 + }; 2054 + 2055 + static void tcm_delayed_set_alt(struct work_struct *wq) 2056 + { 2057 + struct guas_setup_wq *work = container_of(wq, struct guas_setup_wq, 2058 + work); 2059 + struct f_uas *fu = work->fu; 2060 + int alt = work->alt; 2061 + 2062 + kfree(work); 2063 + 2064 + if (fu->flags & USBG_IS_BOT) 2065 + bot_cleanup_old_alt(fu); 2066 + if (fu->flags & USBG_IS_UAS) 2067 + uasp_cleanup_old_alt(fu); 2068 + 2069 + if (alt == USB_G_ALT_INT_BBB) 2070 + bot_set_alt(fu); 2071 + else if (alt == USB_G_ALT_INT_UAS) 2072 + uasp_set_alt(fu); 2073 + usb_composite_setup_continue(fu->function.config->cdev); 2074 + } 2075 + 2076 + static int tcm_set_alt(struct usb_function *f, unsigned intf, unsigned alt) 2077 + { 2078 + struct f_uas *fu = to_f_uas(f); 2079 + 2080 + if ((alt == USB_G_ALT_INT_BBB) || (alt == USB_G_ALT_INT_UAS)) { 2081 + struct guas_setup_wq *work; 2082 + 2083 + work = kmalloc(sizeof(*work), GFP_ATOMIC); 2084 + if (!work) 2085 + return -ENOMEM; 2086 + INIT_WORK(&work->work, tcm_delayed_set_alt); 2087 + work->fu = fu; 2088 + work->alt = alt; 2089 + schedule_work(&work->work); 2090 + return USB_GADGET_DELAYED_STATUS; 2091 + } 2092 + return -EOPNOTSUPP; 2093 + } 2094 + 2095 + static void tcm_disable(struct usb_function *f) 2096 + { 2097 + struct f_uas *fu = to_f_uas(f); 2098 + 2099 + if (fu->flags & USBG_IS_UAS) 2100 + uasp_cleanup_old_alt(fu); 2101 + else if (fu->flags & USBG_IS_BOT) 2102 + bot_cleanup_old_alt(fu); 2103 + fu->flags = 0; 2104 + } 2105 + 2106 + static int tcm_setup(struct usb_function *f, 2107 + const struct usb_ctrlrequest *ctrl) 2108 + { 2109 + struct f_uas *fu = to_f_uas(f); 2110 + 2111 + if (!(fu->flags & USBG_IS_BOT)) 2112 + return -EOPNOTSUPP; 2113 + 2114 + return usbg_bot_setup(f, ctrl); 2115 + } 2116 + 2117 + static int tcm_bind_config(struct usb_configuration *c) 2118 + { 2119 + struct f_uas *fu; 2120 + int ret; 2121 + 2122 + fu = kzalloc(sizeof(*fu), GFP_KERNEL); 2123 + if (!fu) 2124 + return -ENOMEM; 2125 + fu->function.name = "Target Function"; 2126 + fu->function.bind = tcm_bind; 2127 + fu->function.unbind = tcm_unbind; 2128 + fu->function.set_alt = tcm_set_alt; 2129 + fu->function.setup = tcm_setup; 2130 + fu->function.disable = tcm_disable; 2131 + fu->function.strings = tcm_strings; 2132 + fu->tpg = the_only_tpg_I_currently_have; 2133 + 2134 + bot_intf_desc.iInterface = tcm_us_strings[USB_G_STR_INT_BBB].id; 2135 + uasp_intf_desc.iInterface = tcm_us_strings[USB_G_STR_INT_UAS].id; 2136 + 2137 + ret = usb_add_function(c, &fu->function); 2138 + if (ret) 2139 + goto err; 2140 + 2141 + return 0; 2142 + err: 2143 + kfree(fu); 2144 + return ret; 2145 + }
+2 -2128
drivers/usb/gadget/legacy/tcm_usb_gadget.c
··· 21 21 #include <target/target_core_fabric.h> 22 22 #include <asm/unaligned.h> 23 23 24 - #include "tcm_usb_gadget.h" 25 - 26 24 USB_GADGET_COMPOSITE_OPTIONS(); 27 25 28 - static inline struct f_uas *to_f_uas(struct usb_function *f) 29 - { 30 - return container_of(f, struct f_uas, function); 31 - } 32 - 33 - static void usbg_cmd_release(struct kref *); 34 - 35 - static inline void usbg_cleanup_cmd(struct usbg_cmd *cmd) 36 - { 37 - kref_put(&cmd->ref, usbg_cmd_release); 38 - } 39 - 40 - /* Start bot.c code */ 41 - 42 - static int bot_enqueue_cmd_cbw(struct f_uas *fu) 43 - { 44 - int ret; 45 - 46 - if (fu->flags & USBG_BOT_CMD_PEND) 47 - return 0; 48 - 49 - ret = usb_ep_queue(fu->ep_out, fu->cmd.req, GFP_ATOMIC); 50 - if (!ret) 51 - fu->flags |= USBG_BOT_CMD_PEND; 52 - return ret; 53 - } 54 - 55 - static void bot_status_complete(struct usb_ep *ep, struct usb_request *req) 56 - { 57 - struct usbg_cmd *cmd = req->context; 58 - struct f_uas *fu = cmd->fu; 59 - 60 - usbg_cleanup_cmd(cmd); 61 - if (req->status < 0) { 62 - pr_err("ERR %s(%d)\n", __func__, __LINE__); 63 - return; 64 - } 65 - 66 - /* CSW completed, wait for next CBW */ 67 - bot_enqueue_cmd_cbw(fu); 68 - } 69 - 70 - static void bot_enqueue_sense_code(struct f_uas *fu, struct usbg_cmd *cmd) 71 - { 72 - struct bulk_cs_wrap *csw = &fu->bot_status.csw; 73 - int ret; 74 - u8 *sense; 75 - unsigned int csw_stat; 76 - 77 - csw_stat = cmd->csw_code; 78 - 79 - /* 80 - * We can't send SENSE as a response. So we take ASC & ASCQ from our 81 - * sense buffer and queue it and hope the host sends a REQUEST_SENSE 82 - * command where it learns why we failed. 83 - */ 84 - sense = cmd->sense_iu.sense; 85 - 86 - csw->Tag = cmd->bot_tag; 87 - csw->Status = csw_stat; 88 - fu->bot_status.req->context = cmd; 89 - ret = usb_ep_queue(fu->ep_in, fu->bot_status.req, GFP_ATOMIC); 90 - if (ret) 91 - pr_err("%s(%d) ERR: %d\n", __func__, __LINE__, ret); 92 - } 93 - 94 - static void bot_err_compl(struct usb_ep *ep, struct usb_request *req) 95 - { 96 - struct usbg_cmd *cmd = req->context; 97 - struct f_uas *fu = cmd->fu; 98 - 99 - if (req->status < 0) 100 - pr_err("ERR %s(%d)\n", __func__, __LINE__); 101 - 102 - if (cmd->data_len) { 103 - if (cmd->data_len > ep->maxpacket) { 104 - req->length = ep->maxpacket; 105 - cmd->data_len -= ep->maxpacket; 106 - } else { 107 - req->length = cmd->data_len; 108 - cmd->data_len = 0; 109 - } 110 - 111 - usb_ep_queue(ep, req, GFP_ATOMIC); 112 - return ; 113 - } 114 - bot_enqueue_sense_code(fu, cmd); 115 - } 116 - 117 - static void bot_send_bad_status(struct usbg_cmd *cmd) 118 - { 119 - struct f_uas *fu = cmd->fu; 120 - struct bulk_cs_wrap *csw = &fu->bot_status.csw; 121 - struct usb_request *req; 122 - struct usb_ep *ep; 123 - 124 - csw->Residue = cpu_to_le32(cmd->data_len); 125 - 126 - if (cmd->data_len) { 127 - if (cmd->is_read) { 128 - ep = fu->ep_in; 129 - req = fu->bot_req_in; 130 - } else { 131 - ep = fu->ep_out; 132 - req = fu->bot_req_out; 133 - } 134 - 135 - if (cmd->data_len > fu->ep_in->maxpacket) { 136 - req->length = ep->maxpacket; 137 - cmd->data_len -= ep->maxpacket; 138 - } else { 139 - req->length = cmd->data_len; 140 - cmd->data_len = 0; 141 - } 142 - req->complete = bot_err_compl; 143 - req->context = cmd; 144 - req->buf = fu->cmd.buf; 145 - usb_ep_queue(ep, req, GFP_KERNEL); 146 - } else { 147 - bot_enqueue_sense_code(fu, cmd); 148 - } 149 - } 150 - 151 - static int bot_send_status(struct usbg_cmd *cmd, bool moved_data) 152 - { 153 - struct f_uas *fu = cmd->fu; 154 - struct bulk_cs_wrap *csw = &fu->bot_status.csw; 155 - int ret; 156 - 157 - if (cmd->se_cmd.scsi_status == SAM_STAT_GOOD) { 158 - if (!moved_data && cmd->data_len) { 159 - /* 160 - * the host wants to move data, we don't. Fill / empty 161 - * the pipe and then send the csw with reside set. 162 - */ 163 - cmd->csw_code = US_BULK_STAT_OK; 164 - bot_send_bad_status(cmd); 165 - return 0; 166 - } 167 - 168 - csw->Tag = cmd->bot_tag; 169 - csw->Residue = cpu_to_le32(0); 170 - csw->Status = US_BULK_STAT_OK; 171 - fu->bot_status.req->context = cmd; 172 - 173 - ret = usb_ep_queue(fu->ep_in, fu->bot_status.req, GFP_KERNEL); 174 - if (ret) 175 - pr_err("%s(%d) ERR: %d\n", __func__, __LINE__, ret); 176 - } else { 177 - cmd->csw_code = US_BULK_STAT_FAIL; 178 - bot_send_bad_status(cmd); 179 - } 180 - return 0; 181 - } 182 - 183 - /* 184 - * Called after command (no data transfer) or after the write (to device) 185 - * operation is completed 186 - */ 187 - static int bot_send_status_response(struct usbg_cmd *cmd) 188 - { 189 - bool moved_data = false; 190 - 191 - if (!cmd->is_read) 192 - moved_data = true; 193 - return bot_send_status(cmd, moved_data); 194 - } 195 - 196 - /* Read request completed, now we have to send the CSW */ 197 - static void bot_read_compl(struct usb_ep *ep, struct usb_request *req) 198 - { 199 - struct usbg_cmd *cmd = req->context; 200 - 201 - if (req->status < 0) 202 - pr_err("ERR %s(%d)\n", __func__, __LINE__); 203 - 204 - bot_send_status(cmd, true); 205 - } 206 - 207 - static int bot_send_read_response(struct usbg_cmd *cmd) 208 - { 209 - struct f_uas *fu = cmd->fu; 210 - struct se_cmd *se_cmd = &cmd->se_cmd; 211 - struct usb_gadget *gadget = fuas_to_gadget(fu); 212 - int ret; 213 - 214 - if (!cmd->data_len) { 215 - cmd->csw_code = US_BULK_STAT_PHASE; 216 - bot_send_bad_status(cmd); 217 - return 0; 218 - } 219 - 220 - if (!gadget->sg_supported) { 221 - cmd->data_buf = kmalloc(se_cmd->data_length, GFP_ATOMIC); 222 - if (!cmd->data_buf) 223 - return -ENOMEM; 224 - 225 - sg_copy_to_buffer(se_cmd->t_data_sg, 226 - se_cmd->t_data_nents, 227 - cmd->data_buf, 228 - se_cmd->data_length); 229 - 230 - fu->bot_req_in->buf = cmd->data_buf; 231 - } else { 232 - fu->bot_req_in->buf = NULL; 233 - fu->bot_req_in->num_sgs = se_cmd->t_data_nents; 234 - fu->bot_req_in->sg = se_cmd->t_data_sg; 235 - } 236 - 237 - fu->bot_req_in->complete = bot_read_compl; 238 - fu->bot_req_in->length = se_cmd->data_length; 239 - fu->bot_req_in->context = cmd; 240 - ret = usb_ep_queue(fu->ep_in, fu->bot_req_in, GFP_ATOMIC); 241 - if (ret) 242 - pr_err("%s(%d)\n", __func__, __LINE__); 243 - return 0; 244 - } 245 - 246 - static void usbg_data_write_cmpl(struct usb_ep *, struct usb_request *); 247 - static int usbg_prepare_w_request(struct usbg_cmd *, struct usb_request *); 248 - 249 - static int bot_send_write_request(struct usbg_cmd *cmd) 250 - { 251 - struct f_uas *fu = cmd->fu; 252 - struct se_cmd *se_cmd = &cmd->se_cmd; 253 - struct usb_gadget *gadget = fuas_to_gadget(fu); 254 - int ret; 255 - 256 - init_completion(&cmd->write_complete); 257 - cmd->fu = fu; 258 - 259 - if (!cmd->data_len) { 260 - cmd->csw_code = US_BULK_STAT_PHASE; 261 - return -EINVAL; 262 - } 263 - 264 - if (!gadget->sg_supported) { 265 - cmd->data_buf = kmalloc(se_cmd->data_length, GFP_KERNEL); 266 - if (!cmd->data_buf) 267 - return -ENOMEM; 268 - 269 - fu->bot_req_out->buf = cmd->data_buf; 270 - } else { 271 - fu->bot_req_out->buf = NULL; 272 - fu->bot_req_out->num_sgs = se_cmd->t_data_nents; 273 - fu->bot_req_out->sg = se_cmd->t_data_sg; 274 - } 275 - 276 - fu->bot_req_out->complete = usbg_data_write_cmpl; 277 - fu->bot_req_out->length = se_cmd->data_length; 278 - fu->bot_req_out->context = cmd; 279 - 280 - ret = usbg_prepare_w_request(cmd, fu->bot_req_out); 281 - if (ret) 282 - goto cleanup; 283 - ret = usb_ep_queue(fu->ep_out, fu->bot_req_out, GFP_KERNEL); 284 - if (ret) 285 - pr_err("%s(%d)\n", __func__, __LINE__); 286 - 287 - wait_for_completion(&cmd->write_complete); 288 - target_execute_cmd(se_cmd); 289 - cleanup: 290 - return ret; 291 - } 292 - 293 - static int bot_submit_command(struct f_uas *, void *, unsigned int); 294 - 295 - static void bot_cmd_complete(struct usb_ep *ep, struct usb_request *req) 296 - { 297 - struct f_uas *fu = req->context; 298 - int ret; 299 - 300 - fu->flags &= ~USBG_BOT_CMD_PEND; 301 - 302 - if (req->status < 0) 303 - return; 304 - 305 - ret = bot_submit_command(fu, req->buf, req->actual); 306 - if (ret) 307 - pr_err("%s(%d): %d\n", __func__, __LINE__, ret); 308 - } 309 - 310 - static int bot_prepare_reqs(struct f_uas *fu) 311 - { 312 - int ret; 313 - 314 - fu->bot_req_in = usb_ep_alloc_request(fu->ep_in, GFP_KERNEL); 315 - if (!fu->bot_req_in) 316 - goto err; 317 - 318 - fu->bot_req_out = usb_ep_alloc_request(fu->ep_out, GFP_KERNEL); 319 - if (!fu->bot_req_out) 320 - goto err_out; 321 - 322 - fu->cmd.req = usb_ep_alloc_request(fu->ep_out, GFP_KERNEL); 323 - if (!fu->cmd.req) 324 - goto err_cmd; 325 - 326 - fu->bot_status.req = usb_ep_alloc_request(fu->ep_in, GFP_KERNEL); 327 - if (!fu->bot_status.req) 328 - goto err_sts; 329 - 330 - fu->bot_status.req->buf = &fu->bot_status.csw; 331 - fu->bot_status.req->length = US_BULK_CS_WRAP_LEN; 332 - fu->bot_status.req->complete = bot_status_complete; 333 - fu->bot_status.csw.Signature = cpu_to_le32(US_BULK_CS_SIGN); 334 - 335 - fu->cmd.buf = kmalloc(fu->ep_out->maxpacket, GFP_KERNEL); 336 - if (!fu->cmd.buf) 337 - goto err_buf; 338 - 339 - fu->cmd.req->complete = bot_cmd_complete; 340 - fu->cmd.req->buf = fu->cmd.buf; 341 - fu->cmd.req->length = fu->ep_out->maxpacket; 342 - fu->cmd.req->context = fu; 343 - 344 - ret = bot_enqueue_cmd_cbw(fu); 345 - if (ret) 346 - goto err_queue; 347 - return 0; 348 - err_queue: 349 - kfree(fu->cmd.buf); 350 - fu->cmd.buf = NULL; 351 - err_buf: 352 - usb_ep_free_request(fu->ep_in, fu->bot_status.req); 353 - err_sts: 354 - usb_ep_free_request(fu->ep_out, fu->cmd.req); 355 - fu->cmd.req = NULL; 356 - err_cmd: 357 - usb_ep_free_request(fu->ep_out, fu->bot_req_out); 358 - fu->bot_req_out = NULL; 359 - err_out: 360 - usb_ep_free_request(fu->ep_in, fu->bot_req_in); 361 - fu->bot_req_in = NULL; 362 - err: 363 - pr_err("BOT: endpoint setup failed\n"); 364 - return -ENOMEM; 365 - } 366 - 367 - static void bot_cleanup_old_alt(struct f_uas *fu) 368 - { 369 - if (!(fu->flags & USBG_ENABLED)) 370 - return; 371 - 372 - usb_ep_disable(fu->ep_in); 373 - usb_ep_disable(fu->ep_out); 374 - 375 - if (!fu->bot_req_in) 376 - return; 377 - 378 - usb_ep_free_request(fu->ep_in, fu->bot_req_in); 379 - usb_ep_free_request(fu->ep_out, fu->bot_req_out); 380 - usb_ep_free_request(fu->ep_out, fu->cmd.req); 381 - usb_ep_free_request(fu->ep_out, fu->bot_status.req); 382 - 383 - kfree(fu->cmd.buf); 384 - 385 - fu->bot_req_in = NULL; 386 - fu->bot_req_out = NULL; 387 - fu->cmd.req = NULL; 388 - fu->bot_status.req = NULL; 389 - fu->cmd.buf = NULL; 390 - } 391 - 392 - static void bot_set_alt(struct f_uas *fu) 393 - { 394 - struct usb_function *f = &fu->function; 395 - struct usb_gadget *gadget = f->config->cdev->gadget; 396 - int ret; 397 - 398 - fu->flags = USBG_IS_BOT; 399 - 400 - config_ep_by_speed(gadget, f, fu->ep_in); 401 - ret = usb_ep_enable(fu->ep_in); 402 - if (ret) 403 - goto err_b_in; 404 - 405 - config_ep_by_speed(gadget, f, fu->ep_out); 406 - ret = usb_ep_enable(fu->ep_out); 407 - if (ret) 408 - goto err_b_out; 409 - 410 - ret = bot_prepare_reqs(fu); 411 - if (ret) 412 - goto err_wq; 413 - fu->flags |= USBG_ENABLED; 414 - pr_info("Using the BOT protocol\n"); 415 - return; 416 - err_wq: 417 - usb_ep_disable(fu->ep_out); 418 - err_b_out: 419 - usb_ep_disable(fu->ep_in); 420 - err_b_in: 421 - fu->flags = USBG_IS_BOT; 422 - } 423 - 424 - static int usbg_bot_setup(struct usb_function *f, 425 - const struct usb_ctrlrequest *ctrl) 426 - { 427 - struct f_uas *fu = to_f_uas(f); 428 - struct usb_composite_dev *cdev = f->config->cdev; 429 - u16 w_value = le16_to_cpu(ctrl->wValue); 430 - u16 w_length = le16_to_cpu(ctrl->wLength); 431 - int luns; 432 - u8 *ret_lun; 433 - 434 - switch (ctrl->bRequest) { 435 - case US_BULK_GET_MAX_LUN: 436 - if (ctrl->bRequestType != (USB_DIR_IN | USB_TYPE_CLASS | 437 - USB_RECIP_INTERFACE)) 438 - return -ENOTSUPP; 439 - 440 - if (w_length < 1) 441 - return -EINVAL; 442 - if (w_value != 0) 443 - return -EINVAL; 444 - luns = atomic_read(&fu->tpg->tpg_port_count); 445 - if (!luns) { 446 - pr_err("No LUNs configured?\n"); 447 - return -EINVAL; 448 - } 449 - /* 450 - * If 4 LUNs are present we return 3 i.e. LUN 0..3 can be 451 - * accessed. The upper limit is 0xf 452 - */ 453 - luns--; 454 - if (luns > 0xf) { 455 - pr_info_once("Limiting the number of luns to 16\n"); 456 - luns = 0xf; 457 - } 458 - ret_lun = cdev->req->buf; 459 - *ret_lun = luns; 460 - cdev->req->length = 1; 461 - return usb_ep_queue(cdev->gadget->ep0, cdev->req, GFP_ATOMIC); 462 - break; 463 - 464 - case US_BULK_RESET_REQUEST: 465 - /* XXX maybe we should remove previous requests for IN + OUT */ 466 - bot_enqueue_cmd_cbw(fu); 467 - return 0; 468 - break; 469 - } 470 - return -ENOTSUPP; 471 - } 472 - 473 - /* Start uas.c code */ 474 - 475 - static void uasp_cleanup_one_stream(struct f_uas *fu, struct uas_stream *stream) 476 - { 477 - /* We have either all three allocated or none */ 478 - if (!stream->req_in) 479 - return; 480 - 481 - usb_ep_free_request(fu->ep_in, stream->req_in); 482 - usb_ep_free_request(fu->ep_out, stream->req_out); 483 - usb_ep_free_request(fu->ep_status, stream->req_status); 484 - 485 - stream->req_in = NULL; 486 - stream->req_out = NULL; 487 - stream->req_status = NULL; 488 - } 489 - 490 - static void uasp_free_cmdreq(struct f_uas *fu) 491 - { 492 - usb_ep_free_request(fu->ep_cmd, fu->cmd.req); 493 - kfree(fu->cmd.buf); 494 - fu->cmd.req = NULL; 495 - fu->cmd.buf = NULL; 496 - } 497 - 498 - static void uasp_cleanup_old_alt(struct f_uas *fu) 499 - { 500 - int i; 501 - 502 - if (!(fu->flags & USBG_ENABLED)) 503 - return; 504 - 505 - usb_ep_disable(fu->ep_in); 506 - usb_ep_disable(fu->ep_out); 507 - usb_ep_disable(fu->ep_status); 508 - usb_ep_disable(fu->ep_cmd); 509 - 510 - for (i = 0; i < UASP_SS_EP_COMP_NUM_STREAMS; i++) 511 - uasp_cleanup_one_stream(fu, &fu->stream[i]); 512 - uasp_free_cmdreq(fu); 513 - } 514 - 515 - static void uasp_status_data_cmpl(struct usb_ep *ep, struct usb_request *req); 516 - 517 - static int uasp_prepare_r_request(struct usbg_cmd *cmd) 518 - { 519 - struct se_cmd *se_cmd = &cmd->se_cmd; 520 - struct f_uas *fu = cmd->fu; 521 - struct usb_gadget *gadget = fuas_to_gadget(fu); 522 - struct uas_stream *stream = cmd->stream; 523 - 524 - if (!gadget->sg_supported) { 525 - cmd->data_buf = kmalloc(se_cmd->data_length, GFP_ATOMIC); 526 - if (!cmd->data_buf) 527 - return -ENOMEM; 528 - 529 - sg_copy_to_buffer(se_cmd->t_data_sg, 530 - se_cmd->t_data_nents, 531 - cmd->data_buf, 532 - se_cmd->data_length); 533 - 534 - stream->req_in->buf = cmd->data_buf; 535 - } else { 536 - stream->req_in->buf = NULL; 537 - stream->req_in->num_sgs = se_cmd->t_data_nents; 538 - stream->req_in->sg = se_cmd->t_data_sg; 539 - } 540 - 541 - stream->req_in->complete = uasp_status_data_cmpl; 542 - stream->req_in->length = se_cmd->data_length; 543 - stream->req_in->context = cmd; 544 - 545 - cmd->state = UASP_SEND_STATUS; 546 - return 0; 547 - } 548 - 549 - static void uasp_prepare_status(struct usbg_cmd *cmd) 550 - { 551 - struct se_cmd *se_cmd = &cmd->se_cmd; 552 - struct sense_iu *iu = &cmd->sense_iu; 553 - struct uas_stream *stream = cmd->stream; 554 - 555 - cmd->state = UASP_QUEUE_COMMAND; 556 - iu->iu_id = IU_ID_STATUS; 557 - iu->tag = cpu_to_be16(cmd->tag); 558 - 559 - /* 560 - * iu->status_qual = cpu_to_be16(STATUS QUALIFIER SAM-4. Where R U?); 561 - */ 562 - iu->len = cpu_to_be16(se_cmd->scsi_sense_length); 563 - iu->status = se_cmd->scsi_status; 564 - stream->req_status->context = cmd; 565 - stream->req_status->length = se_cmd->scsi_sense_length + 16; 566 - stream->req_status->buf = iu; 567 - stream->req_status->complete = uasp_status_data_cmpl; 568 - } 569 - 570 - static void uasp_status_data_cmpl(struct usb_ep *ep, struct usb_request *req) 571 - { 572 - struct usbg_cmd *cmd = req->context; 573 - struct uas_stream *stream = cmd->stream; 574 - struct f_uas *fu = cmd->fu; 575 - int ret; 576 - 577 - if (req->status < 0) 578 - goto cleanup; 579 - 580 - switch (cmd->state) { 581 - case UASP_SEND_DATA: 582 - ret = uasp_prepare_r_request(cmd); 583 - if (ret) 584 - goto cleanup; 585 - ret = usb_ep_queue(fu->ep_in, stream->req_in, GFP_ATOMIC); 586 - if (ret) 587 - pr_err("%s(%d) => %d\n", __func__, __LINE__, ret); 588 - break; 589 - 590 - case UASP_RECEIVE_DATA: 591 - ret = usbg_prepare_w_request(cmd, stream->req_out); 592 - if (ret) 593 - goto cleanup; 594 - ret = usb_ep_queue(fu->ep_out, stream->req_out, GFP_ATOMIC); 595 - if (ret) 596 - pr_err("%s(%d) => %d\n", __func__, __LINE__, ret); 597 - break; 598 - 599 - case UASP_SEND_STATUS: 600 - uasp_prepare_status(cmd); 601 - ret = usb_ep_queue(fu->ep_status, stream->req_status, 602 - GFP_ATOMIC); 603 - if (ret) 604 - pr_err("%s(%d) => %d\n", __func__, __LINE__, ret); 605 - break; 606 - 607 - case UASP_QUEUE_COMMAND: 608 - usbg_cleanup_cmd(cmd); 609 - usb_ep_queue(fu->ep_cmd, fu->cmd.req, GFP_ATOMIC); 610 - break; 611 - 612 - default: 613 - BUG(); 614 - } 615 - return; 616 - 617 - cleanup: 618 - usbg_cleanup_cmd(cmd); 619 - } 620 - 621 - static int uasp_send_status_response(struct usbg_cmd *cmd) 622 - { 623 - struct f_uas *fu = cmd->fu; 624 - struct uas_stream *stream = cmd->stream; 625 - struct sense_iu *iu = &cmd->sense_iu; 626 - 627 - iu->tag = cpu_to_be16(cmd->tag); 628 - stream->req_status->complete = uasp_status_data_cmpl; 629 - stream->req_status->context = cmd; 630 - cmd->fu = fu; 631 - uasp_prepare_status(cmd); 632 - return usb_ep_queue(fu->ep_status, stream->req_status, GFP_ATOMIC); 633 - } 634 - 635 - static int uasp_send_read_response(struct usbg_cmd *cmd) 636 - { 637 - struct f_uas *fu = cmd->fu; 638 - struct uas_stream *stream = cmd->stream; 639 - struct sense_iu *iu = &cmd->sense_iu; 640 - int ret; 641 - 642 - cmd->fu = fu; 643 - 644 - iu->tag = cpu_to_be16(cmd->tag); 645 - if (fu->flags & USBG_USE_STREAMS) { 646 - 647 - ret = uasp_prepare_r_request(cmd); 648 - if (ret) 649 - goto out; 650 - ret = usb_ep_queue(fu->ep_in, stream->req_in, GFP_ATOMIC); 651 - if (ret) { 652 - pr_err("%s(%d) => %d\n", __func__, __LINE__, ret); 653 - kfree(cmd->data_buf); 654 - cmd->data_buf = NULL; 655 - } 656 - 657 - } else { 658 - 659 - iu->iu_id = IU_ID_READ_READY; 660 - iu->tag = cpu_to_be16(cmd->tag); 661 - 662 - stream->req_status->complete = uasp_status_data_cmpl; 663 - stream->req_status->context = cmd; 664 - 665 - cmd->state = UASP_SEND_DATA; 666 - stream->req_status->buf = iu; 667 - stream->req_status->length = sizeof(struct iu); 668 - 669 - ret = usb_ep_queue(fu->ep_status, stream->req_status, 670 - GFP_ATOMIC); 671 - if (ret) 672 - pr_err("%s(%d) => %d\n", __func__, __LINE__, ret); 673 - } 674 - out: 675 - return ret; 676 - } 677 - 678 - static int uasp_send_write_request(struct usbg_cmd *cmd) 679 - { 680 - struct f_uas *fu = cmd->fu; 681 - struct se_cmd *se_cmd = &cmd->se_cmd; 682 - struct uas_stream *stream = cmd->stream; 683 - struct sense_iu *iu = &cmd->sense_iu; 684 - int ret; 685 - 686 - init_completion(&cmd->write_complete); 687 - cmd->fu = fu; 688 - 689 - iu->tag = cpu_to_be16(cmd->tag); 690 - 691 - if (fu->flags & USBG_USE_STREAMS) { 692 - 693 - ret = usbg_prepare_w_request(cmd, stream->req_out); 694 - if (ret) 695 - goto cleanup; 696 - ret = usb_ep_queue(fu->ep_out, stream->req_out, GFP_ATOMIC); 697 - if (ret) 698 - pr_err("%s(%d)\n", __func__, __LINE__); 699 - 700 - } else { 701 - 702 - iu->iu_id = IU_ID_WRITE_READY; 703 - iu->tag = cpu_to_be16(cmd->tag); 704 - 705 - stream->req_status->complete = uasp_status_data_cmpl; 706 - stream->req_status->context = cmd; 707 - 708 - cmd->state = UASP_RECEIVE_DATA; 709 - stream->req_status->buf = iu; 710 - stream->req_status->length = sizeof(struct iu); 711 - 712 - ret = usb_ep_queue(fu->ep_status, stream->req_status, 713 - GFP_ATOMIC); 714 - if (ret) 715 - pr_err("%s(%d)\n", __func__, __LINE__); 716 - } 717 - 718 - wait_for_completion(&cmd->write_complete); 719 - target_execute_cmd(se_cmd); 720 - cleanup: 721 - return ret; 722 - } 723 - 724 - static int usbg_submit_command(struct f_uas *, void *, unsigned int); 725 - 726 - static void uasp_cmd_complete(struct usb_ep *ep, struct usb_request *req) 727 - { 728 - struct f_uas *fu = req->context; 729 - int ret; 730 - 731 - if (req->status < 0) 732 - return; 733 - 734 - ret = usbg_submit_command(fu, req->buf, req->actual); 735 - /* 736 - * Once we tune for performance enqueue the command req here again so 737 - * we can receive a second command while we processing this one. Pay 738 - * attention to properly sync STAUS endpoint with DATA IN + OUT so you 739 - * don't break HS. 740 - */ 741 - if (!ret) 742 - return; 743 - usb_ep_queue(fu->ep_cmd, fu->cmd.req, GFP_ATOMIC); 744 - } 745 - 746 - static int uasp_alloc_stream_res(struct f_uas *fu, struct uas_stream *stream) 747 - { 748 - stream->req_in = usb_ep_alloc_request(fu->ep_in, GFP_KERNEL); 749 - if (!stream->req_in) 750 - goto out; 751 - 752 - stream->req_out = usb_ep_alloc_request(fu->ep_out, GFP_KERNEL); 753 - if (!stream->req_out) 754 - goto err_out; 755 - 756 - stream->req_status = usb_ep_alloc_request(fu->ep_status, GFP_KERNEL); 757 - if (!stream->req_status) 758 - goto err_sts; 759 - 760 - return 0; 761 - err_sts: 762 - usb_ep_free_request(fu->ep_status, stream->req_status); 763 - stream->req_status = NULL; 764 - err_out: 765 - usb_ep_free_request(fu->ep_out, stream->req_out); 766 - stream->req_out = NULL; 767 - out: 768 - return -ENOMEM; 769 - } 770 - 771 - static int uasp_alloc_cmd(struct f_uas *fu) 772 - { 773 - fu->cmd.req = usb_ep_alloc_request(fu->ep_cmd, GFP_KERNEL); 774 - if (!fu->cmd.req) 775 - goto err; 776 - 777 - fu->cmd.buf = kmalloc(fu->ep_cmd->maxpacket, GFP_KERNEL); 778 - if (!fu->cmd.buf) 779 - goto err_buf; 780 - 781 - fu->cmd.req->complete = uasp_cmd_complete; 782 - fu->cmd.req->buf = fu->cmd.buf; 783 - fu->cmd.req->length = fu->ep_cmd->maxpacket; 784 - fu->cmd.req->context = fu; 785 - return 0; 786 - 787 - err_buf: 788 - usb_ep_free_request(fu->ep_cmd, fu->cmd.req); 789 - err: 790 - return -ENOMEM; 791 - } 792 - 793 - static void uasp_setup_stream_res(struct f_uas *fu, int max_streams) 794 - { 795 - int i; 796 - 797 - for (i = 0; i < max_streams; i++) { 798 - struct uas_stream *s = &fu->stream[i]; 799 - 800 - s->req_in->stream_id = i + 1; 801 - s->req_out->stream_id = i + 1; 802 - s->req_status->stream_id = i + 1; 803 - } 804 - } 805 - 806 - static int uasp_prepare_reqs(struct f_uas *fu) 807 - { 808 - int ret; 809 - int i; 810 - int max_streams; 811 - 812 - if (fu->flags & USBG_USE_STREAMS) 813 - max_streams = UASP_SS_EP_COMP_NUM_STREAMS; 814 - else 815 - max_streams = 1; 816 - 817 - for (i = 0; i < max_streams; i++) { 818 - ret = uasp_alloc_stream_res(fu, &fu->stream[i]); 819 - if (ret) 820 - goto err_cleanup; 821 - } 822 - 823 - ret = uasp_alloc_cmd(fu); 824 - if (ret) 825 - goto err_free_stream; 826 - uasp_setup_stream_res(fu, max_streams); 827 - 828 - ret = usb_ep_queue(fu->ep_cmd, fu->cmd.req, GFP_ATOMIC); 829 - if (ret) 830 - goto err_free_stream; 831 - 832 - return 0; 833 - 834 - err_free_stream: 835 - uasp_free_cmdreq(fu); 836 - 837 - err_cleanup: 838 - if (i) { 839 - do { 840 - uasp_cleanup_one_stream(fu, &fu->stream[i - 1]); 841 - i--; 842 - } while (i); 843 - } 844 - pr_err("UASP: endpoint setup failed\n"); 845 - return ret; 846 - } 847 - 848 - static void uasp_set_alt(struct f_uas *fu) 849 - { 850 - struct usb_function *f = &fu->function; 851 - struct usb_gadget *gadget = f->config->cdev->gadget; 852 - int ret; 853 - 854 - fu->flags = USBG_IS_UAS; 855 - 856 - if (gadget->speed == USB_SPEED_SUPER) 857 - fu->flags |= USBG_USE_STREAMS; 858 - 859 - config_ep_by_speed(gadget, f, fu->ep_in); 860 - ret = usb_ep_enable(fu->ep_in); 861 - if (ret) 862 - goto err_b_in; 863 - 864 - config_ep_by_speed(gadget, f, fu->ep_out); 865 - ret = usb_ep_enable(fu->ep_out); 866 - if (ret) 867 - goto err_b_out; 868 - 869 - config_ep_by_speed(gadget, f, fu->ep_cmd); 870 - ret = usb_ep_enable(fu->ep_cmd); 871 - if (ret) 872 - goto err_cmd; 873 - config_ep_by_speed(gadget, f, fu->ep_status); 874 - ret = usb_ep_enable(fu->ep_status); 875 - if (ret) 876 - goto err_status; 877 - 878 - ret = uasp_prepare_reqs(fu); 879 - if (ret) 880 - goto err_wq; 881 - fu->flags |= USBG_ENABLED; 882 - 883 - pr_info("Using the UAS protocol\n"); 884 - return; 885 - err_wq: 886 - usb_ep_disable(fu->ep_status); 887 - err_status: 888 - usb_ep_disable(fu->ep_cmd); 889 - err_cmd: 890 - usb_ep_disable(fu->ep_out); 891 - err_b_out: 892 - usb_ep_disable(fu->ep_in); 893 - err_b_in: 894 - fu->flags = 0; 895 - } 896 - 897 - static int get_cmd_dir(const unsigned char *cdb) 898 - { 899 - int ret; 900 - 901 - switch (cdb[0]) { 902 - case READ_6: 903 - case READ_10: 904 - case READ_12: 905 - case READ_16: 906 - case INQUIRY: 907 - case MODE_SENSE: 908 - case MODE_SENSE_10: 909 - case SERVICE_ACTION_IN_16: 910 - case MAINTENANCE_IN: 911 - case PERSISTENT_RESERVE_IN: 912 - case SECURITY_PROTOCOL_IN: 913 - case ACCESS_CONTROL_IN: 914 - case REPORT_LUNS: 915 - case READ_BLOCK_LIMITS: 916 - case READ_POSITION: 917 - case READ_CAPACITY: 918 - case READ_TOC: 919 - case READ_FORMAT_CAPACITIES: 920 - case REQUEST_SENSE: 921 - ret = DMA_FROM_DEVICE; 922 - break; 923 - 924 - case WRITE_6: 925 - case WRITE_10: 926 - case WRITE_12: 927 - case WRITE_16: 928 - case MODE_SELECT: 929 - case MODE_SELECT_10: 930 - case WRITE_VERIFY: 931 - case WRITE_VERIFY_12: 932 - case PERSISTENT_RESERVE_OUT: 933 - case MAINTENANCE_OUT: 934 - case SECURITY_PROTOCOL_OUT: 935 - case ACCESS_CONTROL_OUT: 936 - ret = DMA_TO_DEVICE; 937 - break; 938 - case ALLOW_MEDIUM_REMOVAL: 939 - case TEST_UNIT_READY: 940 - case SYNCHRONIZE_CACHE: 941 - case START_STOP: 942 - case ERASE: 943 - case REZERO_UNIT: 944 - case SEEK_10: 945 - case SPACE: 946 - case VERIFY: 947 - case WRITE_FILEMARKS: 948 - ret = DMA_NONE; 949 - break; 950 - default: 951 - pr_warn("target: Unknown data direction for SCSI Opcode " 952 - "0x%02x\n", cdb[0]); 953 - ret = -EINVAL; 954 - } 955 - return ret; 956 - } 957 - 958 - static void usbg_data_write_cmpl(struct usb_ep *ep, struct usb_request *req) 959 - { 960 - struct usbg_cmd *cmd = req->context; 961 - struct se_cmd *se_cmd = &cmd->se_cmd; 962 - 963 - if (req->status < 0) { 964 - pr_err("%s() state %d transfer failed\n", __func__, cmd->state); 965 - goto cleanup; 966 - } 967 - 968 - if (req->num_sgs == 0) { 969 - sg_copy_from_buffer(se_cmd->t_data_sg, 970 - se_cmd->t_data_nents, 971 - cmd->data_buf, 972 - se_cmd->data_length); 973 - } 974 - 975 - complete(&cmd->write_complete); 976 - return; 977 - 978 - cleanup: 979 - usbg_cleanup_cmd(cmd); 980 - } 981 - 982 - static int usbg_prepare_w_request(struct usbg_cmd *cmd, struct usb_request *req) 983 - { 984 - struct se_cmd *se_cmd = &cmd->se_cmd; 985 - struct f_uas *fu = cmd->fu; 986 - struct usb_gadget *gadget = fuas_to_gadget(fu); 987 - 988 - if (!gadget->sg_supported) { 989 - cmd->data_buf = kmalloc(se_cmd->data_length, GFP_ATOMIC); 990 - if (!cmd->data_buf) 991 - return -ENOMEM; 992 - 993 - req->buf = cmd->data_buf; 994 - } else { 995 - req->buf = NULL; 996 - req->num_sgs = se_cmd->t_data_nents; 997 - req->sg = se_cmd->t_data_sg; 998 - } 999 - 1000 - req->complete = usbg_data_write_cmpl; 1001 - req->length = se_cmd->data_length; 1002 - req->context = cmd; 1003 - return 0; 1004 - } 1005 - 1006 - static int usbg_send_status_response(struct se_cmd *se_cmd) 1007 - { 1008 - struct usbg_cmd *cmd = container_of(se_cmd, struct usbg_cmd, 1009 - se_cmd); 1010 - struct f_uas *fu = cmd->fu; 1011 - 1012 - if (fu->flags & USBG_IS_BOT) 1013 - return bot_send_status_response(cmd); 1014 - else 1015 - return uasp_send_status_response(cmd); 1016 - } 1017 - 1018 - static int usbg_send_write_request(struct se_cmd *se_cmd) 1019 - { 1020 - struct usbg_cmd *cmd = container_of(se_cmd, struct usbg_cmd, 1021 - se_cmd); 1022 - struct f_uas *fu = cmd->fu; 1023 - 1024 - if (fu->flags & USBG_IS_BOT) 1025 - return bot_send_write_request(cmd); 1026 - else 1027 - return uasp_send_write_request(cmd); 1028 - } 1029 - 1030 - static int usbg_send_read_response(struct se_cmd *se_cmd) 1031 - { 1032 - struct usbg_cmd *cmd = container_of(se_cmd, struct usbg_cmd, 1033 - se_cmd); 1034 - struct f_uas *fu = cmd->fu; 1035 - 1036 - if (fu->flags & USBG_IS_BOT) 1037 - return bot_send_read_response(cmd); 1038 - else 1039 - return uasp_send_read_response(cmd); 1040 - } 1041 - 1042 - static void usbg_cmd_work(struct work_struct *work) 1043 - { 1044 - struct usbg_cmd *cmd = container_of(work, struct usbg_cmd, work); 1045 - struct se_cmd *se_cmd; 1046 - struct tcm_usbg_nexus *tv_nexus; 1047 - struct usbg_tpg *tpg; 1048 - int dir; 1049 - 1050 - se_cmd = &cmd->se_cmd; 1051 - tpg = cmd->fu->tpg; 1052 - tv_nexus = tpg->tpg_nexus; 1053 - dir = get_cmd_dir(cmd->cmd_buf); 1054 - if (dir < 0) { 1055 - transport_init_se_cmd(se_cmd, 1056 - tv_nexus->tvn_se_sess->se_tpg->se_tpg_tfo, 1057 - tv_nexus->tvn_se_sess, cmd->data_len, DMA_NONE, 1058 - cmd->prio_attr, cmd->sense_iu.sense); 1059 - goto out; 1060 - } 1061 - 1062 - if (target_submit_cmd(se_cmd, tv_nexus->tvn_se_sess, 1063 - cmd->cmd_buf, cmd->sense_iu.sense, cmd->unpacked_lun, 1064 - 0, cmd->prio_attr, dir, TARGET_SCF_UNKNOWN_SIZE) < 0) 1065 - goto out; 1066 - 1067 - return; 1068 - 1069 - out: 1070 - transport_send_check_condition_and_sense(se_cmd, 1071 - TCM_UNSUPPORTED_SCSI_OPCODE, 1); 1072 - usbg_cleanup_cmd(cmd); 1073 - } 1074 - 1075 - static int usbg_submit_command(struct f_uas *fu, 1076 - void *cmdbuf, unsigned int len) 1077 - { 1078 - struct command_iu *cmd_iu = cmdbuf; 1079 - struct usbg_cmd *cmd; 1080 - struct usbg_tpg *tpg; 1081 - struct se_cmd *se_cmd; 1082 - struct tcm_usbg_nexus *tv_nexus; 1083 - u32 cmd_len; 1084 - int ret; 1085 - 1086 - if (cmd_iu->iu_id != IU_ID_COMMAND) { 1087 - pr_err("Unsupported type %d\n", cmd_iu->iu_id); 1088 - return -EINVAL; 1089 - } 1090 - 1091 - cmd = kzalloc(sizeof *cmd, GFP_ATOMIC); 1092 - if (!cmd) 1093 - return -ENOMEM; 1094 - 1095 - cmd->fu = fu; 1096 - 1097 - /* XXX until I figure out why I can't free in on complete */ 1098 - kref_init(&cmd->ref); 1099 - kref_get(&cmd->ref); 1100 - 1101 - tpg = fu->tpg; 1102 - cmd_len = (cmd_iu->len & ~0x3) + 16; 1103 - if (cmd_len > USBG_MAX_CMD) 1104 - goto err; 1105 - 1106 - memcpy(cmd->cmd_buf, cmd_iu->cdb, cmd_len); 1107 - 1108 - cmd->tag = be16_to_cpup(&cmd_iu->tag); 1109 - cmd->se_cmd.tag = cmd->tag; 1110 - if (fu->flags & USBG_USE_STREAMS) { 1111 - if (cmd->tag > UASP_SS_EP_COMP_NUM_STREAMS) 1112 - goto err; 1113 - if (!cmd->tag) 1114 - cmd->stream = &fu->stream[0]; 1115 - else 1116 - cmd->stream = &fu->stream[cmd->tag - 1]; 1117 - } else { 1118 - cmd->stream = &fu->stream[0]; 1119 - } 1120 - 1121 - tv_nexus = tpg->tpg_nexus; 1122 - if (!tv_nexus) { 1123 - pr_err("Missing nexus, ignoring command\n"); 1124 - goto err; 1125 - } 1126 - 1127 - switch (cmd_iu->prio_attr & 0x7) { 1128 - case UAS_HEAD_TAG: 1129 - cmd->prio_attr = TCM_HEAD_TAG; 1130 - break; 1131 - case UAS_ORDERED_TAG: 1132 - cmd->prio_attr = TCM_ORDERED_TAG; 1133 - break; 1134 - case UAS_ACA: 1135 - cmd->prio_attr = TCM_ACA_TAG; 1136 - break; 1137 - default: 1138 - pr_debug_once("Unsupported prio_attr: %02x.\n", 1139 - cmd_iu->prio_attr); 1140 - case UAS_SIMPLE_TAG: 1141 - cmd->prio_attr = TCM_SIMPLE_TAG; 1142 - break; 1143 - } 1144 - 1145 - se_cmd = &cmd->se_cmd; 1146 - cmd->unpacked_lun = scsilun_to_int(&cmd_iu->lun); 1147 - 1148 - INIT_WORK(&cmd->work, usbg_cmd_work); 1149 - ret = queue_work(tpg->workqueue, &cmd->work); 1150 - if (ret < 0) 1151 - goto err; 1152 - 1153 - return 0; 1154 - err: 1155 - kfree(cmd); 1156 - return -EINVAL; 1157 - } 1158 - 1159 - static void bot_cmd_work(struct work_struct *work) 1160 - { 1161 - struct usbg_cmd *cmd = container_of(work, struct usbg_cmd, work); 1162 - struct se_cmd *se_cmd; 1163 - struct tcm_usbg_nexus *tv_nexus; 1164 - struct usbg_tpg *tpg; 1165 - int dir; 1166 - 1167 - se_cmd = &cmd->se_cmd; 1168 - tpg = cmd->fu->tpg; 1169 - tv_nexus = tpg->tpg_nexus; 1170 - dir = get_cmd_dir(cmd->cmd_buf); 1171 - if (dir < 0) { 1172 - transport_init_se_cmd(se_cmd, 1173 - tv_nexus->tvn_se_sess->se_tpg->se_tpg_tfo, 1174 - tv_nexus->tvn_se_sess, cmd->data_len, DMA_NONE, 1175 - cmd->prio_attr, cmd->sense_iu.sense); 1176 - goto out; 1177 - } 1178 - 1179 - if (target_submit_cmd(se_cmd, tv_nexus->tvn_se_sess, 1180 - cmd->cmd_buf, cmd->sense_iu.sense, cmd->unpacked_lun, 1181 - cmd->data_len, cmd->prio_attr, dir, 0) < 0) 1182 - goto out; 1183 - 1184 - return; 1185 - 1186 - out: 1187 - transport_send_check_condition_and_sense(se_cmd, 1188 - TCM_UNSUPPORTED_SCSI_OPCODE, 1); 1189 - usbg_cleanup_cmd(cmd); 1190 - } 1191 - 1192 - static int bot_submit_command(struct f_uas *fu, 1193 - void *cmdbuf, unsigned int len) 1194 - { 1195 - struct bulk_cb_wrap *cbw = cmdbuf; 1196 - struct usbg_cmd *cmd; 1197 - struct usbg_tpg *tpg; 1198 - struct se_cmd *se_cmd; 1199 - struct tcm_usbg_nexus *tv_nexus; 1200 - u32 cmd_len; 1201 - int ret; 1202 - 1203 - if (cbw->Signature != cpu_to_le32(US_BULK_CB_SIGN)) { 1204 - pr_err("Wrong signature on CBW\n"); 1205 - return -EINVAL; 1206 - } 1207 - if (len != 31) { 1208 - pr_err("Wrong length for CBW\n"); 1209 - return -EINVAL; 1210 - } 1211 - 1212 - cmd_len = cbw->Length; 1213 - if (cmd_len < 1 || cmd_len > 16) 1214 - return -EINVAL; 1215 - 1216 - cmd = kzalloc(sizeof *cmd, GFP_ATOMIC); 1217 - if (!cmd) 1218 - return -ENOMEM; 1219 - 1220 - cmd->fu = fu; 1221 - 1222 - /* XXX until I figure out why I can't free in on complete */ 1223 - kref_init(&cmd->ref); 1224 - kref_get(&cmd->ref); 1225 - 1226 - tpg = fu->tpg; 1227 - 1228 - memcpy(cmd->cmd_buf, cbw->CDB, cmd_len); 1229 - 1230 - cmd->bot_tag = cbw->Tag; 1231 - 1232 - tv_nexus = tpg->tpg_nexus; 1233 - if (!tv_nexus) { 1234 - pr_err("Missing nexus, ignoring command\n"); 1235 - goto err; 1236 - } 1237 - 1238 - cmd->prio_attr = TCM_SIMPLE_TAG; 1239 - se_cmd = &cmd->se_cmd; 1240 - cmd->unpacked_lun = cbw->Lun; 1241 - cmd->is_read = cbw->Flags & US_BULK_FLAG_IN ? 1 : 0; 1242 - cmd->data_len = le32_to_cpu(cbw->DataTransferLength); 1243 - cmd->se_cmd.tag = le32_to_cpu(cmd->bot_tag); 1244 - 1245 - INIT_WORK(&cmd->work, bot_cmd_work); 1246 - ret = queue_work(tpg->workqueue, &cmd->work); 1247 - if (ret < 0) 1248 - goto err; 1249 - 1250 - return 0; 1251 - err: 1252 - kfree(cmd); 1253 - return -EINVAL; 1254 - } 1255 - 1256 - /* Start fabric.c code */ 1257 - 1258 - static int usbg_check_true(struct se_portal_group *se_tpg) 1259 - { 1260 - return 1; 1261 - } 1262 - 1263 - static int usbg_check_false(struct se_portal_group *se_tpg) 1264 - { 1265 - return 0; 1266 - } 1267 - 1268 - static char *usbg_get_fabric_name(void) 1269 - { 1270 - return "usb_gadget"; 1271 - } 1272 - 1273 - static char *usbg_get_fabric_wwn(struct se_portal_group *se_tpg) 1274 - { 1275 - struct usbg_tpg *tpg = container_of(se_tpg, 1276 - struct usbg_tpg, se_tpg); 1277 - struct usbg_tport *tport = tpg->tport; 1278 - 1279 - return &tport->tport_name[0]; 1280 - } 1281 - 1282 - static u16 usbg_get_tag(struct se_portal_group *se_tpg) 1283 - { 1284 - struct usbg_tpg *tpg = container_of(se_tpg, 1285 - struct usbg_tpg, se_tpg); 1286 - return tpg->tport_tpgt; 1287 - } 1288 - 1289 - static u32 usbg_tpg_get_inst_index(struct se_portal_group *se_tpg) 1290 - { 1291 - return 1; 1292 - } 1293 - 1294 - static void usbg_cmd_release(struct kref *ref) 1295 - { 1296 - struct usbg_cmd *cmd = container_of(ref, struct usbg_cmd, 1297 - ref); 1298 - 1299 - transport_generic_free_cmd(&cmd->se_cmd, 0); 1300 - } 1301 - 1302 - static void usbg_release_cmd(struct se_cmd *se_cmd) 1303 - { 1304 - struct usbg_cmd *cmd = container_of(se_cmd, struct usbg_cmd, 1305 - se_cmd); 1306 - kfree(cmd->data_buf); 1307 - kfree(cmd); 1308 - return; 1309 - } 1310 - 1311 - static int usbg_shutdown_session(struct se_session *se_sess) 1312 - { 1313 - return 0; 1314 - } 1315 - 1316 - static void usbg_close_session(struct se_session *se_sess) 1317 - { 1318 - return; 1319 - } 1320 - 1321 - static u32 usbg_sess_get_index(struct se_session *se_sess) 1322 - { 1323 - return 0; 1324 - } 1325 - 1326 - /* 1327 - * XXX Error recovery: return != 0 if we expect writes. Dunno when that could be 1328 - */ 1329 - static int usbg_write_pending_status(struct se_cmd *se_cmd) 1330 - { 1331 - return 0; 1332 - } 1333 - 1334 - static void usbg_set_default_node_attrs(struct se_node_acl *nacl) 1335 - { 1336 - return; 1337 - } 1338 - 1339 - static int usbg_get_cmd_state(struct se_cmd *se_cmd) 1340 - { 1341 - return 0; 1342 - } 1343 - 1344 - static void usbg_queue_tm_rsp(struct se_cmd *se_cmd) 1345 - { 1346 - } 1347 - 1348 - static void usbg_aborted_task(struct se_cmd *se_cmd) 1349 - { 1350 - return; 1351 - } 1352 - 1353 - static const char *usbg_check_wwn(const char *name) 1354 - { 1355 - const char *n; 1356 - unsigned int len; 1357 - 1358 - n = strstr(name, "naa."); 1359 - if (!n) 1360 - return NULL; 1361 - n += 4; 1362 - len = strlen(n); 1363 - if (len == 0 || len > USBG_NAMELEN - 1) 1364 - return NULL; 1365 - return n; 1366 - } 1367 - 1368 - static int usbg_init_nodeacl(struct se_node_acl *se_nacl, const char *name) 1369 - { 1370 - if (!usbg_check_wwn(name)) 1371 - return -EINVAL; 1372 - return 0; 1373 - } 1374 - 1375 - struct usbg_tpg *the_only_tpg_I_currently_have; 1376 - 1377 - static struct se_portal_group *usbg_make_tpg( 1378 - struct se_wwn *wwn, 1379 - struct config_group *group, 1380 - const char *name) 1381 - { 1382 - struct usbg_tport *tport = container_of(wwn, struct usbg_tport, 1383 - tport_wwn); 1384 - struct usbg_tpg *tpg; 1385 - unsigned long tpgt; 1386 - int ret; 1387 - 1388 - if (strstr(name, "tpgt_") != name) 1389 - return ERR_PTR(-EINVAL); 1390 - if (kstrtoul(name + 5, 0, &tpgt) || tpgt > UINT_MAX) 1391 - return ERR_PTR(-EINVAL); 1392 - if (the_only_tpg_I_currently_have) { 1393 - pr_err("Until the gadget framework can't handle multiple\n"); 1394 - pr_err("gadgets, you can't do this here.\n"); 1395 - return ERR_PTR(-EBUSY); 1396 - } 1397 - 1398 - tpg = kzalloc(sizeof(struct usbg_tpg), GFP_KERNEL); 1399 - if (!tpg) 1400 - return ERR_PTR(-ENOMEM); 1401 - mutex_init(&tpg->tpg_mutex); 1402 - atomic_set(&tpg->tpg_port_count, 0); 1403 - tpg->workqueue = alloc_workqueue("tcm_usb_gadget", 0, 1); 1404 - if (!tpg->workqueue) { 1405 - kfree(tpg); 1406 - return NULL; 1407 - } 1408 - 1409 - tpg->tport = tport; 1410 - tpg->tport_tpgt = tpgt; 1411 - 1412 - /* 1413 - * SPC doesn't assign a protocol identifier for USB-SCSI, so we 1414 - * pretend to be SAS.. 1415 - */ 1416 - ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_SAS); 1417 - if (ret < 0) { 1418 - destroy_workqueue(tpg->workqueue); 1419 - kfree(tpg); 1420 - return NULL; 1421 - } 1422 - the_only_tpg_I_currently_have = tpg; 1423 - return &tpg->se_tpg; 1424 - } 1425 - 1426 - static int tcm_usbg_drop_nexus(struct usbg_tpg *); 1427 - 1428 - static void usbg_drop_tpg(struct se_portal_group *se_tpg) 1429 - { 1430 - struct usbg_tpg *tpg = container_of(se_tpg, 1431 - struct usbg_tpg, se_tpg); 1432 - 1433 - tcm_usbg_drop_nexus(tpg); 1434 - core_tpg_deregister(se_tpg); 1435 - destroy_workqueue(tpg->workqueue); 1436 - kfree(tpg); 1437 - the_only_tpg_I_currently_have = NULL; 1438 - } 1439 - 1440 - static struct se_wwn *usbg_make_tport( 1441 - struct target_fabric_configfs *tf, 1442 - struct config_group *group, 1443 - const char *name) 1444 - { 1445 - struct usbg_tport *tport; 1446 - const char *wnn_name; 1447 - u64 wwpn = 0; 1448 - 1449 - wnn_name = usbg_check_wwn(name); 1450 - if (!wnn_name) 1451 - return ERR_PTR(-EINVAL); 1452 - 1453 - tport = kzalloc(sizeof(struct usbg_tport), GFP_KERNEL); 1454 - if (!(tport)) 1455 - return ERR_PTR(-ENOMEM); 1456 - tport->tport_wwpn = wwpn; 1457 - snprintf(tport->tport_name, sizeof(tport->tport_name), "%s", wnn_name); 1458 - return &tport->tport_wwn; 1459 - } 1460 - 1461 - static void usbg_drop_tport(struct se_wwn *wwn) 1462 - { 1463 - struct usbg_tport *tport = container_of(wwn, 1464 - struct usbg_tport, tport_wwn); 1465 - kfree(tport); 1466 - } 1467 - 1468 - /* 1469 - * If somebody feels like dropping the version property, go ahead. 1470 - */ 1471 - static ssize_t usbg_wwn_version_show(struct config_item *item, char *page) 1472 - { 1473 - return sprintf(page, "usb-gadget fabric module\n"); 1474 - } 1475 - 1476 - CONFIGFS_ATTR_RO(usbg_wwn_, version); 1477 - 1478 - static struct configfs_attribute *usbg_wwn_attrs[] = { 1479 - &usbg_wwn_attr_version, 1480 - NULL, 1481 - }; 1482 - 1483 - static ssize_t tcm_usbg_tpg_enable_show(struct config_item *item, char *page) 1484 - { 1485 - struct se_portal_group *se_tpg = to_tpg(item); 1486 - struct usbg_tpg *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg); 1487 - 1488 - return snprintf(page, PAGE_SIZE, "%u\n", tpg->gadget_connect); 1489 - } 1490 - 1491 - static int usbg_attach(struct usbg_tpg *); 1492 - static void usbg_detach(struct usbg_tpg *); 1493 - 1494 - static ssize_t tcm_usbg_tpg_enable_store(struct config_item *item, 1495 - const char *page, size_t count) 1496 - { 1497 - struct se_portal_group *se_tpg = to_tpg(item); 1498 - struct usbg_tpg *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg); 1499 - bool op; 1500 - ssize_t ret; 1501 - 1502 - ret = strtobool(page, &op); 1503 - if (ret) 1504 - return ret; 1505 - 1506 - if ((op && tpg->gadget_connect) || (!op && !tpg->gadget_connect)) 1507 - return -EINVAL; 1508 - 1509 - if (op) 1510 - ret = usbg_attach(tpg); 1511 - else 1512 - usbg_detach(tpg); 1513 - if (ret) 1514 - return ret; 1515 - 1516 - tpg->gadget_connect = op; 1517 - 1518 - return count; 1519 - } 1520 - 1521 - static ssize_t tcm_usbg_tpg_nexus_show(struct config_item *item, char *page) 1522 - { 1523 - struct se_portal_group *se_tpg = to_tpg(item); 1524 - struct usbg_tpg *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg); 1525 - struct tcm_usbg_nexus *tv_nexus; 1526 - ssize_t ret; 1527 - 1528 - mutex_lock(&tpg->tpg_mutex); 1529 - tv_nexus = tpg->tpg_nexus; 1530 - if (!tv_nexus) { 1531 - ret = -ENODEV; 1532 - goto out; 1533 - } 1534 - ret = snprintf(page, PAGE_SIZE, "%s\n", 1535 - tv_nexus->tvn_se_sess->se_node_acl->initiatorname); 1536 - out: 1537 - mutex_unlock(&tpg->tpg_mutex); 1538 - return ret; 1539 - } 1540 - 1541 - static int tcm_usbg_make_nexus(struct usbg_tpg *tpg, char *name) 1542 - { 1543 - struct se_portal_group *se_tpg; 1544 - struct tcm_usbg_nexus *tv_nexus; 1545 - int ret; 1546 - 1547 - mutex_lock(&tpg->tpg_mutex); 1548 - if (tpg->tpg_nexus) { 1549 - ret = -EEXIST; 1550 - pr_debug("tpg->tpg_nexus already exists\n"); 1551 - goto err_unlock; 1552 - } 1553 - se_tpg = &tpg->se_tpg; 1554 - 1555 - ret = -ENOMEM; 1556 - tv_nexus = kzalloc(sizeof(*tv_nexus), GFP_KERNEL); 1557 - if (!tv_nexus) 1558 - goto err_unlock; 1559 - tv_nexus->tvn_se_sess = transport_init_session(TARGET_PROT_NORMAL); 1560 - if (IS_ERR(tv_nexus->tvn_se_sess)) 1561 - goto err_free; 1562 - 1563 - /* 1564 - * Since we are running in 'demo mode' this call with generate a 1565 - * struct se_node_acl for the tcm_vhost struct se_portal_group with 1566 - * the SCSI Initiator port name of the passed configfs group 'name'. 1567 - */ 1568 - tv_nexus->tvn_se_sess->se_node_acl = core_tpg_check_initiator_node_acl( 1569 - se_tpg, name); 1570 - if (!tv_nexus->tvn_se_sess->se_node_acl) { 1571 - pr_debug("core_tpg_check_initiator_node_acl() failed" 1572 - " for %s\n", name); 1573 - goto err_session; 1574 - } 1575 - /* 1576 - * Now register the TCM vHost virtual I_T Nexus as active. 1577 - */ 1578 - transport_register_session(se_tpg, tv_nexus->tvn_se_sess->se_node_acl, 1579 - tv_nexus->tvn_se_sess, tv_nexus); 1580 - tpg->tpg_nexus = tv_nexus; 1581 - mutex_unlock(&tpg->tpg_mutex); 1582 - return 0; 1583 - 1584 - err_session: 1585 - transport_free_session(tv_nexus->tvn_se_sess); 1586 - err_free: 1587 - kfree(tv_nexus); 1588 - err_unlock: 1589 - mutex_unlock(&tpg->tpg_mutex); 1590 - return ret; 1591 - } 1592 - 1593 - static int tcm_usbg_drop_nexus(struct usbg_tpg *tpg) 1594 - { 1595 - struct se_session *se_sess; 1596 - struct tcm_usbg_nexus *tv_nexus; 1597 - int ret = -ENODEV; 1598 - 1599 - mutex_lock(&tpg->tpg_mutex); 1600 - tv_nexus = tpg->tpg_nexus; 1601 - if (!tv_nexus) 1602 - goto out; 1603 - 1604 - se_sess = tv_nexus->tvn_se_sess; 1605 - if (!se_sess) 1606 - goto out; 1607 - 1608 - if (atomic_read(&tpg->tpg_port_count)) { 1609 - ret = -EPERM; 1610 - pr_err("Unable to remove Host I_T Nexus with" 1611 - " active TPG port count: %d\n", 1612 - atomic_read(&tpg->tpg_port_count)); 1613 - goto out; 1614 - } 1615 - 1616 - pr_debug("Removing I_T Nexus to Initiator Port: %s\n", 1617 - tv_nexus->tvn_se_sess->se_node_acl->initiatorname); 1618 - /* 1619 - * Release the SCSI I_T Nexus to the emulated vHost Target Port 1620 - */ 1621 - transport_deregister_session(tv_nexus->tvn_se_sess); 1622 - tpg->tpg_nexus = NULL; 1623 - 1624 - kfree(tv_nexus); 1625 - ret = 0; 1626 - out: 1627 - mutex_unlock(&tpg->tpg_mutex); 1628 - return ret; 1629 - } 1630 - 1631 - static ssize_t tcm_usbg_tpg_nexus_store(struct config_item *item, 1632 - const char *page, size_t count) 1633 - { 1634 - struct se_portal_group *se_tpg = to_tpg(item); 1635 - struct usbg_tpg *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg); 1636 - unsigned char i_port[USBG_NAMELEN], *ptr; 1637 - int ret; 1638 - 1639 - if (!strncmp(page, "NULL", 4)) { 1640 - ret = tcm_usbg_drop_nexus(tpg); 1641 - return (!ret) ? count : ret; 1642 - } 1643 - if (strlen(page) >= USBG_NAMELEN) { 1644 - pr_err("Emulated NAA Sas Address: %s, exceeds" 1645 - " max: %d\n", page, USBG_NAMELEN); 1646 - return -EINVAL; 1647 - } 1648 - snprintf(i_port, USBG_NAMELEN, "%s", page); 1649 - 1650 - ptr = strstr(i_port, "naa."); 1651 - if (!ptr) { 1652 - pr_err("Missing 'naa.' prefix\n"); 1653 - return -EINVAL; 1654 - } 1655 - 1656 - if (i_port[strlen(i_port) - 1] == '\n') 1657 - i_port[strlen(i_port) - 1] = '\0'; 1658 - 1659 - ret = tcm_usbg_make_nexus(tpg, &i_port[0]); 1660 - if (ret < 0) 1661 - return ret; 1662 - return count; 1663 - } 1664 - 1665 - CONFIGFS_ATTR(tcm_usbg_tpg_, enable); 1666 - CONFIGFS_ATTR(tcm_usbg_tpg_, nexus); 1667 - 1668 - static struct configfs_attribute *usbg_base_attrs[] = { 1669 - &tcm_usbg_tpg_attr_enable, 1670 - &tcm_usbg_tpg_attr_nexus, 1671 - NULL, 1672 - }; 1673 - 1674 - static int usbg_port_link(struct se_portal_group *se_tpg, struct se_lun *lun) 1675 - { 1676 - struct usbg_tpg *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg); 1677 - 1678 - atomic_inc(&tpg->tpg_port_count); 1679 - smp_mb__after_atomic(); 1680 - return 0; 1681 - } 1682 - 1683 - static void usbg_port_unlink(struct se_portal_group *se_tpg, 1684 - struct se_lun *se_lun) 1685 - { 1686 - struct usbg_tpg *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg); 1687 - 1688 - atomic_dec(&tpg->tpg_port_count); 1689 - smp_mb__after_atomic(); 1690 - } 1691 - 1692 - static int usbg_check_stop_free(struct se_cmd *se_cmd) 1693 - { 1694 - struct usbg_cmd *cmd = container_of(se_cmd, struct usbg_cmd, 1695 - se_cmd); 1696 - 1697 - kref_put(&cmd->ref, usbg_cmd_release); 1698 - return 1; 1699 - } 1700 - 1701 - static const struct target_core_fabric_ops usbg_ops = { 1702 - .module = THIS_MODULE, 1703 - .name = "usb_gadget", 1704 - .get_fabric_name = usbg_get_fabric_name, 1705 - .tpg_get_wwn = usbg_get_fabric_wwn, 1706 - .tpg_get_tag = usbg_get_tag, 1707 - .tpg_check_demo_mode = usbg_check_true, 1708 - .tpg_check_demo_mode_cache = usbg_check_false, 1709 - .tpg_check_demo_mode_write_protect = usbg_check_false, 1710 - .tpg_check_prod_mode_write_protect = usbg_check_false, 1711 - .tpg_get_inst_index = usbg_tpg_get_inst_index, 1712 - .release_cmd = usbg_release_cmd, 1713 - .shutdown_session = usbg_shutdown_session, 1714 - .close_session = usbg_close_session, 1715 - .sess_get_index = usbg_sess_get_index, 1716 - .sess_get_initiator_sid = NULL, 1717 - .write_pending = usbg_send_write_request, 1718 - .write_pending_status = usbg_write_pending_status, 1719 - .set_default_node_attributes = usbg_set_default_node_attrs, 1720 - .get_cmd_state = usbg_get_cmd_state, 1721 - .queue_data_in = usbg_send_read_response, 1722 - .queue_status = usbg_send_status_response, 1723 - .queue_tm_rsp = usbg_queue_tm_rsp, 1724 - .aborted_task = usbg_aborted_task, 1725 - .check_stop_free = usbg_check_stop_free, 1726 - 1727 - .fabric_make_wwn = usbg_make_tport, 1728 - .fabric_drop_wwn = usbg_drop_tport, 1729 - .fabric_make_tpg = usbg_make_tpg, 1730 - .fabric_drop_tpg = usbg_drop_tpg, 1731 - .fabric_post_link = usbg_port_link, 1732 - .fabric_pre_unlink = usbg_port_unlink, 1733 - .fabric_init_nodeacl = usbg_init_nodeacl, 1734 - 1735 - .tfc_wwn_attrs = usbg_wwn_attrs, 1736 - .tfc_tpg_base_attrs = usbg_base_attrs, 1737 - }; 1738 - 1739 - /* Start gadget.c code */ 1740 - 1741 - static struct usb_interface_descriptor bot_intf_desc = { 1742 - .bLength = sizeof(bot_intf_desc), 1743 - .bDescriptorType = USB_DT_INTERFACE, 1744 - .bNumEndpoints = 2, 1745 - .bAlternateSetting = USB_G_ALT_INT_BBB, 1746 - .bInterfaceClass = USB_CLASS_MASS_STORAGE, 1747 - .bInterfaceSubClass = USB_SC_SCSI, 1748 - .bInterfaceProtocol = USB_PR_BULK, 1749 - }; 1750 - 1751 - static struct usb_interface_descriptor uasp_intf_desc = { 1752 - .bLength = sizeof(uasp_intf_desc), 1753 - .bDescriptorType = USB_DT_INTERFACE, 1754 - .bNumEndpoints = 4, 1755 - .bAlternateSetting = USB_G_ALT_INT_UAS, 1756 - .bInterfaceClass = USB_CLASS_MASS_STORAGE, 1757 - .bInterfaceSubClass = USB_SC_SCSI, 1758 - .bInterfaceProtocol = USB_PR_UAS, 1759 - }; 1760 - 1761 - static struct usb_endpoint_descriptor uasp_bi_desc = { 1762 - .bLength = USB_DT_ENDPOINT_SIZE, 1763 - .bDescriptorType = USB_DT_ENDPOINT, 1764 - .bEndpointAddress = USB_DIR_IN, 1765 - .bmAttributes = USB_ENDPOINT_XFER_BULK, 1766 - .wMaxPacketSize = cpu_to_le16(512), 1767 - }; 1768 - 1769 - static struct usb_endpoint_descriptor uasp_fs_bi_desc = { 1770 - .bLength = USB_DT_ENDPOINT_SIZE, 1771 - .bDescriptorType = USB_DT_ENDPOINT, 1772 - .bEndpointAddress = USB_DIR_IN, 1773 - .bmAttributes = USB_ENDPOINT_XFER_BULK, 1774 - }; 1775 - 1776 - static struct usb_pipe_usage_descriptor uasp_bi_pipe_desc = { 1777 - .bLength = sizeof(uasp_bi_pipe_desc), 1778 - .bDescriptorType = USB_DT_PIPE_USAGE, 1779 - .bPipeID = DATA_IN_PIPE_ID, 1780 - }; 1781 - 1782 - static struct usb_endpoint_descriptor uasp_ss_bi_desc = { 1783 - .bLength = USB_DT_ENDPOINT_SIZE, 1784 - .bDescriptorType = USB_DT_ENDPOINT, 1785 - .bEndpointAddress = USB_DIR_IN, 1786 - .bmAttributes = USB_ENDPOINT_XFER_BULK, 1787 - .wMaxPacketSize = cpu_to_le16(1024), 1788 - }; 1789 - 1790 - static struct usb_ss_ep_comp_descriptor uasp_bi_ep_comp_desc = { 1791 - .bLength = sizeof(uasp_bi_ep_comp_desc), 1792 - .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 1793 - .bMaxBurst = 0, 1794 - .bmAttributes = UASP_SS_EP_COMP_LOG_STREAMS, 1795 - .wBytesPerInterval = 0, 1796 - }; 1797 - 1798 - static struct usb_ss_ep_comp_descriptor bot_bi_ep_comp_desc = { 1799 - .bLength = sizeof(bot_bi_ep_comp_desc), 1800 - .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 1801 - .bMaxBurst = 0, 1802 - }; 1803 - 1804 - static struct usb_endpoint_descriptor uasp_bo_desc = { 1805 - .bLength = USB_DT_ENDPOINT_SIZE, 1806 - .bDescriptorType = USB_DT_ENDPOINT, 1807 - .bEndpointAddress = USB_DIR_OUT, 1808 - .bmAttributes = USB_ENDPOINT_XFER_BULK, 1809 - .wMaxPacketSize = cpu_to_le16(512), 1810 - }; 1811 - 1812 - static struct usb_endpoint_descriptor uasp_fs_bo_desc = { 1813 - .bLength = USB_DT_ENDPOINT_SIZE, 1814 - .bDescriptorType = USB_DT_ENDPOINT, 1815 - .bEndpointAddress = USB_DIR_OUT, 1816 - .bmAttributes = USB_ENDPOINT_XFER_BULK, 1817 - }; 1818 - 1819 - static struct usb_pipe_usage_descriptor uasp_bo_pipe_desc = { 1820 - .bLength = sizeof(uasp_bo_pipe_desc), 1821 - .bDescriptorType = USB_DT_PIPE_USAGE, 1822 - .bPipeID = DATA_OUT_PIPE_ID, 1823 - }; 1824 - 1825 - static struct usb_endpoint_descriptor uasp_ss_bo_desc = { 1826 - .bLength = USB_DT_ENDPOINT_SIZE, 1827 - .bDescriptorType = USB_DT_ENDPOINT, 1828 - .bEndpointAddress = USB_DIR_OUT, 1829 - .bmAttributes = USB_ENDPOINT_XFER_BULK, 1830 - .wMaxPacketSize = cpu_to_le16(0x400), 1831 - }; 1832 - 1833 - static struct usb_ss_ep_comp_descriptor uasp_bo_ep_comp_desc = { 1834 - .bLength = sizeof(uasp_bo_ep_comp_desc), 1835 - .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 1836 - .bmAttributes = UASP_SS_EP_COMP_LOG_STREAMS, 1837 - }; 1838 - 1839 - static struct usb_ss_ep_comp_descriptor bot_bo_ep_comp_desc = { 1840 - .bLength = sizeof(bot_bo_ep_comp_desc), 1841 - .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 1842 - }; 1843 - 1844 - static struct usb_endpoint_descriptor uasp_status_desc = { 1845 - .bLength = USB_DT_ENDPOINT_SIZE, 1846 - .bDescriptorType = USB_DT_ENDPOINT, 1847 - .bEndpointAddress = USB_DIR_IN, 1848 - .bmAttributes = USB_ENDPOINT_XFER_BULK, 1849 - .wMaxPacketSize = cpu_to_le16(512), 1850 - }; 1851 - 1852 - static struct usb_endpoint_descriptor uasp_fs_status_desc = { 1853 - .bLength = USB_DT_ENDPOINT_SIZE, 1854 - .bDescriptorType = USB_DT_ENDPOINT, 1855 - .bEndpointAddress = USB_DIR_IN, 1856 - .bmAttributes = USB_ENDPOINT_XFER_BULK, 1857 - }; 1858 - 1859 - static struct usb_pipe_usage_descriptor uasp_status_pipe_desc = { 1860 - .bLength = sizeof(uasp_status_pipe_desc), 1861 - .bDescriptorType = USB_DT_PIPE_USAGE, 1862 - .bPipeID = STATUS_PIPE_ID, 1863 - }; 1864 - 1865 - static struct usb_endpoint_descriptor uasp_ss_status_desc = { 1866 - .bLength = USB_DT_ENDPOINT_SIZE, 1867 - .bDescriptorType = USB_DT_ENDPOINT, 1868 - .bEndpointAddress = USB_DIR_IN, 1869 - .bmAttributes = USB_ENDPOINT_XFER_BULK, 1870 - .wMaxPacketSize = cpu_to_le16(1024), 1871 - }; 1872 - 1873 - static struct usb_ss_ep_comp_descriptor uasp_status_in_ep_comp_desc = { 1874 - .bLength = sizeof(uasp_status_in_ep_comp_desc), 1875 - .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 1876 - .bmAttributes = UASP_SS_EP_COMP_LOG_STREAMS, 1877 - }; 1878 - 1879 - static struct usb_endpoint_descriptor uasp_cmd_desc = { 1880 - .bLength = USB_DT_ENDPOINT_SIZE, 1881 - .bDescriptorType = USB_DT_ENDPOINT, 1882 - .bEndpointAddress = USB_DIR_OUT, 1883 - .bmAttributes = USB_ENDPOINT_XFER_BULK, 1884 - .wMaxPacketSize = cpu_to_le16(512), 1885 - }; 1886 - 1887 - static struct usb_endpoint_descriptor uasp_fs_cmd_desc = { 1888 - .bLength = USB_DT_ENDPOINT_SIZE, 1889 - .bDescriptorType = USB_DT_ENDPOINT, 1890 - .bEndpointAddress = USB_DIR_OUT, 1891 - .bmAttributes = USB_ENDPOINT_XFER_BULK, 1892 - }; 1893 - 1894 - static struct usb_pipe_usage_descriptor uasp_cmd_pipe_desc = { 1895 - .bLength = sizeof(uasp_cmd_pipe_desc), 1896 - .bDescriptorType = USB_DT_PIPE_USAGE, 1897 - .bPipeID = CMD_PIPE_ID, 1898 - }; 1899 - 1900 - static struct usb_endpoint_descriptor uasp_ss_cmd_desc = { 1901 - .bLength = USB_DT_ENDPOINT_SIZE, 1902 - .bDescriptorType = USB_DT_ENDPOINT, 1903 - .bEndpointAddress = USB_DIR_OUT, 1904 - .bmAttributes = USB_ENDPOINT_XFER_BULK, 1905 - .wMaxPacketSize = cpu_to_le16(1024), 1906 - }; 1907 - 1908 - static struct usb_ss_ep_comp_descriptor uasp_cmd_comp_desc = { 1909 - .bLength = sizeof(uasp_cmd_comp_desc), 1910 - .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 1911 - }; 1912 - 1913 - static struct usb_descriptor_header *uasp_fs_function_desc[] = { 1914 - (struct usb_descriptor_header *) &bot_intf_desc, 1915 - (struct usb_descriptor_header *) &uasp_fs_bi_desc, 1916 - (struct usb_descriptor_header *) &uasp_fs_bo_desc, 1917 - 1918 - (struct usb_descriptor_header *) &uasp_intf_desc, 1919 - (struct usb_descriptor_header *) &uasp_fs_bi_desc, 1920 - (struct usb_descriptor_header *) &uasp_bi_pipe_desc, 1921 - (struct usb_descriptor_header *) &uasp_fs_bo_desc, 1922 - (struct usb_descriptor_header *) &uasp_bo_pipe_desc, 1923 - (struct usb_descriptor_header *) &uasp_fs_status_desc, 1924 - (struct usb_descriptor_header *) &uasp_status_pipe_desc, 1925 - (struct usb_descriptor_header *) &uasp_fs_cmd_desc, 1926 - (struct usb_descriptor_header *) &uasp_cmd_pipe_desc, 1927 - NULL, 1928 - }; 1929 - 1930 - static struct usb_descriptor_header *uasp_hs_function_desc[] = { 1931 - (struct usb_descriptor_header *) &bot_intf_desc, 1932 - (struct usb_descriptor_header *) &uasp_bi_desc, 1933 - (struct usb_descriptor_header *) &uasp_bo_desc, 1934 - 1935 - (struct usb_descriptor_header *) &uasp_intf_desc, 1936 - (struct usb_descriptor_header *) &uasp_bi_desc, 1937 - (struct usb_descriptor_header *) &uasp_bi_pipe_desc, 1938 - (struct usb_descriptor_header *) &uasp_bo_desc, 1939 - (struct usb_descriptor_header *) &uasp_bo_pipe_desc, 1940 - (struct usb_descriptor_header *) &uasp_status_desc, 1941 - (struct usb_descriptor_header *) &uasp_status_pipe_desc, 1942 - (struct usb_descriptor_header *) &uasp_cmd_desc, 1943 - (struct usb_descriptor_header *) &uasp_cmd_pipe_desc, 1944 - NULL, 1945 - }; 1946 - 1947 - static struct usb_descriptor_header *uasp_ss_function_desc[] = { 1948 - (struct usb_descriptor_header *) &bot_intf_desc, 1949 - (struct usb_descriptor_header *) &uasp_ss_bi_desc, 1950 - (struct usb_descriptor_header *) &bot_bi_ep_comp_desc, 1951 - (struct usb_descriptor_header *) &uasp_ss_bo_desc, 1952 - (struct usb_descriptor_header *) &bot_bo_ep_comp_desc, 1953 - 1954 - (struct usb_descriptor_header *) &uasp_intf_desc, 1955 - (struct usb_descriptor_header *) &uasp_ss_bi_desc, 1956 - (struct usb_descriptor_header *) &uasp_bi_ep_comp_desc, 1957 - (struct usb_descriptor_header *) &uasp_bi_pipe_desc, 1958 - (struct usb_descriptor_header *) &uasp_ss_bo_desc, 1959 - (struct usb_descriptor_header *) &uasp_bo_ep_comp_desc, 1960 - (struct usb_descriptor_header *) &uasp_bo_pipe_desc, 1961 - (struct usb_descriptor_header *) &uasp_ss_status_desc, 1962 - (struct usb_descriptor_header *) &uasp_status_in_ep_comp_desc, 1963 - (struct usb_descriptor_header *) &uasp_status_pipe_desc, 1964 - (struct usb_descriptor_header *) &uasp_ss_cmd_desc, 1965 - (struct usb_descriptor_header *) &uasp_cmd_comp_desc, 1966 - (struct usb_descriptor_header *) &uasp_cmd_pipe_desc, 1967 - NULL, 1968 - }; 26 + /* #include to be removed when new function registration interface is used */ 27 + #include "../function/f_tcm.c" 1969 28 1970 29 #define UAS_VENDOR_ID 0x0525 /* NetChip */ 1971 30 #define UAS_PRODUCT_ID 0xa4a5 /* Linux-USB File-backed Storage Gadget */ ··· 59 2000 NULL, 60 2001 }; 61 2002 62 - static struct usb_string tcm_us_strings[] = { 63 - [USB_G_STR_INT_UAS].s = "USB Attached SCSI", 64 - [USB_G_STR_INT_BBB].s = "Bulk Only Transport", 65 - { }, 66 - }; 67 - 68 - static struct usb_gadget_strings tcm_stringtab = { 69 - .language = 0x0409, 70 - .strings = tcm_us_strings, 71 - }; 72 - 73 - static struct usb_gadget_strings *tcm_strings[] = { 74 - &tcm_stringtab, 75 - NULL, 76 - }; 77 - 78 2003 static int guas_unbind(struct usb_composite_dev *cdev) 79 2004 { 80 2005 return 0; ··· 69 2026 .bConfigurationValue = 1, 70 2027 .bmAttributes = USB_CONFIG_ATT_SELFPOWER, 71 2028 }; 72 - 73 - static int tcm_bind(struct usb_configuration *c, struct usb_function *f) 74 - { 75 - struct f_uas *fu = to_f_uas(f); 76 - struct usb_gadget *gadget = c->cdev->gadget; 77 - struct usb_ep *ep; 78 - int iface; 79 - int ret; 80 - 81 - iface = usb_interface_id(c, f); 82 - if (iface < 0) 83 - return iface; 84 - 85 - bot_intf_desc.bInterfaceNumber = iface; 86 - uasp_intf_desc.bInterfaceNumber = iface; 87 - fu->iface = iface; 88 - ep = usb_ep_autoconfig_ss(gadget, &uasp_ss_bi_desc, 89 - &uasp_bi_ep_comp_desc); 90 - if (!ep) 91 - goto ep_fail; 92 - fu->ep_in = ep; 93 - 94 - ep = usb_ep_autoconfig_ss(gadget, &uasp_ss_bo_desc, 95 - &uasp_bo_ep_comp_desc); 96 - if (!ep) 97 - goto ep_fail; 98 - fu->ep_out = ep; 99 - 100 - ep = usb_ep_autoconfig_ss(gadget, &uasp_ss_status_desc, 101 - &uasp_status_in_ep_comp_desc); 102 - if (!ep) 103 - goto ep_fail; 104 - fu->ep_status = ep; 105 - 106 - ep = usb_ep_autoconfig_ss(gadget, &uasp_ss_cmd_desc, 107 - &uasp_cmd_comp_desc); 108 - if (!ep) 109 - goto ep_fail; 110 - fu->ep_cmd = ep; 111 - 112 - /* Assume endpoint addresses are the same for both speeds */ 113 - uasp_bi_desc.bEndpointAddress = uasp_ss_bi_desc.bEndpointAddress; 114 - uasp_bo_desc.bEndpointAddress = uasp_ss_bo_desc.bEndpointAddress; 115 - uasp_status_desc.bEndpointAddress = 116 - uasp_ss_status_desc.bEndpointAddress; 117 - uasp_cmd_desc.bEndpointAddress = uasp_ss_cmd_desc.bEndpointAddress; 118 - 119 - uasp_fs_bi_desc.bEndpointAddress = uasp_ss_bi_desc.bEndpointAddress; 120 - uasp_fs_bo_desc.bEndpointAddress = uasp_ss_bo_desc.bEndpointAddress; 121 - uasp_fs_status_desc.bEndpointAddress = 122 - uasp_ss_status_desc.bEndpointAddress; 123 - uasp_fs_cmd_desc.bEndpointAddress = uasp_ss_cmd_desc.bEndpointAddress; 124 - 125 - ret = usb_assign_descriptors(f, uasp_fs_function_desc, 126 - uasp_hs_function_desc, uasp_ss_function_desc); 127 - if (ret) 128 - goto ep_fail; 129 - 130 - return 0; 131 - ep_fail: 132 - pr_err("Can't claim all required eps\n"); 133 - return -ENOTSUPP; 134 - } 135 - 136 - static void tcm_unbind(struct usb_configuration *c, struct usb_function *f) 137 - { 138 - struct f_uas *fu = to_f_uas(f); 139 - 140 - usb_free_all_descriptors(f); 141 - kfree(fu); 142 - } 143 - 144 - struct guas_setup_wq { 145 - struct work_struct work; 146 - struct f_uas *fu; 147 - unsigned int alt; 148 - }; 149 - 150 - static void tcm_delayed_set_alt(struct work_struct *wq) 151 - { 152 - struct guas_setup_wq *work = container_of(wq, struct guas_setup_wq, 153 - work); 154 - struct f_uas *fu = work->fu; 155 - int alt = work->alt; 156 - 157 - kfree(work); 158 - 159 - if (fu->flags & USBG_IS_BOT) 160 - bot_cleanup_old_alt(fu); 161 - if (fu->flags & USBG_IS_UAS) 162 - uasp_cleanup_old_alt(fu); 163 - 164 - if (alt == USB_G_ALT_INT_BBB) 165 - bot_set_alt(fu); 166 - else if (alt == USB_G_ALT_INT_UAS) 167 - uasp_set_alt(fu); 168 - usb_composite_setup_continue(fu->function.config->cdev); 169 - } 170 - 171 - static int tcm_set_alt(struct usb_function *f, unsigned intf, unsigned alt) 172 - { 173 - struct f_uas *fu = to_f_uas(f); 174 - 175 - if ((alt == USB_G_ALT_INT_BBB) || (alt == USB_G_ALT_INT_UAS)) { 176 - struct guas_setup_wq *work; 177 - 178 - work = kmalloc(sizeof(*work), GFP_ATOMIC); 179 - if (!work) 180 - return -ENOMEM; 181 - INIT_WORK(&work->work, tcm_delayed_set_alt); 182 - work->fu = fu; 183 - work->alt = alt; 184 - schedule_work(&work->work); 185 - return USB_GADGET_DELAYED_STATUS; 186 - } 187 - return -EOPNOTSUPP; 188 - } 189 - 190 - static void tcm_disable(struct usb_function *f) 191 - { 192 - struct f_uas *fu = to_f_uas(f); 193 - 194 - if (fu->flags & USBG_IS_UAS) 195 - uasp_cleanup_old_alt(fu); 196 - else if (fu->flags & USBG_IS_BOT) 197 - bot_cleanup_old_alt(fu); 198 - fu->flags = 0; 199 - } 200 - 201 - static int tcm_setup(struct usb_function *f, 202 - const struct usb_ctrlrequest *ctrl) 203 - { 204 - struct f_uas *fu = to_f_uas(f); 205 - 206 - if (!(fu->flags & USBG_IS_BOT)) 207 - return -EOPNOTSUPP; 208 - 209 - return usbg_bot_setup(f, ctrl); 210 - } 211 - 212 - static int tcm_bind_config(struct usb_configuration *c) 213 - { 214 - struct f_uas *fu; 215 - int ret; 216 - 217 - fu = kzalloc(sizeof(*fu), GFP_KERNEL); 218 - if (!fu) 219 - return -ENOMEM; 220 - fu->function.name = "Target Function"; 221 - fu->function.bind = tcm_bind; 222 - fu->function.unbind = tcm_unbind; 223 - fu->function.set_alt = tcm_set_alt; 224 - fu->function.setup = tcm_setup; 225 - fu->function.disable = tcm_disable; 226 - fu->function.strings = tcm_strings; 227 - fu->tpg = the_only_tpg_I_currently_have; 228 - 229 - bot_intf_desc.iInterface = tcm_us_strings[USB_G_STR_INT_BBB].id; 230 - uasp_intf_desc.iInterface = tcm_us_strings[USB_G_STR_INT_UAS].id; 231 - 232 - ret = usb_add_function(c, &fu->function); 233 - if (ret) 234 - goto err; 235 - 236 - return 0; 237 - err: 238 - kfree(fu); 239 - return ret; 240 - } 241 2029 242 2030 static int usb_target_bind(struct usb_composite_dev *cdev) 243 2031 {
+1 -1
drivers/usb/gadget/legacy/tcm_usb_gadget.h drivers/usb/gadget/function/tcm.h
··· 129 129 130 130 extern struct usbg_tpg *the_only_tpg_I_currently_have; 131 131 132 - #endif 132 + #endif /* __TARGET_USB_GADGET_H__ */