FILE
f_tcm.c
File preview with syntax highlighting.
linux-6.19.14/drivers/usb/gadget/function/f_tcm.c
1// SPDX-License-Identifier: GPL-2.0 2/* Target based USB-Gadget 3 * 4 * UAS protocol handling, target callbacks, configfs handling, 5 * BBB (USB Mass Storage Class Bulk-Only (BBB) and Transport protocol handling. 6 * 7 * Author: Sebastian Andrzej Siewior <bigeasy at linutronix dot de> 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/delay.h> 16#include <linux/usb/ch9.h> 17#include <linux/usb/composite.h> 18#include <linux/usb/gadget.h> 19#include <linux/usb/storage.h> 20#include <scsi/scsi_tcq.h> 21#include <target/target_core_base.h> 22#include <target/target_core_fabric.h> 23#include <linux/unaligned.h> 24 25#include "tcm.h" 26#include "u_tcm.h" 27#include "configfs.h" 28 29#define TPG_INSTANCES 1 30 31struct tpg_instance { 32 struct usb_function_instance *func_inst; 33 struct usbg_tpg *tpg; 34}; 35 36static struct tpg_instance tpg_instances[TPG_INSTANCES]; 37 38static DEFINE_MUTEX(tpg_instances_lock); 39 40static inline struct f_uas *to_f_uas(struct usb_function *f) 41{ 42 return container_of(f, struct f_uas, function); 43} 44 45/* Start bot.c code */ 46 47static int bot_enqueue_cmd_cbw(struct f_uas *fu) 48{ 49 int ret; 50 51 if (fu->flags & USBG_BOT_CMD_PEND) 52 return 0; 53 54 ret = usb_ep_queue(fu->ep_out, fu->cmd[0].req, GFP_ATOMIC); 55 if (!ret) 56 fu->flags |= USBG_BOT_CMD_PEND; 57 return ret; 58} 59 60static void bot_status_complete(struct usb_ep *ep, struct usb_request *req) 61{ 62 struct usbg_cmd *cmd = req->context; 63 struct f_uas *fu = cmd->fu; 64 65 transport_generic_free_cmd(&cmd->se_cmd, 0); 66 if (req->status == -ESHUTDOWN) 67 return; 68 69 if (req->status < 0) 70 pr_err("ERR %s(%d)\n", __func__, __LINE__); 71 72 /* CSW completed, wait for next CBW */ 73 bot_enqueue_cmd_cbw(fu); 74} 75 76static void bot_enqueue_sense_code(struct f_uas *fu, struct usbg_cmd *cmd) 77{ 78 struct bulk_cs_wrap *csw = &fu->bot_status.csw; 79 int ret; 80 unsigned int csw_stat; 81 82 csw_stat = cmd->csw_code; 83 csw->Tag = cmd->bot_tag; 84 csw->Status = csw_stat; 85 fu->bot_status.req->context = cmd; 86 ret = usb_ep_queue(fu->ep_in, fu->bot_status.req, GFP_ATOMIC); 87 if (ret) 88 pr_err("%s(%d) ERR: %d\n", __func__, __LINE__, ret); 89} 90 91static void bot_err_compl(struct usb_ep *ep, struct usb_request *req) 92{ 93 struct usbg_cmd *cmd = req->context; 94 struct f_uas *fu = cmd->fu; 95 96 if (req->status < 0) 97 pr_err("ERR %s(%d)\n", __func__, __LINE__); 98 99 if (cmd->data_len) { 100 if (cmd->data_len > ep->maxpacket) { 101 req->length = ep->maxpacket; 102 cmd->data_len -= ep->maxpacket; 103 } else { 104 req->length = cmd->data_len; 105 cmd->data_len = 0; 106 } 107 108 usb_ep_queue(ep, req, GFP_ATOMIC); 109 return; 110 } 111 bot_enqueue_sense_code(fu, cmd); 112} 113 114static void bot_send_bad_status(struct usbg_cmd *cmd) 115{ 116 struct f_uas *fu = cmd->fu; 117 struct bulk_cs_wrap *csw = &fu->bot_status.csw; 118 struct usb_request *req; 119 struct usb_ep *ep; 120 121 csw->Residue = cpu_to_le32(cmd->data_len); 122 123 if (cmd->data_len) { 124 if (cmd->is_read) { 125 ep = fu->ep_in; 126 req = fu->bot_req_in; 127 } else { 128 ep = fu->ep_out; 129 req = fu->bot_req_out; 130 } 131 132 if (cmd->data_len > fu->ep_in->maxpacket) { 133 req->length = ep->maxpacket; 134 cmd->data_len -= ep->maxpacket; 135 } else { 136 req->length = cmd->data_len; 137 cmd->data_len = 0; 138 } 139 req->complete = bot_err_compl; 140 req->context = cmd; 141 req->buf = fu->cmd[0].buf; 142 usb_ep_queue(ep, req, GFP_KERNEL); 143 } else { 144 bot_enqueue_sense_code(fu, cmd); 145 } 146} 147 148static int bot_send_status(struct usbg_cmd *cmd, bool moved_data) 149{ 150 struct f_uas *fu = cmd->fu; 151 struct bulk_cs_wrap *csw = &fu->bot_status.csw; 152 int ret; 153 154 if (cmd->se_cmd.scsi_status == SAM_STAT_GOOD) { 155 if (!moved_data && cmd->data_len) { 156 /* 157 * the host wants to move data, we don't. Fill / empty 158 * the pipe and then send the csw with reside set. 159 */ 160 cmd->csw_code = US_BULK_STAT_OK; 161 bot_send_bad_status(cmd); 162 return 0; 163 } 164 165 csw->Tag = cmd->bot_tag; 166 csw->Residue = cpu_to_le32(0); 167 csw->Status = US_BULK_STAT_OK; 168 fu->bot_status.req->context = cmd; 169 170 ret = usb_ep_queue(fu->ep_in, fu->bot_status.req, GFP_KERNEL); 171 if (ret) 172 pr_err("%s(%d) ERR: %d\n", __func__, __LINE__, ret); 173 } else { 174 cmd->csw_code = US_BULK_STAT_FAIL; 175 bot_send_bad_status(cmd); 176 } 177 return 0; 178} 179 180/* 181 * Called after command (no data transfer) or after the write (to device) 182 * operation is completed 183 */ 184static int bot_send_status_response(struct usbg_cmd *cmd) 185{ 186 bool moved_data = false; 187 188 if (!cmd->is_read) 189 moved_data = true; 190 return bot_send_status(cmd, moved_data); 191} 192 193/* Read request completed, now we have to send the CSW */ 194static void bot_read_compl(struct usb_ep *ep, struct usb_request *req) 195{ 196 struct usbg_cmd *cmd = req->context; 197 198 if (req->status < 0) 199 pr_err("ERR %s(%d)\n", __func__, __LINE__); 200 201 if (req->status == -ESHUTDOWN) { 202 transport_generic_free_cmd(&cmd->se_cmd, 0); 203 return; 204 } 205 206 bot_send_status(cmd, true); 207} 208 209static int bot_send_read_response(struct usbg_cmd *cmd) 210{ 211 struct f_uas *fu = cmd->fu; 212 struct se_cmd *se_cmd = &cmd->se_cmd; 213 struct usb_gadget *gadget = fuas_to_gadget(fu); 214 int ret; 215 216 if (!cmd->data_len) { 217 cmd->csw_code = US_BULK_STAT_PHASE; 218 bot_send_bad_status(cmd); 219 return 0; 220 } 221 222 if (!gadget->sg_supported) { 223 cmd->data_buf = kmalloc(se_cmd->data_length, GFP_ATOMIC); 224 if (!cmd->data_buf) 225 return -ENOMEM; 226 227 sg_copy_to_buffer(se_cmd->t_data_sg, 228 se_cmd->t_data_nents, 229 cmd->data_buf, 230 se_cmd->data_length); 231 232 fu->bot_req_in->buf = cmd->data_buf; 233 } else { 234 fu->bot_req_in->buf = NULL; 235 fu->bot_req_in->num_sgs = se_cmd->t_data_nents; 236 fu->bot_req_in->sg = se_cmd->t_data_sg; 237 } 238 239 fu->bot_req_in->complete = bot_read_compl; 240 fu->bot_req_in->length = se_cmd->data_length; 241 fu->bot_req_in->context = cmd; 242 ret = usb_ep_queue(fu->ep_in, fu->bot_req_in, GFP_ATOMIC); 243 if (ret) 244 pr_err("%s(%d)\n", __func__, __LINE__); 245 return 0; 246} 247 248static void usbg_data_write_cmpl(struct usb_ep *, struct usb_request *); 249static int usbg_prepare_w_request(struct usbg_cmd *, struct usb_request *); 250 251static int bot_send_write_request(struct usbg_cmd *cmd) 252{ 253 struct f_uas *fu = cmd->fu; 254 int ret; 255 256 cmd->fu = fu; 257 258 if (!cmd->data_len) { 259 cmd->csw_code = US_BULK_STAT_PHASE; 260 return -EINVAL; 261 } 262 263 ret = usbg_prepare_w_request(cmd, fu->bot_req_out); 264 if (ret) 265 goto cleanup; 266 ret = usb_ep_queue(fu->ep_out, fu->bot_req_out, GFP_KERNEL); 267 if (ret) 268 pr_err("%s(%d)\n", __func__, __LINE__); 269 270cleanup: 271 return ret; 272} 273 274static int bot_submit_command(struct f_uas *, void *, unsigned int); 275 276static void bot_cmd_complete(struct usb_ep *ep, struct usb_request *req) 277{ 278 struct f_uas *fu = req->context; 279 int ret; 280 281 if (req->status == -ESHUTDOWN) 282 return; 283 284 fu->flags &= ~USBG_BOT_CMD_PEND; 285 286 if (req->status < 0) { 287 struct usb_gadget *gadget = fuas_to_gadget(fu); 288 289 dev_err(&gadget->dev, "BOT command req err (%d)\n", req->status); 290 bot_enqueue_cmd_cbw(fu); 291 return; 292 } 293 294 ret = bot_submit_command(fu, req->buf, req->actual); 295 if (ret) { 296 pr_err("%s(%d): %d\n", __func__, __LINE__, ret); 297 if (!(fu->flags & USBG_BOT_WEDGED)) 298 usb_ep_set_wedge(fu->ep_in); 299 300 fu->flags |= USBG_BOT_WEDGED; 301 bot_enqueue_cmd_cbw(fu); 302 } else if (fu->flags & USBG_BOT_WEDGED) { 303 fu->flags &= ~USBG_BOT_WEDGED; 304 usb_ep_clear_halt(fu->ep_in); 305 } 306} 307 308static 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[0].req = usb_ep_alloc_request(fu->ep_out, GFP_KERNEL); 321 if (!fu->cmd[0].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[0].buf = kmalloc(fu->ep_out->maxpacket, GFP_KERNEL); 334 if (!fu->cmd[0].buf) 335 goto err_buf; 336 337 fu->cmd[0].req->complete = bot_cmd_complete; 338 fu->cmd[0].req->buf = fu->cmd[0].buf; 339 fu->cmd[0].req->length = fu->ep_out->maxpacket; 340 fu->cmd[0].req->context = fu; 341 342 ret = bot_enqueue_cmd_cbw(fu); 343 if (ret) 344 goto err_queue; 345 return 0; 346err_queue: 347 kfree(fu->cmd[0].buf); 348 fu->cmd[0].buf = NULL; 349err_buf: 350 usb_ep_free_request(fu->ep_in, fu->bot_status.req); 351err_sts: 352 usb_ep_free_request(fu->ep_out, fu->cmd[0].req); 353 fu->cmd[0].req = NULL; 354err_cmd: 355 usb_ep_free_request(fu->ep_out, fu->bot_req_out); 356 fu->bot_req_out = NULL; 357err_out: 358 usb_ep_free_request(fu->ep_in, fu->bot_req_in); 359 fu->bot_req_in = NULL; 360err: 361 pr_err("BOT: endpoint setup failed\n"); 362 return -ENOMEM; 363} 364 365static 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[0].req); 379 usb_ep_free_request(fu->ep_in, fu->bot_status.req); 380 381 kfree(fu->cmd[0].buf); 382 383 fu->bot_req_in = NULL; 384 fu->bot_req_out = NULL; 385 fu->cmd[0].req = NULL; 386 fu->bot_status.req = NULL; 387 fu->cmd[0].buf = NULL; 388} 389 390static 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_and_alt(gadget, f, fu->ep_in, USB_G_ALT_INT_BBB); 399 ret = usb_ep_enable(fu->ep_in); 400 if (ret) 401 goto err_b_in; 402 403 config_ep_by_speed_and_alt(gadget, f, fu->ep_out, USB_G_ALT_INT_BBB); 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; 414err_wq: 415 usb_ep_disable(fu->ep_out); 416err_b_out: 417 usb_ep_disable(fu->ep_in); 418err_b_in: 419 fu->flags = USBG_IS_BOT; 420} 421 422static 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 luns--; 448 if (luns > US_BULK_MAX_LUN_LIMIT) { 449 pr_info_once("Limiting the number of luns to 16\n"); 450 luns = US_BULK_MAX_LUN_LIMIT; 451 } 452 ret_lun = cdev->req->buf; 453 *ret_lun = luns; 454 cdev->req->length = 1; 455 return usb_ep_queue(cdev->gadget->ep0, cdev->req, GFP_ATOMIC); 456 457 case US_BULK_RESET_REQUEST: 458 /* XXX maybe we should remove previous requests for IN + OUT */ 459 if (fu->flags & USBG_BOT_WEDGED) { 460 fu->flags &= ~USBG_BOT_WEDGED; 461 usb_ep_clear_halt(fu->ep_in); 462 } 463 464 bot_enqueue_cmd_cbw(fu); 465 return 0; 466 } 467 return -ENOTSUPP; 468} 469 470/* Start uas.c code */ 471 472static int tcm_to_uasp_response(enum tcm_tmrsp_table code) 473{ 474 switch (code) { 475 case TMR_FUNCTION_FAILED: 476 return RC_TMF_FAILED; 477 case TMR_FUNCTION_COMPLETE: 478 case TMR_TASK_DOES_NOT_EXIST: 479 return RC_TMF_COMPLETE; 480 case TMR_LUN_DOES_NOT_EXIST: 481 return RC_INCORRECT_LUN; 482 case TMR_FUNCTION_REJECTED: 483 case TMR_TASK_MGMT_FUNCTION_NOT_SUPPORTED: 484 default: 485 return RC_TMF_NOT_SUPPORTED; 486 } 487} 488 489static unsigned char uasp_to_tcm_func(int code) 490{ 491 switch (code) { 492 case TMF_ABORT_TASK: 493 return TMR_ABORT_TASK; 494 case TMF_ABORT_TASK_SET: 495 return TMR_ABORT_TASK_SET; 496 case TMF_CLEAR_TASK_SET: 497 return TMR_CLEAR_TASK_SET; 498 case TMF_LOGICAL_UNIT_RESET: 499 return TMR_LUN_RESET; 500 case TMF_CLEAR_ACA: 501 return TMR_CLEAR_ACA; 502 case TMF_I_T_NEXUS_RESET: 503 case TMF_QUERY_TASK: 504 case TMF_QUERY_TASK_SET: 505 case TMF_QUERY_ASYNC_EVENT: 506 default: 507 return TMR_UNKNOWN; 508 } 509} 510 511static void uasp_cleanup_one_stream(struct f_uas *fu, struct uas_stream *stream) 512{ 513 /* We have either all three allocated or none */ 514 if (!stream->req_in) 515 return; 516 517 usb_ep_free_request(fu->ep_in, stream->req_in); 518 usb_ep_free_request(fu->ep_out, stream->req_out); 519 usb_ep_free_request(fu->ep_status, stream->req_status); 520 521 stream->req_in = NULL; 522 stream->req_out = NULL; 523 stream->req_status = NULL; 524} 525 526static void uasp_free_cmdreq(struct f_uas *fu) 527{ 528 int i; 529 530 for (i = 0; i < USBG_NUM_CMDS; i++) { 531 usb_ep_free_request(fu->ep_cmd, fu->cmd[i].req); 532 kfree(fu->cmd[i].buf); 533 fu->cmd[i].req = NULL; 534 fu->cmd[i].buf = NULL; 535 } 536} 537 538static void uasp_cleanup_old_alt(struct f_uas *fu) 539{ 540 int i; 541 542 if (!(fu->flags & USBG_ENABLED)) 543 return; 544 545 usb_ep_disable(fu->ep_in); 546 usb_ep_disable(fu->ep_out); 547 usb_ep_disable(fu->ep_status); 548 usb_ep_disable(fu->ep_cmd); 549 550 for (i = 0; i < USBG_NUM_CMDS; i++) 551 uasp_cleanup_one_stream(fu, &fu->stream[i]); 552 uasp_free_cmdreq(fu); 553} 554 555static void uasp_status_data_cmpl(struct usb_ep *ep, struct usb_request *req); 556 557static int uasp_prepare_r_request(struct usbg_cmd *cmd) 558{ 559 struct se_cmd *se_cmd = &cmd->se_cmd; 560 struct f_uas *fu = cmd->fu; 561 struct usb_gadget *gadget = fuas_to_gadget(fu); 562 struct uas_stream *stream = &fu->stream[se_cmd->map_tag]; 563 564 if (!gadget->sg_supported) { 565 cmd->data_buf = kmalloc(se_cmd->data_length, GFP_ATOMIC); 566 if (!cmd->data_buf) 567 return -ENOMEM; 568 569 sg_copy_to_buffer(se_cmd->t_data_sg, 570 se_cmd->t_data_nents, 571 cmd->data_buf, 572 se_cmd->data_length); 573 574 stream->req_in->buf = cmd->data_buf; 575 } else { 576 stream->req_in->buf = NULL; 577 stream->req_in->num_sgs = se_cmd->t_data_nents; 578 stream->req_in->sg = se_cmd->t_data_sg; 579 } 580 581 stream->req_in->is_last = 1; 582 stream->req_in->stream_id = cmd->tag; 583 stream->req_in->complete = uasp_status_data_cmpl; 584 stream->req_in->length = se_cmd->data_length; 585 stream->req_in->context = cmd; 586 587 cmd->state = UASP_SEND_STATUS; 588 return 0; 589} 590 591static void uasp_prepare_status(struct usbg_cmd *cmd) 592{ 593 struct se_cmd *se_cmd = &cmd->se_cmd; 594 struct sense_iu *iu = &cmd->sense_iu; 595 struct uas_stream *stream = &cmd->fu->stream[se_cmd->map_tag]; 596 597 cmd->state = UASP_QUEUE_COMMAND; 598 iu->iu_id = IU_ID_STATUS; 599 iu->tag = cpu_to_be16(cmd->tag); 600 601 /* 602 * iu->status_qual = cpu_to_be16(STATUS QUALIFIER SAM-4. Where R U?); 603 */ 604 iu->len = cpu_to_be16(se_cmd->scsi_sense_length); 605 iu->status = se_cmd->scsi_status; 606 stream->req_status->is_last = 1; 607 stream->req_status->stream_id = cmd->tag; 608 stream->req_status->context = cmd; 609 stream->req_status->length = se_cmd->scsi_sense_length + 16; 610 stream->req_status->buf = iu; 611 stream->req_status->complete = uasp_status_data_cmpl; 612} 613 614static void uasp_prepare_response(struct usbg_cmd *cmd) 615{ 616 struct se_cmd *se_cmd = &cmd->se_cmd; 617 struct response_iu *rsp_iu = &cmd->response_iu; 618 struct uas_stream *stream = &cmd->fu->stream[se_cmd->map_tag]; 619 620 cmd->state = UASP_QUEUE_COMMAND; 621 rsp_iu->iu_id = IU_ID_RESPONSE; 622 rsp_iu->tag = cpu_to_be16(cmd->tag); 623 624 if (cmd->tmr_rsp != RC_RESPONSE_UNKNOWN) 625 rsp_iu->response_code = cmd->tmr_rsp; 626 else 627 rsp_iu->response_code = 628 tcm_to_uasp_response(se_cmd->se_tmr_req->response); 629 630 /* 631 * The UASP driver must support all the task management functions listed 632 * in Table 20 of UAS-r04. To remain compliant while indicate that the 633 * TMR did not go through, report RC_TMF_FAILED instead of 634 * RC_TMF_NOT_SUPPORTED and print a warning to the user. 635 */ 636 switch (cmd->tmr_func) { 637 case TMF_ABORT_TASK: 638 case TMF_ABORT_TASK_SET: 639 case TMF_CLEAR_TASK_SET: 640 case TMF_LOGICAL_UNIT_RESET: 641 case TMF_CLEAR_ACA: 642 case TMF_I_T_NEXUS_RESET: 643 case TMF_QUERY_TASK: 644 case TMF_QUERY_TASK_SET: 645 case TMF_QUERY_ASYNC_EVENT: 646 if (rsp_iu->response_code == RC_TMF_NOT_SUPPORTED) { 647 struct usb_gadget *gadget = fuas_to_gadget(cmd->fu); 648 649 dev_warn(&gadget->dev, "TMF function %d not supported\n", 650 cmd->tmr_func); 651 rsp_iu->response_code = RC_TMF_FAILED; 652 } 653 break; 654 default: 655 break; 656 } 657 658 stream->req_status->is_last = 1; 659 stream->req_status->stream_id = cmd->tag; 660 stream->req_status->context = cmd; 661 stream->req_status->length = sizeof(struct response_iu); 662 stream->req_status->buf = rsp_iu; 663 stream->req_status->complete = uasp_status_data_cmpl; 664} 665 666static void usbg_release_cmd(struct se_cmd *se_cmd); 667static int uasp_send_tm_response(struct usbg_cmd *cmd); 668 669static void uasp_status_data_cmpl(struct usb_ep *ep, struct usb_request *req) 670{ 671 struct usbg_cmd *cmd = req->context; 672 struct f_uas *fu = cmd->fu; 673 struct uas_stream *stream = &fu->stream[cmd->se_cmd.map_tag]; 674 int ret; 675 676 if (req->status == -ESHUTDOWN) 677 goto cleanup; 678 679 switch (cmd->state) { 680 case UASP_SEND_DATA: 681 ret = uasp_prepare_r_request(cmd); 682 if (ret) 683 goto cleanup; 684 ret = usb_ep_queue(fu->ep_in, stream->req_in, GFP_ATOMIC); 685 if (ret) 686 pr_err("%s(%d) => %d\n", __func__, __LINE__, ret); 687 break; 688 689 case UASP_RECEIVE_DATA: 690 ret = usbg_prepare_w_request(cmd, stream->req_out); 691 if (ret) 692 goto cleanup; 693 ret = usb_ep_queue(fu->ep_out, stream->req_out, GFP_ATOMIC); 694 if (ret) 695 pr_err("%s(%d) => %d\n", __func__, __LINE__, ret); 696 break; 697 698 case UASP_SEND_STATUS: 699 uasp_prepare_status(cmd); 700 ret = usb_ep_queue(fu->ep_status, stream->req_status, 701 GFP_ATOMIC); 702 if (ret) 703 pr_err("%s(%d) => %d\n", __func__, __LINE__, ret); 704 break; 705 706 case UASP_QUEUE_COMMAND: 707 /* 708 * Overlapped command detected and cancelled. 709 * So send overlapped attempted status. 710 */ 711 if (cmd->tmr_rsp == RC_OVERLAPPED_TAG && 712 req->status == -ECONNRESET) { 713 uasp_send_tm_response(cmd); 714 return; 715 } 716 717 hash_del(&stream->node); 718 719 /* 720 * If no command submitted to target core here, just free the 721 * bitmap index. This is for the cases where f_tcm handles 722 * status response instead of the target core. 723 */ 724 if (cmd->tmr_rsp != RC_OVERLAPPED_TAG && 725 cmd->tmr_rsp != RC_RESPONSE_UNKNOWN) { 726 struct se_session *se_sess; 727 728 se_sess = fu->tpg->tpg_nexus->tvn_se_sess; 729 sbitmap_queue_clear(&se_sess->sess_tag_pool, 730 cmd->se_cmd.map_tag, 731 cmd->se_cmd.map_cpu); 732 } else { 733 transport_generic_free_cmd(&cmd->se_cmd, 0); 734 } 735 736 usb_ep_queue(fu->ep_cmd, cmd->req, GFP_ATOMIC); 737 complete(&stream->cmd_completion); 738 break; 739 740 default: 741 BUG(); 742 } 743 return; 744 745cleanup: 746 hash_del(&stream->node); 747 transport_generic_free_cmd(&cmd->se_cmd, 0); 748} 749 750static int uasp_send_status_response(struct usbg_cmd *cmd) 751{ 752 struct f_uas *fu = cmd->fu; 753 struct uas_stream *stream = &fu->stream[cmd->se_cmd.map_tag]; 754 struct sense_iu *iu = &cmd->sense_iu; 755 756 iu->tag = cpu_to_be16(cmd->tag); 757 cmd->fu = fu; 758 uasp_prepare_status(cmd); 759 return usb_ep_queue(fu->ep_status, stream->req_status, GFP_ATOMIC); 760} 761 762static int uasp_send_tm_response(struct usbg_cmd *cmd) 763{ 764 struct f_uas *fu = cmd->fu; 765 struct uas_stream *stream = &fu->stream[cmd->se_cmd.map_tag]; 766 struct response_iu *iu = &cmd->response_iu; 767 768 iu->tag = cpu_to_be16(cmd->tag); 769 cmd->fu = fu; 770 uasp_prepare_response(cmd); 771 return usb_ep_queue(fu->ep_status, stream->req_status, GFP_ATOMIC); 772} 773 774static int uasp_send_read_response(struct usbg_cmd *cmd) 775{ 776 struct f_uas *fu = cmd->fu; 777 struct uas_stream *stream = &fu->stream[cmd->se_cmd.map_tag]; 778 struct sense_iu *iu = &cmd->sense_iu; 779 int ret; 780 781 cmd->fu = fu; 782 783 iu->tag = cpu_to_be16(cmd->tag); 784 if (fu->flags & USBG_USE_STREAMS) { 785 786 ret = uasp_prepare_r_request(cmd); 787 if (ret) 788 goto out; 789 ret = usb_ep_queue(fu->ep_in, stream->req_in, GFP_ATOMIC); 790 if (ret) { 791 pr_err("%s(%d) => %d\n", __func__, __LINE__, ret); 792 kfree(cmd->data_buf); 793 cmd->data_buf = NULL; 794 } 795 796 } else { 797 798 iu->iu_id = IU_ID_READ_READY; 799 iu->tag = cpu_to_be16(cmd->tag); 800 801 stream->req_status->complete = uasp_status_data_cmpl; 802 stream->req_status->context = cmd; 803 804 cmd->state = UASP_SEND_DATA; 805 stream->req_status->buf = iu; 806 stream->req_status->length = sizeof(struct iu); 807 808 ret = usb_ep_queue(fu->ep_status, stream->req_status, 809 GFP_ATOMIC); 810 if (ret) 811 pr_err("%s(%d) => %d\n", __func__, __LINE__, ret); 812 } 813out: 814 return ret; 815} 816 817static int uasp_send_write_request(struct usbg_cmd *cmd) 818{ 819 struct f_uas *fu = cmd->fu; 820 struct se_cmd *se_cmd = &cmd->se_cmd; 821 struct uas_stream *stream = &fu->stream[se_cmd->map_tag]; 822 struct sense_iu *iu = &cmd->sense_iu; 823 int ret; 824 825 cmd->fu = fu; 826 827 iu->tag = cpu_to_be16(cmd->tag); 828 829 if (fu->flags & USBG_USE_STREAMS) { 830 831 ret = usbg_prepare_w_request(cmd, stream->req_out); 832 if (ret) 833 goto cleanup; 834 ret = usb_ep_queue(fu->ep_out, stream->req_out, GFP_ATOMIC); 835 if (ret) 836 pr_err("%s(%d)\n", __func__, __LINE__); 837 838 } else { 839 840 iu->iu_id = IU_ID_WRITE_READY; 841 iu->tag = cpu_to_be16(cmd->tag); 842 843 stream->req_status->complete = uasp_status_data_cmpl; 844 stream->req_status->context = cmd; 845 846 cmd->state = UASP_RECEIVE_DATA; 847 stream->req_status->buf = iu; 848 stream->req_status->length = sizeof(struct iu); 849 850 ret = usb_ep_queue(fu->ep_status, stream->req_status, 851 GFP_ATOMIC); 852 if (ret) 853 pr_err("%s(%d)\n", __func__, __LINE__); 854 } 855 856cleanup: 857 return ret; 858} 859 860static int usbg_submit_command(struct f_uas *, struct usb_request *); 861 862static void uasp_cmd_complete(struct usb_ep *ep, struct usb_request *req) 863{ 864 struct f_uas *fu = req->context; 865 866 if (req->status == -ESHUTDOWN) 867 return; 868 869 if (req->status < 0) { 870 usb_ep_queue(fu->ep_cmd, req, GFP_ATOMIC); 871 return; 872 } 873 874 usbg_submit_command(fu, req); 875} 876 877static int uasp_alloc_stream_res(struct f_uas *fu, struct uas_stream *stream) 878{ 879 init_completion(&stream->cmd_completion); 880 881 stream->req_in = usb_ep_alloc_request(fu->ep_in, GFP_KERNEL); 882 if (!stream->req_in) 883 goto out; 884 885 stream->req_out = usb_ep_alloc_request(fu->ep_out, GFP_KERNEL); 886 if (!stream->req_out) 887 goto err_out; 888 889 stream->req_status = usb_ep_alloc_request(fu->ep_status, GFP_KERNEL); 890 if (!stream->req_status) 891 goto err_sts; 892 893 return 0; 894 895err_sts: 896 usb_ep_free_request(fu->ep_out, stream->req_out); 897 stream->req_out = NULL; 898err_out: 899 usb_ep_free_request(fu->ep_in, stream->req_in); 900 stream->req_in = NULL; 901out: 902 return -ENOMEM; 903} 904 905static int uasp_alloc_cmd(struct f_uas *fu, int i) 906{ 907 fu->cmd[i].req = usb_ep_alloc_request(fu->ep_cmd, GFP_KERNEL); 908 if (!fu->cmd[i].req) 909 goto err; 910 911 fu->cmd[i].buf = kmalloc(fu->ep_cmd->maxpacket, GFP_KERNEL); 912 if (!fu->cmd[i].buf) 913 goto err_buf; 914 915 fu->cmd[i].req->complete = uasp_cmd_complete; 916 fu->cmd[i].req->buf = fu->cmd[i].buf; 917 fu->cmd[i].req->length = fu->ep_cmd->maxpacket; 918 fu->cmd[i].req->context = fu; 919 return 0; 920 921err_buf: 922 usb_ep_free_request(fu->ep_cmd, fu->cmd[i].req); 923err: 924 return -ENOMEM; 925} 926 927static int uasp_prepare_reqs(struct f_uas *fu) 928{ 929 int ret; 930 int i; 931 932 for (i = 0; i < USBG_NUM_CMDS; i++) { 933 ret = uasp_alloc_stream_res(fu, &fu->stream[i]); 934 if (ret) 935 goto err_cleanup; 936 } 937 938 for (i = 0; i < USBG_NUM_CMDS; i++) { 939 ret = uasp_alloc_cmd(fu, i); 940 if (ret) 941 goto err_free_stream; 942 943 ret = usb_ep_queue(fu->ep_cmd, fu->cmd[i].req, GFP_ATOMIC); 944 if (ret) 945 goto err_free_stream; 946 } 947 948 return 0; 949 950err_free_stream: 951 uasp_free_cmdreq(fu); 952 953err_cleanup: 954 if (i) { 955 do { 956 uasp_cleanup_one_stream(fu, &fu->stream[i - 1]); 957 i--; 958 } while (i); 959 } 960 pr_err("UASP: endpoint setup failed\n"); 961 return ret; 962} 963 964static void uasp_set_alt(struct f_uas *fu) 965{ 966 struct usb_function *f = &fu->function; 967 struct usb_gadget *gadget = f->config->cdev->gadget; 968 int ret; 969 970 fu->flags = USBG_IS_UAS; 971 972 if (gadget->speed >= USB_SPEED_SUPER) 973 fu->flags |= USBG_USE_STREAMS; 974 975 config_ep_by_speed_and_alt(gadget, f, fu->ep_in, USB_G_ALT_INT_UAS); 976 ret = usb_ep_enable(fu->ep_in); 977 if (ret) 978 goto err_b_in; 979 980 config_ep_by_speed_and_alt(gadget, f, fu->ep_out, USB_G_ALT_INT_UAS); 981 ret = usb_ep_enable(fu->ep_out); 982 if (ret) 983 goto err_b_out; 984 985 config_ep_by_speed_and_alt(gadget, f, fu->ep_cmd, USB_G_ALT_INT_UAS); 986 ret = usb_ep_enable(fu->ep_cmd); 987 if (ret) 988 goto err_cmd; 989 config_ep_by_speed_and_alt(gadget, f, fu->ep_status, USB_G_ALT_INT_UAS); 990 ret = usb_ep_enable(fu->ep_status); 991 if (ret) 992 goto err_status; 993 994 ret = uasp_prepare_reqs(fu); 995 if (ret) 996 goto err_wq; 997 fu->flags |= USBG_ENABLED; 998 999 pr_info("Using the UAS protocol\n"); 1000 return; 1001err_wq: 1002 usb_ep_disable(fu->ep_status); 1003err_status: 1004 usb_ep_disable(fu->ep_cmd); 1005err_cmd: 1006 usb_ep_disable(fu->ep_out); 1007err_b_out: 1008 usb_ep_disable(fu->ep_in); 1009err_b_in: 1010 fu->flags = 0; 1011} 1012 1013static int get_cmd_dir(const unsigned char *cdb) 1014{ 1015 int ret; 1016 1017 switch (cdb[0]) { 1018 case READ_6: 1019 case READ_10: 1020 case READ_12: 1021 case READ_16: 1022 case INQUIRY: 1023 case MODE_SENSE: 1024 case MODE_SENSE_10: 1025 case SERVICE_ACTION_IN_16: 1026 case MAINTENANCE_IN: 1027 case PERSISTENT_RESERVE_IN: 1028 case SECURITY_PROTOCOL_IN: 1029 case ACCESS_CONTROL_IN: 1030 case REPORT_LUNS: 1031 case READ_BLOCK_LIMITS: 1032 case READ_POSITION: 1033 case READ_CAPACITY: 1034 case READ_TOC: 1035 case READ_FORMAT_CAPACITIES: 1036 case REQUEST_SENSE: 1037 case ATA_12: 1038 case ATA_16: 1039 ret = DMA_FROM_DEVICE; 1040 break; 1041 1042 case WRITE_6: 1043 case WRITE_10: 1044 case WRITE_12: 1045 case WRITE_16: 1046 case MODE_SELECT: 1047 case MODE_SELECT_10: 1048 case WRITE_VERIFY: 1049 case WRITE_VERIFY_12: 1050 case PERSISTENT_RESERVE_OUT: 1051 case MAINTENANCE_OUT: 1052 case SECURITY_PROTOCOL_OUT: 1053 case ACCESS_CONTROL_OUT: 1054 ret = DMA_TO_DEVICE; 1055 break; 1056 case ALLOW_MEDIUM_REMOVAL: 1057 case TEST_UNIT_READY: 1058 case SYNCHRONIZE_CACHE: 1059 case START_STOP: 1060 case ERASE: 1061 case REZERO_UNIT: 1062 case SEEK_10: 1063 case SPACE: 1064 case VERIFY: 1065 case WRITE_FILEMARKS: 1066 ret = DMA_NONE; 1067 break; 1068 default: 1069#define CMD_DIR_MSG "target: Unknown data direction for SCSI Opcode 0x%02x\n" 1070 pr_warn(CMD_DIR_MSG, cdb[0]); 1071#undef CMD_DIR_MSG 1072 ret = -EINVAL; 1073 } 1074 return ret; 1075} 1076 1077static void usbg_data_write_cmpl(struct usb_ep *ep, struct usb_request *req) 1078{ 1079 struct usbg_cmd *cmd = req->context; 1080 struct se_cmd *se_cmd = &cmd->se_cmd; 1081 1082 cmd->state = UASP_QUEUE_COMMAND; 1083 1084 if (req->status == -ESHUTDOWN) { 1085 struct uas_stream *stream = &cmd->fu->stream[se_cmd->map_tag]; 1086 1087 hash_del(&stream->node); 1088 target_put_sess_cmd(se_cmd); 1089 transport_generic_free_cmd(&cmd->se_cmd, 0); 1090 return; 1091 } 1092 1093 if (req->status) { 1094 pr_err("%s() state %d transfer failed\n", __func__, cmd->state); 1095 goto cleanup; 1096 } 1097 1098 if (req->num_sgs == 0) { 1099 sg_copy_from_buffer(se_cmd->t_data_sg, 1100 se_cmd->t_data_nents, 1101 cmd->data_buf, 1102 se_cmd->data_length); 1103 } 1104 1105 cmd->flags |= USBG_CMD_PENDING_DATA_WRITE; 1106 queue_work(cmd->fu->tpg->workqueue, &cmd->work); 1107 return; 1108 1109cleanup: 1110 target_put_sess_cmd(se_cmd); 1111 1112 /* Command was aborted due to overlapped tag */ 1113 if (cmd->state == UASP_QUEUE_COMMAND && 1114 cmd->tmr_rsp == RC_OVERLAPPED_TAG) { 1115 uasp_send_tm_response(cmd); 1116 return; 1117 } 1118 1119 transport_send_check_condition_and_sense(se_cmd, 1120 TCM_CHECK_CONDITION_ABORT_CMD, 0); 1121} 1122 1123static int usbg_prepare_w_request(struct usbg_cmd *cmd, struct usb_request *req) 1124{ 1125 struct se_cmd *se_cmd = &cmd->se_cmd; 1126 struct f_uas *fu = cmd->fu; 1127 struct usb_gadget *gadget = fuas_to_gadget(fu); 1128 1129 if (!gadget->sg_supported) { 1130 cmd->data_buf = kmalloc(se_cmd->data_length, GFP_ATOMIC); 1131 if (!cmd->data_buf) 1132 return -ENOMEM; 1133 1134 req->buf = cmd->data_buf; 1135 } else { 1136 req->buf = NULL; 1137 req->num_sgs = se_cmd->t_data_nents; 1138 req->sg = se_cmd->t_data_sg; 1139 } 1140 1141 req->is_last = 1; 1142 req->stream_id = cmd->tag; 1143 req->complete = usbg_data_write_cmpl; 1144 req->length = se_cmd->data_length; 1145 req->context = cmd; 1146 1147 cmd->state = UASP_SEND_STATUS; 1148 return 0; 1149} 1150 1151static int usbg_send_status_response(struct se_cmd *se_cmd) 1152{ 1153 struct usbg_cmd *cmd = container_of(se_cmd, struct usbg_cmd, 1154 se_cmd); 1155 struct f_uas *fu = cmd->fu; 1156 1157 if (fu->flags & USBG_IS_BOT) 1158 return bot_send_status_response(cmd); 1159 else 1160 return uasp_send_status_response(cmd); 1161} 1162 1163static int usbg_send_write_request(struct se_cmd *se_cmd) 1164{ 1165 struct usbg_cmd *cmd = container_of(se_cmd, struct usbg_cmd, 1166 se_cmd); 1167 struct f_uas *fu = cmd->fu; 1168 1169 if (fu->flags & USBG_IS_BOT) 1170 return bot_send_write_request(cmd); 1171 else 1172 return uasp_send_write_request(cmd); 1173} 1174 1175static int usbg_send_read_response(struct se_cmd *se_cmd) 1176{ 1177 struct usbg_cmd *cmd = container_of(se_cmd, struct usbg_cmd, 1178 se_cmd); 1179 struct f_uas *fu = cmd->fu; 1180 1181 if (fu->flags & USBG_IS_BOT) 1182 return bot_send_read_response(cmd); 1183 else 1184 return uasp_send_read_response(cmd); 1185} 1186 1187static void usbg_aborted_task(struct se_cmd *se_cmd); 1188 1189static void usbg_submit_tmr(struct usbg_cmd *cmd) 1190{ 1191 struct se_session *se_sess; 1192 struct se_cmd *se_cmd; 1193 int flags = TARGET_SCF_ACK_KREF; 1194 1195 se_cmd = &cmd->se_cmd; 1196 se_sess = cmd->fu->tpg->tpg_nexus->tvn_se_sess; 1197 1198 target_submit_tmr(se_cmd, se_sess, 1199 cmd->response_iu.add_response_info, 1200 cmd->unpacked_lun, NULL, uasp_to_tcm_func(cmd->tmr_func), 1201 GFP_ATOMIC, cmd->tag, flags); 1202} 1203 1204static void usbg_submit_cmd(struct usbg_cmd *cmd) 1205{ 1206 struct se_cmd *se_cmd; 1207 struct tcm_usbg_nexus *tv_nexus; 1208 struct usbg_tpg *tpg; 1209 int dir, flags = (TARGET_SCF_UNKNOWN_SIZE | TARGET_SCF_ACK_KREF); 1210 1211 /* 1212 * Note: each command will spawn its own process, and each stage of the 1213 * command is processed sequentially. Should this no longer be the case, 1214 * locking is needed. 1215 */ 1216 if (cmd->flags & USBG_CMD_PENDING_DATA_WRITE) { 1217 target_execute_cmd(&cmd->se_cmd); 1218 cmd->flags &= ~USBG_CMD_PENDING_DATA_WRITE; 1219 return; 1220 } 1221 1222 se_cmd = &cmd->se_cmd; 1223 tpg = cmd->fu->tpg; 1224 tv_nexus = tpg->tpg_nexus; 1225 if (!tv_nexus) { 1226 struct usb_gadget *gadget = fuas_to_gadget(cmd->fu); 1227 1228 dev_err(&gadget->dev, "Missing nexus, ignoring command\n"); 1229 return; 1230 } 1231 1232 dir = get_cmd_dir(cmd->cmd_buf); 1233 if (dir < 0) 1234 goto out; 1235 1236 target_submit_cmd(se_cmd, tv_nexus->tvn_se_sess, cmd->cmd_buf, 1237 cmd->sense_iu.sense, cmd->unpacked_lun, 0, 1238 cmd->prio_attr, dir, flags); 1239 1240 return; 1241 1242out: 1243 __target_init_cmd(se_cmd, 1244 tv_nexus->tvn_se_sess->se_tpg->se_tpg_tfo, 1245 tv_nexus->tvn_se_sess, cmd->data_len, DMA_NONE, 1246 cmd->prio_attr, cmd->sense_iu.sense, 1247 cmd->unpacked_lun, NULL); 1248 transport_send_check_condition_and_sense(se_cmd, 1249 TCM_UNSUPPORTED_SCSI_OPCODE, 0); 1250} 1251 1252static void usbg_cmd_work(struct work_struct *work) 1253{ 1254 struct usbg_cmd *cmd = container_of(work, struct usbg_cmd, work); 1255 1256 /* 1257 * Failure is detected by f_tcm here. Skip submitting the command to the 1258 * target core if we already know the failing response and send the usb 1259 * response to the host directly. 1260 */ 1261 if (cmd->tmr_rsp != RC_RESPONSE_UNKNOWN) 1262 goto skip; 1263 1264 if (cmd->tmr_func) 1265 usbg_submit_tmr(cmd); 1266 else 1267 usbg_submit_cmd(cmd); 1268 1269 return; 1270 1271skip: 1272 if (cmd->tmr_rsp == RC_OVERLAPPED_TAG) { 1273 struct f_uas *fu = cmd->fu; 1274 struct se_session *se_sess; 1275 struct uas_stream *stream = NULL; 1276 struct hlist_node *tmp; 1277 struct usbg_cmd *active_cmd = NULL; 1278 1279 se_sess = cmd->fu->tpg->tpg_nexus->tvn_se_sess; 1280 1281 hash_for_each_possible_safe(fu->stream_hash, stream, tmp, node, cmd->tag) { 1282 int i = stream - &fu->stream[0]; 1283 1284 active_cmd = &((struct usbg_cmd *)se_sess->sess_cmd_map)[i]; 1285 if (active_cmd->tag == cmd->tag) 1286 break; 1287 } 1288 1289 /* Sanity check */ 1290 if (!stream || (active_cmd && active_cmd->tag != cmd->tag)) { 1291 usbg_submit_command(cmd->fu, cmd->req); 1292 return; 1293 } 1294 1295 reinit_completion(&stream->cmd_completion); 1296 1297 /* 1298 * A UASP command consists of the command, data, and status 1299 * stages, each operating sequentially from different endpoints. 1300 * 1301 * Each USB endpoint operates independently, and depending on 1302 * hardware implementation, a completion callback for a transfer 1303 * from one endpoint may not reflect the order of completion on 1304 * the wire. This is particularly true for devices with 1305 * endpoints that have independent interrupts and event buffers. 1306 * 1307 * The driver must still detect misbehaving hosts and respond 1308 * with an overlap status. To reduce false overlap failures, 1309 * allow the active and matching stream ID a brief 1ms to 1310 * complete before responding with an overlap command failure. 1311 * Overlap failure should be rare. 1312 */ 1313 wait_for_completion_timeout(&stream->cmd_completion, msecs_to_jiffies(1)); 1314 1315 /* If the previous stream is completed, retry the command. */ 1316 if (!hash_hashed(&stream->node)) { 1317 usbg_submit_command(cmd->fu, cmd->req); 1318 return; 1319 } 1320 1321 /* 1322 * The command isn't submitted to the target core, so we're safe 1323 * to remove the bitmap index from the session tag pool. 1324 */ 1325 sbitmap_queue_clear(&se_sess->sess_tag_pool, 1326 cmd->se_cmd.map_tag, 1327 cmd->se_cmd.map_cpu); 1328 1329 /* 1330 * Overlap command tag detected. Cancel any pending transfer of 1331 * the command submitted to target core. 1332 */ 1333 active_cmd->tmr_rsp = RC_OVERLAPPED_TAG; 1334 usbg_aborted_task(&active_cmd->se_cmd); 1335 1336 /* Send the response after the transfer is aborted. */ 1337 return; 1338 } 1339 1340 uasp_send_tm_response(cmd); 1341} 1342 1343static struct usbg_cmd *usbg_get_cmd(struct f_uas *fu, 1344 struct tcm_usbg_nexus *tv_nexus, u32 scsi_tag) 1345{ 1346 struct se_session *se_sess = tv_nexus->tvn_se_sess; 1347 struct usbg_cmd *cmd; 1348 int tag, cpu; 1349 1350 tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); 1351 if (tag < 0) 1352 return ERR_PTR(-ENOMEM); 1353 1354 cmd = &((struct usbg_cmd *)se_sess->sess_cmd_map)[tag]; 1355 memset(cmd, 0, sizeof(*cmd)); 1356 cmd->se_cmd.map_tag = tag; 1357 cmd->se_cmd.map_cpu = cpu; 1358 cmd->se_cmd.cpuid = cpu; 1359 cmd->se_cmd.tag = cmd->tag = scsi_tag; 1360 cmd->fu = fu; 1361 1362 return cmd; 1363} 1364 1365static void usbg_release_cmd(struct se_cmd *); 1366 1367static int usbg_submit_command(struct f_uas *fu, struct usb_request *req) 1368{ 1369 struct iu *iu = req->buf; 1370 struct usbg_cmd *cmd; 1371 struct usbg_tpg *tpg = fu->tpg; 1372 struct tcm_usbg_nexus *tv_nexus; 1373 struct uas_stream *stream; 1374 struct hlist_node *tmp; 1375 struct command_iu *cmd_iu; 1376 u32 cmd_len; 1377 u16 scsi_tag; 1378 1379 tv_nexus = tpg->tpg_nexus; 1380 if (!tv_nexus) { 1381 pr_err("Missing nexus, ignoring command\n"); 1382 return -EINVAL; 1383 } 1384 1385 scsi_tag = be16_to_cpup(&iu->tag); 1386 cmd = usbg_get_cmd(fu, tv_nexus, scsi_tag); 1387 if (IS_ERR(cmd)) { 1388 pr_err("usbg_get_cmd failed\n"); 1389 return -ENOMEM; 1390 } 1391 1392 cmd->req = req; 1393 cmd->fu = fu; 1394 cmd->tag = scsi_tag; 1395 cmd->se_cmd.tag = scsi_tag; 1396 cmd->tmr_func = 0; 1397 cmd->tmr_rsp = RC_RESPONSE_UNKNOWN; 1398 cmd->flags = 0; 1399 1400 cmd_iu = (struct command_iu *)iu; 1401 1402 /* Command and Task Management IUs share the same LUN offset */ 1403 cmd->unpacked_lun = scsilun_to_int(&cmd_iu->lun); 1404 1405 if (iu->iu_id != IU_ID_COMMAND && iu->iu_id != IU_ID_TASK_MGMT) { 1406 cmd->tmr_rsp = RC_INVALID_INFO_UNIT; 1407 goto skip; 1408 } 1409 1410 hash_for_each_possible_safe(fu->stream_hash, stream, tmp, node, scsi_tag) { 1411 struct usbg_cmd *active_cmd; 1412 struct se_session *se_sess; 1413 int i = stream - &fu->stream[0]; 1414 1415 se_sess = cmd->fu->tpg->tpg_nexus->tvn_se_sess; 1416 active_cmd = &((struct usbg_cmd *)se_sess->sess_cmd_map)[i]; 1417 1418 if (active_cmd->tag == scsi_tag) { 1419 cmd->tmr_rsp = RC_OVERLAPPED_TAG; 1420 goto skip; 1421 } 1422 } 1423 1424 stream = &fu->stream[cmd->se_cmd.map_tag]; 1425 hash_add(fu->stream_hash, &stream->node, scsi_tag); 1426 1427 if (iu->iu_id == IU_ID_TASK_MGMT) { 1428 struct task_mgmt_iu *tm_iu; 1429 1430 tm_iu = (struct task_mgmt_iu *)iu; 1431 cmd->tmr_func = tm_iu->function; 1432 goto skip; 1433 } 1434 1435 cmd_len = (cmd_iu->len & ~0x3) + 16; 1436 if (cmd_len > USBG_MAX_CMD) { 1437 target_free_tag(tv_nexus->tvn_se_sess, &cmd->se_cmd); 1438 hash_del(&stream->node); 1439 return -EINVAL; 1440 } 1441 memcpy(cmd->cmd_buf, cmd_iu->cdb, cmd_len); 1442 1443 switch (cmd_iu->prio_attr & 0x7) { 1444 case UAS_HEAD_TAG: 1445 cmd->prio_attr = TCM_HEAD_TAG; 1446 break; 1447 case UAS_ORDERED_TAG: 1448 cmd->prio_attr = TCM_ORDERED_TAG; 1449 break; 1450 case UAS_ACA: 1451 cmd->prio_attr = TCM_ACA_TAG; 1452 break; 1453 default: 1454 pr_debug_once("Unsupported prio_attr: %02x.\n", 1455 cmd_iu->prio_attr); 1456 fallthrough; 1457 case UAS_SIMPLE_TAG: 1458 cmd->prio_attr = TCM_SIMPLE_TAG; 1459 break; 1460 } 1461 1462skip: 1463 INIT_WORK(&cmd->work, usbg_cmd_work); 1464 queue_work(tpg->workqueue, &cmd->work); 1465 1466 return 0; 1467} 1468 1469static void bot_cmd_work(struct work_struct *work) 1470{ 1471 struct usbg_cmd *cmd = container_of(work, struct usbg_cmd, work); 1472 struct se_cmd *se_cmd; 1473 struct tcm_usbg_nexus *tv_nexus; 1474 struct usbg_tpg *tpg; 1475 int flags = TARGET_SCF_ACK_KREF; 1476 int dir; 1477 1478 /* 1479 * Note: each command will spawn its own process, and each stage of the 1480 * command is processed sequentially. Should this no longer be the case, 1481 * locking is needed. 1482 */ 1483 if (cmd->flags & USBG_CMD_PENDING_DATA_WRITE) { 1484 target_execute_cmd(&cmd->se_cmd); 1485 cmd->flags &= ~USBG_CMD_PENDING_DATA_WRITE; 1486 return; 1487 } 1488 1489 se_cmd = &cmd->se_cmd; 1490 tpg = cmd->fu->tpg; 1491 tv_nexus = tpg->tpg_nexus; 1492 if (!tv_nexus) { 1493 struct usb_gadget *gadget = fuas_to_gadget(cmd->fu); 1494 1495 dev_err(&gadget->dev, "Missing nexus, ignoring command\n"); 1496 return; 1497 } 1498 1499 dir = get_cmd_dir(cmd->cmd_buf); 1500 if (dir < 0) 1501 goto out; 1502 1503 target_submit_cmd(se_cmd, tv_nexus->tvn_se_sess, 1504 cmd->cmd_buf, cmd->sense_iu.sense, cmd->unpacked_lun, 1505 cmd->data_len, cmd->prio_attr, dir, flags); 1506 return; 1507 1508out: 1509 __target_init_cmd(se_cmd, 1510 tv_nexus->tvn_se_sess->se_tpg->se_tpg_tfo, 1511 tv_nexus->tvn_se_sess, cmd->data_len, DMA_NONE, 1512 cmd->prio_attr, cmd->sense_iu.sense, 1513 cmd->unpacked_lun, NULL); 1514 transport_send_check_condition_and_sense(se_cmd, 1515 TCM_UNSUPPORTED_SCSI_OPCODE, 0); 1516} 1517 1518static int bot_submit_command(struct f_uas *fu, 1519 void *cmdbuf, unsigned int len) 1520{ 1521 struct bulk_cb_wrap *cbw = cmdbuf; 1522 struct usbg_cmd *cmd; 1523 struct usbg_tpg *tpg = fu->tpg; 1524 struct tcm_usbg_nexus *tv_nexus; 1525 u32 cmd_len; 1526 1527 if (cbw->Signature != cpu_to_le32(US_BULK_CB_SIGN)) { 1528 pr_err("Wrong signature on CBW\n"); 1529 return -EINVAL; 1530 } 1531 if (len != 31) { 1532 pr_err("Wrong length for CBW\n"); 1533 return -EINVAL; 1534 } 1535 1536 cmd_len = cbw->Length; 1537 if (cmd_len < 1 || cmd_len > 16) 1538 return -EINVAL; 1539 1540 tv_nexus = tpg->tpg_nexus; 1541 if (!tv_nexus) { 1542 pr_err("Missing nexus, ignoring command\n"); 1543 return -ENODEV; 1544 } 1545 1546 cmd = usbg_get_cmd(fu, tv_nexus, cbw->Tag); 1547 if (IS_ERR(cmd)) { 1548 pr_err("usbg_get_cmd failed\n"); 1549 return -ENOMEM; 1550 } 1551 memcpy(cmd->cmd_buf, cbw->CDB, cmd_len); 1552 1553 cmd->bot_tag = cbw->Tag; 1554 cmd->prio_attr = TCM_SIMPLE_TAG; 1555 cmd->unpacked_lun = cbw->Lun; 1556 cmd->is_read = cbw->Flags & US_BULK_FLAG_IN ? 1 : 0; 1557 cmd->data_len = le32_to_cpu(cbw->DataTransferLength); 1558 cmd->se_cmd.tag = le32_to_cpu(cmd->bot_tag); 1559 cmd->flags = 0; 1560 1561 INIT_WORK(&cmd->work, bot_cmd_work); 1562 queue_work(tpg->workqueue, &cmd->work); 1563 1564 return 0; 1565} 1566 1567/* Start fabric.c code */ 1568 1569static int usbg_check_true(struct se_portal_group *se_tpg) 1570{ 1571 return 1; 1572} 1573 1574static char *usbg_get_fabric_wwn(struct se_portal_group *se_tpg) 1575{ 1576 struct usbg_tpg *tpg = container_of(se_tpg, 1577 struct usbg_tpg, se_tpg); 1578 struct usbg_tport *tport = tpg->tport; 1579 1580 return &tport->tport_name[0]; 1581} 1582 1583static u16 usbg_get_tag(struct se_portal_group *se_tpg) 1584{ 1585 struct usbg_tpg *tpg = container_of(se_tpg, 1586 struct usbg_tpg, se_tpg); 1587 return tpg->tport_tpgt; 1588} 1589 1590static void usbg_release_cmd(struct se_cmd *se_cmd) 1591{ 1592 struct usbg_cmd *cmd = container_of(se_cmd, struct usbg_cmd, 1593 se_cmd); 1594 struct se_session *se_sess = se_cmd->se_sess; 1595 1596 cmd->tag = 0; 1597 kfree(cmd->data_buf); 1598 target_free_tag(se_sess, se_cmd); 1599} 1600 1601static void usbg_queue_tm_rsp(struct se_cmd *se_cmd) 1602{ 1603 struct usbg_cmd *cmd = container_of(se_cmd, struct usbg_cmd, se_cmd); 1604 1605 uasp_send_tm_response(cmd); 1606} 1607 1608static void usbg_aborted_task(struct se_cmd *se_cmd) 1609{ 1610 struct usbg_cmd *cmd = container_of(se_cmd, struct usbg_cmd, se_cmd); 1611 struct f_uas *fu = cmd->fu; 1612 struct usb_gadget *gadget = fuas_to_gadget(fu); 1613 struct uas_stream *stream = &fu->stream[se_cmd->map_tag]; 1614 int ret = 0; 1615 1616 if (stream->req_out->status == -EINPROGRESS) 1617 ret = usb_ep_dequeue(fu->ep_out, stream->req_out); 1618 else if (stream->req_in->status == -EINPROGRESS) 1619 ret = usb_ep_dequeue(fu->ep_in, stream->req_in); 1620 else if (stream->req_status->status == -EINPROGRESS) 1621 ret = usb_ep_dequeue(fu->ep_status, stream->req_status); 1622 1623 if (ret) 1624 dev_err(&gadget->dev, "Failed to abort cmd tag %d, (%d)\n", 1625 cmd->tag, ret); 1626 1627 cmd->state = UASP_QUEUE_COMMAND; 1628} 1629 1630static const char *usbg_check_wwn(const char *name) 1631{ 1632 const char *n; 1633 unsigned int len; 1634 1635 n = strstr(name, "naa."); 1636 if (!n) 1637 return NULL; 1638 n += 4; 1639 len = strlen(n); 1640 if (len == 0 || len > USBG_NAMELEN - 1) 1641 return NULL; 1642 return n; 1643} 1644 1645static int usbg_init_nodeacl(struct se_node_acl *se_nacl, const char *name) 1646{ 1647 if (!usbg_check_wwn(name)) 1648 return -EINVAL; 1649 return 0; 1650} 1651 1652static struct se_portal_group *usbg_make_tpg(struct se_wwn *wwn, 1653 const char *name) 1654{ 1655 struct usbg_tport *tport = container_of(wwn, struct usbg_tport, 1656 tport_wwn); 1657 struct usbg_tpg *tpg; 1658 u16 tpgt; 1659 int ret; 1660 struct f_tcm_opts *opts; 1661 unsigned i; 1662 1663 if (strstr(name, "tpgt_") != name) 1664 return ERR_PTR(-EINVAL); 1665 if (kstrtou16(name + 5, 0, &tpgt)) 1666 return ERR_PTR(-EINVAL); 1667 ret = -ENODEV; 1668 mutex_lock(&tpg_instances_lock); 1669 for (i = 0; i < TPG_INSTANCES; ++i) 1670 if (tpg_instances[i].func_inst && !tpg_instances[i].tpg) 1671 break; 1672 if (i == TPG_INSTANCES) 1673 goto unlock_inst; 1674 1675 opts = container_of(tpg_instances[i].func_inst, struct f_tcm_opts, 1676 func_inst); 1677 mutex_lock(&opts->dep_lock); 1678 if (!opts->ready) 1679 goto unlock_dep; 1680 1681 if (opts->has_dep) { 1682 if (!try_module_get(opts->dependent)) 1683 goto unlock_dep; 1684 } else { 1685 ret = configfs_depend_item_unlocked( 1686 wwn->wwn_group.cg_subsys, 1687 &opts->func_inst.group.cg_item); 1688 if (ret) 1689 goto unlock_dep; 1690 } 1691 1692 tpg = kzalloc(sizeof(struct usbg_tpg), GFP_KERNEL); 1693 ret = -ENOMEM; 1694 if (!tpg) 1695 goto unref_dep; 1696 mutex_init(&tpg->tpg_mutex); 1697 atomic_set(&tpg->tpg_port_count, 0); 1698 tpg->workqueue = alloc_workqueue("tcm_usb_gadget", 1699 WQ_UNBOUND, WQ_UNBOUND_MAX_ACTIVE); 1700 if (!tpg->workqueue) 1701 goto free_tpg; 1702 1703 tpg->tport = tport; 1704 tpg->tport_tpgt = tpgt; 1705 1706 /* 1707 * SPC doesn't assign a protocol identifier for USB-SCSI, so we 1708 * pretend to be SAS.. 1709 */ 1710 ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_SAS); 1711 if (ret < 0) 1712 goto free_workqueue; 1713 1714 tpg_instances[i].tpg = tpg; 1715 tpg->fi = tpg_instances[i].func_inst; 1716 mutex_unlock(&opts->dep_lock); 1717 mutex_unlock(&tpg_instances_lock); 1718 return &tpg->se_tpg; 1719 1720free_workqueue: 1721 destroy_workqueue(tpg->workqueue); 1722free_tpg: 1723 kfree(tpg); 1724unref_dep: 1725 if (opts->has_dep) 1726 module_put(opts->dependent); 1727 else 1728 configfs_undepend_item_unlocked(&opts->func_inst.group.cg_item); 1729unlock_dep: 1730 mutex_unlock(&opts->dep_lock); 1731unlock_inst: 1732 mutex_unlock(&tpg_instances_lock); 1733 1734 return ERR_PTR(ret); 1735} 1736 1737static int tcm_usbg_drop_nexus(struct usbg_tpg *); 1738 1739static void usbg_drop_tpg(struct se_portal_group *se_tpg) 1740{ 1741 struct usbg_tpg *tpg = container_of(se_tpg, 1742 struct usbg_tpg, se_tpg); 1743 unsigned i; 1744 struct f_tcm_opts *opts; 1745 1746 tcm_usbg_drop_nexus(tpg); 1747 core_tpg_deregister(se_tpg); 1748 destroy_workqueue(tpg->workqueue); 1749 1750 mutex_lock(&tpg_instances_lock); 1751 for (i = 0; i < TPG_INSTANCES; ++i) 1752 if (tpg_instances[i].tpg == tpg) 1753 break; 1754 if (i < TPG_INSTANCES) { 1755 tpg_instances[i].tpg = NULL; 1756 opts = container_of(tpg_instances[i].func_inst, 1757 struct f_tcm_opts, func_inst); 1758 mutex_lock(&opts->dep_lock); 1759 if (opts->has_dep) 1760 module_put(opts->dependent); 1761 else 1762 configfs_undepend_item_unlocked( 1763 &opts->func_inst.group.cg_item); 1764 mutex_unlock(&opts->dep_lock); 1765 } 1766 mutex_unlock(&tpg_instances_lock); 1767 1768 kfree(tpg); 1769} 1770 1771static struct se_wwn *usbg_make_tport( 1772 struct target_fabric_configfs *tf, 1773 struct config_group *group, 1774 const char *name) 1775{ 1776 struct usbg_tport *tport; 1777 const char *wnn_name; 1778 u64 wwpn = 0; 1779 1780 wnn_name = usbg_check_wwn(name); 1781 if (!wnn_name) 1782 return ERR_PTR(-EINVAL); 1783 1784 tport = kzalloc(sizeof(struct usbg_tport), GFP_KERNEL); 1785 if (!(tport)) 1786 return ERR_PTR(-ENOMEM); 1787 1788 tport->tport_wwpn = wwpn; 1789 snprintf(tport->tport_name, sizeof(tport->tport_name), "%s", wnn_name); 1790 return &tport->tport_wwn; 1791} 1792 1793static void usbg_drop_tport(struct se_wwn *wwn) 1794{ 1795 struct usbg_tport *tport = container_of(wwn, 1796 struct usbg_tport, tport_wwn); 1797 kfree(tport); 1798} 1799 1800/* 1801 * If somebody feels like dropping the version property, go ahead. 1802 */ 1803static ssize_t usbg_wwn_version_show(struct config_item *item, char *page) 1804{ 1805 return sprintf(page, "usb-gadget fabric module\n"); 1806} 1807 1808CONFIGFS_ATTR_RO(usbg_wwn_, version); 1809 1810static struct configfs_attribute *usbg_wwn_attrs[] = { 1811 &usbg_wwn_attr_version, 1812 NULL, 1813}; 1814 1815static int usbg_attach(struct usbg_tpg *); 1816static void usbg_detach(struct usbg_tpg *); 1817 1818static int usbg_enable_tpg(struct se_portal_group *se_tpg, bool enable) 1819{ 1820 struct usbg_tpg *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg); 1821 int ret = 0; 1822 1823 if (enable) 1824 ret = usbg_attach(tpg); 1825 else 1826 usbg_detach(tpg); 1827 if (ret) 1828 return ret; 1829 1830 tpg->gadget_connect = enable; 1831 1832 return 0; 1833} 1834 1835static ssize_t tcm_usbg_tpg_nexus_show(struct config_item *item, char *page) 1836{ 1837 struct se_portal_group *se_tpg = to_tpg(item); 1838 struct usbg_tpg *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg); 1839 struct tcm_usbg_nexus *tv_nexus; 1840 ssize_t ret; 1841 1842 mutex_lock(&tpg->tpg_mutex); 1843 tv_nexus = tpg->tpg_nexus; 1844 if (!tv_nexus) { 1845 ret = -ENODEV; 1846 goto out; 1847 } 1848 ret = sysfs_emit(page, "%s\n", 1849 tv_nexus->tvn_se_sess->se_node_acl->initiatorname); 1850out: 1851 mutex_unlock(&tpg->tpg_mutex); 1852 return ret; 1853} 1854 1855static int usbg_alloc_sess_cb(struct se_portal_group *se_tpg, 1856 struct se_session *se_sess, void *p) 1857{ 1858 struct usbg_tpg *tpg = container_of(se_tpg, 1859 struct usbg_tpg, se_tpg); 1860 1861 tpg->tpg_nexus = p; 1862 return 0; 1863} 1864 1865static int tcm_usbg_make_nexus(struct usbg_tpg *tpg, char *name) 1866{ 1867 struct tcm_usbg_nexus *tv_nexus; 1868 int ret = 0; 1869 1870 mutex_lock(&tpg->tpg_mutex); 1871 if (tpg->tpg_nexus) { 1872 ret = -EEXIST; 1873 pr_debug("tpg->tpg_nexus already exists\n"); 1874 goto out_unlock; 1875 } 1876 1877 tv_nexus = kzalloc(sizeof(*tv_nexus), GFP_KERNEL); 1878 if (!tv_nexus) { 1879 ret = -ENOMEM; 1880 goto out_unlock; 1881 } 1882 1883 tv_nexus->tvn_se_sess = target_setup_session(&tpg->se_tpg, 1884 USB_G_DEFAULT_SESSION_TAGS, 1885 sizeof(struct usbg_cmd), 1886 TARGET_PROT_NORMAL, name, 1887 tv_nexus, usbg_alloc_sess_cb); 1888 if (IS_ERR(tv_nexus->tvn_se_sess)) { 1889#define MAKE_NEXUS_MSG "core_tpg_check_initiator_node_acl() failed for %s\n" 1890 pr_debug(MAKE_NEXUS_MSG, name); 1891#undef MAKE_NEXUS_MSG 1892 ret = PTR_ERR(tv_nexus->tvn_se_sess); 1893 kfree(tv_nexus); 1894 } 1895 1896out_unlock: 1897 mutex_unlock(&tpg->tpg_mutex); 1898 return ret; 1899} 1900 1901static int tcm_usbg_drop_nexus(struct usbg_tpg *tpg) 1902{ 1903 struct se_session *se_sess; 1904 struct tcm_usbg_nexus *tv_nexus; 1905 int ret = -ENODEV; 1906 1907 mutex_lock(&tpg->tpg_mutex); 1908 tv_nexus = tpg->tpg_nexus; 1909 if (!tv_nexus) 1910 goto out; 1911 1912 se_sess = tv_nexus->tvn_se_sess; 1913 if (!se_sess) 1914 goto out; 1915 1916 if (atomic_read(&tpg->tpg_port_count)) { 1917 ret = -EPERM; 1918#define MSG "Unable to remove Host I_T Nexus with active TPG port count: %d\n" 1919 pr_err(MSG, atomic_read(&tpg->tpg_port_count)); 1920#undef MSG 1921 goto out; 1922 } 1923 1924 pr_debug("Removing I_T Nexus to Initiator Port: %s\n", 1925 tv_nexus->tvn_se_sess->se_node_acl->initiatorname); 1926 /* 1927 * Release the SCSI I_T Nexus to the emulated vHost Target Port 1928 */ 1929 target_remove_session(se_sess); 1930 tpg->tpg_nexus = NULL; 1931 1932 kfree(tv_nexus); 1933 ret = 0; 1934out: 1935 mutex_unlock(&tpg->tpg_mutex); 1936 return ret; 1937} 1938 1939static ssize_t tcm_usbg_tpg_nexus_store(struct config_item *item, 1940 const char *page, size_t count) 1941{ 1942 struct se_portal_group *se_tpg = to_tpg(item); 1943 struct usbg_tpg *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg); 1944 unsigned char i_port[USBG_NAMELEN], *ptr; 1945 int ret; 1946 1947 if (!strncmp(page, "NULL", 4)) { 1948 ret = tcm_usbg_drop_nexus(tpg); 1949 return (!ret) ? count : ret; 1950 } 1951 if (strlen(page) >= USBG_NAMELEN) { 1952 1953#define NEXUS_STORE_MSG "Emulated NAA Sas Address: %s, exceeds max: %d\n" 1954 pr_err(NEXUS_STORE_MSG, page, USBG_NAMELEN); 1955#undef NEXUS_STORE_MSG 1956 return -EINVAL; 1957 } 1958 snprintf(i_port, USBG_NAMELEN, "%s", page); 1959 1960 ptr = strstr(i_port, "naa."); 1961 if (!ptr) { 1962 pr_err("Missing 'naa.' prefix\n"); 1963 return -EINVAL; 1964 } 1965 1966 if (i_port[strlen(i_port) - 1] == '\n') 1967 i_port[strlen(i_port) - 1] = '\0'; 1968 1969 ret = tcm_usbg_make_nexus(tpg, &i_port[0]); 1970 if (ret < 0) 1971 return ret; 1972 return count; 1973} 1974 1975CONFIGFS_ATTR(tcm_usbg_tpg_, nexus); 1976 1977static struct configfs_attribute *usbg_base_attrs[] = { 1978 &tcm_usbg_tpg_attr_nexus, 1979 NULL, 1980}; 1981 1982static int usbg_port_link(struct se_portal_group *se_tpg, struct se_lun *lun) 1983{ 1984 struct usbg_tpg *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg); 1985 1986 atomic_inc(&tpg->tpg_port_count); 1987 smp_mb__after_atomic(); 1988 return 0; 1989} 1990 1991static void usbg_port_unlink(struct se_portal_group *se_tpg, 1992 struct se_lun *se_lun) 1993{ 1994 struct usbg_tpg *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg); 1995 1996 atomic_dec(&tpg->tpg_port_count); 1997 smp_mb__after_atomic(); 1998} 1999 2000static int usbg_check_stop_free(struct se_cmd *se_cmd) 2001{ 2002 return target_put_sess_cmd(se_cmd); 2003} 2004 2005static const struct target_core_fabric_ops usbg_ops = { 2006 .module = THIS_MODULE, 2007 .fabric_name = "usb_gadget", 2008 .tpg_get_wwn = usbg_get_fabric_wwn, 2009 .tpg_get_tag = usbg_get_tag, 2010 .tpg_check_demo_mode = usbg_check_true, 2011 .release_cmd = usbg_release_cmd, 2012 .sess_get_initiator_sid = NULL, 2013 .write_pending = usbg_send_write_request, 2014 .queue_data_in = usbg_send_read_response, 2015 .queue_status = usbg_send_status_response, 2016 .queue_tm_rsp = usbg_queue_tm_rsp, 2017 .aborted_task = usbg_aborted_task, 2018 .check_stop_free = usbg_check_stop_free, 2019 2020 .fabric_make_wwn = usbg_make_tport, 2021 .fabric_drop_wwn = usbg_drop_tport, 2022 .fabric_make_tpg = usbg_make_tpg, 2023 .fabric_enable_tpg = usbg_enable_tpg, 2024 .fabric_drop_tpg = usbg_drop_tpg, 2025 .fabric_post_link = usbg_port_link, 2026 .fabric_pre_unlink = usbg_port_unlink, 2027 .fabric_init_nodeacl = usbg_init_nodeacl, 2028 2029 .tfc_wwn_attrs = usbg_wwn_attrs, 2030 .tfc_tpg_base_attrs = usbg_base_attrs, 2031 2032 .default_submit_type = TARGET_DIRECT_SUBMIT, 2033 .direct_submit_supp = 1, 2034}; 2035 2036/* Start gadget.c code */ 2037 2038static struct usb_interface_descriptor bot_intf_desc = { 2039 .bLength = sizeof(bot_intf_desc), 2040 .bDescriptorType = USB_DT_INTERFACE, 2041 .bNumEndpoints = 2, 2042 .bAlternateSetting = USB_G_ALT_INT_BBB, 2043 .bInterfaceClass = USB_CLASS_MASS_STORAGE, 2044 .bInterfaceSubClass = USB_SC_SCSI, 2045 .bInterfaceProtocol = USB_PR_BULK, 2046}; 2047 2048static struct usb_interface_descriptor uasp_intf_desc = { 2049 .bLength = sizeof(uasp_intf_desc), 2050 .bDescriptorType = USB_DT_INTERFACE, 2051 .bNumEndpoints = 4, 2052 .bAlternateSetting = USB_G_ALT_INT_UAS, 2053 .bInterfaceClass = USB_CLASS_MASS_STORAGE, 2054 .bInterfaceSubClass = USB_SC_SCSI, 2055 .bInterfaceProtocol = USB_PR_UAS, 2056}; 2057 2058static struct usb_endpoint_descriptor uasp_bi_desc = { 2059 .bLength = USB_DT_ENDPOINT_SIZE, 2060 .bDescriptorType = USB_DT_ENDPOINT, 2061 .bEndpointAddress = USB_DIR_IN, 2062 .bmAttributes = USB_ENDPOINT_XFER_BULK, 2063 .wMaxPacketSize = cpu_to_le16(512), 2064}; 2065 2066static struct usb_endpoint_descriptor uasp_fs_bi_desc = { 2067 .bLength = USB_DT_ENDPOINT_SIZE, 2068 .bDescriptorType = USB_DT_ENDPOINT, 2069 .bEndpointAddress = USB_DIR_IN, 2070 .bmAttributes = USB_ENDPOINT_XFER_BULK, 2071}; 2072 2073static struct usb_pipe_usage_descriptor uasp_bi_pipe_desc = { 2074 .bLength = sizeof(uasp_bi_pipe_desc), 2075 .bDescriptorType = USB_DT_PIPE_USAGE, 2076 .bPipeID = DATA_IN_PIPE_ID, 2077}; 2078 2079static struct usb_endpoint_descriptor uasp_ss_bi_desc = { 2080 .bLength = USB_DT_ENDPOINT_SIZE, 2081 .bDescriptorType = USB_DT_ENDPOINT, 2082 .bEndpointAddress = USB_DIR_IN, 2083 .bmAttributes = USB_ENDPOINT_XFER_BULK, 2084 .wMaxPacketSize = cpu_to_le16(1024), 2085}; 2086 2087static struct usb_ss_ep_comp_descriptor uasp_bi_ep_comp_desc = { 2088 .bLength = sizeof(uasp_bi_ep_comp_desc), 2089 .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 2090 .bMaxBurst = 15, 2091 .bmAttributes = UASP_SS_EP_COMP_LOG_STREAMS, 2092 .wBytesPerInterval = 0, 2093}; 2094 2095static struct usb_ss_ep_comp_descriptor bot_bi_ep_comp_desc = { 2096 .bLength = sizeof(bot_bi_ep_comp_desc), 2097 .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 2098 .bMaxBurst = 15, 2099}; 2100 2101static struct usb_endpoint_descriptor uasp_bo_desc = { 2102 .bLength = USB_DT_ENDPOINT_SIZE, 2103 .bDescriptorType = USB_DT_ENDPOINT, 2104 .bEndpointAddress = USB_DIR_OUT, 2105 .bmAttributes = USB_ENDPOINT_XFER_BULK, 2106 .wMaxPacketSize = cpu_to_le16(512), 2107}; 2108 2109static struct usb_endpoint_descriptor uasp_fs_bo_desc = { 2110 .bLength = USB_DT_ENDPOINT_SIZE, 2111 .bDescriptorType = USB_DT_ENDPOINT, 2112 .bEndpointAddress = USB_DIR_OUT, 2113 .bmAttributes = USB_ENDPOINT_XFER_BULK, 2114}; 2115 2116static struct usb_pipe_usage_descriptor uasp_bo_pipe_desc = { 2117 .bLength = sizeof(uasp_bo_pipe_desc), 2118 .bDescriptorType = USB_DT_PIPE_USAGE, 2119 .bPipeID = DATA_OUT_PIPE_ID, 2120}; 2121 2122static struct usb_endpoint_descriptor uasp_ss_bo_desc = { 2123 .bLength = USB_DT_ENDPOINT_SIZE, 2124 .bDescriptorType = USB_DT_ENDPOINT, 2125 .bEndpointAddress = USB_DIR_OUT, 2126 .bmAttributes = USB_ENDPOINT_XFER_BULK, 2127 .wMaxPacketSize = cpu_to_le16(0x400), 2128}; 2129 2130static struct usb_ss_ep_comp_descriptor uasp_bo_ep_comp_desc = { 2131 .bLength = sizeof(uasp_bo_ep_comp_desc), 2132 .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 2133 .bMaxBurst = 15, 2134 .bmAttributes = UASP_SS_EP_COMP_LOG_STREAMS, 2135}; 2136 2137static struct usb_ss_ep_comp_descriptor bot_bo_ep_comp_desc = { 2138 .bLength = sizeof(bot_bo_ep_comp_desc), 2139 .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 2140 .bMaxBurst = 15, 2141}; 2142 2143static struct usb_endpoint_descriptor uasp_status_desc = { 2144 .bLength = USB_DT_ENDPOINT_SIZE, 2145 .bDescriptorType = USB_DT_ENDPOINT, 2146 .bEndpointAddress = USB_DIR_IN, 2147 .bmAttributes = USB_ENDPOINT_XFER_BULK, 2148 .wMaxPacketSize = cpu_to_le16(512), 2149}; 2150 2151static struct usb_endpoint_descriptor uasp_fs_status_desc = { 2152 .bLength = USB_DT_ENDPOINT_SIZE, 2153 .bDescriptorType = USB_DT_ENDPOINT, 2154 .bEndpointAddress = USB_DIR_IN, 2155 .bmAttributes = USB_ENDPOINT_XFER_BULK, 2156}; 2157 2158static struct usb_pipe_usage_descriptor uasp_status_pipe_desc = { 2159 .bLength = sizeof(uasp_status_pipe_desc), 2160 .bDescriptorType = USB_DT_PIPE_USAGE, 2161 .bPipeID = STATUS_PIPE_ID, 2162}; 2163 2164static struct usb_endpoint_descriptor uasp_ss_status_desc = { 2165 .bLength = USB_DT_ENDPOINT_SIZE, 2166 .bDescriptorType = USB_DT_ENDPOINT, 2167 .bEndpointAddress = USB_DIR_IN, 2168 .bmAttributes = USB_ENDPOINT_XFER_BULK, 2169 .wMaxPacketSize = cpu_to_le16(1024), 2170}; 2171 2172static struct usb_ss_ep_comp_descriptor uasp_status_in_ep_comp_desc = { 2173 .bLength = sizeof(uasp_status_in_ep_comp_desc), 2174 .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 2175 .bmAttributes = UASP_SS_EP_COMP_LOG_STREAMS, 2176}; 2177 2178static struct usb_endpoint_descriptor uasp_cmd_desc = { 2179 .bLength = USB_DT_ENDPOINT_SIZE, 2180 .bDescriptorType = USB_DT_ENDPOINT, 2181 .bEndpointAddress = USB_DIR_OUT, 2182 .bmAttributes = USB_ENDPOINT_XFER_BULK, 2183 .wMaxPacketSize = cpu_to_le16(512), 2184}; 2185 2186static struct usb_endpoint_descriptor uasp_fs_cmd_desc = { 2187 .bLength = USB_DT_ENDPOINT_SIZE, 2188 .bDescriptorType = USB_DT_ENDPOINT, 2189 .bEndpointAddress = USB_DIR_OUT, 2190 .bmAttributes = USB_ENDPOINT_XFER_BULK, 2191}; 2192 2193static struct usb_pipe_usage_descriptor uasp_cmd_pipe_desc = { 2194 .bLength = sizeof(uasp_cmd_pipe_desc), 2195 .bDescriptorType = USB_DT_PIPE_USAGE, 2196 .bPipeID = CMD_PIPE_ID, 2197}; 2198 2199static struct usb_endpoint_descriptor uasp_ss_cmd_desc = { 2200 .bLength = USB_DT_ENDPOINT_SIZE, 2201 .bDescriptorType = USB_DT_ENDPOINT, 2202 .bEndpointAddress = USB_DIR_OUT, 2203 .bmAttributes = USB_ENDPOINT_XFER_BULK, 2204 .wMaxPacketSize = cpu_to_le16(1024), 2205}; 2206 2207static struct usb_ss_ep_comp_descriptor uasp_cmd_comp_desc = { 2208 .bLength = sizeof(uasp_cmd_comp_desc), 2209 .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 2210}; 2211 2212static struct usb_descriptor_header *uasp_fs_function_desc[] = { 2213 (struct usb_descriptor_header *) &bot_intf_desc, 2214 (struct usb_descriptor_header *) &uasp_fs_bi_desc, 2215 (struct usb_descriptor_header *) &uasp_fs_bo_desc, 2216 2217 (struct usb_descriptor_header *) &uasp_intf_desc, 2218 (struct usb_descriptor_header *) &uasp_fs_bi_desc, 2219 (struct usb_descriptor_header *) &uasp_bi_pipe_desc, 2220 (struct usb_descriptor_header *) &uasp_fs_bo_desc, 2221 (struct usb_descriptor_header *) &uasp_bo_pipe_desc, 2222 (struct usb_descriptor_header *) &uasp_fs_status_desc, 2223 (struct usb_descriptor_header *) &uasp_status_pipe_desc, 2224 (struct usb_descriptor_header *) &uasp_fs_cmd_desc, 2225 (struct usb_descriptor_header *) &uasp_cmd_pipe_desc, 2226 NULL, 2227}; 2228 2229static struct usb_descriptor_header *uasp_hs_function_desc[] = { 2230 (struct usb_descriptor_header *) &bot_intf_desc, 2231 (struct usb_descriptor_header *) &uasp_bi_desc, 2232 (struct usb_descriptor_header *) &uasp_bo_desc, 2233 2234 (struct usb_descriptor_header *) &uasp_intf_desc, 2235 (struct usb_descriptor_header *) &uasp_bi_desc, 2236 (struct usb_descriptor_header *) &uasp_bi_pipe_desc, 2237 (struct usb_descriptor_header *) &uasp_bo_desc, 2238 (struct usb_descriptor_header *) &uasp_bo_pipe_desc, 2239 (struct usb_descriptor_header *) &uasp_status_desc, 2240 (struct usb_descriptor_header *) &uasp_status_pipe_desc, 2241 (struct usb_descriptor_header *) &uasp_cmd_desc, 2242 (struct usb_descriptor_header *) &uasp_cmd_pipe_desc, 2243 NULL, 2244}; 2245 2246static struct usb_descriptor_header *uasp_ss_function_desc[] = { 2247 (struct usb_descriptor_header *) &bot_intf_desc, 2248 (struct usb_descriptor_header *) &uasp_ss_bi_desc, 2249 (struct usb_descriptor_header *) &bot_bi_ep_comp_desc, 2250 (struct usb_descriptor_header *) &uasp_ss_bo_desc, 2251 (struct usb_descriptor_header *) &bot_bo_ep_comp_desc, 2252 2253 (struct usb_descriptor_header *) &uasp_intf_desc, 2254 (struct usb_descriptor_header *) &uasp_ss_bi_desc, 2255 (struct usb_descriptor_header *) &uasp_bi_ep_comp_desc, 2256 (struct usb_descriptor_header *) &uasp_bi_pipe_desc, 2257 (struct usb_descriptor_header *) &uasp_ss_bo_desc, 2258 (struct usb_descriptor_header *) &uasp_bo_ep_comp_desc, 2259 (struct usb_descriptor_header *) &uasp_bo_pipe_desc, 2260 (struct usb_descriptor_header *) &uasp_ss_status_desc, 2261 (struct usb_descriptor_header *) &uasp_status_in_ep_comp_desc, 2262 (struct usb_descriptor_header *) &uasp_status_pipe_desc, 2263 (struct usb_descriptor_header *) &uasp_ss_cmd_desc, 2264 (struct usb_descriptor_header *) &uasp_cmd_comp_desc, 2265 (struct usb_descriptor_header *) &uasp_cmd_pipe_desc, 2266 NULL, 2267}; 2268 2269static struct usb_string tcm_us_strings[] = { 2270 [USB_G_STR_INT_UAS].s = "USB Attached SCSI", 2271 [USB_G_STR_INT_BBB].s = "Bulk Only Transport", 2272 { }, 2273}; 2274 2275static struct usb_gadget_strings tcm_stringtab = { 2276 .language = 0x0409, 2277 .strings = tcm_us_strings, 2278}; 2279 2280static struct usb_gadget_strings *tcm_strings[] = { 2281 &tcm_stringtab, 2282 NULL, 2283}; 2284 2285static int tcm_bind(struct usb_configuration *c, struct usb_function *f) 2286{ 2287 struct f_uas *fu = to_f_uas(f); 2288 struct usb_string *us; 2289 struct usb_gadget *gadget = c->cdev->gadget; 2290 struct usb_ep *ep; 2291 struct f_tcm_opts *opts; 2292 int iface; 2293 int ret; 2294 2295 opts = container_of(f->fi, struct f_tcm_opts, func_inst); 2296 2297 mutex_lock(&opts->dep_lock); 2298 if (!opts->can_attach) { 2299 mutex_unlock(&opts->dep_lock); 2300 return -ENODEV; 2301 } 2302 mutex_unlock(&opts->dep_lock); 2303 us = usb_gstrings_attach(c->cdev, tcm_strings, 2304 ARRAY_SIZE(tcm_us_strings)); 2305 if (IS_ERR(us)) 2306 return PTR_ERR(us); 2307 bot_intf_desc.iInterface = us[USB_G_STR_INT_BBB].id; 2308 uasp_intf_desc.iInterface = us[USB_G_STR_INT_UAS].id; 2309 2310 iface = usb_interface_id(c, f); 2311 if (iface < 0) 2312 return iface; 2313 2314 bot_intf_desc.bInterfaceNumber = iface; 2315 uasp_intf_desc.bInterfaceNumber = iface; 2316 fu->iface = iface; 2317 ep = usb_ep_autoconfig(gadget, &uasp_fs_bi_desc); 2318 if (!ep) 2319 goto ep_fail; 2320 2321 fu->ep_in = ep; 2322 2323 ep = usb_ep_autoconfig(gadget, &uasp_fs_bo_desc); 2324 if (!ep) 2325 goto ep_fail; 2326 fu->ep_out = ep; 2327 2328 ep = usb_ep_autoconfig(gadget, &uasp_fs_status_desc); 2329 if (!ep) 2330 goto ep_fail; 2331 fu->ep_status = ep; 2332 2333 ep = usb_ep_autoconfig(gadget, &uasp_fs_cmd_desc); 2334 if (!ep) 2335 goto ep_fail; 2336 fu->ep_cmd = ep; 2337 2338 /* Assume endpoint addresses are the same for both speeds */ 2339 uasp_bi_desc.bEndpointAddress = uasp_fs_bi_desc.bEndpointAddress; 2340 uasp_bo_desc.bEndpointAddress = uasp_fs_bo_desc.bEndpointAddress; 2341 uasp_status_desc.bEndpointAddress = 2342 uasp_fs_status_desc.bEndpointAddress; 2343 uasp_cmd_desc.bEndpointAddress = uasp_fs_cmd_desc.bEndpointAddress; 2344 2345 uasp_ss_bi_desc.bEndpointAddress = uasp_fs_bi_desc.bEndpointAddress; 2346 uasp_ss_bo_desc.bEndpointAddress = uasp_fs_bo_desc.bEndpointAddress; 2347 uasp_ss_status_desc.bEndpointAddress = 2348 uasp_fs_status_desc.bEndpointAddress; 2349 uasp_ss_cmd_desc.bEndpointAddress = uasp_fs_cmd_desc.bEndpointAddress; 2350 2351 ret = usb_assign_descriptors(f, uasp_fs_function_desc, 2352 uasp_hs_function_desc, uasp_ss_function_desc, 2353 uasp_ss_function_desc); 2354 if (ret) 2355 goto ep_fail; 2356 2357 return 0; 2358ep_fail: 2359 pr_err("Can't claim all required eps\n"); 2360 2361 return -ENOTSUPP; 2362} 2363 2364struct guas_setup_wq { 2365 struct work_struct work; 2366 struct f_uas *fu; 2367 unsigned int alt; 2368}; 2369 2370static void tcm_delayed_set_alt(struct work_struct *wq) 2371{ 2372 struct guas_setup_wq *work = container_of(wq, struct guas_setup_wq, 2373 work); 2374 struct f_uas *fu = work->fu; 2375 int alt = work->alt; 2376 2377 kfree(work); 2378 2379 if (fu->flags & USBG_IS_BOT) 2380 bot_cleanup_old_alt(fu); 2381 if (fu->flags & USBG_IS_UAS) 2382 uasp_cleanup_old_alt(fu); 2383 2384 if (alt == USB_G_ALT_INT_BBB) 2385 bot_set_alt(fu); 2386 else if (alt == USB_G_ALT_INT_UAS) 2387 uasp_set_alt(fu); 2388 usb_composite_setup_continue(fu->function.config->cdev); 2389} 2390 2391static int tcm_get_alt(struct usb_function *f, unsigned intf) 2392{ 2393 struct f_uas *fu = to_f_uas(f); 2394 2395 if (fu->iface != intf) 2396 return -EOPNOTSUPP; 2397 2398 if (fu->flags & USBG_IS_BOT) 2399 return USB_G_ALT_INT_BBB; 2400 else if (fu->flags & USBG_IS_UAS) 2401 return USB_G_ALT_INT_UAS; 2402 2403 return -EOPNOTSUPP; 2404} 2405 2406static int tcm_set_alt(struct usb_function *f, unsigned intf, unsigned alt) 2407{ 2408 struct f_uas *fu = to_f_uas(f); 2409 2410 if (fu->iface != intf) 2411 return -EOPNOTSUPP; 2412 2413 if ((alt == USB_G_ALT_INT_BBB) || (alt == USB_G_ALT_INT_UAS)) { 2414 struct guas_setup_wq *work; 2415 2416 work = kmalloc(sizeof(*work), GFP_ATOMIC); 2417 if (!work) 2418 return -ENOMEM; 2419 INIT_WORK(&work->work, tcm_delayed_set_alt); 2420 work->fu = fu; 2421 work->alt = alt; 2422 schedule_work(&work->work); 2423 return USB_GADGET_DELAYED_STATUS; 2424 } 2425 return -EOPNOTSUPP; 2426} 2427 2428static void tcm_disable(struct usb_function *f) 2429{ 2430 struct f_uas *fu = to_f_uas(f); 2431 2432 if (fu->flags & USBG_IS_UAS) 2433 uasp_cleanup_old_alt(fu); 2434 else if (fu->flags & USBG_IS_BOT) 2435 bot_cleanup_old_alt(fu); 2436 fu->flags = 0; 2437} 2438 2439static int tcm_setup(struct usb_function *f, 2440 const struct usb_ctrlrequest *ctrl) 2441{ 2442 struct f_uas *fu = to_f_uas(f); 2443 2444 if (!(fu->flags & USBG_IS_BOT)) 2445 return -EOPNOTSUPP; 2446 2447 return usbg_bot_setup(f, ctrl); 2448} 2449 2450static inline struct f_tcm_opts *to_f_tcm_opts(struct config_item *item) 2451{ 2452 return container_of(to_config_group(item), struct f_tcm_opts, 2453 func_inst.group); 2454} 2455 2456static void tcm_attr_release(struct config_item *item) 2457{ 2458 struct f_tcm_opts *opts = to_f_tcm_opts(item); 2459 2460 usb_put_function_instance(&opts->func_inst); 2461} 2462 2463static struct configfs_item_operations tcm_item_ops = { 2464 .release = tcm_attr_release, 2465}; 2466 2467static const struct config_item_type tcm_func_type = { 2468 .ct_item_ops = &tcm_item_ops, 2469 .ct_owner = THIS_MODULE, 2470}; 2471 2472static void tcm_free_inst(struct usb_function_instance *f) 2473{ 2474 struct f_tcm_opts *opts; 2475 unsigned i; 2476 2477 opts = container_of(f, struct f_tcm_opts, func_inst); 2478 2479 mutex_lock(&tpg_instances_lock); 2480 for (i = 0; i < TPG_INSTANCES; ++i) 2481 if (tpg_instances[i].func_inst == f) 2482 break; 2483 if (i < TPG_INSTANCES) 2484 tpg_instances[i].func_inst = NULL; 2485 mutex_unlock(&tpg_instances_lock); 2486 2487 kfree(opts); 2488} 2489 2490static int tcm_register_callback(struct usb_function_instance *f) 2491{ 2492 struct f_tcm_opts *opts = container_of(f, struct f_tcm_opts, func_inst); 2493 2494 mutex_lock(&opts->dep_lock); 2495 opts->can_attach = true; 2496 mutex_unlock(&opts->dep_lock); 2497 2498 return 0; 2499} 2500 2501static void tcm_unregister_callback(struct usb_function_instance *f) 2502{ 2503 struct f_tcm_opts *opts = container_of(f, struct f_tcm_opts, func_inst); 2504 2505 mutex_lock(&opts->dep_lock); 2506 unregister_gadget_item(opts-> 2507 func_inst.group.cg_item.ci_parent->ci_parent); 2508 opts->can_attach = false; 2509 mutex_unlock(&opts->dep_lock); 2510} 2511 2512static int usbg_attach(struct usbg_tpg *tpg) 2513{ 2514 struct usb_function_instance *f = tpg->fi; 2515 struct f_tcm_opts *opts = container_of(f, struct f_tcm_opts, func_inst); 2516 2517 if (opts->tcm_register_callback) 2518 return opts->tcm_register_callback(f); 2519 2520 return 0; 2521} 2522 2523static void usbg_detach(struct usbg_tpg *tpg) 2524{ 2525 struct usb_function_instance *f = tpg->fi; 2526 struct f_tcm_opts *opts = container_of(f, struct f_tcm_opts, func_inst); 2527 2528 if (opts->tcm_unregister_callback) 2529 opts->tcm_unregister_callback(f); 2530} 2531 2532static int tcm_set_name(struct usb_function_instance *f, const char *name) 2533{ 2534 struct f_tcm_opts *opts = container_of(f, struct f_tcm_opts, func_inst); 2535 2536 pr_debug("tcm: Activating %s\n", name); 2537 2538 mutex_lock(&opts->dep_lock); 2539 opts->ready = true; 2540 mutex_unlock(&opts->dep_lock); 2541 2542 return 0; 2543} 2544 2545static struct usb_function_instance *tcm_alloc_inst(void) 2546{ 2547 struct f_tcm_opts *opts; 2548 int i; 2549 2550 2551 opts = kzalloc(sizeof(*opts), GFP_KERNEL); 2552 if (!opts) 2553 return ERR_PTR(-ENOMEM); 2554 2555 mutex_lock(&tpg_instances_lock); 2556 for (i = 0; i < TPG_INSTANCES; ++i) 2557 if (!tpg_instances[i].func_inst) 2558 break; 2559 2560 if (i == TPG_INSTANCES) { 2561 mutex_unlock(&tpg_instances_lock); 2562 kfree(opts); 2563 return ERR_PTR(-EBUSY); 2564 } 2565 tpg_instances[i].func_inst = &opts->func_inst; 2566 mutex_unlock(&tpg_instances_lock); 2567 2568 mutex_init(&opts->dep_lock); 2569 opts->func_inst.set_inst_name = tcm_set_name; 2570 opts->func_inst.free_func_inst = tcm_free_inst; 2571 opts->tcm_register_callback = tcm_register_callback; 2572 opts->tcm_unregister_callback = tcm_unregister_callback; 2573 2574 config_group_init_type_name(&opts->func_inst.group, "", 2575 &tcm_func_type); 2576 2577 return &opts->func_inst; 2578} 2579 2580static void tcm_free(struct usb_function *f) 2581{ 2582 struct f_uas *tcm = to_f_uas(f); 2583 2584 kfree(tcm); 2585} 2586 2587static void tcm_unbind(struct usb_configuration *c, struct usb_function *f) 2588{ 2589 usb_free_all_descriptors(f); 2590} 2591 2592static struct usb_function *tcm_alloc(struct usb_function_instance *fi) 2593{ 2594 struct f_uas *fu; 2595 unsigned i; 2596 2597 mutex_lock(&tpg_instances_lock); 2598 for (i = 0; i < TPG_INSTANCES; ++i) 2599 if (tpg_instances[i].func_inst == fi) 2600 break; 2601 if (i == TPG_INSTANCES) { 2602 mutex_unlock(&tpg_instances_lock); 2603 return ERR_PTR(-ENODEV); 2604 } 2605 2606 fu = kzalloc(sizeof(*fu), GFP_KERNEL); 2607 if (!fu) { 2608 mutex_unlock(&tpg_instances_lock); 2609 return ERR_PTR(-ENOMEM); 2610 } 2611 2612 fu->function.name = "Target Function"; 2613 fu->function.bind = tcm_bind; 2614 fu->function.unbind = tcm_unbind; 2615 fu->function.set_alt = tcm_set_alt; 2616 fu->function.get_alt = tcm_get_alt; 2617 fu->function.setup = tcm_setup; 2618 fu->function.disable = tcm_disable; 2619 fu->function.free_func = tcm_free; 2620 fu->tpg = tpg_instances[i].tpg; 2621 2622 hash_init(fu->stream_hash); 2623 mutex_unlock(&tpg_instances_lock); 2624 2625 return &fu->function; 2626} 2627 2628DECLARE_USB_FUNCTION(tcm, tcm_alloc_inst, tcm_alloc); 2629 2630static int __init tcm_init(void) 2631{ 2632 int ret; 2633 2634 ret = usb_function_register(&tcmusb_func); 2635 if (ret) 2636 return ret; 2637 2638 ret = target_register_template(&usbg_ops); 2639 if (ret) 2640 usb_function_unregister(&tcmusb_func); 2641 2642 return ret; 2643} 2644module_init(tcm_init); 2645 2646static void __exit tcm_exit(void) 2647{ 2648 target_unregister_template(&usbg_ops); 2649 usb_function_unregister(&tcmusb_func); 2650} 2651module_exit(tcm_exit); 2652 2653MODULE_DESCRIPTION("Target based USB-Gadget"); 2654MODULE_LICENSE("GPL"); 2655MODULE_AUTHOR("Sebastian Andrzej Siewior");
~/
Read-only file preview.