2 * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
3 * Copyright (c) 2014- QLogic Corporation.
7 * Linux driver for QLogic BR-series Fibre Channel Host Bus Adapter.
9 * This program is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License (GPL) Version 2 as
11 * published by the Free Software Foundation
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
20 #include "bfa_defs_svc.h"
26 BFA_TRC_FILE(CNA
, PORT
);
29 bfa_port_stats_swap(struct bfa_port_s
*port
, union bfa_port_stats_u
*stats
)
31 u32
*dip
= (u32
*) stats
;
35 for (i
= 0; i
< sizeof(union bfa_port_stats_u
)/sizeof(u32
);
40 dip
[i
] = be32_to_cpu(t0
);
41 dip
[i
+ 1] = be32_to_cpu(t1
);
43 dip
[i
] = be32_to_cpu(t1
);
44 dip
[i
+ 1] = be32_to_cpu(t0
);
50 * bfa_port_enable_isr()
53 * @param[in] port - Pointer to the port module
54 * status - Return status from the f/w
59 bfa_port_enable_isr(struct bfa_port_s
*port
, bfa_status_t status
)
61 bfa_trc(port
, status
);
62 port
->endis_pending
= BFA_FALSE
;
63 port
->endis_cbfn(port
->endis_cbarg
, status
);
67 * bfa_port_disable_isr()
70 * @param[in] port - Pointer to the port module
71 * status - Return status from the f/w
76 bfa_port_disable_isr(struct bfa_port_s
*port
, bfa_status_t status
)
78 bfa_trc(port
, status
);
79 port
->endis_pending
= BFA_FALSE
;
80 port
->endis_cbfn(port
->endis_cbarg
, status
);
84 * bfa_port_get_stats_isr()
87 * @param[in] port - Pointer to the Port module
88 * status - Return status from the f/w
93 bfa_port_get_stats_isr(struct bfa_port_s
*port
, bfa_status_t status
)
95 port
->stats_status
= status
;
96 port
->stats_busy
= BFA_FALSE
;
98 if (status
== BFA_STATUS_OK
) {
101 memcpy(port
->stats
, port
->stats_dma
.kva
,
102 sizeof(union bfa_port_stats_u
));
103 bfa_port_stats_swap(port
, port
->stats
);
105 do_gettimeofday(&tv
);
106 port
->stats
->fc
.secs_reset
= tv
.tv_sec
- port
->stats_reset_time
;
109 if (port
->stats_cbfn
) {
110 port
->stats_cbfn(port
->stats_cbarg
, status
);
111 port
->stats_cbfn
= NULL
;
116 * bfa_port_clear_stats_isr()
119 * @param[in] port - Pointer to the Port module
120 * status - Return status from the f/w
125 bfa_port_clear_stats_isr(struct bfa_port_s
*port
, bfa_status_t status
)
129 port
->stats_status
= status
;
130 port
->stats_busy
= BFA_FALSE
;
133 * re-initialize time stamp for stats reset
135 do_gettimeofday(&tv
);
136 port
->stats_reset_time
= tv
.tv_sec
;
138 if (port
->stats_cbfn
) {
139 port
->stats_cbfn(port
->stats_cbarg
, status
);
140 port
->stats_cbfn
= NULL
;
148 * @param[in] Pointer to the Port module data structure.
153 bfa_port_isr(void *cbarg
, struct bfi_mbmsg_s
*m
)
155 struct bfa_port_s
*port
= (struct bfa_port_s
*) cbarg
;
156 union bfi_port_i2h_msg_u
*i2hmsg
;
158 i2hmsg
= (union bfi_port_i2h_msg_u
*) m
;
159 bfa_trc(port
, m
->mh
.msg_id
);
161 switch (m
->mh
.msg_id
) {
162 case BFI_PORT_I2H_ENABLE_RSP
:
163 if (port
->endis_pending
== BFA_FALSE
)
165 bfa_port_enable_isr(port
, i2hmsg
->enable_rsp
.status
);
168 case BFI_PORT_I2H_DISABLE_RSP
:
169 if (port
->endis_pending
== BFA_FALSE
)
171 bfa_port_disable_isr(port
, i2hmsg
->disable_rsp
.status
);
174 case BFI_PORT_I2H_GET_STATS_RSP
:
175 /* Stats busy flag is still set? (may be cmd timed out) */
176 if (port
->stats_busy
== BFA_FALSE
)
178 bfa_port_get_stats_isr(port
, i2hmsg
->getstats_rsp
.status
);
181 case BFI_PORT_I2H_CLEAR_STATS_RSP
:
182 if (port
->stats_busy
== BFA_FALSE
)
184 bfa_port_clear_stats_isr(port
, i2hmsg
->clearstats_rsp
.status
);
198 * @return Size of DMA region
201 bfa_port_meminfo(void)
203 return BFA_ROUNDUP(sizeof(union bfa_port_stats_u
), BFA_DMA_ALIGN_SZ
);
207 * bfa_port_mem_claim()
210 * @param[in] port Port module pointer
211 * dma_kva Kernel Virtual Address of Port DMA Memory
212 * dma_pa Physical Address of Port DMA Memory
217 bfa_port_mem_claim(struct bfa_port_s
*port
, u8
*dma_kva
, u64 dma_pa
)
219 port
->stats_dma
.kva
= dma_kva
;
220 port
->stats_dma
.pa
= dma_pa
;
226 * Send the Port enable request to the f/w
228 * @param[in] Pointer to the Port module data structure.
233 bfa_port_enable(struct bfa_port_s
*port
, bfa_port_endis_cbfn_t cbfn
,
236 struct bfi_port_generic_req_s
*m
;
238 /* If port is PBC disabled, return error */
239 if (port
->pbc_disabled
) {
240 bfa_trc(port
, BFA_STATUS_PBC
);
241 return BFA_STATUS_PBC
;
244 if (bfa_ioc_is_disabled(port
->ioc
)) {
245 bfa_trc(port
, BFA_STATUS_IOC_DISABLED
);
246 return BFA_STATUS_IOC_DISABLED
;
249 if (!bfa_ioc_is_operational(port
->ioc
)) {
250 bfa_trc(port
, BFA_STATUS_IOC_FAILURE
);
251 return BFA_STATUS_IOC_FAILURE
;
254 /* if port is d-port enabled, return error */
255 if (port
->dport_enabled
) {
256 bfa_trc(port
, BFA_STATUS_DPORT_ERR
);
257 return BFA_STATUS_DPORT_ERR
;
260 if (port
->endis_pending
) {
261 bfa_trc(port
, BFA_STATUS_DEVBUSY
);
262 return BFA_STATUS_DEVBUSY
;
265 m
= (struct bfi_port_generic_req_s
*) port
->endis_mb
.msg
;
268 port
->endis_cbfn
= cbfn
;
269 port
->endis_cbarg
= cbarg
;
270 port
->endis_pending
= BFA_TRUE
;
272 bfi_h2i_set(m
->mh
, BFI_MC_PORT
, BFI_PORT_H2I_ENABLE_REQ
,
273 bfa_ioc_portid(port
->ioc
));
274 bfa_ioc_mbox_queue(port
->ioc
, &port
->endis_mb
);
276 return BFA_STATUS_OK
;
282 * Send the Port disable request to the f/w
284 * @param[in] Pointer to the Port module data structure.
289 bfa_port_disable(struct bfa_port_s
*port
, bfa_port_endis_cbfn_t cbfn
,
292 struct bfi_port_generic_req_s
*m
;
294 /* If port is PBC disabled, return error */
295 if (port
->pbc_disabled
) {
296 bfa_trc(port
, BFA_STATUS_PBC
);
297 return BFA_STATUS_PBC
;
300 if (bfa_ioc_is_disabled(port
->ioc
)) {
301 bfa_trc(port
, BFA_STATUS_IOC_DISABLED
);
302 return BFA_STATUS_IOC_DISABLED
;
305 if (!bfa_ioc_is_operational(port
->ioc
)) {
306 bfa_trc(port
, BFA_STATUS_IOC_FAILURE
);
307 return BFA_STATUS_IOC_FAILURE
;
310 /* if port is d-port enabled, return error */
311 if (port
->dport_enabled
) {
312 bfa_trc(port
, BFA_STATUS_DPORT_ERR
);
313 return BFA_STATUS_DPORT_ERR
;
316 if (port
->endis_pending
) {
317 bfa_trc(port
, BFA_STATUS_DEVBUSY
);
318 return BFA_STATUS_DEVBUSY
;
321 m
= (struct bfi_port_generic_req_s
*) port
->endis_mb
.msg
;
324 port
->endis_cbfn
= cbfn
;
325 port
->endis_cbarg
= cbarg
;
326 port
->endis_pending
= BFA_TRUE
;
328 bfi_h2i_set(m
->mh
, BFI_MC_PORT
, BFI_PORT_H2I_DISABLE_REQ
,
329 bfa_ioc_portid(port
->ioc
));
330 bfa_ioc_mbox_queue(port
->ioc
, &port
->endis_mb
);
332 return BFA_STATUS_OK
;
336 * bfa_port_get_stats()
338 * Send the request to the f/w to fetch Port statistics.
340 * @param[in] Pointer to the Port module data structure.
345 bfa_port_get_stats(struct bfa_port_s
*port
, union bfa_port_stats_u
*stats
,
346 bfa_port_stats_cbfn_t cbfn
, void *cbarg
)
348 struct bfi_port_get_stats_req_s
*m
;
350 if (!bfa_ioc_is_operational(port
->ioc
)) {
351 bfa_trc(port
, BFA_STATUS_IOC_FAILURE
);
352 return BFA_STATUS_IOC_FAILURE
;
355 if (port
->stats_busy
) {
356 bfa_trc(port
, BFA_STATUS_DEVBUSY
);
357 return BFA_STATUS_DEVBUSY
;
360 m
= (struct bfi_port_get_stats_req_s
*) port
->stats_mb
.msg
;
363 port
->stats_cbfn
= cbfn
;
364 port
->stats_cbarg
= cbarg
;
365 port
->stats_busy
= BFA_TRUE
;
366 bfa_dma_be_addr_set(m
->dma_addr
, port
->stats_dma
.pa
);
368 bfi_h2i_set(m
->mh
, BFI_MC_PORT
, BFI_PORT_H2I_GET_STATS_REQ
,
369 bfa_ioc_portid(port
->ioc
));
370 bfa_ioc_mbox_queue(port
->ioc
, &port
->stats_mb
);
372 return BFA_STATUS_OK
;
376 * bfa_port_clear_stats()
379 * @param[in] Pointer to the Port module data structure.
384 bfa_port_clear_stats(struct bfa_port_s
*port
, bfa_port_stats_cbfn_t cbfn
,
387 struct bfi_port_generic_req_s
*m
;
389 if (!bfa_ioc_is_operational(port
->ioc
)) {
390 bfa_trc(port
, BFA_STATUS_IOC_FAILURE
);
391 return BFA_STATUS_IOC_FAILURE
;
394 if (port
->stats_busy
) {
395 bfa_trc(port
, BFA_STATUS_DEVBUSY
);
396 return BFA_STATUS_DEVBUSY
;
399 m
= (struct bfi_port_generic_req_s
*) port
->stats_mb
.msg
;
401 port
->stats_cbfn
= cbfn
;
402 port
->stats_cbarg
= cbarg
;
403 port
->stats_busy
= BFA_TRUE
;
405 bfi_h2i_set(m
->mh
, BFI_MC_PORT
, BFI_PORT_H2I_CLEAR_STATS_REQ
,
406 bfa_ioc_portid(port
->ioc
));
407 bfa_ioc_mbox_queue(port
->ioc
, &port
->stats_mb
);
409 return BFA_STATUS_OK
;
415 * Port module IOC event handler
417 * @param[in] Pointer to the Port module data structure.
418 * @param[in] IOC event structure
423 bfa_port_notify(void *arg
, enum bfa_ioc_event_e event
)
425 struct bfa_port_s
*port
= (struct bfa_port_s
*) arg
;
428 case BFA_IOC_E_DISABLED
:
429 case BFA_IOC_E_FAILED
:
430 /* Fail any pending get_stats/clear_stats requests */
431 if (port
->stats_busy
) {
432 if (port
->stats_cbfn
)
433 port
->stats_cbfn(port
->stats_cbarg
,
435 port
->stats_cbfn
= NULL
;
436 port
->stats_busy
= BFA_FALSE
;
439 /* Clear any enable/disable is pending */
440 if (port
->endis_pending
) {
441 if (port
->endis_cbfn
)
442 port
->endis_cbfn(port
->endis_cbarg
,
444 port
->endis_cbfn
= NULL
;
445 port
->endis_pending
= BFA_FALSE
;
448 /* clear D-port mode */
449 if (port
->dport_enabled
)
450 bfa_port_set_dportenabled(port
, BFA_FALSE
);
461 * @param[in] port - Pointer to the Port module data structure
462 * ioc - Pointer to the ioc module data structure
463 * dev - Pointer to the device driver module data structure
464 * The device driver specific mbox ISR functions have
465 * this pointer as one of the parameters.
471 bfa_port_attach(struct bfa_port_s
*port
, struct bfa_ioc_s
*ioc
,
472 void *dev
, struct bfa_trc_mod_s
*trcmod
)
480 port
->trcmod
= trcmod
;
482 port
->stats_busy
= BFA_FALSE
;
483 port
->endis_pending
= BFA_FALSE
;
484 port
->stats_cbfn
= NULL
;
485 port
->endis_cbfn
= NULL
;
486 port
->pbc_disabled
= BFA_FALSE
;
487 port
->dport_enabled
= BFA_FALSE
;
489 bfa_ioc_mbox_regisr(port
->ioc
, BFI_MC_PORT
, bfa_port_isr
, port
);
490 bfa_q_qe_init(&port
->ioc_notify
);
491 bfa_ioc_notify_init(&port
->ioc_notify
, bfa_port_notify
, port
);
492 list_add_tail(&port
->ioc_notify
.qe
, &port
->ioc
->notify_q
);
495 * initialize time stamp for stats reset
497 do_gettimeofday(&tv
);
498 port
->stats_reset_time
= tv
.tv_sec
;
504 * bfa_port_set_dportenabled();
506 * Port module- set pbc disabled flag
508 * @param[in] port - Pointer to the Port module data structure
513 bfa_port_set_dportenabled(struct bfa_port_s
*port
, bfa_boolean_t enabled
)
515 port
->dport_enabled
= enabled
;
519 * CEE module specific definitions
523 * bfa_cee_get_attr_isr()
525 * @brief CEE ISR for get-attributes responses from f/w
527 * @param[in] cee - Pointer to the CEE module
528 * status - Return status from the f/w
533 bfa_cee_get_attr_isr(struct bfa_cee_s
*cee
, bfa_status_t status
)
535 struct bfa_cee_lldp_cfg_s
*lldp_cfg
= &cee
->attr
->lldp_remote
;
537 cee
->get_attr_status
= status
;
539 if (status
== BFA_STATUS_OK
) {
541 memcpy(cee
->attr
, cee
->attr_dma
.kva
,
542 sizeof(struct bfa_cee_attr_s
));
543 lldp_cfg
->time_to_live
= be16_to_cpu(lldp_cfg
->time_to_live
);
544 lldp_cfg
->enabled_system_cap
=
545 be16_to_cpu(lldp_cfg
->enabled_system_cap
);
547 cee
->get_attr_pending
= BFA_FALSE
;
548 if (cee
->cbfn
.get_attr_cbfn
) {
550 cee
->cbfn
.get_attr_cbfn(cee
->cbfn
.get_attr_cbarg
, status
);
555 * bfa_cee_get_stats_isr()
557 * @brief CEE ISR for get-stats responses from f/w
559 * @param[in] cee - Pointer to the CEE module
560 * status - Return status from the f/w
565 bfa_cee_get_stats_isr(struct bfa_cee_s
*cee
, bfa_status_t status
)
570 cee
->get_stats_status
= status
;
572 if (status
== BFA_STATUS_OK
) {
574 memcpy(cee
->stats
, cee
->stats_dma
.kva
,
575 sizeof(struct bfa_cee_stats_s
));
576 /* swap the cee stats */
577 buffer
= (u32
*)cee
->stats
;
578 for (i
= 0; i
< (sizeof(struct bfa_cee_stats_s
) /
580 buffer
[i
] = cpu_to_be32(buffer
[i
]);
582 cee
->get_stats_pending
= BFA_FALSE
;
584 if (cee
->cbfn
.get_stats_cbfn
) {
586 cee
->cbfn
.get_stats_cbfn(cee
->cbfn
.get_stats_cbarg
, status
);
591 * bfa_cee_reset_stats_isr()
593 * @brief CEE ISR for reset-stats responses from f/w
595 * @param[in] cee - Pointer to the CEE module
596 * status - Return status from the f/w
601 bfa_cee_reset_stats_isr(struct bfa_cee_s
*cee
, bfa_status_t status
)
603 cee
->reset_stats_status
= status
;
604 cee
->reset_stats_pending
= BFA_FALSE
;
605 if (cee
->cbfn
.reset_stats_cbfn
)
606 cee
->cbfn
.reset_stats_cbfn(cee
->cbfn
.reset_stats_cbarg
, status
);
612 * @brief Returns the size of the DMA memory needed by CEE module
616 * @return Size of DMA region
619 bfa_cee_meminfo(void)
621 return BFA_ROUNDUP(sizeof(struct bfa_cee_attr_s
), BFA_DMA_ALIGN_SZ
) +
622 BFA_ROUNDUP(sizeof(struct bfa_cee_stats_s
), BFA_DMA_ALIGN_SZ
);
626 * bfa_cee_mem_claim()
628 * @brief Initialized CEE DMA Memory
630 * @param[in] cee CEE module pointer
631 * dma_kva Kernel Virtual Address of CEE DMA Memory
632 * dma_pa Physical Address of CEE DMA Memory
637 bfa_cee_mem_claim(struct bfa_cee_s
*cee
, u8
*dma_kva
, u64 dma_pa
)
639 cee
->attr_dma
.kva
= dma_kva
;
640 cee
->attr_dma
.pa
= dma_pa
;
641 cee
->stats_dma
.kva
= dma_kva
+ BFA_ROUNDUP(
642 sizeof(struct bfa_cee_attr_s
), BFA_DMA_ALIGN_SZ
);
643 cee
->stats_dma
.pa
= dma_pa
+ BFA_ROUNDUP(
644 sizeof(struct bfa_cee_attr_s
), BFA_DMA_ALIGN_SZ
);
645 cee
->attr
= (struct bfa_cee_attr_s
*) dma_kva
;
646 cee
->stats
= (struct bfa_cee_stats_s
*) (dma_kva
+ BFA_ROUNDUP(
647 sizeof(struct bfa_cee_attr_s
), BFA_DMA_ALIGN_SZ
));
654 * Send the request to the f/w to fetch CEE attributes.
656 * @param[in] Pointer to the CEE module data structure.
662 bfa_cee_get_attr(struct bfa_cee_s
*cee
, struct bfa_cee_attr_s
*attr
,
663 bfa_cee_get_attr_cbfn_t cbfn
, void *cbarg
)
665 struct bfi_cee_get_req_s
*cmd
;
667 WARN_ON((cee
== NULL
) || (cee
->ioc
== NULL
));
669 if (!bfa_ioc_is_operational(cee
->ioc
)) {
671 return BFA_STATUS_IOC_FAILURE
;
673 if (cee
->get_attr_pending
== BFA_TRUE
) {
675 return BFA_STATUS_DEVBUSY
;
677 cee
->get_attr_pending
= BFA_TRUE
;
678 cmd
= (struct bfi_cee_get_req_s
*) cee
->get_cfg_mb
.msg
;
680 cee
->cbfn
.get_attr_cbfn
= cbfn
;
681 cee
->cbfn
.get_attr_cbarg
= cbarg
;
682 bfi_h2i_set(cmd
->mh
, BFI_MC_CEE
, BFI_CEE_H2I_GET_CFG_REQ
,
683 bfa_ioc_portid(cee
->ioc
));
684 bfa_dma_be_addr_set(cmd
->dma_addr
, cee
->attr_dma
.pa
);
685 bfa_ioc_mbox_queue(cee
->ioc
, &cee
->get_cfg_mb
);
687 return BFA_STATUS_OK
;
691 * bfa_cee_get_stats()
694 * Send the request to the f/w to fetch CEE statistics.
696 * @param[in] Pointer to the CEE module data structure.
702 bfa_cee_get_stats(struct bfa_cee_s
*cee
, struct bfa_cee_stats_s
*stats
,
703 bfa_cee_get_stats_cbfn_t cbfn
, void *cbarg
)
705 struct bfi_cee_get_req_s
*cmd
;
707 WARN_ON((cee
== NULL
) || (cee
->ioc
== NULL
));
709 if (!bfa_ioc_is_operational(cee
->ioc
)) {
711 return BFA_STATUS_IOC_FAILURE
;
713 if (cee
->get_stats_pending
== BFA_TRUE
) {
715 return BFA_STATUS_DEVBUSY
;
717 cee
->get_stats_pending
= BFA_TRUE
;
718 cmd
= (struct bfi_cee_get_req_s
*) cee
->get_stats_mb
.msg
;
720 cee
->cbfn
.get_stats_cbfn
= cbfn
;
721 cee
->cbfn
.get_stats_cbarg
= cbarg
;
722 bfi_h2i_set(cmd
->mh
, BFI_MC_CEE
, BFI_CEE_H2I_GET_STATS_REQ
,
723 bfa_ioc_portid(cee
->ioc
));
724 bfa_dma_be_addr_set(cmd
->dma_addr
, cee
->stats_dma
.pa
);
725 bfa_ioc_mbox_queue(cee
->ioc
, &cee
->get_stats_mb
);
727 return BFA_STATUS_OK
;
731 * bfa_cee_reset_stats()
733 * @brief Clears CEE Stats in the f/w.
735 * @param[in] Pointer to the CEE module data structure.
741 bfa_cee_reset_stats(struct bfa_cee_s
*cee
,
742 bfa_cee_reset_stats_cbfn_t cbfn
, void *cbarg
)
744 struct bfi_cee_reset_stats_s
*cmd
;
746 WARN_ON((cee
== NULL
) || (cee
->ioc
== NULL
));
747 if (!bfa_ioc_is_operational(cee
->ioc
)) {
749 return BFA_STATUS_IOC_FAILURE
;
751 if (cee
->reset_stats_pending
== BFA_TRUE
) {
753 return BFA_STATUS_DEVBUSY
;
755 cee
->reset_stats_pending
= BFA_TRUE
;
756 cmd
= (struct bfi_cee_reset_stats_s
*) cee
->reset_stats_mb
.msg
;
757 cee
->cbfn
.reset_stats_cbfn
= cbfn
;
758 cee
->cbfn
.reset_stats_cbarg
= cbarg
;
759 bfi_h2i_set(cmd
->mh
, BFI_MC_CEE
, BFI_CEE_H2I_RESET_STATS
,
760 bfa_ioc_portid(cee
->ioc
));
761 bfa_ioc_mbox_queue(cee
->ioc
, &cee
->reset_stats_mb
);
763 return BFA_STATUS_OK
;
769 * @brief Handles Mail-box interrupts for CEE module.
771 * @param[in] Pointer to the CEE module data structure.
777 bfa_cee_isr(void *cbarg
, struct bfi_mbmsg_s
*m
)
779 union bfi_cee_i2h_msg_u
*msg
;
780 struct bfi_cee_get_rsp_s
*get_rsp
;
781 struct bfa_cee_s
*cee
= (struct bfa_cee_s
*) cbarg
;
782 msg
= (union bfi_cee_i2h_msg_u
*) m
;
783 get_rsp
= (struct bfi_cee_get_rsp_s
*) m
;
784 bfa_trc(cee
, msg
->mh
.msg_id
);
785 switch (msg
->mh
.msg_id
) {
786 case BFI_CEE_I2H_GET_CFG_RSP
:
787 bfa_trc(cee
, get_rsp
->cmd_status
);
788 bfa_cee_get_attr_isr(cee
, get_rsp
->cmd_status
);
790 case BFI_CEE_I2H_GET_STATS_RSP
:
791 bfa_cee_get_stats_isr(cee
, get_rsp
->cmd_status
);
793 case BFI_CEE_I2H_RESET_STATS_RSP
:
794 bfa_cee_reset_stats_isr(cee
, get_rsp
->cmd_status
);
804 * @brief CEE module IOC event handler.
806 * @param[in] Pointer to the CEE module data structure.
807 * @param[in] IOC event type
813 bfa_cee_notify(void *arg
, enum bfa_ioc_event_e event
)
815 struct bfa_cee_s
*cee
= (struct bfa_cee_s
*) arg
;
820 case BFA_IOC_E_DISABLED
:
821 case BFA_IOC_E_FAILED
:
822 if (cee
->get_attr_pending
== BFA_TRUE
) {
823 cee
->get_attr_status
= BFA_STATUS_FAILED
;
824 cee
->get_attr_pending
= BFA_FALSE
;
825 if (cee
->cbfn
.get_attr_cbfn
) {
826 cee
->cbfn
.get_attr_cbfn(
827 cee
->cbfn
.get_attr_cbarg
,
831 if (cee
->get_stats_pending
== BFA_TRUE
) {
832 cee
->get_stats_status
= BFA_STATUS_FAILED
;
833 cee
->get_stats_pending
= BFA_FALSE
;
834 if (cee
->cbfn
.get_stats_cbfn
) {
835 cee
->cbfn
.get_stats_cbfn(
836 cee
->cbfn
.get_stats_cbarg
,
840 if (cee
->reset_stats_pending
== BFA_TRUE
) {
841 cee
->reset_stats_status
= BFA_STATUS_FAILED
;
842 cee
->reset_stats_pending
= BFA_FALSE
;
843 if (cee
->cbfn
.reset_stats_cbfn
) {
844 cee
->cbfn
.reset_stats_cbfn(
845 cee
->cbfn
.reset_stats_cbarg
,
859 * @brief CEE module-attach API
861 * @param[in] cee - Pointer to the CEE module data structure
862 * ioc - Pointer to the ioc module data structure
863 * dev - Pointer to the device driver module data structure
864 * The device driver specific mbox ISR functions have
865 * this pointer as one of the parameters.
870 bfa_cee_attach(struct bfa_cee_s
*cee
, struct bfa_ioc_s
*ioc
,
873 WARN_ON(cee
== NULL
);
877 bfa_ioc_mbox_regisr(cee
->ioc
, BFI_MC_CEE
, bfa_cee_isr
, cee
);
878 bfa_q_qe_init(&cee
->ioc_notify
);
879 bfa_ioc_notify_init(&cee
->ioc_notify
, bfa_cee_notify
, cee
);
880 list_add_tail(&cee
->ioc_notify
.qe
, &cee
->ioc
->notify_q
);