xref: /dragonfly/sys/dev/netif/oce/oce_sysctl.c (revision 9348a738)
1 /*-
2  * Copyright (C) 2013 Emulex
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  *    this list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * 3. Neither the name of the Emulex Corporation nor the names of its
16  *    contributors may be used to endorse or promote products derived from
17  *    this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  *
31  * Contact Information:
32  * freebsd-drivers@emulex.com
33  *
34  * Emulex
35  * 3333 Susan Street
36  * Costa Mesa, CA 92626
37  */
38 
39 /* $FreeBSD: src/sys/dev/oce/oce_sysctl.c,v 1.6 2013/07/07 00:30:13 svnexp Exp $ */
40 
41 
42 #include "oce_if.h"
43 
44 static void copy_stats_to_sc_xe201(POCE_SOFTC sc);
45 static void copy_stats_to_sc_be3(POCE_SOFTC sc);
46 static void copy_stats_to_sc_be2(POCE_SOFTC sc);
47 static int  oce_sysctl_loopback(SYSCTL_HANDLER_ARGS);
48 static int  oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
49 static int  oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS);
50 static int  oce_be3_flashdata(POCE_SOFTC sc, const struct firmware
51 						*fw, int num_imgs);
52 static int  oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
53 static int oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS);
54 static boolean_t oce_phy_flashing_required(POCE_SOFTC sc);
55 static boolean_t oce_img_flashing_required(POCE_SOFTC sc, const char *p,
56 				int img_optype, uint32_t img_offset,
57 				uint32_t img_size, uint32_t hdrs_size);
58 static void oce_add_stats_sysctls_be3(POCE_SOFTC sc,
59 				struct sysctl_ctx_list *ctx,
60 				struct sysctl_oid *stats_node);
61 static void oce_add_stats_sysctls_xe201(POCE_SOFTC sc,
62 				struct sysctl_ctx_list *ctx,
63 				struct sysctl_oid *stats_node);
64 
65 extern char component_revision[32];
66 uint32_t sfp_vpd_dump_buffer[TRANSCEIVER_DATA_NUM_ELE];
67 
68 void
69 oce_add_sysctls(POCE_SOFTC sc)
70 {
71 
72 	struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev);
73 	struct sysctl_oid *tree = device_get_sysctl_tree(sc->dev);
74 	struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree);
75 	struct sysctl_oid *stats_node;
76 
77 	SYSCTL_ADD_STRING(ctx, child,
78 			OID_AUTO, "component_revision",
79 			CTLTYPE_INT | CTLFLAG_RD,
80 			&component_revision,
81 			sizeof(component_revision),
82 			"EMULEX One-Connect device driver revision");
83 
84 	SYSCTL_ADD_STRING(ctx, child,
85 			OID_AUTO, "firmware_version",
86 			CTLTYPE_INT | CTLFLAG_RD,
87 			&sc->fw_version,
88 			sizeof(sc->fw_version),
89 			"EMULEX One-Connect Firmware Version");
90 
91 	SYSCTL_ADD_INT(ctx, child,
92 			OID_AUTO, "max_rsp_handled",
93 			CTLTYPE_INT | CTLFLAG_RW,
94 			&oce_max_rsp_handled,
95 			sizeof(oce_max_rsp_handled),
96 			"Maximum receive frames handled per interrupt");
97 
98 	if ((sc->function_mode & FNM_FLEX10_MODE) ||
99 	    (sc->function_mode & FNM_UMC_MODE))
100 		SYSCTL_ADD_UINT(ctx, child,
101 				OID_AUTO, "speed",
102 				CTLFLAG_RD,
103 				&sc->qos_link_speed,
104 				0,"QOS Speed");
105 	else
106 		SYSCTL_ADD_UINT(ctx, child,
107 				OID_AUTO, "speed",
108 				CTLFLAG_RD,
109 				&sc->speed,
110 				0,"Link Speed");
111 
112 	if (sc->function_mode & FNM_UMC_MODE)
113 		SYSCTL_ADD_UINT(ctx, child,
114 				OID_AUTO, "pvid",
115 				CTLFLAG_RD,
116 				&sc->pvid,
117 				0,"PVID");
118 
119 	SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "loop_back",
120 		CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0,
121 		oce_sysctl_loopback, "I", "Loop Back Tests");
122 
123 	SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "fw_upgrade",
124 		CTLTYPE_STRING | CTLFLAG_RW, (void *)sc, 0,
125 		oce_sys_fwupgrade, "A", "Firmware ufi file");
126 
127         /*
128          *  Dumps Transceiver data
129 	 *  "sysctl hw.oce0.sfp_vpd_dump=0"
130          *  "sysctl -x hw.oce0.sfp_vpd_dump_buffer" for hex dump
131          *  "sysctl -b hw.oce0.sfp_vpd_dump_buffer > sfp.bin" for binary dump
132          */
133 	SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "sfp_vpd_dump",
134 			CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, oce_sysctl_sfp_vpd_dump,
135 			"I", "Initiate a sfp_vpd_dump operation");
136 	SYSCTL_ADD_OPAQUE(ctx, child, OID_AUTO, "sfp_vpd_dump_buffer",
137 			CTLFLAG_RD, sfp_vpd_dump_buffer,
138 			TRANSCEIVER_DATA_SIZE, "IU", "Access sfp_vpd_dump buffer");
139 
140 	stats_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats",
141 				CTLFLAG_RD, NULL, "Ethernet Statistics");
142 
143 	if (IS_BE(sc) || IS_SH(sc))
144 		oce_add_stats_sysctls_be3(sc, ctx, stats_node);
145 	else
146 		oce_add_stats_sysctls_xe201(sc, ctx, stats_node);
147 
148 
149 }
150 
151 
152 static uint32_t
153 oce_loopback_test(struct oce_softc *sc, uint8_t loopback_type)
154 {
155 	uint32_t status = 0;
156 
157 	oce_mbox_cmd_set_loopback(sc, sc->if_id, loopback_type, 1);
158 	status = oce_mbox_cmd_test_loopback(sc, sc->if_id, loopback_type,
159 				1500, 2, 0xabc);
160 	oce_mbox_cmd_set_loopback(sc, sc->if_id, OCE_NO_LOOPBACK, 1);
161 
162 	return status;
163 }
164 
165 static int
166 oce_sysctl_loopback(SYSCTL_HANDLER_ARGS)
167 {
168 	int value = 0;
169 	uint32_t status;
170 	struct oce_softc *sc  = (struct oce_softc *)arg1;
171 
172 	status = sysctl_handle_int(oidp, &value, 0, req);
173 	if (status || !req->newptr)
174 		return status;
175 
176 	if (value != 1) {
177 		device_printf(sc->dev,
178 			"Not a Valid value. Set to loop_back=1 to run tests\n");
179 		return 0;
180 	}
181 
182 	if ((status = oce_loopback_test(sc, OCE_MAC_LOOPBACK))) {
183 		device_printf(sc->dev,
184 			"MAC Loopback Test = Failed (Error status = %d)\n",
185 			 status);
186 	} else
187 		device_printf(sc->dev, "MAC Loopback Test = Success\n");
188 
189 	if ((status = oce_loopback_test(sc, OCE_PHY_LOOPBACK))) {
190 		device_printf(sc->dev,
191 			"PHY Loopback Test = Failed (Error status = %d)\n",
192 			 status);
193 	} else
194 		device_printf(sc->dev, "PHY Loopback Test = Success\n");
195 
196 	if ((status = oce_loopback_test(sc, OCE_ONE_PORT_EXT_LOOPBACK))) {
197 		device_printf(sc->dev,
198 			"EXT Loopback Test = Failed (Error status = %d)\n",
199 			 status);
200 	} else
201 		device_printf(sc->dev, "EXT Loopback Test = Success\n");
202 
203 	return 0;
204 }
205 
206 
207 static int
208 oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS)
209 {
210 	char ufiname[256] = {0};
211 	uint32_t status = 1;
212 	struct oce_softc *sc  = (struct oce_softc *)arg1;
213 	const struct firmware *fw;
214 
215 	status = sysctl_handle_string(oidp, ufiname, sizeof(ufiname), req);
216 	if (status || !req->newptr)
217 		return status;
218 
219 	fw = firmware_get(ufiname);
220 	if (fw == NULL) {
221 		device_printf(sc->dev, "Unable to get Firmware. "
222 			"Make sure %s is copied to /boot/kernel\n", ufiname);
223 		return ENOENT;
224 	}
225 
226 	if (IS_BE(sc) || IS_SH(sc)) {
227 		if ((sc->flags & OCE_FLAGS_BE2)) {
228 			device_printf(sc->dev,
229 				"Flashing not supported for BE2 yet.\n");
230 			status = 1;
231 			goto done;
232 		}
233 		status = oce_be3_fwupgrade(sc, fw);
234 	} else
235 		status = oce_lancer_fwupgrade(sc, fw);
236 done:
237 	if (status) {
238 		device_printf(sc->dev, "Firmware Upgrade failed\n");
239 	} else {
240 		device_printf(sc->dev, "Firmware Flashed successfully\n");
241 	}
242 
243 	/* Release Firmware*/
244 	firmware_put(fw, FIRMWARE_UNLOAD);
245 
246 	return status;
247 }
248 
249 
250 static int
251 oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw)
252 {
253 	int rc = 0, num_imgs = 0, i = 0;
254 	const struct flash_file_hdr *fhdr;
255 	const struct image_hdr *img_ptr;
256 
257 	fhdr = (const struct flash_file_hdr *)fw->data;
258 	if (fhdr->build[0] != '3') {
259 		device_printf(sc->dev, "Invalid BE3 firmware image\n");
260 		return EINVAL;
261 	}
262 	/* Display flash version */
263 	device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]);
264 
265 	num_imgs = fhdr->num_imgs;
266 	for (i = 0; i < num_imgs; i++) {
267 		img_ptr = (const struct image_hdr *)((const char *)fw->data +
268 				sizeof(struct flash_file_hdr) +
269 				(i * sizeof(struct image_hdr)));
270 		if (img_ptr->imageid == 1) {
271 			rc = oce_be3_flashdata(sc, fw, num_imgs);
272 			break;
273 		}
274 	}
275 
276 	return rc;
277 }
278 
279 
280 static int
281 oce_be3_flashdata(POCE_SOFTC sc, const struct firmware *fw, int num_imgs)
282 {
283 	char cookie[2][16] =    {"*** SE FLAS", "H DIRECTORY *** "};
284 	const char *p = (const char *)fw->data;
285 	const struct flash_sec_info *fsec = NULL;
286 	struct mbx_common_read_write_flashrom *req;
287 	int rc = 0, i, img_type, bin_offset = 0;
288 	boolean_t skip_image;
289 	uint32_t optype = 0, size = 0, start = 0, num_bytes = 0;
290 	uint32_t opcode = 0;
291 	OCE_DMA_MEM dma_mem;
292 
293 	/* Validate Cookie */
294 	bin_offset = (sizeof(struct flash_file_hdr) +
295 		(num_imgs * sizeof(struct image_hdr)));
296 	p += bin_offset;
297 	while (p < ((const char *)fw->data + fw->datasize)) {
298 		fsec = (const struct flash_sec_info *)p;
299 		if (!memcmp(cookie, fsec->cookie, sizeof(cookie)))
300 			break;
301 		fsec = NULL;
302 		p += 32;
303 	}
304 
305 	if (!fsec) {
306 		device_printf(sc->dev,
307 			"Invalid Cookie. Firmware image corrupted ?\n");
308 		return EINVAL;
309 	}
310 
311 	rc = oce_dma_alloc(sc, sizeof(struct mbx_common_read_write_flashrom)
312 			+ 32*1024, &dma_mem, 0);
313 	if (rc) {
314 		device_printf(sc->dev,
315 			"Memory allocation failure while flashing\n");
316 		return ENOMEM;
317 	}
318 	req = OCE_DMAPTR(&dma_mem, struct mbx_common_read_write_flashrom);
319 
320 	for (i = 0; i < MAX_FLASH_COMP; i++) {
321 
322 		img_type = fsec->fsec_entry[i].type;
323 		skip_image = FALSE;
324 		switch (img_type) {
325 		case IMG_ISCSI:
326 			optype = 0;
327 			size = 2097152;
328 			start = 2097152;
329 			break;
330 		case IMG_REDBOOT:
331 			optype = 1;
332 			size = 1048576;
333 			start = 262144;
334 			if (!oce_img_flashing_required(sc, fw->data,
335 				optype, start, size, bin_offset))
336 				skip_image = TRUE;
337 			break;
338 		case IMG_BIOS:
339 			optype = 2;
340 			size = 524288;
341 			start = 12582912;
342 			break;
343 		case IMG_PXEBIOS:
344 			optype = 3;
345 			size = 524288;
346 			start = 13107200;
347 			break;
348 		case IMG_FCOEBIOS:
349 			optype = 8;
350 			size = 524288;
351 			start = 13631488;
352 			break;
353 		case IMG_ISCSI_BAK:
354 			optype = 9;
355 			size = 2097152;
356 			start = 4194304;
357 			break;
358 		case IMG_FCOE:
359 			optype = 10;
360 			size = 2097152;
361 			start = 6291456;
362 			break;
363 		case IMG_FCOE_BAK:
364 			optype = 11;
365 			size = 2097152;
366 			start = 8388608;
367 			break;
368 		case IMG_NCSI:
369 			optype = 13;
370 			size = 262144;
371 			start = 15990784;
372 			break;
373 		case IMG_PHY:
374 			optype = 99;
375 			size = 262144;
376 			start = 1310720;
377 			if (!oce_phy_flashing_required(sc))
378 				skip_image = TRUE;
379 			break;
380 		default:
381 			skip_image = TRUE;
382 			break;
383 		}
384 		if (skip_image)
385 			continue;
386 
387 		p = fw->data;
388 		p = p + bin_offset + start;
389 		if ((p + size) > ((const char *)fw->data + fw->datasize)) {
390 			rc = 1;
391 			goto ret;
392 		}
393 
394 		while (size) {
395 
396 			if (size > 32*1024)
397 				num_bytes = 32*1024;
398 			else
399 				num_bytes = size;
400 			size -= num_bytes;
401 
402 			if (!size)
403 				opcode = FLASHROM_OPER_FLASH;
404 			else
405 				opcode = FLASHROM_OPER_SAVE;
406 
407 			memcpy(req->data_buffer, p, num_bytes);
408 			p += num_bytes;
409 
410 			rc = oce_mbox_write_flashrom(sc, optype, opcode,
411 						&dma_mem, num_bytes);
412 			if (rc) {
413 				device_printf(sc->dev,
414 					"cmd to write to flash rom failed.\n");
415 				rc = EIO;
416 				goto ret;
417 			}
418 			/* Leave the CPU for others for some time */
419 			tsleep(oce_be3_flashdata, 0, "yield", 10);
420 
421 		}
422 	}
423 ret:
424 	oce_dma_free(sc, &dma_mem);
425 	return rc;
426 
427 }
428 
429 
430 static boolean_t
431 oce_phy_flashing_required(POCE_SOFTC sc)
432 {
433 	int status = 0;
434 	struct oce_phy_info phy_info;
435 
436 	status = oce_mbox_get_phy_info(sc, &phy_info);
437 	if (status)
438 		return FALSE;
439 
440 	if ((phy_info.phy_type == TN_8022) &&
441 		(phy_info.interface_type == PHY_TYPE_BASET_10GB)) {
442 		return TRUE;
443 	}
444 
445 	return FALSE;
446 }
447 
448 
449 static boolean_t
450 oce_img_flashing_required(POCE_SOFTC sc, const char *p,
451 				int img_optype, uint32_t img_offset,
452 				uint32_t img_size, uint32_t hdrs_size)
453 {
454 	uint32_t crc_offset;
455 	uint8_t flashed_crc[4];
456 	int status;
457 
458 	crc_offset = hdrs_size + img_offset + img_size - 4;
459 
460 	p += crc_offset;
461 
462 	status = oce_mbox_get_flashrom_crc(sc, flashed_crc,
463 			(img_size - 4), img_optype);
464 	if (status)
465 		return TRUE; /* Some thing worng. ReFlash */
466 
467 	/*update redboot only if crc does not match*/
468 	if (bcmp(flashed_crc, p, 4))
469 		return TRUE;
470 	else
471 		return FALSE;
472 }
473 
474 
475 static int
476 oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw)
477 {
478 
479 	int rc = 0;
480 	OCE_DMA_MEM dma_mem;
481 	const uint8_t *data = NULL;
482 	uint8_t *dest_image_ptr = NULL;
483 	size_t size = 0;
484 	uint32_t data_written = 0, chunk_size = 0;
485 	uint32_t offset = 0, add_status = 0;
486 
487 	if (!IS_ALIGNED(fw->datasize, sizeof(uint32_t))) {
488 		device_printf(sc->dev,
489 			"Lancer FW image is not 4 byte aligned.");
490 		return EINVAL;
491 	}
492 
493 	rc = oce_dma_alloc(sc, 32*1024, &dma_mem, 0);
494 	if (rc) {
495 		device_printf(sc->dev,
496 			"Memory allocation failure while flashing Lancer\n");
497 		return ENOMEM;
498 	}
499 
500 	size = fw->datasize;
501 	data = fw->data;
502 	dest_image_ptr = OCE_DMAPTR(&dma_mem, uint8_t);
503 
504 	while (size) {
505 		chunk_size = MIN(size, (32*1024));
506 
507 		bcopy(data, dest_image_ptr, chunk_size);
508 
509 		rc = oce_mbox_lancer_write_flashrom(sc, chunk_size, offset,
510 				&dma_mem, &data_written, &add_status);
511 
512 		if (rc)
513 			break;
514 
515 		size	-= data_written;
516 		data	+= data_written;
517 		offset	+= data_written;
518 		tsleep(oce_lancer_fwupgrade, 0, "yield", 10);
519 
520 	}
521 
522 	if (!rc)
523 		/* Commit the firmware*/
524 		rc = oce_mbox_lancer_write_flashrom(sc, 0, offset, &dma_mem,
525 						&data_written, &add_status);
526 	if (rc) {
527 		device_printf(sc->dev, "Lancer firmware load error. "
528 			"Addstatus = 0x%x, status = %d \n", add_status, rc);
529 		rc = EIO;
530 	}
531 	oce_dma_free(sc, &dma_mem);
532 	return rc;
533 
534 }
535 
536 
537 static void
538 oce_add_stats_sysctls_be3(POCE_SOFTC sc,
539 				  struct sysctl_ctx_list *ctx,
540 				  struct sysctl_oid *stats_node)
541 {
542 	struct sysctl_oid *rx_stats_node, *tx_stats_node;
543 	struct sysctl_oid_list *rx_stat_list, *tx_stat_list;
544 	struct sysctl_oid_list *queue_stats_list;
545 	struct sysctl_oid *queue_stats_node;
546 	struct oce_drv_stats *stats;
547 	char prefix[32];
548 	int i;
549 
550 	stats = &sc->oce_stats_info;
551 
552 	rx_stats_node = SYSCTL_ADD_NODE(ctx,
553 					SYSCTL_CHILDREN(stats_node),
554 					OID_AUTO,"rx", CTLFLAG_RD,
555 					NULL, "RX Ethernet Statistics");
556 	rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
557 
558 
559 	SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts",
560 			CTLFLAG_RD, &stats->rx.t_rx_pkts, 0,
561 			"Total Received Packets");
562 	SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes",
563 			CTLFLAG_RD, &stats->rx.t_rx_bytes, 0,
564 			"Total Received Bytes");
565 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags",
566 			CTLFLAG_RD, &stats->rx.t_rx_frags, 0,
567 			"Total Received Fragements");
568 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts",
569 			CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0,
570 			"Total Received Multicast Packets");
571 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts",
572 			CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0,
573 			"Total Received Unicast Packets");
574 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs",
575 			CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0,
576 			"Total Receive completion errors");
577 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames",
578 			CTLFLAG_RD, &stats->u0.be.rx_pause_frames, 0,
579 			"Pause Frames");
580 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "priority_pause_frames",
581 			CTLFLAG_RD, &stats->u0.be.rx_priority_pause_frames, 0,
582 			"Priority Pause Frames");
583 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames",
584 			CTLFLAG_RD, &stats->u0.be.rx_control_frames, 0,
585 			"Control Frames");
586 
587 	for (i = 0; i < sc->nrqs; i++) {
588 		ksprintf(prefix, "queue%d",i);
589 		queue_stats_node = SYSCTL_ADD_NODE(ctx,
590 						SYSCTL_CHILDREN(rx_stats_node),
591 						OID_AUTO, prefix, CTLFLAG_RD,
592 						NULL, "Queue name");
593 		queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
594 
595 		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts",
596 			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts, 0,
597 			"Receive Packets");
598 		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes",
599 			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes, 0,
600 			"Received Bytes");
601 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags",
602 			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0,
603 			"Received Fragments");
604 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
605 				"rx_mcast_pkts", CTLFLAG_RD,
606 				&sc->rq[i]->rx_stats.rx_mcast_pkts, 0,
607 					"Received Multicast Packets");
608 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
609 				"rx_ucast_pkts", CTLFLAG_RD,
610 				&sc->rq[i]->rx_stats.rx_ucast_pkts, 0,
611 					"Received Unicast Packets");
612 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err",
613 			CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0,
614 			"Received Completion Errors");
615 
616 	}
617 
618 	rx_stats_node = SYSCTL_ADD_NODE(ctx,
619 					SYSCTL_CHILDREN(rx_stats_node),
620 					OID_AUTO, "err", CTLFLAG_RD,
621 					NULL, "Receive Error Stats");
622 	rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
623 
624 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs",
625 			CTLFLAG_RD, &stats->u0.be.rx_crc_errors, 0,
626 			"CRC Errors");
627 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pbuf_errors",
628 			CTLFLAG_RD, &stats->u0.be.rx_drops_no_pbuf, 0,
629 			"Drops due to pbuf full");
630 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "erx_errors",
631 			CTLFLAG_RD, &stats->u0.be.rx_drops_no_erx_descr, 0,
632 			"ERX Errors");
633 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors",
634 			CTLFLAG_RD, &stats->u0.be.rx_drops_too_many_frags, 0,
635 			"RX Alignment Errors");
636 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors",
637 			CTLFLAG_RD, &stats->u0.be.rx_in_range_errors, 0,
638 			"In Range Errors");
639 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors",
640 			CTLFLAG_RD, &stats->u0.be.rx_out_range_errors, 0,
641 			"Out Range Errors");
642 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long",
643 			CTLFLAG_RD, &stats->u0.be.rx_frame_too_long, 0,
644 			"Frame Too Long");
645 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors",
646 			CTLFLAG_RD, &stats->u0.be.rx_address_match_errors, 0,
647 			"Address Match Errors");
648 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small",
649 			CTLFLAG_RD, &stats->u0.be.rx_dropped_too_small, 0,
650 			"Dropped Too Small");
651 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short",
652 			CTLFLAG_RD, &stats->u0.be.rx_dropped_too_short, 0,
653 			"Dropped Too Short");
654 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
655 			"dropped_header_too_small", CTLFLAG_RD,
656 			&stats->u0.be.rx_dropped_header_too_small, 0,
657 			"Dropped Header Too Small");
658 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_tcp_length",
659 			CTLFLAG_RD, &stats->u0.be.rx_dropped_tcp_length, 0,
660 			"Dropped TCP Length");
661 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt",
662 			CTLFLAG_RD, &stats->u0.be.rx_dropped_runt, 0,
663 			"Dropped runt");
664 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs",
665 			CTLFLAG_RD, &stats->u0.be.rx_ip_checksum_errs, 0,
666 			"IP Checksum Errors");
667 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs",
668 			CTLFLAG_RD, &stats->u0.be.rx_tcp_checksum_errs, 0,
669 			"TCP Checksum Errors");
670 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs",
671 			CTLFLAG_RD, &stats->u0.be.rx_udp_checksum_errs, 0,
672 			"UDP Checksum Errors");
673 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "fifo_overflow_drop",
674 			CTLFLAG_RD, &stats->u0.be.rxpp_fifo_overflow_drop, 0,
675 			"FIFO Overflow Drop");
676 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
677 			"input_fifo_overflow_drop", CTLFLAG_RD,
678 			&stats->u0.be.rx_input_fifo_overflow_drop, 0,
679 			"Input FIFO Overflow Drop");
680 
681 	tx_stats_node = SYSCTL_ADD_NODE(ctx,
682 					SYSCTL_CHILDREN(stats_node), OID_AUTO,
683 					"tx",CTLFLAG_RD, NULL,
684 					"TX Ethernet Statistics");
685 	tx_stat_list = SYSCTL_CHILDREN(tx_stats_node);
686 
687 	SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts",
688 			CTLFLAG_RD, &stats->tx.t_tx_pkts, 0,
689 			"Total Transmit Packets");
690 	SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes",
691 			CTLFLAG_RD, &stats->tx.t_tx_bytes, 0,
692 			"Total Transmit Bytes");
693 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs",
694 			CTLFLAG_RD, &stats->tx.t_tx_reqs, 0,
695 			"Total Transmit Requests");
696 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops",
697 			CTLFLAG_RD, &stats->tx.t_tx_stops, 0,
698 			"Total Transmit Stops");
699 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs",
700 			CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0,
701 			"Total Transmit WRB's");
702 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl",
703 			CTLFLAG_RD, &stats->tx.t_tx_compl, 0,
704 			"Total Transmit Completions");
705 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO,
706 			"total_ipv6_ext_hdr_tx_drop", CTLFLAG_RD,
707 			&stats->tx.t_ipv6_ext_hdr_tx_drop, 0,
708 			"Total Transmit IPV6 Drops");
709 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes",
710 			CTLFLAG_RD, &stats->u0.be.tx_pauseframes, 0,
711 			"Pause Frames");
712 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "priority_pauseframes",
713 			CTLFLAG_RD, &stats->u0.be.tx_priority_pauseframes, 0,
714 			"Priority Pauseframes");
715 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes",
716 			CTLFLAG_RD, &stats->u0.be.tx_controlframes, 0,
717 			"Tx Control Frames");
718 
719 	for (i = 0; i < sc->nwqs; i++) {
720 		ksprintf(prefix, "queue%d",i);
721 		queue_stats_node = SYSCTL_ADD_NODE(ctx,
722 						SYSCTL_CHILDREN(tx_stats_node),
723 						OID_AUTO, prefix, CTLFLAG_RD,
724 						NULL, "Queue name");
725 		queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
726 
727 		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts",
728 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts, 0,
729 			"Transmit Packets");
730 		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes",
731 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes, 0,
732 			"Transmit Bytes");
733 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs",
734 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0,
735 			"Transmit Requests");
736 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops",
737 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0,
738 			"Transmit Stops");
739 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs",
740 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0,
741 			"Transmit WRB's");
742 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl",
743 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0,
744 			"Transmit Completions");
745 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
746 			"ipv6_ext_hdr_tx_drop",CTLFLAG_RD,
747 			&sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0,
748 			"Transmit IPV6 Ext Header Drop");
749 
750 	}
751 	return;
752 }
753 
754 
755 static void
756 oce_add_stats_sysctls_xe201(POCE_SOFTC sc,
757 				  struct sysctl_ctx_list *ctx,
758 				  struct sysctl_oid *stats_node)
759 {
760 	struct sysctl_oid *rx_stats_node, *tx_stats_node;
761 	struct sysctl_oid_list *rx_stat_list, *tx_stat_list;
762 	struct sysctl_oid_list *queue_stats_list;
763 	struct sysctl_oid *queue_stats_node;
764 	struct oce_drv_stats *stats;
765 	char prefix[32];
766 	int i;
767 
768 	stats = &sc->oce_stats_info;
769 
770 	rx_stats_node = SYSCTL_ADD_NODE(ctx,
771 					SYSCTL_CHILDREN(stats_node),
772 					OID_AUTO, "rx", CTLFLAG_RD,
773 					NULL, "RX Ethernet Statistics");
774 	rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
775 
776 
777 	SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts",
778 			CTLFLAG_RD, &stats->rx.t_rx_pkts, 0,
779 			"Total Received Packets");
780 	SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes",
781 			CTLFLAG_RD, &stats->rx.t_rx_bytes, 0,
782 			"Total Received Bytes");
783 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags",
784 			CTLFLAG_RD, &stats->rx.t_rx_frags, 0,
785 			"Total Received Fragements");
786 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts",
787 			CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0,
788 			"Total Received Multicast Packets");
789 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts",
790 			CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0,
791 			"Total Received Unicast Packets");
792 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs",
793 			CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0,
794 			"Total Receive completion errors");
795 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames",
796 			CTLFLAG_RD, &stats->u0.xe201.rx_pause_frames, 0,
797 			"Pause Frames");
798 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames",
799 			CTLFLAG_RD, &stats->u0.xe201.rx_control_frames, 0,
800 			"Control Frames");
801 
802 	for (i = 0; i < sc->nrqs; i++) {
803 		ksprintf(prefix, "queue%d",i);
804 		queue_stats_node = SYSCTL_ADD_NODE(ctx,
805 						SYSCTL_CHILDREN(rx_stats_node),
806 						OID_AUTO, prefix, CTLFLAG_RD,
807 						NULL, "Queue name");
808 		queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
809 
810 		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts",
811 			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts, 0,
812 			"Receive Packets");
813 		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes",
814 			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes, 0,
815 			"Received Bytes");
816 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags",
817 			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0,
818 			"Received Fragments");
819 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
820 			"rx_mcast_pkts", CTLFLAG_RD,
821 			&sc->rq[i]->rx_stats.rx_mcast_pkts, 0,
822 			"Received Multicast Packets");
823 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
824 			"rx_ucast_pkts",CTLFLAG_RD,
825 			&sc->rq[i]->rx_stats.rx_ucast_pkts, 0,
826 			"Received Unicast Packets");
827 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err",
828 			CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0,
829 			"Received Completion Errors");
830 
831 	}
832 
833 	rx_stats_node = SYSCTL_ADD_NODE(ctx,
834 					SYSCTL_CHILDREN(rx_stats_node),
835 					OID_AUTO, "err", CTLFLAG_RD,
836 					NULL, "Receive Error Stats");
837 	rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
838 
839 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs",
840 			CTLFLAG_RD, &stats->u0.xe201.rx_crc_errors, 0,
841 			"CRC Errors");
842 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors",
843 			CTLFLAG_RD, &stats->u0.xe201.rx_alignment_errors, 0,
844 			"RX Alignment Errors");
845 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors",
846 			CTLFLAG_RD, &stats->u0.xe201.rx_in_range_errors, 0,
847 			"In Range Errors");
848 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors",
849 			CTLFLAG_RD, &stats->u0.xe201.rx_out_of_range_errors, 0,
850 			"Out Range Errors");
851 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long",
852 			CTLFLAG_RD, &stats->u0.xe201.rx_frames_too_long, 0,
853 			"Frame Too Long");
854 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors",
855 			CTLFLAG_RD, &stats->u0.xe201.rx_address_match_errors, 0,
856 			"Address Match Errors");
857 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small",
858 			CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_small, 0,
859 			"Dropped Too Small");
860 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short",
861 			CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_short, 0,
862 			"Dropped Too Short");
863 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
864 			"dropped_header_too_small", CTLFLAG_RD,
865 			&stats->u0.xe201.rx_dropped_header_too_small, 0,
866 			"Dropped Header Too Small");
867 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
868 			"dropped_tcp_length", CTLFLAG_RD,
869 			&stats->u0.xe201.rx_dropped_invalid_tcp_length, 0,
870 			"Dropped TCP Length");
871 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt",
872 			CTLFLAG_RD, &stats->u0.xe201.rx_dropped_runt, 0,
873 			"Dropped runt");
874 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs",
875 			CTLFLAG_RD, &stats->u0.xe201.rx_ip_checksum_errors, 0,
876 			"IP Checksum Errors");
877 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs",
878 			CTLFLAG_RD, &stats->u0.xe201.rx_tcp_checksum_errors, 0,
879 			"TCP Checksum Errors");
880 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs",
881 			CTLFLAG_RD, &stats->u0.xe201.rx_udp_checksum_errors, 0,
882 			"UDP Checksum Errors");
883 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "input_fifo_overflow_drop",
884 			CTLFLAG_RD, &stats->u0.xe201.rx_fifo_overflow, 0,
885 			"Input FIFO Overflow Drop");
886 
887 	tx_stats_node = SYSCTL_ADD_NODE(ctx,
888 					SYSCTL_CHILDREN(stats_node),
889 					OID_AUTO, "tx", CTLFLAG_RD,
890 					NULL, "TX Ethernet Statistics");
891 	tx_stat_list = SYSCTL_CHILDREN(tx_stats_node);
892 
893 	SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts",
894 			CTLFLAG_RD, &stats->tx.t_tx_pkts, 0,
895 			"Total Transmit Packets");
896 	SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes",
897 			CTLFLAG_RD, &stats->tx.t_tx_bytes, 0,
898 			"Total Transmit Bytes");
899 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs",
900 			CTLFLAG_RD, &stats->tx.t_tx_reqs, 0,
901 			"Total Transmit Requests");
902 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops",
903 			CTLFLAG_RD, &stats->tx.t_tx_stops, 0,
904 			"Total Transmit Stops");
905 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs",
906 			CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0,
907 			"Total Transmit WRB's");
908 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl",
909 			CTLFLAG_RD, &stats->tx.t_tx_compl, 0,
910 			"Total Transmit Completions");
911 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO,
912 			"total_ipv6_ext_hdr_tx_drop",
913 			CTLFLAG_RD, &stats->tx.t_ipv6_ext_hdr_tx_drop, 0,
914 			"Total Transmit IPV6 Drops");
915 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes",
916 			CTLFLAG_RD, &stats->u0.xe201.tx_pause_frames, 0,
917 			"Pause Frames");
918 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes",
919 			CTLFLAG_RD, &stats->u0.xe201.tx_control_frames, 0,
920 			"Tx Control Frames");
921 
922 	for (i = 0; i < sc->nwqs; i++) {
923 		ksprintf(prefix, "queue%d",i);
924 		queue_stats_node = SYSCTL_ADD_NODE(ctx,
925 						SYSCTL_CHILDREN(tx_stats_node),
926 						OID_AUTO, prefix, CTLFLAG_RD,
927 						NULL, "Queue name");
928 		queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
929 
930 		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts",
931 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts, 0,
932 			"Transmit Packets");
933 		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes",
934 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes, 0,
935 			"Transmit Bytes");
936 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs",
937 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0,
938 			"Transmit Requests");
939 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops",
940 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0,
941 			"Transmit Stops");
942 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs",
943 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0,
944 			"Transmit WRB's");
945 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl",
946 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0,
947 			"Transmit Completions");
948 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
949 			"ipv6_ext_hdr_tx_drop", CTLFLAG_RD,
950 			&sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0,
951 			"Transmit IPV6 Ext Header Drop");
952 
953 	}
954 	return;
955 }
956 
957 
958 void
959 oce_refresh_queue_stats(POCE_SOFTC sc)
960 {
961 	struct oce_drv_stats *adapter_stats;
962 	int i;
963 
964 	adapter_stats = &sc->oce_stats_info;
965 
966 	/* Caluculate total TX and TXstats from all queues */
967 
968 	bzero(&adapter_stats->rx, sizeof(struct oce_rx_stats));
969 	for (i = 0; i < sc->nrqs; i++) {
970 
971 		adapter_stats->rx.t_rx_pkts += sc->rq[i]->rx_stats.rx_pkts;
972 		adapter_stats->rx.t_rx_bytes += sc->rq[i]->rx_stats.rx_bytes;
973 		adapter_stats->rx.t_rx_frags += sc->rq[i]->rx_stats.rx_frags;
974 		adapter_stats->rx.t_rx_mcast_pkts +=
975 					sc->rq[i]->rx_stats.rx_mcast_pkts;
976 		adapter_stats->rx.t_rx_ucast_pkts +=
977 					sc->rq[i]->rx_stats.rx_ucast_pkts;
978 		adapter_stats->rx.t_rxcp_errs += sc-> rq[i]->rx_stats.rxcp_err;
979 	}
980 
981 	bzero(&adapter_stats->tx, sizeof(struct oce_tx_stats));
982 	for (i = 0; i < sc->nwqs; i++) {
983 		adapter_stats->tx.t_tx_reqs += sc->wq[i]->tx_stats.tx_reqs;
984 		adapter_stats->tx.t_tx_stops += sc->wq[i]->tx_stats.tx_stops;
985 		adapter_stats->tx.t_tx_wrbs += sc->wq[i]->tx_stats.tx_wrbs;
986 		adapter_stats->tx.t_tx_compl += sc->wq[i]->tx_stats.tx_compl;
987 		adapter_stats->tx.t_tx_bytes += sc->wq[i]->tx_stats.tx_bytes;
988 		adapter_stats->tx.t_tx_pkts += sc->wq[i]->tx_stats.tx_pkts;
989 		adapter_stats->tx.t_ipv6_ext_hdr_tx_drop +=
990 				sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop;
991 	}
992 
993 }
994 
995 
996 
997 static void
998 copy_stats_to_sc_xe201(POCE_SOFTC sc)
999 {
1000 	struct oce_xe201_stats *adapter_stats;
1001 	struct mbx_get_pport_stats *nic_mbx;
1002 	struct pport_stats *port_stats;
1003 
1004 	nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_pport_stats);
1005 	port_stats = &nic_mbx->params.rsp.pps;
1006 	adapter_stats = &sc->oce_stats_info.u0.xe201;
1007 
1008 	adapter_stats->tx_pkts = port_stats->tx_pkts;
1009 	adapter_stats->tx_unicast_pkts = port_stats->tx_unicast_pkts;
1010 	adapter_stats->tx_multicast_pkts = port_stats->tx_multicast_pkts;
1011 	adapter_stats->tx_broadcast_pkts = port_stats->tx_broadcast_pkts;
1012 	adapter_stats->tx_bytes = port_stats->tx_bytes;
1013 	adapter_stats->tx_unicast_bytes = port_stats->tx_unicast_bytes;
1014 	adapter_stats->tx_multicast_bytes = port_stats->tx_multicast_bytes;
1015 	adapter_stats->tx_broadcast_bytes = port_stats->tx_broadcast_bytes;
1016 	adapter_stats->tx_discards = port_stats->tx_discards;
1017 	adapter_stats->tx_errors = port_stats->tx_errors;
1018 	adapter_stats->tx_pause_frames = port_stats->tx_pause_frames;
1019 	adapter_stats->tx_pause_on_frames = port_stats->tx_pause_on_frames;
1020 	adapter_stats->tx_pause_off_frames = port_stats->tx_pause_off_frames;
1021 	adapter_stats->tx_internal_mac_errors =
1022 		port_stats->tx_internal_mac_errors;
1023 	adapter_stats->tx_control_frames = port_stats->tx_control_frames;
1024 	adapter_stats->tx_pkts_64_bytes = port_stats->tx_pkts_64_bytes;
1025 	adapter_stats->tx_pkts_65_to_127_bytes =
1026 		port_stats->tx_pkts_65_to_127_bytes;
1027 	adapter_stats->tx_pkts_128_to_255_bytes =
1028 		port_stats->tx_pkts_128_to_255_bytes;
1029 	adapter_stats->tx_pkts_256_to_511_bytes =
1030 		port_stats->tx_pkts_256_to_511_bytes;
1031 	adapter_stats->tx_pkts_512_to_1023_bytes =
1032 		port_stats->tx_pkts_512_to_1023_bytes;
1033 	adapter_stats->tx_pkts_1024_to_1518_bytes =
1034 		port_stats->tx_pkts_1024_to_1518_bytes;
1035 	adapter_stats->tx_pkts_1519_to_2047_bytes =
1036 		port_stats->tx_pkts_1519_to_2047_bytes;
1037 	adapter_stats->tx_pkts_2048_to_4095_bytes =
1038 		port_stats->tx_pkts_2048_to_4095_bytes;
1039 	adapter_stats->tx_pkts_4096_to_8191_bytes =
1040 		port_stats->tx_pkts_4096_to_8191_bytes;
1041 	adapter_stats->tx_pkts_8192_to_9216_bytes =
1042 		port_stats->tx_pkts_8192_to_9216_bytes;
1043 	adapter_stats->tx_lso_pkts = port_stats->tx_lso_pkts;
1044 	adapter_stats->rx_pkts = port_stats->rx_pkts;
1045 	adapter_stats->rx_unicast_pkts = port_stats->rx_unicast_pkts;
1046 	adapter_stats->rx_multicast_pkts = port_stats->rx_multicast_pkts;
1047 	adapter_stats->rx_broadcast_pkts = port_stats->rx_broadcast_pkts;
1048 	adapter_stats->rx_bytes = port_stats->rx_bytes;
1049 	adapter_stats->rx_unicast_bytes = port_stats->rx_unicast_bytes;
1050 	adapter_stats->rx_multicast_bytes = port_stats->rx_multicast_bytes;
1051 	adapter_stats->rx_broadcast_bytes = port_stats->rx_broadcast_bytes;
1052 	adapter_stats->rx_unknown_protos = port_stats->rx_unknown_protos;
1053 	adapter_stats->rx_discards = port_stats->rx_discards;
1054 	adapter_stats->rx_errors = port_stats->rx_errors;
1055 	adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
1056 	adapter_stats->rx_alignment_errors = port_stats->rx_alignment_errors;
1057 	adapter_stats->rx_symbol_errors = port_stats->rx_symbol_errors;
1058 	adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
1059 	adapter_stats->rx_pause_on_frames = port_stats->rx_pause_on_frames;
1060 	adapter_stats->rx_pause_off_frames = port_stats->rx_pause_off_frames;
1061 	adapter_stats->rx_frames_too_long = port_stats->rx_frames_too_long;
1062 	adapter_stats->rx_internal_mac_errors =
1063 		port_stats->rx_internal_mac_errors;
1064 	adapter_stats->rx_undersize_pkts = port_stats->rx_undersize_pkts;
1065 	adapter_stats->rx_oversize_pkts = port_stats->rx_oversize_pkts;
1066 	adapter_stats->rx_fragment_pkts = port_stats->rx_fragment_pkts;
1067 	adapter_stats->rx_jabbers = port_stats->rx_jabbers;
1068 	adapter_stats->rx_control_frames = port_stats->rx_control_frames;
1069 	adapter_stats->rx_control_frames_unknown_opcode =
1070 		port_stats->rx_control_frames_unknown_opcode;
1071 	adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
1072 	adapter_stats->rx_out_of_range_errors =
1073 		port_stats->rx_out_of_range_errors;
1074 	adapter_stats->rx_address_match_errors =
1075 		port_stats->rx_address_match_errors;
1076 	adapter_stats->rx_vlan_mismatch_errors =
1077 		port_stats->rx_vlan_mismatch_errors;
1078 	adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
1079 	adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
1080 	adapter_stats->rx_dropped_header_too_small =
1081 		port_stats->rx_dropped_header_too_small;
1082 	adapter_stats->rx_dropped_invalid_tcp_length =
1083 		port_stats->rx_dropped_invalid_tcp_length;
1084 	adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
1085 	adapter_stats->rx_ip_checksum_errors =
1086 		port_stats->rx_ip_checksum_errors;
1087 	adapter_stats->rx_tcp_checksum_errors =
1088 		port_stats->rx_tcp_checksum_errors;
1089 	adapter_stats->rx_udp_checksum_errors =
1090 		port_stats->rx_udp_checksum_errors;
1091 	adapter_stats->rx_non_rss_pkts = port_stats->rx_non_rss_pkts;
1092 	adapter_stats->rx_ipv4_pkts = port_stats->rx_ipv4_pkts;
1093 	adapter_stats->rx_ipv6_pkts = port_stats->rx_ipv6_pkts;
1094 	adapter_stats->rx_ipv4_bytes = port_stats->rx_ipv4_bytes;
1095 	adapter_stats->rx_ipv6_bytes = port_stats->rx_ipv6_bytes;
1096 	adapter_stats->rx_nic_pkts = port_stats->rx_nic_pkts;
1097 	adapter_stats->rx_tcp_pkts = port_stats->rx_tcp_pkts;
1098 	adapter_stats->rx_iscsi_pkts = port_stats->rx_iscsi_pkts;
1099 	adapter_stats->rx_management_pkts = port_stats->rx_management_pkts;
1100 	adapter_stats->rx_switched_unicast_pkts =
1101 		port_stats->rx_switched_unicast_pkts;
1102 	adapter_stats->rx_switched_multicast_pkts =
1103 		port_stats->rx_switched_multicast_pkts;
1104 	adapter_stats->rx_switched_broadcast_pkts =
1105 		port_stats->rx_switched_broadcast_pkts;
1106 	adapter_stats->num_forwards = port_stats->num_forwards;
1107 	adapter_stats->rx_fifo_overflow = port_stats->rx_fifo_overflow;
1108 	adapter_stats->rx_input_fifo_overflow =
1109 		port_stats->rx_input_fifo_overflow;
1110 	adapter_stats->rx_drops_too_many_frags =
1111 		port_stats->rx_drops_too_many_frags;
1112 	adapter_stats->rx_drops_invalid_queue =
1113 		port_stats->rx_drops_invalid_queue;
1114 	adapter_stats->rx_drops_mtu = port_stats->rx_drops_mtu;
1115 	adapter_stats->rx_pkts_64_bytes = port_stats->rx_pkts_64_bytes;
1116 	adapter_stats->rx_pkts_65_to_127_bytes =
1117 		port_stats->rx_pkts_65_to_127_bytes;
1118 	adapter_stats->rx_pkts_128_to_255_bytes =
1119 		port_stats->rx_pkts_128_to_255_bytes;
1120 	adapter_stats->rx_pkts_256_to_511_bytes =
1121 		port_stats->rx_pkts_256_to_511_bytes;
1122 	adapter_stats->rx_pkts_512_to_1023_bytes =
1123 		port_stats->rx_pkts_512_to_1023_bytes;
1124 	adapter_stats->rx_pkts_1024_to_1518_bytes =
1125 		port_stats->rx_pkts_1024_to_1518_bytes;
1126 	adapter_stats->rx_pkts_1519_to_2047_bytes =
1127 		port_stats->rx_pkts_1519_to_2047_bytes;
1128 	adapter_stats->rx_pkts_2048_to_4095_bytes =
1129 		port_stats->rx_pkts_2048_to_4095_bytes;
1130 	adapter_stats->rx_pkts_4096_to_8191_bytes =
1131 		port_stats->rx_pkts_4096_to_8191_bytes;
1132 	adapter_stats->rx_pkts_8192_to_9216_bytes =
1133 		port_stats->rx_pkts_8192_to_9216_bytes;
1134 }
1135 
1136 
1137 
1138 static void
1139 copy_stats_to_sc_be2(POCE_SOFTC sc)
1140 {
1141 	struct oce_be_stats *adapter_stats;
1142 	struct oce_pmem_stats *pmem;
1143 	struct oce_rxf_stats_v0 *rxf_stats;
1144 	struct oce_port_rxf_stats_v0 *port_stats;
1145 	struct mbx_get_nic_stats_v0 *nic_mbx;
1146 	uint32_t port = sc->port_id;
1147 
1148 	nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats_v0);
1149 	pmem = &nic_mbx->params.rsp.stats.pmem;
1150 	rxf_stats = &nic_mbx->params.rsp.stats.rxf;
1151 	port_stats = &nic_mbx->params.rsp.stats.rxf.port[port];
1152 
1153 	adapter_stats = &sc->oce_stats_info.u0.be;
1154 
1155 
1156 	/* Update stats */
1157 	adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
1158 	adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
1159 	adapter_stats->rx_control_frames = port_stats->rx_control_frames;
1160 	adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
1161 	adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long;
1162 	adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
1163 	adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs;
1164 	adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs;
1165 	adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs;
1166 	adapter_stats->rxpp_fifo_overflow_drop =
1167 					port_stats->rxpp_fifo_overflow_drop;
1168 	adapter_stats->rx_dropped_tcp_length =
1169 		port_stats->rx_dropped_tcp_length;
1170 	adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
1171 	adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
1172 	adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors;
1173 	adapter_stats->rx_dropped_header_too_small =
1174 		port_stats->rx_dropped_header_too_small;
1175 	adapter_stats->rx_input_fifo_overflow_drop =
1176 		port_stats->rx_input_fifo_overflow_drop;
1177 	adapter_stats->rx_address_match_errors =
1178 		port_stats->rx_address_match_errors;
1179 	adapter_stats->rx_alignment_symbol_errors =
1180 		port_stats->rx_alignment_symbol_errors;
1181 	adapter_stats->tx_pauseframes = port_stats->tx_pauseframes;
1182 	adapter_stats->tx_controlframes = port_stats->tx_controlframes;
1183 
1184 	if (sc->if_id)
1185 		adapter_stats->jabber_events = rxf_stats->port1_jabber_events;
1186 	else
1187 		adapter_stats->jabber_events = rxf_stats->port0_jabber_events;
1188 
1189 	adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf;
1190 	adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb;
1191 	adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr;
1192 	adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring;
1193 	adapter_stats->forwarded_packets = rxf_stats->forwarded_packets;
1194 	adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu;
1195 	adapter_stats->rx_drops_no_tpre_descr =
1196 		rxf_stats->rx_drops_no_tpre_descr;
1197 	adapter_stats->rx_drops_too_many_frags =
1198 		rxf_stats->rx_drops_too_many_frags;
1199 	adapter_stats->eth_red_drops = pmem->eth_red_drops;
1200 }
1201 
1202 
1203 static void
1204 copy_stats_to_sc_be3(POCE_SOFTC sc)
1205 {
1206 	struct oce_be_stats *adapter_stats;
1207 	struct oce_pmem_stats *pmem;
1208 	struct oce_rxf_stats_v1 *rxf_stats;
1209 	struct oce_port_rxf_stats_v1 *port_stats;
1210 	struct mbx_get_nic_stats *nic_mbx;
1211 	uint32_t port = sc->port_id;
1212 
1213 	nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats);
1214 	pmem = &nic_mbx->params.rsp.stats.pmem;
1215 	rxf_stats = &nic_mbx->params.rsp.stats.rxf;
1216 	port_stats = &nic_mbx->params.rsp.stats.rxf.port[port];
1217 
1218 	adapter_stats = &sc->oce_stats_info.u0.be;
1219 
1220 	/* Update stats */
1221 	adapter_stats->pmem_fifo_overflow_drop =
1222 		port_stats->pmem_fifo_overflow_drop;
1223 	adapter_stats->rx_priority_pause_frames =
1224 		port_stats->rx_priority_pause_frames;
1225 	adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
1226 	adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
1227 	adapter_stats->rx_control_frames = port_stats->rx_control_frames;
1228 	adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
1229 	adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long;
1230 	adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
1231 	adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs;
1232 	adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs;
1233 	adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs;
1234 	adapter_stats->rx_dropped_tcp_length =
1235 		port_stats->rx_dropped_tcp_length;
1236 	adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
1237 	adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
1238 	adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors;
1239 	adapter_stats->rx_dropped_header_too_small =
1240 		port_stats->rx_dropped_header_too_small;
1241 	adapter_stats->rx_input_fifo_overflow_drop =
1242 		port_stats->rx_input_fifo_overflow_drop;
1243 	adapter_stats->rx_address_match_errors =
1244 		port_stats->rx_address_match_errors;
1245 	adapter_stats->rx_alignment_symbol_errors =
1246 		port_stats->rx_alignment_symbol_errors;
1247 	adapter_stats->rxpp_fifo_overflow_drop =
1248 		port_stats->rxpp_fifo_overflow_drop;
1249 	adapter_stats->tx_pauseframes = port_stats->tx_pauseframes;
1250 	adapter_stats->tx_controlframes = port_stats->tx_controlframes;
1251 	adapter_stats->jabber_events = port_stats->jabber_events;
1252 
1253 	adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf;
1254 	adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb;
1255 	adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr;
1256 	adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring;
1257 	adapter_stats->forwarded_packets = rxf_stats->forwarded_packets;
1258 	adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu;
1259 	adapter_stats->rx_drops_no_tpre_descr =
1260 		rxf_stats->rx_drops_no_tpre_descr;
1261 	adapter_stats->rx_drops_too_many_frags =
1262 		rxf_stats->rx_drops_too_many_frags;
1263 
1264 	adapter_stats->eth_red_drops = pmem->eth_red_drops;
1265 }
1266 
1267 
1268 int
1269 oce_stats_init(POCE_SOFTC sc)
1270 {
1271 	int rc = 0, sz;
1272 
1273 	if (IS_BE(sc) || IS_SH(sc)) {
1274 		if (sc->flags & OCE_FLAGS_BE2)
1275 			sz = sizeof(struct mbx_get_nic_stats_v0);
1276 		else
1277 			sz = sizeof(struct mbx_get_nic_stats);
1278 	} else
1279 		sz = sizeof(struct mbx_get_pport_stats);
1280 
1281 	rc = oce_dma_alloc(sc, sz, &sc->stats_mem, 0);
1282 
1283 	return rc;
1284 }
1285 
1286 
1287 void
1288 oce_stats_free(POCE_SOFTC sc)
1289 {
1290 
1291 	oce_dma_free(sc, &sc->stats_mem);
1292 
1293 }
1294 
1295 
1296 int
1297 oce_refresh_nic_stats(POCE_SOFTC sc)
1298 {
1299 	int rc = 0, reset = 0;
1300 
1301 	if (IS_BE(sc) || IS_SH(sc)) {
1302 		if (sc->flags & OCE_FLAGS_BE2) {
1303 			rc = oce_mbox_get_nic_stats_v0(sc, &sc->stats_mem);
1304 			if (!rc)
1305 				copy_stats_to_sc_be2(sc);
1306 		} else {
1307 			rc = oce_mbox_get_nic_stats(sc, &sc->stats_mem);
1308 			if (!rc)
1309 				copy_stats_to_sc_be3(sc);
1310 		}
1311 
1312 	} else {
1313 		rc = oce_mbox_get_pport_stats(sc, &sc->stats_mem, reset);
1314 		if (!rc)
1315 			copy_stats_to_sc_xe201(sc);
1316 	}
1317 
1318 	return rc;
1319 }
1320 
1321 static int
1322 oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS)
1323 {
1324 	int result = 0, error;
1325 	int rc = 0;
1326 	POCE_SOFTC sc = (POCE_SOFTC) arg1;
1327 
1328 	/* sysctl default handler */
1329 	error = sysctl_handle_int(oidp, &result, 0, req);
1330 	if (error || !req->newptr)
1331 		return (error);
1332 
1333 	if(result == -1) {
1334 		return EINVAL;
1335 	}
1336 	bzero((char *)sfp_vpd_dump_buffer, TRANSCEIVER_DATA_SIZE);
1337 
1338 	rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A0);
1339 	if(rc)
1340 		return rc;
1341 
1342 	return oce_mbox_read_transrecv_data(sc, PAGE_NUM_A2);
1343 }
1344