summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/fibre-channel/fca/oce/oce_impl.h
blob: 296e46d35765eca40ced4a794214d7c3813a1cd0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/* Copyright © 2003-2011 Emulex. All rights reserved.  */

/*
 * Driver specific data structures and function prototypes
 */

#ifndef	_OCE_IMPL_H_
#define	_OCE_IMPL_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <sys/types.h>
#include <sys/dditypes.h>
#include <sys/kstat.h>
#include <sys/ddi_intr.h>
#include <sys/cmn_err.h>
#include <sys/byteorder.h>
#include <sys/mac_provider.h>
#include <sys/mac_ether.h>
#include <sys/gld.h>
#include <sys/bitmap.h>
#include <sys/ddidmareq.h>
#include <sys/kmem.h>
#include <sys/ddi.h>
#include <sys/sunddi.h>
#include <sys/modctl.h>
#include <sys/devops.h>
#include <sys/systm.h>
#include <sys/conf.h>
#include <sys/dlpi.h>
#include <sys/ethernet.h>
#include <sys/strsun.h>
#include <sys/pattr.h>
#include <sys/strsubr.h>
#include <sys/ddifm.h>
#include <sys/fm/protocol.h>
#include <sys/fm/util.h>
#include <sys/fm/io/ddi.h>
#include <sys/note.h>
#include <sys/pci.h>
#include <sys/random.h>
#include <oce_hw.h>
#include <oce_hw_eth.h>
#include <oce_io.h>
#include <oce_buf.h>
#include <oce_utils.h>
#include <oce_version.h>

#define	SIZE_128	128
#define	SIZE_256	256
#define	SIZE_512	512
#define	SIZE_1K		1024
#define	SIZE_2K		(2 * 1024)
#define	SIZE_4K		(4 * 1024)
#define	SIZE_8K		(8 * 1024)

#define	END		0xdeadface

#define	MAX_DEVS		32
#define	MAX_RSS_PER_ADAPTER	2

#define	OCE_MAX_ETH_FRAME_SIZE	1500
#define	OCE_MAX_JUMBO_FRAME_SIZE 9018
#define	OCE_MIN_ETH_FRAME_SIZE	64
#define	OCE_LLC_SNAP_HDR_LEN	8

#define	OCE_MIN_MTU	1500
#define	OCE_MAX_MTU	9000
#define	OCE_MAX_MCA	32
#define	OCE_RQ_MAX_FRAME_SZ 9018

#define	OCE_MAX_EQ	8
#define	OCE_MAX_CQ	1024
#define	OCE_MAX_WQ	8
#define	OCE_MAX_RQ	5
#define	OCE_MIN_RQ	1

#define	OCE_WQ_NUM_BUFFERS		2048
#define	OCE_WQ_BUF_SIZE			2048
#define	OCE_LSO_MAX_SIZE		(64 * 1024)
#define	OCE_DEFAULT_TX_BCOPY_LIMIT	512
#define	OCE_DEFAULT_RX_BCOPY_LIMIT	128
#define	OCE_DEFAULT_WQ_EQD		16

#define	OCE_DEFAULT_TX_RING_SIZE	2048
#define	OCE_DEFAULT_RX_RING_SIZE	1024
#define	OCE_DEFAULT_WQS			1
#if defined(__sparc)
#define	OCE_DEFAULT_RQS			OCE_MAX_RQ
#else
#define	OCE_DEFAULT_RQS			OCE_MIN_RQ
#endif

#define	OCE_DEFAULT_RX_PKT_PER_INTR (OCE_DEFAULT_RX_RING_SIZE / 2)
#define	OCE_DEFAULT_TX_RECLAIM_THRESHOLD 1024
#define	OCE_MAX_RQ_POSTS		255
#define	OCE_RQ_NUM_BUFFERS		2048
#define	OCE_RQ_BUF_SIZE			8192
#define	OCE_DEFAULT_RECHARGE_THRESHOLD	OCE_MAX_RQ_POSTS
#define	OCE_NUM_USED_VECTORS		2
#define	OCE_ITBL_SIZE			64
#define	OCE_HKEY_SIZE			40
#define	OCE_DMA_ALIGNMENT		0x1000ull

