xref: /openbmc/linux/drivers/net/ethernet/brocade/bna/bfa_msgq.h (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
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