1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Linux network driver for QLogic BR-series Converged Network Adapter. 4 */ 5 /* 6 * Copyright (c) 2005-2014 Brocade Communications Systems, Inc. 7 * Copyright (c) 2014-2015 QLogic Corporation 8 * All rights reserved 9 * www.qlogic.com 10 */ 11 12 #ifndef __BFA_MSGQ_H__ 13 #define __BFA_MSGQ_H__ 14 15 #include "bfa_defs.h" 16 #include "bfi.h" 17 #include "bfa_ioc.h" 18 #include "bfa_cs.h" 19 20 #define BFA_MSGQ_FREE_CNT(_q) \ 21 (((_q)->consumer_index - (_q)->producer_index - 1) & ((_q)->depth - 1)) 22 23 #define BFA_MSGQ_INDX_ADD(_q_indx, _qe_num, _q_depth) \ 24 ((_q_indx) = (((_q_indx) + (_qe_num)) & ((_q_depth) - 1))) 25 26 #define BFA_MSGQ_CMDQ_NUM_ENTRY 128 27 #define BFA_MSGQ_CMDQ_SIZE \ 28 (BFI_MSGQ_CMD_ENTRY_SIZE * BFA_MSGQ_CMDQ_NUM_ENTRY) 29 30 #define BFA_MSGQ_RSPQ_NUM_ENTRY 128 31 #define BFA_MSGQ_RSPQ_SIZE \ 32 (BFI_MSGQ_RSP_ENTRY_SIZE * BFA_MSGQ_RSPQ_NUM_ENTRY) 33 34 #define bfa_msgq_cmd_set(_cmd, _cbfn, _cbarg, _msg_size, _msg_hdr) \ 35 do { \ 36 (_cmd)->cbfn = (_cbfn); \ 37 (_cmd)->cbarg = (_cbarg); \ 38 (_cmd)->msg_size = (_msg_size); \ 39 (_cmd)->msg_hdr = (_msg_hdr); \ 40 } while (0) 41 42 struct bfa_msgq; 43 44 typedef void (*bfa_msgq_cmdcbfn_t)(void *cbarg, enum bfa_status status); 45 46 struct bfa_msgq_cmd_entry { 47 struct list_head qe; 48 bfa_msgq_cmdcbfn_t cbfn; 49 void *cbarg; 50 size_t msg_size; 51 struct bfi_msgq_mhdr *msg_hdr; 52 }; 53 54 enum bfa_msgq_cmdq_flags { 55 BFA_MSGQ_CMDQ_F_DB_UPDATE = 1, 56 }; 57 58 enum cmdq_event; 59 60 struct bfa_msgq_cmdq { 61 void (*fsm)(struct bfa_msgq_cmdq *s, enum cmdq_event e); 62 enum bfa_msgq_cmdq_flags flags; 63 64 u16 producer_index; 65 u16 consumer_index; 66 u16 depth; /* FW Q depth is 16 bits */ 67 struct bfa_dma addr; 68 struct bfa_mbox_cmd dbell_mb; 69 70 u16 token; 71 int offset; 72 int bytes_to_copy; 73 struct bfa_mbox_cmd copy_mb; 74 75 struct list_head pending_q; /* pending command queue */ 76 77 struct bfa_msgq *msgq; 78 }; 79 80 enum bfa_msgq_rspq_flags { 81 BFA_MSGQ_RSPQ_F_DB_UPDATE = 1, 82 }; 83 84 typedef void (*bfa_msgq_mcfunc_t)(void *cbarg, struct bfi_msgq_mhdr *mhdr); 85 86 enum rspq_event; 87 88 struct bfa_msgq_rspq { 89 void (*fsm)(struct bfa_msgq_rspq *s, enum rspq_event e); 90 enum bfa_msgq_rspq_flags flags; 91 92 u16 producer_index; 93 u16 consumer_index; 94 u16 depth; /* FW Q depth is 16 bits */ 95 struct bfa_dma addr; 96 struct bfa_mbox_cmd dbell_mb; 97 98 int nmclass; 99 struct { 100 bfa_msgq_mcfunc_t cbfn; 101 void *cbarg; 102 } rsphdlr[BFI_MC_MAX]; 103 104 struct bfa_msgq *msgq; 105 }; 106 107 struct bfa_msgq { 108 struct bfa_msgq_cmdq cmdq; 109 struct bfa_msgq_rspq rspq; 110 111 struct bfa_wc init_wc; 112 struct bfa_mbox_cmd init_mb; 113 114 struct bfa_ioc_notify ioc_notify; 115 struct bfa_ioc *ioc; 116 }; 117 118 u32 bfa_msgq_meminfo(void); 119 void bfa_msgq_memclaim(struct bfa_msgq *msgq, u8 *kva, u64 pa); 120 void bfa_msgq_attach(struct bfa_msgq *msgq, struct bfa_ioc *ioc); 121 void bfa_msgq_regisr(struct bfa_msgq *msgq, enum bfi_mclass mc, 122 bfa_msgq_mcfunc_t cbfn, void *cbarg); 123 void bfa_msgq_cmd_post(struct bfa_msgq *msgq, 124 struct bfa_msgq_cmd_entry *cmd); 125 void bfa_msgq_rsp_copy(struct bfa_msgq *msgq, u8 *buf, size_t buf_len); 126 127 #endif 128