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}
1158