1
2
3
4
5
6
7#ifndef _EFCT_HW_H
8#define _EFCT_HW_H
9
10#include "../libefc_sli/sli4.h"
11
12
13
14
15#define EFCT_VENDOR_ID 0x10df
16
17#define EFCT_DEVICE_LANCER_G6 0xe307
18
19#define EFCT_DEVICE_LANCER_G7 0xf407
20
21
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
27#define EFCT_HW_RQ_SIZE_HDR 128
28#define EFCT_HW_RQ_SIZE_PAYLOAD 1024
29
30
31#define EFCT_HW_MAX_MRQS 8
32
33
34
35
36
37#define EFCT_HW_WQEC_SET_COUNT 32
38
39
40#define EFCT_HW_SEND_FRAME_TIMEOUT 10
41
42
43
44
45
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
63
64
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
76enum efct_cmd_opts {
77
78 EFCT_CMD_POLL,
79
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
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
133
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;
139
140 u8 buf[SLI4_BMBX_SIZE];
141 void *ctx;
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
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
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
175typedef int (*efct_hw_done_t)(struct efct_hw_io *, u32 len, int status,
176 u32 ext, void *ul_arg);
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
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
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
326struct efct_queue_hash {
327 bool in_use;
328 u16 id;
329 u16 index;
330};
331
332
333struct hw_wq_callback {
334 u16 instance_index;
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;
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
357 u32 rq_default_buffer_size;
358 u8 esoc;
359
360 u8 rq_selection_policy;
361
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
378 struct efct_hw_config config;
379
380
381 u32 num_qentries[SLI4_QTYPE_MAX];
382
383
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
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
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
411 u32 hw_rq_count;
412
413 u32 hw_mrq_count;
414
415 struct hw_wq **wq_cpu_array;
416
417
418 struct efc_hw_sequence *seq_pool;
419
420
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
431 struct efct_hw_io **io;
432
433 u8 *wqe_buffs;
434
435
436 spinlock_t io_lock;
437
438 struct list_head io_inuse;
439
440 struct list_head io_wait_free;
441
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
453 u32 tcmd_wq_submit[EFCT_HW_MAX_NUM_WQ];
454
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
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
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
531 struct efct_hw_io *send_frame_io;
532
533
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
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
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
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
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
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
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
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
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
765