Print this page
12011 ixgbe reports incorrect MAC_STAT_NORCVBUF
Change-Id: Ia71b5669b2bc8f6256a84b0b9c673153f327f5ab
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/uts/common/io/ixgbe/ixgbe_sw.h
+++ new/usr/src/uts/common/io/ixgbe/ixgbe_sw.h
1 1 /*
2 2 * CDDL HEADER START
3 3 *
4 4 * The contents of this file are subject to the terms of the
5 5 * Common Development and Distribution License (the "License").
6 6 * You may not use this file except in compliance with the License.
7 7 *
8 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 9 * or http://www.opensolaris.org/os/licensing.
10 10 * See the License for the specific language governing permissions
11 11 * and limitations under the License.
12 12 *
13 13 * When distributing Covered Code, include this CDDL HEADER in each
14 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 15 * If applicable, add the following below this CDDL HEADER, with the
16 16 * fields enclosed by brackets "[]" replaced with your own identifying
17 17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 18 *
19 19 * CDDL HEADER END
↓ open down ↓ |
19 lines elided |
↑ open up ↑ |
20 20 */
21 21
22 22 /*
23 23 * Copyright(c) 2007-2010 Intel Corporation. All rights reserved.
24 24 */
25 25
26 26 /*
27 27 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
28 28 * Copyright (c) 2013 Saso Kiselkov. All rights reserved.
29 29 * Copyright 2016 OmniTI Computer Consulting, Inc. All rights reserved.
30 - * Copyright (c) 2017, Joyent, Inc.
30 + * Copyright 2019 Joyent, Inc.
31 31 */
32 32
33 33 #ifndef _IXGBE_SW_H
34 34 #define _IXGBE_SW_H
35 35
36 36 #ifdef __cplusplus
37 37 extern "C" {
38 38 #endif
39 39
40 40 #include <sys/types.h>
41 41 #include <sys/conf.h>
42 42 #include <sys/debug.h>
43 43 #include <sys/stropts.h>
44 44 #include <sys/stream.h>
45 45 #include <sys/strsun.h>
46 46 #include <sys/strlog.h>
47 47 #include <sys/kmem.h>
48 48 #include <sys/stat.h>
49 49 #include <sys/kstat.h>
50 50 #include <sys/modctl.h>
51 51 #include <sys/errno.h>
52 52 #include <sys/dlpi.h>
53 53 #include <sys/mac_provider.h>
54 54 #include <sys/mac_ether.h>
55 55 #include <sys/vlan.h>
56 56 #include <sys/ddi.h>
57 57 #include <sys/sunddi.h>
58 58 #include <sys/pci.h>
59 59 #include <sys/pcie.h>
60 60 #include <sys/sdt.h>
61 61 #include <sys/ethernet.h>
62 62 #include <sys/pattr.h>
63 63 #include <sys/strsubr.h>
64 64 #include <sys/netlb.h>
65 65 #include <sys/random.h>
66 66 #include <inet/common.h>
67 67 #include <inet/tcp.h>
68 68 #include <inet/ip.h>
69 69 #include <inet/mi.h>
70 70 #include <inet/nd.h>
71 71 #include <sys/bitmap.h>
72 72 #include <sys/ddifm.h>
73 73 #include <sys/fm/protocol.h>
74 74 #include <sys/fm/util.h>
75 75 #include <sys/disp.h>
76 76 #include <sys/fm/io/ddi.h>
77 77 #include "ixgbe_api.h"
78 78
79 79 #define MODULE_NAME "ixgbe" /* module name */
80 80
81 81 #define IXGBE_FAILURE DDI_FAILURE
↓ open down ↓ |
41 lines elided |
↑ open up ↑ |
82 82
83 83 #define IXGBE_UNKNOWN 0x00
84 84 #define IXGBE_INITIALIZED 0x01
85 85 #define IXGBE_STARTED 0x02
86 86 #define IXGBE_SUSPENDED 0x04
87 87 #define IXGBE_STALL 0x08
88 88 #define IXGBE_OVERTEMP 0x20
89 89 #define IXGBE_INTR_ADJUST 0x40
90 90 #define IXGBE_ERROR 0x80
91 91
92 -#define MAX_NUM_UNICAST_ADDRESSES 0x80
93 -#define MAX_NUM_MULTICAST_ADDRESSES 0x1000
92 +#define MAX_NUM_UNICAST_ADDRESSES 0x80
93 +#define MAX_NUM_MULTICAST_ADDRESSES 0x1000
94 94 #define IXGBE_INTR_NONE 0
95 95 #define IXGBE_INTR_MSIX 1
96 96 #define IXGBE_INTR_MSI 2
97 97 #define IXGBE_INTR_LEGACY 3
98 98
99 99 #define IXGBE_POLL_NULL -1
100 100
101 101 #define MAX_COOKIE 18
102 102 #define MIN_NUM_TX_DESC 2
103 103
104 104 #define IXGBE_TX_DESC_LIMIT 32 /* tx desc limitation */
105 105
106 106 #define IXGBE_ADAPTER_REGSET 1 /* map adapter registers */
107 107
108 108 #define IXGBE_RX_STOPPED 0x1
109 109
110 110 #define IXGBE_PKG_BUF_16k 16384
111 111
112 112 /*
113 113 * MAX_xx_QUEUE_NUM and MAX_INTR_VECTOR values need to be the maximum of all
114 114 * supported silicon types.
115 115 */
116 116 #define MAX_TX_QUEUE_NUM 128
117 117 #define MAX_RX_QUEUE_NUM 128
118 118 #define MAX_INTR_VECTOR 64
119 119
120 120 /*
121 121 * Maximum values for user configurable parameters
122 122 */
123 123 #define MAX_TX_RING_SIZE 4096
124 124 #define MAX_RX_RING_SIZE 4096
125 125
126 126 #define MAX_RX_LIMIT_PER_INTR 4096
127 127
128 128 #define MAX_RX_COPY_THRESHOLD 9216
129 129 #define MAX_TX_COPY_THRESHOLD 9216
130 130 #define MAX_TX_RECYCLE_THRESHOLD DEFAULT_TX_RING_SIZE
131 131 #define MAX_TX_OVERLOAD_THRESHOLD DEFAULT_TX_RING_SIZE
132 132 #define MAX_TX_RESCHED_THRESHOLD DEFAULT_TX_RING_SIZE
133 133
134 134 /*
135 135 * Minimum values for user configurable parameters
136 136 */
137 137 #define MIN_TX_RING_SIZE 64
138 138 #define MIN_RX_RING_SIZE 64
139 139
140 140 #define MIN_MTU ETHERMIN
141 141 #define MIN_RX_LIMIT_PER_INTR 16
142 142 #define MIN_TX_COPY_THRESHOLD 0
143 143 #define MIN_RX_COPY_THRESHOLD 0
144 144 #define MIN_TX_RECYCLE_THRESHOLD MIN_NUM_TX_DESC
145 145 #define MIN_TX_OVERLOAD_THRESHOLD MIN_NUM_TX_DESC
146 146 #define MIN_TX_RESCHED_THRESHOLD MIN_NUM_TX_DESC
147 147
148 148 /*
149 149 * Default values for user configurable parameters
150 150 */
151 151 #define DEFAULT_TX_RING_SIZE 1024
152 152 #define DEFAULT_RX_RING_SIZE 1024
153 153
154 154 #define DEFAULT_MTU ETHERMTU
155 155 #define DEFAULT_RX_LIMIT_PER_INTR 256
156 156 #define DEFAULT_RX_COPY_THRESHOLD 128
157 157 #define DEFAULT_TX_COPY_THRESHOLD 512
158 158 #define DEFAULT_TX_RECYCLE_THRESHOLD (MAX_COOKIE + 1)
159 159 #define DEFAULT_TX_OVERLOAD_THRESHOLD MIN_NUM_TX_DESC
160 160 #define DEFAULT_TX_RESCHED_THRESHOLD 128
161 161 #define DEFAULT_FCRTH 0x20000
162 162 #define DEFAULT_FCRTL 0x10000
163 163 #define DEFAULT_FCPAUSE 0xFFFF
164 164
165 165 #define DEFAULT_TX_HCKSUM_ENABLE B_TRUE
166 166 #define DEFAULT_RX_HCKSUM_ENABLE B_TRUE
167 167 #define DEFAULT_LSO_ENABLE B_TRUE
168 168 #define DEFAULT_LRO_ENABLE B_FALSE
169 169 #define DEFAULT_MR_ENABLE B_TRUE
170 170 #define DEFAULT_TX_HEAD_WB_ENABLE B_TRUE
171 171 #define DEFAULT_RELAX_ORDER_ENABLE B_TRUE
172 172 #define DEFAULT_ALLOW_UNSUPPORTED_SFP B_FALSE
173 173
174 174 #define IXGBE_LSO_MAXLEN 65535
175 175
176 176 #define TX_DRAIN_TIME 200
177 177 #define RX_DRAIN_TIME 200
178 178
179 179 #define STALL_WATCHDOG_TIMEOUT 8 /* 8 seconds */
180 180 #define MAX_LINK_DOWN_TIMEOUT 8 /* 8 seconds */
181 181
182 182 #define IXGBE_CYCLIC_PERIOD (1000000000) /* 1s */
183 183
184 184 /*
185 185 * Extra register bit masks for 82598
186 186 */
187 187 #define IXGBE_PCS1GANA_FDC 0x20
188 188 #define IXGBE_PCS1GANLP_LPFD 0x20
189 189 #define IXGBE_PCS1GANLP_LPHD 0x40
190 190
191 191 /*
192 192 * Defined for IP header alignment.
193 193 */
194 194 #define IPHDR_ALIGN_ROOM 2
195 195
196 196 /*
197 197 * Bit flags for attach_progress
198 198 */
199 199 #define ATTACH_PROGRESS_PCI_CONFIG 0x0001 /* PCI config setup */
200 200 #define ATTACH_PROGRESS_REGS_MAP 0x0002 /* Registers mapped */
201 201 #define ATTACH_PROGRESS_PROPS 0x0004 /* Properties initialized */
202 202 #define ATTACH_PROGRESS_ALLOC_INTR 0x0008 /* Interrupts allocated */
203 203 #define ATTACH_PROGRESS_ALLOC_RINGS 0x0010 /* Rings allocated */
204 204 #define ATTACH_PROGRESS_ADD_INTR 0x0020 /* Intr handlers added */
205 205 #define ATTACH_PROGRESS_LOCKS 0x0040 /* Locks initialized */
206 206 #define ATTACH_PROGRESS_INIT 0x0080 /* Device initialized */
207 207 #define ATTACH_PROGRESS_STATS 0x0200 /* Kstats created */
208 208 #define ATTACH_PROGRESS_MAC 0x0800 /* MAC registered */
209 209 #define ATTACH_PROGRESS_ENABLE_INTR 0x1000 /* DDI interrupts enabled */
210 210 #define ATTACH_PROGRESS_FM_INIT 0x2000 /* FMA initialized */
211 211 #define ATTACH_PROGRESS_SFP_TASKQ 0x4000 /* SFP taskq created */
212 212 #define ATTACH_PROGRESS_LINK_TIMER 0x8000 /* link check timer */
213 213 #define ATTACH_PROGRESS_OVERTEMP_TASKQ 0x10000 /* Over-temp taskq created */
214 214 #define ATTACH_PROGRESS_PHY_TASKQ 0x20000 /* Ext. PHY taskq created */
215 215
216 216 #define PROP_DEFAULT_MTU "default_mtu"
217 217 #define PROP_FLOW_CONTROL "flow_control"
218 218 #define PROP_TX_QUEUE_NUM "tx_queue_number"
219 219 #define PROP_TX_RING_SIZE "tx_ring_size"
220 220 #define PROP_RX_QUEUE_NUM "rx_queue_number"
221 221 #define PROP_RX_RING_SIZE "rx_ring_size"
222 222 #define PROP_RX_GROUP_NUM "rx_group_number"
223 223
224 224 #define PROP_INTR_FORCE "intr_force"
225 225 #define PROP_TX_HCKSUM_ENABLE "tx_hcksum_enable"
226 226 #define PROP_RX_HCKSUM_ENABLE "rx_hcksum_enable"
227 227 #define PROP_LSO_ENABLE "lso_enable"
228 228 #define PROP_LRO_ENABLE "lro_enable"
229 229 #define PROP_MR_ENABLE "mr_enable"
230 230 #define PROP_RELAX_ORDER_ENABLE "relax_order_enable"
231 231 #define PROP_TX_HEAD_WB_ENABLE "tx_head_wb_enable"
232 232 #define PROP_TX_COPY_THRESHOLD "tx_copy_threshold"
233 233 #define PROP_TX_RECYCLE_THRESHOLD "tx_recycle_threshold"
234 234 #define PROP_TX_OVERLOAD_THRESHOLD "tx_overload_threshold"
235 235 #define PROP_TX_RESCHED_THRESHOLD "tx_resched_threshold"
236 236 #define PROP_RX_COPY_THRESHOLD "rx_copy_threshold"
237 237 #define PROP_RX_LIMIT_PER_INTR "rx_limit_per_intr"
238 238 #define PROP_INTR_THROTTLING "intr_throttling"
239 239 #define PROP_FM_CAPABLE "fm_capable"
240 240 #define PROP_ALLOW_UNSUPPORTED_SFP "allow_unsupported_sfp"
241 241
242 242 #define IXGBE_LB_NONE 0
243 243 #define IXGBE_LB_EXTERNAL 1
244 244 #define IXGBE_LB_INTERNAL_MAC 2
245 245 #define IXGBE_LB_INTERNAL_PHY 3
246 246 #define IXGBE_LB_INTERNAL_SERDES 4
247 247
248 248 /*
249 249 * capability/feature flags
250 250 * Flags named _CAPABLE are set when the NIC hardware is capable of the feature.
251 251 * Separately, the flag named _ENABLED is set when the feature is enabled.
252 252 */
253 253 #define IXGBE_FLAG_DCA_ENABLED (u32)(1)
254 254 #define IXGBE_FLAG_DCA_CAPABLE (u32)(1 << 1)
255 255 #define IXGBE_FLAG_DCB_ENABLED (u32)(1 << 2)
256 256 #define IXGBE_FLAG_DCB_CAPABLE (u32)(1 << 4)
257 257 #define IXGBE_FLAG_RSS_ENABLED (u32)(1 << 4)
258 258 #define IXGBE_FLAG_RSS_CAPABLE (u32)(1 << 5)
259 259 #define IXGBE_FLAG_VMDQ_CAPABLE (u32)(1 << 6)
260 260 #define IXGBE_FLAG_VMDQ_ENABLED (u32)(1 << 7)
261 261 #define IXGBE_FLAG_FAN_FAIL_CAPABLE (u32)(1 << 8)
262 262 #define IXGBE_FLAG_RSC_CAPABLE (u32)(1 << 9)
263 263 #define IXGBE_FLAG_SFP_PLUG_CAPABLE (u32)(1 << 10)
264 264 #define IXGBE_FLAG_TEMP_SENSOR_CAPABLE (u32)(1 << 11)
265 265
266 266 /*
267 267 * Classification mode
268 268 */
269 269 #define IXGBE_CLASSIFY_NONE 0
270 270 #define IXGBE_CLASSIFY_RSS 1
271 271 #define IXGBE_CLASSIFY_VMDQ 2
272 272 #define IXGBE_CLASSIFY_VMDQ_RSS 3
273 273
274 274 /* adapter-specific info for each supported device type */
275 275 typedef struct adapter_info {
276 276 uint32_t max_rx_que_num; /* maximum number of rx queues */
277 277 uint32_t min_rx_que_num; /* minimum number of rx queues */
278 278 uint32_t def_rx_que_num; /* default number of rx queues */
279 279 uint32_t max_rx_grp_num; /* maximum number of rx groups */
280 280 uint32_t min_rx_grp_num; /* minimum number of rx groups */
281 281 uint32_t def_rx_grp_num; /* default number of rx groups */
282 282 uint32_t max_tx_que_num; /* maximum number of tx queues */
283 283 uint32_t min_tx_que_num; /* minimum number of tx queues */
284 284 uint32_t def_tx_que_num; /* default number of tx queues */
285 285 uint32_t max_mtu; /* maximum MTU size */
286 286 /*
287 287 * Interrupt throttling is in unit of 256 nsec
288 288 */
289 289 uint32_t max_intr_throttle; /* maximum interrupt throttle */
290 290 uint32_t min_intr_throttle; /* minimum interrupt throttle */
291 291 uint32_t def_intr_throttle; /* default interrupt throttle */
292 292
293 293 uint32_t max_msix_vect; /* maximum total msix vectors */
294 294 uint32_t max_ring_vect; /* maximum number of ring vectors */
295 295 uint32_t max_other_vect; /* maximum number of other vectors */
296 296 uint32_t other_intr; /* "other" interrupt types handled */
↓ open down ↓ |
193 lines elided |
↑ open up ↑ |
297 297 uint32_t other_gpie; /* "other" interrupt types enabling */
298 298 uint32_t flags; /* capability flags */
299 299 } adapter_info_t;
300 300
301 301 /* bits representing all interrupt types other than tx & rx */
302 302 #define IXGBE_OTHER_INTR 0x3ff00000
303 303 #define IXGBE_82599_OTHER_INTR 0x86100000
304 304
305 305 enum ioc_reply {
306 306 IOC_INVAL = -1, /* bad, NAK with EINVAL */
307 - IOC_DONE, /* OK, reply sent */
307 + IOC_DONE, /* OK, reply sent */
308 308 IOC_ACK, /* OK, just send ACK */
309 309 IOC_REPLY /* OK, just send reply */
310 310 };
311 311
312 312 #define DMA_SYNC(area, flag) ((void) ddi_dma_sync((area)->dma_handle, \
313 313 0, 0, (flag)))
314 314
315 315 /*
316 316 * Defined for ring index operations
317 317 * ASSERT(index < limit)
318 318 * ASSERT(step < limit)
319 319 * ASSERT(index1 < limit)
320 320 * ASSERT(index2 < limit)
321 321 */
322 322 #define NEXT_INDEX(index, step, limit) (((index) + (step)) < (limit) ? \
323 323 (index) + (step) : (index) + (step) - (limit))
324 324 #define PREV_INDEX(index, step, limit) ((index) >= (step) ? \
325 325 (index) - (step) : (index) + (limit) - (step))
326 326 #define OFFSET(index1, index2, limit) ((index1) <= (index2) ? \
327 327 (index2) - (index1) : (index2) + (limit) - (index1))
328 328
329 329 #define LINK_LIST_INIT(_LH) \
330 330 (_LH)->head = (_LH)->tail = NULL
331 331
332 332 #define LIST_GET_HEAD(_LH) ((single_link_t *)((_LH)->head))
333 333
334 334 #define LIST_POP_HEAD(_LH) \
335 335 (single_link_t *)(_LH)->head; \
336 336 { \
337 337 if ((_LH)->head != NULL) { \
338 338 (_LH)->head = (_LH)->head->link; \
339 339 if ((_LH)->head == NULL) \
340 340 (_LH)->tail = NULL; \
341 341 } \
342 342 }
343 343
344 344 #define LIST_GET_TAIL(_LH) ((single_link_t *)((_LH)->tail))
345 345
346 346 #define LIST_PUSH_TAIL(_LH, _E) \
347 347 if ((_LH)->tail != NULL) { \
348 348 (_LH)->tail->link = (single_link_t *)(_E); \
349 349 (_LH)->tail = (single_link_t *)(_E); \
350 350 } else { \
351 351 (_LH)->head = (_LH)->tail = (single_link_t *)(_E); \
352 352 } \
353 353 (_E)->link = NULL;
354 354
355 355 #define LIST_GET_NEXT(_LH, _E) \
356 356 (((_LH)->tail == (single_link_t *)(_E)) ? \
357 357 NULL : ((single_link_t *)(_E))->link)
358 358
359 359
360 360 typedef struct single_link {
361 361 struct single_link *link;
362 362 } single_link_t;
363 363
364 364 typedef struct link_list {
365 365 single_link_t *head;
366 366 single_link_t *tail;
367 367 } link_list_t;
368 368
369 369 /*
370 370 * Property lookups
371 371 */
372 372 #define IXGBE_PROP_EXISTS(d, n) ddi_prop_exists(DDI_DEV_T_ANY, (d), \
373 373 DDI_PROP_DONTPASS, (n))
374 374 #define IXGBE_PROP_GET_INT(d, n) ddi_prop_get_int(DDI_DEV_T_ANY, (d), \
375 375 DDI_PROP_DONTPASS, (n), -1)
376 376
377 377
378 378 typedef union ixgbe_ether_addr {
379 379 struct {
380 380 uint32_t high;
381 381 uint32_t low;
382 382 } reg;
383 383 struct {
384 384 uint8_t set;
385 385 uint8_t group_index;
386 386 uint8_t addr[ETHERADDRL];
387 387 } mac;
388 388 } ixgbe_ether_addr_t;
389 389
390 390 typedef enum {
391 391 USE_NONE,
392 392 USE_COPY,
393 393 USE_DMA
394 394 } tx_type_t;
395 395
396 396 typedef struct ixgbe_tx_context {
397 397 uint32_t hcksum_flags;
398 398 uint32_t ip_hdr_len;
399 399 uint32_t mac_hdr_len;
400 400 uint32_t l4_proto;
401 401 uint32_t mss;
402 402 uint32_t l4_hdr_len;
403 403 boolean_t lso_flag;
404 404 } ixgbe_tx_context_t;
405 405
406 406 /*
407 407 * Hold address/length of each DMA segment
408 408 */
409 409 typedef struct sw_desc {
410 410 uint64_t address;
411 411 size_t length;
412 412 } sw_desc_t;
413 413
414 414 /*
415 415 * Handles and addresses of DMA buffer
416 416 */
417 417 typedef struct dma_buffer {
418 418 caddr_t address; /* Virtual address */
419 419 uint64_t dma_address; /* DMA (Hardware) address */
420 420 ddi_acc_handle_t acc_handle; /* Data access handle */
421 421 ddi_dma_handle_t dma_handle; /* DMA handle */
422 422 size_t size; /* Buffer size */
423 423 size_t len; /* Data length in the buffer */
424 424 } dma_buffer_t;
425 425
426 426 /*
427 427 * Tx Control Block
428 428 */
429 429 typedef struct tx_control_block {
430 430 single_link_t link;
431 431 uint32_t last_index; /* last descriptor of the pkt */
432 432 uint32_t frag_num;
433 433 uint32_t desc_num;
434 434 mblk_t *mp;
435 435 tx_type_t tx_type;
436 436 ddi_dma_handle_t tx_dma_handle;
437 437 dma_buffer_t tx_buf;
438 438 sw_desc_t desc[MAX_COOKIE];
439 439 } tx_control_block_t;
440 440
441 441 /*
442 442 * RX Control Block
443 443 */
444 444 typedef struct rx_control_block {
445 445 mblk_t *mp;
446 446 uint32_t ref_cnt;
447 447 dma_buffer_t rx_buf;
448 448 frtn_t free_rtn;
449 449 struct ixgbe_rx_data *rx_data;
450 450 int lro_next; /* Index of next rcb */
451 451 int lro_prev; /* Index of previous rcb */
452 452 boolean_t lro_pkt; /* Flag for LRO rcb */
453 453 } rx_control_block_t;
454 454
455 455 /*
456 456 * Software Data Structure for Tx Ring
457 457 */
458 458 typedef struct ixgbe_tx_ring {
459 459 uint32_t index; /* Ring index */
460 460 uint32_t intr_vector; /* Interrupt vector index */
461 461 uint32_t vect_bit; /* vector's bit in register */
462 462
463 463 /*
464 464 * Mutexes
465 465 */
466 466 kmutex_t tx_lock;
467 467 kmutex_t recycle_lock;
468 468 kmutex_t tcb_head_lock;
469 469 kmutex_t tcb_tail_lock;
470 470
471 471 /*
472 472 * Tx descriptor ring definitions
473 473 */
474 474 dma_buffer_t tbd_area;
475 475 union ixgbe_adv_tx_desc *tbd_ring;
476 476 uint32_t tbd_head; /* Index of next tbd to recycle */
477 477 uint32_t tbd_tail; /* Index of next tbd to transmit */
478 478 uint32_t tbd_free; /* Number of free tbd */
479 479
480 480 /*
481 481 * Tx control block list definitions
482 482 */
483 483 tx_control_block_t *tcb_area;
484 484 tx_control_block_t **work_list;
485 485 tx_control_block_t **free_list;
486 486 uint32_t tcb_head; /* Head index of free list */
487 487 uint32_t tcb_tail; /* Tail index of free list */
488 488 uint32_t tcb_free; /* Number of free tcb in free list */
489 489
490 490 uint32_t *tbd_head_wb; /* Head write-back */
491 491 uint32_t (*tx_recycle)(struct ixgbe_tx_ring *);
492 492
493 493 /*
494 494 * s/w context structure for TCP/UDP checksum offload
495 495 * and LSO.
496 496 */
497 497 ixgbe_tx_context_t tx_context;
498 498
499 499 /*
500 500 * Tx ring settings and status
501 501 */
502 502 uint32_t ring_size; /* Tx descriptor ring size */
503 503 uint32_t free_list_size; /* Tx free list size */
504 504
505 505 boolean_t reschedule;
506 506 uint32_t recycle_fail;
507 507 uint32_t stall_watchdog;
508 508
509 509 uint32_t stat_overload;
510 510 uint32_t stat_fail_no_tbd;
511 511 uint32_t stat_fail_no_tcb;
512 512 uint32_t stat_fail_dma_bind;
513 513 uint32_t stat_reschedule;
514 514 uint32_t stat_break_tbd_limit;
515 515 uint32_t stat_lso_header_fail;
516 516
517 517 uint64_t stat_obytes;
518 518 uint64_t stat_opackets;
519 519
520 520 mac_ring_handle_t ring_handle;
521 521
522 522 /*
523 523 * Pointer to the ixgbe struct
524 524 */
525 525 struct ixgbe *ixgbe;
526 526 } ixgbe_tx_ring_t;
527 527
528 528 /*
529 529 * Software Receive Ring
530 530 */
531 531 typedef struct ixgbe_rx_data {
532 532 kmutex_t recycle_lock; /* Recycle lock, for rcb_tail */
533 533
534 534 /*
535 535 * Rx descriptor ring definitions
536 536 */
537 537 dma_buffer_t rbd_area; /* DMA buffer of rx desc ring */
538 538 union ixgbe_adv_rx_desc *rbd_ring; /* Rx desc ring */
539 539 uint32_t rbd_next; /* Index of next rx desc */
540 540
541 541 /*
542 542 * Rx control block list definitions
543 543 */
544 544 rx_control_block_t *rcb_area;
545 545 rx_control_block_t **work_list; /* Work list of rcbs */
546 546 rx_control_block_t **free_list; /* Free list of rcbs */
547 547 uint32_t rcb_head; /* Index of next free rcb */
548 548 uint32_t rcb_tail; /* Index to put recycled rcb */
549 549 uint32_t rcb_free; /* Number of free rcbs */
550 550
551 551 /*
552 552 * Rx sw ring settings and status
553 553 */
554 554 uint32_t ring_size; /* Rx descriptor ring size */
555 555 uint32_t free_list_size; /* Rx free list size */
556 556
557 557 uint32_t rcb_pending;
558 558 uint32_t flag;
559 559
560 560 uint32_t lro_num; /* Number of rcbs of one LRO */
561 561 uint32_t lro_first; /* Index of first LRO rcb */
562 562
563 563 struct ixgbe_rx_ring *rx_ring; /* Pointer to rx ring */
564 564 } ixgbe_rx_data_t;
565 565
566 566 /*
567 567 * Software Data Structure for Rx Ring
568 568 */
569 569 typedef struct ixgbe_rx_ring {
570 570 uint32_t index; /* Ring index */
571 571 uint32_t group_index; /* Group index */
572 572 uint32_t hw_index; /* h/w ring index */
573 573 uint32_t intr_vector; /* Interrupt vector index */
574 574 uint32_t vect_bit; /* vector's bit in register */
575 575
576 576 ixgbe_rx_data_t *rx_data; /* Rx software ring */
577 577
578 578 kmutex_t rx_lock; /* Rx access lock */
579 579
580 580 uint32_t stat_frame_error;
581 581 uint32_t stat_cksum_error;
582 582 uint32_t stat_exceed_pkt;
583 583
584 584 uint64_t stat_rbytes;
585 585 uint64_t stat_ipackets;
586 586
587 587 mac_ring_handle_t ring_handle;
588 588 uint64_t ring_gen_num;
589 589
590 590 struct ixgbe *ixgbe; /* Pointer to ixgbe struct */
591 591 } ixgbe_rx_ring_t;
592 592 /*
593 593 * Software Receive Ring Group
594 594 */
595 595 typedef struct ixgbe_rx_group {
596 596 uint32_t index; /* Group index */
597 597 mac_group_handle_t group_handle; /* call back group handle */
598 598 struct ixgbe *ixgbe; /* Pointer to ixgbe struct */
599 599 } ixgbe_rx_group_t;
600 600
601 601 /*
602 602 * structure to map interrupt cleanup to msi-x vector
603 603 */
604 604 typedef struct ixgbe_intr_vector {
605 605 struct ixgbe *ixgbe; /* point to my adapter */
606 606 ulong_t rx_map[BT_BITOUL(MAX_RX_QUEUE_NUM)]; /* bitmap of rx rings */
607 607 int rxr_cnt; /* count rx rings */
↓ open down ↓ |
290 lines elided |
↑ open up ↑ |
608 608 ulong_t tx_map[BT_BITOUL(MAX_TX_QUEUE_NUM)]; /* bitmap of tx rings */
609 609 int txr_cnt; /* count tx rings */
610 610 ulong_t other_map[BT_BITOUL(2)]; /* bitmap of other */
611 611 int other_cnt; /* count other interrupt */
612 612 } ixgbe_intr_vector_t;
613 613
614 614 /*
615 615 * Software adapter state
616 616 */
617 617 typedef struct ixgbe {
618 - int instance;
618 + int instance;
619 619 mac_handle_t mac_hdl;
620 620 dev_info_t *dip;
621 621 struct ixgbe_hw hw;
622 622 struct ixgbe_osdep osdep;
623 623
624 624 adapter_info_t *capab; /* adapter hardware capabilities */
625 625 ddi_taskq_t *sfp_taskq; /* sfp-change taskq */
626 626 ddi_taskq_t *overtemp_taskq; /* overtemp taskq */
627 627 ddi_taskq_t *phy_taskq; /* external PHY taskq */
628 628 uint32_t eims; /* interrupt mask setting */
629 629 uint32_t eimc; /* interrupt mask clear */
630 630 uint32_t eicr; /* interrupt cause reg */
631 631
632 632 uint32_t ixgbe_state;
633 633 link_state_t link_state;
634 634 uint32_t link_speed;
635 635 uint32_t link_duplex;
636 636
637 637 uint32_t reset_count;
638 638 uint32_t attach_progress;
639 639 uint32_t loopback_mode;
640 640 uint32_t default_mtu;
641 641 uint32_t max_frame_size;
642 642 ixgbe_link_speed speeds_supported;
643 643
644 644 uint32_t rcb_pending;
645 645
646 646 /*
647 647 * Each msi-x vector: map vector to interrupt cleanup
648 648 */
649 649 ixgbe_intr_vector_t vect_map[MAX_INTR_VECTOR];
650 650
651 651 /*
652 652 * Receive Rings
653 653 */
654 654 ixgbe_rx_ring_t *rx_rings; /* Array of rx rings */
655 655 uint32_t num_rx_rings; /* Number of rx rings in use */
656 656 uint32_t rx_ring_size; /* Rx descriptor ring size */
657 657 uint32_t rx_buf_size; /* Rx buffer size */
658 658 boolean_t lro_enable; /* Large Receive Offload */
659 659 uint64_t lro_pkt_count; /* LRO packet count */
660 660 /*
661 661 * Receive Groups
662 662 */
663 663 ixgbe_rx_group_t *rx_groups; /* Array of rx groups */
664 664 uint32_t num_rx_groups; /* Number of rx groups in use */
665 665
666 666 /*
↓ open down ↓ |
38 lines elided |
↑ open up ↑ |
667 667 * Transmit Rings
668 668 */
669 669 ixgbe_tx_ring_t *tx_rings; /* Array of tx rings */
670 670 uint32_t num_tx_rings; /* Number of tx rings in use */
671 671 uint32_t tx_ring_size; /* Tx descriptor ring size */
672 672 uint32_t tx_buf_size; /* Tx buffer size */
673 673
674 674 boolean_t tx_ring_init;
675 675 boolean_t tx_head_wb_enable; /* Tx head wrtie-back */
676 676 boolean_t tx_hcksum_enable; /* Tx h/w cksum offload */
677 - boolean_t lso_enable; /* Large Segment Offload */
678 - boolean_t mr_enable; /* Multiple Tx and Rx Ring */
677 + boolean_t lso_enable; /* Large Segment Offload */
678 + boolean_t mr_enable; /* Multiple Tx and Rx Ring */
679 679 boolean_t relax_order_enable; /* Relax Order */
680 680 uint32_t classify_mode; /* Classification mode */
681 681 uint32_t tx_copy_thresh; /* Tx copy threshold */
682 682 uint32_t tx_recycle_thresh; /* Tx recycle threshold */
683 683 uint32_t tx_overload_thresh; /* Tx overload threshold */
684 684 uint32_t tx_resched_thresh; /* Tx reschedule threshold */
685 685 boolean_t rx_hcksum_enable; /* Rx h/w cksum offload */
686 686 uint32_t rx_copy_thresh; /* Rx copy threshold */
687 687 uint32_t rx_limit_per_intr; /* Rx pkts per interrupt */
688 688 uint32_t intr_throttling[MAX_INTR_VECTOR];
689 689 uint32_t intr_force;
690 690 int fm_capabilities; /* FMA capabilities */
691 691
692 692 int intr_type;
693 693 int intr_cnt;
694 694 uint32_t intr_cnt_max;
695 695 uint32_t intr_cnt_min;
696 696 int intr_cap;
697 697 size_t intr_size;
698 698 uint_t intr_pri;
699 699 ddi_intr_handle_t *htable;
700 700 uint32_t eims_mask;
701 701 ddi_cb_handle_t cb_hdl; /* Interrupt callback handle */
702 702
703 703 kmutex_t gen_lock; /* General lock for device access */
704 704 kmutex_t watchdog_lock;
705 705 kmutex_t rx_pending_lock;
706 706
707 707 boolean_t watchdog_enable;
708 708 boolean_t watchdog_start;
709 709 timeout_id_t watchdog_tid;
710 710
711 711 boolean_t unicst_init;
712 712 uint32_t unicst_avail;
713 713 uint32_t unicst_total;
714 714 ixgbe_ether_addr_t unicst_addr[MAX_NUM_UNICAST_ADDRESSES];
715 715 uint32_t mcast_count;
716 716 struct ether_addr mcast_table[MAX_NUM_MULTICAST_ADDRESSES];
717 717
718 718 ulong_t sys_page_size;
719 719
720 720 boolean_t link_check_complete;
721 721 hrtime_t link_check_hrtime;
722 722 ddi_periodic_t periodic_id; /* for link check timer func */
723 723
724 724 /*
725 725 * LED related constants.
726 726 */
727 727 boolean_t ixgbe_led_active;
728 728 boolean_t ixgbe_led_blink;
729 729 uint32_t ixgbe_led_reg;
730 730 uint32_t ixgbe_led_index;
731 731
732 732 /*
733 733 * Kstat definitions
734 734 */
735 735 kstat_t *ixgbe_ks;
736 736
737 737 uint32_t param_en_10000fdx_cap:1,
738 738 param_en_5000fdx_cap:1,
739 739 param_en_2500fdx_cap:1,
740 740 param_en_1000fdx_cap:1,
741 741 param_en_100fdx_cap:1,
742 742 param_adv_10000fdx_cap:1,
743 743 param_adv_5000fdx_cap:1,
744 744 param_adv_2500fdx_cap:1,
745 745 param_adv_1000fdx_cap:1,
746 746 param_adv_100fdx_cap:1,
747 747 param_pause_cap:1,
748 748 param_asym_pause_cap:1,
749 749 param_rem_fault:1,
750 750 param_adv_autoneg_cap:1,
751 751 param_adv_pause_cap:1,
752 752 param_adv_asym_pause_cap:1,
753 753 param_adv_rem_fault:1,
754 754 param_lp_10000fdx_cap:1,
755 755 param_lp_5000fdx_cap:1,
756 756 param_lp_2500fdx_cap:1,
757 757 param_lp_1000fdx_cap:1,
758 758 param_lp_100fdx_cap:1,
759 759 param_lp_autoneg_cap:1,
760 760 param_lp_pause_cap:1,
761 761 param_lp_asym_pause_cap:1,
762 762 param_lp_rem_fault:1,
763 763 param_pad_to_32:6;
764 764 } ixgbe_t;
765 765
766 766 typedef struct ixgbe_stat {
767 767 kstat_named_t link_speed; /* Link Speed */
768 768
769 769 kstat_named_t reset_count; /* Reset Count */
770 770
771 771 kstat_named_t rx_frame_error; /* Rx Error in Packet */
772 772 kstat_named_t rx_cksum_error; /* Rx Checksum Error */
773 773 kstat_named_t rx_exceed_pkt; /* Rx Exceed Max Pkt Count */
774 774
775 775 kstat_named_t tx_overload; /* Tx Desc Ring Overload */
776 776 kstat_named_t tx_fail_no_tcb; /* Tx Fail Freelist Empty */
↓ open down ↓ |
88 lines elided |
↑ open up ↑ |
777 777 kstat_named_t tx_fail_no_tbd; /* Tx Fail Desc Ring Empty */
778 778 kstat_named_t tx_fail_dma_bind; /* Tx Fail DMA bind */
779 779 kstat_named_t tx_reschedule; /* Tx Reschedule */
780 780 kstat_named_t tx_break_tbd_limit; /* Reached single xmit desc limit */
781 781 kstat_named_t tx_lso_header_fail; /* New mblk for last LSO hdr frag */
782 782
783 783 kstat_named_t gprc; /* Good Packets Received Count */
784 784 kstat_named_t gptc; /* Good Packets Xmitted Count */
785 785 kstat_named_t gor; /* Good Octets Received Count */
786 786 kstat_named_t got; /* Good Octets Xmitd Count */
787 + kstat_named_t qor; /* Queue Octets Received */
788 + kstat_named_t qot; /* Queue Octets Transmitted */
789 + kstat_named_t qpr; /* Queue Packets Received */
790 + kstat_named_t qpt; /* Queue Packets Transmitted */
787 791 kstat_named_t prc64; /* Packets Received - 64b */
788 792 kstat_named_t prc127; /* Packets Received - 65-127b */
789 793 kstat_named_t prc255; /* Packets Received - 127-255b */
790 794 kstat_named_t prc511; /* Packets Received - 256-511b */
791 795 kstat_named_t prc1023; /* Packets Received - 511-1023b */
792 796 kstat_named_t prc1522; /* Packets Received - 1024-1522b */
793 797 kstat_named_t ptc64; /* Packets Xmitted (64b) */
794 798 kstat_named_t ptc127; /* Packets Xmitted (64-127b) */
795 799 kstat_named_t ptc255; /* Packets Xmitted (128-255b) */
796 800 kstat_named_t ptc511; /* Packets Xmitted (255-511b) */
797 801 kstat_named_t ptc1023; /* Packets Xmitted (512-1023b) */
798 802 kstat_named_t ptc1522; /* Packets Xmitted (1024-1522b */
799 - kstat_named_t qprc[16]; /* Queue Packets Received Count */
800 - kstat_named_t qptc[16]; /* Queue Packets Transmitted Count */
801 - kstat_named_t qbrc[16]; /* Queue Bytes Received Count */
802 - kstat_named_t qbtc[16]; /* Queue Bytes Transmitted Count */
803 803
804 804 kstat_named_t crcerrs; /* CRC Error Count */
805 805 kstat_named_t illerrc; /* Illegal Byte Error Count */
806 806 kstat_named_t errbc; /* Error Byte Count */
807 807 kstat_named_t mspdc; /* MAC Short Packet Discard Count */
808 808 kstat_named_t mpc; /* Missed Packets Count */
809 809 kstat_named_t mlfc; /* MAC Local Fault Count */
810 810 kstat_named_t mrfc; /* MAC Remote Fault Count */
811 811 kstat_named_t rlec; /* Receive Length Error Count */
812 812 kstat_named_t lxontxc; /* Link XON Transmitted Count */
813 813 kstat_named_t lxonrxc; /* Link XON Received Count */
814 814 kstat_named_t lxofftxc; /* Link XOFF Transmitted Count */
815 815 kstat_named_t lxoffrxc; /* Link XOFF Received Count */
816 816 kstat_named_t bprc; /* Broadcasts Pkts Received Count */
817 817 kstat_named_t mprc; /* Multicast Pkts Received Count */
818 818 kstat_named_t rnbc; /* Receive No Buffers Count */
819 819 kstat_named_t ruc; /* Receive Undersize Count */
820 820 kstat_named_t rfc; /* Receive Frag Count */
821 821 kstat_named_t roc; /* Receive Oversize Count */
822 822 kstat_named_t rjc; /* Receive Jabber Count */
823 823 kstat_named_t tor; /* Total Octets Recvd Count */
824 824 kstat_named_t tot; /* Total Octets Xmitted Count */
825 825 kstat_named_t tpr; /* Total Packets Received */
826 826 kstat_named_t tpt; /* Total Packets Xmitted */
827 827 kstat_named_t mptc; /* Multicast Packets Xmited Count */
828 828 kstat_named_t bptc; /* Broadcast Packets Xmited Count */
829 829 kstat_named_t lroc; /* LRO Packets Received Count */
830 830 kstat_named_t dev_gone; /* Number of device gone events encountered */
831 831 } ixgbe_stat_t;
832 832
833 833 /*
834 834 * Function prototypes in ixgbe_buf.c
835 835 */
836 836 int ixgbe_alloc_dma(ixgbe_t *);
837 837 void ixgbe_free_dma(ixgbe_t *);
838 838 void ixgbe_set_fma_flags(int);
839 839 void ixgbe_free_dma_buffer(dma_buffer_t *);
840 840 int ixgbe_alloc_rx_ring_data(ixgbe_rx_ring_t *rx_ring);
841 841 void ixgbe_free_rx_ring_data(ixgbe_rx_data_t *rx_data);
842 842
843 843 /*
844 844 * Function prototypes in ixgbe_main.c
845 845 */
846 846 int ixgbe_start(ixgbe_t *, boolean_t);
847 847 void ixgbe_stop(ixgbe_t *, boolean_t);
848 848 int ixgbe_driver_setup_link(ixgbe_t *, boolean_t);
849 849 int ixgbe_multicst_add(ixgbe_t *, const uint8_t *);
850 850 int ixgbe_multicst_remove(ixgbe_t *, const uint8_t *);
851 851 enum ioc_reply ixgbe_loopback_ioctl(ixgbe_t *, struct iocblk *, mblk_t *);
852 852
853 853 void ixgbe_enable_watchdog_timer(ixgbe_t *);
854 854 void ixgbe_disable_watchdog_timer(ixgbe_t *);
855 855 int ixgbe_atomic_reserve(uint32_t *, uint32_t);
856 856
857 857 int ixgbe_check_acc_handle(ddi_acc_handle_t handle);
858 858 int ixgbe_check_dma_handle(ddi_dma_handle_t handle);
859 859 void ixgbe_fm_ereport(ixgbe_t *, char *);
860 860
861 861 void ixgbe_fill_ring(void *, mac_ring_type_t, const int, const int,
862 862 mac_ring_info_t *, mac_ring_handle_t);
863 863 void ixgbe_fill_group(void *arg, mac_ring_type_t, const int,
864 864 mac_group_info_t *, mac_group_handle_t);
865 865 int ixgbe_rx_ring_intr_enable(mac_intr_handle_t);
866 866 int ixgbe_rx_ring_intr_disable(mac_intr_handle_t);
867 867
868 868 int ixgbe_transceiver_info(void *, uint_t, mac_transceiver_info_t *);
869 869 int ixgbe_transceiver_read(void *, uint_t, uint_t, void *, size_t, off_t,
870 870 size_t *);
871 871
872 872 /*
873 873 * Function prototypes in ixgbe_gld.c
874 874 */
875 875 int ixgbe_m_start(void *);
876 876 void ixgbe_m_stop(void *);
877 877 int ixgbe_m_promisc(void *, boolean_t);
878 878 int ixgbe_m_multicst(void *, boolean_t, const uint8_t *);
879 879 void ixgbe_m_resources(void *);
880 880 void ixgbe_m_ioctl(void *, queue_t *, mblk_t *);
881 881 boolean_t ixgbe_m_getcapab(void *, mac_capab_t, void *);
882 882 int ixgbe_m_setprop(void *, const char *, mac_prop_id_t, uint_t, const void *);
883 883 int ixgbe_m_getprop(void *, const char *, mac_prop_id_t, uint_t, void *);
884 884 void ixgbe_m_propinfo(void *, const char *, mac_prop_id_t,
885 885 mac_prop_info_handle_t);
886 886 int ixgbe_set_priv_prop(ixgbe_t *, const char *, uint_t, const void *);
887 887 int ixgbe_get_priv_prop(ixgbe_t *, const char *, uint_t, void *);
888 888 boolean_t ixgbe_param_locked(mac_prop_id_t);
889 889
890 890 /*
891 891 * Function prototypes in ixgbe_rx.c
892 892 */
893 893 mblk_t *ixgbe_ring_rx(ixgbe_rx_ring_t *, int);
894 894 void ixgbe_rx_recycle(caddr_t arg);
895 895 mblk_t *ixgbe_ring_rx_poll(void *, int);
896 896
897 897 /*
898 898 * Function prototypes in ixgbe_tx.c
899 899 */
900 900 mblk_t *ixgbe_ring_tx(void *, mblk_t *);
901 901 void ixgbe_free_tcb(tx_control_block_t *);
902 902 void ixgbe_put_free_list(ixgbe_tx_ring_t *, link_list_t *);
903 903 uint32_t ixgbe_tx_recycle_legacy(ixgbe_tx_ring_t *);
904 904 uint32_t ixgbe_tx_recycle_head_wb(ixgbe_tx_ring_t *);
905 905
906 906 /*
907 907 * Function prototypes in ixgbe_log.c
908 908 */
909 909 void ixgbe_notice(void *, const char *, ...);
910 910 void ixgbe_log(void *, const char *, ...);
911 911 void ixgbe_error(void *, const char *, ...);
912 912
913 913 /*
914 914 * Function prototypes in ixgbe_stat.c
915 915 */
916 916 int ixgbe_init_stats(ixgbe_t *);
917 917 int ixgbe_m_stat(void *, uint_t, uint64_t *);
918 918 int ixgbe_rx_ring_stat(mac_ring_driver_t, uint_t, uint64_t *);
919 919 int ixgbe_tx_ring_stat(mac_ring_driver_t, uint_t, uint64_t *);
920 920
921 921 #ifdef __cplusplus
922 922 }
923 923 #endif
924 924
925 925 #endif /* _IXGBE_SW_H */
↓ open down ↓ |
113 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX