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