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 /* Copyright © 2003-2011 Emulex. All rights reserved.  */
23 
24 /*
25  * Driver specific data structures and function prototypes
26  */
27 
28 #ifndef	_OCE_IMPL_H_
29 #define	_OCE_IMPL_H_
30 
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34 
35 #include <sys/types.h>
36 #include <sys/dditypes.h>
37 #include <sys/kstat.h>
38 #include <sys/ddi_intr.h>
39 #include <sys/cmn_err.h>
40 #include <sys/byteorder.h>
41 #include <sys/mac_provider.h>
42 #include <sys/mac_ether.h>
43 #include <sys/gld.h>
44 #include <sys/bitmap.h>
45 #include <sys/ddidmareq.h>
46 #include <sys/kmem.h>
47 #include <sys/ddi.h>
48 #include <sys/sunddi.h>
49 #include <sys/modctl.h>
50 #include <sys/devops.h>
51 #include <sys/systm.h>
52 #include <sys/conf.h>
53 #include <sys/dlpi.h>
54 #include <sys/ethernet.h>
55 #include <sys/strsun.h>
56 #include <sys/pattr.h>
57 #include <sys/strsubr.h>
58 #include <sys/ddifm.h>
59 #include <sys/fm/protocol.h>
60 #include <sys/fm/util.h>
61 #include <sys/fm/io/ddi.h>
62 #include <sys/note.h>
63 #include <sys/pci.h>
64 #include <sys/random.h>
65 #include <oce_hw.h>
66 #include <oce_hw_eth.h>
67 #include <oce_io.h>
68 #include <oce_buf.h>
69 #include <oce_utils.h>
70 #include <oce_version.h>
71 
72 #define	SIZE_128	128
73 #define	SIZE_256	256
74 #define	SIZE_512	512
75 #define	SIZE_1K		1024
76 #define	SIZE_2K		(2 * 1024)
77 #define	SIZE_4K		(4 * 1024)
78 #define	SIZE_8K		(8 * 1024)
79 
80 #define	END		0xdeadface
81 
82 #define	MAX_DEVS		32
83 #define	MAX_RSS_PER_ADAPTER	2
84 
85 #define	OCE_MAX_ETH_FRAME_SIZE	1500
86 #define	OCE_MAX_JUMBO_FRAME_SIZE 9018
87 #define	OCE_MIN_ETH_FRAME_SIZE	64
88 #define	OCE_LLC_SNAP_HDR_LEN	8
89 
90 #define	OCE_MIN_MTU	1500
91 #define	OCE_MAX_MTU	9000
92 #define	OCE_MAX_MCA	32
93 #define	OCE_RQ_MAX_FRAME_SZ 9018
94 
95 #define	OCE_MAX_EQ	8
96 #define	OCE_MAX_CQ	1024
97 #define	OCE_MAX_WQ	8
98 #define	OCE_MAX_RQ	5
99 #define	OCE_MIN_RQ	1
100 
101 #define	OCE_WQ_NUM_BUFFERS		2048
102 #define	OCE_WQ_BUF_SIZE			2048
103 #define	OCE_LSO_MAX_SIZE		(64 * 1024)
104 #define	OCE_DEFAULT_TX_BCOPY_LIMIT	512
105 #define	OCE_DEFAULT_RX_BCOPY_LIMIT	128
106 #define	OCE_DEFAULT_WQ_EQD		16
107 
108 #define	OCE_DEFAULT_TX_RING_SIZE	2048
109 #define	OCE_DEFAULT_RX_RING_SIZE	1024
110 #define	OCE_DEFAULT_WQS			1
111 #if defined(__sparc)
112 #define	OCE_DEFAULT_RQS			OCE_MAX_RQ
113 #else
114 #define	OCE_DEFAULT_RQS			OCE_MIN_RQ
115 #endif
116 
117 #define	OCE_DEFAULT_RX_PKT_PER_INTR (OCE_DEFAULT_RX_RING_SIZE / 2)
118 #define	OCE_DEFAULT_TX_RECLAIM_THRESHOLD 1024
119 #define	OCE_MAX_RQ_POSTS		255
120 #define	OCE_RQ_NUM_BUFFERS		2048
121 #define	OCE_RQ_BUF_SIZE			8192
122 #define	OCE_DEFAULT_RECHARGE_THRESHOLD	OCE_MAX_RQ_POSTS
123 #define	OCE_NUM_USED_VECTORS		2
124 #define	OCE_ITBL_SIZE			64
125 #define	OCE_HKEY_SIZE			40
126 #define	OCE_DMA_ALIGNMENT		0x1000ull
127 
128 #define	OCE_MIN_VECTORS			1
129 
130 #define	OCE_CAPAB_FLAGS	(MBX_RX_IFACE_FLAGS_BROADCAST		| \
131 			MBX_RX_IFACE_FLAGS_PROMISCUOUS		| \
132 			MBX_RX_IFACE_FLAGS_UNTAGGED		| \
133 			MBX_RX_IFACE_FLAGS_MCAST_PROMISCUOUS	| \
134 			MBX_RX_IFACE_FLAGS_PASS_L3L4)
135 
136 #define	OCE_CAPAB_ENABLE	(MBX_RX_IFACE_FLAGS_BROADCAST	| \
137 				MBX_RX_IFACE_FLAGS_UNTAGGED	| \
138 				MBX_RX_IFACE_FLAGS_PASS_L3L4)
139 
140 #define	OCE_FM_CAPABILITY	(DDI_FM_EREPORT_CAPABLE		| \
141 				DDI_FM_ACCCHK_CAPABLE		| \
142 				DDI_FM_DMACHK_CAPABLE)
143 
144 #define	OCE_DEFAULT_RSS_TYPE	(RSS_ENABLE_IPV4|RSS_ENABLE_TCP_IPV4)
145 
146 /* flow control definitions */
147 #define	OCE_FC_NONE	0x00000000
148 #define	OCE_FC_TX	0x00000001
149 #define	OCE_FC_RX	0x00000002
150 #define	OCE_DEFAULT_FLOW_CONTROL	(OCE_FC_TX | OCE_FC_RX)
151 
152 /* PCI Information */
153 #define	OCE_DEV_CFG_BAR	0x01
154 #define	OCE_PCI_CSR_BAR	0x02
155 #define	OCE_PCI_DB_BAR	0x03
156 
157 /* macros for device IO */
158 #define	OCE_READ_REG32(handle, addr) ddi_get32(handle, addr)
159 #define	OCE_WRITE_REG32(handle, addr, value) ddi_put32(handle, addr, value)
160 
161 #define	OCE_CSR_READ32(dev, offset) \
162 	OCE_READ_REG32((dev)->csr_handle, \
163 	    (uint32_t *)(void *)((dev)->csr_addr + offset))
164 
165 #define	OCE_CSR_WRITE32(dev, offset, value) \
166 	OCE_WRITE_REG32((dev)->csr_handle, \
167 	    (uint32_t *)(void *)((dev)->csr_addr + offset), value)
168 
169 #define	OCE_DB_READ32(dev, offset) \
170 	OCE_READ_REG32((dev)->db_handle, \
171 	    (uint32_t *)(void *)((dev)->db_addr + offset))
172 
173 #define	OCE_DB_WRITE32(dev, offset, value) \
174 	OCE_WRITE_REG32((dev)->db_handle, \
175 		(uint32_t *)(void *)((dev)->db_addr + offset), value)
176 
177 #define	OCE_CFG_READ32(dev, offset) \
178 	OCE_READ_REG32((dev)->dev_cfg_handle, \
179 	    (uint32_t *)(void *)((dev)->dev_cfg_addr + offset))
180 
181 #define	OCE_CFG_WRITE32(dev, offset, value) \
182 	OCE_WRITE_REG32((dev)->dev_cfg_handle, \
183 	    (uint32_t *)(void *)((dev)->dev_cfg_addr + offset), value)
184 
185 #define	OCE_PCI_FUNC(dev) \
186 	((OCE_CFG_READ32(dev, PCICFG_INTR_CTRL) \
187 	    >> HOSTINTR_PFUNC_SHIFT) & HOSTINTR_PFUNC_MASK)
188 
189 #define	DEV_LOCK(dev)	mutex_enter(&dev->dev_lock)
190 
191 #define	DEV_UNLOCK(dev)	mutex_exit(&dev->dev_lock)
192 
193 enum oce_ring_size {
194 	RING_SIZE_256  = 256,
195 	RING_SIZE_512  = 512,
196 	RING_SIZE_1024 = 1024,
197 	RING_SIZE_2048 = 2048
198 };
199 
200 enum oce_driver_state {
201 	STATE_INIT		= 0x2,
202 	STATE_MAC_STARTED	= 0x4,
203 	STATE_QUIESCE		= 0x8,
204 	STATE_MAC_STOPPING	= 0x10
205 };
206 
207 struct oce_dev {
208 	kmutex_t bmbx_lock;		/* Bootstrap Lock */
209 	kmutex_t dev_lock;		/* lock for device */
210 
211 	/* Queues relarted */
212 	struct oce_wq *wq[OCE_MAX_WQ];	/* TXQ Array */
213 	struct oce_rq *rq[OCE_MAX_RQ];	/* RXQ Array */
214 	struct oce_cq *cq[OCE_MAX_CQ];	/* Completion Queues */
215 	struct oce_eq *eq[OCE_MAX_EQ];	/* Event Queues	*/
216 	struct oce_mq *mq;		/* MQ ring */
217 
218 	/* driver state  machine */
219 	enum oce_driver_state state;	/* state */
220 	boolean_t suspended;		/* CPR */
221 	uint32_t attach_state;		/* attach progress */
222 
223 	oce_dma_buf_t *bmbx;		/* Bootstrap MailBox */
224 
225 	uint32_t tx_bcopy_limit;	/* TX BCOPY Limit */
226 	uint32_t rx_bcopy_limit;	/* RX BCOPY Limit */
227 	uint32_t tx_reclaim_threshold;	/* Tx reclaim */
228 	uint32_t rx_pkt_per_intr;	/* Rx pkts processed per intr */
229 
230 	/* BARS */
231 	int num_bars;
232 	ddi_acc_handle_t pci_cfg_handle; /* Config space handle */
233 	ddi_acc_handle_t cfg_handle;	/* MMIO PCI Config Space Regs */
234 	ddi_acc_handle_t csr_handle;	/* MMIO Control Status Regs */
235 	caddr_t csr_addr;
236 	caddr_t db_addr;
237 	caddr_t dev_cfg_addr;
238 	ddi_acc_handle_t db_handle;	/* MMIO DoorBell Area */
239 	ddi_acc_handle_t dev_cfg_handle; /* MMIO CONFIG SPACE */
240 	mac_handle_t mac_handle;	/* MAC HANDLE	*/
241 
242 	/* device stats */
243 	kstat_t *oce_kstats;		/* NIC STATS */
244 	oce_dma_buf_t *stats_dbuf;	/* STATS BUFFER */
245 	struct mbx_get_nic_stats *hw_stats;
246 	/* dev stats */
247 	uint32_t tx_errors;
248 	uint32_t tx_noxmtbuf;
249 
250 	/* link status */
251 	link_state_t link_status;
252 	int32_t link_speed;		/* Link speed in Mbps */
253 
254 	/* OS */
255 	uint32_t dev_id;	/* device ID or instance number */
256 	dev_info_t *dip;	/* device info structure for device tree node */
257 
258 	/* Interrupt related */
259 	int intr_type;		/* INTR TYPE USED */
260 	int num_vectors;	/* number of vectors used */
261 	uint_t intr_pri;	/* interrupt priority */
262 	int intr_cap;
263 	ddi_intr_handle_t *htable;	/* intr handler table */
264 	int32_t hsize;
265 
266 	/* device configuration */
267 	uint32_t rq_max_bufs;		/* maximum prealloced buffers */
268 	uint32_t rq_frag_size;		/* Rxq fragment size */
269 	enum oce_ring_size tx_ring_size;
270 	enum oce_ring_size rx_ring_size;
271 	uint32_t neqs;			/* No of event queues */
272 	uint32_t nwqs;			/* No of Work Queues */
273 	uint32_t nrqs;			/* No of Receive Queues */
274 	uint32_t nifs;			/* No of interfaces created */
275 	uint32_t tx_rings;
276 	uint32_t rx_rings;
277 	uint32_t pmac_id;		/* used to add or remove mac */
278 	uint8_t unicast_addr[ETHERADDRL];
279 	uint32_t num_smac;
280 	uint32_t mtu;
281 	int32_t fm_caps;
282 	boolean_t rss_enable;		/* RSS support */
283 	boolean_t lso_capable;		/* LSO */
284 	boolean_t promisc;		/* PROMISC MODE */
285 	uint32_t if_cap_flags;		/* IF CAPAB */
286 	uint32_t flow_control;		/* flow control settings */
287 	uint8_t mac_addr[ETHERADDRL];	/* hardware mac address */
288 	uint16_t num_mca;		/* MCA supported */
289 	struct ether_addr multi_cast[OCE_MAX_MCA];	/* MC TABLE */
290 	uint32_t cookie;		/* used during fw download */
291 
292 	/* fw config: only relevant fields */
293 	uint32_t config_number;
294 	uint32_t asic_revision;
295 	uint32_t port_id;
296 	uint32_t function_mode;
297 	uint32_t function_caps;
298 	uint32_t chip_rev;		/* Chip revision */
299 	uint32_t max_tx_rings;		/* Max Rx rings available */
300 	uint32_t max_rx_rings;		/* Max rx rings available */
301 	int32_t if_id;			/* IF ID */
302 	uint8_t fn;			/* function number */
303 	uint8_t fw_version[32];		/* fw version string */
304 
305 	/* PCI related */
306 	uint16_t vendor_id;
307 	uint16_t device_id;
308 	uint16_t subsys_id;
309 	uint16_t subvendor_id;
310 	uint8_t pci_bus;
311 	uint8_t pci_device;
312 	uint8_t pci_function;
313 	uint8_t dev_list_index;
314 
315 	/* Logging related */
316 	uint16_t mod_mask;		/* Log Mask */
317 	int16_t severity;		/* Log level */
318 };
319 
320 /* GLD handler functions */
321 int oce_m_start(void *arg);
322 void oce_m_stop(void *arg);
323 mblk_t *oce_m_send(void *arg, mblk_t *pkt);
324 int oce_m_promiscuous(void *arg, boolean_t enable);
325 int oce_m_multicast(void *arg, boolean_t add, const uint8_t *mca);
326 int oce_m_unicast(void *arg, const uint8_t *uca);
327 boolean_t oce_m_getcap(void *arg, mac_capab_t cap, void *data);
328 void oce_m_ioctl(void *arg, queue_t *wq, mblk_t *mp);
329 int oce_m_setprop(void *arg, const char *name, mac_prop_id_t id,
330     uint_t size, const void *val);
331 int oce_m_getprop(void *arg, const char *name, mac_prop_id_t id,
332     uint_t size, void *val);
333 void oce_m_propinfo(void *arg, const char *pr_name, mac_prop_id_t pr_num,
334     mac_prop_info_handle_t prh);
335 
336 int oce_m_stat(void *arg, uint_t stat, uint64_t *val);
337 
338 /* Hardware start/stop functions */
339 int oce_start(struct oce_dev *dev);
340 void oce_stop(struct oce_dev *dev);
341 int oce_identify_hw(struct oce_dev *dev);
342 int oce_get_bdf(struct oce_dev *dev);
343 
344 /* FMA support Functions */
345 void oce_fm_init(struct oce_dev *dev);
346 void oce_fm_fini(struct oce_dev *dev);
347 void oce_set_dma_fma_flags(int fm_caps);
348 void oce_set_reg_fma_flags(int fm_caps);
349 void oce_set_tx_map_dma_fma_flags(int fm_caps);
350 void oce_fm_ereport(struct oce_dev *dev, char *detail);
351 int  oce_fm_check_acc_handle(struct oce_dev *dev,
352     ddi_acc_handle_t acc_handle);
353 int  oce_fm_check_dma_handle(struct oce_dev *dev,
354     ddi_dma_handle_t dma_handle);
355 
356 /* Interrupt handling */
357 int oce_setup_intr(struct oce_dev *dev);
358 int oce_teardown_intr(struct oce_dev *dev);
359 int oce_setup_handlers(struct oce_dev *dev);
360 void oce_remove_handler(struct oce_dev *dev);
361 void oce_ei(struct oce_dev *dev);
362 void oce_di(struct oce_dev *dev);
363 void oce_chip_ei(struct oce_dev *dev);
364 void oce_chip_di(struct oce_dev *dev);
365 
366 /* HW initialisation */
367 int oce_hw_init(struct oce_dev *dev);
368 void oce_hw_fini(struct oce_dev *dev);
369 int oce_setup_adapter(struct oce_dev *dev);
370 void oce_unsetup_adapter(struct oce_dev *dev);
371 
372 #ifdef __cplusplus
373 }
374 #endif
375 
376 #endif /* _OCE_IMPL_H_ */
377