Linux Audio

Check our new training course

Loading...
  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#ifndef _EFCT_HW_H
  8#define _EFCT_HW_H
  9
 10#include "../libefc_sli/sli4.h"
 11
 12/*
 13 * EFCT PCI IDs
 14 */
 15#define EFCT_VENDOR_ID			0x10df
 16/* LightPulse 16Gb x 4 FC (lancer-g6) */
 17#define EFCT_DEVICE_LANCER_G6		0xe307
 18/* LightPulse 32Gb x 4 FC (lancer-g7) */
 19#define EFCT_DEVICE_LANCER_G7		0xf407
 20
 21/*Default RQ entries len used by driver*/
 22#define EFCT_HW_RQ_ENTRIES_MIN		512
 23#define EFCT_HW_RQ_ENTRIES_DEF		1024
 24#define EFCT_HW_RQ_ENTRIES_MAX		4096
 25
 26/*Defines the size of the RQ buffers used for each RQ*/
 27#define EFCT_HW_RQ_SIZE_HDR             128
 28#define EFCT_HW_RQ_SIZE_PAYLOAD         1024
 29
 30/*Define the maximum number of multi-receive queues*/
 31#define EFCT_HW_MAX_MRQS		8
 32
 33/*
 34 * Define count of when to set the WQEC bit in a submitted
 35 * WQE, causing a consummed/released completion to be posted.
 36 */
 37#define EFCT_HW_WQEC_SET_COUNT		32
 38
 39/*Send frame timeout in seconds*/
 40#define EFCT_HW_SEND_FRAME_TIMEOUT	10
 41
 42/*
 43 * FDT Transfer Hint value, reads greater than this value
 44 * will be segmented to implement fairness. A value of zero disables
 45 * the feature.
 46 */
 47#define EFCT_HW_FDT_XFER_HINT		8192
 48
 49#define EFCT_HW_TIMECHECK_ITERATIONS	100
 50#define EFCT_HW_MAX_NUM_MQ		1
 51#define EFCT_HW_MAX_NUM_RQ		32
 52#define EFCT_HW_MAX_NUM_EQ		16
 53#define EFCT_HW_MAX_NUM_WQ		32
 54#define EFCT_HW_DEF_NUM_EQ		1
 55
 56#define OCE_HW_MAX_NUM_MRQ_PAIRS	16
 57
 58#define EFCT_HW_MQ_DEPTH		128
 59#define EFCT_HW_EQ_DEPTH		1024
 60
 61/*
 62 * A CQ will be assinged to each WQ
 63 * (CQ must have 2X entries of the WQ for abort
 64 * processing), plus a separate one for each RQ PAIR and one for MQ
 65 */
 66#define EFCT_HW_MAX_NUM_CQ \
 67	((EFCT_HW_MAX_NUM_WQ * 2) + 1 + (OCE_HW_MAX_NUM_MRQ_PAIRS * 2))
 68
 69#define EFCT_HW_Q_HASH_SIZE		128
 70#define EFCT_HW_RQ_HEADER_SIZE		128
 71#define EFCT_HW_RQ_HEADER_INDEX		0
 72
 73#define EFCT_HW_REQUE_XRI_REGTAG	65534
 74
 75/* Options for efct_hw_command() */
 76enum efct_cmd_opts {
 77	/* command executes synchronously and busy-waits for completion */
 78	EFCT_CMD_POLL,
 79	/* command executes asynchronously. Uses callback */
 80	EFCT_CMD_NOWAIT,
 81};
 82
 83enum efct_hw_reset {
 84	EFCT_HW_RESET_FUNCTION,
 85	EFCT_HW_RESET_FIRMWARE,
 86	EFCT_HW_RESET_MAX
 87};
 88
 89enum efct_hw_topo {
 90	EFCT_HW_TOPOLOGY_AUTO,
 91	EFCT_HW_TOPOLOGY_NPORT,
 92	EFCT_HW_TOPOLOGY_LOOP,
 93	EFCT_HW_TOPOLOGY_NONE,
 94	EFCT_HW_TOPOLOGY_MAX
 95};
 96
 97/* pack fw revision values into a single uint64_t */
 98#define HW_FWREV(a, b, c, d) (((uint64_t)(a) << 48) | ((uint64_t)(b) << 32) \
 99			| ((uint64_t)(c) << 16) | ((uint64_t)(d)))