#define	OCE_MIN_VECTORS			1

#define	OCE_CAPAB_FLAGS	(MBX_RX_IFACE_FLAGS_BROADCAST		| \
			MBX_RX_IFACE_FLAGS_PROMISCUOUS		| \
			MBX_RX_IFACE_FLAGS_UNTAGGED		| \
			MBX_RX_IFACE_FLAGS_MCAST_PROMISCUOUS	| \
			MBX_RX_IFACE_FLAGS_PASS_L3L4)

#define	OCE_CAPAB_ENABLE	(MBX_RX_IFACE_FLAGS_BROADCAST	| \
				MBX_RX_IFACE_FLAGS_UNTAGGED	| \
				MBX_RX_IFACE_FLAGS_PASS_L3L4)

#define	OCE_FM_CAPABILITY	(DDI_FM_EREPORT_CAPABLE		| \
				DDI_FM_ACCCHK_CAPABLE		| \
				DDI_FM_DMACHK_CAPABLE)

#define	OCE_DEFAULT_RSS_TYPE	(RSS_ENABLE_IPV4|RSS_ENABLE_TCP_IPV4)

/* flow control definitions */
#define	OCE_FC_NONE	0x00000000
#define	OCE_FC_TX	0x00000001
#define	OCE_FC_RX	0x00000002
#define	OCE_DEFAULT_FLOW_CONTROL	(OCE_FC_TX | OCE_FC_RX)

/* PCI Information */
#define	OCE_DEV_CFG_BAR	0x01
#define	OCE_PCI_CSR_BAR	0x02
#define	OCE_PCI_DB_BAR	0x03

/* macros for device IO */
#define	OCE_READ_REG32(handle, addr) ddi_get32(handle, addr)
#define	OCE_WRITE_REG32(handle, addr, value) ddi_put32(handle, addr, value)

#define	OCE_CSR_READ32(dev, offset) \
	OCE_READ_REG32((dev)->csr_handle, \
	    (uint32_t *)(void *)((dev)->csr_addr + offset))

#define	OCE_CSR_WRITE32(dev, offset, value) \
	OCE_WRITE_REG32((dev)->csr_handle, \
	    (uint32_t *)(void *)((dev)->csr_addr + offset), value)

#define	OCE_DB_READ32(dev, offset) \
	OCE_READ_REG32((dev)->db_handle, \
	    (uint32_t *)(void *)((dev)->db_addr + offset))

#define	OCE_DB_WRITE32(dev, offset, value) \
	OCE_WRITE_REG32((dev)->db_handle, \
		(uint32_t *)(void *)((dev)->db_addr + offset), value)

#define	OCE_CFG_READ32(dev, offset) \
	OCE_READ_REG32((dev)->dev_cfg_handle, \
	    (uint32_t *)(void *)((dev)->dev_cfg_addr + offset))

#define	OCE_CFG_WRITE32(dev, offset, value) \
	OCE_WRITE_REG32((dev)->dev_cfg_handle, \
	    (uint32_t *)(void *)((dev)->dev_cfg_addr + offset), value)

#define	OCE_PCI_FUNC(dev) \
	((OCE_CFG_READ32(dev, PCICFG_INTR_CTRL) \
	    >> HOSTINTR_PFUNC_SHIFT) & HOSTINTR_PFUNC_MASK)

#define	DEV_LOCK(dev)	mutex_enter(&dev->dev_lock)

#define	DEV_UNLOCK(dev)	mutex_exit(&dev->dev_lock)

enum oce_ring_size {
	RING_SIZE_256  = 256,
	RING_SIZE_512  = 512,
	RING_SIZE_1024 = 1024,
	RING_SIZE_2048 = 2048
};

