1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2009 Emulex.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*
28  * Driver specific data structures and function prototypes
29  */
30 
31 #ifndef	_OCE_IMPL_H_
32 #define	_OCE_IMPL_H_
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 #include <sys/types.h>
39 #include <sys/dditypes.h>
40 #include <sys/kstat.h>
41 #include <sys/ddi_intr.h>
42 #include <sys/cmn_err.h>
43 #include <sys/byteorder.h>
44 #include <sys/mac_provider.h>
45 #include <sys/mac_ether.h>
46 #include <sys/vlan.h>
47 #include <sys/bitmap.h>
48 #include <sys/ddidmareq.h>
49 #include <sys/kmem.h>
50 #include <sys/ddi.h>
51 #include <sys/sunddi.h>
52 #include <sys/modctl.h>
53 #include <sys/devops.h>
54 #include <sys/systm.h>
55 #include <sys/conf.h>
56 #include <sys/dlpi.h>
57 #include <sys/ethernet.h>
58 #include <sys/strsun.h>
59 #include <sys/pattr.h>
60 #include <sys/strsubr.h>
61 #include <sys/ddifm.h>
62 #include <sys/fm/protocol.h>
63 #include <sys/fm/util.h>
64 #include <sys/fm/io/ddi.h>
65 #include <sys/note.h>
66 #include <oce_hw.h>
67 #include <oce_hw_eth.h>
68 #include <oce_io.h>
69 #include <oce_buf.h>
70 #include <oce_utils.h>
71 #include <oce_version.h>
72 
73 #define	OCE_MIN_MTU	1500
74 #define	OCE_MAX_MTU	9000
75 #define	OCE_MAX_MCA	32
76 #define	OCE_RQ_MAX_FRAME_SZ 9018
77 
78 #define	OCE_MAX_EQ	8
79 #define	OCE_MAX_CQ	1024
80 #define	OCE_MAX_WQ	8
81 #define	OCE_WQ_NUM_BUFFERS	2048
82 #define	OCE_WQ_BUF_SIZE	2048
83 #define	OCE_LSO_MAX_SIZE (32 * 1024)
84 #define	OCE_DEFAULT_TX_BCOPY_LIMIT	1024
85 #define	OCE_DEFAULT_RX_BCOPY_LIMIT	128
86 #define	OCE_DEFAULT_WQ_EQD	16
87 
88 #define	OCE_MAX_RQ		8
89 #define	OCE_MAX_RQ_POSTS	255
90 #define	OCE_RQ_NUM_BUFFERS	2048
91 #define	OCE_RQ_BUF_SIZE		2048
92 #define	OCE_DEFAULT_RECHARGE_THRESHOLD	OCE_MAX_RQ_POSTS
93 #define	OCE_NUM_USED_VECTORS    2
94 #define	OCE_DMA_ALIGNMENT   0x1000ull
95 
96 #define	OCE_DEFAULT_TX_RING_SIZE    2048
97 #define	OCE_DEFAULT_RX_RING_SIZE    1024
98 
99 #define	OCE_INVAL_IF_ID			-1
100 
101 #define	OCE_DEFAULT_IF_CAP	(MBX_RX_IFACE_FLAGS_PROMISCUOUS	| \
102 			MBX_RX_IFACE_FLAGS_BROADCAST		| \
103 			MBX_RX_IFACE_FLAGS_UNTAGGED		| \
104 			MBX_RX_IFACE_FLAGS_MCAST_PROMISCUOUS	| \
105 			MBX_RX_IFACE_FLAGS_PASS_L3L4)
106 
107 #define	OCE_DEFAULT_IF_CAP_EN	(MBX_RX_IFACE_FLAGS_BROADCAST	| \
108 				MBX_RX_IFACE_FLAGS_UNTAGGED	| \
109 				MBX_RX_IFACE_FLAGS_MCAST_PROMISCUOUS	| \
110 				MBX_RX_IFACE_FLAGS_PASS_L3L4)
111 
112 #define	OCE_RX_FILTER_GLOBAL_FLAGS	(NTWK_RX_FILTER_IP_CKSUM | \
113 					NTWK_RX_FILTER_TCP_CKSUM | \
114 					NTWK_RX_FILTER_UDP_CKSUM | \
115 					NTWK_RX_FILTER_STRIP_CRC)
116 
117 
118 #define	OCE_FM_CAPABILITY		DDI_FM_EREPORT_CAPABLE	|	\
119 					DDI_FM_ACCCHK_CAPABLE	|	\
120 					DDI_FM_DMACHK_CAPABLE
121 
122 /* flow control definitions */
123 #define	OCE_FC_NONE	0x00000000
124 #define	OCE_FC_TX	0x00000001
125 #define	OCE_FC_RX	0x00000002
126 #define	OCE_DEFAULT_FLOW_CONTROL	(OCE_FC_TX | OCE_FC_RX)
127 
128 /* PCI Information */
129 #define	OCE_DEV_CFG_BAR	0x01
130 #define	OCE_PCI_CSR_BAR	0x02
131 #define	OCE_PCI_DB_BAR	0x03
132 
133 /* macros for device IO */
134 #define	OCE_READ_REG32(handle, addr) ddi_get32(handle, addr)
135 #define	OCE_WRITE_REG32(handle, addr, value) ddi_put32(handle, addr, value)
136 
137 #define	OCE_CSR_READ32(dev, offset) \
138 	OCE_READ_REG32((dev)->csr_handle, \
139 	    (uint32_t *)(void *)((dev)->csr_addr + offset))
140 
141 #define	OCE_CSR_WRITE32(dev, offset, value) \
142 	OCE_WRITE_REG32((dev)->csr_handle, \
143 	    (uint32_t *)(void *)((dev)->csr_addr + offset), value)
144 
145 #define	OCE_DB_READ32(dev, offset) \
146 	OCE_READ_REG32((dev)->db_handle, \
147 	    (uint32_t *)(void *)((dev)->db_addr + offset))
148 
149 #define	OCE_DB_WRITE32(dev, offset, value) \
150 	OCE_WRITE_REG32((dev)->db_handle, \
151 		(uint32_t *)(void *)((dev)->db_addr + offset), value)
152 
153 #define	OCE_CFG_READ32(dev, offset) \
154 	OCE_READ_REG32((dev)->dev_cfg_handle, \
155 	    (uint32_t *)(void *)((dev)->dev_cfg_addr + offset))
156 
157 #define	OCE_CFG_WRITE32(dev, offset, value) \
158 	OCE_WRITE_REG32((dev)->dev_cfg_handle, \
159 	    (uint32_t *)(void *)((dev)->dev_cfg_addr + offset), value)
160 
161 #define	OCE_PCI_FUNC(dev) \
162 	((OCE_CFG_READ32(dev, PCICFG_INTR_CTRL) \
163 	    >> HOSTINTR_PFUNC_SHIFT) & HOSTINTR_PFUNC_MASK)
164 
165 #define	DEV_LOCK(dev)	mutex_enter(&dev->dev_lock)
166 
167 #define	DEV_UNLOCK(dev)	mutex_exit(&dev->dev_lock)
168 
169 enum oce_ring_size {
170 	RING_SIZE_256  = 256,
171 	RING_SIZE_512  = 512,
172 	RING_SIZE_1024 = 1024,
173 	RING_SIZE_2048 = 2048
174 };
175 
176 enum oce_driver_state {
177 	STATE_INIT		= 0x2,
178 	STATE_MAC_STARTED	= 0x4,
179 	STATE_QUIESCE		= 0x8,
180 	STATE_MAC_STOPPING	= 0x10
181 };
182 
183 struct oce_dev {
184 	uint32_t dev_id;		/* device ID or instance number */
185 	int32_t if_id; 			/* IF ID */
186 	uint8_t fn; 			/* function number */
187 	uint8_t fw_version[32]; 	/* fw version string */
188 	enum oce_driver_state state; 	/* state */
189 	struct oce_mq *mq;		/* MQ ring */
190 	oce_dma_buf_t *bmbx;		/* Bootstrap MailBox	*/
191 	kmutex_t bmbx_lock;		/* Bootstrap Lock	*/
192 	uint16_t mod_mask;		/* Log Mask 	*/
193 	int16_t severity;		/* Log level	*/
194 	struct oce_wq *wq[OCE_MAX_WQ];	/* TXQ Array */
195 	struct oce_rq *rq[OCE_MAX_RQ];	/* RXQ Array */
196 	struct oce_cq *cq[OCE_MAX_CQ];	/* Completion Queues */
197 	struct oce_eq *eq[OCE_MAX_EQ];	/* Event Queues	*/
198 	uint32_t tx_bcopy_limit;	/* TX BCOPY Limit */
199 	uint32_t rx_bcopy_limit;	/* RX BCOPY Limit */
200 
201 	uint32_t cookie;
202 
203 	clock_t stat_ticks;
204 	uint32_t in_stats;
205 
206 	/* Add implementation specific stuff here */
207 	ddi_acc_handle_t pci_cfg_handle; /* Config space handle */
208 	int num_bars;
209 	ddi_acc_handle_t cfg_handle;	/* MMIO PCI Config Space Regs */
210 	caddr_t csr_addr;
211 	ddi_acc_handle_t csr_handle;	/* MMIO Control Status Regs */
212 	caddr_t db_addr;
213 	ddi_acc_handle_t db_handle;	/* MMIO DoorBell Area */
214 	caddr_t dev_cfg_addr;
215 	ddi_acc_handle_t dev_cfg_handle;	/* MMIO CONFIG SPACE */
216 	mac_handle_t mac_handle;	/* MAC HANDLE	*/
217 
218 	/* device info structure for device tree node */
219 	dev_info_t *dip;
220 	kstat_t *oce_kstats;		/* NIC STATS */
221 	oce_dma_buf_t *stats_dbuf;	/* STATS BUFFER */
222 	struct mbx_get_nic_stats *hw_stats;
223 	/* dev stats */
224 	uint32_t tx_errors;
225 	uint32_t tx_noxmtbuf;
226 
227 	/* link status */
228 	struct link_status link;
229 
230 	/* flow control settings */
231 	uint32_t flow_control;
232 
233 	/* the type of interrupts supported */
234 	int intr_types;
235 	/* number of vectors used */
236 	int num_vectors;
237 	/* interrupt priority */
238 	uint_t intr_pri;
239 	int intr_cap;
240 	/* intr handler table */
241 	ddi_intr_handle_t *htable;
242 
243 	/* lock for device */
244 	kmutex_t dev_lock;
245 
246 	/* hardware mac address */
247 	uint8_t mac_addr[ETHERADDRL];
248 
249 	/* Current Multicast address table that we have set to h/w */
250 	uint16_t num_mca;
251 	struct ether_addr multi_cast[OCE_MAX_MCA];
252 
253 	/* device configuration */
254 	uint32_t pmac_id; /* used to add or remove mac */
255 	uint8_t unicast_addr[ETHERADDRL];
256 	uint32_t mtu;
257 	enum oce_ring_size tx_ring_size;
258 	enum oce_ring_size rx_ring_size;
259 	boolean_t lso_capable;
260 	boolean_t promisc;
261 	uint32_t if_cap_flags;
262 	int32_t  fm_caps;
263 	uint32_t  attach_state;
264 	boolean_t suspended;
265 	uint32_t  neqs;	/* No of event queues */
266 	uint32_t  nwqs;	/* No of Work Queues */
267 	uint32_t  nrqs;	/* No of Receive Queues */
268 	uint32_t  nifs; /* No of interfaces created */
269 
270 	/* fw config: only relevant fields */
271 	uint32_t    config_number;
272 	uint32_t    asic_revision;
273 	uint32_t    port_id;
274 	uint32_t    function_mode;
275 };
276 
277 /* GLD handler functions */
278 int oce_m_start(void *arg);
279 void oce_m_stop(void *arg);
280 mblk_t *oce_m_send(void *arg, mblk_t *pkt);
281 int oce_m_promiscuous(void *arg, boolean_t enable);
282 int oce_m_multicast(void *arg, boolean_t add, const uint8_t *mca);
283 int oce_m_unicast(void *arg, const uint8_t *uca);
284 boolean_t oce_m_getcap(void *arg, mac_capab_t cap, void *data);
285 void oce_m_ioctl(void *arg, queue_t *wq, mblk_t *mp);
286 int oce_m_setprop(void *arg, const char *name, mac_prop_id_t id,
287     uint_t size, const void *val);
288 int oce_m_getprop(void *arg, const char *name, mac_prop_id_t id,
289     uint_t flags, uint_t size, void *val, uint_t *perm);
290 int oce_m_stat(void *arg, uint_t stat, uint64_t *val);
291 
292 /* Hardware start/stop functions */
293 int oce_start(struct oce_dev *dev);
294 void oce_stop(struct oce_dev *dev);
295 
296 /* FMA support Functions */
297 void oce_fm_init(struct oce_dev *dev);
298 void oce_fm_fini(struct oce_dev *dev);
299 void oce_set_dma_fma_flags(int fm_caps);
300 void oce_set_reg_fma_flags(int fm_caps);
301 void oce_set_tx_map_dma_fma_flags(int fm_caps);
302 void oce_fm_ereport(struct oce_dev *dev, char *detail);
303 int  oce_fm_check_acc_handle(struct oce_dev *dev,
304     ddi_acc_handle_t acc_handle);
305 int  oce_fm_check_dma_handle(struct oce_dev *dev,
306     ddi_dma_handle_t dma_handle);
307 
308 /* Interrupt handling */
309 int oce_setup_intr(struct oce_dev *dev);
310 int oce_alloc_intr(struct oce_dev *dev);
311 int oce_teardown_intr(struct oce_dev *dev);
312 int oce_setup_handlers(struct oce_dev *dev);
313 void oce_remove_handler(struct oce_dev *dev);
314 void oce_ei(struct oce_dev *dev);
315 void oce_di(struct oce_dev *dev);
316 void oce_chip_ei(struct oce_dev *dev);
317 void oce_chip_di(struct oce_dev *dev);
318 
319 /* HW initialisation */
320 int oce_hw_init(struct oce_dev *dev);
321 void oce_hw_fini(struct oce_dev *dev);
322 int oce_setup_adapter(struct oce_dev *dev);
323 void oce_unsetup_adapter(struct oce_dev *dev);
324 
325 #ifdef __cplusplus
326 }
327 #endif
328 
329 #endif /* _OCE_IMPL_H_ */
330