Linux Audio

Check our new training course

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