162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Linux network driver for QLogic BR-series Converged Network Adapter. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci/* 662306a36Sopenharmony_ci * Copyright (c) 2005-2014 Brocade Communications Systems, Inc. 762306a36Sopenharmony_ci * Copyright (c) 2014-2015 QLogic Corporation 862306a36Sopenharmony_ci * All rights reserved 962306a36Sopenharmony_ci * www.qlogic.com 1062306a36Sopenharmony_ci */ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#ifndef __BFA_MSGQ_H__ 1362306a36Sopenharmony_ci#define __BFA_MSGQ_H__ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include "bfa_defs.h" 1662306a36Sopenharmony_ci#include "bfi.h" 1762306a36Sopenharmony_ci#include "bfa_ioc.h" 1862306a36Sopenharmony_ci#include "bfa_cs.h" 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#define BFA_MSGQ_FREE_CNT(_q) \ 2162306a36Sopenharmony_ci (((_q)->consumer_index - (_q)->producer_index - 1) & ((_q)->depth - 1)) 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#define BFA_MSGQ_INDX_ADD(_q_indx, _qe_num, _q_depth) \ 2462306a36Sopenharmony_ci ((_q_indx) = (((_q_indx) + (_qe_num)) & ((_q_depth) - 1))) 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define BFA_MSGQ_CMDQ_NUM_ENTRY 128 2762306a36Sopenharmony_ci#define BFA_MSGQ_CMDQ_SIZE \ 2862306a36Sopenharmony_ci (BFI_MSGQ_CMD_ENTRY_SIZE * BFA_MSGQ_CMDQ_NUM_ENTRY) 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#define BFA_MSGQ_RSPQ_NUM_ENTRY 128 3162306a36Sopenharmony_ci#define BFA_MSGQ_RSPQ_SIZE \ 3262306a36Sopenharmony_ci (BFI_MSGQ_RSP_ENTRY_SIZE * BFA_MSGQ_RSPQ_NUM_ENTRY) 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci#define bfa_msgq_cmd_set(_cmd, _cbfn, _cbarg, _msg_size, _msg_hdr) \ 3562306a36Sopenharmony_cido { \ 3662306a36Sopenharmony_ci (_cmd)->cbfn = (_cbfn); \ 3762306a36Sopenharmony_ci (_cmd)->cbarg = (_cbarg); \ 3862306a36Sopenharmony_ci (_cmd)->msg_size = (_msg_size); \ 3962306a36Sopenharmony_ci (_cmd)->msg_hdr = (_msg_hdr); \ 4062306a36Sopenharmony_ci} while (0) 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cistruct bfa_msgq; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_citypedef void (*bfa_msgq_cmdcbfn_t)(void *cbarg, enum bfa_status status); 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cistruct bfa_msgq_cmd_entry { 4762306a36Sopenharmony_ci struct list_head qe; 4862306a36Sopenharmony_ci bfa_msgq_cmdcbfn_t cbfn; 4962306a36Sopenharmony_ci void *cbarg; 5062306a36Sopenharmony_ci size_t msg_size; 5162306a36Sopenharmony_ci struct bfi_msgq_mhdr *msg_hdr; 5262306a36Sopenharmony_ci}; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cienum bfa_msgq_cmdq_flags { 5562306a36Sopenharmony_ci BFA_MSGQ_CMDQ_F_DB_UPDATE = 1, 5662306a36Sopenharmony_ci}; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cienum cmdq_event; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cistruct bfa_msgq_cmdq { 6162306a36Sopenharmony_ci void (*fsm)(struct bfa_msgq_cmdq *s, enum cmdq_event e); 6262306a36Sopenharmony_ci enum bfa_msgq_cmdq_flags flags; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci u16 producer_index; 6562306a36Sopenharmony_ci u16 consumer_index; 6662306a36Sopenharmony_ci u16 depth; /* FW Q depth is 16 bits */ 6762306a36Sopenharmony_ci struct bfa_dma addr; 6862306a36Sopenharmony_ci struct bfa_mbox_cmd dbell_mb; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci u16 token; 7162306a36Sopenharmony_ci int offset; 7262306a36Sopenharmony_ci int bytes_to_copy; 7362306a36Sopenharmony_ci struct bfa_mbox_cmd copy_mb; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci struct list_head pending_q; /* pending command queue */ 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci struct bfa_msgq *msgq; 7862306a36Sopenharmony_ci}; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_cienum bfa_msgq_rspq_flags { 8162306a36Sopenharmony_ci BFA_MSGQ_RSPQ_F_DB_UPDATE = 1, 8262306a36Sopenharmony_ci}; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_citypedef void (*bfa_msgq_mcfunc_t)(void *cbarg, struct bfi_msgq_mhdr *mhdr); 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_cienum rspq_event; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_cistruct bfa_msgq_rspq { 8962306a36Sopenharmony_ci void (*fsm)(struct bfa_msgq_rspq *s, enum rspq_event e); 9062306a36Sopenharmony_ci enum bfa_msgq_rspq_flags flags; 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci u16 producer_index; 9362306a36Sopenharmony_ci u16 consumer_index; 9462306a36Sopenharmony_ci u16 depth; /* FW Q depth is 16 bits */ 9562306a36Sopenharmony_ci struct bfa_dma addr; 9662306a36Sopenharmony_ci struct bfa_mbox_cmd dbell_mb; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci int nmclass; 9962306a36Sopenharmony_ci struct { 10062306a36Sopenharmony_ci bfa_msgq_mcfunc_t cbfn; 10162306a36Sopenharmony_ci void *cbarg; 10262306a36Sopenharmony_ci } rsphdlr[BFI_MC_MAX]; 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci struct bfa_msgq *msgq; 10562306a36Sopenharmony_ci}; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cistruct bfa_msgq { 10862306a36Sopenharmony_ci struct bfa_msgq_cmdq cmdq; 10962306a36Sopenharmony_ci struct bfa_msgq_rspq rspq; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci struct bfa_wc init_wc; 11262306a36Sopenharmony_ci struct bfa_mbox_cmd init_mb; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci struct bfa_ioc_notify ioc_notify; 11562306a36Sopenharmony_ci struct bfa_ioc *ioc; 11662306a36Sopenharmony_ci}; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ciu32 bfa_msgq_meminfo(void); 11962306a36Sopenharmony_civoid bfa_msgq_memclaim(struct bfa_msgq *msgq, u8 *kva, u64 pa); 12062306a36Sopenharmony_civoid bfa_msgq_attach(struct bfa_msgq *msgq, struct bfa_ioc *ioc); 12162306a36Sopenharmony_civoid bfa_msgq_regisr(struct bfa_msgq *msgq, enum bfi_mclass mc, 12262306a36Sopenharmony_ci bfa_msgq_mcfunc_t cbfn, void *cbarg); 12362306a36Sopenharmony_civoid bfa_msgq_cmd_post(struct bfa_msgq *msgq, 12462306a36Sopenharmony_ci struct bfa_msgq_cmd_entry *cmd); 12562306a36Sopenharmony_civoid bfa_msgq_rsp_copy(struct bfa_msgq *msgq, u8 *buf, size_t buf_len); 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci#endif 128