1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
4 * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
10 #include "../libefc_sli/sli4.h"
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
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
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
30 /*Define the maximum number of multi-receive queues*/
31 #define EFCT_HW_MAX_MRQS 8
34 * Define count of when to set the WQEC bit in a submitted
35 * WQE, causing a consummed/released completion to be posted.
37 #define EFCT_HW_WQEC_SET_COUNT 32
39 /*Send frame timeout in seconds*/
40 #define EFCT_HW_SEND_FRAME_TIMEOUT 10
43 * FDT Transfer Hint value, reads greater than this value
44 * will be segmented to implement fairness. A value of zero disables
47 #define EFCT_HW_FDT_XFER_HINT 8192
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
56 #define OCE_HW_MAX_NUM_MRQ_PAIRS 16
58 #define EFCT_HW_MQ_DEPTH 128
59 #define EFCT_HW_EQ_DEPTH 1024
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
66 #define EFCT_HW_MAX_NUM_CQ \
67 ((EFCT_HW_MAX_NUM_WQ * 2) + 1 + (OCE_HW_MAX_NUM_MRQ_PAIRS * 2))
69 #define EFCT_HW_Q_HASH_SIZE 128
70 #define EFCT_HW_RQ_HEADER_SIZE 128
71 #define EFCT_HW_RQ_HEADER_INDEX 0
73 #define EFCT_HW_REQUE_XRI_REGTAG 65534
75 /* Options for efct_hw_command() */
77 /* command executes synchronously and busy-waits for completion */
79 /* command executes asynchronously. Uses callback */
84 EFCT_HW_RESET_FUNCTION
,
85 EFCT_HW_RESET_FIRMWARE
,
90 EFCT_HW_TOPOLOGY_AUTO
,
91 EFCT_HW_TOPOLOGY_NPORT
,
92 EFCT_HW_TOPOLOGY_LOOP
,
93 EFCT_HW_TOPOLOGY_NONE
,
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)))
101 #define EFCT_FW_VER_STR(a, b, c, d) (#a "." #b "." #c "." #d)
103 enum efct_hw_io_type
{
110 EFCT_HW_IO_TARGET_READ
,
111 EFCT_HW_IO_TARGET_WRITE
,
112 EFCT_HW_IO_TARGET_RSP
,
113 EFCT_HW_IO_DNRX_REQUEUE
,
117 enum 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
,
124 #define EFCT_TARGET_WRITE_SKIPS 1
125 #define EFCT_TARGET_READ_SKIPS 2
130 #define EFCT_CMD_CTX_POOL_SZ 32
132 * HW command context.
133 * Stores the state for the asynchronous commands sent to the hardware.
135 struct 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 */
149 union 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
;
156 /* WQ steering mode */
157 enum efct_hw_wq_steering
{
158 EFCT_HW_WQ_STEERING_CLASS
,
159 EFCT_HW_WQ_STEERING_REQUEST
,
160 EFCT_HW_WQ_STEERING_CPU
,
165 struct list_head list_entry
;
166 bool abort_wqe_submit_needed
;
174 /* Typedef for HW "done" callback */
175 typedef int (*efct_hw_done_t
)(struct efct_hw_io
*, u32 len
, int status
,
176 u32 ext
, void *ul_arg
);
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
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
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
;
223 struct efc_dma xfer_rdy
;
226 int abort_in_progress
;
234 efct_hw_done_t abort_done
;
237 enum efct_hw_wq_steering wq_steering
;
248 struct efc_dma def_sgl
;
257 EFCT_HW_PORT_SHUTDOWN
,
260 /* Node group rpi reference */
261 struct efct_hw_rpi_ref
{
263 atomic_t rpi_attached
;
266 enum 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
,
290 enum 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
,
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
,
316 struct efct_hw_link_stat_counts
{
321 struct efct_hw_host_stat_counts
{
325 /* Structure used for the hash lookup of queue IDs */
326 struct efct_queue_hash
{
332 /* WQ callback object */
333 struct hw_wq_callback
{
334 u16 instance_index
; /* use for request tag */
335 void (*callback
)(void *arg
, u8
*cqe
, int status
);
337 struct list_head list_entry
;
341 spinlock_t lock
; /* pool lock */
342 struct hw_wq_callback
*tags
[U16_MAX
];
343 struct list_head freelist
;
346 struct efct_hw_config
{
356 /* size of the buffers for first burst */
357 u32 rq_default_buffer_size
;
359 /* MRQ RQ selection policy */
360 u8 rq_selection_policy
;
361 /* RQ quanta if rq_selection_policy == 2 */
363 u32 filter_def
[SLI4_CMD_REG_FCFI_NUM_RQ_CFG
];
372 enum efct_hw_state state
;
373 bool hw_setup_called
;
374 u8 sliport_healthcheck
;
377 /* HW configuration */
378 struct efct_hw_config config
;
380 /* calculated queue sizes for each type */
381 u32 num_qentries
[SLI4_QTYPE_MAX
];
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
];
398 struct list_head eq_list
;
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
];
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 */
412 /* count of multirq RQs */
415 struct hw_wq
**wq_cpu_array
;
417 /* Sequence objects used in incoming frame processing */
418 struct efc_hw_sequence
*seq_pool
;
420 /* Maintain an ordered, linked list of outstanding HW commands. */
421 struct mutex bmbx_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
;
428 struct sli4_link_event link
;
430 /* pointer array of IO objects */
431 struct efct_hw_io
**io
;
432 /* array of WQE buffs mapped to IO objects */
435 /* IO lock to synchronize list access */
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
;
444 struct efc_dma loop_map
;
446 struct efc_dma xfer_rdy
;
448 struct efc_dma rnode_mem
;
450 atomic_t io_alloc_failed_count
;
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
];
457 atomic_t send_frame_seq_id
;
458 struct reqtag_pool
*wq_reqtag_pool
;
461 enum 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
,
468 /* HW queue data structures */
470 struct list_head list_entry
;
471 enum sli4_qtype type
;
476 struct sli4_queue
*queue
;
477 struct list_head cq_list
;
482 struct list_head list_entry
;
483 enum sli4_qtype type
;
488 struct sli4_queue
*queue
;
489 struct list_head q_list
;
494 struct list_head list_entry
;
495 enum sli4_qtype type
;
499 struct list_head list_entry
;
500 enum sli4_qtype type
;
506 struct sli4_queue
*queue
;
512 struct list_head list_entry
;
513 enum sli4_qtype type
;
520 struct sli4_queue
*queue
;
527 u32 total_submit_count
;
528 struct list_head pending_list
;
530 /* HW IO allocated for use with Send Frame */
531 struct efct_hw_io
*send_frame_io
;
535 u32 wq_pending_count
;
539 struct list_head list_entry
;
540 enum sli4_qtype type
;
546 u32 first_burst_entry_size
;
554 struct sli4_queue
*hdr
;
555 struct sli4_queue
*first_burst
;
556 struct sli4_queue
*data
;
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
;
565 struct efct_hw_send_frame_context
{
567 struct hw_wq_callback
*wqcb
;
568 struct efct_hw_wqe wqe
;
569 void (*callback
)(int status
, void *arg
);
572 /* General purpose elements */
573 struct efc_hw_sequence
*seq
;
574 struct efc_dma payload
;
577 struct efct_hw_grp_hdr
{
587 efct_hw_get_link_speed(struct efct_hw
*hw
) {
588 return hw
->link
.speed
;
592 efct_hw_setup(struct efct_hw
*hw
, void *os
, struct pci_dev
*pdev
);
593 int efct_hw_init(struct efct_hw
*hw
);
595 efct_hw_parse_filter(struct efct_hw
*hw
, void *value
);
597 efct_hw_init_queues(struct efct_hw
*hw
);
599 efct_hw_map_wq_cpu(struct efct_hw
*hw
);
601 efct_get_wwnn(struct efct_hw
*hw
);
603 efct_get_wwpn(struct efct_hw
*hw
);
605 int efct_hw_rx_allocate(struct efct_hw
*hw
);
606 int efct_hw_rx_post(struct efct_hw
*hw
);
607 void efct_hw_rx_free(struct efct_hw
*hw
);
609 efct_hw_command(struct efct_hw
*hw
, u8
*cmd
, u32 opts
, void *cb
,
612 efct_issue_mbox_rqst(void *base
, void *cmd
, void *cb
, void *arg
);
614 struct efct_hw_io
*efct_hw_io_alloc(struct efct_hw
*hw
);
615 int efct_hw_io_free(struct efct_hw
*hw
, struct efct_hw_io
*io
);
616 u8
efct_hw_io_inuse(struct efct_hw
*hw
, struct efct_hw_io
*io
);
618 efct_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
);
622 efct_hw_io_register_sgl(struct efct_hw
*hw
, struct efct_hw_io
*io
,
626 efct_hw_io_init_sges(struct efct_hw
*hw
,
627 struct efct_hw_io
*io
, enum efct_hw_io_type type
);
630 efct_hw_io_add_sge(struct efct_hw
*hw
, struct efct_hw_io
*io
,
631 uintptr_t addr
, u32 length
);
633 efct_hw_io_abort(struct efct_hw
*hw
, struct efct_hw_io
*io_to_abort
,
634 bool send_abts
, void *cb
, void *arg
);
636 efct_hw_io_get_count(struct efct_hw
*hw
,
637 enum efct_hw_io_count_type io_count_type
);
639 *efct_hw_io_lookup(struct efct_hw
*hw
, u32 indicator
);
640 void efct_hw_io_abort_all(struct efct_hw
*hw
);
641 void efct_hw_io_free_internal(struct kref
*arg
);
643 /* HW WQ request tag API */
644 struct reqtag_pool
*efct_hw_reqtag_pool_alloc(struct efct_hw
*hw
);
645 void efct_hw_reqtag_pool_free(struct efct_hw
*hw
);
646 struct hw_wq_callback
647 *efct_hw_reqtag_alloc(struct efct_hw
*hw
,
648 void (*callback
)(void *arg
, u8
*cqe
,
649 int status
), void *arg
);
651 efct_hw_reqtag_free(struct efct_hw
*hw
, struct hw_wq_callback
*wqcb
);
652 struct hw_wq_callback
653 *efct_hw_reqtag_get_instance(struct efct_hw
*hw
, u32 instance_index
);
655 /* RQ completion handlers for RQ pair mode */
657 efct_hw_rqpair_process_rq(struct efct_hw
*hw
,
658 struct hw_cq
*cq
, u8
*cqe
);
660 efct_hw_rqpair_sequence_free(struct efct_hw
*hw
, struct efc_hw_sequence
*seq
);
662 efct_hw_sequence_copy(struct efc_hw_sequence
*dst
,
663 struct efc_hw_sequence
*src
)
665 /* Copy src to dst, then zero out the linked list link */
670 efct_efc_hw_sequence_free(struct efc
*efc
, struct efc_hw_sequence
*seq
);
673 efct_hw_sequence_free(struct efct_hw
*hw
, struct efc_hw_sequence
*seq
)
675 /* Only RQ pair mode is supported */
676 return efct_hw_rqpair_sequence_free(hw
, seq
);
680 efct_hw_eq_process(struct efct_hw
*hw
, struct hw_eq
*eq
,
681 u32 max_isr_time_msec
);
682 void efct_hw_cq_process(struct efct_hw
*hw
, struct hw_cq
*cq
);
684 efct_hw_wq_process(struct efct_hw
*hw
, struct hw_cq
*cq
,
685 u8
*cqe
, int status
, u16 rid
);
687 efct_hw_xabt_process(struct efct_hw
*hw
, struct hw_cq
*cq
,
690 efct_hw_process(struct efct_hw
*hw
, u32 vector
, u32 max_isr_time_msec
);
692 efct_hw_queue_hash_find(struct efct_queue_hash
*hash
, u16 id
);
693 int efct_hw_wq_write(struct hw_wq
*wq
, struct efct_hw_wqe
*wqe
);
695 efct_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
),
701 efct_els_hw_srrs_send(struct efc
*efc
, struct efc_disc_io
*io
);
703 efct_efc_bls_send(struct efc
*efc
, u32 type
, struct sli_bls_params
*bls
);
705 efct_hw_bls_send(struct efct
*efct
, u32 type
, struct sli_bls_params
*bls_params
,
706 void *cb
, void *arg
);
708 /* Function for retrieving link statistics */
710 efct_hw_get_link_stats(struct efct_hw
*hw
,
712 u8 clear_overflow_flags
,
713 u8 clear_all_counters
,
714 void (*efct_hw_link_stat_cb_t
)(int status
,
716 struct efct_hw_link_stat_counts
*counters
, void *arg
),
718 /* Function for retrieving host statistics */
720 efct_hw_get_host_stats(struct efct_hw
*hw
,
722 void (*efct_hw_host_stat_cb_t
)(int status
,
724 struct efct_hw_host_stat_counts
*counters
, void *arg
),
727 efct_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
),
732 typedef void (*efct_hw_async_cb_t
)(struct efct_hw
*hw
, int status
,
735 efct_hw_async_call(struct efct_hw
*hw
, efct_hw_async_cb_t callback
, void *arg
);
737 struct hw_eq
*efct_hw_new_eq(struct efct_hw
*hw
, u32 entry_count
);
738 struct hw_cq
*efct_hw_new_cq(struct hw_eq
*eq
, u32 entry_count
);
740 efct_hw_new_cq_set(struct hw_eq
*eqs
[], struct hw_cq
*cqs
[],
741 u32 num_cqs
, u32 entry_count
);
742 struct hw_mq
*efct_hw_new_mq(struct hw_cq
*cq
, u32 entry_count
);
744 *efct_hw_new_wq(struct hw_cq
*cq
, u32 entry_count
);
746 efct_hw_new_rq_set(struct hw_cq
*cqs
[], struct hw_rq
*rqs
[],
747 u32 num_rq_pairs
, u32 entry_count
);
748 void efct_hw_del_eq(struct hw_eq
*eq
);
749 void efct_hw_del_cq(struct hw_cq
*cq
);
750 void efct_hw_del_mq(struct hw_mq
*mq
);
751 void efct_hw_del_wq(struct hw_wq
*wq
);
752 void efct_hw_del_rq(struct hw_rq
*rq
);
753 void efct_hw_queue_teardown(struct efct_hw
*hw
);
754 void efct_hw_teardown(struct efct_hw
*hw
);
756 efct_hw_reset(struct efct_hw
*hw
, enum efct_hw_reset reset
);
759 efct_hw_port_control(struct efct_hw
*hw
, enum efct_hw_port ctrl
,
761 void (*cb
)(int status
, uintptr_t value
, void *arg
),
764 #endif /* __EFCT_H__ */