File Index
Files and directories
Sign in
FILE

efct_scsi.c

File preview with syntax highlighting.

linux-6.19.14/drivers/scsi/elx/efct/efct_scsi.c C
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
   4 * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
   5 */
   6
   7#include "efct_driver.h"
   8#include "efct_hw.h"
   9
  10#define enable_tsend_auto_resp(efct)	1
  11#define enable_treceive_auto_resp(efct)	0
  12
  13#define SCSI_IOFMT "[%04x][i:%04x t:%04x h:%04x]"
  14
  15#define scsi_io_printf(io, fmt, ...) \
  16	efc_log_debug(io->efct, "[%s]" SCSI_IOFMT fmt, \
  17		io->node->display_name, io->instance_index,\
  18		io->init_task_tag, io->tgt_task_tag, io->hw_tag, ##__VA_ARGS__)
  19
  20#define EFCT_LOG_ENABLE_SCSI_TRACE(efct)                \
  21		(((efct) != NULL) ? (((efct)->logmask & (1U << 2)) != 0) : 0)
  22
  23#define scsi_io_trace(io, fmt, ...) \
  24	do { \
  25		if (EFCT_LOG_ENABLE_SCSI_TRACE(io->efct)) \
  26			scsi_io_printf(io, fmt, ##__VA_ARGS__); \
  27	} while (0)
  28
  29struct efct_io *
  30efct_scsi_io_alloc(struct efct_node *node)
  31{
  32	struct efct *efct;
  33	struct efct_xport *xport;
  34	struct efct_io *io;
  35	unsigned long flags;
  36
  37	efct = node->efct;
  38
  39	xport = efct->xport;
  40
  41	io = efct_io_pool_io_alloc(efct->xport->io_pool);
  42	if (!io) {
  43		efc_log_err(efct, "IO alloc Failed\n");
  44		atomic_add_return(1, &xport->io_alloc_failed_count);
  45		return NULL;
  46	}
  47
  48	/* initialize refcount */
  49	kref_init(&io->ref);
  50	io->release = _efct_scsi_io_free;
  51
  52	/* set generic fields */
  53	io->efct = efct;
  54	io->node = node;
  55	kref_get(&node->ref);
  56
  57	/* set type and name */
  58	io->io_type = EFCT_IO_TYPE_IO;
  59	io->display_name = "scsi_io";
  60
  61	io->cmd_ini = false;
  62	io->cmd_tgt = true;
  63
  64	/* Add to node's active_ios list */
  65	INIT_LIST_HEAD(&io->list_entry);
  66	spin_lock_irqsave(&node->active_ios_lock, flags);
  67	list_add(&io->list_entry, &node->active_ios);
  68
  69	spin_unlock_irqrestore(&node->active_ios_lock, flags);
  70
  71	return io;
  72}
  73
  74void
  75_efct_scsi_io_free(struct kref *arg)
  76{
  77	struct efct_io *io = container_of(arg, struct efct_io, ref);
  78	struct efct *efct = io->efct;
  79	struct efct_node *node = io->node;
  80	unsigned long flags = 0;
  81
  82	scsi_io_trace(io, "freeing io 0x%p %s\n", io, io->display_name);
  83
  84	if (io->io_free) {
  85		efc_log_err(efct, "IO already freed.\n");
  86		return;
  87	}
  88
  89	spin_lock_irqsave(&node->active_ios_lock, flags);
  90	list_del_init(&io->list_entry);
  91	spin_unlock_irqrestore(&node->active_ios_lock, flags);
  92
  93	kref_put(&node->ref, node->release);
  94	io->node = NULL;
  95	efct_io_pool_io_free(efct->xport->io_pool, io);
  96}
  97
  98void
  99efct_scsi_io_free(struct efct_io *io)
 100{
 101	scsi_io_trace(io, "freeing io 0x%p %s\n", io, io->display_name);
 102	WARN_ON(!refcount_read(&io->ref.refcount));
 103	kref_put(&io->ref, io->release);
 104}
 105
 106static void
 107efct_target_io_cb(struct efct_hw_io *hio, u32 length, int status,
 108		  u32 ext_status, void *app)
 109{
 110	u32 flags = 0;
 111	struct efct_io *io = app;
 112	struct efct *efct;
 113	enum efct_scsi_io_status scsi_stat = EFCT_SCSI_STATUS_GOOD;
 114	efct_scsi_io_cb_t cb;
 115
 116	if (!io || !io->efct) {
 117		pr_err("%s: IO can not be NULL\n", __func__);
 118		return;
 119	}
 120
 121	scsi_io_trace(io, "status x%x ext_status x%x\n", status, ext_status);
 122
 123	efct = io->efct;
 124
 125	io->transferred += length;
 126
 127	if (!io->scsi_tgt_cb) {
 128		efct_scsi_check_pending(efct);
 129		return;
 130	}
 131
 132	/* Call target server completion */
 133	cb = io->scsi_tgt_cb;
 134
 135	/* Clear the callback before invoking the callback */
 136	io->scsi_tgt_cb = NULL;
 137
 138	/* if status was good, and auto-good-response was set,
 139	 * then callback target-server with IO_CMPL_RSP_SENT,
 140	 * otherwise send IO_CMPL
 141	 */
 142	if (status == 0 && io->auto_resp)
 143		flags |= EFCT_SCSI_IO_CMPL_RSP_SENT;
 144	else
 145		flags |= EFCT_SCSI_IO_CMPL;
 146
 147	switch (status) {
 148	case SLI4_FC_WCQE_STATUS_SUCCESS:
 149		scsi_stat = EFCT_SCSI_STATUS_GOOD;
 150		break;
 151	case SLI4_FC_WCQE_STATUS_DI_ERROR:
 152		if (ext_status & SLI4_FC_DI_ERROR_GE)
 153			scsi_stat = EFCT_SCSI_STATUS_DIF_GUARD_ERR;
 154		else if (ext_status & SLI4_FC_DI_ERROR_AE)
 155			scsi_stat = EFCT_SCSI_STATUS_DIF_APP_TAG_ERROR;
 156		else if (ext_status & SLI4_FC_DI_ERROR_RE)
 157			scsi_stat = EFCT_SCSI_STATUS_DIF_REF_TAG_ERROR;
 158		else
 159			scsi_stat = EFCT_SCSI_STATUS_DIF_UNKNOWN_ERROR;
 160		break;
 161	case SLI4_FC_WCQE_STATUS_LOCAL_REJECT:
 162		switch (ext_status) {
 163		case SLI4_FC_LOCAL_REJECT_INVALID_RELOFFSET:
 164		case SLI4_FC_LOCAL_REJECT_ABORT_REQUESTED:
 165			scsi_stat = EFCT_SCSI_STATUS_ABORTED;
 166			break;
 167		case SLI4_FC_LOCAL_REJECT_INVALID_RPI:
 168			scsi_stat = EFCT_SCSI_STATUS_NEXUS_LOST;
 169			break;
 170		case SLI4_FC_LOCAL_REJECT_NO_XRI:
 171			scsi_stat = EFCT_SCSI_STATUS_NO_IO;
 172			break;
 173		default:
 174			/*we have seen 0x0d(TX_DMA_FAILED err)*/
 175			scsi_stat = EFCT_SCSI_STATUS_ERROR;
 176			break;
 177		}
 178		break;
 179
 180	case SLI4_FC_WCQE_STATUS_TARGET_WQE_TIMEOUT:
 181		/* target IO timed out */
 182		scsi_stat = EFCT_SCSI_STATUS_TIMEDOUT_AND_ABORTED;
 183		break;
 184
 185	case SLI4_FC_WCQE_STATUS_SHUTDOWN:
 186		/* Target IO cancelled by HW */
 187		scsi_stat = EFCT_SCSI_STATUS_SHUTDOWN;
 188		break;
 189
 190	default:
 191		scsi_stat = EFCT_SCSI_STATUS_ERROR;
 192		break;
 193	}
 194
 195	cb(io, scsi_stat, flags, io->scsi_tgt_cb_arg);
 196
 197	efct_scsi_check_pending(efct);
 198}
 199
 200static int
 201efct_scsi_build_sgls(struct efct_hw *hw, struct efct_hw_io *hio,
 202		     struct efct_scsi_sgl *sgl, u32 sgl_count,
 203		     enum efct_hw_io_type type)
 204{
 205	int rc;
 206	u32 i;
 207	struct efct *efct = hw->os;
 208
 209	/* Initialize HW SGL */
 210	rc = efct_hw_io_init_sges(hw, hio, type);
 211	if (rc) {
 212		efc_log_err(efct, "efct_hw_io_init_sges failed: %d\n", rc);
 213		return -EIO;
 214	}
 215
 216	for (i = 0; i < sgl_count; i++) {
 217		/* Add data SGE */
 218		rc = efct_hw_io_add_sge(hw, hio, sgl[i].addr, sgl[i].len);
 219		if (rc) {
 220			efc_log_err(efct, "add sge failed cnt=%d rc=%d\n",
 221				    sgl_count, rc);
 222			return rc;
 223		}
 224	}
 225
 226	return 0;
 227}
 228
 229static void efc_log_sgl(struct efct_io *io)
 230{
 231	struct efct_hw_io *hio = io->hio;
 232	struct sli4_sge *data = NULL;
 233	u32 *dword = NULL;
 234	u32 i;
 235	u32 n_sge;
 236
 237	scsi_io_trace(io, "def_sgl at 0x%x 0x%08x\n",
 238		      upper_32_bits(hio->def_sgl.phys),
 239		      lower_32_bits(hio->def_sgl.phys));
 240	n_sge = (hio->sgl == &hio->def_sgl) ? hio->n_sge : hio->def_sgl_count;
 241	for (i = 0, data = hio->def_sgl.virt; i < n_sge; i++, data++) {
 242		dword = (u32 *)data;
 243
 244		scsi_io_trace(io, "SGL %2d 0x%08x 0x%08x 0x%08x 0x%08x\n",
 245			      i, dword[0], dword[1], dword[2], dword[3]);
 246
 247		if (dword[2] & (1U << 31))
 248			break;
 249	}
 250}
 251
 252static void
 253efct_scsi_check_pending_async_cb(struct efct_hw *hw, int status,
 254				 u8 *mqe, void *arg)
 255{
 256	struct efct_io *io = arg;
 257
 258	if (io) {
 259		efct_hw_done_t cb = io->hw_cb;
 260
 261		if (!io->hw_cb)
 262			return;
 263
 264		io->hw_cb = NULL;
 265		(cb)(io->hio, 0, SLI4_FC_WCQE_STATUS_DISPATCH_ERROR, 0, io);
 266	}
 267}
 268
 269static int
 270efct_scsi_io_dispatch_hw_io(struct efct_io *io, struct efct_hw_io *hio)
 271{
 272	int rc = 0;
 273	struct efct *efct = io->efct;
 274
 275	/* Got a HW IO;
 276	 * update ini/tgt_task_tag with HW IO info and dispatch
 277	 */
 278	io->hio = hio;
 279	if (io->cmd_tgt)
 280		io->tgt_task_tag = hio->indicator;
 281	else if (io->cmd_ini)
 282		io->init_task_tag = hio->indicator;
 283	io->hw_tag = hio->reqtag;
 284
 285	hio->eq = io->hw_priv;
 286
 287	/* Copy WQ steering */
 288	switch (io->wq_steering) {
 289	case EFCT_SCSI_WQ_STEERING_CLASS >> EFCT_SCSI_WQ_STEERING_SHIFT:
 290		hio->wq_steering = EFCT_HW_WQ_STEERING_CLASS;
 291		break;
 292	case EFCT_SCSI_WQ_STEERING_REQUEST >> EFCT_SCSI_WQ_STEERING_SHIFT:
 293		hio->wq_steering = EFCT_HW_WQ_STEERING_REQUEST;
 294		break;
 295	case EFCT_SCSI_WQ_STEERING_CPU >> EFCT_SCSI_WQ_STEERING_SHIFT:
 296		hio->wq_steering = EFCT_HW_WQ_STEERING_CPU;
 297		break;
 298	}
 299
 300	switch (io->io_type) {
 301	case EFCT_IO_TYPE_IO:
 302		rc = efct_scsi_build_sgls(&efct->hw, io->hio,
 303					  io->sgl, io->sgl_count, io->hio_type);
 304		if (rc)
 305			break;
 306
 307		if (EFCT_LOG_ENABLE_SCSI_TRACE(efct))
 308			efc_log_sgl(io);
 309
 310		if (io->app_id)
 311			io->iparam.fcp_tgt.app_id = io->app_id;
 312
 313		io->iparam.fcp_tgt.vpi = io->node->vpi;
 314		io->iparam.fcp_tgt.rpi = io->node->rpi;
 315		io->iparam.fcp_tgt.s_id = io->node->port_fc_id;
 316		io->iparam.fcp_tgt.d_id = io->node->node_fc_id;
 317		io->iparam.fcp_tgt.xmit_len = io->wire_len;
 318
 319		rc = efct_hw_io_send(&io->efct->hw, io->hio_type, io->hio,
 320				     &io->iparam, io->hw_cb, io);
 321		break;
 322	default:
 323		scsi_io_printf(io, "Unknown IO type=%d\n", io->io_type);
 324		rc = -EIO;
 325		break;
 326	}
 327	return rc;
 328}
 329
 330static int
 331efct_scsi_io_dispatch_no_hw_io(struct efct_io *io)
 332{
 333	int rc;
 334
 335	switch (io->io_type) {
 336	case EFCT_IO_TYPE_ABORT: {
 337		struct efct_hw_io *hio_to_abort = NULL;
 338
 339		hio_to_abort = io->io_to_abort->hio;
 340
 341		if (!hio_to_abort) {
 342			/*
 343			 * If "IO to abort" does not have an
 344			 * associated HW IO, immediately make callback with
 345			 * success. The command must have been sent to
 346			 * the backend, but the data phase has not yet
 347			 * started, so we don't have a HW IO.
 348			 *
 349			 * Note: since the backend shims should be
 350			 * taking a reference on io_to_abort, it should not
 351			 * be possible to have been completed and freed by
 352			 * the backend before the abort got here.
 353			 */
 354			scsi_io_printf(io, "IO: not active\n");
 355			((efct_hw_done_t)io->hw_cb)(io->hio, 0,
 356					SLI4_FC_WCQE_STATUS_SUCCESS, 0, io);
 357			rc = 0;
 358			break;
 359		}
 360
 361		/* HW IO is valid, abort it */
 362		scsi_io_printf(io, "aborting\n");
 363		rc = efct_hw_io_abort(&io->efct->hw, hio_to_abort,
 364				      io->send_abts, io->hw_cb, io);
 365		if (rc) {
 366			int status = SLI4_FC_WCQE_STATUS_SUCCESS;
 367			efct_hw_done_t cb = io->hw_cb;
 368
 369			if (rc != -ENOENT && rc != -EINPROGRESS) {
 370				status = -1;
 371				scsi_io_printf(io, "Failed to abort IO rc=%d\n",
 372					       rc);
 373			}
 374			cb(io->hio, 0, status, 0, io);
 375			rc = 0;
 376		}
 377
 378		break;
 379	}
 380	default:
 381		scsi_io_printf(io, "Unknown IO type=%d\n", io->io_type);
 382		rc = -EIO;
 383		break;
 384	}
 385	return rc;
 386}
 387
 388static struct efct_io *
 389efct_scsi_dispatch_pending(struct efct *efct)
 390{
 391	struct efct_xport *xport = efct->xport;
 392	struct efct_io *io = NULL;
 393	struct efct_hw_io *hio;
 394	unsigned long flags = 0;
 395	int status;
 396
 397	spin_lock_irqsave(&xport->io_pending_lock, flags);
 398
 399	if (!list_empty(&xport->io_pending_list)) {
 400		io = list_first_entry(&xport->io_pending_list, struct efct_io,
 401				      io_pending_link);
 402		list_del_init(&io->io_pending_link);
 403	}
 404
 405	if (!io) {
 406		spin_unlock_irqrestore(&xport->io_pending_lock, flags);
 407		return NULL;
 408	}
 409
 410	if (io->io_type == EFCT_IO_TYPE_ABORT) {
 411		hio = NULL;
 412	} else {
 413		hio = efct_hw_io_alloc(&efct->hw);
 414		if (!hio) {
 415			/*
 416			 * No HW IO available.Put IO back on
 417			 * the front of pending list
 418			 */
 419			list_add(&xport->io_pending_list, &io->io_pending_link);
 420			io = NULL;
 421		} else {
 422			hio->eq = io->hw_priv;
 423		}
 424	}
 425
 426	/* Must drop the lock before dispatching the IO */
 427	spin_unlock_irqrestore(&xport->io_pending_lock, flags);
 428
 429	if (!io)
 430		return NULL;
 431
 432	/*
 433	 * We pulled an IO off the pending list,
 434	 * and either got an HW IO or don't need one
 435	 */
 436	atomic_sub_return(1, &xport->io_pending_count);
 437	if (!hio)
 438		status = efct_scsi_io_dispatch_no_hw_io(io);
 439	else
 440		status = efct_scsi_io_dispatch_hw_io(io, hio);
 441	if (status) {
 442		/*
 443		 * Invoke the HW callback, but do so in the
 444		 * separate execution context,provided by the
 445		 * NOP mailbox completion processing context
 446		 * by using efct_hw_async_call()
 447		 */
 448		if (efct_hw_async_call(&efct->hw,
 449				       efct_scsi_check_pending_async_cb, io)) {
 450			efc_log_debug(efct, "call hw async failed\n");
 451		}
 452	}
 453
 454	return io;
 455}
 456
 457void
 458efct_scsi_check_pending(struct efct *efct)
 459{
 460	struct efct_xport *xport = efct->xport;
 461	struct efct_io *io = NULL;
 462	int count = 0;
 463	unsigned long flags = 0;
 464	int dispatch = 0;
 465
 466	/* Guard against recursion */
 467	if (atomic_add_return(1, &xport->io_pending_recursing)) {
 468		/* This function is already running.  Decrement and return. */
 469		atomic_sub_return(1, &xport->io_pending_recursing);
 470		return;
 471	}
 472
 473	while (efct_scsi_dispatch_pending(efct))
 474		count++;
 475
 476	if (count) {
 477		atomic_sub_return(1, &xport->io_pending_recursing);
 478		return;
 479	}
 480
 481	/*
 482	 * If nothing was removed from the list,
 483	 * we might be in a case where we need to abort an
 484	 * active IO and the abort is on the pending list.
 485	 * Look for an abort we can dispatch.
 486	 */
 487
 488	spin_lock_irqsave(&xport->io_pending_lock, flags);
 489
 490	list_for_each_entry(io, &xport->io_pending_list, io_pending_link) {
 491		if (io->io_type == EFCT_IO_TYPE_ABORT && io->io_to_abort->hio) {
 492			/* This IO has a HW IO, so it is
 493			 * active.  Dispatch the abort.
 494			 */
 495			dispatch = 1;
 496			list_del_init(&io->io_pending_link);
 497			atomic_sub_return(1, &xport->io_pending_count);
 498			break;
 499		}
 500	}
 501
 502	spin_unlock_irqrestore(&xport->io_pending_lock, flags);
 503
 504	if (dispatch) {
 505		if (efct_scsi_io_dispatch_no_hw_io(io)) {
 506			if (efct_hw_async_call(&efct->hw,
 507				efct_scsi_check_pending_async_cb, io)) {
 508				efc_log_debug(efct, "hw async failed\n");
 509			}
 510		}
 511	}
 512
 513	atomic_sub_return(1, &xport->io_pending_recursing);
 514}
 515
 516int
 517efct_scsi_io_dispatch(struct efct_io *io, void *cb)
 518{
 519	struct efct_hw_io *hio;
 520	struct efct *efct = io->efct;
 521	struct efct_xport *xport = efct->xport;
 522	unsigned long flags = 0;
 523
 524	io->hw_cb = cb;
 525
 526	/*
 527	 * if this IO already has a HW IO, then this is either
 528	 * not the first phase of the IO. Send it to the HW.
 529	 */
 530	if (io->hio)
 531		return efct_scsi_io_dispatch_hw_io(io, io->hio);
 532
 533	/*
 534	 * We don't already have a HW IO associated with the IO. First check
 535	 * the pending list. If not empty, add IO to the tail and process the
 536	 * pending list.
 537	 */
 538	spin_lock_irqsave(&xport->io_pending_lock, flags);
 539	if (!list_empty(&xport->io_pending_list)) {
 540		/*
 541		 * If this is a low latency request,
 542		 * the put at the front of the IO pending
 543		 * queue, otherwise put it at the end of the queue.
 544		 */
 545		if (io->low_latency) {
 546			INIT_LIST_HEAD(&io->io_pending_link);
 547			list_add(&xport->io_pending_list, &io->io_pending_link);
 548		} else {
 549			INIT_LIST_HEAD(&io->io_pending_link);
 550			list_add_tail(&io->io_pending_link,
 551				      &xport->io_pending_list);
 552		}
 553		spin_unlock_irqrestore(&xport->io_pending_lock, flags);
 554		atomic_add_return(1, &xport->io_pending_count);
 555		atomic_add_return(1, &xport->io_total_pending);
 556
 557		/* process pending list */
 558		efct_scsi_check_pending(efct);
 559		return 0;
 560	}
 561	spin_unlock_irqrestore(&xport->io_pending_lock, flags);
 562
 563	/*
 564	 * We don't have a HW IO associated with the IO and there's nothing
 565	 * on the pending list. Attempt to allocate a HW IO and dispatch it.
 566	 */
 567	hio = efct_hw_io_alloc(&io->efct->hw);
 568	if (!hio) {
 569		/* Couldn't get a HW IO. Save this IO on the pending list */
 570		spin_lock_irqsave(&xport->io_pending_lock, flags);
 571		INIT_LIST_HEAD(&io->io_pending_link);
 572		list_add_tail(&io->io_pending_link, &xport->io_pending_list);
 573		spin_unlock_irqrestore(&xport->io_pending_lock, flags);
 574
 575		atomic_add_return(1, &xport->io_total_pending);
 576		atomic_add_return(1, &xport->io_pending_count);
 577		return 0;
 578	}
 579
 580	/* We successfully allocated a HW IO; dispatch to HW */
 581	return efct_scsi_io_dispatch_hw_io(io, hio);
 582}
 583
 584int
 585efct_scsi_io_dispatch_abort(struct efct_io *io, void *cb)
 586{
 587	struct efct *efct = io->efct;
 588	struct efct_xport *xport = efct->xport;
 589	unsigned long flags = 0;
 590
 591	io->hw_cb = cb;
 592
 593	/*
 594	 * For aborts, we don't need a HW IO, but we still want
 595	 * to pass through the pending list to preserve ordering.
 596	 * Thus, if the pending list is not empty, add this abort
 597	 * to the pending list and process the pending list.
 598	 */
 599	spin_lock_irqsave(&xport->io_pending_lock, flags);
 600	if (!list_empty(&xport->io_pending_list)) {
 601		INIT_LIST_HEAD(&io->io_pending_link);
 602		list_add_tail(&io->io_pending_link, &xport->io_pending_list);
 603		spin_unlock_irqrestore(&xport->io_pending_lock, flags);
 604		atomic_add_return(1, &xport->io_pending_count);
 605		atomic_add_return(1, &xport->io_total_pending);
 606
 607		/* process pending list */
 608		efct_scsi_check_pending(efct);
 609		return 0;
 610	}
 611	spin_unlock_irqrestore(&xport->io_pending_lock, flags);
 612
 613	/* nothing on pending list, dispatch abort */
 614	return efct_scsi_io_dispatch_no_hw_io(io);
 615}
 616
 617static inline int
 618efct_scsi_xfer_data(struct efct_io *io, u32 flags,
 619		    struct efct_scsi_sgl *sgl, u32 sgl_count, u64 xwire_len,
 620		    enum efct_hw_io_type type, int enable_ar,
 621		    efct_scsi_io_cb_t cb, void *arg)
 622{
 623	struct efct *efct;
 624	size_t residual = 0;
 625
 626	io->sgl_count = sgl_count;
 627
 628	efct = io->efct;
 629
 630	scsi_io_trace(io, "%s wire_len %llu\n",
 631		      (type == EFCT_HW_IO_TARGET_READ) ? "send" : "recv",
 632		      xwire_len);
 633
 634	io->hio_type = type;
 635
 636	io->scsi_tgt_cb = cb;
 637	io->scsi_tgt_cb_arg = arg;
 638
 639	residual = io->exp_xfer_len - io->transferred;
 640	io->wire_len = (xwire_len < residual) ? xwire_len : residual;
 641	residual = (xwire_len - io->wire_len);
 642
 643	memset(&io->iparam, 0, sizeof(io->iparam));
 644	io->iparam.fcp_tgt.ox_id = io->init_task_tag;
 645	io->iparam.fcp_tgt.offset = io->transferred;
 646	io->iparam.fcp_tgt.cs_ctl = io->cs_ctl;
 647	io->iparam.fcp_tgt.timeout = io->timeout;
 648
 649	/* if this is the last data phase and there is no residual, enable
 650	 * auto-good-response
 651	 */
 652	if (enable_ar && (flags & EFCT_SCSI_LAST_DATAPHASE) && residual == 0 &&
 653	    ((io->transferred + io->wire_len) == io->exp_xfer_len) &&
 654	    (!(flags & EFCT_SCSI_NO_AUTO_RESPONSE))) {
 655		io->iparam.fcp_tgt.flags |= SLI4_IO_AUTO_GOOD_RESPONSE;
 656		io->auto_resp = true;
 657	} else {
 658		io->auto_resp = false;
 659	}
 660
 661	/* save this transfer length */
 662	io->xfer_req = io->wire_len;
 663
 664	/* Adjust the transferred count to account for overrun
 665	 * when the residual is calculated in efct_scsi_send_resp
 666	 */
 667	io->transferred += residual;
 668
 669	/* Adjust the SGL size if there is overrun */
 670
 671	if (residual) {
 672		struct efct_scsi_sgl  *sgl_ptr = &io->sgl[sgl_count - 1];
 673
 674		while (residual) {
 675			size_t len = sgl_ptr->len;
 676
 677			if (len > residual) {
 678				sgl_ptr->len = len - residual;
 679				residual = 0;
 680			} else {
 681				sgl_ptr->len = 0;
 682				residual -= len;
 683				io->sgl_count--;
 684			}
 685			sgl_ptr--;
 686		}
 687	}
 688
 689	/* Set latency and WQ steering */
 690	io->low_latency = (flags & EFCT_SCSI_LOW_LATENCY) != 0;
 691	io->wq_steering = (flags & EFCT_SCSI_WQ_STEERING_MASK) >>
 692				EFCT_SCSI_WQ_STEERING_SHIFT;
 693	io->wq_class = (flags & EFCT_SCSI_WQ_CLASS_MASK) >>
 694				EFCT_SCSI_WQ_CLASS_SHIFT;
 695
 696	if (efct->xport) {
 697		struct efct_xport *xport = efct->xport;
 698
 699		if (type == EFCT_HW_IO_TARGET_READ) {
 700			xport->fcp_stats.input_requests++;
 701			xport->fcp_stats.input_bytes += xwire_len;
 702		} else if (type == EFCT_HW_IO_TARGET_WRITE) {
 703			xport->fcp_stats.output_requests++;
 704			xport->fcp_stats.output_bytes += xwire_len;
 705		}
 706	}
 707	return efct_scsi_io_dispatch(io, efct_target_io_cb);
 708}
 709
 710int
 711efct_scsi_send_rd_data(struct efct_io *io, u32 flags,
 712		       struct efct_scsi_sgl *sgl, u32 sgl_count, u64 len,
 713		       efct_scsi_io_cb_t cb, void *arg)
 714{
 715	return efct_scsi_xfer_data(io, flags, sgl, sgl_count,
 716				   len, EFCT_HW_IO_TARGET_READ,
 717				   enable_tsend_auto_resp(io->efct), cb, arg);
 718}
 719
 720int
 721efct_scsi_recv_wr_data(struct efct_io *io, u32 flags,
 722		       struct efct_scsi_sgl *sgl, u32 sgl_count, u64 len,
 723		       efct_scsi_io_cb_t cb, void *arg)
 724{
 725	return efct_scsi_xfer_data(io, flags, sgl, sgl_count, len,
 726				   EFCT_HW_IO_TARGET_WRITE,
 727				   enable_treceive_auto_resp(io->efct), cb, arg);
 728}
 729
 730int
 731efct_scsi_send_resp(struct efct_io *io, u32 flags,
 732		    struct efct_scsi_cmd_resp *rsp,
 733		    efct_scsi_io_cb_t cb, void *arg)
 734{
 735	struct efct *efct;
 736	int residual;
 737	/* Always try auto resp */
 738	bool auto_resp = true;
 739	u8 scsi_status = 0;
 740	u16 scsi_status_qualifier = 0;
 741	u8 *sense_data = NULL;
 742	u32 sense_data_length = 0;
 743
 744	efct = io->efct;
 745
 746	if (rsp) {
 747		scsi_status = rsp->scsi_status;
 748		scsi_status_qualifier = rsp->scsi_status_qualifier;
 749		sense_data = rsp->sense_data;
 750		sense_data_length = rsp->sense_data_length;
 751		residual = rsp->residual;
 752	} else {
 753		residual = io->exp_xfer_len - io->transferred;
 754	}
 755
 756	io->wire_len = 0;
 757	io->hio_type = EFCT_HW_IO_TARGET_RSP;
 758
 759	io->scsi_tgt_cb = cb;
 760	io->scsi_tgt_cb_arg = arg;
 761
 762	memset(&io->iparam, 0, sizeof(io->iparam));
 763	io->iparam.fcp_tgt.ox_id = io->init_task_tag;
 764	io->iparam.fcp_tgt.offset = 0;
 765	io->iparam.fcp_tgt.cs_ctl = io->cs_ctl;
 766	io->iparam.fcp_tgt.timeout = io->timeout;
 767
 768	/* Set low latency queueing request */
 769	io->low_latency = (flags & EFCT_SCSI_LOW_LATENCY) != 0;
 770	io->wq_steering = (flags & EFCT_SCSI_WQ_STEERING_MASK) >>
 771				EFCT_SCSI_WQ_STEERING_SHIFT;
 772	io->wq_class = (flags & EFCT_SCSI_WQ_CLASS_MASK) >>
 773				EFCT_SCSI_WQ_CLASS_SHIFT;
 774
 775	if (scsi_status != 0 || residual || sense_data_length) {
 776		struct fcp_resp_with_ext *fcprsp = io->rspbuf.virt;
 777		u8 *sns_data;
 778
 779		if (!fcprsp) {
 780			efc_log_err(efct, "NULL response buffer\n");
 781			return -EIO;
 782		}
 783
 784		sns_data = (u8 *)io->rspbuf.virt + sizeof(*fcprsp);
 785
 786		auto_resp = false;
 787
 788		memset(fcprsp, 0, sizeof(*fcprsp));
 789
 790		io->wire_len += sizeof(*fcprsp);
 791
 792		fcprsp->resp.fr_status = scsi_status;
 793		fcprsp->resp.fr_retry_delay =
 794			cpu_to_be16(scsi_status_qualifier);
 795
 796		/* set residual status if necessary */
 797		if (residual != 0) {
 798			/* FCP: if data transferred is less than the
 799			 * amount expected, then this is an underflow.
 800			 * If data transferred would have been greater
 801			 * than the amount expected this is an overflow
 802			 */
 803			if (residual > 0) {
 804				fcprsp->resp.fr_flags |= FCP_RESID_UNDER;
 805				fcprsp->ext.fr_resid =	cpu_to_be32(residual);
 806			} else {
 807				fcprsp->resp.fr_flags |= FCP_RESID_OVER;
 808				fcprsp->ext.fr_resid = cpu_to_be32(-residual);
 809			}
 810		}
 811
 812		if (EFCT_SCSI_SNS_BUF_VALID(sense_data) && sense_data_length) {
 813			if (sense_data_length > SCSI_SENSE_BUFFERSIZE) {
 814				efc_log_err(efct, "Sense exceeds max size.\n");
 815				return -EIO;
 816			}
 817
 818			fcprsp->resp.fr_flags |= FCP_SNS_LEN_VAL;
 819			memcpy(sns_data, sense_data, sense_data_length);
 820			fcprsp->ext.fr_sns_len = cpu_to_be32(sense_data_length);
 821			io->wire_len += sense_data_length;
 822		}
 823
 824		io->sgl[0].addr = io->rspbuf.phys;
 825		io->sgl[0].dif_addr = 0;
 826		io->sgl[0].len = io->wire_len;
 827		io->sgl_count = 1;
 828	}
 829
 830	if (auto_resp)
 831		io->iparam.fcp_tgt.flags |= SLI4_IO_AUTO_GOOD_RESPONSE;
 832
 833	return efct_scsi_io_dispatch(io, efct_target_io_cb);
 834}
 835
 836static int
 837efct_target_bls_resp_cb(struct efct_hw_io *hio,	u32 length, int status,
 838			u32 ext_status, void *app)
 839{
 840	struct efct_io *io = app;
 841	struct efct *efct;
 842	enum efct_scsi_io_status bls_status;
 843
 844	efct = io->efct;
 845
 846	/* BLS isn't really a "SCSI" concept, but use SCSI status */
 847	if (status) {
 848		io_error_log(io, "s=%#x x=%#x\n", status, ext_status);
 849		bls_status = EFCT_SCSI_STATUS_ERROR;
 850	} else {
 851		bls_status = EFCT_SCSI_STATUS_GOOD;
 852	}
 853
 854	if (io->bls_cb) {
 855		efct_scsi_io_cb_t bls_cb = io->bls_cb;
 856		void *bls_cb_arg = io->bls_cb_arg;
 857
 858		io->bls_cb = NULL;
 859		io->bls_cb_arg = NULL;
 860
 861		/* invoke callback */
 862		bls_cb(io, bls_status, 0, bls_cb_arg);
 863	}
 864
 865	efct_scsi_check_pending(efct);
 866	return 0;
 867}
 868
 869static int
 870efct_target_send_bls_resp(struct efct_io *io,
 871			  efct_scsi_io_cb_t cb, void *arg)
 872{
 873	struct efct_node *node = io->node;
 874	struct sli_bls_params *bls = &io->iparam.bls;
 875	struct efct *efct = node->efct;
 876	struct fc_ba_acc *acc;
 877	int rc;
 878
 879	/* fill out IO structure with everything needed to send BA_ACC */
 880	memset(&io->iparam, 0, sizeof(io->iparam));
 881	bls->ox_id = io->init_task_tag;
 882	bls->rx_id = io->abort_rx_id;
 883	bls->vpi = io->node->vpi;
 884	bls->rpi = io->node->rpi;
 885	bls->s_id = U32_MAX;
 886	bls->d_id = io->node->node_fc_id;
 887	bls->rpi_registered = true;
 888
 889	acc = (void *)bls->payload;
 890	acc->ba_ox_id = cpu_to_be16(bls->ox_id);
 891	acc->ba_rx_id = cpu_to_be16(bls->rx_id);
 892	acc->ba_high_seq_cnt = cpu_to_be16(U16_MAX);
 893
 894	/* generic io fields have already been populated */
 895
 896	/* set type and BLS-specific fields */
 897	io->io_type = EFCT_IO_TYPE_BLS_RESP;
 898	io->display_name = "bls_rsp";
 899	io->hio_type = EFCT_HW_BLS_ACC;
 900	io->bls_cb = cb;
 901	io->bls_cb_arg = arg;
 902
 903	/* dispatch IO */
 904	rc = efct_hw_bls_send(efct, FC_RCTL_BA_ACC, bls,
 905			      efct_target_bls_resp_cb, io);
 906	return rc;
 907}
 908
 909static int efct_bls_send_rjt_cb(struct efct_hw_io *hio, u32 length, int status,
 910				u32 ext_status, void *app)
 911{
 912	struct efct_io *io = app;
 913
 914	efct_scsi_io_free(io);
 915	return 0;
 916}
 917
 918struct efct_io *
 919efct_bls_send_rjt(struct efct_io *io, struct fc_frame_header *hdr)
 920{
 921	struct efct_node *node = io->node;
 922	struct sli_bls_params *bls = &io->iparam.bls;
 923	struct efct *efct = node->efct;
 924	struct fc_ba_rjt *acc;
 925	int rc;
 926
 927	/* fill out BLS Response-specific fields */
 928	io->io_type = EFCT_IO_TYPE_BLS_RESP;
 929	io->display_name = "ba_rjt";
 930	io->hio_type = EFCT_HW_BLS_RJT;
 931	io->init_task_tag = be16_to_cpu(hdr->fh_ox_id);
 932
 933	/* fill out iparam fields */
 934	memset(&io->iparam, 0, sizeof(io->iparam));
 935	bls->ox_id = be16_to_cpu(hdr->fh_ox_id);
 936	bls->rx_id = be16_to_cpu(hdr->fh_rx_id);
 937	bls->vpi = io->node->vpi;
 938	bls->rpi = io->node->rpi;
 939	bls->s_id = U32_MAX;
 940	bls->d_id = io->node->node_fc_id;
 941	bls->rpi_registered = true;
 942
 943	acc = (void *)bls->payload;
 944	acc->br_reason = ELS_RJT_UNAB;
 945	acc->br_explan = ELS_EXPL_NONE;
 946
 947	rc = efct_hw_bls_send(efct, FC_RCTL_BA_RJT, bls, efct_bls_send_rjt_cb,
 948			      io);
 949	if (rc) {
 950		efc_log_err(efct, "efct_scsi_io_dispatch() failed: %d\n", rc);
 951		efct_scsi_io_free(io);
 952		io = NULL;
 953	}
 954	return io;
 955}
 956
 957int
 958efct_scsi_send_tmf_resp(struct efct_io *io,
 959			enum efct_scsi_tmf_resp rspcode,
 960			u8 addl_rsp_info[3],
 961			efct_scsi_io_cb_t cb, void *arg)
 962{
 963	int rc;
 964	struct {
 965		struct fcp_resp_with_ext rsp_ext;
 966		struct fcp_resp_rsp_info info;
 967	} *fcprsp;
 968	u8 fcp_rspcode;
 969
 970	io->wire_len = 0;
 971
 972	switch (rspcode) {
 973	case EFCT_SCSI_TMF_FUNCTION_COMPLETE:
 974		fcp_rspcode = FCP_TMF_CMPL;
 975		break;
 976	case EFCT_SCSI_TMF_FUNCTION_SUCCEEDED:
 977	case EFCT_SCSI_TMF_FUNCTION_IO_NOT_FOUND:
 978		fcp_rspcode = FCP_TMF_CMPL;
 979		break;
 980	case EFCT_SCSI_TMF_FUNCTION_REJECTED:
 981		fcp_rspcode = FCP_TMF_REJECTED;
 982		break;
 983	case EFCT_SCSI_TMF_INCORRECT_LOGICAL_UNIT_NUMBER:
 984		fcp_rspcode = FCP_TMF_INVALID_LUN;
 985		break;
 986	case EFCT_SCSI_TMF_SERVICE_DELIVERY:
 987		fcp_rspcode = FCP_TMF_FAILED;
 988		break;
 989	default:
 990		fcp_rspcode = FCP_TMF_REJECTED;
 991		break;
 992	}
 993
 994	io->hio_type = EFCT_HW_IO_TARGET_RSP;
 995
 996	io->scsi_tgt_cb = cb;
 997	io->scsi_tgt_cb_arg = arg;
 998
 999	if (io->tmf_cmd == EFCT_SCSI_TMF_ABORT_TASK) {
1000		rc = efct_target_send_bls_resp(io, cb, arg);
1001		return rc;
1002	}
1003
1004	/* populate the FCP TMF response */
1005	fcprsp = io->rspbuf.virt;
1006	memset(fcprsp, 0, sizeof(*fcprsp));
1007
1008	fcprsp->rsp_ext.resp.fr_flags |= FCP_SNS_LEN_VAL;
1009
1010	if (addl_rsp_info) {
1011		memcpy(fcprsp->info._fr_resvd, addl_rsp_info,
1012		       sizeof(fcprsp->info._fr_resvd));
1013	}
1014	fcprsp->info.rsp_code = fcp_rspcode;
1015
1016	io->wire_len = sizeof(*fcprsp);
1017
1018	fcprsp->rsp_ext.ext.fr_rsp_len =
1019			cpu_to_be32(sizeof(struct fcp_resp_rsp_info));
1020
1021	io->sgl[0].addr = io->rspbuf.phys;
1022	io->sgl[0].dif_addr = 0;
1023	io->sgl[0].len = io->wire_len;
1024	io->sgl_count = 1;
1025
1026	memset(&io->iparam, 0, sizeof(io->iparam));
1027	io->iparam.fcp_tgt.ox_id = io->init_task_tag;
1028	io->iparam.fcp_tgt.offset = 0;
1029	io->iparam.fcp_tgt.cs_ctl = io->cs_ctl;
1030	io->iparam.fcp_tgt.timeout = io->timeout;
1031
1032	rc = efct_scsi_io_dispatch(io, efct_target_io_cb);
1033
1034	return rc;
1035}
1036
1037static int
1038efct_target_abort_cb(struct efct_hw_io *hio, u32 length, int status,
1039		     u32 ext_status, void *app)
1040{
1041	struct efct_io *io = app;
1042	struct efct *efct;
1043	enum efct_scsi_io_status scsi_status;
1044	efct_scsi_io_cb_t abort_cb;
1045	void *abort_cb_arg;
1046
1047	efct = io->efct;
1048
1049	if (!io->abort_cb)
1050		goto done;
1051
1052	abort_cb = io->abort_cb;
1053	abort_cb_arg = io->abort_cb_arg;
1054
1055	io->abort_cb = NULL;
1056	io->abort_cb_arg = NULL;
1057
1058	switch (status) {
1059	case SLI4_FC_WCQE_STATUS_SUCCESS:
1060		scsi_status = EFCT_SCSI_STATUS_GOOD;
1061		break;
1062	case SLI4_FC_WCQE_STATUS_LOCAL_REJECT:
1063		switch (ext_status) {
1064		case SLI4_FC_LOCAL_REJECT_NO_XRI:
1065			scsi_status = EFCT_SCSI_STATUS_NO_IO;
1066			break;
1067		case SLI4_FC_LOCAL_REJECT_ABORT_IN_PROGRESS:
1068			scsi_status = EFCT_SCSI_STATUS_ABORT_IN_PROGRESS;
1069			break;
1070		default:
1071			/*we have seen 0x15 (abort in progress)*/
1072			scsi_status = EFCT_SCSI_STATUS_ERROR;
1073			break;
1074		}
1075		break;
1076	case SLI4_FC_WCQE_STATUS_FCP_RSP_FAILURE:
1077		scsi_status = EFCT_SCSI_STATUS_CHECK_RESPONSE;
1078		break;
1079	default:
1080		scsi_status = EFCT_SCSI_STATUS_ERROR;
1081		break;
1082	}
1083	/* invoke callback */
1084	abort_cb(io->io_to_abort, scsi_status, 0, abort_cb_arg);
1085
1086done:
1087	/* done with IO to abort,efct_ref_get(): efct_scsi_tgt_abort_io() */
1088	kref_put(&io->io_to_abort->ref, io->io_to_abort->release);
1089
1090	efct_io_pool_io_free(efct->xport->io_pool, io);
1091
1092	efct_scsi_check_pending(efct);
1093	return 0;
1094}
1095
1096int
1097efct_scsi_tgt_abort_io(struct efct_io *io, efct_scsi_io_cb_t cb, void *arg)
1098{
1099	struct efct *efct;
1100	struct efct_xport *xport;
1101	int rc;
1102	struct efct_io *abort_io = NULL;
1103
1104	efct = io->efct;
1105	xport = efct->xport;
1106
1107	/* take a reference on IO being aborted */
1108	if (kref_get_unless_zero(&io->ref) == 0) {
1109		/* command no longer active */
1110		scsi_io_printf(io, "command no longer active\n");
1111		return -EIO;
1112	}
1113
1114	/*
1115	 * allocate a new IO to send the abort request. Use efct_io_alloc()
1116	 * directly, as we need an IO object that will not fail allocation
1117	 * due to allocations being disabled (in efct_scsi_io_alloc())
1118	 */
1119	abort_io = efct_io_pool_io_alloc(efct->xport->io_pool);
1120	if (!abort_io) {
1121		atomic_add_return(1, &xport->io_alloc_failed_count);
1122		kref_put(&io->ref, io->release);
1123		return -EIO;
1124	}
1125
1126	/* Save the target server callback and argument */
1127	/* set generic fields */
1128	abort_io->cmd_tgt = true;
1129	abort_io->node = io->node;
1130
1131	/* set type and abort-specific fields */
1132	abort_io->io_type = EFCT_IO_TYPE_ABORT;
1133	abort_io->display_name = "tgt_abort";
1134	abort_io->io_to_abort = io;
1135	abort_io->send_abts = false;
1136	abort_io->abort_cb = cb;
1137	abort_io->abort_cb_arg = arg;
1138
1139	/* now dispatch IO */
1140	rc = efct_scsi_io_dispatch_abort(abort_io, efct_target_abort_cb);
1141	if (rc)
1142		kref_put(&io->ref, io->release);
1143	return rc;
1144}
1145
1146void
1147efct_scsi_io_complete(struct efct_io *io)
1148{
1149	if (io->io_free) {
1150		efc_log_debug(io->efct, "completion for non-busy io tag 0x%x\n",
1151			      io->tag);
1152		return;
1153	}
1154
1155	scsi_io_trace(io, "freeing io 0x%p %s\n", io, io->display_name);
1156	kref_put(&io->ref, io->release);
1157}
~/ Read-only file preview.