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 (c) 2009-2012 Emulex. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27
28
29 /*
30 * Driver specific data structures and function prototypes
31 */
32
33 #ifndef _OCE_IMPL_H_
34 #define _OCE_IMPL_H_
35
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39
40 #include <sys/types.h>
41 #include <sys/dditypes.h>
42 #include <sys/sysmacros.h>
43 #include <sys/kstat.h>
44 #include <sys/ddi_intr.h>
45 #include <sys/cmn_err.h>
46 #include <sys/byteorder.h>
47 #include <netinet/ip6.h>
48 #include <sys/mac_provider.h>
49 #include <sys/mac_ether.h>
50 #include <sys/gld.h>
51 #include <sys/bitmap.h>
52 #include <sys/ddidmareq.h>
53 #include <sys/kmem.h>
54 #include <sys/ddi.h>
55 #include <sys/sunddi.h>
56 #include <sys/modctl.h>
57 #include <sys/devops.h>
58 #include <sys/systm.h>
59 #include <sys/conf.h>
60 #include <sys/dlpi.h>
61 #include <sys/ethernet.h>
62 #include <sys/strsun.h>
63 #include <sys/pattr.h>
64 #include <sys/strsubr.h>
65 #include <sys/ddifm.h>
66 #include <sys/fm/protocol.h>
67 #include <sys/fm/util.h>
68 #include <sys/fm/io/ddi.h>
69 #include <sys/note.h>
70 #include <sys/pci.h>
71 #include <sys/random.h>
72 #include <oce_hw.h>
73 #include <oce_hw_eth.h>
74 #include <oce_io.h>
75 #include <oce_buf.h>
76 #include <oce_utils.h>
77 #include <oce_ring.h>
78 #include <oce_version.h>
79
80 #define SIZE_128 128
81 #define SIZE_256 256
82 #define SIZE_512 512
83 #define SIZE_1K 1024
84 #define SIZE_2K (2 * 1024)
85 #define SIZE_4K (4 * 1024)
86 #define SIZE_8K (8 * 1024)
87
88 #define END 0xdeadface
89
90 #define OCE_MAX_JUMBO_FRAME_SIZE 9018
91
92 #define OCE_MIN_MTU 1500
93 #define OCE_MAX_MTU 9000
94 #define OCE_MAX_MCA 32
95
96 #define OCE_MAX_EQ 16
97 #define OCE_MAX_CQ 1024
98
99 #define OCE_WQ_NUM_BUFFERS 2048
100 #define OCE_WQ_BUF_SIZE 2048
101 #define OCE_LSO_MAX_SIZE (64 * 1024)
102 #define OCE_DEFAULT_TX_BCOPY_LIMIT 512
103 #define OCE_DEFAULT_RX_BCOPY_LIMIT 128
104 #define OCE_DEFAULT_WQ_EQD 16
105
106 #define OCE_DEFAULT_RX_PKTS_PER_INTR 64
107 #define OCE_DEFAULT_TX_RECLAIM_THRESHOLD 1024
108
109 #define OCE_MAX_RSS_RINGS 16
110 #define OCE_MAX_RING_GROUPS 4
111 #define OCE_MAX_RING_PER_GROUP (OCE_MAX_RSS_RINGS+1)
112 #define OCE_MIN_RING_PER_GROUP 1
113 #define OCE_MAX_RQ (OCE_MAX_EQ+1)
114 #define OCE_MAX_WQ OCE_MAX_EQ
115 #define OCE_MIN_RQ 1
116 #define OCE_MIN_WQ 1
117 #define OCE_DEF_RING_PER_GROUP OCE_MAX_RING_PER_GROUP
118 #define OCE_DEFAULT_RQS 5
119 #define OCE_DEFAULT_WQS 1
120
121 #define OCE_MAX_SMAC_PER_DEV 128
122 #define OCE_MAX_PMAC_PER_GRP OCE_MAX_SMAC_PER_DEV
123
124 #define OCE_MAX_RQ_POSTS 255
125 #define OCE_RQ_NUM_BUFFERS 2048
126 #define OCE_RQ_BUF_SIZE 2048
127 #define OCE_DEFAULT_RECHARGE_THRESHOLD 32
128 #define OCE_ITBL_SIZE 64
129 #define OCE_HKEY_SIZE 40
130 #define OCE_DMA_ALIGNMENT 0x0000000000001000ull
131 #define OCE_MIN_VECTORS 1
132
133 #define OCE_DEFAULT_TX_RING_SIZE 2048
134 #define OCE_DEFAULT_RX_RING_SIZE 1024
135
136 #define OCE_FM_CAPABILITY (DDI_FM_EREPORT_CAPABLE | \
137 DDI_FM_ACCCHK_CAPABLE | \
138 DDI_FM_DMACHK_CAPABLE)
139 #define OCE_DEFAULT_RSS_TYPE (RSS_ENABLE_IPV4|RSS_ENABLE_TCP_IPV4)
140
141 /* flow control definitions */
142 #define OCE_FC_NONE 0x00000000
143 #define OCE_FC_TX 0x00000001
144 #define OCE_FC_RX 0x00000002
145 #define OCE_DEFAULT_FLOW_CONTROL (OCE_FC_TX | OCE_FC_RX)
146
147 /* PCI Information */
148 #define OCE_DEV_CFG_BAR 0x01
149 #define OCE_PCI_CSR_BAR 0x02
150 #define OCE_PCI_DB_BAR 0x03
151 /* Lancer DB Bar */
152 #define OCE_PCI_LANCER_DB_BAR 0x01
153
154 /* macros for device IO */
155 #define OCE_READ_REG32(handle, addr) ddi_get32(handle, addr)
156 #define OCE_WRITE_REG32(handle, addr, value) ddi_put32(handle, addr, value)
157
158 #define OCE_CSR_READ32(dev, offset) \
159 OCE_READ_REG32((dev)->csr_handle, \
160 (uint32_t *)(void *)((dev)->csr_addr + offset))
161
162 #define OCE_CSR_WRITE32(dev, offset, value) \
163 OCE_WRITE_REG32((dev)->csr_handle, \
164 (uint32_t *)(void *)((dev)->csr_addr + offset), value)
165
166 #define OCE_DB_READ32(dev, offset) \
167 OCE_READ_REG32((dev)->db_handle, \
168 (uint32_t *)(void *)((dev)->db_addr + offset))
169
170 #define OCE_DB_WRITE32(dev, offset, value) \
171 OCE_WRITE_REG32((dev)->db_handle, \
172 (uint32_t *)(void *)((dev)->db_addr + offset), value)
173
174 #define OCE_CFG_READ32(dev, offset) \
175 OCE_READ_REG32((dev)->dev_cfg_handle, \
176 (uint32_t *)(void *)((dev)->dev_cfg_addr + offset))
177
178 #define OCE_CFG_WRITE32(dev, offset, value) \
179 OCE_WRITE_REG32((dev)->dev_cfg_handle, \
180 (uint32_t *)(void *)((dev)->dev_cfg_addr + offset), value)
181
182 #define OCE_PCI_FUNC(dev) \
183 ((OCE_CFG_READ32(dev, PCICFG_INTR_CTRL) \
184 >> HOSTINTR_PFUNC_SHIFT) & HOSTINTR_PFUNC_MASK)
185
186 #define DEV_LOCK(dev) mutex_enter(&dev->dev_lock)
187 #define DEV_UNLOCK(dev) mutex_exit(&dev->dev_lock)
188
189 enum oce_ring_size {
190 RING_SIZE_256 = 256,
191 RING_SIZE_512 = 512,
192 RING_SIZE_1024 = 1024,
193 RING_SIZE_2048 = 2048
194 };
195
196 enum oce_device_state {
197 STATE_MAC_STARTED = 0x4,
198 STATE_INTR_ENABLED = 0x8,
199 STATE_MAC_STOPPING = 0x10,
200 STATE_INTR_ADJUST = 0x20
201 };
202
203 enum oce_group_state {
204 GROUP_INIT = 0x01,
205 GROUP_MAC_STARTED = 0x02,
206 GROUP_SUSPEND = 0x04
207 };
208
209 #define ATTACH_DEV_INIT 0x1
210 #define ATTACH_FM_INIT 0x2
211 #define ATTACH_PCI_CFG 0x4
212 #define ATTACH_LOCK_INIT 0x8
213 #define ATTACH_PCI_INIT 0x10
214 #define ATTACH_HW_INIT 0x20
215 #define ATTACH_SETUP_INTR 0x100
216 #define ATTACH_STAT_INIT 0x200
217 #define ATTACH_MAC_REG 0x400
218 #define ATTACH_CB_REG 0x1000
219 #define ATTACH_ALLOC_QUEUES 0x2000
220 #define ATTACH_REG_INTR_HANDLE 0x4000
221
222 typedef union oce_ring_s {
223 struct oce_rq *rx;
224 struct oce_wq *tx;
225 } oce_ring_t;
226
227
228 typedef struct oce_group_s
229 {
230 kmutex_t grp_lock; /* lock for group data */
231 mac_ring_type_t grp_type; /* tx or rx ring group */
232 uint32_t grp_num; /* index into the group array */
233 mac_group_handle_t handle; /* ring handle used by framework */
234 boolean_t rss_enable; /* if rx, whether rss or not */
235 uint32_t if_id; /* unique to a group */
236 uint32_t num_pmac; /* number of pmacs in this group */
237 uint32_t pmac_ids[OCE_MAX_PMAC_PER_GRP]; /* pmac ids of added pmacs */
238 struct ether_addr mac_addr[OCE_MAX_PMAC_PER_GRP]; /* MAC Addresses */
239 uint32_t num_rings;
240 uint32_t eq_idx;
241 oce_ring_t ring[OCE_MAX_RING_PER_GROUP];
242 void *parent;
243 enum oce_group_state state;
244
245 uint16_t num_mca; /* MCA supported */
246 struct ether_addr multi_cast[OCE_MAX_MCA]; /* MC TABLE */
247 }oce_group_t;
248
249 struct oce_dev {
250 kmutex_t bmbx_lock; /* Bootstrap Lock */
251 kmutex_t dev_lock; /* lock for device */
252
253 uint16_t QnQ_tag;
254 uint8_t QnQ_valid;
255 uint8_t QnQ_queried;
256
257 uint32_t rx_rings_per_group;
258 uint32_t num_rx_groups;
259 uint32_t num_tx_groups;
260 oce_group_t rx_group[OCE_MAX_RING_GROUPS];
261 /* ungrouped TX rings */
262 oce_ring_t default_tx_rings[OCE_MAX_WQ];
263 uint32_t rx_rings; /* total */
264 uint32_t tx_rings; /* total */
265 uint32_t rss_cnt;
266
267 /* Queues relarted */
268 struct oce_wq *wq; /* TXQ Array */
269 struct oce_rq *rq; /* RXQ Array */
270 struct oce_cq **cq; /* Completion Queues */
271 struct oce_eq *eq; /* Event Queues */
272 struct oce_mq *mq; /* MQ ring */
273
274 /* driver state machine */
275 enum oce_device_state state; /* state */
276 boolean_t suspended; /* CPR */
277 uint32_t attach_state; /* attach progress */
278
279 oce_dma_buf_t bmbx; /* Bootstrap MailBox */
280
281 uint32_t tx_bcopy_limit; /* TX BCOPY Limit */
282 uint32_t rx_bcopy_limit; /* RX BCOPY Limit */
283 uint32_t tx_reclaim_threshold; /* Tx reclaim */
284 uint32_t tx_reclaim; /* Tx reclaim */
285 uint32_t rx_pkt_per_intr; /* Rx pkts processed per intr */
286
287 /* BARS */
288 int num_bars;
289 ddi_acc_handle_t pci_cfg_handle; /* Config space handle */
290 ddi_acc_handle_t cfg_handle; /* MMIO PCI Config Space Regs */
291 ddi_acc_handle_t csr_handle; /* MMIO Control Status Regs */
292 caddr_t csr_addr;
293 caddr_t db_addr;
294 caddr_t dev_cfg_addr;
295 ddi_acc_handle_t db_handle; /* MMIO DoorBell Area */
296 ddi_acc_handle_t dev_cfg_handle; /* MMIO CONFIG SPACE */
297 mac_handle_t mac_handle; /* MAC HANDLE */
298
299 /* device stats */
300 kstat_t *oce_kstats; /* NIC STATS */
301 oce_dma_buf_t stats_dbuf; /* STATS BUFFER */
302 kmutex_t stat_lock;
303
304 /* dev stats */
305 uint32_t tx_errors;
306 uint32_t tx_noxmtbuf;
307
308 /* link status */
309 link_state_t link_status;
310 int32_t link_speed; /* Link speed in Mbps */
311 int32_t link_duplex;
312 uint16_t pvid;
313 uint16_t reco_priority; /* Recommended priority */
314 uint32_t vlan_prio_bmap; /* Available Vlan priorities bitmap */
315
316 /* watch dog timer related */
317 kmutex_t wd_lock;
318 boolean_t wd_enable;
319 timeout_id_t wd_id;
320
321 /* OS */
322 uint32_t dev_id; /* device ID or instance number */
323 dev_info_t *dip; /* device info structure for device tree node */
324
325 /* Interrupt related */
326 int intr_type; /* INTR TYPE USED */
327 int num_vectors; /* number of vectors used */
328 uint_t intr_pri; /* interrupt priority */
329 int intr_cap;
330 ddi_intr_handle_t *htable; /* intr handler table */
331 int32_t hsize;
332 ddi_cb_handle_t cb_handle; /* IRM: callback handle */
333 int max_vectors; /* IRM: max number of vectors */
334
335 /* device configuration */
336 uint32_t rq_max_bufs; /* maximum prealloced buffers */
337 uint32_t rq_frag_size; /* Rxq fragment size */
338 enum oce_ring_size tx_ring_size;
339 enum oce_ring_size rx_ring_size;
340 uint32_t neqs; /* No of event queues */
341 uint32_t nwqs; /* No of Work Queues */
342 uint32_t nrqs; /* No of Receive Queues */
343 uint32_t num_pmac; /* Total pmacs on this port */
344 uint32_t pmac_id; /* used to add or remove mac */
345 uint8_t unicast_addr[ETHERADDRL];
346 uint32_t num_smac;
347 uint32_t mtu;
348 int32_t fm_caps;
349 boolean_t lso_capable; /* LSO */
350 boolean_t promisc; /* PROMISC MODE */
351 uint32_t flow_control; /* flow control settings */
352 uint8_t mac_addr[ETHERADDRL]; /* hardware mac address */
353 uint16_t num_mca; /* MCA supported */
354 struct ether_addr multi_cast[OCE_MAX_MCA]; /* MC TABLE */
355 uint32_t cookie; /* used during fw download */
356
357 /* fw config: only relevant fields */
358 uint32_t config_number;
359 uint32_t asic_revision;
360 uint32_t port_id;
361 uint32_t function_mode;
362 uint32_t function_caps;
363 uint32_t drvfn_caps;
364 uint32_t chip_rev; /* Chip revision */
365 uint32_t max_tx_rings; /* Max Rx rings available */
366 uint32_t max_rx_rings; /* Max rx rings available */
367 int32_t if_id; /* IF ID */
368 uint8_t fn; /* function number */
369 uint8_t fw_version[32]; /* fw version string */
370
371 /* PCI related */
372 uint16_t vendor_id;
373 uint16_t device_id;
374 uint16_t subsys_id;
375 uint16_t subvendor_id;
376
377 /* Logging related */
378 uint16_t mod_mask; /* Log Mask */
379 int16_t severity; /* Log level */
380
381 /* ue status */
382 uint32_t ue_mask_lo;
383 uint32_t ue_mask_hi;
384 uint32_t sli_family;
385 };
386
387 /* GLD handler functions */
388 int oce_m_start(void *arg);
389 void oce_m_stop(void *arg);
390 mblk_t *oce_m_send(void *arg, mblk_t *pkt);
391 int oce_m_promiscuous(void *arg, boolean_t enable);
392 int oce_m_multicast(void *arg, boolean_t add, const uint8_t *mca);
393 int oce_m_unicast(void *arg, const uint8_t *uca);
394 boolean_t oce_m_getcap(void *arg, mac_capab_t cap, void *data);
395 void oce_m_ioctl(void *arg, queue_t *wq, mblk_t *mp);
396 int oce_m_setprop(void *arg, const char *name, mac_prop_id_t id,
397 uint_t size, const void *val);
398 int oce_m_getprop(void *arg, const char *name, mac_prop_id_t id,
399 uint_t size, void *val);
400 void oce_m_propinfo(void *arg, const char *pr_name, mac_prop_id_t pr_num,
401 mac_prop_info_handle_t prh);
402
403 int oce_m_stat(void *arg, uint_t stat, uint64_t *val);
404
405 /* Hardware start/stop functions */
406 int oce_start(struct oce_dev *dev);
407 void oce_stop(struct oce_dev *dev);
408 int oce_identify_hw(struct oce_dev *dev);
409
410 /* FMA support Functions */
411 void oce_fm_init(struct oce_dev *dev);
412 void oce_fm_fini(struct oce_dev *dev);
413 void oce_set_dma_fma_flags(int fm_caps);
414 void oce_set_reg_fma_flags(int fm_caps);
415 void oce_set_tx_map_dma_fma_flags(int fm_caps);
416 void oce_fm_ereport(struct oce_dev *dev, char *detail);
417 int oce_fm_check_acc_handle(struct oce_dev *dev,
418 ddi_acc_handle_t acc_handle);
419 int oce_fm_check_dma_handle(struct oce_dev *dev,
420 ddi_dma_handle_t dma_handle);
421
422 /* Interrupt handling */
423 int oce_setup_intr(struct oce_dev *dev);
424 int oce_teardown_intr(struct oce_dev *dev);
425 int oce_setup_handlers(struct oce_dev *dev);
426 void oce_remove_handler(struct oce_dev *dev);
427 int oce_ei(struct oce_dev *dev);
428 int oce_di(struct oce_dev *dev);
429 void oce_chip_ei(struct oce_dev *dev);
430 void oce_chip_di(struct oce_dev *dev);
431
432 /* HW initialisation */
433 int oce_hw_init(struct oce_dev *dev);
434 void oce_hw_fini(struct oce_dev *dev);
435 int oce_create_group(struct oce_dev *dev, oce_group_t *grp, uint32_t mode);
436 void oce_delete_group(struct oce_dev *dev, oce_group_t *grp);
437 void oce_delete_nw_interface(struct oce_dev *dev, oce_group_t *grp,
438 uint32_t mode);
439 int oce_create_nw_interface(struct oce_dev *dev, oce_group_t *grp,
440 uint32_t mode);
441 int oce_rq_init(struct oce_dev *dev, struct oce_rq *, uint32_t q_len,
442 uint32_t frag_size, uint32_t mtu);
443 void oce_rq_fini(struct oce_dev *dev, struct oce_rq *rq);
444
445 /* Timer related */
446 void oce_enable_wd_timer(struct oce_dev *dev);
447 void oce_disable_wd_timer(struct oce_dev *dev);
448 boolean_t oce_check_ue(struct oce_dev *dev);
449 boolean_t oce_tx_stall_check(struct oce_dev *dev);
450
451 /* Helper functions for crossbow ring groups */
452 int oce_start_group(oce_group_t *, boolean_t);
453 void oce_stop_group(oce_group_t *, boolean_t);
454 int oce_resume_group_rings(oce_group_t *);
455 void oce_suspend_group_rings(oce_group_t *);
456 void oce_group_create_itbl(oce_group_t *, char *);
457
458 #ifdef __cplusplus
459 }
460 #endif
461
462 #endif /* _OCE_IMPL_H_ */