oce_sysctl.c revision 231879
1231437Sluigi/*-
2231437Sluigi * Copyright (C) 2012 Emulex
3231437Sluigi * All rights reserved.
4231437Sluigi *
5231437Sluigi * Redistribution and use in source and binary forms, with or without
6231437Sluigi * modification, are permitted provided that the following conditions are met:
7231437Sluigi *
8231437Sluigi * 1. Redistributions of source code must retain the above copyright notice,
9231437Sluigi *    this list of conditions and the following disclaimer.
10231437Sluigi *
11231437Sluigi * 2. Redistributions in binary form must reproduce the above copyright
12231437Sluigi *    notice, this list of conditions and the following disclaimer in the
13231437Sluigi *    documentation and/or other materials provided with the distribution.
14231437Sluigi *
15231437Sluigi * 3. Neither the name of the Emulex Corporation nor the names of its
16231437Sluigi *    contributors may be used to endorse or promote products derived from
17231437Sluigi *    this software without specific prior written permission.
18231437Sluigi *
19231437Sluigi * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20231437Sluigi * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21231437Sluigi * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22231437Sluigi * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23231437Sluigi * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24231437Sluigi * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25231437Sluigi * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26231437Sluigi * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27231437Sluigi * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28231437Sluigi * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29231437Sluigi * POSSIBILITY OF SUCH DAMAGE.
30231437Sluigi *
31231437Sluigi * Contact Information:
32231437Sluigi * freebsd-drivers@emulex.com
33231437Sluigi *
34231437Sluigi * Emulex
35231437Sluigi * 3333 Susan Street
36231437Sluigi * Costa Mesa, CA 92626
37231437Sluigi */
38231437Sluigi
39231437Sluigi/* $FreeBSD: head/sys/dev/oce/oce_sysctl.c 231879 2012-02-17 13:55:17Z luigi $ */
40231437Sluigi
41231437Sluigi#include "oce_if.h"
42231437Sluigi
43231437Sluigistatic void copy_stats_to_sc_xe201(POCE_SOFTC sc);
44231437Sluigistatic void copy_stats_to_sc_be3(POCE_SOFTC sc);
45231437Sluigistatic void copy_stats_to_sc_be2(POCE_SOFTC sc);
46231437Sluigistatic int  oce_sysctl_loopback(SYSCTL_HANDLER_ARGS);
47231437Sluigistatic int  oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
48231437Sluigistatic int  oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS);
49231437Sluigistatic int  oce_be3_flashdata(POCE_SOFTC sc, const struct firmware
50231437Sluigi						*fw, int num_imgs);
51231437Sluigistatic int  oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
52231437Sluigistatic boolean_t oce_phy_flashing_required(POCE_SOFTC sc);
53231437Sluigistatic boolean_t oce_img_flashing_required(POCE_SOFTC sc, const char *p,
54231437Sluigi				int img_optype, uint32_t img_offset,
55231437Sluigi				uint32_t img_size, uint32_t hdrs_size);
56231437Sluigistatic void oce_add_stats_sysctls_be3(POCE_SOFTC sc,
57231437Sluigi				struct sysctl_ctx_list *ctx,
58231437Sluigi				struct sysctl_oid *stats_node);
59231437Sluigistatic void oce_add_stats_sysctls_xe201(POCE_SOFTC sc,
60231437Sluigi				struct sysctl_ctx_list *ctx,
61231437Sluigi				struct sysctl_oid *stats_node);
62231437Sluigi
63231437Sluigiextern char component_revision[32];
64231437Sluigi
65231437Sluigi
66231437Sluigivoid
67231437Sluigioce_add_sysctls(POCE_SOFTC sc)
68231437Sluigi{
69231437Sluigi
70231437Sluigi	struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev);
71231437Sluigi	struct sysctl_oid *tree = device_get_sysctl_tree(sc->dev);
72231437Sluigi	struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree);
73231437Sluigi	struct sysctl_oid *stats_node;
74231437Sluigi
75231437Sluigi	SYSCTL_ADD_STRING(ctx, child,
76231437Sluigi			OID_AUTO, "component_revision",
77231437Sluigi			CTLTYPE_INT | CTLFLAG_RD,
78231437Sluigi			&component_revision,
79231437Sluigi			sizeof(component_revision),
80231437Sluigi			"EMULEX One-Connect device driver revision");
81231437Sluigi
82231437Sluigi	SYSCTL_ADD_STRING(ctx, child,
83231437Sluigi			OID_AUTO, "firmware_version",
84231437Sluigi			CTLTYPE_INT | CTLFLAG_RD,
85231437Sluigi			&sc->fw_version,
86231437Sluigi			sizeof(sc->fw_version),
87231437Sluigi			"EMULEX One-Connect Firmware Version");
88231437Sluigi
89231437Sluigi	SYSCTL_ADD_INT(ctx, child,
90231437Sluigi			OID_AUTO, "max_rsp_handled",
91231437Sluigi			CTLTYPE_INT | CTLFLAG_RW,
92231437Sluigi			&oce_max_rsp_handled,
93231437Sluigi			sizeof(oce_max_rsp_handled),
94231437Sluigi			"Maximum receive frames handled per interupt");
95231437Sluigi
96231437Sluigi	if (sc->function_mode & FNM_FLEX10_MODE)
97231437Sluigi		SYSCTL_ADD_UINT(ctx, child,
98231437Sluigi				OID_AUTO, "speed",
99231437Sluigi				CTLFLAG_RD,
100231437Sluigi				&sc->qos_link_speed,
101231437Sluigi				0,"QOS Speed");
102231437Sluigi	else
103231437Sluigi		SYSCTL_ADD_UINT(ctx, child,
104231437Sluigi				OID_AUTO, "speed",
105231437Sluigi				CTLFLAG_RD,
106231437Sluigi				&sc->speed,
107231437Sluigi				0,"Link Speed");
108231437Sluigi
109231879Sluigi	if (sc->function_mode & FNM_UMC_MODE)
110231879Sluigi		SYSCTL_ADD_UINT(ctx, child,
111231879Sluigi				OID_AUTO, "pvid",
112231879Sluigi				CTLFLAG_RD,
113231879Sluigi				&sc->pvid,
114231879Sluigi				0,"PVID");
115231879Sluigi
116231437Sluigi	SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "loop_back",
117231437Sluigi		CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0,
118231437Sluigi		oce_sysctl_loopback, "I", "Loop Back Tests");
119231437Sluigi
120231437Sluigi	SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "fw_upgrade",
121231437Sluigi		CTLTYPE_STRING | CTLFLAG_RW, (void *)sc, 0,
122231437Sluigi		oce_sys_fwupgrade, "A", "Firmware ufi file");
123231437Sluigi
124231437Sluigi	stats_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats",
125231437Sluigi				CTLFLAG_RD, NULL, "Ethernet Statistics");
126231437Sluigi
127231437Sluigi	if (IS_BE(sc))
128231437Sluigi		oce_add_stats_sysctls_be3(sc, ctx, stats_node);
129231437Sluigi	else
130231437Sluigi		oce_add_stats_sysctls_xe201(sc, ctx, stats_node);
131231437Sluigi
132231437Sluigi
133231437Sluigi}
134231437Sluigi
135231437Sluigi
136231437Sluigi
137231437Sluigistatic uint32_t
138231437Sluigioce_loopback_test(struct oce_softc *sc, uint8_t loopback_type)
139231437Sluigi{
140231437Sluigi	uint32_t status = 0;
141231437Sluigi
142231437Sluigi	oce_mbox_cmd_set_loopback(sc, sc->if_id, loopback_type, 1);
143231437Sluigi	status = oce_mbox_cmd_test_loopback(sc, sc->if_id, loopback_type,
144231437Sluigi				1500, 2, 0xabc);
145231437Sluigi	oce_mbox_cmd_set_loopback(sc, sc->if_id, OCE_NO_LOOPBACK, 1);
146231437Sluigi
147231437Sluigi	return status;
148231437Sluigi}
149231437Sluigi
150231437Sluigi
151231437Sluigistatic int
152231437Sluigioce_sysctl_loopback(SYSCTL_HANDLER_ARGS)
153231437Sluigi{
154231437Sluigi	int value = 0;
155231437Sluigi	uint32_t status;
156231437Sluigi	struct oce_softc *sc  = (struct oce_softc *)arg1;
157231437Sluigi
158231437Sluigi	status = sysctl_handle_int(oidp, &value, 0, req);
159231437Sluigi	if (status || !req->newptr)
160231437Sluigi		return status;
161231437Sluigi
162231437Sluigi	if (value != 1) {
163231437Sluigi		device_printf(sc->dev,
164231437Sluigi			"Not a Valid value. Set to loop_back=1 to run tests\n");
165231437Sluigi		return 0;
166231437Sluigi	}
167231437Sluigi
168231437Sluigi	if ((status = oce_loopback_test(sc, OCE_MAC_LOOPBACK))) {
169231437Sluigi		device_printf(sc->dev,
170231437Sluigi			"MAC Loopback Test = Failed (Error status = %d)\n",
171231437Sluigi			 status);
172231437Sluigi	} else
173231437Sluigi		device_printf(sc->dev, "MAC Loopback Test = Success\n");
174231437Sluigi
175231437Sluigi	if ((status = oce_loopback_test(sc, OCE_PHY_LOOPBACK))) {
176231437Sluigi		device_printf(sc->dev,
177231437Sluigi			"PHY Loopback Test = Failed (Error status = %d)\n",
178231437Sluigi			 status);
179231437Sluigi	} else
180231437Sluigi		device_printf(sc->dev, "PHY Loopback Test = Success\n");
181231437Sluigi
182231437Sluigi	if ((status = oce_loopback_test(sc, OCE_ONE_PORT_EXT_LOOPBACK))) {
183231437Sluigi		device_printf(sc->dev,
184231437Sluigi			"EXT Loopback Test = Failed (Error status = %d)\n",
185231437Sluigi			 status);
186231437Sluigi	} else
187231437Sluigi		device_printf(sc->dev, "EXT Loopback Test = Success\n");
188231437Sluigi
189231437Sluigi	return 0;
190231437Sluigi}
191231437Sluigi
192231437Sluigi
193231437Sluigistatic int
194231437Sluigioce_sys_fwupgrade(SYSCTL_HANDLER_ARGS)
195231437Sluigi{
196231437Sluigi	char ufiname[256] = {0};
197231437Sluigi	uint32_t status = 1;
198231437Sluigi	struct oce_softc *sc  = (struct oce_softc *)arg1;
199231437Sluigi	const struct firmware *fw;
200231437Sluigi
201231437Sluigi	status = sysctl_handle_string(oidp, ufiname, sizeof(ufiname), req);
202231437Sluigi	if (status || !req->newptr)
203231437Sluigi		return status;
204231437Sluigi
205231437Sluigi	fw = firmware_get(ufiname);
206231437Sluigi	if (fw == NULL) {
207231437Sluigi		device_printf(sc->dev, "Unable to get Firmware. "
208231437Sluigi			"Make sure %s is copied to /boot/modules\n", ufiname);
209231437Sluigi		return ENOENT;
210231437Sluigi	}
211231437Sluigi
212231437Sluigi	if (IS_BE(sc)) {
213231437Sluigi		if ((sc->flags & OCE_FLAGS_BE2)) {
214231437Sluigi			device_printf(sc->dev,
215231437Sluigi				"Flashing not supported for BE2 yet.\n");
216231437Sluigi			status = 1;
217231437Sluigi			goto done;
218231437Sluigi		}
219231437Sluigi		status = oce_be3_fwupgrade(sc, fw);
220231437Sluigi	} else
221231437Sluigi		status = oce_lancer_fwupgrade(sc, fw);
222231437Sluigidone:
223231437Sluigi	if (status) {
224231437Sluigi		device_printf(sc->dev, "Firmware Upgrade failed\n");
225231437Sluigi	} else {
226231437Sluigi		device_printf(sc->dev, "Firmware Flashed successfully\n");
227231437Sluigi	}
228231437Sluigi
229231437Sluigi	/* Release Firmware*/
230231437Sluigi	firmware_put(fw, FIRMWARE_UNLOAD);
231231437Sluigi
232231437Sluigi	return status;
233231437Sluigi}
234231437Sluigi
235231437Sluigi
236231437Sluigistatic int
237231437Sluigioce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw)
238231437Sluigi{
239231437Sluigi	int rc = 0, num_imgs = 0, i = 0;
240231437Sluigi	const struct flash_file_hdr *fhdr;
241231437Sluigi	const struct image_hdr *img_ptr;
242231437Sluigi
243231437Sluigi	fhdr = (const struct flash_file_hdr *)fw->data;
244231437Sluigi	if (fhdr->build[0] != '3') {
245231437Sluigi		device_printf(sc->dev, "Invalid BE3 firmware image\n");
246231437Sluigi		return EINVAL;
247231437Sluigi	}
248231437Sluigi	/* Display flash version */
249231437Sluigi	device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]);
250231437Sluigi
251231437Sluigi	num_imgs = fhdr->num_imgs;
252231437Sluigi	for (i = 0; i < num_imgs; i++) {
253231437Sluigi		img_ptr = (const struct image_hdr *)((const char *)fw->data +
254231437Sluigi				sizeof(struct flash_file_hdr) +
255231437Sluigi				(i * sizeof(struct image_hdr)));
256231437Sluigi		if (img_ptr->imageid == 1) {
257231437Sluigi			rc = oce_be3_flashdata(sc, fw, num_imgs);
258231437Sluigi			break;
259231437Sluigi		}
260231437Sluigi	}
261231437Sluigi
262231437Sluigi	return rc;
263231437Sluigi}
264231437Sluigi
265231437Sluigi
266231437Sluigistatic int
267231437Sluigioce_be3_flashdata(POCE_SOFTC sc, const struct firmware *fw, int num_imgs)
268231437Sluigi{
269231437Sluigi	char cookie[2][16] =    {"*** SE FLAS", "H DIRECTORY *** "};
270231437Sluigi	const char *p = (const char *)fw->data;
271231437Sluigi	const struct flash_sec_info *fsec = NULL;
272231437Sluigi	struct mbx_common_read_write_flashrom *req;
273231437Sluigi	int rc = 0, i, img_type, bin_offset = 0;
274231437Sluigi	boolean_t skip_image;
275231437Sluigi	uint32_t optype = 0, size = 0, start = 0, num_bytes = 0;
276231437Sluigi	uint32_t opcode = 0;
277231437Sluigi	OCE_DMA_MEM dma_mem;
278231437Sluigi
279231437Sluigi	/* Validate Cookie */
280231437Sluigi	bin_offset = (sizeof(struct flash_file_hdr) +
281231437Sluigi		(num_imgs * sizeof(struct image_hdr)));
282231437Sluigi	p += bin_offset;
283231437Sluigi	while (p < ((const char *)fw->data + fw->datasize)) {
284231437Sluigi		fsec = (const struct flash_sec_info *)p;
285231437Sluigi		if (!memcmp(cookie, fsec->cookie, sizeof(cookie)))
286231437Sluigi			break;
287231437Sluigi		fsec = NULL;
288231437Sluigi		p += 32;
289231437Sluigi	}
290231437Sluigi
291231437Sluigi	if (!fsec) {
292231437Sluigi		device_printf(sc->dev,
293231437Sluigi			"Invalid Cookie. Firmware image corrupted ?\n");
294231437Sluigi		return EINVAL;
295231437Sluigi	}
296231437Sluigi
297231437Sluigi	rc = oce_dma_alloc(sc, sizeof(struct mbx_common_read_write_flashrom)
298231437Sluigi			+ 32*1024, &dma_mem, 0);
299231437Sluigi	if (rc) {
300231437Sluigi		device_printf(sc->dev,
301231437Sluigi			"Memory allocation failure while flashing\n");
302231437Sluigi		return ENOMEM;
303231437Sluigi	}
304231437Sluigi	req = OCE_DMAPTR(&dma_mem, struct mbx_common_read_write_flashrom);
305231437Sluigi
306231437Sluigi	for (i = 0; i < MAX_FLASH_COMP; i++) {
307231437Sluigi
308231437Sluigi		img_type = fsec->fsec_entry[i].type;
309231437Sluigi		skip_image = FALSE;
310231437Sluigi		switch (img_type) {
311231437Sluigi		case IMG_ISCSI:
312231437Sluigi			optype = 0;
313231437Sluigi			size = 2097152;
314231437Sluigi			start = 2097152;
315231437Sluigi			break;
316231437Sluigi		case IMG_REDBOOT:
317231437Sluigi			optype = 1;
318231437Sluigi			size = 1048576;
319231437Sluigi			start = 262144;
320231437Sluigi			if (!oce_img_flashing_required(sc, fw->data,
321231437Sluigi				optype, start, size, bin_offset))
322231437Sluigi				skip_image = TRUE;
323231437Sluigi			break;
324231437Sluigi		case IMG_BIOS:
325231437Sluigi			optype = 2;
326231437Sluigi			size = 524288;
327231437Sluigi			start = 12582912;
328231437Sluigi			break;
329231437Sluigi		case IMG_PXEBIOS:
330231437Sluigi			optype = 3;
331231437Sluigi			size = 524288;
332231437Sluigi			start = 13107200;
333231437Sluigi			break;
334231437Sluigi		case IMG_FCOEBIOS:
335231437Sluigi			optype = 8;
336231437Sluigi			size = 524288;
337231437Sluigi			start = 13631488;
338231437Sluigi			break;
339231437Sluigi		case IMG_ISCSI_BAK:
340231437Sluigi			optype = 9;
341231437Sluigi			size = 2097152;
342231437Sluigi			start = 4194304;
343231437Sluigi			break;
344231437Sluigi		case IMG_FCOE:
345231437Sluigi			optype = 10;
346231437Sluigi			size = 2097152;
347231437Sluigi			start = 6291456;
348231437Sluigi			break;
349231437Sluigi		case IMG_FCOE_BAK:
350231437Sluigi			optype = 11;
351231437Sluigi			size = 2097152;
352231437Sluigi			start = 8388608;
353231437Sluigi			break;
354231437Sluigi		case IMG_NCSI:
355231437Sluigi			optype = 13;
356231437Sluigi			size = 262144;
357231437Sluigi			start = 15990784;
358231437Sluigi			break;
359231437Sluigi		case IMG_PHY:
360231437Sluigi			optype = 99;
361231437Sluigi			size = 262144;
362231437Sluigi			start = 1310720;
363231437Sluigi			if (!oce_phy_flashing_required(sc))
364231437Sluigi				skip_image = TRUE;
365231437Sluigi			break;
366231437Sluigi		default:
367231437Sluigi			skip_image = TRUE;
368231437Sluigi			break;
369231437Sluigi		}
370231437Sluigi		if (skip_image)
371231437Sluigi			continue;
372231437Sluigi
373231437Sluigi		p = fw->data;
374231437Sluigi		p = p + bin_offset + start;
375231437Sluigi		if ((p + size) > ((const char *)fw->data + fw->datasize)) {
376231437Sluigi			rc = 1;
377231437Sluigi			goto ret;
378231437Sluigi		}
379231437Sluigi
380231437Sluigi		while (size) {
381231437Sluigi
382231437Sluigi			if (size > 32*1024)
383231437Sluigi				num_bytes = 32*1024;
384231437Sluigi			else
385231437Sluigi				num_bytes = size;
386231437Sluigi			size -= num_bytes;
387231437Sluigi
388231437Sluigi			if (!size)
389231437Sluigi				opcode = FLASHROM_OPER_FLASH;
390231437Sluigi			else
391231437Sluigi				opcode = FLASHROM_OPER_SAVE;
392231437Sluigi
393231437Sluigi			memcpy(req->data_buffer, p, num_bytes);
394231437Sluigi			p += num_bytes;
395231437Sluigi
396231437Sluigi			rc = oce_mbox_write_flashrom(sc, optype, opcode,
397231437Sluigi						&dma_mem, num_bytes);
398231437Sluigi			if (rc) {
399231437Sluigi				device_printf(sc->dev,
400231437Sluigi					"cmd to write to flash rom failed.\n");
401231437Sluigi				rc = EIO;
402231437Sluigi				goto ret;
403231437Sluigi			}
404231437Sluigi			/* Leave the CPU for others for some time */
405231437Sluigi			pause("yield", 10);
406231437Sluigi
407231437Sluigi		}
408231437Sluigi	}
409231437Sluigiret:
410231437Sluigi	oce_dma_free(sc, &dma_mem);
411231437Sluigi	return rc;
412231437Sluigi
413231437Sluigi}
414231437Sluigi
415231437Sluigi
416231437Sluigistatic boolean_t
417231437Sluigioce_phy_flashing_required(POCE_SOFTC sc)
418231437Sluigi{
419231437Sluigi	int status = 0;
420231437Sluigi	struct oce_phy_info phy_info;
421231437Sluigi
422231437Sluigi	status = oce_mbox_get_phy_info(sc, &phy_info);
423231437Sluigi	if (status)
424231437Sluigi		return FALSE;
425231437Sluigi
426231437Sluigi	if ((phy_info.phy_type == TN_8022) &&
427231437Sluigi		(phy_info.interface_type == PHY_TYPE_BASET_10GB)) {
428231437Sluigi		return TRUE;
429231437Sluigi	}
430231437Sluigi
431231437Sluigi	return FALSE;
432231437Sluigi}
433231437Sluigi
434231437Sluigi
435231437Sluigistatic boolean_t
436231437Sluigioce_img_flashing_required(POCE_SOFTC sc, const char *p,
437231437Sluigi				int img_optype, uint32_t img_offset,
438231437Sluigi				uint32_t img_size, uint32_t hdrs_size)
439231437Sluigi{
440231437Sluigi	uint32_t crc_offset;
441231437Sluigi	uint8_t flashed_crc[4];
442231437Sluigi	int status;
443231437Sluigi
444231437Sluigi	crc_offset = hdrs_size + img_offset + img_size - 4;
445231437Sluigi
446231437Sluigi	p += crc_offset;
447231437Sluigi
448231437Sluigi	status = oce_mbox_get_flashrom_crc(sc, flashed_crc,
449231437Sluigi			(img_size - 4), img_optype);
450231437Sluigi	if (status)
451231437Sluigi		return TRUE; /* Some thing worng. ReFlash */
452231437Sluigi
453231437Sluigi	/*update redboot only if crc does not match*/
454231437Sluigi	if (bcmp(flashed_crc, p, 4))
455231437Sluigi		return TRUE;
456231437Sluigi	else
457231437Sluigi		return FALSE;
458231437Sluigi}
459231437Sluigi
460231437Sluigi
461231437Sluigistatic int
462231437Sluigioce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw)
463231437Sluigi{
464231437Sluigi
465231437Sluigi	int rc = 0;
466231437Sluigi	OCE_DMA_MEM dma_mem;
467231437Sluigi	const uint8_t *data = NULL;
468231437Sluigi	uint8_t *dest_image_ptr = NULL;
469231437Sluigi	size_t size = 0;
470231437Sluigi	uint32_t data_written = 0, chunk_size = 0;
471231437Sluigi	uint32_t offset = 0, add_status = 0;
472231437Sluigi
473231437Sluigi	if (!IS_ALIGNED(fw->datasize, sizeof(uint32_t))) {
474231437Sluigi		device_printf(sc->dev,
475231437Sluigi			"Lancer FW image is not 4 byte aligned.");
476231437Sluigi		return EINVAL;
477231437Sluigi	}
478231437Sluigi
479231437Sluigi	rc = oce_dma_alloc(sc, 32*1024, &dma_mem, 0);
480231437Sluigi	if (rc) {
481231437Sluigi		device_printf(sc->dev,
482231437Sluigi			"Memory allocation failure while flashing Lancer\n");
483231437Sluigi		return ENOMEM;
484231437Sluigi	}
485231437Sluigi
486231437Sluigi	size = fw->datasize;
487231437Sluigi	data = fw->data;
488231437Sluigi	dest_image_ptr = OCE_DMAPTR(&dma_mem, uint8_t);
489231437Sluigi
490231437Sluigi	while (size) {
491231437Sluigi		chunk_size = MIN(size, (32*1024));
492231437Sluigi
493231437Sluigi		bcopy(data, dest_image_ptr, chunk_size);
494231437Sluigi
495231437Sluigi		rc = oce_mbox_lancer_write_flashrom(sc, chunk_size, offset,
496231437Sluigi				&dma_mem, &data_written, &add_status);
497231437Sluigi
498231437Sluigi		if (rc)
499231437Sluigi			break;
500231437Sluigi
501231437Sluigi		size	-= data_written;
502231437Sluigi		data	+= data_written;
503231437Sluigi		offset	+= data_written;
504231437Sluigi		pause("yield", 10);
505231437Sluigi
506231437Sluigi	}
507231437Sluigi
508231437Sluigi	if (!rc)
509231437Sluigi		/* Commit the firmware*/
510231437Sluigi		rc = oce_mbox_lancer_write_flashrom(sc, 0, offset, &dma_mem,
511231437Sluigi						&data_written, &add_status);
512231437Sluigi	if (rc) {
513231437Sluigi		device_printf(sc->dev, "Lancer firmware load error. "
514231437Sluigi			"Addstatus = 0x%x, status = %d \n", add_status, rc);
515231437Sluigi		rc = EIO;
516231437Sluigi	}
517231437Sluigi	oce_dma_free(sc, &dma_mem);
518231437Sluigi	return rc;
519231437Sluigi
520231437Sluigi}
521231437Sluigi
522231437Sluigi
523231437Sluigistatic void
524231437Sluigioce_add_stats_sysctls_be3(POCE_SOFTC sc,
525231437Sluigi				  struct sysctl_ctx_list *ctx,
526231437Sluigi				  struct sysctl_oid *stats_node)
527231437Sluigi{
528231437Sluigi	struct sysctl_oid *rx_stats_node, *tx_stats_node;
529231437Sluigi	struct sysctl_oid_list *rx_stat_list, *tx_stat_list;
530231437Sluigi	struct sysctl_oid_list *queue_stats_list;
531231437Sluigi	struct sysctl_oid *queue_stats_node;
532231437Sluigi	struct oce_drv_stats *stats;
533231437Sluigi	char prefix[32];
534231437Sluigi	int i;
535231437Sluigi
536231437Sluigi	stats = &sc->oce_stats_info;
537231437Sluigi
538231437Sluigi	rx_stats_node = SYSCTL_ADD_NODE(ctx,
539231437Sluigi					SYSCTL_CHILDREN(stats_node),
540231437Sluigi					OID_AUTO,"rx", CTLFLAG_RD,
541231437Sluigi					NULL, "RX Ethernet Statistics");
542231437Sluigi	rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
543231437Sluigi
544231437Sluigi
545231437Sluigi	SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts",
546231437Sluigi			CTLFLAG_RD, &stats->rx.t_rx_pkts,
547231437Sluigi			"Total Received Packets");
548231437Sluigi	SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes",
549231437Sluigi			CTLFLAG_RD, &stats->rx.t_rx_bytes,
550231437Sluigi			"Total Received Bytes");
551231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags",
552231437Sluigi			CTLFLAG_RD, &stats->rx.t_rx_frags, 0,
553231437Sluigi			"Total Received Fragements");
554231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts",
555231437Sluigi			CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0,
556231437Sluigi			"Total Received Multicast Packets");
557231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts",
558231437Sluigi			CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0,
559231437Sluigi			"Total Received Unicast Packets");
560231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs",
561231437Sluigi			CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0,
562231437Sluigi			"Total Receive completion errors");
563231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames",
564231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_pause_frames, 0,
565231437Sluigi			"Pause Frames");
566231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "priority_pause_frames",
567231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_priority_pause_frames, 0,
568231437Sluigi			"Priority Pause Frames");
569231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames",
570231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_control_frames, 0,
571231437Sluigi			"Control Frames");
572231437Sluigi
573231437Sluigi	for (i = 0; i < sc->nrqs; i++) {
574231437Sluigi		sprintf(prefix, "queue%d",i);
575231437Sluigi		queue_stats_node = SYSCTL_ADD_NODE(ctx,
576231437Sluigi						SYSCTL_CHILDREN(rx_stats_node),
577231437Sluigi						OID_AUTO, prefix, CTLFLAG_RD,
578231437Sluigi						NULL, "Queue name");
579231437Sluigi		queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
580231437Sluigi
581231437Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts",
582231437Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts,
583231437Sluigi			"Receive Packets");
584231437Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes",
585231437Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes,
586231437Sluigi			"Recived Bytes");
587231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags",
588231437Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0,
589231437Sluigi			"Received Fragments");
590231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
591231437Sluigi				"rx_mcast_pkts", CTLFLAG_RD,
592231437Sluigi				&sc->rq[i]->rx_stats.rx_mcast_pkts, 0,
593231437Sluigi					"Received Multicast Packets");
594231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
595231437Sluigi				"rx_ucast_pkts", CTLFLAG_RD,
596231437Sluigi				&sc->rq[i]->rx_stats.rx_ucast_pkts, 0,
597231437Sluigi					"Received Unicast Packets");
598231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err",
599231437Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0,
600231437Sluigi			"Received Completion Errors");
601231437Sluigi
602231437Sluigi	}
603231437Sluigi
604231437Sluigi	rx_stats_node = SYSCTL_ADD_NODE(ctx,
605231437Sluigi					SYSCTL_CHILDREN(rx_stats_node),
606231437Sluigi					OID_AUTO, "err", CTLFLAG_RD,
607231437Sluigi					NULL, "Receive Error Stats");
608231437Sluigi	rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
609231437Sluigi
610231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs",
611231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_crc_errors, 0,
612231437Sluigi			"CRC Errors");
613231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pbuf_errors",
614231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_drops_no_pbuf, 0,
615231437Sluigi			"Drops due to pbuf full");
616231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "erx_errors",
617231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_drops_no_erx_descr, 0,
618231437Sluigi			"ERX Errors");
619231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors",
620231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_drops_too_many_frags, 0,
621231437Sluigi			"RX Alignmnet Errors");
622231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors",
623231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_in_range_errors, 0,
624231437Sluigi			"In Range Errors");
625231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors",
626231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_out_range_errors, 0,
627231437Sluigi			"Out Range Errors");
628231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long",
629231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_frame_too_long, 0,
630231437Sluigi			"Frame Too Long");
631231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors",
632231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_address_match_errors, 0,
633231437Sluigi			"Address Match Errors");
634231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small",
635231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_dropped_too_small, 0,
636231437Sluigi			"Dropped Too Small");
637231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short",
638231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_dropped_too_short, 0,
639231437Sluigi			"Dropped Too Short");
640231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
641231437Sluigi			"dropped_header_too_small", CTLFLAG_RD,
642231437Sluigi			&stats->u0.be.rx_dropped_header_too_small, 0,
643231437Sluigi			"Dropped Header Too Small");
644231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_tcp_length",
645231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_dropped_tcp_length, 0,
646231437Sluigi			"Dropped TCP Length");
647231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt",
648231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_dropped_runt, 0,
649231437Sluigi			"Dropped runt");
650231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs",
651231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_ip_checksum_errs, 0,
652231437Sluigi			"IP Checksum Errors");
653231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs",
654231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_tcp_checksum_errs, 0,
655231437Sluigi			"TCP Checksum Errors");
656231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs",
657231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_udp_checksum_errs, 0,
658231437Sluigi			"UDP Checksum Errors");
659231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "fifo_overflow_drop",
660231437Sluigi			CTLFLAG_RD, &stats->u0.be.rxpp_fifo_overflow_drop, 0,
661231437Sluigi			"FIFO Overflow Drop");
662231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
663231437Sluigi			"input_fifo_overflow_drop", CTLFLAG_RD,
664231437Sluigi			&stats->u0.be.rx_input_fifo_overflow_drop, 0,
665231437Sluigi			"Input FIFO Overflow Drop");
666231437Sluigi
667231437Sluigi	tx_stats_node = SYSCTL_ADD_NODE(ctx,
668231437Sluigi					SYSCTL_CHILDREN(stats_node), OID_AUTO,
669231437Sluigi					"tx",CTLFLAG_RD, NULL,
670231437Sluigi					"TX Ethernet Statistics");
671231437Sluigi	tx_stat_list = SYSCTL_CHILDREN(tx_stats_node);
672231437Sluigi
673231437Sluigi	SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts",
674231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_pkts,
675231437Sluigi			"Total Transmit Packets");
676231437Sluigi	SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes",
677231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_bytes,
678231437Sluigi			"Total Transmit Bytes");
679231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs",
680231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_reqs, 0,
681231437Sluigi			"Total Transmit Requests");
682231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops",
683231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_stops, 0,
684231437Sluigi			"Total Transmit Stops");
685231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs",
686231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0,
687231437Sluigi			"Total Transmit WRB's");
688231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl",
689231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_compl, 0,
690231437Sluigi			"Total Transmit Completions");
691231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO,
692231437Sluigi			"total_ipv6_ext_hdr_tx_drop", CTLFLAG_RD,
693231437Sluigi			&stats->tx.t_ipv6_ext_hdr_tx_drop, 0,
694231437Sluigi			"Total Transmit IPV6 Drops");
695231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes",
696231437Sluigi			CTLFLAG_RD, &stats->u0.be.tx_pauseframes, 0,
697231437Sluigi			"Pause Frames");
698231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "priority_pauseframes",
699231437Sluigi			CTLFLAG_RD, &stats->u0.be.tx_priority_pauseframes, 0,
700231437Sluigi			"Priority Pauseframes");
701231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes",
702231437Sluigi			CTLFLAG_RD, &stats->u0.be.tx_controlframes, 0,
703231437Sluigi			"Tx Control Frames");
704231437Sluigi
705231437Sluigi	for (i = 0; i < sc->nwqs; i++) {
706231437Sluigi		sprintf(prefix, "queue%d",i);
707231437Sluigi		queue_stats_node = SYSCTL_ADD_NODE(ctx,
708231437Sluigi						SYSCTL_CHILDREN(tx_stats_node),
709231437Sluigi						OID_AUTO, prefix, CTLFLAG_RD,
710231437Sluigi						NULL, "Queue name");
711231437Sluigi		queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
712231437Sluigi
713231437Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts",
714231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts,
715231437Sluigi			"Transmit Packets");
716231437Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes",
717231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes,
718231437Sluigi			"Transmit Bytes");
719231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs",
720231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0,
721231437Sluigi			"Transmit Requests");
722231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops",
723231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0,
724231437Sluigi			"Transmit Stops");
725231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs",
726231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0,
727231437Sluigi			"Transmit WRB's");
728231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl",
729231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0,
730231437Sluigi			"Transmit Completions");
731231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
732231437Sluigi			"ipv6_ext_hdr_tx_drop",CTLFLAG_RD,
733231437Sluigi			&sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0,
734231437Sluigi			"Transmit IPV6 Ext Header Drop");
735231437Sluigi
736231437Sluigi	}
737231437Sluigi	return;
738231437Sluigi}
739231437Sluigi
740231437Sluigi
741231437Sluigistatic void
742231437Sluigioce_add_stats_sysctls_xe201(POCE_SOFTC sc,
743231437Sluigi				  struct sysctl_ctx_list *ctx,
744231437Sluigi				  struct sysctl_oid *stats_node)
745231437Sluigi{
746231437Sluigi	struct sysctl_oid *rx_stats_node, *tx_stats_node;
747231437Sluigi	struct sysctl_oid_list *rx_stat_list, *tx_stat_list;
748231437Sluigi	struct sysctl_oid_list *queue_stats_list;
749231437Sluigi	struct sysctl_oid *queue_stats_node;
750231437Sluigi	struct oce_drv_stats *stats;
751231437Sluigi	char prefix[32];
752231437Sluigi	int i;
753231437Sluigi
754231437Sluigi	stats = &sc->oce_stats_info;
755231437Sluigi
756231437Sluigi	rx_stats_node = SYSCTL_ADD_NODE(ctx,
757231437Sluigi					SYSCTL_CHILDREN(stats_node),
758231437Sluigi					OID_AUTO, "rx", CTLFLAG_RD,
759231437Sluigi					NULL, "RX Ethernet Statistics");
760231437Sluigi	rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
761231437Sluigi
762231437Sluigi
763231437Sluigi	SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts",
764231437Sluigi			CTLFLAG_RD, &stats->rx.t_rx_pkts,
765231437Sluigi			"Total Received Packets");
766231437Sluigi	SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes",
767231437Sluigi			CTLFLAG_RD, &stats->rx.t_rx_bytes,
768231437Sluigi			"Total Received Bytes");
769231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags",
770231437Sluigi			CTLFLAG_RD, &stats->rx.t_rx_frags, 0,
771231437Sluigi			"Total Received Fragements");
772231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts",
773231437Sluigi			CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0,
774231437Sluigi			"Total Received Multicast Packets");
775231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts",
776231437Sluigi			CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0,
777231437Sluigi			"Total Received Unicast Packets");
778231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs",
779231437Sluigi			CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0,
780231437Sluigi			"Total Receive completion errors");
781231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames",
782231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_pause_frames, 0,
783231437Sluigi			"Pause Frames");
784231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames",
785231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_control_frames, 0,
786231437Sluigi			"Control Frames");
787231437Sluigi
788231437Sluigi	for (i = 0; i < sc->nrqs; i++) {
789231437Sluigi		sprintf(prefix, "queue%d",i);
790231437Sluigi		queue_stats_node = SYSCTL_ADD_NODE(ctx,
791231437Sluigi						SYSCTL_CHILDREN(rx_stats_node),
792231437Sluigi						OID_AUTO, prefix, CTLFLAG_RD,
793231437Sluigi						NULL, "Queue name");
794231437Sluigi		queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
795231437Sluigi
796231437Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts",
797231437Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts,
798231437Sluigi			"Receive Packets");
799231437Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes",
800231437Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes,
801231437Sluigi			"Recived Bytes");
802231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags",
803231437Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0,
804231437Sluigi			"Received Fragments");
805231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
806231437Sluigi			"rx_mcast_pkts", CTLFLAG_RD,
807231437Sluigi			&sc->rq[i]->rx_stats.rx_mcast_pkts, 0,
808231437Sluigi			"Received Multicast Packets");
809231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
810231437Sluigi			"rx_ucast_pkts",CTLFLAG_RD,
811231437Sluigi			&sc->rq[i]->rx_stats.rx_ucast_pkts, 0,
812231437Sluigi			"Received Unicast Packets");
813231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err",
814231437Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0,
815231437Sluigi			"Received Completion Errors");
816231437Sluigi
817231437Sluigi	}
818231437Sluigi
819231437Sluigi	rx_stats_node = SYSCTL_ADD_NODE(ctx,
820231437Sluigi					SYSCTL_CHILDREN(rx_stats_node),
821231437Sluigi					OID_AUTO, "err", CTLFLAG_RD,
822231437Sluigi					NULL, "Receive Error Stats");
823231437Sluigi	rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
824231437Sluigi
825231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs",
826231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_crc_errors, 0,
827231437Sluigi			"CRC Errors");
828231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors",
829231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_alignment_errors, 0,
830231437Sluigi			"RX Alignmnet Errors");
831231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors",
832231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_in_range_errors, 0,
833231437Sluigi			"In Range Errors");
834231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors",
835231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_out_of_range_errors, 0,
836231437Sluigi			"Out Range Errors");
837231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long",
838231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_frames_too_long, 0,
839231437Sluigi			"Frame Too Long");
840231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors",
841231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_address_match_errors, 0,
842231437Sluigi			"Address Match Errors");
843231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small",
844231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_small, 0,
845231437Sluigi			"Dropped Too Small");
846231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short",
847231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_short, 0,
848231437Sluigi			"Dropped Too Short");
849231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
850231437Sluigi			"dropped_header_too_small", CTLFLAG_RD,
851231437Sluigi			&stats->u0.xe201.rx_dropped_header_too_small, 0,
852231437Sluigi			"Dropped Header Too Small");
853231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
854231437Sluigi			"dropped_tcp_length", CTLFLAG_RD,
855231437Sluigi			&stats->u0.xe201.rx_dropped_invalid_tcp_length, 0,
856231437Sluigi			"Dropped TCP Length");
857231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt",
858231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_dropped_runt, 0,
859231437Sluigi			"Dropped runt");
860231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs",
861231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_ip_checksum_errors, 0,
862231437Sluigi			"IP Checksum Errors");
863231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs",
864231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_tcp_checksum_errors, 0,
865231437Sluigi			"TCP Checksum Errors");
866231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs",
867231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_udp_checksum_errors, 0,
868231437Sluigi			"UDP Checksum Errors");
869231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "input_fifo_overflow_drop",
870231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_fifo_overflow, 0,
871231437Sluigi			"Input FIFO Overflow Drop");
872231437Sluigi
873231437Sluigi	tx_stats_node = SYSCTL_ADD_NODE(ctx,
874231437Sluigi					SYSCTL_CHILDREN(stats_node),
875231437Sluigi					OID_AUTO, "tx", CTLFLAG_RD,
876231437Sluigi					NULL, "TX Ethernet Statistics");
877231437Sluigi	tx_stat_list = SYSCTL_CHILDREN(tx_stats_node);
878231437Sluigi
879231437Sluigi	SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts",
880231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_pkts,
881231437Sluigi			"Total Transmit Packets");
882231437Sluigi	SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes",
883231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_bytes,
884231437Sluigi			"Total Transmit Bytes");
885231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs",
886231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_reqs, 0,
887231437Sluigi			"Total Transmit Requests");
888231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops",
889231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_stops, 0,
890231437Sluigi			"Total Transmit Stops");
891231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs",
892231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0,
893231437Sluigi			"Total Transmit WRB's");
894231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl",
895231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_compl, 0,
896231437Sluigi			"Total Transmit Completions");
897231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO,
898231437Sluigi			"total_ipv6_ext_hdr_tx_drop",
899231437Sluigi			CTLFLAG_RD, &stats->tx.t_ipv6_ext_hdr_tx_drop, 0,
900231437Sluigi			"Total Transmit IPV6 Drops");
901231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes",
902231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.tx_pause_frames, 0,
903231437Sluigi			"Pause Frames");
904231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes",
905231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.tx_control_frames, 0,
906231437Sluigi			"Tx Control Frames");
907231437Sluigi
908231437Sluigi	for (i = 0; i < sc->nwqs; i++) {
909231437Sluigi		sprintf(prefix, "queue%d",i);
910231437Sluigi		queue_stats_node = SYSCTL_ADD_NODE(ctx,
911231437Sluigi						SYSCTL_CHILDREN(tx_stats_node),
912231437Sluigi						OID_AUTO, prefix, CTLFLAG_RD,
913231437Sluigi						NULL, "Queue name");
914231437Sluigi		queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
915231437Sluigi
916231437Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts",
917231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts,
918231437Sluigi			"Transmit Packets");
919231437Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes",
920231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes,
921231437Sluigi			"Transmit Bytes");
922231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs",
923231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0,
924231437Sluigi			"Transmit Requests");
925231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops",
926231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0,
927231437Sluigi			"Transmit Stops");
928231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs",
929231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0,
930231437Sluigi			"Transmit WRB's");
931231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl",
932231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0,
933231437Sluigi			"Transmit Completions");
934231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
935231437Sluigi			"ipv6_ext_hdr_tx_drop", CTLFLAG_RD,
936231437Sluigi			&sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0,
937231437Sluigi			"Transmit IPV6 Ext Header Drop");
938231437Sluigi
939231437Sluigi	}
940231437Sluigi	return;
941231437Sluigi}
942231437Sluigi
943231437Sluigi
944231437Sluigivoid
945231437Sluigioce_refresh_queue_stats(POCE_SOFTC sc)
946231437Sluigi{
947231437Sluigi	struct oce_drv_stats *adapter_stats;
948231437Sluigi	int i;
949231437Sluigi
950231437Sluigi	adapter_stats = &sc->oce_stats_info;
951231437Sluigi
952231437Sluigi	/* Caluculate total TX and TXstats from all queues */
953231437Sluigi
954231437Sluigi	bzero(&adapter_stats->rx, sizeof(struct oce_rx_stats));
955231437Sluigi	for (i = 0; i < sc->nrqs; i++) {
956231437Sluigi
957231437Sluigi		adapter_stats->rx.t_rx_pkts += sc->rq[i]->rx_stats.rx_pkts;
958231437Sluigi		adapter_stats->rx.t_rx_bytes += sc->rq[i]->rx_stats.rx_bytes;
959231437Sluigi		adapter_stats->rx.t_rx_frags += sc->rq[i]->rx_stats.rx_frags;
960231437Sluigi		adapter_stats->rx.t_rx_mcast_pkts +=
961231437Sluigi					sc->rq[i]->rx_stats.rx_mcast_pkts;
962231437Sluigi		adapter_stats->rx.t_rx_ucast_pkts +=
963231437Sluigi					sc->rq[i]->rx_stats.rx_ucast_pkts;
964231437Sluigi		adapter_stats->rx.t_rxcp_errs += sc-> rq[i]->rx_stats.rxcp_err;
965231437Sluigi	}
966231437Sluigi
967231437Sluigi	bzero(&adapter_stats->tx, sizeof(struct oce_tx_stats));
968231437Sluigi	for (i = 0; i < sc->nwqs; i++) {
969231437Sluigi		adapter_stats->tx.t_tx_reqs += sc->wq[i]->tx_stats.tx_reqs;
970231437Sluigi		adapter_stats->tx.t_tx_stops += sc->wq[i]->tx_stats.tx_stops;
971231437Sluigi		adapter_stats->tx.t_tx_wrbs += sc->wq[i]->tx_stats.tx_wrbs;
972231437Sluigi		adapter_stats->tx.t_tx_compl += sc->wq[i]->tx_stats.tx_compl;
973231437Sluigi		adapter_stats->tx.t_tx_bytes += sc->wq[i]->tx_stats.tx_bytes;
974231437Sluigi		adapter_stats->tx.t_tx_pkts += sc->wq[i]->tx_stats.tx_pkts;
975231437Sluigi		adapter_stats->tx.t_ipv6_ext_hdr_tx_drop +=
976231437Sluigi				sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop;
977231437Sluigi	}
978231437Sluigi
979231437Sluigi}
980231437Sluigi
981231437Sluigi
982231437Sluigi
983231437Sluigistatic void
984231437Sluigicopy_stats_to_sc_xe201(POCE_SOFTC sc)
985231437Sluigi{
986231437Sluigi	struct oce_xe201_stats *adapter_stats;
987231437Sluigi	struct mbx_get_pport_stats *nic_mbx;
988231437Sluigi	struct pport_stats *port_stats;
989231437Sluigi
990231437Sluigi	nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_pport_stats);
991231437Sluigi	port_stats = &nic_mbx->params.rsp.pps;
992231437Sluigi	adapter_stats = &sc->oce_stats_info.u0.xe201;
993231437Sluigi
994231437Sluigi	adapter_stats->tx_pkts = port_stats->tx_pkts;
995231437Sluigi	adapter_stats->tx_unicast_pkts = port_stats->tx_unicast_pkts;
996231437Sluigi	adapter_stats->tx_multicast_pkts = port_stats->tx_multicast_pkts;
997231437Sluigi	adapter_stats->tx_broadcast_pkts = port_stats->tx_broadcast_pkts;
998231437Sluigi	adapter_stats->tx_bytes = port_stats->tx_bytes;
999231437Sluigi	adapter_stats->tx_unicast_bytes = port_stats->tx_unicast_bytes;
1000231437Sluigi	adapter_stats->tx_multicast_bytes = port_stats->tx_multicast_bytes;
1001231437Sluigi	adapter_stats->tx_broadcast_bytes = port_stats->tx_broadcast_bytes;
1002231437Sluigi	adapter_stats->tx_discards = port_stats->tx_discards;
1003231437Sluigi	adapter_stats->tx_errors = port_stats->tx_errors;
1004231437Sluigi	adapter_stats->tx_pause_frames = port_stats->tx_pause_frames;
1005231437Sluigi	adapter_stats->tx_pause_on_frames = port_stats->tx_pause_on_frames;
1006231437Sluigi	adapter_stats->tx_pause_off_frames = port_stats->tx_pause_off_frames;
1007231437Sluigi	adapter_stats->tx_internal_mac_errors =
1008231437Sluigi		port_stats->tx_internal_mac_errors;
1009231437Sluigi	adapter_stats->tx_control_frames = port_stats->tx_control_frames;
1010231437Sluigi	adapter_stats->tx_pkts_64_bytes = port_stats->tx_pkts_64_bytes;
1011231437Sluigi	adapter_stats->tx_pkts_65_to_127_bytes =
1012231437Sluigi		port_stats->tx_pkts_65_to_127_bytes;
1013231437Sluigi	adapter_stats->tx_pkts_128_to_255_bytes =
1014231437Sluigi		port_stats->tx_pkts_128_to_255_bytes;
1015231437Sluigi	adapter_stats->tx_pkts_256_to_511_bytes =
1016231437Sluigi		port_stats->tx_pkts_256_to_511_bytes;
1017231437Sluigi	adapter_stats->tx_pkts_512_to_1023_bytes =
1018231437Sluigi		port_stats->tx_pkts_512_to_1023_bytes;
1019231437Sluigi	adapter_stats->tx_pkts_1024_to_1518_bytes =
1020231437Sluigi		port_stats->tx_pkts_1024_to_1518_bytes;
1021231437Sluigi	adapter_stats->tx_pkts_1519_to_2047_bytes =
1022231437Sluigi		port_stats->tx_pkts_1519_to_2047_bytes;
1023231437Sluigi	adapter_stats->tx_pkts_2048_to_4095_bytes =
1024231437Sluigi		port_stats->tx_pkts_2048_to_4095_bytes;
1025231437Sluigi	adapter_stats->tx_pkts_4096_to_8191_bytes =
1026231437Sluigi		port_stats->tx_pkts_4096_to_8191_bytes;
1027231437Sluigi	adapter_stats->tx_pkts_8192_to_9216_bytes =
1028231437Sluigi		port_stats->tx_pkts_8192_to_9216_bytes;
1029231437Sluigi	adapter_stats->tx_lso_pkts = port_stats->tx_lso_pkts;
1030231437Sluigi	adapter_stats->rx_pkts = port_stats->rx_pkts;
1031231437Sluigi	adapter_stats->rx_unicast_pkts = port_stats->rx_unicast_pkts;
1032231437Sluigi	adapter_stats->rx_multicast_pkts = port_stats->rx_multicast_pkts;
1033231437Sluigi	adapter_stats->rx_broadcast_pkts = port_stats->rx_broadcast_pkts;
1034231437Sluigi	adapter_stats->rx_bytes = port_stats->rx_bytes;
1035231437Sluigi	adapter_stats->rx_unicast_bytes = port_stats->rx_unicast_bytes;
1036231437Sluigi	adapter_stats->rx_multicast_bytes = port_stats->rx_multicast_bytes;
1037231437Sluigi	adapter_stats->rx_broadcast_bytes = port_stats->rx_broadcast_bytes;
1038231437Sluigi	adapter_stats->rx_unknown_protos = port_stats->rx_unknown_protos;
1039231437Sluigi	adapter_stats->rx_discards = port_stats->rx_discards;
1040231437Sluigi	adapter_stats->rx_errors = port_stats->rx_errors;
1041231437Sluigi	adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
1042231437Sluigi	adapter_stats->rx_alignment_errors = port_stats->rx_alignment_errors;
1043231437Sluigi	adapter_stats->rx_symbol_errors = port_stats->rx_symbol_errors;
1044231437Sluigi	adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
1045231437Sluigi	adapter_stats->rx_pause_on_frames = port_stats->rx_pause_on_frames;
1046231437Sluigi	adapter_stats->rx_pause_off_frames = port_stats->rx_pause_off_frames;
1047231437Sluigi	adapter_stats->rx_frames_too_long = port_stats->rx_frames_too_long;
1048231437Sluigi	adapter_stats->rx_internal_mac_errors =
1049231437Sluigi		port_stats->rx_internal_mac_errors;
1050231437Sluigi	adapter_stats->rx_undersize_pkts = port_stats->rx_undersize_pkts;
1051231437Sluigi	adapter_stats->rx_oversize_pkts = port_stats->rx_oversize_pkts;
1052231437Sluigi	adapter_stats->rx_fragment_pkts = port_stats->rx_fragment_pkts;
1053231437Sluigi	adapter_stats->rx_jabbers = port_stats->rx_jabbers;
1054231437Sluigi	adapter_stats->rx_control_frames = port_stats->rx_control_frames;
1055231437Sluigi	adapter_stats->rx_control_frames_unknown_opcode =
1056231437Sluigi		port_stats->rx_control_frames_unknown_opcode;
1057231437Sluigi	adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
1058231437Sluigi	adapter_stats->rx_out_of_range_errors =
1059231437Sluigi		port_stats->rx_out_of_range_errors;
1060231437Sluigi	adapter_stats->rx_address_match_errors =
1061231437Sluigi		port_stats->rx_address_match_errors;
1062231437Sluigi	adapter_stats->rx_vlan_mismatch_errors =
1063231437Sluigi		port_stats->rx_vlan_mismatch_errors;
1064231437Sluigi	adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
1065231437Sluigi	adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
1066231437Sluigi	adapter_stats->rx_dropped_header_too_small =
1067231437Sluigi		port_stats->rx_dropped_header_too_small;
1068231437Sluigi	adapter_stats->rx_dropped_invalid_tcp_length =
1069231437Sluigi		port_stats->rx_dropped_invalid_tcp_length;
1070231437Sluigi	adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
1071231437Sluigi	adapter_stats->rx_ip_checksum_errors =
1072231437Sluigi		port_stats->rx_ip_checksum_errors;
1073231437Sluigi	adapter_stats->rx_tcp_checksum_errors =
1074231437Sluigi		port_stats->rx_tcp_checksum_errors;
1075231437Sluigi	adapter_stats->rx_udp_checksum_errors =
1076231437Sluigi		port_stats->rx_udp_checksum_errors;
1077231437Sluigi	adapter_stats->rx_non_rss_pkts = port_stats->rx_non_rss_pkts;
1078231437Sluigi	adapter_stats->rx_ipv4_pkts = port_stats->rx_ipv4_pkts;
1079231437Sluigi	adapter_stats->rx_ipv6_pkts = port_stats->rx_ipv6_pkts;
1080231437Sluigi	adapter_stats->rx_ipv4_bytes = port_stats->rx_ipv4_bytes;
1081231437Sluigi	adapter_stats->rx_ipv6_bytes = port_stats->rx_ipv6_bytes;
1082231437Sluigi	adapter_stats->rx_nic_pkts = port_stats->rx_nic_pkts;
1083231437Sluigi	adapter_stats->rx_tcp_pkts = port_stats->rx_tcp_pkts;
1084231437Sluigi	adapter_stats->rx_iscsi_pkts = port_stats->rx_iscsi_pkts;
1085231437Sluigi	adapter_stats->rx_management_pkts = port_stats->rx_management_pkts;
1086231437Sluigi	adapter_stats->rx_switched_unicast_pkts =
1087231437Sluigi		port_stats->rx_switched_unicast_pkts;
1088231437Sluigi	adapter_stats->rx_switched_multicast_pkts =
1089231437Sluigi		port_stats->rx_switched_multicast_pkts;
1090231437Sluigi	adapter_stats->rx_switched_broadcast_pkts =
1091231437Sluigi		port_stats->rx_switched_broadcast_pkts;
1092231437Sluigi	adapter_stats->num_forwards = port_stats->num_forwards;
1093231437Sluigi	adapter_stats->rx_fifo_overflow = port_stats->rx_fifo_overflow;
1094231437Sluigi	adapter_stats->rx_input_fifo_overflow =
1095231437Sluigi		port_stats->rx_input_fifo_overflow;
1096231437Sluigi	adapter_stats->rx_drops_too_many_frags =
1097231437Sluigi		port_stats->rx_drops_too_many_frags;
1098231437Sluigi	adapter_stats->rx_drops_invalid_queue =
1099231437Sluigi		port_stats->rx_drops_invalid_queue;
1100231437Sluigi	adapter_stats->rx_drops_mtu = port_stats->rx_drops_mtu;
1101231437Sluigi	adapter_stats->rx_pkts_64_bytes = port_stats->rx_pkts_64_bytes;
1102231437Sluigi	adapter_stats->rx_pkts_65_to_127_bytes =
1103231437Sluigi		port_stats->rx_pkts_65_to_127_bytes;
1104231437Sluigi	adapter_stats->rx_pkts_128_to_255_bytes =
1105231437Sluigi		port_stats->rx_pkts_128_to_255_bytes;
1106231437Sluigi	adapter_stats->rx_pkts_256_to_511_bytes =
1107231437Sluigi		port_stats->rx_pkts_256_to_511_bytes;
1108231437Sluigi	adapter_stats->rx_pkts_512_to_1023_bytes =
1109231437Sluigi		port_stats->rx_pkts_512_to_1023_bytes;
1110231437Sluigi	adapter_stats->rx_pkts_1024_to_1518_bytes =
1111231437Sluigi		port_stats->rx_pkts_1024_to_1518_bytes;
1112231437Sluigi	adapter_stats->rx_pkts_1519_to_2047_bytes =
1113231437Sluigi		port_stats->rx_pkts_1519_to_2047_bytes;
1114231437Sluigi	adapter_stats->rx_pkts_2048_to_4095_bytes =
1115231437Sluigi		port_stats->rx_pkts_2048_to_4095_bytes;
1116231437Sluigi	adapter_stats->rx_pkts_4096_to_8191_bytes =
1117231437Sluigi		port_stats->rx_pkts_4096_to_8191_bytes;
1118231437Sluigi	adapter_stats->rx_pkts_8192_to_9216_bytes =
1119231437Sluigi		port_stats->rx_pkts_8192_to_9216_bytes;
1120231437Sluigi}
1121231437Sluigi
1122231437Sluigi
1123231437Sluigi
1124231437Sluigistatic void
1125231437Sluigicopy_stats_to_sc_be2(POCE_SOFTC sc)
1126231437Sluigi{
1127231437Sluigi	struct oce_be_stats *adapter_stats;
1128231437Sluigi	struct oce_pmem_stats *pmem;
1129231437Sluigi	struct oce_rxf_stats_v0 *rxf_stats;
1130231437Sluigi	struct oce_port_rxf_stats_v0 *port_stats;
1131231437Sluigi	struct mbx_get_nic_stats_v0 *nic_mbx;
1132231437Sluigi	uint32_t port = sc->port_id;
1133231437Sluigi
1134231437Sluigi	nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats_v0);
1135231437Sluigi	pmem = &nic_mbx->params.rsp.stats.pmem;
1136231437Sluigi	rxf_stats = &nic_mbx->params.rsp.stats.rxf;
1137231437Sluigi	port_stats = &nic_mbx->params.rsp.stats.rxf.port[port];
1138231437Sluigi
1139231437Sluigi	adapter_stats = &sc->oce_stats_info.u0.be;
1140231437Sluigi
1141231437Sluigi
1142231437Sluigi	/* Update stats */
1143231437Sluigi	adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
1144231437Sluigi	adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
1145231437Sluigi	adapter_stats->rx_control_frames = port_stats->rx_control_frames;
1146231437Sluigi	adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
1147231437Sluigi	adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long;
1148231437Sluigi	adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
1149231437Sluigi	adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs;
1150231437Sluigi	adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs;
1151231437Sluigi	adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs;
1152231437Sluigi	adapter_stats->rxpp_fifo_overflow_drop =
1153231437Sluigi					port_stats->rxpp_fifo_overflow_drop;
1154231437Sluigi	adapter_stats->rx_dropped_tcp_length =
1155231437Sluigi		port_stats->rx_dropped_tcp_length;
1156231437Sluigi	adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
1157231437Sluigi	adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
1158231437Sluigi	adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors;
1159231437Sluigi	adapter_stats->rx_dropped_header_too_small =
1160231437Sluigi		port_stats->rx_dropped_header_too_small;
1161231437Sluigi	adapter_stats->rx_input_fifo_overflow_drop =
1162231437Sluigi		port_stats->rx_input_fifo_overflow_drop;
1163231437Sluigi	adapter_stats->rx_address_match_errors =
1164231437Sluigi		port_stats->rx_address_match_errors;
1165231437Sluigi	adapter_stats->rx_alignment_symbol_errors =
1166231437Sluigi		port_stats->rx_alignment_symbol_errors;
1167231437Sluigi	adapter_stats->tx_pauseframes = port_stats->tx_pauseframes;
1168231437Sluigi	adapter_stats->tx_controlframes = port_stats->tx_controlframes;
1169231437Sluigi
1170231437Sluigi	if (sc->if_id)
1171231437Sluigi		adapter_stats->jabber_events = rxf_stats->port1_jabber_events;
1172231437Sluigi	else
1173231437Sluigi		adapter_stats->jabber_events = rxf_stats->port0_jabber_events;
1174231437Sluigi
1175231437Sluigi	adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf;
1176231437Sluigi	adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb;
1177231437Sluigi	adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr;
1178231437Sluigi	adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring;
1179231437Sluigi	adapter_stats->forwarded_packets = rxf_stats->forwarded_packets;
1180231437Sluigi	adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu;
1181231437Sluigi	adapter_stats->rx_drops_no_tpre_descr =
1182231437Sluigi		rxf_stats->rx_drops_no_tpre_descr;
1183231437Sluigi	adapter_stats->rx_drops_too_many_frags =
1184231437Sluigi		rxf_stats->rx_drops_too_many_frags;
1185231437Sluigi	adapter_stats->eth_red_drops = pmem->eth_red_drops;
1186231437Sluigi}
1187231437Sluigi
1188231437Sluigi
1189231437Sluigistatic void
1190231437Sluigicopy_stats_to_sc_be3(POCE_SOFTC sc)
1191231437Sluigi{
1192231437Sluigi	struct oce_be_stats *adapter_stats;
1193231437Sluigi	struct oce_pmem_stats *pmem;
1194231437Sluigi	struct oce_rxf_stats_v1 *rxf_stats;
1195231437Sluigi	struct oce_port_rxf_stats_v1 *port_stats;
1196231437Sluigi	struct mbx_get_nic_stats *nic_mbx;
1197231437Sluigi	uint32_t port = sc->port_id;
1198231437Sluigi
1199231437Sluigi	nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats);
1200231437Sluigi	pmem = &nic_mbx->params.rsp.stats.pmem;
1201231437Sluigi	rxf_stats = &nic_mbx->params.rsp.stats.rxf;
1202231437Sluigi	port_stats = &nic_mbx->params.rsp.stats.rxf.port[port];
1203231437Sluigi
1204231437Sluigi	adapter_stats = &sc->oce_stats_info.u0.be;
1205231437Sluigi
1206231437Sluigi	/* Update stats */
1207231437Sluigi	adapter_stats->pmem_fifo_overflow_drop =
1208231437Sluigi		port_stats->pmem_fifo_overflow_drop;
1209231437Sluigi	adapter_stats->rx_priority_pause_frames =
1210231437Sluigi		port_stats->rx_priority_pause_frames;
1211231437Sluigi	adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
1212231437Sluigi	adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
1213231437Sluigi	adapter_stats->rx_control_frames = port_stats->rx_control_frames;
1214231437Sluigi	adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
1215231437Sluigi	adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long;
1216231437Sluigi	adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
1217231437Sluigi	adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs;
1218231437Sluigi	adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs;
1219231437Sluigi	adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs;
1220231437Sluigi	adapter_stats->rx_dropped_tcp_length =
1221231437Sluigi		port_stats->rx_dropped_tcp_length;
1222231437Sluigi	adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
1223231437Sluigi	adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
1224231437Sluigi	adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors;
1225231437Sluigi	adapter_stats->rx_dropped_header_too_small =
1226231437Sluigi		port_stats->rx_dropped_header_too_small;
1227231437Sluigi	adapter_stats->rx_input_fifo_overflow_drop =
1228231437Sluigi		port_stats->rx_input_fifo_overflow_drop;
1229231437Sluigi	adapter_stats->rx_address_match_errors =
1230231437Sluigi		port_stats->rx_address_match_errors;
1231231437Sluigi	adapter_stats->rx_alignment_symbol_errors =
1232231437Sluigi		port_stats->rx_alignment_symbol_errors;
1233231437Sluigi	adapter_stats->rxpp_fifo_overflow_drop =
1234231437Sluigi		port_stats->rxpp_fifo_overflow_drop;
1235231437Sluigi	adapter_stats->tx_pauseframes = port_stats->tx_pauseframes;
1236231437Sluigi	adapter_stats->tx_controlframes = port_stats->tx_controlframes;
1237231437Sluigi	adapter_stats->jabber_events = port_stats->jabber_events;
1238231437Sluigi
1239231437Sluigi	adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf;
1240231437Sluigi	adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb;
1241231437Sluigi	adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr;
1242231437Sluigi	adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring;
1243231437Sluigi	adapter_stats->forwarded_packets = rxf_stats->forwarded_packets;
1244231437Sluigi	adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu;
1245231437Sluigi	adapter_stats->rx_drops_no_tpre_descr =
1246231437Sluigi		rxf_stats->rx_drops_no_tpre_descr;
1247231437Sluigi	adapter_stats->rx_drops_too_many_frags =
1248231437Sluigi		rxf_stats->rx_drops_too_many_frags;
1249231437Sluigi
1250231437Sluigi	adapter_stats->eth_red_drops = pmem->eth_red_drops;
1251231437Sluigi}
1252231437Sluigi
1253231437Sluigi
1254231437Sluigiint
1255231437Sluigioce_stats_init(POCE_SOFTC sc)
1256231437Sluigi{
1257231437Sluigi	int rc = 0, sz;
1258231437Sluigi
1259231437Sluigi	if (IS_BE(sc)) {
1260231437Sluigi		if (sc->flags & OCE_FLAGS_BE2)
1261231437Sluigi			sz = sizeof(struct mbx_get_nic_stats_v0);
1262231437Sluigi		else
1263231437Sluigi			sz = sizeof(struct mbx_get_nic_stats);
1264231437Sluigi	} else
1265231437Sluigi		sz = sizeof(struct mbx_get_pport_stats);
1266231437Sluigi
1267231437Sluigi	rc = oce_dma_alloc(sc, sz, &sc->stats_mem, 0);
1268231437Sluigi
1269231437Sluigi	return rc;
1270231437Sluigi}
1271231437Sluigi
1272231437Sluigi
1273231437Sluigivoid
1274231437Sluigioce_stats_free(POCE_SOFTC sc)
1275231437Sluigi{
1276231437Sluigi
1277231437Sluigi	oce_dma_free(sc, &sc->stats_mem);
1278231437Sluigi
1279231437Sluigi}
1280231437Sluigi
1281231437Sluigi
1282231437Sluigiint
1283231437Sluigioce_refresh_nic_stats(POCE_SOFTC sc)
1284231437Sluigi{
1285231437Sluigi	int rc = 0, reset = 0;
1286231437Sluigi
1287231437Sluigi	if (IS_BE(sc)) {
1288231437Sluigi		if (sc->flags & OCE_FLAGS_BE2) {
1289231437Sluigi			rc = oce_mbox_get_nic_stats_v0(sc, &sc->stats_mem);
1290231437Sluigi			if (!rc)
1291231437Sluigi				copy_stats_to_sc_be2(sc);
1292231437Sluigi		} else {
1293231437Sluigi			rc = oce_mbox_get_nic_stats(sc, &sc->stats_mem);
1294231437Sluigi			if (!rc)
1295231437Sluigi				copy_stats_to_sc_be3(sc);
1296231437Sluigi		}
1297231437Sluigi
1298231437Sluigi	} else {
1299231437Sluigi		rc = oce_mbox_get_pport_stats(sc, &sc->stats_mem, reset);
1300231437Sluigi		if (!rc)
1301231437Sluigi			copy_stats_to_sc_xe201(sc);
1302231437Sluigi	}
1303231437Sluigi
1304231437Sluigi	return rc;
1305231437Sluigi}
1306