enum oce_driver_state {
	STATE_INIT		= 0x2,
	STATE_MAC_STARTED	= 0x4,
	STATE_QUIESCE		= 0x8,
	STATE_MAC_STOPPING	= 0x10
};

struct oce_dev {
	kmutex_t bmbx_lock;		/* Bootstrap Lock */
	kmutex_t dev_lock;		/* lock for device */

	/* Queues relarted */
	struct oce_wq *wq[OCE_MAX_WQ];	/* TXQ Array */
	struct oce_rq *rq[OCE_MAX_RQ];	/* RXQ Array */
	struct oce_cq *cq[OCE_MAX_CQ];	/* Completion Queues */
	struct oce_eq *eq[OCE_MAX_EQ];	/* Event Queues	*/
	struct oce_mq *mq;		/* MQ ring */

	/* driver state  machine */
	enum oce_driver_state state;	/* state */
	boolean_t suspended;		/* CPR */
	uint32_t attach_state;		/* attach progress */

	oce_dma_buf_t *bmbx;		/* Bootstrap MailBox */

	uint32_t tx_bcopy_limit;	/* TX BCOPY Limit */
	uint32_t rx_bcopy_limit;	/* RX BCOPY Limit */
	uint32_t tx_reclaim_threshold;	/* Tx reclaim */
	uint32_t rx_pkt_per_intr;	/* Rx pkts processed per intr */

	/* BARS */
	int num_bars;
	ddi_acc_handle_t pci_cfg_handle; /* Config space handle */
	ddi_acc_handle_t cfg_handle;	/* MMIO PCI Config Space Regs */
	ddi_acc_handle_t csr_handle;	/* MMIO Control Status Regs */
	caddr_t csr_addr;
	caddr_t db_addr;
	caddr_t dev_cfg_addr;
	ddi_acc_handle_t db_handle;	/* MMIO DoorBell Area */
	ddi_acc_handle_t dev_cfg_handle; /* MMIO CONFIG SPACE */
	mac_handle_t mac_handle;	/* MAC HANDLE	*/

	/* device stats */
	kstat_t *oce_kstats;		/* NIC STATS */
	oce_dma_buf_t *stats_dbuf;	/* STATS BUFFER */
	struct mbx_get_nic_stats *hw_stats;
	/* dev stats */
	uint32_t tx_errors;
	uint32_t tx_noxmtbuf;

	/* link status */
	link_state_t link_status;
	int32_t link_speed;		/* Link speed in Mbps */

	/* OS */
	uint32_t dev_id;	/* device ID or instance number */
	dev_info_t *dip;	/* device info structure for device tree node */

	/* Interrupt related */
	int intr_type;		/* INTR TYPE USED */
	int num_vectors;	/* number of vectors used */
	uint_t intr_pri;	/* interrupt priority */
	int intr_cap;
	ddi_intr_handle_t *htable;	/* intr handler table */
	int32_t hsize;

	/* device configuration */
	uint32_t rq_max_bufs;		/* maximum prealloced buffers */
	uint32_t rq_frag_size;		/* Rxq fragment size */
	enum oce_ring_size tx_ring_size;
	enum oce_ring_size rx_ring_size;
	uint32_t neqs;			/* No of event queues */
	uint32_t nwqs;			/* No of Work Queues */
	uint32_t nrqs;			/* No of Receive Queues */
	uint32_t nifs;			/* No of interfaces created */
	uint32_t tx_rings;
	uint32_t rx_rings;
	uint32_t pmac_id;		/* used to add or remove mac */
	uint8_t unicast_addr[ETHERADDRL];
	uint32_t num_smac;
	uint32_t mtu;
	int32_t fm_caps;
	boolean_t rss_enable;		/* RSS support */
	boolean_t lso_capable;		/* LSO */
	boolean_t promisc;		/* PROMISC MODE */
	uint32_t if_cap_flags;		/* IF CAPAB */
	uint32_t flow_control;		/* flow control settings */
	uint8_t mac_addr[ETHERADDRL];	/* hardware mac address */
	uint16_t num_mca;		/* MCA supported */
	struct ether_addr multi_cast[OCE_MAX_MCA];	/* MC TABLE */
	uint32_t cookie;		/* used during fw download */

