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#include "efct_unsol.h"
10
11struct efct_hw_link_stat_cb_arg {
12	void (*cb)(int status, u32 num_counters,
13		   struct efct_hw_link_stat_counts *counters, void *arg);
14	void *arg;
15};
16
17struct efct_hw_host_stat_cb_arg {
18	void (*cb)(int status, u32 num_counters,
19		   struct efct_hw_host_stat_counts *counters, void *arg);
20	void *arg;
21};
22
23struct efct_hw_fw_wr_cb_arg {
24	void (*cb)(int status, u32 bytes_written, u32 change_status, void *arg);
25	void *arg;
26};
27
28struct efct_mbox_rqst_ctx {
29	int (*callback)(struct efc *efc, int status, u8 *mqe, void *arg);
30	void *arg;
31};
32
33static int
34efct_hw_link_event_init(struct efct_hw *hw)
35{
36	hw->link.status = SLI4_LINK_STATUS_MAX;
37	hw->link.topology = SLI4_LINK_TOPO_NONE;
38	hw->link.medium = SLI4_LINK_MEDIUM_MAX;
39	hw->link.speed = 0;
40	hw->link.loop_map = NULL;
41	hw->link.fc_id = U32_MAX;
42
43	return 0;
44}
45
46static int
47efct_hw_read_max_dump_size(struct efct_hw *hw)
48{
49	u8 buf[SLI4_BMBX_SIZE];
50	struct efct *efct = hw->os;
51	int rc = 0;
52	struct sli4_rsp_cmn_set_dump_location *rsp;
53
54	/* attempt to detemine the dump size for function 0 only. */
55	if (PCI_FUNC(efct->pci->devfn) != 0)
56		return rc;
57
58	if (sli_cmd_common_set_dump_location(&hw->sli, buf, 1, 0, NULL, 0))
59		return -EIO;
60
61	rsp = (struct sli4_rsp_cmn_set_dump_location *)
62	      (buf + offsetof(struct sli4_cmd_sli_config, payload.embed));
63
64	rc = efct_hw_command(hw, buf, EFCT_CMD_POLL, NULL, NULL);
65	if (rc != 0) {
66		efc_log_debug(hw->os, "set dump location cmd failed\n");
67		return rc;
68	}
69
70	hw->dump_size =
71	  le32_to_cpu(rsp->buffer_length_dword) & SLI4_CMN_SET_DUMP_BUFFER_LEN;
72
73	efc_log_debug(hw->os, "Dump size %x\n",	hw->dump_size);
74
75	return rc;
76}
77
78static int
79__efct_read_topology_cb(struct efct_hw *hw, int status, u8 *mqe, void *arg)
80{
81	struct sli4_cmd_read_topology *read_topo =
82				(struct sli4_cmd_read_topology *)mqe;
83	u8 speed;
84	struct efc_domain_record drec = {0};
85	struct efct *efct = hw->os;
86
87	if (status || le16_to_cpu(read_topo->hdr.status)) {
88		efc_log_debug(hw->os, "bad status cqe=%#x mqe=%#x\n", status,
89			      le16_to_cpu(read_topo->hdr.status));
90		return -EIO;
91	}
92
93	switch (le32_to_cpu(read_topo->dw2_attentype) &
94		SLI4_READTOPO_ATTEN_TYPE) {
95	case SLI4_READ_TOPOLOGY_LINK_UP:
96		hw->link.status = SLI4_LINK_STATUS_UP;
97		break;
98	case SLI4_READ_TOPOLOGY_LINK_DOWN:
99		hw->link.status = SLI4_LINK_STATUS_DOWN;
100		break;
101	case SLI4_READ_TOPOLOGY_LINK_NO_ALPA:
102		hw->link.status = SLI4_LINK_STATUS_NO_ALPA;
103		break;
104	default:
105		hw->link.status = SLI4_LINK_STATUS_MAX;
106		break;
107	}
108
109	switch (read_topo->topology) {
110	case SLI4_READ_TOPO_NON_FC_AL:
111		hw->link.topology = SLI4_LINK_TOPO_NON_FC_AL;
112		break;
113	case SLI4_READ_TOPO_FC_AL:
114		hw->link.topology = SLI4_LINK_TOPO_FC_AL;
115		if (hw->link.status == SLI4_LINK_STATUS_UP)
116			hw->link.loop_map = hw->loop_map.virt;
117		hw->link.fc_id = read_topo->acquired_al_pa;
118		break;
119	default:
120		hw->link.topology = SLI4_LINK_TOPO_MAX;
121		break;
122	}
123
124	hw->link.medium = SLI4_LINK_MEDIUM_FC;
125
126	speed = (le32_to_cpu(read_topo->currlink_state) &
127		 SLI4_READTOPO_LINKSTATE_SPEED) >> 8;
128	switch (speed) {
129	case SLI4_READ_TOPOLOGY_SPEED_1G:
130		hw->link.speed =  1 * 1000;
131		break;
132	case SLI4_READ_TOPOLOGY_SPEED_2G:
133		hw->link.speed =  2 * 1000;
134		break;
135	case SLI4_READ_TOPOLOGY_SPEED_4G:
136		hw->link.speed =  4 * 1000;
137		break;
138	case SLI4_READ_TOPOLOGY_SPEED_8G:
139		hw->link.speed =  8 * 1000;
140		break;
141	case SLI4_READ_TOPOLOGY_SPEED_16G:
142		hw->link.speed = 16 * 1000;
143		break;
144	case SLI4_READ_TOPOLOGY_SPEED_32G:
145		hw->link.speed = 32 * 1000;
146		break;
147	case SLI4_READ_TOPOLOGY_SPEED_64G:
148		hw->link.speed = 64 * 1000;
149		break;
150	case SLI4_READ_TOPOLOGY_SPEED_128G:
151		hw->link.speed = 128 * 1000;
152		break;
153	}
154
155	drec.speed = hw->link.speed;
156	drec.fc_id = hw->link.fc_id;
157	drec.is_nport = true;
158	efc_domain_cb(efct->efcport, EFC_HW_DOMAIN_FOUND, &drec);
159
160	return 0;
161}
162
163static int
164efct_hw_cb_link(void *ctx, void *e)
165{
166	struct efct_hw *hw = ctx;
167	struct sli4_link_event *event = e;
168	struct efc_domain *d = NULL;
169	int rc = 0;
170	struct efct *efct = hw->os;
171
172	efct_hw_link_event_init(hw);
173
174	switch (event->status) {
175	case SLI4_LINK_STATUS_UP:
176
177		hw->link = *event;
178		efct->efcport->link_status = EFC_LINK_STATUS_UP;
179
180		if (event->topology == SLI4_LINK_TOPO_NON_FC_AL) {
181			struct efc_domain_record drec = {0};
182
183			efc_log_info(hw->os, "Link Up, NPORT, speed is %d\n",
184				     event->speed);
185			drec.speed = event->speed;
186			drec.fc_id = event->fc_id;
187			drec.is_nport = true;
188			efc_domain_cb(efct->efcport, EFC_HW_DOMAIN_FOUND,
189				      &drec);
190		} else if (event->topology == SLI4_LINK_TOPO_FC_AL) {
191			u8 buf[SLI4_BMBX_SIZE];
192
193			efc_log_info(hw->os, "Link Up, LOOP, speed is %d\n",
194				     event->speed);
195
196			if (!sli_cmd_read_topology(&hw->sli, buf,
197						   &hw->loop_map)) {
198				rc = efct_hw_command(hw, buf, EFCT_CMD_NOWAIT,
199						__efct_read_topology_cb, NULL);
200			}
201
202			if (rc)
203				efc_log_debug(hw->os, "READ_TOPOLOGY failed\n");
204		} else {
205			efc_log_info(hw->os, "%s(%#x), speed is %d\n",
206				     "Link Up, unsupported topology ",
207				     event->topology, event->speed);
208		}
209		break;
210	case SLI4_LINK_STATUS_DOWN:
211		efc_log_info(hw->os, "Link down\n");
212
213		hw->link.status = event->status;
214		efct->efcport->link_status = EFC_LINK_STATUS_DOWN;
215
216		d = efct->efcport->domain;
217		if (d)
218			efc_domain_cb(efct->efcport, EFC_HW_DOMAIN_LOST, d);
219		break;
220	default:
221		efc_log_debug(hw->os, "unhandled link status %#x\n",
222			      event->status);
223		break;
224	}
225
226	return 0;
227}
228
229int
230efct_hw_setup(struct efct_hw *hw, void *os, struct pci_dev *pdev)
231{
232	u32 i, max_sgl, cpus;
233
234	if (hw->hw_setup_called)
235		return 0;
236
237	/*
238	 * efct_hw_init() relies on NULL pointers indicating that a structure
239	 * needs allocation. If a structure is non-NULL, efct_hw_init() won't
240	 * free/realloc that memory
241	 */
242	memset(hw, 0, sizeof(struct efct_hw));
243
244	hw->hw_setup_called = true;
245
246	hw->os = os;
247
248	mutex_init(&hw->bmbx_lock);
249	spin_lock_init(&hw->cmd_lock);
250	INIT_LIST_HEAD(&hw->cmd_head);
251	INIT_LIST_HEAD(&hw->cmd_pending);
252	hw->cmd_head_count = 0;
253
254	/* Create mailbox command ctx pool */
255	hw->cmd_ctx_pool = mempool_create_kmalloc_pool(EFCT_CMD_CTX_POOL_SZ,
256					sizeof(struct efct_command_ctx));
257	if (!hw->cmd_ctx_pool) {
258		efc_log_err(hw->os, "failed to allocate mailbox buffer pool\n");
259		return -EIO;
260	}
261
262	/* Create mailbox request ctx pool for library callback */
263	hw->mbox_rqst_pool = mempool_create_kmalloc_pool(EFCT_CMD_CTX_POOL_SZ,
264					sizeof(struct efct_mbox_rqst_ctx));
265	if (!hw->mbox_rqst_pool) {
266		efc_log_err(hw->os, "failed to allocate mbox request pool\n");
267		return -EIO;
268	}
269
270	spin_lock_init(&hw->io_lock);
271	INIT_LIST_HEAD(&hw->io_inuse);
272	INIT_LIST_HEAD(&hw->io_free);
273	INIT_LIST_HEAD(&hw->io_wait_free);
274
275	atomic_set(&hw->io_alloc_failed_count, 0);
276
277	hw->config.speed = SLI4_LINK_SPEED_AUTO_16_8_4;
278	if (sli_setup(&hw->sli, hw->os, pdev, ((struct efct *)os)->reg)) {
279		efc_log_err(hw->os, "SLI setup failed\n");
280		return -EIO;
281	}
282
283	efct_hw_link_event_init(hw);
284
285	sli_callback(&hw->sli, SLI4_CB_LINK, efct_hw_cb_link, hw);
286
287	/*
288	 * Set all the queue sizes to the maximum allowed.
289	 */
290	for (i = 0; i < ARRAY_SIZE(hw->num_qentries); i++)
291		hw->num_qentries[i] = hw->sli.qinfo.max_qentries[i];
292	/*
293	 * Adjust the size of the WQs so that the CQ is twice as big as
294	 * the WQ to allow for 2 completions per IO. This allows us to
295	 * handle multi-phase as well as aborts.
296	 */
297	hw->num_qentries[SLI4_QTYPE_WQ] = hw->num_qentries[SLI4_QTYPE_CQ] / 2;
298
299	/*
300	 * The RQ assignment for RQ pair mode.
301	 */
302
303	hw->config.rq_default_buffer_size = EFCT_HW_RQ_SIZE_PAYLOAD;
304	hw->config.n_io = hw->sli.ext[SLI4_RSRC_XRI].size;
305
306	cpus = num_possible_cpus();
307	hw->config.n_eq = cpus > EFCT_HW_MAX_NUM_EQ ? EFCT_HW_MAX_NUM_EQ : cpus;
308
309	max_sgl = sli_get_max_sgl(&hw->sli) - SLI4_SGE_MAX_RESERVED;
310	max_sgl = (max_sgl > EFCT_FC_MAX_SGL) ? EFCT_FC_MAX_SGL : max_sgl;
311	hw->config.n_sgl = max_sgl;
312
313	(void)efct_hw_read_max_dump_size(hw);
314
315	return 0;
316}
317
318static void
319efct_logfcfi(struct efct_hw *hw, u32 j, u32 i, u32 id)
320{
321	efc_log_info(hw->os,
322		     "REG_FCFI: filter[%d] %08X -> RQ[%d] id=%d\n",
323		     j, hw->config.filter_def[j], i, id);
324}
325
326static inline void
327efct_hw_init_free_io(struct efct_hw_io *io)
328{
329	/*
330	 * Set io->done to NULL, to avoid any callbacks, should
331	 * a completion be received for one of these IOs
332	 */
333	io->done = NULL;
334	io->abort_done = NULL;
335	io->status_saved = false;
336	io->abort_in_progress = false;
337	io->type = 0xFFFF;
338	io->wq = NULL;
339}
340
341static bool efct_hw_iotype_is_originator(u16 io_type)
342{
343	switch (io_type) {
344	case EFCT_HW_FC_CT:
345	case EFCT_HW_ELS_REQ:
346		return true;
347	default:
348		return false;
349	}
350}
351
352static void
353efct_hw_io_restore_sgl(struct efct_hw *hw, struct efct_hw_io *io)
354{
355	/* Restore the default */
356	io->sgl = &io->def_sgl;
357	io->sgl_count = io->def_sgl_count;
358}
359
360static void
361efct_hw_wq_process_io(void *arg, u8 *cqe, int status)
362{
363	struct efct_hw_io *io = arg;
364	struct efct_hw *hw = io->hw;
365	struct sli4_fc_wcqe *wcqe = (void *)cqe;
366	u32	len = 0;
367	u32 ext = 0;
368
369	/* clear xbusy flag if WCQE[XB] is clear */
370	if (io->xbusy && (wcqe->flags & SLI4_WCQE_XB) == 0)
371		io->xbusy = false;
372
373	/* get extended CQE status */
374	switch (io->type) {
375	case EFCT_HW_BLS_ACC:
376	case EFCT_HW_BLS_RJT:
377		break;
378	case EFCT_HW_ELS_REQ:
379		sli_fc_els_did(&hw->sli, cqe, &ext);
380		len = sli_fc_response_length(&hw->sli, cqe);
381		break;
382	case EFCT_HW_ELS_RSP:
383	case EFCT_HW_FC_CT_RSP:
384		break;
385	case EFCT_HW_FC_CT:
386		len = sli_fc_response_length(&hw->sli, cqe);
387		break;
388	case EFCT_HW_IO_TARGET_WRITE:
389		len = sli_fc_io_length(&hw->sli, cqe);
390		break;
391	case EFCT_HW_IO_TARGET_READ:
392		len = sli_fc_io_length(&hw->sli, cqe);
393		break;
394	case EFCT_HW_IO_TARGET_RSP:
395		break;
396	case EFCT_HW_IO_DNRX_REQUEUE:
397		/* release the count for re-posting the buffer */
398		/* efct_hw_io_free(hw, io); */
399		break;
400	default:
401		efc_log_err(hw->os, "unhandled io type %#x for XRI 0x%x\n",
402			    io->type, io->indicator);
403		break;
404	}
405	if (status) {
406		ext = sli_fc_ext_status(&hw->sli, cqe);
407		/*
408		 * If we're not an originator IO, and XB is set, then issue
409		 * abort for the IO from within the HW
410		 */
411		if (efct_hw_iotype_is_originator(io->type) &&
412		    wcqe->flags & SLI4_WCQE_XB) {
413			int rc;
414
415			efc_log_debug(hw->os, "aborting xri=%#x tag=%#x\n",
416				      io->indicator, io->reqtag);
417
418			/*
419			 * Because targets may send a response when the IO
420			 * completes using the same XRI, we must wait for the
421			 * XRI_ABORTED CQE to issue the IO callback
422			 */
423			rc = efct_hw_io_abort(hw, io, false, NULL, NULL);
424			if (rc == 0) {
425				/*
426				 * latch status to return after abort is
427				 * complete
428				 */
429				io->status_saved = true;
430				io->saved_status = status;
431				io->saved_ext = ext;
432				io->saved_len = len;
433				goto exit_efct_hw_wq_process_io;
434			} else if (rc == -EINPROGRESS) {
435				/*
436				 * Already being aborted by someone else (ABTS
437				 * perhaps). Just return original
438				 * error.
439				 */
440				efc_log_debug(hw->os, "%s%#x tag=%#x\n",
441					      "abort in progress xri=",
442					      io->indicator, io->reqtag);
443
444			} else {
445				/* Failed to abort for some other reason, log
446				 * error
447				 */
448				efc_log_debug(hw->os, "%s%#x tag=%#x rc=%d\n",
449					      "Failed to abort xri=",
450					      io->indicator, io->reqtag, rc);
451			}
452		}
453	}
454
455	if (io->done) {
456		efct_hw_done_t done = io->done;
457
458		io->done = NULL;
459
460		if (io->status_saved) {
461			/* use latched status if exists */
462			status = io->saved_status;
463			len = io->saved_len;
464			ext = io->saved_ext;
465			io->status_saved = false;
466		}
467
468		/* Restore default SGL */
469		efct_hw_io_restore_sgl(hw, io);
470		done(io, len, status, ext, io->arg);
471	}
472
473exit_efct_hw_wq_process_io:
474	return;
475}
476
477static int
478efct_hw_setup_io(struct efct_hw *hw)
479{
480	u32	i = 0;
481	struct efct_hw_io	*io = NULL;
482	uintptr_t	xfer_virt = 0;
483	uintptr_t	xfer_phys = 0;
484	u32	index;
485	bool new_alloc = true;
486	struct efc_dma *dma;
487	struct efct *efct = hw->os;
488
489	if (!hw->io) {
490		hw->io = kmalloc_array(hw->config.n_io, sizeof(io), GFP_KERNEL);
491		if (!hw->io)
492			return -ENOMEM;
493
494		memset(hw->io, 0, hw->config.n_io * sizeof(io));
495
496		for (i = 0; i < hw->config.n_io; i++) {
497			hw->io[i] = kzalloc(sizeof(*io), GFP_KERNEL);
498			if (!hw->io[i])
499				goto error;
500		}
501
502		/* Create WQE buffs for IO */
503		hw->wqe_buffs = kzalloc((hw->config.n_io * hw->sli.wqe_size),
504					GFP_KERNEL);
505		if (!hw->wqe_buffs) {
506			kfree(hw->io);
507			return -ENOMEM;
508		}
509
510	} else {
511		/* re-use existing IOs, including SGLs */
512		new_alloc = false;
513	}
514
515	if (new_alloc) {
516		dma = &hw->xfer_rdy;
517		dma->size = sizeof(struct fcp_txrdy) * hw->config.n_io;
518		dma->virt = dma_alloc_coherent(&efct->pci->dev,
519					       dma->size, &dma->phys, GFP_KERNEL);
520		if (!dma->virt)
521			return -ENOMEM;
522	}
523	xfer_virt = (uintptr_t)hw->xfer_rdy.virt;
524	xfer_phys = hw->xfer_rdy.phys;
525
526	/* Initialize the pool of HW IO objects */
527	for (i = 0; i < hw->config.n_io; i++) {
528		struct hw_wq_callback *wqcb;
529
530		io = hw->io[i];
531
532		/* initialize IO fields */
533		io->hw = hw;
534
535		/* Assign a WQE buff */
536		io->wqe.wqebuf = &hw->wqe_buffs[i * hw->sli.wqe_size];
537
538		/* Allocate the request tag for this IO */
539		wqcb = efct_hw_reqtag_alloc(hw, efct_hw_wq_process_io, io);
540		if (!wqcb) {
541			efc_log_err(hw->os, "can't allocate request tag\n");
542			return -ENOSPC;
543		}
544		io->reqtag = wqcb->instance_index;
545
546		/* Now for the fields that are initialized on each free */
547		efct_hw_init_free_io(io);
548
549		/* The XB flag isn't cleared on IO free, so init to zero */
550		io->xbusy = 0;
551
552		if (sli_resource_alloc(&hw->sli, SLI4_RSRC_XRI,
553				       &io->indicator, &index)) {
554			efc_log_err(hw->os,
555				    "sli_resource_alloc failed @ %d\n", i);
556			return -ENOMEM;
557		}
558
559		if (new_alloc) {
560			dma = &io->def_sgl;
561			dma->size = hw->config.n_sgl *
562					sizeof(struct sli4_sge);
563			dma->virt = dma_alloc_coherent(&efct->pci->dev,
564						       dma->size, &dma->phys,
565						       GFP_KERNEL);
566			if (!dma->virt) {
567				efc_log_err(hw->os, "dma_alloc fail %d\n", i);
568				memset(&io->def_sgl, 0,
569				       sizeof(struct efc_dma));
570				return -ENOMEM;
571			}
572		}
573		io->def_sgl_count = hw->config.n_sgl;
574		io->sgl = &io->def_sgl;
575		io->sgl_count = io->def_sgl_count;
576
577		if (hw->xfer_rdy.size) {
578			io->xfer_rdy.virt = (void *)xfer_virt;
579			io->xfer_rdy.phys = xfer_phys;
580			io->xfer_rdy.size = sizeof(struct fcp_txrdy);
581
582			xfer_virt += sizeof(struct fcp_txrdy);
583			xfer_phys += sizeof(struct fcp_txrdy);
584		}
585	}
586
587	return 0;
588error:
589	for (i = 0; i < hw->config.n_io && hw->io[i]; i++) {
590		kfree(hw->io[i]);
591		hw->io[i] = NULL;
592	}
593
594	kfree(hw->io);
595	hw->io = NULL;
596
597	return -ENOMEM;
598}
599
600static int
601efct_hw_init_prereg_io(struct efct_hw *hw)
602{
603	u32 i, idx = 0;
604	struct efct_hw_io *io = NULL;
605	u8 cmd[SLI4_BMBX_SIZE];
606	int rc = 0;
607	u32 n_rem;
608	u32 n = 0;
609	u32 sgls_per_request = 256;
610	struct efc_dma **sgls = NULL;
611	struct efc_dma req;
612	struct efct *efct = hw->os;
613
614	sgls = kmalloc_array(sgls_per_request, sizeof(*sgls), GFP_KERNEL);
615	if (!sgls)
616		return -ENOMEM;
617
618	memset(&req, 0, sizeof(struct efc_dma));
619	req.size = 32 + sgls_per_request * 16;
620	req.virt = dma_alloc_coherent(&efct->pci->dev, req.size, &req.phys,
621				      GFP_KERNEL);
622	if (!req.virt) {
623		kfree(sgls);
624		return -ENOMEM;
625	}
626
627	for (n_rem = hw->config.n_io; n_rem; n_rem -= n) {
628		/* Copy address of SGL's into local sgls[] array, break
629		 * out if the xri is not contiguous.
630		 */
631		u32 min = (sgls_per_request < n_rem) ? sgls_per_request : n_rem;
632
633		for (n = 0; n < min; n++) {
634			/* Check that we have contiguous xri values */
635			if (n > 0) {
636				if (hw->io[idx + n]->indicator !=
637				    hw->io[idx + n - 1]->indicator + 1)
638					break;
639			}
640
641			sgls[n] = hw->io[idx + n]->sgl;
642		}
643
644		if (sli_cmd_post_sgl_pages(&hw->sli, cmd,
645				hw->io[idx]->indicator,	n, sgls, NULL, &req)) {
646			rc = -EIO;
647			break;
648		}
649
650		rc = efct_hw_command(hw, cmd, EFCT_CMD_POLL, NULL, NULL);
651		if (rc) {
652			efc_log_err(hw->os, "SGL post failed, rc=%d\n", rc);
653			break;
654		}
655
656		/* Add to tail if successful */
657		for (i = 0; i < n; i++, idx++) {
658			io = hw->io[idx];
659			io->state = EFCT_HW_IO_STATE_FREE;
660			INIT_LIST_HEAD(&io->list_entry);
661			list_add_tail(&io->list_entry, &hw->io_free);
662		}
663	}
664
665	dma_free_coherent(&efct->pci->dev, req.size, req.virt, req.phys);
666	memset(&req, 0, sizeof(struct efc_dma));
667	kfree(sgls);
668
669	return rc;
670}
671
672static int
673efct_hw_init_io(struct efct_hw *hw)
674{
675	u32 i, idx = 0;
676	bool prereg = false;
677	struct efct_hw_io *io = NULL;
678	int rc = 0;
679
680	prereg = hw->sli.params.sgl_pre_registered;
681
682	if (prereg)
683		return efct_hw_init_prereg_io(hw);
684
685	for (i = 0; i < hw->config.n_io; i++, idx++) {
686		io = hw->io[idx];
687		io->state = EFCT_HW_IO_STATE_FREE;
688		INIT_LIST_HEAD(&io->list_entry);
689		list_add_tail(&io->list_entry, &hw->io_free);
690	}
691
692	return rc;
693}
694
695static int
696efct_hw_config_set_fdt_xfer_hint(struct efct_hw *hw, u32 fdt_xfer_hint)
697{
698	int rc = 0;
699	u8 buf[SLI4_BMBX_SIZE];
700	struct sli4_rqst_cmn_set_features_set_fdt_xfer_hint param;
701
702	memset(&param, 0, sizeof(param));
703	param.fdt_xfer_hint = cpu_to_le32(fdt_xfer_hint);
704	/* build the set_features command */
705	sli_cmd_common_set_features(&hw->sli, buf,
706		SLI4_SET_FEATURES_SET_FTD_XFER_HINT, sizeof(param), &param);
707
708	rc = efct_hw_command(hw, buf, EFCT_CMD_POLL, NULL, NULL);
709	if (rc)
710		efc_log_warn(hw->os, "set FDT hint %d failed: %d\n",
711			     fdt_xfer_hint, rc);
712	else
713		efc_log_info(hw->os, "Set FTD transfer hint to %d\n",
714			     le32_to_cpu(param.fdt_xfer_hint));
715
716	return rc;
717}
718
719static int
720efct_hw_config_rq(struct efct_hw *hw)
721{
722	u32 min_rq_count, i, rc;
723	struct sli4_cmd_rq_cfg rq_cfg[SLI4_CMD_REG_FCFI_NUM_RQ_CFG];
724	u8 buf[SLI4_BMBX_SIZE];
725
726	efc_log_info(hw->os, "using REG_FCFI standard\n");
727
728	/*
729	 * Set the filter match/mask values from hw's
730	 * filter_def values
731	 */
732	for (i = 0; i < SLI4_CMD_REG_FCFI_NUM_RQ_CFG; i++) {
733		rq_cfg[i].rq_id = cpu_to_le16(0xffff);
734		rq_cfg[i].r_ctl_mask = (u8)hw->config.filter_def[i];
735		rq_cfg[i].r_ctl_match = (u8)(hw->config.filter_def[i] >> 8);
736		rq_cfg[i].type_mask = (u8)(hw->config.filter_def[i] >> 16);
737		rq_cfg[i].type_match = (u8)(hw->config.filter_def[i] >> 24);
738	}
739
740	/*
741	 * Update the rq_id's of the FCF configuration
742	 * (don't update more than the number of rq_cfg
743	 * elements)
744	 */
745	min_rq_count = (hw->hw_rq_count < SLI4_CMD_REG_FCFI_NUM_RQ_CFG)	?
746			hw->hw_rq_count : SLI4_CMD_REG_FCFI_NUM_RQ_CFG;
747	for (i = 0; i < min_rq_count; i++) {
748		struct hw_rq *rq = hw->hw_rq[i];
749		u32 j;
750
751		for (j = 0; j < SLI4_CMD_REG_FCFI_NUM_RQ_CFG; j++) {
752			u32 mask = (rq->filter_mask != 0) ?
753				rq->filter_mask : 1;
754
755			if (!(mask & (1U << j)))
756				continue;
757
758			rq_cfg[i].rq_id = cpu_to_le16(rq->hdr->id);
759			efct_logfcfi(hw, j, i, rq->hdr->id);
760		}
761	}
762
763	rc = -EIO;
764	if (!sli_cmd_reg_fcfi(&hw->sli, buf, 0,	rq_cfg))
765		rc = efct_hw_command(hw, buf, EFCT_CMD_POLL, NULL, NULL);
766
767	if (rc != 0) {
768		efc_log_err(hw->os, "FCFI registration failed\n");
769		return rc;
770	}
771	hw->fcf_indicator =
772		le16_to_cpu(((struct sli4_cmd_reg_fcfi *)buf)->fcfi);
773
774	return rc;
775}
776
777static int
778efct_hw_config_mrq(struct efct_hw *hw, u8 mode, u16 fcf_index)
779{
780	u8 buf[SLI4_BMBX_SIZE], mrq_bitmask = 0;
781	struct hw_rq *rq;
782	struct sli4_cmd_reg_fcfi_mrq *rsp = NULL;
783	struct sli4_cmd_rq_cfg rq_filter[SLI4_CMD_REG_FCFI_MRQ_NUM_RQ_CFG];
784	u32 rc, i;
785
786	if (mode == SLI4_CMD_REG_FCFI_SET_FCFI_MODE)
787		goto issue_cmd;
788
789	/* Set the filter match/mask values from hw's filter_def values */
790	for (i = 0; i < SLI4_CMD_REG_FCFI_NUM_RQ_CFG; i++) {
791		rq_filter[i].rq_id = cpu_to_le16(0xffff);
792		rq_filter[i].type_mask = (u8)hw->config.filter_def[i];
793		rq_filter[i].type_match = (u8)(hw->config.filter_def[i] >> 8);
794		rq_filter[i].r_ctl_mask = (u8)(hw->config.filter_def[i] >> 16);
795		rq_filter[i].r_ctl_match = (u8)(hw->config.filter_def[i] >> 24);
796	}
797
798	rq = hw->hw_rq[0];
799	rq_filter[0].rq_id = cpu_to_le16(rq->hdr->id);
800	rq_filter[1].rq_id = cpu_to_le16(rq->hdr->id);
801
802	mrq_bitmask = 0x2;
803issue_cmd:
804	efc_log_debug(hw->os, "Issue reg_fcfi_mrq count:%d policy:%d mode:%d\n",
805		      hw->hw_rq_count, hw->config.rq_selection_policy, mode);
806	/* Invoke REG_FCFI_MRQ */
807	rc = sli_cmd_reg_fcfi_mrq(&hw->sli, buf, mode, fcf_index,
808				  hw->config.rq_selection_policy, mrq_bitmask,
809				  hw->hw_mrq_count, rq_filter);
810	if (rc) {
811		efc_log_err(hw->os, "sli_cmd_reg_fcfi_mrq() failed\n");
812		return -EIO;
813	}
814
815	rc = efct_hw_command(hw, buf, EFCT_CMD_POLL, NULL, NULL);
816
817	rsp = (struct sli4_cmd_reg_fcfi_mrq *)buf;
818
819	if ((rc) || (le16_to_cpu(rsp->hdr.status))) {
820		efc_log_err(hw->os, "FCFI MRQ reg failed. cmd=%x status=%x\n",
821			    rsp->hdr.command, le16_to_cpu(rsp->hdr.status));
822		return -EIO;
823	}
824
825	if (mode == SLI4_CMD_REG_FCFI_SET_FCFI_MODE)
826		hw->fcf_indicator = le16_to_cpu(rsp->fcfi);
827
828	return 0;
829}
830
831static void
832efct_hw_queue_hash_add(struct efct_queue_hash *hash,
833		       u16 id, u16 index)
834{
835	u32 hash_index = id & (EFCT_HW_Q_HASH_SIZE - 1);
836
837	/*
838	 * Since the hash is always bigger than the number of queues, then we
839	 * never have to worry about an infinite loop.
840	 */
841	while (hash[hash_index].in_use)
842		hash_index = (hash_index + 1) & (EFCT_HW_Q_HASH_SIZE - 1);
843
844	/* not used, claim the entry */
845	hash[hash_index].id = id;
846	hash[hash_index].in_use = true;
847	hash[hash_index].index = index;
848}
849
850static int
851efct_hw_config_sli_port_health_check(struct efct_hw *hw, u8 query, u8 enable)
852{
853	int rc = 0;
854	u8 buf[SLI4_BMBX_SIZE];
855	struct sli4_rqst_cmn_set_features_health_check param;
856	u32 health_check_flag = 0;
857
858	memset(&param, 0, sizeof(param));
859
860	if (enable)
861		health_check_flag |= SLI4_RQ_HEALTH_CHECK_ENABLE;
862
863	if (query)
864		health_check_flag |= SLI4_RQ_HEALTH_CHECK_QUERY;
865
866	param.health_check_dword = cpu_to_le32(health_check_flag);
867
868	/* build the set_features command */
869	sli_cmd_common_set_features(&hw->sli, buf,
870		SLI4_SET_FEATURES_SLI_PORT_HEALTH_CHECK, sizeof(param), &param);
871
872	rc = efct_hw_command(hw, buf, EFCT_CMD_POLL, NULL, NULL);
873	if (rc)
874		efc_log_err(hw->os, "efct_hw_command returns %d\n", rc);
875	else
876		efc_log_debug(hw->os, "SLI Port Health Check is enabled\n");
877
878	return rc;
879}
880
881int
882efct_hw_init(struct efct_hw *hw)
883{
884	int rc;
885	u32 i = 0;
886	int rem_count;
887	unsigned long flags = 0;
888	struct efct_hw_io *temp;
889	struct efc_dma *dma;
890
891	/*
892	 * Make sure the command lists are empty. If this is start-of-day,
893	 * they'll be empty since they were just initialized in efct_hw_setup.
894	 * If we've just gone through a reset, the command and command pending
895	 * lists should have been cleaned up as part of the reset
896	 * (efct_hw_reset()).
897	 */
898	spin_lock_irqsave(&hw->cmd_lock, flags);
899	if (!list_empty(&hw->cmd_head)) {
900		spin_unlock_irqrestore(&hw->cmd_lock, flags);
901		efc_log_err(hw->os, "command found on cmd list\n");
902		return -EIO;
903	}
904	if (!list_empty(&hw->cmd_pending)) {
905		spin_unlock_irqrestore(&hw->cmd_lock, flags);
906		efc_log_err(hw->os, "command found on pending list\n");
907		return -EIO;
908	}
909	spin_unlock_irqrestore(&hw->cmd_lock, flags);
910
911	/* Free RQ buffers if prevously allocated */
912	efct_hw_rx_free(hw);
913
914	/*
915	 * The IO queues must be initialized here for the reset case. The
916	 * efct_hw_init_io() function will re-add the IOs to the free list.
917	 * The cmd_head list should be OK since we free all entries in
918	 * efct_hw_command_cancel() that is called in the efct_hw_reset().
919	 */
920
921	/* If we are in this function due to a reset, there may be stale items
922	 * on lists that need to be removed.  Clean them up.
923	 */
924	rem_count = 0;
925	while ((!list_empty(&hw->io_wait_free))) {
926		rem_count++;
927		temp = list_first_entry(&hw->io_wait_free, struct efct_hw_io,
928					list_entry);
929		list_del_init(&temp->list_entry);
930	}
931	if (rem_count > 0)
932		efc_log_debug(hw->os, "rmvd %d items from io_wait_free list\n",
933			      rem_count);
934
935	rem_count = 0;
936	while ((!list_empty(&hw->io_inuse))) {
937		rem_count++;
938		temp = list_first_entry(&hw->io_inuse, struct efct_hw_io,
939					list_entry);
940		list_del_init(&temp->list_entry);
941	}
942	if (rem_count > 0)
943		efc_log_debug(hw->os, "rmvd %d items from io_inuse list\n",
944			      rem_count);
945
946	rem_count = 0;
947	while ((!list_empty(&hw->io_free))) {
948		rem_count++;
949		temp = list_first_entry(&hw->io_free, struct efct_hw_io,
950					list_entry);
951		list_del_init(&temp->list_entry);
952	}
953	if (rem_count > 0)
954		efc_log_debug(hw->os, "rmvd %d items from io_free list\n",
955			      rem_count);
956
957	/* If MRQ not required, Make sure we dont request feature. */
958	if (hw->config.n_rq == 1)
959		hw->sli.features &= (~SLI4_REQFEAT_MRQP);
960
961	if (sli_init(&hw->sli)) {
962		efc_log_err(hw->os, "SLI failed to initialize\n");
963		return -EIO;
964	}
965
966	if (hw->sliport_healthcheck) {
967		rc = efct_hw_config_sli_port_health_check(hw, 0, 1);
968		if (rc != 0) {
969			efc_log_err(hw->os, "Enable port Health check fail\n");
970			return rc;
971		}
972	}
973
974	/*
975	 * Set FDT transfer hint, only works on Lancer
976	 */
977	if (hw->sli.if_type == SLI4_INTF_IF_TYPE_2) {
978		/*
979		 * Non-fatal error. In particular, we can disregard failure to
980		 * set EFCT_HW_FDT_XFER_HINT on devices with legacy firmware
981		 * that do not support EFCT_HW_FDT_XFER_HINT feature.
982		 */
983		efct_hw_config_set_fdt_xfer_hint(hw, EFCT_HW_FDT_XFER_HINT);
984	}
985
986	/* zero the hashes */
987	memset(hw->cq_hash, 0, sizeof(hw->cq_hash));
988	efc_log_debug(hw->os, "Max CQs %d, hash size = %d\n",
989		      EFCT_HW_MAX_NUM_CQ, EFCT_HW_Q_HASH_SIZE);
990
991	memset(hw->rq_hash, 0, sizeof(hw->rq_hash));
992	efc_log_debug(hw->os, "Max RQs %d, hash size = %d\n",
993		      EFCT_HW_MAX_NUM_RQ, EFCT_HW_Q_HASH_SIZE);
994
995	memset(hw->wq_hash, 0, sizeof(hw->wq_hash));
996	efc_log_debug(hw->os, "Max WQs %d, hash size = %d\n",
997		      EFCT_HW_MAX_NUM_WQ, EFCT_HW_Q_HASH_SIZE);
998
999	rc = efct_hw_init_queues(hw);
1000	if (rc)
1001		return rc;
1002
1003	rc = efct_hw_map_wq_cpu(hw);
1004	if (rc)
1005		return rc;
1006
1007	/* Allocate and p_st RQ buffers */
1008	rc = efct_hw_rx_allocate(hw);
1009	if (rc) {
1010		efc_log_err(hw->os, "rx_allocate failed\n");
1011		return rc;
1012	}
1013
1014	rc = efct_hw_rx_post(hw);
1015	if (rc) {
1016		efc_log_err(hw->os, "WARNING - error posting RQ buffers\n");
1017		return rc;
1018	}
1019
1020	if (hw->config.n_eq == 1) {
1021		rc = efct_hw_config_rq(hw);
1022		if (rc) {
1023			efc_log_err(hw->os, "config rq failed %d\n", rc);
1024			return rc;
1025		}
1026	} else {
1027		rc = efct_hw_config_mrq(hw, SLI4_CMD_REG_FCFI_SET_FCFI_MODE, 0);
1028		if (rc != 0) {
1029			efc_log_err(hw->os, "REG_FCFI_MRQ FCFI reg failed\n");
1030			return rc;
1031		}
1032
1033		rc = efct_hw_config_mrq(hw, SLI4_CMD_REG_FCFI_SET_MRQ_MODE, 0);
1034		if (rc != 0) {
1035			efc_log_err(hw->os, "REG_FCFI_MRQ MRQ reg failed\n");
1036			return rc;
1037		}
1038	}
1039
1040	/*
1041	 * Allocate the WQ request tag pool, if not previously allocated
1042	 * (the request tag value is 16 bits, thus the pool allocation size
1043	 * of 64k)
1044	 */
1045	hw->wq_reqtag_pool = efct_hw_reqtag_pool_alloc(hw);
1046	if (!hw->wq_reqtag_pool) {
1047		efc_log_err(hw->os, "efct_hw_reqtag_pool_alloc failed\n");
1048		return -ENOMEM;
1049	}
1050
1051	rc = efct_hw_setup_io(hw);
1052	if (rc) {
1053		efc_log_err(hw->os, "IO allocation failure\n");
1054		return rc;
1055	}
1056
1057	rc = efct_hw_init_io(hw);
1058	if (rc) {
1059		efc_log_err(hw->os, "IO initialization failure\n");
1060		return rc;
1061	}
1062
1063	dma = &hw->loop_map;
1064	dma->size = SLI4_MIN_LOOP_MAP_BYTES;
1065	dma->virt = dma_alloc_coherent(&hw->os->pci->dev, dma->size, &dma->phys,
1066				       GFP_KERNEL);
1067	if (!dma->virt)
1068		return -EIO;
1069
1070	/*
1071	 * Arming the EQ allows (e.g.) interrupts when CQ completions write EQ
1072	 * entries
1073	 */
1074	for (i = 0; i < hw->eq_count; i++)
1075		sli_queue_arm(&hw->sli, &hw->eq[i], true);
1076
1077	/*
1078	 * Initialize RQ hash
1079	 */
1080	for (i = 0; i < hw->rq_count; i++)
1081		efct_hw_queue_hash_add(hw->rq_hash, hw->rq[i].id, i);
1082
1083	/*
1084	 * Initialize WQ hash
1085	 */
1086	for (i = 0; i < hw->wq_count; i++)
1087		efct_hw_queue_hash_add(hw->wq_hash, hw->wq[i].id, i);
1088
1089	/*
1090	 * Arming the CQ allows (e.g.) MQ completions to write CQ entries
1091	 */
1092	for (i = 0; i < hw->cq_count; i++) {
1093		efct_hw_queue_hash_add(hw->cq_hash, hw->cq[i].id, i);
1094		sli_queue_arm(&hw->sli, &hw->cq[i], true);
1095	}
1096
1097	/* Set RQ process limit*/
1098	for (i = 0; i < hw->hw_rq_count; i++) {
1099		struct hw_rq *rq = hw->hw_rq[i];
1100
1101		hw->cq[rq->cq->instance].proc_limit = hw->config.n_io / 2;
1102	}
1103
1104	/* record the fact that the queues are functional */
1105	hw->state = EFCT_HW_STATE_ACTIVE;
1106	/*
1107	 * Allocate a HW IOs for send frame.
1108	 */
1109	hw->hw_wq[0]->send_frame_io = efct_hw_io_alloc(hw);
1110	if (!hw->hw_wq[0]->send_frame_io)
1111		efc_log_err(hw->os, "alloc for send_frame_io failed\n");
1112
1113	/* Initialize send frame sequence id */
1114	atomic_set(&hw->send_frame_seq_id, 0);
1115
1116	return 0;
1117}
1118
1119int
1120efct_hw_parse_filter(struct efct_hw *hw, void *value)
1121{
1122	int rc = 0;
1123	char *p = NULL;
1124	char *token;
1125	u32 idx = 0;
1126
1127	for (idx = 0; idx < ARRAY_SIZE(hw->config.filter_def); idx++)
1128		hw->config.filter_def[idx] = 0;
1129
1130	p = kstrdup(value, GFP_KERNEL);
1131	if (!p || !*p) {
1132		efc_log_err(hw->os, "p is NULL\n");
1133		return -ENOMEM;
1134	}
1135
1136	idx = 0;
1137	while ((token = strsep(&p, ",")) && *token) {
1138		if (kstrtou32(token, 0, &hw->config.filter_def[idx++]))
1139			efc_log_err(hw->os, "kstrtoint failed\n");
1140
1141		if (!p || !*p)
1142			break;
1143
1144		if (idx == ARRAY_SIZE(hw->config.filter_def))
1145			break;
1146	}
1147	kfree(p);
1148
1149	return rc;
1150}
1151
1152u64
1153efct_get_wwnn(struct efct_hw *hw)
1154{
1155	struct sli4 *sli = &hw->sli;
1156	u8 p[8];
1157
1158	memcpy(p, sli->wwnn, sizeof(p));
1159	return get_unaligned_be64(p);
1160}
1161
1162u64
1163efct_get_wwpn(struct efct_hw *hw)
1164{
1165	struct sli4 *sli = &hw->sli;
1166	u8 p[8];
1167
1168	memcpy(p, sli->wwpn, sizeof(p));
1169	return get_unaligned_be64(p);
1170}
1171
1172static struct efc_hw_rq_buffer *
1173efct_hw_rx_buffer_alloc(struct efct_hw *hw, u32 rqindex, u32 count,
1174			u32 size)
1175{
1176	struct efct *efct = hw->os;
1177	struct efc_hw_rq_buffer *rq_buf = NULL;
1178	struct efc_hw_rq_buffer *prq;
1179	u32 i;
1180
1181	if (!count)
1182		return NULL;
1183
1184	rq_buf = kmalloc_array(count, sizeof(*rq_buf), GFP_KERNEL);
1185	if (!rq_buf)
1186		return NULL;
1187	memset(rq_buf, 0, sizeof(*rq_buf) * count);
1188
1189	for (i = 0, prq = rq_buf; i < count; i ++, prq++) {
1190		prq->rqindex = rqindex;
1191		prq->dma.size = size;
1192		prq->dma.virt = dma_alloc_coherent(&efct->pci->dev,
1193						   prq->dma.size,
1194						   &prq->dma.phys,
1195						   GFP_KERNEL);
1196		if (!prq->dma.virt) {
1197			efc_log_err(hw->os, "DMA allocation failed\n");
1198			kfree(rq_buf);
1199			return NULL;
1200		}
1201	}
1202	return rq_buf;
1203}
1204
1205static void
1206efct_hw_rx_buffer_free(struct efct_hw *hw,
1207		       struct efc_hw_rq_buffer *rq_buf,
1208			u32 count)
1209{
1210	struct efct *efct = hw->os;
1211	u32 i;
1212	struct efc_hw_rq_buffer *prq;
1213
1214	if (rq_buf) {
1215		for (i = 0, prq = rq_buf; i < count; i++, prq++) {
1216			dma_free_coherent(&efct->pci->dev,
1217					  prq->dma.size, prq->dma.virt,
1218					  prq->dma.phys);
1219			memset(&prq->dma, 0, sizeof(struct efc_dma));
1220		}
1221
1222		kfree(rq_buf);
1223	}
1224}
1225
1226int
1227efct_hw_rx_allocate(struct efct_hw *hw)
1228{
1229	struct efct *efct = hw->os;
1230	u32 i;
1231	int rc = 0;
1232	u32 rqindex = 0;
1233	u32 hdr_size = EFCT_HW_RQ_SIZE_HDR;
1234	u32 payload_size = hw->config.rq_default_buffer_size;
1235
1236	rqindex = 0;
1237
1238	for (i = 0; i < hw->hw_rq_count; i++) {
1239		struct hw_rq *rq = hw->hw_rq[i];
1240
1241		/* Allocate header buffers */
1242		rq->hdr_buf = efct_hw_rx_buffer_alloc(hw, rqindex,
1243						      rq->entry_count,
1244						      hdr_size);
1245		if (!rq->hdr_buf) {
1246			efc_log_err(efct, "rx_buffer_alloc hdr_buf failed\n");
1247			rc = -EIO;
1248			break;
1249		}
1250
1251		efc_log_debug(hw->os,
1252			      "rq[%2d] rq_id %02d header  %4d by %4d bytes\n",
1253			      i, rq->hdr->id, rq->entry_count, hdr_size);
1254
1255		rqindex++;
1256
1257		/* Allocate payload buffers */
1258		rq->payload_buf = efct_hw_rx_buffer_alloc(hw, rqindex,
1259							  rq->entry_count,
1260							  payload_size);
1261		if (!rq->payload_buf) {
1262			efc_log_err(efct, "rx_buffer_alloc fb_buf failed\n");
1263			rc = -EIO;
1264			break;
1265		}
1266		efc_log_debug(hw->os,
1267			      "rq[%2d] rq_id %02d default %4d by %4d bytes\n",
1268			      i, rq->data->id, rq->entry_count, payload_size);
1269		rqindex++;
1270	}
1271
1272	return rc ? -EIO : 0;
1273}
1274
1275int
1276efct_hw_rx_post(struct efct_hw *hw)
1277{
1278	u32 i;
1279	u32 idx;
1280	u32 rq_idx;
1281	int rc = 0;
1282
1283	if (!hw->seq_pool) {
1284		u32 count = 0;
1285
1286		for (i = 0; i < hw->hw_rq_count; i++)
1287			count += hw->hw_rq[i]->entry_count;
1288
1289		hw->seq_pool = kmalloc_array(count,
1290				sizeof(struct efc_hw_sequence),	GFP_KERNEL);
1291		if (!hw->seq_pool)
1292			return -ENOMEM;
1293	}
1294
1295	/*
1296	 * In RQ pair mode, we MUST post the header and payload buffer at the
1297	 * same time.
1298	 */
1299	for (rq_idx = 0, idx = 0; rq_idx < hw->hw_rq_count; rq_idx++) {
1300		struct hw_rq *rq = hw->hw_rq[rq_idx];
1301
1302		for (i = 0; i < rq->entry_count - 1; i++) {
1303			struct efc_hw_sequence *seq;
1304
1305			seq = hw->seq_pool + idx;
1306			idx++;
1307			seq->header = &rq->hdr_buf[i];
1308			seq->payload = &rq->payload_buf[i];
1309			rc = efct_hw_sequence_free(hw, seq);
1310			if (rc)
1311				break;
1312		}
1313		if (rc)
1314			break;
1315	}
1316
1317	if (rc && hw->seq_pool)
1318		kfree(hw->seq_pool);
1319
1320	return rc;
1321}
1322
1323void
1324efct_hw_rx_free(struct efct_hw *hw)
1325{
1326	u32 i;
1327
1328	/* Free hw_rq buffers */
1329	for (i = 0; i < hw->hw_rq_count; i++) {
1330		struct hw_rq *rq = hw->hw_rq[i];
1331
1332		if (rq) {
1333			efct_hw_rx_buffer_free(hw, rq->hdr_buf,
1334					       rq->entry_count);
1335			rq->hdr_buf = NULL;
1336			efct_hw_rx_buffer_free(hw, rq->payload_buf,
1337					       rq->entry_count);
1338			rq->payload_buf = NULL;
1339		}
1340	}
1341}
1342
1343static int
1344efct_hw_cmd_submit_pending(struct efct_hw *hw)
1345{
1346	int rc = 0;
1347
1348	/* Assumes lock held */
1349
1350	/* Only submit MQE if there's room */
1351	while (hw->cmd_head_count < (EFCT_HW_MQ_DEPTH - 1) &&
1352	       !list_empty(&hw->cmd_pending)) {
1353		struct efct_command_ctx *ctx;
1354
1355		ctx = list_first_entry(&hw->cmd_pending,
1356				       struct efct_command_ctx, list_entry);
1357		if (!ctx)
1358			break;
1359
1360		list_del_init(&ctx->list_entry);
1361
1362		list_add_tail(&ctx->list_entry, &hw->cmd_head);
1363		hw->cmd_head_count++;
1364		if (sli_mq_write(&hw->sli, hw->mq, ctx->buf) < 0) {
1365			efc_log_debug(hw->os,
1366				      "sli_queue_write failed: %d\n", rc);
1367			rc = -EIO;
1368			break;
1369		}
1370	}
1371	return rc;
1372}
1373
1374int
1375efct_hw_command(struct efct_hw *hw, u8 *cmd, u32 opts, void *cb, void *arg)
1376{
1377	int rc = -EIO;
1378	unsigned long flags = 0;
1379	void *bmbx = NULL;
1380
1381	/*
1382	 * If the chip is in an error state (UE'd) then reject this mailbox
1383	 * command.
1384	 */
1385	if (sli_fw_error_status(&hw->sli) > 0) {
1386		efc_log_crit(hw->os, "Chip in an error state - reset needed\n");
1387		efc_log_crit(hw->os, "status=%#x error1=%#x error2=%#x\n",
1388			     sli_reg_read_status(&hw->sli),
1389			     sli_reg_read_err1(&hw->sli),
1390			     sli_reg_read_err2(&hw->sli));
1391
1392		return -EIO;
1393	}
1394
1395	/*
1396	 * Send a mailbox command to the hardware, and either wait for
1397	 * a completion (EFCT_CMD_POLL) or get an optional asynchronous
1398	 * completion (EFCT_CMD_NOWAIT).
1399	 */
1400
1401	if (opts == EFCT_CMD_POLL) {
1402		mutex_lock(&hw->bmbx_lock);
1403		bmbx = hw->sli.bmbx.virt;
1404
1405		memcpy(bmbx, cmd, SLI4_BMBX_SIZE);
1406
1407		if (sli_bmbx_command(&hw->sli) == 0) {
1408			rc = 0;
1409			memcpy(cmd, bmbx, SLI4_BMBX_SIZE);
1410		}
1411		mutex_unlock(&hw->bmbx_lock);
1412	} else if (opts == EFCT_CMD_NOWAIT) {
1413		struct efct_command_ctx	*ctx = NULL;
1414
1415		if (hw->state != EFCT_HW_STATE_ACTIVE) {
1416			efc_log_err(hw->os, "Can't send command, HW state=%d\n",
1417				    hw->state);
1418			return -EIO;
1419		}
1420
1421		ctx = mempool_alloc(hw->cmd_ctx_pool, GFP_ATOMIC);
1422		if (!ctx)
1423			return -ENOSPC;
1424
1425		memset(ctx, 0, sizeof(struct efct_command_ctx));
1426
1427		if (cb) {
1428			ctx->cb = cb;
1429			ctx->arg = arg;
1430		}
1431
1432		memcpy(ctx->buf, cmd, SLI4_BMBX_SIZE);
1433		ctx->ctx = hw;
1434
1435		spin_lock_irqsave(&hw->cmd_lock, flags);
1436
1437		/* Add to pending list */
1438		INIT_LIST_HEAD(&ctx->list_entry);
1439		list_add_tail(&ctx->list_entry, &hw->cmd_pending);
1440
1441		/* Submit as much of the pending list as we can */
1442		rc = efct_hw_cmd_submit_pending(hw);
1443
1444		spin_unlock_irqrestore(&hw->cmd_lock, flags);
1445	}
1446
1447	return rc;
1448}
1449
1450static int
1451efct_hw_command_process(struct efct_hw *hw, int status, u8 *mqe,
1452			size_t size)
1453{
1454	struct efct_command_ctx *ctx = NULL;
1455	unsigned long flags = 0;
1456
1457	spin_lock_irqsave(&hw->cmd_lock, flags);
1458	if (!list_empty(&hw->cmd_head)) {
1459		ctx = list_first_entry(&hw->cmd_head,
1460				       struct efct_command_ctx, list_entry);
1461		list_del_init(&ctx->list_entry);
1462	}
1463	if (!ctx) {
1464		efc_log_err(hw->os, "no command context\n");
1465		spin_unlock_irqrestore(&hw->cmd_lock, flags);
1466		return -EIO;
1467	}
1468
1469	hw->cmd_head_count--;
1470
1471	/* Post any pending requests */
1472	efct_hw_cmd_submit_pending(hw);
1473
1474	spin_unlock_irqrestore(&hw->cmd_lock, flags);
1475
1476	if (ctx->cb) {
1477		memcpy(ctx->buf, mqe, size);
1478		ctx->cb(hw, status, ctx->buf, ctx->arg);
1479	}
1480
1481	mempool_free(ctx, hw->cmd_ctx_pool);
1482
1483	return 0;
1484}
1485
1486static int
1487efct_hw_mq_process(struct efct_hw *hw,
1488		   int status, struct sli4_queue *mq)
1489{
1490	u8 mqe[SLI4_BMBX_SIZE];
1491	int rc;
1492
1493	rc = sli_mq_read(&hw->sli, mq, mqe);
1494	if (!rc)
1495		rc = efct_hw_command_process(hw, status, mqe, mq->size);
1496
1497	return rc;
1498}
1499
1500static int
1501efct_hw_command_cancel(struct efct_hw *hw)
1502{
1503	unsigned long flags = 0;
1504	int rc = 0;
1505
1506	spin_lock_irqsave(&hw->cmd_lock, flags);
1507
1508	/*
1509	 * Manually clean up remaining commands. Note: since this calls
1510	 * efct_hw_command_process(), we'll also process the cmd_pending
1511	 * list, so no need to manually clean that out.
1512	 */
1513	while (!list_empty(&hw->cmd_head)) {
1514		u8		mqe[SLI4_BMBX_SIZE] = { 0 };
1515		struct efct_command_ctx *ctx;
1516
1517		ctx = list_first_entry(&hw->cmd_head,
1518				       struct efct_command_ctx, list_entry);
1519
1520		efc_log_debug(hw->os, "hung command %08x\n",
1521			      !ctx ? U32_MAX : *((u32 *)ctx->buf));
1522		spin_unlock_irqrestore(&hw->cmd_lock, flags);
1523		rc = efct_hw_command_process(hw, -1, mqe, SLI4_BMBX_SIZE);
1524		spin_lock_irqsave(&hw->cmd_lock, flags);
1525	}
1526
1527	spin_unlock_irqrestore(&hw->cmd_lock, flags);
1528
1529	return rc;
1530}
1531
1532static void
1533efct_mbox_rsp_cb(struct efct_hw *hw, int status, u8 *mqe, void *arg)
1534{
1535	struct efct_mbox_rqst_ctx *ctx = arg;
1536
1537	if (ctx) {
1538		if (ctx->callback)
1539			(*ctx->callback)(hw->os->efcport, status, mqe,
1540					 ctx->arg);
1541
1542		mempool_free(ctx, hw->mbox_rqst_pool);
1543	}
1544}
1545
1546int
1547efct_issue_mbox_rqst(void *base, void *cmd, void *cb, void *arg)
1548{
1549	struct efct_mbox_rqst_ctx *ctx;
1550	struct efct *efct = base;
1551	struct efct_hw *hw = &efct->hw;
1552	int rc;
1553
1554	/*
1555	 * Allocate a callback context (which includes the mbox cmd buffer),
1556	 * we need this to be persistent as the mbox cmd submission may be
1557	 * queued and executed later execution.
1558	 */
1559	ctx = mempool_alloc(hw->mbox_rqst_pool, GFP_ATOMIC);
1560	if (!ctx)
1561		return -EIO;
1562
1563	ctx->callback = cb;
1564	ctx->arg = arg;
1565
1566	rc = efct_hw_command(hw, cmd, EFCT_CMD_NOWAIT, efct_mbox_rsp_cb, ctx);
1567	if (rc) {
1568		efc_log_err(efct, "issue mbox rqst failure rc:%d\n", rc);
1569		mempool_free(ctx, hw->mbox_rqst_pool);
1570		return -EIO;
1571	}
1572
1573	return 0;
1574}
1575
1576static inline struct efct_hw_io *
1577_efct_hw_io_alloc(struct efct_hw *hw)
1578{
1579	struct efct_hw_io *io = NULL;
1580
1581	if (!list_empty(&hw->io_free)) {
1582		io = list_first_entry(&hw->io_free, struct efct_hw_io,
1583				      list_entry);
1584		list_del(&io->list_entry);
1585	}
1586	if (io) {
1587		INIT_LIST_HEAD(&io->list_entry);
1588		list_add_tail(&io->list_entry, &hw->io_inuse);
1589		io->state = EFCT_HW_IO_STATE_INUSE;
1590		io->abort_reqtag = U32_MAX;
1591		io->wq = hw->wq_cpu_array[raw_smp_processor_id()];
1592		if (!io->wq) {
1593			efc_log_err(hw->os, "WQ not assigned for cpu:%d\n",
1594				    raw_smp_processor_id());
1595			io->wq = hw->hw_wq[0];
1596		}
1597		kref_init(&io->ref);
1598		io->release = efct_hw_io_free_internal;
1599	} else {
1600		atomic_add(1, &hw->io_alloc_failed_count);
1601	}
1602
1603	return io;
1604}
1605
1606struct efct_hw_io *
1607efct_hw_io_alloc(struct efct_hw *hw)
1608{
1609	struct efct_hw_io *io = NULL;
1610	unsigned long flags = 0;
1611
1612	spin_lock_irqsave(&hw->io_lock, flags);
1613	io = _efct_hw_io_alloc(hw);
1614	spin_unlock_irqrestore(&hw->io_lock, flags);
1615
1616	return io;
1617}
1618
1619static void
1620efct_hw_io_free_move_correct_list(struct efct_hw *hw,
1621				  struct efct_hw_io *io)
1622{
1623	/*
1624	 * When an IO is freed, depending on the exchange busy flag,
1625	 * move it to the correct list.
1626	 */
1627	if (io->xbusy) {
1628		/*
1629		 * add to wait_free list and wait for XRI_ABORTED CQEs to clean
1630		 * up
1631		 */
1632		INIT_LIST_HEAD(&io->list_entry);
1633		list_add_tail(&io->list_entry, &hw->io_wait_free);
1634		io->state = EFCT_HW_IO_STATE_WAIT_FREE;
1635	} else {
1636		/* IO not busy, add to free list */
1637		INIT_LIST_HEAD(&io->list_entry);
1638		list_add_tail(&io->list_entry, &hw->io_free);
1639		io->state = EFCT_HW_IO_STATE_FREE;
1640	}
1641}
1642
1643static inline void
1644efct_hw_io_free_common(struct efct_hw *hw, struct efct_hw_io *io)
1645{
1646	/* initialize IO fields */
1647	efct_hw_init_free_io(io);
1648
1649	/* Restore default SGL */
1650	efct_hw_io_restore_sgl(hw, io);
1651}
1652
1653void
1654efct_hw_io_free_internal(struct kref *arg)
1655{
1656	unsigned long flags = 0;
1657	struct efct_hw_io *io =	container_of(arg, struct efct_hw_io, ref);
1658	struct efct_hw *hw = io->hw;
1659
1660	/* perform common cleanup */
1661	efct_hw_io_free_common(hw, io);
1662
1663	spin_lock_irqsave(&hw->io_lock, flags);
1664	/* remove from in-use list */
1665	if (!list_empty(&io->list_entry) && !list_empty(&hw->io_inuse)) {
1666		list_del_init(&io->list_entry);
1667		efct_hw_io_free_move_correct_list(hw, io);
1668	}
1669	spin_unlock_irqrestore(&hw->io_lock, flags);
1670}
1671
1672int
1673efct_hw_io_free(struct efct_hw *hw, struct efct_hw_io *io)
1674{
1675	return kref_put(&io->ref, io->release);
1676}
1677
1678struct efct_hw_io *
1679efct_hw_io_lookup(struct efct_hw *hw, u32 xri)
1680{
1681	u32 ioindex;
1682
1683	ioindex = xri - hw->sli.ext[SLI4_RSRC_XRI].base[0];
1684	return hw->io[ioindex];
1685}
1686
1687int
1688efct_hw_io_init_sges(struct efct_hw *hw, struct efct_hw_io *io,
1689		     enum efct_hw_io_type type)
1690{
1691	struct sli4_sge	*data = NULL;
1692	u32 i = 0;
1693	u32 skips = 0;
1694	u32 sge_flags = 0;
1695
1696	if (!io) {
1697		efc_log_err(hw->os, "bad parameter hw=%p io=%p\n", hw, io);
1698		return -EIO;
1699	}
1700
1701	/* Clear / reset the scatter-gather list */
1702	io->sgl = &io->def_sgl;
1703	io->sgl_count = io->def_sgl_count;
1704	io->first_data_sge = 0;
1705
1706	memset(io->sgl->virt, 0, 2 * sizeof(struct sli4_sge));
1707	io->n_sge = 0;
1708	io->sge_offset = 0;
1709
1710	io->type = type;
1711
1712	data = io->sgl->virt;
1713
1714	/*
1715	 * Some IO types have underlying hardware requirements on the order
1716	 * of SGEs. Process all special entries here.
1717	 */
1718	switch (type) {
1719	case EFCT_HW_IO_TARGET_WRITE:
1720
1721		/* populate host resident XFER_RDY buffer */
1722		sge_flags = le32_to_cpu(data->dw2_flags);
1723		sge_flags &= (~SLI4_SGE_TYPE_MASK);
1724		sge_flags |= (SLI4_SGE_TYPE_DATA << SLI4_SGE_TYPE_SHIFT);
1725		data->buffer_address_high =
1726			cpu_to_le32(upper_32_bits(io->xfer_rdy.phys));
1727		data->buffer_address_low  =
1728			cpu_to_le32(lower_32_bits(io->xfer_rdy.phys));
1729		data->buffer_length = cpu_to_le32(io->xfer_rdy.size);
1730		data->dw2_flags = cpu_to_le32(sge_flags);
1731		data++;
1732
1733		skips = EFCT_TARGET_WRITE_SKIPS;
1734
1735		io->n_sge = 1;
1736		break;
1737	case EFCT_HW_IO_TARGET_READ:
1738		/*
1739		 * For FCP_TSEND64, the first 2 entries are SKIP SGE's
1740		 */
1741		skips = EFCT_TARGET_READ_SKIPS;
1742		break;
1743	case EFCT_HW_IO_TARGET_RSP:
1744		/*
1745		 * No skips, etc. for FCP_TRSP64
1746		 */
1747		break;
1748	default:
1749		efc_log_err(hw->os, "unsupported IO type %#x\n", type);
1750		return -EIO;
1751	}
1752
1753	/*
1754	 * Write skip entries
1755	 */
1756	for (i = 0; i < skips; i++) {
1757		sge_flags = le32_to_cpu(data->dw2_flags);
1758		sge_flags &= (~SLI4_SGE_TYPE_MASK);
1759		sge_flags |= (SLI4_SGE_TYPE_SKIP << SLI4_SGE_TYPE_SHIFT);
1760		data->dw2_flags = cpu_to_le32(sge_flags);
1761		data++;
1762	}
1763
1764	io->n_sge += skips;
1765
1766	/*
1767	 * Set last
1768	 */
1769	sge_flags = le32_to_cpu(data->dw2_flags);
1770	sge_flags |= SLI4_SGE_LAST;
1771	data->dw2_flags = cpu_to_le32(sge_flags);
1772
1773	return 0;
1774}
1775
1776int
1777efct_hw_io_add_sge(struct efct_hw *hw, struct efct_hw_io *io,
1778		   uintptr_t addr, u32 length)
1779{
1780	struct sli4_sge	*data = NULL;
1781	u32 sge_flags = 0;
1782
1783	if (!io || !addr || !length) {
1784		efc_log_err(hw->os,
1785			    "bad parameter hw=%p io=%p addr=%lx length=%u\n",
1786			    hw, io, addr, length);
1787		return -EIO;
1788	}
1789
1790	if (length > hw->sli.sge_supported_length) {
1791		efc_log_err(hw->os,
1792			    "length of SGE %d bigger than allowed %d\n",
1793			    length, hw->sli.sge_supported_length);
1794		return -EIO;
1795	}
1796
1797	data = io->sgl->virt;
1798	data += io->n_sge;
1799
1800	sge_flags = le32_to_cpu(data->dw2_flags);
1801	sge_flags &= ~SLI4_SGE_TYPE_MASK;
1802	sge_flags |= SLI4_SGE_TYPE_DATA << SLI4_SGE_TYPE_SHIFT;
1803	sge_flags &= ~SLI4_SGE_DATA_OFFSET_MASK;
1804	sge_flags |= SLI4_SGE_DATA_OFFSET_MASK & io->sge_offset;
1805
1806	data->buffer_address_high = cpu_to_le32(upper_32_bits(addr));
1807	data->buffer_address_low  = cpu_to_le32(lower_32_bits(addr));
1808	data->buffer_length = cpu_to_le32(length);
1809
1810	/*
1811	 * Always assume this is the last entry and mark as such.
1812	 * If this is not the first entry unset the "last SGE"
1813	 * indication for the previous entry
1814	 */
1815	sge_flags |= SLI4_SGE_LAST;
1816	data->dw2_flags = cpu_to_le32(sge_flags);
1817
1818	if (io->n_sge) {
1819		sge_flags = le32_to_cpu(data[-1].dw2_flags);
1820		sge_flags &= ~SLI4_SGE_LAST;
1821		data[-1].dw2_flags = cpu_to_le32(sge_flags);
1822	}
1823
1824	/* Set first_data_bde if not previously set */
1825	if (io->first_data_sge == 0)
1826		io->first_data_sge = io->n_sge;
1827
1828	io->sge_offset += length;
1829	io->n_sge++;
1830
1831	return 0;
1832}
1833
1834void
1835efct_hw_io_abort_all(struct efct_hw *hw)
1836{
1837	struct efct_hw_io *io_to_abort	= NULL;
1838	struct efct_hw_io *next_io = NULL;
1839
1840	list_for_each_entry_safe(io_to_abort, next_io,
1841				 &hw->io_inuse, list_entry) {
1842		efct_hw_io_abort(hw, io_to_abort, true, NULL, NULL);
1843	}
1844}
1845
1846static void
1847efct_hw_wq_process_abort(void *arg, u8 *cqe, int status)
1848{
1849	struct efct_hw_io *io = arg;
1850	struct efct_hw *hw = io->hw;
1851	u32 ext = 0;
1852	u32 len = 0;
1853	struct hw_wq_callback *wqcb;
1854
1855	/*
1856	 * For IOs that were aborted internally, we may need to issue the
1857	 * callback here depending on whether a XRI_ABORTED CQE is expected ot
1858	 * not. If the status is Local Reject/No XRI, then
1859	 * issue the callback now.
1860	 */
1861	ext = sli_fc_ext_status(&hw->sli, cqe);
1862	if (status == SLI4_FC_WCQE_STATUS_LOCAL_REJECT &&
1863	    ext == SLI4_FC_LOCAL_REJECT_NO_XRI && io->done) {
1864		efct_hw_done_t done = io->done;
1865
1866		io->done = NULL;
1867
1868		/*
1869		 * Use latched status as this is always saved for an internal
1870		 * abort Note: We won't have both a done and abort_done
1871		 * function, so don't worry about
1872		 *       clobbering the len, status and ext fields.
1873		 */
1874		status = io->saved_status;
1875		len = io->saved_len;
1876		ext = io->saved_ext;
1877		io->status_saved = false;
1878		done(io, len, status, ext, io->arg);
1879	}
1880
1881	if (io->abort_done) {
1882		efct_hw_done_t done = io->abort_done;
1883
1884		io->abort_done = NULL;
1885		done(io, len, status, ext, io->abort_arg);
1886	}
1887
1888	/* clear abort bit to indicate abort is complete */
1889	io->abort_in_progress = false;
1890
1891	/* Free the WQ callback */
1892	if (io->abort_reqtag == U32_MAX) {
1893		efc_log_err(hw->os, "HW IO already freed\n");
1894		return;
1895	}
1896
1897	wqcb = efct_hw_reqtag_get_instance(hw, io->abort_reqtag);
1898	efct_hw_reqtag_free(hw, wqcb);
1899
1900	/*
1901	 * Call efct_hw_io_free() because this releases the WQ reservation as
1902	 * well as doing the refcount put. Don't duplicate the code here.
1903	 */
1904	(void)efct_hw_io_free(hw, io);
1905}
1906
1907static void
1908efct_hw_fill_abort_wqe(struct efct_hw *hw, struct efct_hw_wqe *wqe)
1909{
1910	struct sli4_abort_wqe *abort = (void *)wqe->wqebuf;
1911
1912	memset(abort, 0, hw->sli.wqe_size);
1913
1914	abort->criteria = SLI4_ABORT_CRITERIA_XRI_TAG;
1915	abort->ia_ir_byte |= wqe->send_abts ? 0 : 1;
1916
1917	/* Suppress ABTS retries */
1918	abort->ia_ir_byte |= SLI4_ABRT_WQE_IR;
1919
1920	abort->t_tag  = cpu_to_le32(wqe->id);
1921	abort->command = SLI4_WQE_ABORT;
1922	abort->request_tag = cpu_to_le16(wqe->abort_reqtag);
1923
1924	abort->dw10w0_flags = cpu_to_le16(SLI4_ABRT_WQE_QOSD);
1925
1926	abort->cq_id = cpu_to_le16(SLI4_CQ_DEFAULT);
1927}
1928
1929int
1930efct_hw_io_abort(struct efct_hw *hw, struct efct_hw_io *io_to_abort,
1931		 bool send_abts, void *cb, void *arg)
1932{
1933	struct hw_wq_callback *wqcb;
1934	unsigned long flags = 0;
1935
1936	if (!io_to_abort) {
1937		efc_log_err(hw->os, "bad parameter hw=%p io=%p\n",
1938			    hw, io_to_abort);
1939		return -EIO;
1940	}
1941
1942	if (hw->state != EFCT_HW_STATE_ACTIVE) {
1943		efc_log_err(hw->os, "cannot send IO abort, HW state=%d\n",
1944			    hw->state);
1945		return -EIO;
1946	}
1947
1948	/* take a reference on IO being aborted */
1949	if (kref_get_unless_zero(&io_to_abort->ref) == 0) {
1950		/* command no longer active */
1951		efc_log_debug(hw->os,
1952			      "io not active xri=0x%x tag=0x%x\n",
1953			      io_to_abort->indicator, io_to_abort->reqtag);
1954		return -ENOENT;
1955	}
1956
1957	/* Must have a valid WQ reference */
1958	if (!io_to_abort->wq) {
1959		efc_log_debug(hw->os, "io_to_abort xri=0x%x not active on WQ\n",
1960			      io_to_abort->indicator);
1961		/* efct_ref_get(): same function */
1962		kref_put(&io_to_abort->ref, io_to_abort->release);
1963		return -ENOENT;
1964	}
1965
1966	/*
1967	 * Validation checks complete; now check to see if already being
1968	 * aborted, if not set the flag.
1969	 */
1970	if (cmpxchg(&io_to_abort->abort_in_progress, false, true)) {
1971		/* efct_ref_get(): same function */
1972		kref_put(&io_to_abort->ref, io_to_abort->release);
1973		efc_log_debug(hw->os,
1974			      "io already being aborted xri=0x%x tag=0x%x\n",
1975			      io_to_abort->indicator, io_to_abort->reqtag);
1976		return -EINPROGRESS;
1977	}
1978
1979	/*
1980	 * If we got here, the possibilities are:
1981	 * - host owned xri
1982	 *	- io_to_abort->wq_index != U32_MAX
1983	 *		- submit ABORT_WQE to same WQ
1984	 * - port owned xri:
1985	 *	- rxri: io_to_abort->wq_index == U32_MAX
1986	 *		- submit ABORT_WQE to any WQ
1987	 *	- non-rxri
1988	 *		- io_to_abort->index != U32_MAX
1989	 *			- submit ABORT_WQE to same WQ
1990	 *		- io_to_abort->index == U32_MAX
1991	 *			- submit ABORT_WQE to any WQ
1992	 */
1993	io_to_abort->abort_done = cb;
1994	io_to_abort->abort_arg  = arg;
1995
1996	/* Allocate a request tag for the abort portion of this IO */
1997	wqcb = efct_hw_reqtag_alloc(hw, efct_hw_wq_process_abort, io_to_abort);
1998	if (!wqcb) {
1999		efc_log_err(hw->os, "can't allocate request tag\n");
2000		return -ENOSPC;
2001	}
2002
2003	io_to_abort->abort_reqtag = wqcb->instance_index;
2004	io_to_abort->wqe.send_abts = send_abts;
2005	io_to_abort->wqe.id = io_to_abort->indicator;
2006	io_to_abort->wqe.abort_reqtag = io_to_abort->abort_reqtag;
2007
2008	/*
2009	 * If the wqe is on the pending list, then set this wqe to be
2010	 * aborted when the IO's wqe is removed from the list.
2011	 */
2012	if (io_to_abort->wq) {
2013		spin_lock_irqsave(&io_to_abort->wq->queue->lock, flags);
2014		if (io_to_abort->wqe.list_entry.next) {
2015			io_to_abort->wqe.abort_wqe_submit_needed = true;
2016			spin_unlock_irqrestore(&io_to_abort->wq->queue->lock,
2017					       flags);
2018			return 0;
2019		}
2020		spin_unlock_irqrestore(&io_to_abort->wq->queue->lock, flags);
2021	}
2022
2023	efct_hw_fill_abort_wqe(hw, &io_to_abort->wqe);
2024
2025	/* ABORT_WQE does not actually utilize an XRI on the Port,
2026	 * therefore, keep xbusy as-is to track the exchange's state,
2027	 * not the ABORT_WQE's state
2028	 */
2029	if (efct_hw_wq_write(io_to_abort->wq, &io_to_abort->wqe)) {
2030		io_to_abort->abort_in_progress = false;
2031		/* efct_ref_get(): same function */
2032		kref_put(&io_to_abort->ref, io_to_abort->release);
2033		return -EIO;
2034	}
2035
2036	return 0;
2037}
2038
2039void
2040efct_hw_reqtag_pool_free(struct efct_hw *hw)
2041{
2042	u32 i;
2043	struct reqtag_pool *reqtag_pool = hw->wq_reqtag_pool;
2044	struct hw_wq_callback *wqcb = NULL;
2045
2046	if (reqtag_pool) {
2047		for (i = 0; i < U16_MAX; i++) {
2048			wqcb = reqtag_pool->tags[i];
2049			if (!wqcb)
2050				continue;
2051
2052			kfree(wqcb);
2053		}
2054		kfree(reqtag_pool);
2055		hw->wq_reqtag_pool = NULL;
2056	}
2057}
2058
2059struct reqtag_pool *
2060efct_hw_reqtag_pool_alloc(struct efct_hw *hw)
2061{
2062	u32 i = 0;
2063	struct reqtag_pool *reqtag_pool;
2064	struct hw_wq_callback *wqcb;
2065
2066	reqtag_pool = kzalloc(sizeof(*reqtag_pool), GFP_KERNEL);
2067	if (!reqtag_pool)
2068		return NULL;
2069
2070	INIT_LIST_HEAD(&reqtag_pool->freelist);
2071	/* initialize reqtag pool lock */
2072	spin_lock_init(&reqtag_pool->lock);
2073	for (i = 0; i < U16_MAX; i++) {
2074		wqcb = kmalloc(sizeof(*wqcb), GFP_KERNEL);
2075		if (!wqcb)
2076			break;
2077
2078		reqtag_pool->tags[i] = wqcb;
2079		wqcb->instance_index = i;
2080		wqcb->callback = NULL;
2081		wqcb->arg = NULL;
2082		INIT_LIST_HEAD(&wqcb->list_entry);
2083		list_add_tail(&wqcb->list_entry, &reqtag_pool->freelist);
2084	}
2085
2086	return reqtag_pool;
2087}
2088
2089struct hw_wq_callback *
2090efct_hw_reqtag_alloc(struct efct_hw *hw,
2091		     void (*callback)(void *arg, u8 *cqe, int status),
2092		     void *arg)
2093{
2094	struct hw_wq_callback *wqcb = NULL;
2095	struct reqtag_pool *reqtag_pool = hw->wq_reqtag_pool;
2096	unsigned long flags = 0;
2097
2098	if (!callback)
2099		return wqcb;
2100
2101	spin_lock_irqsave(&reqtag_pool->lock, flags);
2102
2103	if (!list_empty(&reqtag_pool->freelist)) {
2104		wqcb = list_first_entry(&reqtag_pool->freelist,
2105					struct hw_wq_callback, list_entry);
2106	}
2107
2108	if (wqcb) {
2109		list_del_init(&wqcb->list_entry);
2110		spin_unlock_irqrestore(&reqtag_pool->lock, flags);
2111		wqcb->callback = callback;
2112		wqcb->arg = arg;
2113	} else {
2114		spin_unlock_irqrestore(&reqtag_pool->lock, flags);
2115	}
2116
2117	return wqcb;
2118}
2119
2120void
2121efct_hw_reqtag_free(struct efct_hw *hw, struct hw_wq_callback *wqcb)
2122{
2123	unsigned long flags = 0;
2124	struct reqtag_pool *reqtag_pool = hw->wq_reqtag_pool;
2125
2126	if (!wqcb->callback)
2127		efc_log_err(hw->os, "WQCB is already freed\n");
2128
2129	spin_lock_irqsave(&reqtag_pool->lock, flags);
2130	wqcb->callback = NULL;
2131	wqcb->arg = NULL;
2132	INIT_LIST_HEAD(&wqcb->list_entry);
2133	list_add(&wqcb->list_entry, &hw->wq_reqtag_pool->freelist);
2134	spin_unlock_irqrestore(&reqtag_pool->lock, flags);
2135}
2136
2137struct hw_wq_callback *
2138efct_hw_reqtag_get_instance(struct efct_hw *hw, u32 instance_index)
2139{
2140	struct hw_wq_callback *wqcb;
2141
2142	wqcb = hw->wq_reqtag_pool->tags[instance_index];
2143	if (!wqcb)
2144		efc_log_err(hw->os, "wqcb for instance %d is null\n",
2145			    instance_index);
2146
2147	return wqcb;
2148}
2149
2150int
2151efct_hw_queue_hash_find(struct efct_queue_hash *hash, u16 id)
2152{
2153	int index = -1;
2154	int i = id & (EFCT_HW_Q_HASH_SIZE - 1);
2155
2156	/*
2157	 * Since the hash is always bigger than the maximum number of Qs, then
2158	 * we never have to worry about an infinite loop. We will always find
2159	 * an unused entry.
2160	 */
2161	do {
2162		if (hash[i].in_use && hash[i].id == id)
2163			index = hash[i].index;
2164		else
2165			i = (i + 1) & (EFCT_HW_Q_HASH_SIZE - 1);
2166	} while (index == -1 && hash[i].in_use);
2167
2168	return index;
2169}
2170
2171int
2172efct_hw_process(struct efct_hw *hw, u32 vector,
2173		u32 max_isr_time_msec)
2174{
2175	struct hw_eq *eq;
2176
2177	/*
2178	 * The caller should disable interrupts if they wish to prevent us
2179	 * from processing during a shutdown. The following states are defined:
2180	 *   EFCT_HW_STATE_UNINITIALIZED - No queues allocated
2181	 *   EFCT_HW_STATE_QUEUES_ALLOCATED - The state after a chip reset,
2182	 *                                    queues are cleared.
2183	 *   EFCT_HW_STATE_ACTIVE - Chip and queues are operational
2184	 *   EFCT_HW_STATE_RESET_IN_PROGRESS - reset, we still want completions
2185	 *   EFCT_HW_STATE_TEARDOWN_IN_PROGRESS - We still want mailbox
2186	 *                                        completions.
2187	 */
2188	if (hw->state == EFCT_HW_STATE_UNINITIALIZED)
2189		return 0;
2190
2191	/* Get pointer to struct hw_eq */
2192	eq = hw->hw_eq[vector];
2193	if (!eq)
2194		return 0;
2195
2196	eq->use_count++;
2197
2198	return efct_hw_eq_process(hw, eq, max_isr_time_msec);
2199}
2200
2201int
2202efct_hw_eq_process(struct efct_hw *hw, struct hw_eq *eq,
2203		   u32 max_isr_time_msec)
2204{
2205	u8 eqe[sizeof(struct sli4_eqe)] = { 0 };
2206	u32 tcheck_count;
2207	u64 tstart;
2208	u64 telapsed;
2209	bool done = false;
2210
2211	tcheck_count = EFCT_HW_TIMECHECK_ITERATIONS;
2212	tstart = jiffies_to_msecs(jiffies);
2213
2214	while (!done && !sli_eq_read(&hw->sli, eq->queue, eqe)) {
2215		u16 cq_id = 0;
2216		int rc;
2217
2218		rc = sli_eq_parse(&hw->sli, eqe, &cq_id);
2219		if (unlikely(rc)) {
2220			if (rc == SLI4_EQE_STATUS_EQ_FULL) {
2221				u32 i;
2222
2223				/*
2224				 * Received a sentinel EQE indicating the
2225				 * EQ is full. Process all CQs
2226				 */
2227				for (i = 0; i < hw->cq_count; i++)
2228					efct_hw_cq_process(hw, hw->hw_cq[i]);
2229				continue;
2230			} else {
2231				return rc;
2232			}
2233		} else {
2234			int index;
2235
2236			index  = efct_hw_queue_hash_find(hw->cq_hash, cq_id);
2237
2238			if (likely(index >= 0))
2239				efct_hw_cq_process(hw, hw->hw_cq[index]);
2240			else
2241				efc_log_err(hw->os, "bad CQ_ID %#06x\n", cq_id);
2242		}
2243
2244		if (eq->queue->n_posted > eq->queue->posted_limit)
2245			sli_queue_arm(&hw->sli, eq->queue, false);
2246
2247		if (tcheck_count && (--tcheck_count == 0)) {
2248			tcheck_count = EFCT_HW_TIMECHECK_ITERATIONS;
2249			telapsed = jiffies_to_msecs(jiffies) - tstart;
2250			if (telapsed >= max_isr_time_msec)
2251				done = true;
2252		}
2253	}
2254	sli_queue_eq_arm(&hw->sli, eq->queue, true);
2255
2256	return 0;
2257}
2258
2259static int
2260_efct_hw_wq_write(struct hw_wq *wq, struct efct_hw_wqe *wqe)
2261{
2262	int queue_rc;
2263
2264	/* Every so often, set the wqec bit to generate comsummed completions */
2265	if (wq->wqec_count)
2266		wq->wqec_count--;
2267
2268	if (wq->wqec_count == 0) {
2269		struct sli4_generic_wqe *genwqe = (void *)wqe->wqebuf;
2270
2271		genwqe->cmdtype_wqec_byte |= SLI4_GEN_WQE_WQEC;
2272		wq->wqec_count = wq->wqec_set_count;
2273	}
2274
2275	/* Decrement WQ free count */
2276	wq->free_count--;
2277
2278	queue_rc = sli_wq_write(&wq->hw->sli, wq->queue, wqe->wqebuf);
2279
2280	return (queue_rc < 0) ? -EIO : 0;
2281}
2282
2283static void
2284hw_wq_submit_pending(struct hw_wq *wq, u32 update_free_count)
2285{
2286	struct efct_hw_wqe *wqe;
2287	unsigned long flags = 0;
2288
2289	spin_lock_irqsave(&wq->queue->lock, flags);
2290
2291	/* Update free count with value passed in */
2292	wq->free_count += update_free_count;
2293
2294	while ((wq->free_count > 0) && (!list_empty(&wq->pending_list))) {
2295		wqe = list_first_entry(&wq->pending_list,
2296				       struct efct_hw_wqe, list_entry);
2297		list_del_init(&wqe->list_entry);
2298		_efct_hw_wq_write(wq, wqe);
2299
2300		if (wqe->abort_wqe_submit_needed) {
2301			wqe->abort_wqe_submit_needed = false;
2302			efct_hw_fill_abort_wqe(wq->hw, wqe);
2303			INIT_LIST_HEAD(&wqe->list_entry);
2304			list_add_tail(&wqe->list_entry, &wq->pending_list);
2305			wq->wq_pending_count++;
2306		}
2307	}
2308
2309	spin_unlock_irqrestore(&wq->queue->lock, flags);
2310}
2311
2312void
2313efct_hw_cq_process(struct efct_hw *hw, struct hw_cq *cq)
2314{
2315	u8 cqe[sizeof(struct sli4_mcqe)];
2316	u16 rid = U16_MAX;
2317	/* completion type */
2318	enum sli4_qentry ctype;
2319	u32 n_processed = 0;
2320	u32 tstart, telapsed;
2321
2322	tstart = jiffies_to_msecs(jiffies);
2323
2324	while (!sli_cq_read(&hw->sli, cq->queue, cqe)) {
2325		int status;
2326
2327		status = sli_cq_parse(&hw->sli, cq->queue, cqe, &ctype, &rid);
2328		/*
2329		 * The sign of status is significant. If status is:
2330		 * == 0 : call completed correctly and
2331		 * the CQE indicated success
2332		 * > 0 : call completed correctly and
2333		 * the CQE indicated an error
2334		 * < 0 : call failed and no information is available about the
2335		 * CQE
2336		 */
2337		if (status < 0) {
2338			if (status == SLI4_MCQE_STATUS_NOT_COMPLETED)
2339				/*
2340				 * Notification that an entry was consumed,
2341				 * but not completed
2342				 */
2343				continue;
2344
2345			break;
2346		}
2347
2348		switch (ctype) {
2349		case SLI4_QENTRY_ASYNC:
2350			sli_cqe_async(&hw->sli, cqe);
2351			break;
2352		case SLI4_QENTRY_MQ:
2353			/*
2354			 * Process MQ entry. Note there is no way to determine
2355			 * the MQ_ID from the completion entry.
2356			 */
2357			efct_hw_mq_process(hw, status, hw->mq);
2358			break;
2359		case SLI4_QENTRY_WQ:
2360			efct_hw_wq_process(hw, cq, cqe, status, rid);
2361			break;
2362		case SLI4_QENTRY_WQ_RELEASE: {
2363			u32 wq_id = rid;
2364			int index;
2365			struct hw_wq *wq = NULL;
2366
2367			index = efct_hw_queue_hash_find(hw->wq_hash, wq_id);
2368
2369			if (likely(index >= 0)) {
2370				wq = hw->hw_wq[index];
2371			} else {
2372				efc_log_err(hw->os, "bad WQ_ID %#06x\n", wq_id);
2373				break;
2374			}
2375			/* Submit any HW IOs that are on the WQ pending list */
2376			hw_wq_submit_pending(wq, wq->wqec_set_count);
2377
2378			break;
2379		}
2380
2381		case SLI4_QENTRY_RQ:
2382			efct_hw_rqpair_process_rq(hw, cq, cqe);
2383			break;
2384		case SLI4_QENTRY_XABT: {
2385			efct_hw_xabt_process(hw, cq, cqe, rid);
2386			break;
2387		}
2388		default:
2389			efc_log_debug(hw->os, "unhandled ctype=%#x rid=%#x\n",
2390				      ctype, rid);
2391			break;
2392		}
2393
2394		n_processed++;
2395		if (n_processed == cq->queue->proc_limit)
2396			break;
2397
2398		if (cq->queue->n_posted >= cq->queue->posted_limit)
2399			sli_queue_arm(&hw->sli, cq->queue, false);
2400	}
2401
2402	sli_queue_arm(&hw->sli, cq->queue, true);
2403
2404	if (n_processed > cq->queue->max_num_processed)
2405		cq->queue->max_num_processed = n_processed;
2406	telapsed = jiffies_to_msecs(jiffies) - tstart;
2407	if (telapsed > cq->queue->max_process_time)
2408		cq->queue->max_process_time = telapsed;
2409}
2410
2411void
2412efct_hw_wq_process(struct efct_hw *hw, struct hw_cq *cq,
2413		   u8 *cqe, int status, u16 rid)
2414{
2415	struct hw_wq_callback *wqcb;
2416
2417	if (rid == EFCT_HW_REQUE_XRI_REGTAG) {
2418		if (status)
2419			efc_log_err(hw->os, "reque xri failed, status = %d\n",
2420				    status);
2421		return;
2422	}
2423
2424	wqcb = efct_hw_reqtag_get_instance(hw, rid);
2425	if (!wqcb) {
2426		efc_log_err(hw->os, "invalid request tag: x%x\n", rid);
2427		return;
2428	}
2429
2430	if (!wqcb->callback) {
2431		efc_log_err(hw->os, "wqcb callback is NULL\n");
2432		return;
2433	}
2434
2435	(*wqcb->callback)(wqcb->arg, cqe, status);
2436}
2437
2438void
2439efct_hw_xabt_process(struct efct_hw *hw, struct hw_cq *cq,
2440		     u8 *cqe, u16 rid)
2441{
2442	/* search IOs wait free list */
2443	struct efct_hw_io *io = NULL;
2444	unsigned long flags = 0;
2445
2446	io = efct_hw_io_lookup(hw, rid);
2447	if (!io) {
2448		/* IO lookup failure should never happen */
2449		efc_log_err(hw->os, "xabt io lookup failed rid=%#x\n", rid);
2450		return;
2451	}
2452
2453	if (!io->xbusy)
2454		efc_log_debug(hw->os, "xabt io not busy rid=%#x\n", rid);
2455	else
2456		/* mark IO as no longer busy */
2457		io->xbusy = false;
2458
2459	/*
2460	 * For IOs that were aborted internally, we need to issue any pending
2461	 * callback here.
2462	 */
2463	if (io->done) {
2464		efct_hw_done_t done = io->done;
2465		void		*arg = io->arg;
2466
2467		/*
2468		 * Use latched status as this is always saved for an internal
2469		 * abort
2470		 */
2471		int status = io->saved_status;
2472		u32 len = io->saved_len;
2473		u32 ext = io->saved_ext;
2474
2475		io->done = NULL;
2476		io->status_saved = false;
2477
2478		done(io, len, status, ext, arg);
2479	}
2480
2481	spin_lock_irqsave(&hw->io_lock, flags);
2482	if (io->state == EFCT_HW_IO_STATE_INUSE ||
2483	    io->state == EFCT_HW_IO_STATE_WAIT_FREE) {
2484		/* if on wait_free list, caller has already freed IO;
2485		 * remove from wait_free list and add to free list.
2486		 * if on in-use list, already marked as no longer busy;
2487		 * just leave there and wait for caller to free.
2488		 */
2489		if (io->state == EFCT_HW_IO_STATE_WAIT_FREE) {
2490			io->state = EFCT_HW_IO_STATE_FREE;
2491			list_del_init(&io->list_entry);
2492			efct_hw_io_free_move_correct_list(hw, io);
2493		}
2494	}
2495	spin_unlock_irqrestore(&hw->io_lock, flags);
2496}
2497
2498static int
2499efct_hw_flush(struct efct_hw *hw)
2500{
2501	u32 i = 0;
2502
2503	/* Process any remaining completions */
2504	for (i = 0; i < hw->eq_count; i++)
2505		efct_hw_process(hw, i, ~0);
2506
2507	return 0;
2508}
2509
2510int
2511efct_hw_wq_write(struct hw_wq *wq, struct efct_hw_wqe *wqe)
2512{
2513	int rc = 0;
2514	unsigned long flags = 0;
2515
2516	spin_lock_irqsave(&wq->queue->lock, flags);
2517	if (list_empty(&wq->pending_list)) {
2518		if (wq->free_count > 0) {
2519			rc = _efct_hw_wq_write(wq, wqe);
2520		} else {
2521			INIT_LIST_HEAD(&wqe->list_entry);
2522			list_add_tail(&wqe->list_entry, &wq->pending_list);
2523			wq->wq_pending_count++;
2524		}
2525
2526		spin_unlock_irqrestore(&wq->queue->lock, flags);
2527		return rc;
2528	}
2529
2530	INIT_LIST_HEAD(&wqe->list_entry);
2531	list_add_tail(&wqe->list_entry, &wq->pending_list);
2532	wq->wq_pending_count++;
2533	while (wq->free_count > 0) {
2534		wqe = list_first_entry(&wq->pending_list, struct efct_hw_wqe,
2535				       list_entry);
2536		if (!wqe)
2537			break;
2538
2539		list_del_init(&wqe->list_entry);
2540		rc = _efct_hw_wq_write(wq, wqe);
2541		if (rc)
2542			break;
2543
2544		if (wqe->abort_wqe_submit_needed) {
2545			wqe->abort_wqe_submit_needed = false;
2546			efct_hw_fill_abort_wqe(wq->hw, wqe);
2547
2548			INIT_LIST_HEAD(&wqe->list_entry);
2549			list_add_tail(&wqe->list_entry, &wq->pending_list);
2550			wq->wq_pending_count++;
2551		}
2552	}
2553
2554	spin_unlock_irqrestore(&wq->queue->lock, flags);
2555
2556	return rc;
2557}
2558
2559int
2560efct_efc_bls_send(struct efc *efc, u32 type, struct sli_bls_params *bls)
2561{
2562	struct efct *efct = efc->base;
2563
2564	return efct_hw_bls_send(efct, type, bls, NULL, NULL);
2565}
2566
2567int
2568efct_hw_bls_send(struct efct *efct, u32 type, struct sli_bls_params *bls_params,
2569		 void *cb, void *arg)
2570{
2571	struct efct_hw *hw = &efct->hw;
2572	struct efct_hw_io *hio;
2573	struct sli_bls_payload bls;
2574	int rc;
2575
2576	if (hw->state != EFCT_HW_STATE_ACTIVE) {
2577		efc_log_err(hw->os,
2578			    "cannot send BLS, HW state=%d\n", hw->state);
2579		return -EIO;
2580	}
2581
2582	hio = efct_hw_io_alloc(hw);
2583	if (!hio) {
2584		efc_log_err(hw->os, "HIO allocation failed\n");
2585		return -EIO;
2586	}
2587
2588	hio->done = cb;
2589	hio->arg  = arg;
2590
2591	bls_params->xri = hio->indicator;
2592	bls_params->tag = hio->reqtag;
2593
2594	if (type == FC_RCTL_BA_ACC) {
2595		hio->type = EFCT_HW_BLS_ACC;
2596		bls.type = SLI4_SLI_BLS_ACC;
2597		memcpy(&bls.u.acc, bls_params->payload, sizeof(bls.u.acc));
2598	} else {
2599		hio->type = EFCT_HW_BLS_RJT;
2600		bls.type = SLI4_SLI_BLS_RJT;
2601		memcpy(&bls.u.rjt, bls_params->payload, sizeof(bls.u.rjt));
2602	}
2603
2604	bls.ox_id = cpu_to_le16(bls_params->ox_id);
2605	bls.rx_id = cpu_to_le16(bls_params->rx_id);
2606
2607	if (sli_xmit_bls_rsp64_wqe(&hw->sli, hio->wqe.wqebuf,
2608				   &bls, bls_params)) {
2609		efc_log_err(hw->os, "XMIT_BLS_RSP64 WQE error\n");
2610		return -EIO;
2611	}
2612
2613	hio->xbusy = true;
2614
2615	/*
2616	 * Add IO to active io wqe list before submitting, in case the
2617	 * wcqe processing preempts this thread.
2618	 */
2619	hio->wq->use_count++;
2620	rc = efct_hw_wq_write(hio->wq, &hio->wqe);
2621	if (rc >= 0) {
2622		/* non-negative return is success */
2623		rc = 0;
2624	} else {
2625		/* failed to write wqe, remove from active wqe list */
2626		efc_log_err(hw->os,
2627			    "sli_queue_write failed: %d\n", rc);
2628		hio->xbusy = false;
2629	}
2630
2631	return rc;
2632}
2633
2634static int
2635efct_els_ssrs_send_cb(struct efct_hw_io *hio, u32 length, int status,
2636		      u32 ext_status, void *arg)
2637{
2638	struct efc_disc_io *io = arg;
2639
2640	efc_disc_io_complete(io, length, status, ext_status);
2641	return 0;
2642}
2643
2644static inline void
2645efct_fill_els_params(struct efc_disc_io *io, struct sli_els_params *params)
2646{
2647	u8 *cmd = io->req.virt;
2648
2649	params->cmd = *cmd;
2650	params->s_id = io->s_id;
2651	params->d_id = io->d_id;
2652	params->ox_id = io->iparam.els.ox_id;
2653	params->rpi = io->rpi;
2654	params->vpi = io->vpi;
2655	params->rpi_registered = io->rpi_registered;
2656	params->xmit_len = io->xmit_len;
2657	params->rsp_len = io->rsp_len;
2658	params->timeout = io->iparam.els.timeout;
2659}
2660
2661static inline void
2662efct_fill_ct_params(struct efc_disc_io *io, struct sli_ct_params *params)
2663{
2664	params->r_ctl = io->iparam.ct.r_ctl;
2665	params->type = io->iparam.ct.type;
2666	params->df_ctl =  io->iparam.ct.df_ctl;
2667	params->d_id = io->d_id;
2668	params->ox_id = io->iparam.ct.ox_id;
2669	params->rpi = io->rpi;
2670	params->vpi = io->vpi;
2671	params->rpi_registered = io->rpi_registered;
2672	params->xmit_len = io->xmit_len;
2673	params->rsp_len = io->rsp_len;
2674	params->timeout = io->iparam.ct.timeout;
2675}
2676
2677/**
2678 * efct_els_hw_srrs_send() - Send a single request and response cmd.
2679 * @efc: efc library structure
2680 * @io: Discovery IO used to hold els and ct cmd context.
2681 *
2682 * This routine supports communication sequences consisting of a single
2683 * request and single response between two endpoints. Examples include:
2684 *  - Sending an ELS request.
2685 *  - Sending an ELS response - To send an ELS response, the caller must provide
2686 * the OX_ID from the received request.
2687 *  - Sending a FC Common Transport (FC-CT) request - To send a FC-CT request,
2688 * the caller must provide the R_CTL, TYPE, and DF_CTL
2689 * values to place in the FC frame header.
2690 *
2691 * Return: Status of the request.
2692 */
2693int
2694efct_els_hw_srrs_send(struct efc *efc, struct efc_disc_io *io)
2695{
2696	struct efct *efct = efc->base;
2697	struct efct_hw_io *hio;
2698	struct efct_hw *hw = &efct->hw;
2699	struct efc_dma *send = &io->req;
2700	struct efc_dma *receive = &io->rsp;
2701	struct sli4_sge	*sge = NULL;
2702	int rc = 0;
2703	u32 len = io->xmit_len;
2704	u32 sge0_flags;
2705	u32 sge1_flags;
2706
2707	hio = efct_hw_io_alloc(hw);
2708	if (!hio) {
2709		pr_err("HIO alloc failed\n");
2710		return -EIO;
2711	}
2712
2713	if (hw->state != EFCT_HW_STATE_ACTIVE) {
2714		efc_log_debug(hw->os,
2715			      "cannot send SRRS, HW state=%d\n", hw->state);
2716		return -EIO;
2717	}
2718
2719	hio->done = efct_els_ssrs_send_cb;
2720	hio->arg  = io;
2721
2722	sge = hio->sgl->virt;
2723
2724	/* clear both SGE */
2725	memset(hio->sgl->virt, 0, 2 * sizeof(struct sli4_sge));
2726
2727	sge0_flags = le32_to_cpu(sge[0].dw2_flags);
2728	sge1_flags = le32_to_cpu(sge[1].dw2_flags);
2729	if (send->size) {
2730		sge[0].buffer_address_high =
2731			cpu_to_le32(upper_32_bits(send->phys));
2732		sge[0].buffer_address_low  =
2733			cpu_to_le32(lower_32_bits(send->phys));
2734
2735		sge0_flags |= (SLI4_SGE_TYPE_DATA << SLI4_SGE_TYPE_SHIFT);
2736
2737		sge[0].buffer_length = cpu_to_le32(len);
2738	}
2739
2740	if (io->io_type == EFC_DISC_IO_ELS_REQ ||
2741	    io->io_type == EFC_DISC_IO_CT_REQ) {
2742		sge[1].buffer_address_high =
2743			cpu_to_le32(upper_32_bits(receive->phys));
2744		sge[1].buffer_address_low  =
2745			cpu_to_le32(lower_32_bits(receive->phys));
2746
2747		sge1_flags |= (SLI4_SGE_TYPE_DATA << SLI4_SGE_TYPE_SHIFT);
2748		sge1_flags |= SLI4_SGE_LAST;
2749
2750		sge[1].buffer_length = cpu_to_le32(receive->size);
2751	} else {
2752		sge0_flags |= SLI4_SGE_LAST;
2753	}
2754
2755	sge[0].dw2_flags = cpu_to_le32(sge0_flags);
2756	sge[1].dw2_flags = cpu_to_le32(sge1_flags);
2757
2758	switch (io->io_type) {
2759	case EFC_DISC_IO_ELS_REQ: {
2760		struct sli_els_params els_params;
2761
2762		hio->type = EFCT_HW_ELS_REQ;
2763		efct_fill_els_params(io, &els_params);
2764		els_params.xri = hio->indicator;
2765		els_params.tag = hio->reqtag;
2766
2767		if (sli_els_request64_wqe(&hw->sli, hio->wqe.wqebuf, hio->sgl,
2768					  &els_params)) {
2769			efc_log_err(hw->os, "REQ WQE error\n");
2770			rc = -EIO;
2771		}
2772		break;
2773	}
2774	case EFC_DISC_IO_ELS_RESP: {
2775		struct sli_els_params els_params;
2776
2777		hio->type = EFCT_HW_ELS_RSP;
2778		efct_fill_els_params(io, &els_params);
2779		els_params.xri = hio->indicator;
2780		els_params.tag = hio->reqtag;
2781		if (sli_xmit_els_rsp64_wqe(&hw->sli, hio->wqe.wqebuf, send,
2782					   &els_params)){
2783			efc_log_err(hw->os, "RSP WQE error\n");
2784			rc = -EIO;
2785		}
2786		break;
2787	}
2788	case EFC_DISC_IO_CT_REQ: {
2789		struct sli_ct_params ct_params;
2790
2791		hio->type = EFCT_HW_FC_CT;
2792		efct_fill_ct_params(io, &ct_params);
2793		ct_params.xri = hio->indicator;
2794		ct_params.tag = hio->reqtag;
2795		if (sli_gen_request64_wqe(&hw->sli, hio->wqe.wqebuf, hio->sgl,
2796					  &ct_params)){
2797			efc_log_err(hw->os, "GEN WQE error\n");
2798			rc = -EIO;
2799		}
2800		break;
2801	}
2802	case EFC_DISC_IO_CT_RESP: {
2803		struct sli_ct_params ct_params;
2804
2805		hio->type = EFCT_HW_FC_CT_RSP;
2806		efct_fill_ct_params(io, &ct_params);
2807		ct_params.xri = hio->indicator;
2808		ct_params.tag = hio->reqtag;
2809		if (sli_xmit_sequence64_wqe(&hw->sli, hio->wqe.wqebuf, hio->sgl,
2810					    &ct_params)){
2811			efc_log_err(hw->os, "XMIT SEQ WQE error\n");
2812			rc = -EIO;
2813		}
2814		break;
2815	}
2816	default:
2817		efc_log_err(hw->os, "bad SRRS type %#x\n", io->io_type);
2818		rc = -EIO;
2819	}
2820
2821	if (rc == 0) {
2822		hio->xbusy = true;
2823
2824		/*
2825		 * Add IO to active io wqe list before submitting, in case the
2826		 * wcqe processing preempts this thread.
2827		 */
2828		hio->wq->use_count++;
2829		rc = efct_hw_wq_write(hio->wq, &hio->wqe);
2830		if (rc >= 0) {
2831			/* non-negative return is success */
2832			rc = 0;
2833		} else {
2834			/* failed to write wqe, remove from active wqe list */
2835			efc_log_err(hw->os,
2836				    "sli_queue_write failed: %d\n", rc);
2837			hio->xbusy = false;
2838		}
2839	}
2840
2841	return rc;
2842}
2843
2844int
2845efct_hw_io_send(struct efct_hw *hw, enum efct_hw_io_type type,
2846		struct efct_hw_io *io, union efct_hw_io_param_u *iparam,
2847		void *cb, void *arg)
2848{
2849	int rc = 0;
2850	bool send_wqe = true;
2851
2852	if (!io) {
2853		pr_err("bad parm hw=%p io=%p\n", hw, io);
2854		return -EIO;
2855	}
2856
2857	if (hw->state != EFCT_HW_STATE_ACTIVE) {
2858		efc_log_err(hw->os, "cannot send IO, HW state=%d\n", hw->state);
2859		return -EIO;
2860	}
2861
2862	/*
2863	 * Save state needed during later stages
2864	 */
2865	io->type  = type;
2866	io->done  = cb;
2867	io->arg   = arg;
2868
2869	/*
2870	 * Format the work queue entry used to send the IO
2871	 */
2872	switch (type) {
2873	case EFCT_HW_IO_TARGET_WRITE: {
2874		u16 *flags = &iparam->fcp_tgt.flags;
2875		struct fcp_txrdy *xfer = io->xfer_rdy.virt;
2876
2877		/*
2878		 * Fill in the XFER_RDY for IF_TYPE 0 devices
2879		 */
2880		xfer->ft_data_ro = cpu_to_be32(iparam->fcp_tgt.offset);
2881		xfer->ft_burst_len = cpu_to_be32(iparam->fcp_tgt.xmit_len);
2882
2883		if (io->xbusy)
2884			*flags |= SLI4_IO_CONTINUATION;
2885		else
2886			*flags &= ~SLI4_IO_CONTINUATION;
2887		iparam->fcp_tgt.xri = io->indicator;
2888		iparam->fcp_tgt.tag = io->reqtag;
2889
2890		if (sli_fcp_treceive64_wqe(&hw->sli, io->wqe.wqebuf,
2891					   &io->def_sgl, io->first_data_sge,
2892					   SLI4_CQ_DEFAULT,
2893					   0, 0, &iparam->fcp_tgt)) {
2894			efc_log_err(hw->os, "TRECEIVE WQE error\n");
2895			rc = -EIO;
2896		}
2897		break;
2898	}
2899	case EFCT_HW_IO_TARGET_READ: {
2900		u16 *flags = &iparam->fcp_tgt.flags;
2901
2902		if (io->xbusy)
2903			*flags |= SLI4_IO_CONTINUATION;
2904		else
2905			*flags &= ~SLI4_IO_CONTINUATION;
2906
2907		iparam->fcp_tgt.xri = io->indicator;
2908		iparam->fcp_tgt.tag = io->reqtag;
2909
2910		if (sli_fcp_tsend64_wqe(&hw->sli, io->wqe.wqebuf,
2911					&io->def_sgl, io->first_data_sge,
2912					SLI4_CQ_DEFAULT,
2913					0, 0, &iparam->fcp_tgt)) {
2914			efc_log_err(hw->os, "TSEND WQE error\n");
2915			rc = -EIO;
2916		}
2917		break;
2918	}
2919	case EFCT_HW_IO_TARGET_RSP: {
2920		u16 *flags = &iparam->fcp_tgt.flags;
2921
2922		if (io->xbusy)
2923			*flags |= SLI4_IO_CONTINUATION;
2924		else
2925			*flags &= ~SLI4_IO_CONTINUATION;
2926
2927		iparam->fcp_tgt.xri = io->indicator;
2928		iparam->fcp_tgt.tag = io->reqtag;
2929
2930		if (sli_fcp_trsp64_wqe(&hw->sli, io->wqe.wqebuf,
2931				       &io->def_sgl, SLI4_CQ_DEFAULT,
2932				       0, &iparam->fcp_tgt)) {
2933			efc_log_err(hw->os, "TRSP WQE error\n");
2934			rc = -EIO;
2935		}
2936
2937		break;
2938	}
2939	default:
2940		efc_log_err(hw->os, "unsupported IO type %#x\n", type);
2941		rc = -EIO;
2942	}
2943
2944	if (send_wqe && rc == 0) {
2945		io->xbusy = true;
2946
2947		/*
2948		 * Add IO to active io wqe list before submitting, in case the
2949		 * wcqe processing preempts this thread.
2950		 */
2951		hw->tcmd_wq_submit[io->wq->instance]++;
2952		io->wq->use_count++;
2953		rc = efct_hw_wq_write(io->wq, &io->wqe);
2954		if (rc >= 0) {
2955			/* non-negative return is success */
2956			rc = 0;
2957		} else {
2958			/* failed to write wqe, remove from active wqe list */
2959			efc_log_err(hw->os,
2960				    "sli_queue_write failed: %d\n", rc);
2961			io->xbusy = false;
2962		}
2963	}
2964
2965	return rc;
2966}
2967
2968int
2969efct_hw_send_frame(struct efct_hw *hw, struct fc_frame_header *hdr,
2970		   u8 sof, u8 eof, struct efc_dma *payload,
2971		   struct efct_hw_send_frame_context *ctx,
2972		   void (*callback)(void *arg, u8 *cqe, int status),
2973		   void *arg)
2974{
2975	int rc;
2976	struct efct_hw_wqe *wqe;
2977	u32 xri;
2978	struct hw_wq *wq;
2979
2980	wqe = &ctx->wqe;
2981
2982	/* populate the callback object */
2983	ctx->hw = hw;
2984
2985	/* Fetch and populate request tag */
2986	ctx->wqcb = efct_hw_reqtag_alloc(hw, callback, arg);
2987	if (!ctx->wqcb) {
2988		efc_log_err(hw->os, "can't allocate request tag\n");
2989		return -ENOSPC;
2990	}
2991
2992	wq = hw->hw_wq[0];
2993
2994	/* Set XRI and RX_ID in the header based on which WQ, and which
2995	 * send_frame_io we are using
2996	 */
2997	xri = wq->send_frame_io->indicator;
2998
2999	/* Build the send frame WQE */
3000	rc = sli_send_frame_wqe(&hw->sli, wqe->wqebuf,
3001				sof, eof, (u32 *)hdr, payload, payload->len,
3002				EFCT_HW_SEND_FRAME_TIMEOUT, xri,
3003				ctx->wqcb->instance_index);
3004	if (rc) {
3005		efc_log_err(hw->os, "sli_send_frame_wqe failed: %d\n", rc);
3006		return -EIO;
3007	}
3008
3009	/* Write to WQ */
3010	rc = efct_hw_wq_write(wq, wqe);
3011	if (rc) {
3012		efc_log_err(hw->os, "efct_hw_wq_write failed: %d\n", rc);
3013		return -EIO;
3014	}
3015
3016	wq->use_count++;
3017
3018	return 0;
3019}
3020
3021static int
3022efct_hw_cb_link_stat(struct efct_hw *hw, int status,
3023		     u8 *mqe, void  *arg)
3024{
3025	struct sli4_cmd_read_link_stats *mbox_rsp;
3026	struct efct_hw_link_stat_cb_arg *cb_arg = arg;
3027	struct efct_hw_link_stat_counts counts[EFCT_HW_LINK_STAT_MAX];
3028	u32 num_counters, i;
3029	u32 mbox_rsp_flags = 0;
3030
3031	mbox_rsp = (struct sli4_cmd_read_link_stats *)mqe;
3032	mbox_rsp_flags = le32_to_cpu(mbox_rsp->dw1_flags);
3033	num_counters = (mbox_rsp_flags & SLI4_READ_LNKSTAT_GEC) ? 20 : 13;
3034	memset(counts, 0, sizeof(struct efct_hw_link_stat_counts) *
3035				 EFCT_HW_LINK_STAT_MAX);
3036
3037	/* Fill overflow counts, mask starts from SLI4_READ_LNKSTAT_W02OF*/
3038	for (i = 0; i < EFCT_HW_LINK_STAT_MAX; i++)
3039		counts[i].overflow = (mbox_rsp_flags & (1 << (i + 2)));
3040
3041	counts[EFCT_HW_LINK_STAT_LINK_FAILURE_COUNT].counter =
3042		 le32_to_cpu(mbox_rsp->linkfail_errcnt);
3043	counts[EFCT_HW_LINK_STAT_LOSS_OF_SYNC_COUNT].counter =
3044		 le32_to_cpu(mbox_rsp->losssync_errcnt);
3045	counts[EFCT_HW_LINK_STAT_LOSS_OF_SIGNAL_COUNT].counter =
3046		 le32_to_cpu(mbox_rsp->losssignal_errcnt);
3047	counts[EFCT_HW_LINK_STAT_PRIMITIVE_SEQ_COUNT].counter =
3048		 le32_to_cpu(mbox_rsp->primseq_errcnt);
3049	counts[EFCT_HW_LINK_STAT_INVALID_XMIT_WORD_COUNT].counter =
3050		 le32_to_cpu(mbox_rsp->inval_txword_errcnt);
3051	counts[EFCT_HW_LINK_STAT_CRC_COUNT].counter =
3052		le32_to_cpu(mbox_rsp->crc_errcnt);
3053	counts[EFCT_HW_LINK_STAT_PRIMITIVE_SEQ_TIMEOUT_COUNT].counter =
3054		le32_to_cpu(mbox_rsp->primseq_eventtimeout_cnt);
3055	counts[EFCT_HW_LINK_STAT_ELASTIC_BUFFER_OVERRUN_COUNT].counter =
3056		 le32_to_cpu(mbox_rsp->elastic_bufoverrun_errcnt);
3057	counts[EFCT_HW_LINK_STAT_ARB_TIMEOUT_COUNT].counter =
3058		 le32_to_cpu(mbox_rsp->arbit_fc_al_timeout_cnt);
3059	counts[EFCT_HW_LINK_STAT_ADVERTISED_RCV_B2B_CREDIT].counter =
3060		 le32_to_cpu(mbox_rsp->adv_rx_buftor_to_buf_credit);
3061	counts[EFCT_HW_LINK_STAT_CURR_RCV_B2B_CREDIT].counter =
3062		 le32_to_cpu(mbox_rsp->curr_rx_buf_to_buf_credit);
3063	counts[EFCT_HW_LINK_STAT_ADVERTISED_XMIT_B2B_CREDIT].counter =
3064		 le32_to_cpu(mbox_rsp->adv_tx_buf_to_buf_credit);
3065	counts[EFCT_HW_LINK_STAT_CURR_XMIT_B2B_CREDIT].counter =
3066		 le32_to_cpu(mbox_rsp->curr_tx_buf_to_buf_credit);
3067	counts[EFCT_HW_LINK_STAT_RCV_EOFA_COUNT].counter =
3068		 le32_to_cpu(mbox_rsp->rx_eofa_cnt);
3069	counts[EFCT_HW_LINK_STAT_RCV_EOFDTI_COUNT].counter =
3070		 le32_to_cpu(mbox_rsp->rx_eofdti_cnt);
3071	counts[EFCT_HW_LINK_STAT_RCV_EOFNI_COUNT].counter =
3072		 le32_to_cpu(mbox_rsp->rx_eofni_cnt);
3073	counts[EFCT_HW_LINK_STAT_RCV_SOFF_COUNT].counter =
3074		 le32_to_cpu(mbox_rsp->rx_soff_cnt);
3075	counts[EFCT_HW_LINK_STAT_RCV_DROPPED_NO_AER_COUNT].counter =
3076		 le32_to_cpu(mbox_rsp->rx_dropped_no_aer_cnt);
3077	counts[EFCT_HW_LINK_STAT_RCV_DROPPED_NO_RPI_COUNT].counter =
3078		 le32_to_cpu(mbox_rsp->rx_dropped_no_avail_rpi_rescnt);
3079	counts[EFCT_HW_LINK_STAT_RCV_DROPPED_NO_XRI_COUNT].counter =
3080		 le32_to_cpu(mbox_rsp->rx_dropped_no_avail_xri_rescnt);
3081
3082	if (cb_arg) {
3083		if (cb_arg->cb) {
3084			if (status == 0 && le16_to_cpu(mbox_rsp->hdr.status))
3085				status = le16_to_cpu(mbox_rsp->hdr.status);
3086			cb_arg->cb(status, num_counters, counts, cb_arg->arg);
3087		}
3088
3089		kfree(cb_arg);
3090	}
3091
3092	return 0;
3093}
3094
3095int
3096efct_hw_get_link_stats(struct efct_hw *hw, u8 req_ext_counters,
3097		       u8 clear_overflow_flags, u8 clear_all_counters,
3098		       void (*cb)(int status, u32 num_counters,
3099				  struct efct_hw_link_stat_counts *counters,
3100				  void *arg),
3101		       void *arg)
3102{
3103	int rc = -EIO;
3104	struct efct_hw_link_stat_cb_arg *cb_arg;
3105	u8 mbxdata[SLI4_BMBX_SIZE];
3106
3107	cb_arg = kzalloc(sizeof(*cb_arg), GFP_ATOMIC);
3108	if (!cb_arg)
3109		return -ENOMEM;
3110
3111	cb_arg->cb = cb;
3112	cb_arg->arg = arg;
3113
3114	/* Send the HW command */
3115	if (!sli_cmd_read_link_stats(&hw->sli, mbxdata, req_ext_counters,
3116				    clear_overflow_flags, clear_all_counters))
3117		rc = efct_hw_command(hw, mbxdata, EFCT_CMD_NOWAIT,
3118				     efct_hw_cb_link_stat, cb_arg);
3119
3120	if (rc)
3121		kfree(cb_arg);
3122
3123	return rc;
3124}
3125
3126static int
3127efct_hw_cb_host_stat(struct efct_hw *hw, int status, u8 *mqe, void  *arg)
3128{
3129	struct sli4_cmd_read_status *mbox_rsp =
3130					(struct sli4_cmd_read_status *)mqe;
3131	struct efct_hw_host_stat_cb_arg *cb_arg = arg;
3132	struct efct_hw_host_stat_counts counts[EFCT_HW_HOST_STAT_MAX];
3133	u32 num_counters = EFCT_HW_HOST_STAT_MAX;
3134
3135	memset(counts, 0, sizeof(struct efct_hw_host_stat_counts) *
3136	       EFCT_HW_HOST_STAT_MAX);
3137
3138	counts[EFCT_HW_HOST_STAT_TX_KBYTE_COUNT].counter =
3139		 le32_to_cpu(mbox_rsp->trans_kbyte_cnt);
3140	counts[EFCT_HW_HOST_STAT_RX_KBYTE_COUNT].counter =
3141		 le32_to_cpu(mbox_rsp->recv_kbyte_cnt);
3142	counts[EFCT_HW_HOST_STAT_TX_FRAME_COUNT].counter =
3143		 le32_to_cpu(mbox_rsp->trans_frame_cnt);
3144	counts[EFCT_HW_HOST_STAT_RX_FRAME_COUNT].counter =
3145		 le32_to_cpu(mbox_rsp->recv_frame_cnt);
3146	counts[EFCT_HW_HOST_STAT_TX_SEQ_COUNT].counter =
3147		 le32_to_cpu(mbox_rsp->trans_seq_cnt);
3148	counts[EFCT_HW_HOST_STAT_RX_SEQ_COUNT].counter =
3149		 le32_to_cpu(mbox_rsp->recv_seq_cnt);
3150	counts[EFCT_HW_HOST_STAT_TOTAL_EXCH_ORIG].counter =
3151		 le32_to_cpu(mbox_rsp->tot_exchanges_orig);
3152	counts[EFCT_HW_HOST_STAT_TOTAL_EXCH_RESP].counter =
3153		 le32_to_cpu(mbox_rsp->tot_exchanges_resp);
3154	counts[EFCT_HW_HOSY_STAT_RX_P_BSY_COUNT].counter =
3155		 le32_to_cpu(mbox_rsp->recv_p_bsy_cnt);
3156	counts[EFCT_HW_HOST_STAT_RX_F_BSY_COUNT].counter =
3157		 le32_to_cpu(mbox_rsp->recv_f_bsy_cnt);
3158	counts[EFCT_HW_HOST_STAT_DROP_FRM_DUE_TO_NO_RQ_BUF_COUNT].counter =
3159		 le32_to_cpu(mbox_rsp->no_rq_buf_dropped_frames_cnt);
3160	counts[EFCT_HW_HOST_STAT_EMPTY_RQ_TIMEOUT_COUNT].counter =
3161		 le32_to_cpu(mbox_rsp->empty_rq_timeout_cnt);
3162	counts[EFCT_HW_HOST_STAT_DROP_FRM_DUE_TO_NO_XRI_COUNT].counter =
3163		 le32_to_cpu(mbox_rsp->no_xri_dropped_frames_cnt);
3164	counts[EFCT_HW_HOST_STAT_EMPTY_XRI_POOL_COUNT].counter =
3165		 le32_to_cpu(mbox_rsp->empty_xri_pool_cnt);
3166
3167	if (cb_arg) {
3168		if (cb_arg->cb) {
3169			if (status == 0 && le16_to_cpu(mbox_rsp->hdr.status))
3170				status = le16_to_cpu(mbox_rsp->hdr.status);
3171			cb_arg->cb(status, num_counters, counts, cb_arg->arg);
3172		}
3173
3174		kfree(cb_arg);
3175	}
3176
3177	return 0;
3178}
3179
3180int
3181efct_hw_get_host_stats(struct efct_hw *hw, u8 cc,
3182		       void (*cb)(int status, u32 num_counters,
3183				  struct efct_hw_host_stat_counts *counters,
3184				  void *arg),
3185		       void *arg)
3186{
3187	int rc = -EIO;
3188	struct efct_hw_host_stat_cb_arg *cb_arg;
3189	u8 mbxdata[SLI4_BMBX_SIZE];
3190
3191	cb_arg = kmalloc(sizeof(*cb_arg), GFP_ATOMIC);
3192	if (!cb_arg)
3193		return -ENOMEM;
3194
3195	cb_arg->cb = cb;
3196	cb_arg->arg = arg;
3197
3198	 /* Send the HW command to get the host stats */
3199	if (!sli_cmd_read_status(&hw->sli, mbxdata, cc))
3200		rc = efct_hw_command(hw, mbxdata, EFCT_CMD_NOWAIT,
3201				     efct_hw_cb_host_stat, cb_arg);
3202
3203	if (rc) {
3204		efc_log_debug(hw->os, "READ_HOST_STATS failed\n");
3205		kfree(cb_arg);
3206	}
3207
3208	return rc;
3209}
3210
3211struct efct_hw_async_call_ctx {
3212	efct_hw_async_cb_t callback;
3213	void *arg;
3214	u8 cmd[SLI4_BMBX_SIZE];
3215};
3216
3217static void
3218efct_hw_async_cb(struct efct_hw *hw, int status, u8 *mqe, void *arg)
3219{
3220	struct efct_hw_async_call_ctx *ctx = arg;
3221
3222	if (ctx) {
3223		if (ctx->callback)
3224			(*ctx->callback)(hw, status, mqe, ctx->arg);
3225
3226		kfree(ctx);
3227	}
3228}
3229
3230int
3231efct_hw_async_call(struct efct_hw *hw, efct_hw_async_cb_t callback, void *arg)
3232{
3233	struct efct_hw_async_call_ctx *ctx;
3234	int rc;
3235
3236	/*
3237	 * Allocate a callback context (which includes the mbox cmd buffer),
3238	 * we need this to be persistent as the mbox cmd submission may be
3239	 * queued and executed later execution.
3240	 */
3241	ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
3242	if (!ctx)
3243		return -ENOMEM;
3244
3245	ctx->callback = callback;
3246	ctx->arg = arg;
3247
3248	/* Build and send a NOP mailbox command */
3249	if (sli_cmd_common_nop(&hw->sli, ctx->cmd, 0)) {
3250		efc_log_err(hw->os, "COMMON_NOP format failure\n");
3251		kfree(ctx);
3252		return -EIO;
3253	}
3254
3255	rc = efct_hw_command(hw, ctx->cmd, EFCT_CMD_NOWAIT, efct_hw_async_cb,
3256			     ctx);
3257	if (rc) {
3258		efc_log_err(hw->os, "COMMON_NOP command failure, rc=%d\n", rc);
3259		kfree(ctx);
3260		return -EIO;
3261	}
3262	return 0;
3263}
3264
3265static int
3266efct_hw_cb_fw_write(struct efct_hw *hw, int status, u8 *mqe, void  *arg)
3267{
3268	struct sli4_cmd_sli_config *mbox_rsp =
3269					(struct sli4_cmd_sli_config *)mqe;
3270	struct sli4_rsp_cmn_write_object *wr_obj_rsp;
3271	struct efct_hw_fw_wr_cb_arg *cb_arg = arg;
3272	u32 bytes_written;
3273	u16 mbox_status;
3274	u32 change_status;
3275
3276	wr_obj_rsp = (struct sli4_rsp_cmn_write_object *)
3277		      &mbox_rsp->payload.embed;
3278	bytes_written = le32_to_cpu(wr_obj_rsp->actual_write_length);
3279	mbox_status = le16_to_cpu(mbox_rsp->hdr.status);
3280	change_status = (le32_to_cpu(wr_obj_rsp->change_status_dword) &
3281			 RSP_CHANGE_STATUS);
3282
3283	if (cb_arg) {
3284		if (cb_arg->cb) {
3285			if (!status && mbox_status)
3286				status = mbox_status;
3287			cb_arg->cb(status, bytes_written, change_status,
3288				   cb_arg->arg);
3289		}
3290
3291		kfree(cb_arg);
3292	}
3293
3294	return 0;
3295}
3296
3297int
3298efct_hw_firmware_write(struct efct_hw *hw, struct efc_dma *dma, u32 size,
3299		       u32 offset, int last,
3300		       void (*cb)(int status, u32 bytes_written,
3301				   u32 change_status, void *arg),
3302		       void *arg)
3303{
3304	int rc = -EIO;
3305	u8 mbxdata[SLI4_BMBX_SIZE];
3306	struct efct_hw_fw_wr_cb_arg *cb_arg;
3307	int noc = 0;
3308
3309	cb_arg = kzalloc(sizeof(*cb_arg), GFP_KERNEL);
3310	if (!cb_arg)
3311		return -ENOMEM;
3312
3313	cb_arg->cb = cb;
3314	cb_arg->arg = arg;
3315
3316	/* Write a portion of a firmware image to the device */
3317	if (!sli_cmd_common_write_object(&hw->sli, mbxdata,
3318					 noc, last, size, offset, "/prg/",
3319					 dma))
3320		rc = efct_hw_command(hw, mbxdata, EFCT_CMD_NOWAIT,
3321				     efct_hw_cb_fw_write, cb_arg);
3322
3323	if (rc != 0) {
3324		efc_log_debug(hw->os, "COMMON_WRITE_OBJECT failed\n");
3325		kfree(cb_arg);
3326	}
3327
3328	return rc;
3329}
3330
3331static int
3332efct_hw_cb_port_control(struct efct_hw *hw, int status, u8 *mqe,
3333			void  *arg)
3334{
3335	return 0;
3336}
3337
3338int
3339efct_hw_port_control(struct efct_hw *hw, enum efct_hw_port ctrl,
3340		     uintptr_t value,
3341		     void (*cb)(int status, uintptr_t value, void *arg),
3342		     void *arg)
3343{
3344	int rc = -EIO;
3345	u8 link[SLI4_BMBX_SIZE];
3346	u32 speed = 0;
3347	u8 reset_alpa = 0;
3348
3349	switch (ctrl) {
3350	case EFCT_HW_PORT_INIT:
3351		if (!sli_cmd_config_link(&hw->sli, link))
3352			rc = efct_hw_command(hw, link, EFCT_CMD_NOWAIT,
3353					     efct_hw_cb_port_control, NULL);
3354
3355		if (rc != 0) {
3356			efc_log_err(hw->os, "CONFIG_LINK failed\n");
3357			break;
3358		}
3359		speed = hw->config.speed;
3360		reset_alpa = (u8)(value & 0xff);
3361
3362		rc = -EIO;
3363		if (!sli_cmd_init_link(&hw->sli, link, speed, reset_alpa))
3364			rc = efct_hw_command(hw, link, EFCT_CMD_NOWAIT,
3365					     efct_hw_cb_port_control, NULL);
3366		/* Free buffer on error, since no callback is coming */
3367		if (rc)
3368			efc_log_err(hw->os, "INIT_LINK failed\n");
3369		break;
3370
3371	case EFCT_HW_PORT_SHUTDOWN:
3372		if (!sli_cmd_down_link(&hw->sli, link))
3373			rc = efct_hw_command(hw, link, EFCT_CMD_NOWAIT,
3374					     efct_hw_cb_port_control, NULL);
3375		/* Free buffer on error, since no callback is coming */
3376		if (rc)
3377			efc_log_err(hw->os, "DOWN_LINK failed\n");
3378		break;
3379
3380	default:
3381		efc_log_debug(hw->os, "unhandled control %#x\n", ctrl);
3382		break;
3383	}
3384
3385	return rc;
3386}
3387
3388void
3389efct_hw_teardown(struct efct_hw *hw)
3390{
3391	u32 i = 0;
3392	u32 destroy_queues;
3393	u32 free_memory;
3394	struct efc_dma *dma;
3395	struct efct *efct = hw->os;
3396
3397	destroy_queues = (hw->state == EFCT_HW_STATE_ACTIVE);
3398	free_memory = (hw->state != EFCT_HW_STATE_UNINITIALIZED);
3399
3400	/* Cancel Sliport Healthcheck */
3401	if (hw->sliport_healthcheck) {
3402		hw->sliport_healthcheck = 0;
3403		efct_hw_config_sli_port_health_check(hw, 0, 0);
3404	}
3405
3406	if (hw->state != EFCT_HW_STATE_QUEUES_ALLOCATED) {
3407		hw->state = EFCT_HW_STATE_TEARDOWN_IN_PROGRESS;
3408
3409		efct_hw_flush(hw);
3410
3411		if (list_empty(&hw->cmd_head))
3412			efc_log_debug(hw->os,
3413				      "All commands completed on MQ queue\n");
3414		else
3415			efc_log_debug(hw->os,
3416				      "Some cmds still pending on MQ queue\n");
3417
3418		/* Cancel any remaining commands */
3419		efct_hw_command_cancel(hw);
3420	} else {
3421		hw->state = EFCT_HW_STATE_TEARDOWN_IN_PROGRESS;
3422	}
3423
3424	dma_free_coherent(&efct->pci->dev,
3425			  hw->rnode_mem.size, hw->rnode_mem.virt,
3426			  hw->rnode_mem.phys);
3427	memset(&hw->rnode_mem, 0, sizeof(struct efc_dma));
3428
3429	if (hw->io) {
3430		for (i = 0; i < hw->config.n_io; i++) {
3431			if (hw->io[i] && hw->io[i]->sgl &&
3432			    hw->io[i]->sgl->virt) {
3433				dma_free_coherent(&efct->pci->dev,
3434						  hw->io[i]->sgl->size,
3435						  hw->io[i]->sgl->virt,
3436						  hw->io[i]->sgl->phys);
3437			}
3438			kfree(hw->io[i]);
3439			hw->io[i] = NULL;
3440		}
3441		kfree(hw->io);
3442		hw->io = NULL;
3443		kfree(hw->wqe_buffs);
3444		hw->wqe_buffs = NULL;
3445	}
3446
3447	dma = &hw->xfer_rdy;
3448	dma_free_coherent(&efct->pci->dev,
3449			  dma->size, dma->virt, dma->phys);
3450	memset(dma, 0, sizeof(struct efc_dma));
3451
3452	dma = &hw->loop_map;
3453	dma_free_coherent(&efct->pci->dev,
3454			  dma->size, dma->virt, dma->phys);
3455	memset(dma, 0, sizeof(struct efc_dma));
3456
3457	for (i = 0; i < hw->wq_count; i++)
3458		sli_queue_free(&hw->sli, &hw->wq[i], destroy_queues,
3459			       free_memory);
3460
3461	for (i = 0; i < hw->rq_count; i++)
3462		sli_queue_free(&hw->sli, &hw->rq[i], destroy_queues,
3463			       free_memory);
3464
3465	for (i = 0; i < hw->mq_count; i++)
3466		sli_queue_free(&hw->sli, &hw->mq[i], destroy_queues,
3467			       free_memory);
3468
3469	for (i = 0; i < hw->cq_count; i++)
3470		sli_queue_free(&hw->sli, &hw->cq[i], destroy_queues,
3471			       free_memory);
3472
3473	for (i = 0; i < hw->eq_count; i++)
3474		sli_queue_free(&hw->sli, &hw->eq[i], destroy_queues,
3475			       free_memory);
3476
3477	/* Free rq buffers */
3478	efct_hw_rx_free(hw);
3479
3480	efct_hw_queue_teardown(hw);
3481
3482	kfree(hw->wq_cpu_array);
3483
3484	sli_teardown(&hw->sli);
3485
3486	/* record the fact that the queues are non-functional */
3487	hw->state = EFCT_HW_STATE_UNINITIALIZED;
3488
3489	/* free sequence free pool */
3490	kfree(hw->seq_pool);
3491	hw->seq_pool = NULL;
3492
3493	/* free hw_wq_callback pool */
3494	efct_hw_reqtag_pool_free(hw);
3495
3496	mempool_destroy(hw->cmd_ctx_pool);
3497	mempool_destroy(hw->mbox_rqst_pool);
3498
3499	/* Mark HW setup as not having been called */
3500	hw->hw_setup_called = false;
3501}
3502
3503static int
3504efct_hw_sli_reset(struct efct_hw *hw, enum efct_hw_reset reset,
3505		  enum efct_hw_state prev_state)
3506{
3507	int rc = 0;
3508
3509	switch (reset) {
3510	case EFCT_HW_RESET_FUNCTION:
3511		efc_log_debug(hw->os, "issuing function level reset\n");
3512		if (sli_reset(&hw->sli)) {
3513			efc_log_err(hw->os, "sli_reset failed\n");
3514			rc = -EIO;
3515		}
3516		break;
3517	case EFCT_HW_RESET_FIRMWARE:
3518		efc_log_debug(hw->os, "issuing firmware reset\n");
3519		if (sli_fw_reset(&hw->sli)) {
3520			efc_log_err(hw->os, "sli_soft_reset failed\n");
3521			rc = -EIO;
3522		}
3523		/*
3524		 * Because the FW reset leaves the FW in a non-running state,
3525		 * follow that with a regular reset.
3526		 */
3527		efc_log_debug(hw->os, "issuing function level reset\n");
3528		if (sli_reset(&hw->sli)) {
3529			efc_log_err(hw->os, "sli_reset failed\n");
3530			rc = -EIO;
3531		}
3532		break;
3533	default:
3534		efc_log_err(hw->os, "unknown type - no reset performed\n");
3535		hw->state = prev_state;
3536		rc = -EINVAL;
3537		break;
3538	}
3539
3540	return rc;
3541}
3542
3543int
3544efct_hw_reset(struct efct_hw *hw, enum efct_hw_reset reset)
3545{
3546	int rc = 0;
3547	enum efct_hw_state prev_state = hw->state;
3548
3549	if (hw->state != EFCT_HW_STATE_ACTIVE)
3550		efc_log_debug(hw->os,
3551			      "HW state %d is not active\n", hw->state);
3552
3553	hw->state = EFCT_HW_STATE_RESET_IN_PROGRESS;
3554
3555	/*
3556	 * If the prev_state is already reset/teardown in progress,
3557	 * don't continue further
3558	 */
3559	if (prev_state == EFCT_HW_STATE_RESET_IN_PROGRESS ||
3560	    prev_state == EFCT_HW_STATE_TEARDOWN_IN_PROGRESS)
3561		return efct_hw_sli_reset(hw, reset, prev_state);
3562
3563	if (prev_state != EFCT_HW_STATE_UNINITIALIZED) {
3564		efct_hw_flush(hw);
3565
3566		if (list_empty(&hw->cmd_head))
3567			efc_log_debug(hw->os,
3568				      "All commands completed on MQ queue\n");
3569		else
3570			efc_log_err(hw->os,
3571				    "Some commands still pending on MQ queue\n");
3572	}
3573
3574	/* Reset the chip */
3575	rc = efct_hw_sli_reset(hw, reset, prev_state);
3576	if (rc == -EINVAL)
3577		return -EIO;
3578
3579	return rc;
3580}
3581