100
101#define EFCT_FW_VER_STR(a, b, c, d) (#a "." #b "." #c "." #d)
102
103enum efct_hw_io_type {
104	EFCT_HW_ELS_REQ,
105	EFCT_HW_ELS_RSP,
106	EFCT_HW_FC_CT,
107	EFCT_HW_FC_CT_RSP,
108	EFCT_HW_BLS_ACC,
109	EFCT_HW_BLS_RJT,
110	EFCT_HW_IO_TARGET_READ,
111	EFCT_HW_IO_TARGET_WRITE,
112	EFCT_HW_IO_TARGET_RSP,
113	EFCT_HW_IO_DNRX_REQUEUE,
114	EFCT_HW_IO_MAX,
115};
116
117enum efct_hw_io_state {
118	EFCT_HW_IO_STATE_FREE,
119	EFCT_HW_IO_STATE_INUSE,
120	EFCT_HW_IO_STATE_WAIT_FREE,
121	EFCT_HW_IO_STATE_WAIT_SEC_HIO,
122};
123
124#define EFCT_TARGET_WRITE_SKIPS	1
125#define EFCT_TARGET_READ_SKIPS	2
126
127struct efct_hw;
128struct efct_io;
129
130#define EFCT_CMD_CTX_POOL_SZ	32
131/**
132 * HW command context.
133 * Stores the state for the asynchronous commands sent to the hardware.
134 */
135struct efct_command_ctx {
136	struct list_head	list_entry;
137	int (*cb)(struct efct_hw *hw, int status, u8 *mqe, void *arg);
138	void			*arg;	/* Argument for callback */
139	/* buffer holding command / results */
140	u8			buf[SLI4_BMBX_SIZE];
141	void			*ctx;	/* upper layer context */
142};
143
144struct efct_hw_sgl {
145	uintptr_t		addr;
146	size_t			len;
147};
148
149union efct_hw_io_param_u {
150	struct sli_bls_params bls;
151	struct sli_els_params els;
152	struct sli_ct_params fc_ct;
153	struct sli_fcp_tgt_params fcp_tgt;
154};
155
156/* WQ steering mode */
157enum efct_hw_wq_steering {
158	EFCT_HW_WQ_STEERING_CLASS,
159	EFCT_HW_WQ_STEERING_REQUEST,
160	EFCT_HW_WQ_STEERING_CPU,
161};
162
163/* HW wqe object */
164struct efct_hw_wqe {
165	struct list_head	list_entry;
166	bool			abort_wqe_submit_needed;
167	bool			send_abts;
168	u32			id;
169	u32			abort_reqtag;
170	u8			*wqebuf;
171};
172
173struct efct_hw_io;
174/* Typedef for HW "done" callback */
175typedef int (*efct_hw_done_t)(struct efct_hw_io *, u32 len, int status,
176			      u32 ext, void *ul_arg);
177
178/**
179 * HW IO object.
180 *
181 * Stores the per-IO information necessary
182 * for both SLI and efct.
183 * @ref:		reference counter for hw io object
184 * @state:		state of IO: free, busy, wait_free
185 * @list_entry		used for busy, wait_free, free lists
186 * @wqe			Work queue object, with link for pending
187 * @hw			pointer back to hardware context
188 * @xfer_rdy		transfer ready data
189 * @type		IO type
190 * @xbusy		Exchange is active in FW
191 * @abort_in_progress	if TRUE, abort is in progress
192 * @status_saved	if TRUE, latched status should be returned
193 * @wq_class		WQ class if steering mode is Class
194 * @reqtag		request tag for this HW IO
195 * @wq			WQ assigned to the exchange
196 * @done		Function called on IO completion
197 * @arg			argument passed to IO done callback
198 * @abort_done		Function called on abort completion
199 * @abort_arg		argument passed to abort done callback
200 * @wq_steering		WQ steering mode request
201 * @saved_status	Saved status
202 * @saved_len		Status length
203 * @saved_ext		Saved extended status
204 * @eq			EQ on which this HIO came up
205 * @sge_offset		SGE data offset
206 * @def_sgl_count	Count of SGEs in default SGL
207 * @abort_reqtag	request tag for an abort of this HW IO
208 * @indicator		Exchange indicator
209 * @def_sgl		default SGL
210 * @sgl			pointer to current active SGL
211 * @sgl_count		count of SGEs in io->sgl
212 * @first_data_sge	index of first data SGE
213 * @n_sge		number of active SGEs
214 */
215struct efct_hw_io {
216	struct kref		ref;
217	enum efct_hw_io_state	state;
218	void			(*release)(struct kref *arg);
219	struct list_head	list_entry;
220	struct efct_hw_wqe	wqe;
221
222	struct efct_hw		*hw;
223	struct efc_dma		xfer_rdy;
224	u16			type;
225	bool			xbusy;
226	int			abort_in_progress;
227	bool			status_saved;
228	u8			wq_class;
229	u16			reqtag;
230
231	struct hw_wq		*wq;
232	efct_hw_done_t		done;
233	void			*arg;
234	efct_hw_done_t		abort_done;
235	void			*abort_arg;
236
237	enum efct_hw_wq_steering wq_steering;
238
239	u32			saved_status;
240	u32			saved_len;
241	u32			saved_ext;
242
243	struct hw_eq		*eq;
244	u32			sge_offset;
245	u32			def_sgl_count;
246	u32			abort_reqtag;
247	u32			indicator;
248	struct efc_dma		def_sgl;
249	struct efc_dma		*sgl;
250	u32			sgl_count;
251	u32			first_data_sge;
252	u32			n_sge;
253};
254
255enum efct_hw_port {
256	EFCT_HW_PORT_INIT,
257	EFCT_HW_PORT_SHUTDOWN,
258};
259
260/* Node group rpi reference */
261struct efct_hw_rpi_ref {
262	atomic_t rpi_count;
263	atomic_t rpi_attached;
264};
265
266enum efct_hw_link_stat {
267	EFCT_HW_LINK_STAT_LINK_FAILURE_COUNT,
268	EFCT_HW_LINK_STAT_LOSS_OF_SYNC_COUNT,
269	EFCT_HW_LINK_STAT_LOSS_OF_SIGNAL_COUNT,
270	EFCT_HW_LINK_STAT_PRIMITIVE_SEQ_COUNT,
271	EFCT_HW_LINK_STAT_INVALID_XMIT_WORD_COUNT,
272	EFCT_HW_LINK_STAT_CRC_COUNT,
273	EFCT_HW_LINK_STAT_PRIMITIVE_SEQ_TIMEOUT_COUNT,
274	EFCT_HW_LINK_STAT_ELASTIC_BUFFER_OVERRUN_COUNT,
275	EFCT_HW_LINK_STAT_ARB_TIMEOUT_COUNT,
276	EFCT_HW_LINK_STAT_ADVERTISED_RCV_B2B_CREDIT,
277	EFCT_HW_LINK_STAT_CURR_RCV_B2B_CREDIT,
278	EFCT_HW_LINK_STAT_ADVERTISED_XMIT_B2B_CREDIT,
279	EFCT_HW_LINK_STAT_CURR_XMIT_B2B_CREDIT,
280	EFCT_HW_LINK_STAT_RCV_EOFA_COUNT,
281	EFCT_HW_LINK_STAT_RCV_EOFDTI_COUNT,
282	EFCT_HW_LINK_STAT_RCV_EOFNI_COUNT,
283	EFCT_HW_LINK_STAT_RCV_SOFF_COUNT,
284	EFCT_HW_LINK_STAT_RCV_DROPPED_NO_AER_COUNT,
285	EFCT_HW_LINK_STAT_RCV_DROPPED_NO_RPI_COUNT,
286	EFCT_HW_LINK_STAT_RCV_DROPPED_NO_XRI_COUNT,
287	EFCT_HW_LINK_STAT_MAX,
288};
289
290enum efct_hw_host_stat {
291	EFCT_HW_HOST_STAT_TX_KBYTE_COUNT,
292	EFCT_HW_HOST_STAT_RX_KBYTE_COUNT,
293	EFCT_HW_HOST_STAT_TX_FRAME_COUNT,
294	EFCT_HW_HOST_STAT_RX_FRAME_COUNT,
295	EFCT_HW_HOST_STAT_TX_SEQ_COUNT,
296	EFCT_HW_HOST_STAT_RX_SEQ_COUNT,
297	EFCT_HW_HOST_STAT_TOTAL_EXCH_ORIG,
298	EFCT_HW_HOST_STAT_TOTAL_EXCH_RESP,
299	EFCT_HW_HOSY_STAT_RX_P_BSY_COUNT,
300	EFCT_HW_HOST_STAT_RX_F_BSY_COUNT,
301	EFCT_HW_HOST_STAT_DROP_FRM_DUE_TO_NO_RQ_BUF_COUNT,
302	EFCT_HW_HOST_STAT_EMPTY_RQ_TIMEOUT_COUNT,
303	EFCT_HW_HOST_STAT_DROP_FRM_DUE_TO_NO_XRI_COUNT,
304	EFCT_HW_HOST_STAT_EMPTY_XRI_POOL_COUNT,
305	EFCT_HW_HOST_STAT_MAX,
306};
307
308enum efct_hw_state {
309	EFCT_HW_STATE_UNINITIALIZED,
310	EFCT_HW_STATE_QUEUES_ALLOCATED,
311	EFCT_HW_STATE_ACTIVE,
312	EFCT_HW_STATE_RESET_IN_PROGRESS,
313	EFCT_HW_STATE_TEARDOWN_IN_PROGRESS,
314};
315
316struct efct_hw_link_stat_counts {
317	u8		overflow;
318	u32		counter;
319};
320
321struct efct_hw_host_stat_counts {
322	u32		counter;
323};
324
325/* Structure used for the hash lookup of queue IDs */
326struct efct_queue_hash {
327	bool		in_use;
328	u16		id;
329	u16		index;
330};
331
332/* WQ callback object */
333struct hw_wq_callback {
334	u16		instance_index;	/* use for request tag */
335	void (*callback)(void *arg, u8 *cqe, int status);
336	void		*arg;
337	struct list_head list_entry;
338};
339
340struct reqtag_pool {
341	spinlock_t lock;	/* pool lock */
342	struct hw_wq_callback *tags[U16_MAX];
343	struct list_head freelist;
344};
345
346struct efct_hw_config {
347	u32		n_eq;
348	u32		n_cq;
349	u32		n_mq;
350	u32		n_rq;
351	u32		n_wq;
352	u32		n_io;
353	u32		n_sgl;
354	u32		speed;
355	u32		topology;
356	/* size of the buffers for first burst */
357	u32		rq_default_buffer_size;
358	u8		esoc;
359	/* MRQ RQ selection policy */
360	u8		rq_selection_policy;
361	/* RQ quanta if rq_selection_policy == 2 */
362	u8		rr_quanta;
363	u32		filter_def[SLI4_CMD_REG_FCFI_NUM_RQ_CFG];
364};
365
366struct efct_hw {
367	struct efct		*os;
368	struct sli4		sli;
369	u16			ulp_start;
370	u16			ulp_max;
371	u32			dump_size;
372	enum efct_hw_state	state;
373	bool			hw_setup_called;
374	u8			sliport_healthcheck;
375	u16			fcf_indicator;
376
377	/* HW configuration */
378	struct efct_hw_config	config;
379
380	/* calculated queue sizes for each type */
381	u32			num_qentries[SLI4_QTYPE_MAX];
382
383	/* Storage for SLI queue objects */
384	struct sli4_queue	wq[EFCT_HW_MAX_NUM_WQ];
385	struct sli4_queue	rq[EFCT_HW_MAX_NUM_RQ];
386	u16			hw_rq_lookup[EFCT_HW_MAX_NUM_RQ];
387	struct sli4_queue	mq[EFCT_HW_MAX_NUM_MQ];
388	struct sli4_queue	cq[EFCT_HW_MAX_NUM_CQ];
389	struct sli4_queue	eq[EFCT_HW_MAX_NUM_EQ];
390
391	/* HW queue */
392	u32			eq_count;
393	u32			cq_count;
394	u32			mq_count;
395	u32			wq_count;
396	u32			rq_count;
397	u32			cmd_head_count;
398	struct list_head	eq_list;
399
400	struct efct_queue_hash	cq_hash[EFCT_HW_Q_HASH_SIZE];
401	struct efct_queue_hash	rq_hash[EFCT_HW_Q_HASH_SIZE];
402	struct efct_queue_hash	wq_hash[EFCT_HW_Q_HASH_SIZE];
403
404	/* Storage for HW queue objects */
405	struct hw_wq		*hw_wq[EFCT_HW_MAX_NUM_WQ];
406	struct hw_rq		*hw_rq[EFCT_HW_MAX_NUM_RQ];
407	struct hw_mq		*hw_mq[EFCT_HW_MAX_NUM_MQ];
408	struct hw_cq		*hw_cq[EFCT_HW_MAX_NUM_CQ];
409	struct hw_eq		*hw_eq[EFCT_HW_MAX_NUM_EQ];
410	/* count of hw_rq[] entries */
411	u32			hw_rq_count;
412	/* count of multirq RQs */
413	u32			hw_mrq_count;
414
415	struct hw_wq		**wq_cpu_array;
416
417	/* Sequence objects used in incoming frame processing */
418	struct efc_hw_sequence	*seq_pool;
419
420	/* Maintain an ordered, linked list of outstanding HW commands. */
421	struct mutex            bmbx_lock;
422	spinlock_t		cmd_lock;
423	struct list_head	cmd_head;
424	struct list_head	cmd_pending;
425	mempool_t		*cmd_ctx_pool;
426	mempool_t		*mbox_rqst_pool;
427
428	struct sli4_link_event	link;
429
430	/* pointer array of IO objects */
431	struct efct_hw_io	**io;
432	/* array of WQE buffs mapped to IO objects */
433	u8			*wqe_buffs;
434
435	/* IO lock to synchronize list access */
436	spinlock_t		io_lock;
437	/* List of IO objects in use */
438	struct list_head	io_inuse;
439	/* List of IO objects waiting to be freed */
440	struct list_head	io_wait_free;
441	/* List of IO objects available for allocation */
442	struct list_head	io_free;
443
444	struct efc_dma		loop_map;
445
446	struct efc_dma		xfer_rdy;
447
448	struct efc_dma		rnode_mem;
449
450	atomic_t		io_alloc_failed_count;
451
452	/* stat: wq sumbit count */
453	u32			tcmd_wq_submit[EFCT_HW_MAX_NUM_WQ];
454	/* stat: wq complete count */
455	u32			tcmd_wq_complete[EFCT_HW_MAX_NUM_WQ];
456
457	atomic_t		send_frame_seq_id;
458	struct reqtag_pool	*wq_reqtag_pool;
459};
460
461enum efct_hw_io_count_type {
462	EFCT_HW_IO_INUSE_COUNT,
463	EFCT_HW_IO_FREE_COUNT,
464	EFCT_HW_IO_WAIT_FREE_COUNT,
465	EFCT_HW_IO_N_TOTAL_IO_COUNT,
466};
467
468/* HW queue data structures */
469struct hw_eq {
470	struct list_head	list_entry;
471	enum sli4_qtype		type;
472	u32			instance;
473	u32			entry_count;
474	u32			entry_size;
475	struct efct_hw		*hw;
476	struct sli4_queue	*queue;
477	struct list_head	cq_list;
478	u32			use_count;
479};
480
481struct hw_cq {
482	struct list_head	list_entry;
483	enum sli4_qtype		type;
484	u32			instance;
485	u32			entry_count;
486	u32			entry_size;
487	struct hw_eq		*eq;
488	struct sli4_queue	*queue;
489	struct list_head	q_list;
490	u32			use_count;
491};
492
493struct hw_q {
494	struct list_head	list_entry;
495	enum sli4_qtype		type;
496};
497
498struct hw_mq {
499	struct list_head	list_entry;
500	enum sli4_qtype		type;
501	u32			instance;
502
503	u32			entry_count;
504	u32			entry_size;
505	struct hw_cq		*cq;
506	struct sli4_queue	*queue;
507
508	u32			use_count;
509};
510
511struct hw_wq {
512	struct list_head	list_entry;
513	enum sli4_qtype		type;
514	u32			instance;
515	struct efct_hw		*hw;
516
517	u32			entry_count;
518	u32			entry_size;
519	struct hw_cq		*cq;
520	struct sli4_queue	*queue;
521	u32			class;
522
523	/* WQ consumed */
524	u32			wqec_set_count;
525	u32			wqec_count;
526	u32			free_count;
527	u32			total_submit_count;
528	struct list_head	pending_list;
529
530	/* HW IO allocated for use with Send Frame */
531	struct efct_hw_io	*send_frame_io;
532
533	/* Stats */
534	u32			use_count;
535	u32			wq_pending_count;
536};
537
538struct hw_rq {
539	struct list_head	list_entry;
540	enum sli4_qtype		type;
541	u32			instance;
542
543	u32			entry_count;
544	u32			use_count;
545	u32			hdr_entry_size;
546	u32			first_burst_entry_size;
547	u32			data_entry_size;
548	bool			is_mrq;
549	u32			base_mrq_id;
550
551	struct hw_cq		*cq;
552
553	u8			filter_mask;
554	struct sli4_queue	*hdr;
555	struct sli4_queue	*first_burst;
556	struct sli4_queue	*data;
557
558	struct efc_hw_rq_buffer	*hdr_buf;
559	struct efc_hw_rq_buffer	*fb_buf;
560	struct efc_hw_rq_buffer	*payload_buf;
561	/* RQ tracker for this RQ */
562	struct efc_hw_sequence	**rq_tracker;
563};
564
565struct efct_hw_send_frame_context {
566	struct efct_hw		*hw;
567	struct hw_wq_callback	*wqcb;
568	struct efct_hw_wqe	wqe;
569	void (*callback)(int status, void *arg);
570	void			*arg;
571
572	/* General purpose elements */
573	struct efc_hw_sequence	*seq;
574	struct efc_dma		payload;
575};
576
577struct efct_hw_grp_hdr {
578	u32			size;
579	__be32			magic_number;
580	u32			word2;
581	u8			rev_name[128];
582	u8			date[12];
583	u8			revision[32];
584};
585
586static inline int
587efct_hw_get_link_speed(struct efct_hw *hw) {
588	return hw->link.speed;
589}
590
591int
592efct_hw_setup(struct efct_hw *hw, void *os, struct pci_dev *pdev);
593int efct_hw_init(struct efct_hw *hw);
594int
595efct_hw_parse_filter(struct efct_hw *hw, void *value);
596int
597efct_hw_init_queues(struct efct_hw *hw);
598int
599efct_hw_map_wq_cpu(struct efct_hw *hw);
600uint64_t
601efct_get_wwnn(struct efct_hw *hw);
602uint64_t
603efct_get_wwpn(struct efct_hw *hw);
604
605int efct_hw_rx_allocate(struct efct_hw *hw);
606int efct_hw_rx_post(struct efct_hw *hw);
607void efct_hw_rx_free(struct efct_hw *hw);
608int
609efct_hw_command(struct efct_hw *hw, u8 *cmd, u32 opts, void *cb,
610		void *arg);
611int
612efct_issue_mbox_rqst(void *base, void *cmd, void *cb, void *arg);
613
614struct efct_hw_io *efct_hw_io_alloc(struct efct_hw *hw);
615int efct_hw_io_free(struct efct_hw *hw, struct efct_hw_io *io);
616u8 efct_hw_io_inuse(struct efct_hw *hw, struct efct_hw_io *io);
617int
618efct_hw_io_send(struct efct_hw *hw, enum efct_hw_io_type type,
619		struct efct_hw_io *io, union efct_hw_io_param_u *iparam,
620		void *cb, void *arg);
621int
622efct_hw_io_register_sgl(struct efct_hw *hw, struct efct_hw_io *io,
623			struct efc_dma *sgl,
624			u32 sgl_count);
625int
626efct_hw_io_init_sges(struct efct_hw *hw,
627		     struct efct_hw_io *io, enum efct_hw_io_type type);
628
629int
630efct_hw_io_add_sge(struct efct_hw *hw, struct efct_hw_io *io,
631		   uintptr_t addr, u32 length);
632int
633efct_hw_io_abort(struct efct_hw *hw, struct efct_hw_io *io_to_abort,
634		 bool send_abts, void *cb, void *arg);
635u32
636efct_hw_io_get_count(struct efct_hw *hw,
637		     enum efct_hw_io_count_type io_count_type);
638struct efct_hw_io
639*efct_hw_io_lookup(struct efct_hw *hw, u32 indicator);
640void efct_hw_io_abort_all(struct efct_hw *hw);
641void efct_hw_io_free_internal(struct kref *arg);
642
643/* HW WQ request tag API */
644struct reqtag_pool *efct_hw_reqtag_pool_alloc(struct efct_hw *hw);
645void efct_hw_reqtag_pool_free(struct efct_hw *hw);
646struct hw_wq_callback
647*efct_hw_reqtag_alloc(struct efct_hw *hw,
648			void (*callback)(void *arg, u8 *cqe,
649					 int status), void *arg);
650void
651efct_hw_reqtag_free(struct efct_hw *hw, struct hw_wq_callback *wqcb);
652struct hw_wq_callback
653*efct_hw_reqtag_get_instance(struct efct_hw *hw, u32 instance_index);
654
655/* RQ completion handlers for RQ pair mode */
656int
657efct_hw_rqpair_process_rq(struct efct_hw *hw,
658			  struct hw_cq *cq, u8 *cqe);
659int
660efct_hw_rqpair_sequence_free(struct efct_hw *hw, struct efc_hw_sequence *seq);
661static inline void
662efct_hw_sequence_copy(struct efc_hw_sequence *dst,
663		      struct efc_hw_sequence *src)
664{
665	/* Copy src to dst, then zero out the linked list link */
666	*dst = *src;
667}
668
669int
670efct_efc_hw_sequence_free(struct efc *efc, struct efc_hw_sequence *seq);
671
672static inline int
673efct_hw_sequence_free(struct efct_hw *hw, struct efc_hw_sequence *seq)
674{
675	/* Only RQ pair mode is supported */
676	return efct_hw_rqpair_sequence_free(hw, seq);
677}
678
679int
680efct_hw_eq_process(struct efct_hw *hw, struct hw_eq *eq,
681		   u32 max_isr_time_msec);
682void efct_hw_cq_process(struct efct_hw *hw, struct hw_cq *cq);
683void
684efct_hw_wq_process(struct efct_hw *hw, struct hw_cq *cq,
685		   u8 *cqe, int status, u16 rid);
686void
687efct_hw_xabt_process(struct efct_hw *hw, struct hw_cq *cq,
688		     u8 *cqe, u16 rid);
689int
690efct_hw_process(struct efct_hw *hw, u32 vector, u32 max_isr_time_msec);
691int
692efct_hw_queue_hash_find(struct efct_queue_hash *hash, u16 id);
693int efct_hw_wq_write(struct hw_wq *wq, struct efct_hw_wqe *wqe);
694int
695efct_hw_send_frame(struct efct_hw *hw, struct fc_frame_header *hdr,
696		   u8 sof, u8 eof, struct efc_dma *payload,
697		struct efct_hw_send_frame_context *ctx,
698		void (*callback)(void *arg, u8 *cqe, int status),
699		void *arg);
700int
701efct_els_hw_srrs_send(struct efc *efc, struct efc_disc_io *io);
702int
703efct_efc_bls_send(struct efc *efc, u32 type, struct sli_bls_params *bls);
704int
705efct_hw_bls_send(struct efct *efct, u32 type, struct sli_bls_params *bls_params,
706		 void *cb, void *arg);
707
708/* Function for retrieving link statistics */
709int
710efct_hw_get_link_stats(struct efct_hw *hw,
711		       u8 req_ext_counters,
712		       u8 clear_overflow_flags,
713		       u8 clear_all_counters,
714		       void (*efct_hw_link_stat_cb_t)(int status,
715						      u32 num_counters,
716		       struct efct_hw_link_stat_counts *counters, void *arg),
717		       void *arg);
718/* Function for retrieving host statistics */
719int
720efct_hw_get_host_stats(struct efct_hw *hw,
721		       u8 cc,
722		       void (*efct_hw_host_stat_cb_t)(int status,
723						      u32 num_counters,
724		       struct efct_hw_host_stat_counts *counters, void *arg),
725		       void *arg);
726int
727efct_hw_firmware_write(struct efct_hw *hw, struct efc_dma *dma,
728		       u32 size, u32 offset, int last,
729		       void (*cb)(int status, u32 bytes_written,
730				  u32 change_status, void *arg),
731		       void *arg);
732typedef void (*efct_hw_async_cb_t)(struct efct_hw *hw, int status,
733				  u8 *mqe, void *arg);
734int
735efct_hw_async_call(struct efct_hw *hw, efct_hw_async_cb_t callback, void *arg);
736
737struct hw_eq *efct_hw_new_eq(struct efct_hw *hw, u32 entry_count);
738struct hw_cq *efct_hw_new_cq(struct hw_eq *eq, u32 entry_count);
739u32
740efct_hw_new_cq_set(struct hw_eq *eqs[], struct hw_cq *cqs[],
741		   u32 num_cqs, u32 entry_count);
742struct hw_mq *efct_hw_new_mq(struct hw_cq *cq, u32 entry_count);
743struct hw_wq
744*efct_hw_new_wq(struct hw_cq *cq, u32 entry_count);
745u32
746efct_hw_new_rq_set(struct hw_cq *cqs[], struct hw_rq *rqs[],
747		   u32 num_rq_pairs, u32 entry_count);
748void efct_hw_del_eq(struct hw_eq *eq);
749void efct_hw_del_cq(struct hw_cq *cq);
750void efct_hw_del_mq(struct hw_mq *mq);
751void efct_hw_del_wq(struct hw_wq *wq);
752void efct_hw_del_rq(struct hw_rq *rq);
753void efct_hw_queue_teardown(struct efct_hw *hw);
754void efct_hw_teardown(struct efct_hw *hw);
755int
756efct_hw_reset(struct efct_hw *hw, enum efct_hw_reset reset);
757
758int
759efct_hw_port_control(struct efct_hw *hw, enum efct_hw_port ctrl,
760		     uintptr_t value,
761		void (*cb)(int status, uintptr_t value, void *arg),
762		void *arg);
763
764#endif /* __EFCT_H__ */