	/* fw config: only relevant fields */
	uint32_t config_number;
	uint32_t asic_revision;
	uint32_t port_id;
	uint32_t function_mode;
	uint32_t function_caps;
	uint32_t chip_rev;		/* Chip revision */
	uint32_t max_tx_rings;		/* Max Rx rings available */
	uint32_t max_rx_rings;		/* Max rx rings available */
	int32_t if_id;			/* IF ID */
	uint8_t fn;			/* function number */
	uint8_t fw_version[32];		/* fw version string */

	/* PCI related */
	uint16_t vendor_id;
	uint16_t device_id;
	uint16_t subsys_id;
	uint16_t subvendor_id;
	uint8_t pci_bus;
	uint8_t pci_device;
	uint8_t pci_function;
	uint8_t dev_list_index;

	/* Logging related */
	uint16_t mod_mask;		/* Log Mask */
	int16_t severity;		/* Log level */
};

/* GLD handler functions */
int oce_m_start(void *arg);
void oce_m_stop(void *arg);
mblk_t *oce_m_send(void *arg, mblk_t *pkt);
int oce_m_promiscuous(void *arg, boolean_t enable);
int oce_m_multicast(void *arg, boolean_t add, const uint8_t *mca);
int oce_m_unicast(void *arg, const uint8_t *uca);
boolean_t oce_m_getcap(void *arg, mac_capab_t cap, void *data);
void oce_m_ioctl(void *arg, queue_t *wq, mblk_t *mp);
int oce_m_setprop(void *arg, const char *name, mac_prop_id_t id,
    uint_t size, const void *val);
int oce_m_getprop(void *arg, const char *name, mac_prop_id_t id,
    uint_t size, void *val);
void oce_m_propinfo(void *arg, const char *pr_name, mac_prop_id_t pr_num,
    mac_prop_info_handle_t prh);

int oce_m_stat(void *arg, uint_t stat, uint64_t *val);

/* Hardware start/stop functions */
int oce_start(struct oce_dev *dev);
void oce_stop(struct oce_dev *dev);
int oce_identify_hw(struct oce_dev *dev);
int oce_get_bdf(struct oce_dev *dev);

/* FMA support Functions */
void oce_fm_init(struct oce_dev *dev);
void oce_fm_fini(struct oce_dev *dev);
void oce_set_dma_fma_flags(int fm_caps);
void oce_set_reg_fma_flags(int fm_caps);
void oce_set_tx_map_dma_fma_flags(int fm_caps);
void oce_fm_ereport(struct oce_dev *dev, char *detail);
int  oce_fm_check_acc_handle(struct oce_dev *dev,
    ddi_acc_handle_t acc_handle);
int  oce_fm_check_dma_handle(struct oce_dev *dev,
    ddi_dma_handle_t dma_handle);

/* Interrupt handling */
int oce_setup_intr(struct oce_dev *dev);
int oce_teardown_intr(struct oce_dev *dev);
int oce_setup_handlers(struct oce_dev *dev);
void oce_remove_handler(struct oce_dev *dev);
void oce_ei(struct oce_dev *dev);
void oce_di(struct oce_dev *dev);
void oce_chip_ei(struct oce_dev *dev);
void oce_chip_di(struct oce_dev *dev);

/* HW initialisation */
int oce_hw_init(struct oce_dev *dev);
void oce_hw_fini(struct oce_dev *dev);
int oce_setup_adapter(struct oce_dev *dev);
void oce_unsetup_adapter(struct oce_dev *dev);

#ifdef __cplusplus
}
#endif

#endif /* _OCE_IMPL_H_ */