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