1231437Sluigi/*-
2252869Sdelphij * Copyright (C) 2013 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: stable/11/sys/dev/oce/oce_sysctl.c 343300 2019-01-22 04:20:52Z delphij $ */
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);
46338938Sjpaetzelstatic void copy_stats_to_sc_sh(POCE_SOFTC sc);
47231437Sluigistatic int  oce_sysctl_loopback(SYSCTL_HANDLER_ARGS);
48258941Sdelphijstatic int  oce_sys_aic_enable(SYSCTL_HANDLER_ARGS);
49231437Sluigistatic int  oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
50257007Sdelphijstatic int oce_skyhawk_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
51231437Sluigistatic int  oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS);
52231437Sluigistatic int  oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
53247880Sdelphijstatic int oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS);
54231437Sluigistatic boolean_t oce_phy_flashing_required(POCE_SOFTC sc);
55231437Sluigistatic boolean_t oce_img_flashing_required(POCE_SOFTC sc, const char *p,
56231437Sluigi				int img_optype, uint32_t img_offset,
57231437Sluigi				uint32_t img_size, uint32_t hdrs_size);
58231437Sluigistatic void oce_add_stats_sysctls_be3(POCE_SOFTC sc,
59231437Sluigi				struct sysctl_ctx_list *ctx,
60231437Sluigi				struct sysctl_oid *stats_node);
61231437Sluigistatic void oce_add_stats_sysctls_xe201(POCE_SOFTC sc,
62231437Sluigi				struct sysctl_ctx_list *ctx,
63231437Sluigi				struct sysctl_oid *stats_node);
64231437Sluigi
65257007Sdelphij
66231437Sluigiextern char component_revision[32];
67343300Sdelphijuint8_t sfp_vpd_dump_buffer[TRANSCEIVER_DATA_SIZE];
68231437Sluigi
69257007Sdelphijstruct flash_img_attri {
70257007Sdelphij	int img_offset;
71257007Sdelphij	int img_size;
72257007Sdelphij	int img_type;
73257007Sdelphij	bool skip_image;
74257007Sdelphij	int optype;
75257007Sdelphij};
76257007Sdelphij
77231437Sluigivoid
78231437Sluigioce_add_sysctls(POCE_SOFTC sc)
79231437Sluigi{
80231437Sluigi
81231437Sluigi	struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev);
82231437Sluigi	struct sysctl_oid *tree = device_get_sysctl_tree(sc->dev);
83231437Sluigi	struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree);
84231437Sluigi	struct sysctl_oid *stats_node;
85231437Sluigi
86231437Sluigi	SYSCTL_ADD_STRING(ctx, child,
87231437Sluigi			OID_AUTO, "component_revision",
88273377Shselasky			CTLFLAG_RD,
89273377Shselasky			component_revision,
90231437Sluigi			sizeof(component_revision),
91231437Sluigi			"EMULEX One-Connect device driver revision");
92231437Sluigi
93231437Sluigi	SYSCTL_ADD_STRING(ctx, child,
94231437Sluigi			OID_AUTO, "firmware_version",
95273377Shselasky			CTLFLAG_RD,
96273377Shselasky			sc->fw_version,
97231437Sluigi			sizeof(sc->fw_version),
98231437Sluigi			"EMULEX One-Connect Firmware Version");
99231437Sluigi
100231437Sluigi	SYSCTL_ADD_INT(ctx, child,
101231437Sluigi			OID_AUTO, "max_rsp_handled",
102273377Shselasky			CTLFLAG_RW,
103231437Sluigi			&oce_max_rsp_handled,
104231437Sluigi			sizeof(oce_max_rsp_handled),
105231437Sluigi			"Maximum receive frames handled per interupt");
106231437Sluigi
107247880Sdelphij	if ((sc->function_mode & FNM_FLEX10_MODE) ||
108247880Sdelphij	    (sc->function_mode & FNM_UMC_MODE))
109231437Sluigi		SYSCTL_ADD_UINT(ctx, child,
110231437Sluigi				OID_AUTO, "speed",
111231437Sluigi				CTLFLAG_RD,
112231437Sluigi				&sc->qos_link_speed,
113231437Sluigi				0,"QOS Speed");
114231437Sluigi	else
115231437Sluigi		SYSCTL_ADD_UINT(ctx, child,
116231437Sluigi				OID_AUTO, "speed",
117231437Sluigi				CTLFLAG_RD,
118231437Sluigi				&sc->speed,
119231437Sluigi				0,"Link Speed");
120231437Sluigi
121231879Sluigi	if (sc->function_mode & FNM_UMC_MODE)
122231879Sluigi		SYSCTL_ADD_UINT(ctx, child,
123231879Sluigi				OID_AUTO, "pvid",
124231879Sluigi				CTLFLAG_RD,
125231879Sluigi				&sc->pvid,
126231879Sluigi				0,"PVID");
127231879Sluigi
128231437Sluigi	SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "loop_back",
129231437Sluigi		CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0,
130231437Sluigi		oce_sysctl_loopback, "I", "Loop Back Tests");
131231437Sluigi
132231437Sluigi	SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "fw_upgrade",
133231437Sluigi		CTLTYPE_STRING | CTLFLAG_RW, (void *)sc, 0,
134231437Sluigi		oce_sys_fwupgrade, "A", "Firmware ufi file");
135231437Sluigi
136258941Sdelphij	SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "aic_enable",
137258941Sdelphij		CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 1,
138258941Sdelphij		oce_sys_aic_enable, "I", "aic flags");
139258941Sdelphij
140247880Sdelphij        /*
141247880Sdelphij         *  Dumps Transceiver data
142247880Sdelphij	 *  "sysctl dev.oce.0.sfp_vpd_dump=0"
143247880Sdelphij         *  "sysctl -x dev.oce.0.sfp_vpd_dump_buffer" for hex dump
144247880Sdelphij         *  "sysctl -b dev.oce.0.sfp_vpd_dump_buffer > sfp.bin" for binary dump
145247880Sdelphij         */
146247880Sdelphij	SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "sfp_vpd_dump",
147247880Sdelphij			CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, oce_sysctl_sfp_vpd_dump,
148247880Sdelphij			"I", "Initiate a sfp_vpd_dump operation");
149247880Sdelphij	SYSCTL_ADD_OPAQUE(ctx, child, OID_AUTO, "sfp_vpd_dump_buffer",
150247880Sdelphij			CTLFLAG_RD, sfp_vpd_dump_buffer,
151247880Sdelphij			TRANSCEIVER_DATA_SIZE, "IU", "Access sfp_vpd_dump buffer");
152247880Sdelphij
153231437Sluigi	stats_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats",
154231437Sluigi				CTLFLAG_RD, NULL, "Ethernet Statistics");
155231437Sluigi
156252869Sdelphij	if (IS_BE(sc) || IS_SH(sc))
157231437Sluigi		oce_add_stats_sysctls_be3(sc, ctx, stats_node);
158231437Sluigi	else
159231437Sluigi		oce_add_stats_sysctls_xe201(sc, ctx, stats_node);
160231437Sluigi
161231437Sluigi
162231437Sluigi}
163231437Sluigi
164231437Sluigi
165231437Sluigistatic uint32_t
166231437Sluigioce_loopback_test(struct oce_softc *sc, uint8_t loopback_type)
167231437Sluigi{
168231437Sluigi	uint32_t status = 0;
169231437Sluigi
170257007Sdelphij	oce_mbox_cmd_set_loopback(sc, sc->port_id, loopback_type, 1);
171257007Sdelphij	status = oce_mbox_cmd_test_loopback(sc, sc->port_id, loopback_type,
172231437Sluigi				1500, 2, 0xabc);
173257007Sdelphij	oce_mbox_cmd_set_loopback(sc, sc->port_id, OCE_NO_LOOPBACK, 1);
174231437Sluigi
175231437Sluigi	return status;
176231437Sluigi}
177231437Sluigi
178231437Sluigistatic int
179258941Sdelphijoce_sys_aic_enable(SYSCTL_HANDLER_ARGS)
180258941Sdelphij{
181258941Sdelphij	int value = 0;
182258941Sdelphij	uint32_t status, vector;
183258941Sdelphij	POCE_SOFTC sc = (struct oce_softc *)arg1;
184258941Sdelphij	struct oce_aic_obj *aic;
185258941Sdelphij
186338938Sjpaetzel	/* set current value for proper sysctl logging */
187338938Sjpaetzel	value = sc->aic_obj[0].enable;
188258941Sdelphij	status = sysctl_handle_int(oidp, &value, 0, req);
189258941Sdelphij	if (status || !req->newptr)
190258941Sdelphij		return status;
191258941Sdelphij
192258941Sdelphij	for (vector = 0; vector < sc->intr_count; vector++) {
193258941Sdelphij		aic = &sc->aic_obj[vector];
194258941Sdelphij
195258941Sdelphij		if (value == 0){
196258941Sdelphij			aic->max_eqd = aic->min_eqd = aic->et_eqd = 0;
197258941Sdelphij			aic->enable = 0;
198258941Sdelphij		}
199258941Sdelphij		else {
200258941Sdelphij			aic->max_eqd = OCE_MAX_EQD;
201258941Sdelphij			aic->min_eqd = OCE_MIN_EQD;
202258941Sdelphij			aic->et_eqd = OCE_MIN_EQD;
203258941Sdelphij			aic->enable = TRUE;
204258941Sdelphij		}
205258941Sdelphij	}
206258941Sdelphij	return 0;
207258941Sdelphij}
208258941Sdelphij
209258941Sdelphijstatic int
210231437Sluigioce_sysctl_loopback(SYSCTL_HANDLER_ARGS)
211231437Sluigi{
212231437Sluigi	int value = 0;
213231437Sluigi	uint32_t status;
214231437Sluigi	struct oce_softc *sc  = (struct oce_softc *)arg1;
215231437Sluigi
216231437Sluigi	status = sysctl_handle_int(oidp, &value, 0, req);
217231437Sluigi	if (status || !req->newptr)
218231437Sluigi		return status;
219231437Sluigi
220231437Sluigi	if (value != 1) {
221231437Sluigi		device_printf(sc->dev,
222231437Sluigi			"Not a Valid value. Set to loop_back=1 to run tests\n");
223231437Sluigi		return 0;
224231437Sluigi	}
225231437Sluigi
226231437Sluigi	if ((status = oce_loopback_test(sc, OCE_MAC_LOOPBACK))) {
227231437Sluigi		device_printf(sc->dev,
228231437Sluigi			"MAC Loopback Test = Failed (Error status = %d)\n",
229231437Sluigi			 status);
230231437Sluigi	} else
231231437Sluigi		device_printf(sc->dev, "MAC Loopback Test = Success\n");
232231437Sluigi
233231437Sluigi	if ((status = oce_loopback_test(sc, OCE_PHY_LOOPBACK))) {
234231437Sluigi		device_printf(sc->dev,
235231437Sluigi			"PHY Loopback Test = Failed (Error status = %d)\n",
236231437Sluigi			 status);
237231437Sluigi	} else
238231437Sluigi		device_printf(sc->dev, "PHY Loopback Test = Success\n");
239231437Sluigi
240231437Sluigi	if ((status = oce_loopback_test(sc, OCE_ONE_PORT_EXT_LOOPBACK))) {
241231437Sluigi		device_printf(sc->dev,
242231437Sluigi			"EXT Loopback Test = Failed (Error status = %d)\n",
243231437Sluigi			 status);
244231437Sluigi	} else
245231437Sluigi		device_printf(sc->dev, "EXT Loopback Test = Success\n");
246231437Sluigi
247231437Sluigi	return 0;
248231437Sluigi}
249231437Sluigi
250231437Sluigi
251231437Sluigistatic int
252231437Sluigioce_sys_fwupgrade(SYSCTL_HANDLER_ARGS)
253231437Sluigi{
254231437Sluigi	char ufiname[256] = {0};
255231437Sluigi	uint32_t status = 1;
256231437Sluigi	struct oce_softc *sc  = (struct oce_softc *)arg1;
257231437Sluigi	const struct firmware *fw;
258231437Sluigi
259231437Sluigi	status = sysctl_handle_string(oidp, ufiname, sizeof(ufiname), req);
260231437Sluigi	if (status || !req->newptr)
261231437Sluigi		return status;
262231437Sluigi
263231437Sluigi	fw = firmware_get(ufiname);
264231437Sluigi	if (fw == NULL) {
265231437Sluigi		device_printf(sc->dev, "Unable to get Firmware. "
266231437Sluigi			"Make sure %s is copied to /boot/modules\n", ufiname);
267231437Sluigi		return ENOENT;
268231437Sluigi	}
269231437Sluigi
270257007Sdelphij	if (IS_BE(sc)) {
271231437Sluigi		if ((sc->flags & OCE_FLAGS_BE2)) {
272231437Sluigi			device_printf(sc->dev,
273231437Sluigi				"Flashing not supported for BE2 yet.\n");
274231437Sluigi			status = 1;
275231437Sluigi			goto done;
276231437Sluigi		}
277231437Sluigi		status = oce_be3_fwupgrade(sc, fw);
278257007Sdelphij	} else if (IS_SH(sc)) {
279257007Sdelphij		status = oce_skyhawk_fwupgrade(sc,fw);
280231437Sluigi	} else
281231437Sluigi		status = oce_lancer_fwupgrade(sc, fw);
282231437Sluigidone:
283231437Sluigi	if (status) {
284231437Sluigi		device_printf(sc->dev, "Firmware Upgrade failed\n");
285231437Sluigi	} else {
286231437Sluigi		device_printf(sc->dev, "Firmware Flashed successfully\n");
287231437Sluigi	}
288231437Sluigi
289231437Sluigi	/* Release Firmware*/
290231437Sluigi	firmware_put(fw, FIRMWARE_UNLOAD);
291231437Sluigi
292231437Sluigi	return status;
293231437Sluigi}
294231437Sluigi
295257007Sdelphijstatic void oce_fill_flash_img_data(POCE_SOFTC sc, const struct flash_sec_info * fsec,
296257007Sdelphij				struct flash_img_attri *pimg, int i,
297257007Sdelphij				const struct firmware *fw, int bin_offset)
298231437Sluigi{
299257007Sdelphij	if (IS_SH(sc)) {
300257007Sdelphij		pimg->img_offset = HOST_32(fsec->fsec_entry[i].offset);
301257007Sdelphij		pimg->img_size   = HOST_32(fsec->fsec_entry[i].pad_size);
302231437Sluigi	}
303231437Sluigi
304257007Sdelphij	pimg->img_type = HOST_32(fsec->fsec_entry[i].type);
305257007Sdelphij	pimg->skip_image = FALSE;
306257007Sdelphij	switch (pimg->img_type) {
307257007Sdelphij		case IMG_ISCSI:
308257007Sdelphij			pimg->optype = 0;
309257007Sdelphij			if (IS_BE3(sc)) {
310257007Sdelphij				pimg->img_offset = 2097152;
311257007Sdelphij				pimg->img_size   = 2097152;
312257007Sdelphij			}
313231437Sluigi			break;
314257007Sdelphij		case IMG_REDBOOT:
315257007Sdelphij			pimg->optype = 1;
316257007Sdelphij			if (IS_BE3(sc)) {
317257007Sdelphij				pimg->img_offset = 262144;
318257007Sdelphij				pimg->img_size   = 1048576;
319257007Sdelphij			}
320257007Sdelphij			if (!oce_img_flashing_required(sc, fw->data,
321257007Sdelphij						pimg->optype,
322257007Sdelphij						pimg->img_offset,
323257007Sdelphij						pimg->img_size,
324257007Sdelphij						bin_offset))
325257007Sdelphij				pimg->skip_image = TRUE;
326257007Sdelphij			break;
327257007Sdelphij		case IMG_BIOS:
328257007Sdelphij			pimg->optype = 2;
329257007Sdelphij			if (IS_BE3(sc)) {
330257007Sdelphij				pimg->img_offset = 12582912;
331257007Sdelphij				pimg->img_size   = 524288;
332257007Sdelphij			}
333257007Sdelphij			break;
334257007Sdelphij		case IMG_PXEBIOS:
335257007Sdelphij			pimg->optype = 3;
336257007Sdelphij			if (IS_BE3(sc)) {
337297793Spfg				pimg->img_offset =  13107200;
338257007Sdelphij				pimg->img_size   = 524288;
339257007Sdelphij			}
340257007Sdelphij			break;
341257007Sdelphij		case IMG_FCOEBIOS:
342257007Sdelphij			pimg->optype = 8;
343257007Sdelphij			if (IS_BE3(sc)) {
344257007Sdelphij				pimg->img_offset = 13631488;
345257007Sdelphij				pimg->img_size   = 524288;
346257007Sdelphij			}
347257007Sdelphij			break;
348257007Sdelphij		case IMG_ISCSI_BAK:
349257007Sdelphij			pimg->optype = 9;
350257007Sdelphij			if (IS_BE3(sc)) {
351257007Sdelphij				pimg->img_offset = 4194304;
352257007Sdelphij				pimg->img_size   = 2097152;
353257007Sdelphij			}
354257007Sdelphij			break;
355257007Sdelphij		case IMG_FCOE:
356257007Sdelphij			pimg->optype = 10;
357257007Sdelphij			if (IS_BE3(sc)) {
358257007Sdelphij				pimg->img_offset = 6291456;
359257007Sdelphij				pimg->img_size   = 2097152;
360257007Sdelphij			}
361257007Sdelphij			break;
362257007Sdelphij		case IMG_FCOE_BAK:
363257007Sdelphij			pimg->optype = 11;
364257007Sdelphij			if (IS_BE3(sc)) {
365257007Sdelphij				pimg->img_offset = 8388608;
366257007Sdelphij				pimg->img_size   = 2097152;
367257007Sdelphij			}
368257007Sdelphij			break;
369257007Sdelphij		case IMG_NCSI:
370257007Sdelphij			pimg->optype = 13;
371257007Sdelphij			if (IS_BE3(sc)) {
372257007Sdelphij				pimg->img_offset = 15990784;
373257007Sdelphij				pimg->img_size   = 262144;
374257007Sdelphij			}
375257007Sdelphij			break;
376257007Sdelphij		case IMG_PHY:
377257007Sdelphij			pimg->optype = 99;
378257007Sdelphij			if (IS_BE3(sc)) {
379257007Sdelphij				pimg->img_offset = 1310720;
380257007Sdelphij				pimg->img_size   = 262144;
381257007Sdelphij			}
382257007Sdelphij			if (!oce_phy_flashing_required(sc))
383257007Sdelphij				pimg->skip_image = TRUE;
384257007Sdelphij			break;
385257007Sdelphij		default:
386257007Sdelphij			pimg->skip_image = TRUE;
387257007Sdelphij			break;
388231437Sluigi	}
389231437Sluigi
390231437Sluigi}
391231437Sluigi
392231437Sluigistatic int
393257007Sdelphijoce_sh_be3_flashdata(POCE_SOFTC sc, const struct firmware *fw, int32_t num_imgs)
394231437Sluigi{
395231437Sluigi	char cookie[2][16] =    {"*** SE FLAS", "H DIRECTORY *** "};
396231437Sluigi	const char *p = (const char *)fw->data;
397231437Sluigi	const struct flash_sec_info *fsec = NULL;
398231437Sluigi	struct mbx_common_read_write_flashrom *req;
399257007Sdelphij	int rc = 0, i, bin_offset = 0, opcode, num_bytes;
400231437Sluigi	OCE_DMA_MEM dma_mem;
401257007Sdelphij	struct flash_img_attri imgatt;
402231437Sluigi
403231437Sluigi	/* Validate Cookie */
404231437Sluigi	bin_offset = (sizeof(struct flash_file_hdr) +
405257007Sdelphij			(num_imgs * sizeof(struct image_hdr)));
406231437Sluigi	p += bin_offset;
407231437Sluigi	while (p < ((const char *)fw->data + fw->datasize)) {
408231437Sluigi		fsec = (const struct flash_sec_info *)p;
409231437Sluigi		if (!memcmp(cookie, fsec->cookie, sizeof(cookie)))
410231437Sluigi			break;
411231437Sluigi		fsec = NULL;
412231437Sluigi		p += 32;
413231437Sluigi	}
414231437Sluigi
415231437Sluigi	if (!fsec) {
416231437Sluigi		device_printf(sc->dev,
417257007Sdelphij				"Invalid Cookie. Firmware image corrupted ?\n");
418231437Sluigi		return EINVAL;
419231437Sluigi	}
420231437Sluigi
421258140Sdelphij	rc = oce_dma_alloc(sc, sizeof(struct mbx_common_read_write_flashrom),
422258140Sdelphij				&dma_mem, 0);
423231437Sluigi	if (rc) {
424231437Sluigi		device_printf(sc->dev,
425257007Sdelphij				"Memory allocation failure while flashing\n");
426231437Sluigi		return ENOMEM;
427231437Sluigi	}
428231437Sluigi	req = OCE_DMAPTR(&dma_mem, struct mbx_common_read_write_flashrom);
429231437Sluigi
430257007Sdelphij	if (IS_SH(sc))
431257007Sdelphij		num_imgs = HOST_32(fsec->fsec_hdr.num_images);
432257007Sdelphij	else if (IS_BE3(sc))
433257007Sdelphij		num_imgs = MAX_FLASH_COMP;
434231437Sluigi
435257007Sdelphij	for (i = 0; i < num_imgs; i++) {
436257007Sdelphij
437257007Sdelphij		bzero(&imgatt, sizeof(struct flash_img_attri));
438257007Sdelphij
439257007Sdelphij		oce_fill_flash_img_data(sc, fsec, &imgatt, i, fw, bin_offset);
440257007Sdelphij
441257007Sdelphij		if (imgatt.skip_image)
442231437Sluigi			continue;
443231437Sluigi
444231437Sluigi		p = fw->data;
445257007Sdelphij		p = p + bin_offset + imgatt.img_offset;
446257007Sdelphij
447257007Sdelphij		if ((p + imgatt.img_size) > ((const char *)fw->data + fw->datasize)) {
448231437Sluigi			rc = 1;
449231437Sluigi			goto ret;
450231437Sluigi		}
451231437Sluigi
452257007Sdelphij		while (imgatt.img_size) {
453231437Sluigi
454257007Sdelphij			if (imgatt.img_size > 32*1024)
455231437Sluigi				num_bytes = 32*1024;
456231437Sluigi			else
457257007Sdelphij				num_bytes = imgatt.img_size;
458257007Sdelphij			imgatt.img_size -= num_bytes;
459231437Sluigi
460257007Sdelphij			if (!imgatt.img_size)
461231437Sluigi				opcode = FLASHROM_OPER_FLASH;
462231437Sluigi			else
463231437Sluigi				opcode = FLASHROM_OPER_SAVE;
464231437Sluigi
465231437Sluigi			memcpy(req->data_buffer, p, num_bytes);
466231437Sluigi			p += num_bytes;
467231437Sluigi
468257007Sdelphij			rc = oce_mbox_write_flashrom(sc, imgatt.optype, opcode,
469257007Sdelphij					&dma_mem, num_bytes);
470231437Sluigi			if (rc) {
471231437Sluigi				device_printf(sc->dev,
472257007Sdelphij						"cmd to write to flash rom failed.\n");
473231437Sluigi				rc = EIO;
474231437Sluigi				goto ret;
475231437Sluigi			}
476231437Sluigi			/* Leave the CPU for others for some time */
477231437Sluigi			pause("yield", 10);
478231437Sluigi
479231437Sluigi		}
480257007Sdelphij
481231437Sluigi	}
482257007Sdelphij
483231437Sluigiret:
484231437Sluigi	oce_dma_free(sc, &dma_mem);
485231437Sluigi	return rc;
486257007Sdelphij}
487231437Sluigi
488338938Sjpaetzel#define UFI_TYPE2               2
489338938Sjpaetzel#define UFI_TYPE3               3
490338938Sjpaetzel#define UFI_TYPE3R              10
491338938Sjpaetzel#define UFI_TYPE4               4
492338938Sjpaetzel#define UFI_TYPE4R              11
493257007Sdelphijstatic int oce_get_ufi_type(POCE_SOFTC sc,
494338938Sjpaetzel                           const struct flash_file_hdr *fhdr)
495257007Sdelphij{
496338938Sjpaetzel        if (fhdr == NULL)
497338938Sjpaetzel                goto be_get_ufi_exit;
498257007Sdelphij
499338938Sjpaetzel        if (IS_SH(sc) && fhdr->build[0] == '4') {
500338938Sjpaetzel                if (fhdr->asic_type_rev >= 0x10)
501338938Sjpaetzel                        return UFI_TYPE4R;
502338938Sjpaetzel                else
503338938Sjpaetzel                        return UFI_TYPE4;
504338938Sjpaetzel        } else if (IS_BE3(sc) && fhdr->build[0] == '3') {
505338938Sjpaetzel                if (fhdr->asic_type_rev == 0x10)
506338938Sjpaetzel                        return UFI_TYPE3R;
507338938Sjpaetzel                else
508338938Sjpaetzel                        return UFI_TYPE3;
509338938Sjpaetzel        } else if (IS_BE2(sc) && fhdr->build[0] == '2')
510338938Sjpaetzel                return UFI_TYPE2;
511257007Sdelphij
512257007Sdelphijbe_get_ufi_exit:
513338938Sjpaetzel        device_printf(sc->dev,
514338938Sjpaetzel                "UFI and Interface are not compatible for flashing\n");
515338938Sjpaetzel        return -1;
516231437Sluigi}
517231437Sluigi
518231437Sluigi
519257007Sdelphijstatic int
520257007Sdelphijoce_skyhawk_fwupgrade(POCE_SOFTC sc, const struct firmware *fw)
521257007Sdelphij{
522257007Sdelphij	int rc = 0, num_imgs = 0, i = 0, ufi_type;
523257007Sdelphij	const struct flash_file_hdr *fhdr;
524257007Sdelphij	const struct image_hdr *img_ptr;
525257007Sdelphij
526257007Sdelphij	fhdr = (const struct flash_file_hdr *)fw->data;
527257007Sdelphij
528257007Sdelphij	ufi_type = oce_get_ufi_type(sc, fhdr);
529257007Sdelphij
530257007Sdelphij	/* Display flash version */
531257007Sdelphij	device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]);
532257007Sdelphij
533257007Sdelphij	num_imgs = fhdr->num_imgs;
534257007Sdelphij	for (i = 0; i < num_imgs; i++) {
535257007Sdelphij		img_ptr = (const struct image_hdr *)((const char *)fw->data +
536257007Sdelphij				sizeof(struct flash_file_hdr) +
537257007Sdelphij				(i * sizeof(struct image_hdr)));
538257007Sdelphij
539257007Sdelphij		if (img_ptr->imageid != 1)
540257007Sdelphij			continue;
541257007Sdelphij
542257007Sdelphij		switch (ufi_type) {
543257007Sdelphij			case UFI_TYPE4R:
544257007Sdelphij				rc = oce_sh_be3_flashdata(sc, fw,
545257007Sdelphij						num_imgs);
546257007Sdelphij				break;
547257007Sdelphij			case UFI_TYPE4:
548257007Sdelphij				if (sc->asic_revision < 0x10)
549257007Sdelphij					rc = oce_sh_be3_flashdata(sc, fw,
550257007Sdelphij								   num_imgs);
551257007Sdelphij				else {
552257007Sdelphij					rc = -1;
553257007Sdelphij					device_printf(sc->dev,
554257007Sdelphij						"Cant load SH A0 UFI on B0\n");
555257007Sdelphij				}
556257007Sdelphij				break;
557257007Sdelphij			default:
558257007Sdelphij				rc = -1;
559257007Sdelphij				break;
560257007Sdelphij
561257007Sdelphij		}
562257007Sdelphij	}
563257007Sdelphij
564257007Sdelphij	return rc;
565257007Sdelphij}
566257007Sdelphij
567257007Sdelphijstatic int
568257007Sdelphijoce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw)
569257007Sdelphij{
570257007Sdelphij	int rc = 0, num_imgs = 0, i = 0;
571257007Sdelphij	const struct flash_file_hdr *fhdr;
572257007Sdelphij	const struct image_hdr *img_ptr;
573257007Sdelphij
574257007Sdelphij	fhdr = (const struct flash_file_hdr *)fw->data;
575257007Sdelphij	if (fhdr->build[0] != '3') {
576257007Sdelphij		device_printf(sc->dev, "Invalid BE3 firmware image\n");
577257007Sdelphij		return EINVAL;
578257007Sdelphij	}
579257007Sdelphij	/* Display flash version */
580257007Sdelphij	device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]);
581257007Sdelphij
582257007Sdelphij	num_imgs = fhdr->num_imgs;
583257007Sdelphij	for (i = 0; i < num_imgs; i++) {
584257007Sdelphij		img_ptr = (const struct image_hdr *)((const char *)fw->data +
585257007Sdelphij				sizeof(struct flash_file_hdr) +
586257007Sdelphij				(i * sizeof(struct image_hdr)));
587257007Sdelphij		if (img_ptr->imageid == 1) {
588257007Sdelphij			rc = oce_sh_be3_flashdata(sc, fw, num_imgs);
589257007Sdelphij
590257007Sdelphij			break;
591257007Sdelphij		}
592257007Sdelphij	}
593257007Sdelphij
594257007Sdelphij	return rc;
595257007Sdelphij}
596257007Sdelphij
597257007Sdelphij
598231437Sluigistatic boolean_t
599231437Sluigioce_phy_flashing_required(POCE_SOFTC sc)
600231437Sluigi{
601231437Sluigi	int status = 0;
602231437Sluigi	struct oce_phy_info phy_info;
603231437Sluigi
604231437Sluigi	status = oce_mbox_get_phy_info(sc, &phy_info);
605231437Sluigi	if (status)
606231437Sluigi		return FALSE;
607231437Sluigi
608231437Sluigi	if ((phy_info.phy_type == TN_8022) &&
609231437Sluigi		(phy_info.interface_type == PHY_TYPE_BASET_10GB)) {
610231437Sluigi		return TRUE;
611231437Sluigi	}
612231437Sluigi
613231437Sluigi	return FALSE;
614231437Sluigi}
615231437Sluigi
616231437Sluigi
617231437Sluigistatic boolean_t
618231437Sluigioce_img_flashing_required(POCE_SOFTC sc, const char *p,
619231437Sluigi				int img_optype, uint32_t img_offset,
620231437Sluigi				uint32_t img_size, uint32_t hdrs_size)
621231437Sluigi{
622231437Sluigi	uint32_t crc_offset;
623231437Sluigi	uint8_t flashed_crc[4];
624231437Sluigi	int status;
625231437Sluigi
626231437Sluigi	crc_offset = hdrs_size + img_offset + img_size - 4;
627231437Sluigi
628231437Sluigi	p += crc_offset;
629231437Sluigi
630231437Sluigi	status = oce_mbox_get_flashrom_crc(sc, flashed_crc,
631231437Sluigi			(img_size - 4), img_optype);
632231437Sluigi	if (status)
633231437Sluigi		return TRUE; /* Some thing worng. ReFlash */
634231437Sluigi
635231437Sluigi	/*update redboot only if crc does not match*/
636231437Sluigi	if (bcmp(flashed_crc, p, 4))
637231437Sluigi		return TRUE;
638231437Sluigi	else
639231437Sluigi		return FALSE;
640231437Sluigi}
641231437Sluigi
642231437Sluigi
643231437Sluigistatic int
644231437Sluigioce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw)
645231437Sluigi{
646231437Sluigi
647231437Sluigi	int rc = 0;
648231437Sluigi	OCE_DMA_MEM dma_mem;
649231437Sluigi	const uint8_t *data = NULL;
650231437Sluigi	uint8_t *dest_image_ptr = NULL;
651231437Sluigi	size_t size = 0;
652231437Sluigi	uint32_t data_written = 0, chunk_size = 0;
653231437Sluigi	uint32_t offset = 0, add_status = 0;
654231437Sluigi
655231437Sluigi	if (!IS_ALIGNED(fw->datasize, sizeof(uint32_t))) {
656231437Sluigi		device_printf(sc->dev,
657231437Sluigi			"Lancer FW image is not 4 byte aligned.");
658231437Sluigi		return EINVAL;
659231437Sluigi	}
660231437Sluigi
661231437Sluigi	rc = oce_dma_alloc(sc, 32*1024, &dma_mem, 0);
662231437Sluigi	if (rc) {
663231437Sluigi		device_printf(sc->dev,
664231437Sluigi			"Memory allocation failure while flashing Lancer\n");
665231437Sluigi		return ENOMEM;
666231437Sluigi	}
667231437Sluigi
668231437Sluigi	size = fw->datasize;
669231437Sluigi	data = fw->data;
670231437Sluigi	dest_image_ptr = OCE_DMAPTR(&dma_mem, uint8_t);
671231437Sluigi
672231437Sluigi	while (size) {
673231437Sluigi		chunk_size = MIN(size, (32*1024));
674231437Sluigi
675231437Sluigi		bcopy(data, dest_image_ptr, chunk_size);
676231437Sluigi
677231437Sluigi		rc = oce_mbox_lancer_write_flashrom(sc, chunk_size, offset,
678231437Sluigi				&dma_mem, &data_written, &add_status);
679231437Sluigi
680231437Sluigi		if (rc)
681231437Sluigi			break;
682231437Sluigi
683231437Sluigi		size	-= data_written;
684231437Sluigi		data	+= data_written;
685231437Sluigi		offset	+= data_written;
686231437Sluigi		pause("yield", 10);
687231437Sluigi
688231437Sluigi	}
689231437Sluigi
690231437Sluigi	if (!rc)
691231437Sluigi		/* Commit the firmware*/
692231437Sluigi		rc = oce_mbox_lancer_write_flashrom(sc, 0, offset, &dma_mem,
693231437Sluigi						&data_written, &add_status);
694231437Sluigi	if (rc) {
695231437Sluigi		device_printf(sc->dev, "Lancer firmware load error. "
696231437Sluigi			"Addstatus = 0x%x, status = %d \n", add_status, rc);
697231437Sluigi		rc = EIO;
698231437Sluigi	}
699231437Sluigi	oce_dma_free(sc, &dma_mem);
700231437Sluigi	return rc;
701231437Sluigi
702231437Sluigi}
703231437Sluigi
704231437Sluigi
705231437Sluigistatic void
706231437Sluigioce_add_stats_sysctls_be3(POCE_SOFTC sc,
707231437Sluigi				  struct sysctl_ctx_list *ctx,
708231437Sluigi				  struct sysctl_oid *stats_node)
709231437Sluigi{
710231437Sluigi	struct sysctl_oid *rx_stats_node, *tx_stats_node;
711231437Sluigi	struct sysctl_oid_list *rx_stat_list, *tx_stat_list;
712231437Sluigi	struct sysctl_oid_list *queue_stats_list;
713231437Sluigi	struct sysctl_oid *queue_stats_node;
714231437Sluigi	struct oce_drv_stats *stats;
715231437Sluigi	char prefix[32];
716231437Sluigi	int i;
717231437Sluigi
718231437Sluigi	stats = &sc->oce_stats_info;
719231437Sluigi
720231437Sluigi	rx_stats_node = SYSCTL_ADD_NODE(ctx,
721231437Sluigi					SYSCTL_CHILDREN(stats_node),
722231437Sluigi					OID_AUTO,"rx", CTLFLAG_RD,
723231437Sluigi					NULL, "RX Ethernet Statistics");
724231437Sluigi	rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
725231437Sluigi
726231437Sluigi
727231437Sluigi	SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts",
728231437Sluigi			CTLFLAG_RD, &stats->rx.t_rx_pkts,
729231437Sluigi			"Total Received Packets");
730231437Sluigi	SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes",
731231437Sluigi			CTLFLAG_RD, &stats->rx.t_rx_bytes,
732231437Sluigi			"Total Received Bytes");
733231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags",
734231437Sluigi			CTLFLAG_RD, &stats->rx.t_rx_frags, 0,
735231437Sluigi			"Total Received Fragements");
736231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts",
737231437Sluigi			CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0,
738231437Sluigi			"Total Received Multicast Packets");
739231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts",
740231437Sluigi			CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0,
741231437Sluigi			"Total Received Unicast Packets");
742231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs",
743231437Sluigi			CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0,
744231437Sluigi			"Total Receive completion errors");
745231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames",
746231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_pause_frames, 0,
747231437Sluigi			"Pause Frames");
748231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "priority_pause_frames",
749231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_priority_pause_frames, 0,
750231437Sluigi			"Priority Pause Frames");
751231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames",
752231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_control_frames, 0,
753231437Sluigi			"Control Frames");
754231437Sluigi
755231437Sluigi	for (i = 0; i < sc->nrqs; i++) {
756231437Sluigi		sprintf(prefix, "queue%d",i);
757231437Sluigi		queue_stats_node = SYSCTL_ADD_NODE(ctx,
758231437Sluigi						SYSCTL_CHILDREN(rx_stats_node),
759231437Sluigi						OID_AUTO, prefix, CTLFLAG_RD,
760231437Sluigi						NULL, "Queue name");
761231437Sluigi		queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
762231437Sluigi
763231437Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts",
764231437Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts,
765231437Sluigi			"Receive Packets");
766231437Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes",
767231437Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes,
768231437Sluigi			"Recived Bytes");
769231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags",
770231437Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0,
771231437Sluigi			"Received Fragments");
772231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
773231437Sluigi				"rx_mcast_pkts", CTLFLAG_RD,
774231437Sluigi				&sc->rq[i]->rx_stats.rx_mcast_pkts, 0,
775231437Sluigi					"Received Multicast Packets");
776231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
777231437Sluigi				"rx_ucast_pkts", CTLFLAG_RD,
778231437Sluigi				&sc->rq[i]->rx_stats.rx_ucast_pkts, 0,
779231437Sluigi					"Received Unicast Packets");
780231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err",
781231437Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0,
782231437Sluigi			"Received Completion Errors");
783338938Sjpaetzel		if(IS_SH(sc)) {
784338938Sjpaetzel			SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_drops_no_frags",
785338938Sjpaetzel                        	CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_drops_no_frags, 0,
786338938Sjpaetzel                        	"num of packet drops due to no fragments");
787338938Sjpaetzel		}
788231437Sluigi	}
789231437Sluigi
790231437Sluigi	rx_stats_node = SYSCTL_ADD_NODE(ctx,
791231437Sluigi					SYSCTL_CHILDREN(rx_stats_node),
792231437Sluigi					OID_AUTO, "err", CTLFLAG_RD,
793231437Sluigi					NULL, "Receive Error Stats");
794231437Sluigi	rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
795231437Sluigi
796231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs",
797231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_crc_errors, 0,
798231437Sluigi			"CRC Errors");
799231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pbuf_errors",
800231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_drops_no_pbuf, 0,
801231437Sluigi			"Drops due to pbuf full");
802231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "erx_errors",
803231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_drops_no_erx_descr, 0,
804231437Sluigi			"ERX Errors");
805231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors",
806231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_drops_too_many_frags, 0,
807231437Sluigi			"RX Alignmnet Errors");
808231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors",
809231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_in_range_errors, 0,
810231437Sluigi			"In Range Errors");
811231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors",
812231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_out_range_errors, 0,
813231437Sluigi			"Out Range Errors");
814231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long",
815231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_frame_too_long, 0,
816231437Sluigi			"Frame Too Long");
817231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors",
818231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_address_match_errors, 0,
819231437Sluigi			"Address Match Errors");
820231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small",
821231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_dropped_too_small, 0,
822231437Sluigi			"Dropped Too Small");
823231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short",
824231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_dropped_too_short, 0,
825231437Sluigi			"Dropped Too Short");
826231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
827231437Sluigi			"dropped_header_too_small", CTLFLAG_RD,
828231437Sluigi			&stats->u0.be.rx_dropped_header_too_small, 0,
829231437Sluigi			"Dropped Header Too Small");
830231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_tcp_length",
831231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_dropped_tcp_length, 0,
832231437Sluigi			"Dropped TCP Length");
833231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt",
834231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_dropped_runt, 0,
835231437Sluigi			"Dropped runt");
836231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs",
837231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_ip_checksum_errs, 0,
838231437Sluigi			"IP Checksum Errors");
839231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs",
840231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_tcp_checksum_errs, 0,
841231437Sluigi			"TCP Checksum Errors");
842231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs",
843231437Sluigi			CTLFLAG_RD, &stats->u0.be.rx_udp_checksum_errs, 0,
844231437Sluigi			"UDP Checksum Errors");
845231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "fifo_overflow_drop",
846231437Sluigi			CTLFLAG_RD, &stats->u0.be.rxpp_fifo_overflow_drop, 0,
847231437Sluigi			"FIFO Overflow Drop");
848231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
849231437Sluigi			"input_fifo_overflow_drop", CTLFLAG_RD,
850231437Sluigi			&stats->u0.be.rx_input_fifo_overflow_drop, 0,
851231437Sluigi			"Input FIFO Overflow Drop");
852231437Sluigi
853231437Sluigi	tx_stats_node = SYSCTL_ADD_NODE(ctx,
854231437Sluigi					SYSCTL_CHILDREN(stats_node), OID_AUTO,
855231437Sluigi					"tx",CTLFLAG_RD, NULL,
856231437Sluigi					"TX Ethernet Statistics");
857231437Sluigi	tx_stat_list = SYSCTL_CHILDREN(tx_stats_node);
858231437Sluigi
859231437Sluigi	SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts",
860231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_pkts,
861231437Sluigi			"Total Transmit Packets");
862231437Sluigi	SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes",
863231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_bytes,
864231437Sluigi			"Total Transmit Bytes");
865231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs",
866231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_reqs, 0,
867231437Sluigi			"Total Transmit Requests");
868231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops",
869231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_stops, 0,
870231437Sluigi			"Total Transmit Stops");
871231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs",
872231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0,
873231437Sluigi			"Total Transmit WRB's");
874231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl",
875231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_compl, 0,
876231437Sluigi			"Total Transmit Completions");
877231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO,
878231437Sluigi			"total_ipv6_ext_hdr_tx_drop", CTLFLAG_RD,
879231437Sluigi			&stats->tx.t_ipv6_ext_hdr_tx_drop, 0,
880231437Sluigi			"Total Transmit IPV6 Drops");
881231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes",
882231437Sluigi			CTLFLAG_RD, &stats->u0.be.tx_pauseframes, 0,
883231437Sluigi			"Pause Frames");
884231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "priority_pauseframes",
885231437Sluigi			CTLFLAG_RD, &stats->u0.be.tx_priority_pauseframes, 0,
886231437Sluigi			"Priority Pauseframes");
887231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes",
888231437Sluigi			CTLFLAG_RD, &stats->u0.be.tx_controlframes, 0,
889231437Sluigi			"Tx Control Frames");
890231437Sluigi
891231437Sluigi	for (i = 0; i < sc->nwqs; i++) {
892231437Sluigi		sprintf(prefix, "queue%d",i);
893231437Sluigi		queue_stats_node = SYSCTL_ADD_NODE(ctx,
894231437Sluigi						SYSCTL_CHILDREN(tx_stats_node),
895231437Sluigi						OID_AUTO, prefix, CTLFLAG_RD,
896231437Sluigi						NULL, "Queue name");
897231437Sluigi		queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
898231437Sluigi
899231437Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts",
900231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts,
901231437Sluigi			"Transmit Packets");
902231437Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes",
903231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes,
904231437Sluigi			"Transmit Bytes");
905231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs",
906231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0,
907231437Sluigi			"Transmit Requests");
908231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops",
909231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0,
910231437Sluigi			"Transmit Stops");
911231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs",
912231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0,
913231437Sluigi			"Transmit WRB's");
914231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl",
915231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0,
916231437Sluigi			"Transmit Completions");
917231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
918231437Sluigi			"ipv6_ext_hdr_tx_drop",CTLFLAG_RD,
919231437Sluigi			&sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0,
920231437Sluigi			"Transmit IPV6 Ext Header Drop");
921231437Sluigi
922231437Sluigi	}
923231437Sluigi	return;
924231437Sluigi}
925231437Sluigi
926231437Sluigi
927231437Sluigistatic void
928231437Sluigioce_add_stats_sysctls_xe201(POCE_SOFTC sc,
929231437Sluigi				  struct sysctl_ctx_list *ctx,
930231437Sluigi				  struct sysctl_oid *stats_node)
931231437Sluigi{
932231437Sluigi	struct sysctl_oid *rx_stats_node, *tx_stats_node;
933231437Sluigi	struct sysctl_oid_list *rx_stat_list, *tx_stat_list;
934231437Sluigi	struct sysctl_oid_list *queue_stats_list;
935231437Sluigi	struct sysctl_oid *queue_stats_node;
936231437Sluigi	struct oce_drv_stats *stats;
937231437Sluigi	char prefix[32];
938231437Sluigi	int i;
939231437Sluigi
940231437Sluigi	stats = &sc->oce_stats_info;
941231437Sluigi
942231437Sluigi	rx_stats_node = SYSCTL_ADD_NODE(ctx,
943231437Sluigi					SYSCTL_CHILDREN(stats_node),
944231437Sluigi					OID_AUTO, "rx", CTLFLAG_RD,
945231437Sluigi					NULL, "RX Ethernet Statistics");
946231437Sluigi	rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
947231437Sluigi
948231437Sluigi
949231437Sluigi	SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts",
950231437Sluigi			CTLFLAG_RD, &stats->rx.t_rx_pkts,
951231437Sluigi			"Total Received Packets");
952231437Sluigi	SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes",
953231437Sluigi			CTLFLAG_RD, &stats->rx.t_rx_bytes,
954231437Sluigi			"Total Received Bytes");
955231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags",
956231437Sluigi			CTLFLAG_RD, &stats->rx.t_rx_frags, 0,
957231437Sluigi			"Total Received Fragements");
958231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts",
959231437Sluigi			CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0,
960231437Sluigi			"Total Received Multicast Packets");
961231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts",
962231437Sluigi			CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0,
963231437Sluigi			"Total Received Unicast Packets");
964231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs",
965231437Sluigi			CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0,
966231437Sluigi			"Total Receive completion errors");
967273377Shselasky	SYSCTL_ADD_UQUAD(ctx, rx_stat_list, OID_AUTO, "pause_frames",
968273377Shselasky			CTLFLAG_RD, &stats->u0.xe201.rx_pause_frames,
969231437Sluigi			"Pause Frames");
970273377Shselasky	SYSCTL_ADD_UQUAD(ctx, rx_stat_list, OID_AUTO, "control_frames",
971273377Shselasky			CTLFLAG_RD, &stats->u0.xe201.rx_control_frames,
972231437Sluigi			"Control Frames");
973231437Sluigi
974231437Sluigi	for (i = 0; i < sc->nrqs; i++) {
975231437Sluigi		sprintf(prefix, "queue%d",i);
976231437Sluigi		queue_stats_node = SYSCTL_ADD_NODE(ctx,
977231437Sluigi						SYSCTL_CHILDREN(rx_stats_node),
978231437Sluigi						OID_AUTO, prefix, CTLFLAG_RD,
979231437Sluigi						NULL, "Queue name");
980231437Sluigi		queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
981231437Sluigi
982231437Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts",
983231437Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts,
984231437Sluigi			"Receive Packets");
985231437Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes",
986231437Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes,
987231437Sluigi			"Recived Bytes");
988231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags",
989231437Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0,
990231437Sluigi			"Received Fragments");
991231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
992231437Sluigi			"rx_mcast_pkts", CTLFLAG_RD,
993231437Sluigi			&sc->rq[i]->rx_stats.rx_mcast_pkts, 0,
994231437Sluigi			"Received Multicast Packets");
995231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
996231437Sluigi			"rx_ucast_pkts",CTLFLAG_RD,
997231437Sluigi			&sc->rq[i]->rx_stats.rx_ucast_pkts, 0,
998231437Sluigi			"Received Unicast Packets");
999231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err",
1000231437Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0,
1001231437Sluigi			"Received Completion Errors");
1002231437Sluigi
1003231437Sluigi	}
1004231437Sluigi
1005231437Sluigi	rx_stats_node = SYSCTL_ADD_NODE(ctx,
1006231437Sluigi					SYSCTL_CHILDREN(rx_stats_node),
1007231437Sluigi					OID_AUTO, "err", CTLFLAG_RD,
1008231437Sluigi					NULL, "Receive Error Stats");
1009231437Sluigi	rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
1010231437Sluigi
1011273377Shselasky	SYSCTL_ADD_UQUAD(ctx, rx_stat_list, OID_AUTO, "crc_errs",
1012273377Shselasky			CTLFLAG_RD, &stats->u0.xe201.rx_crc_errors,
1013231437Sluigi			"CRC Errors");
1014273377Shselasky	SYSCTL_ADD_UQUAD(ctx, rx_stat_list, OID_AUTO, "alignment_errors",
1015273377Shselasky			CTLFLAG_RD, &stats->u0.xe201.rx_alignment_errors,
1016231437Sluigi			"RX Alignmnet Errors");
1017231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors",
1018231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_in_range_errors, 0,
1019231437Sluigi			"In Range Errors");
1020231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors",
1021231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_out_of_range_errors, 0,
1022231437Sluigi			"Out Range Errors");
1023273377Shselasky	SYSCTL_ADD_UQUAD(ctx, rx_stat_list, OID_AUTO, "frame_too_long",
1024273377Shselasky			CTLFLAG_RD, &stats->u0.xe201.rx_frames_too_long,
1025231437Sluigi			"Frame Too Long");
1026231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors",
1027231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_address_match_errors, 0,
1028231437Sluigi			"Address Match Errors");
1029231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small",
1030231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_small, 0,
1031231437Sluigi			"Dropped Too Small");
1032231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short",
1033231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_short, 0,
1034231437Sluigi			"Dropped Too Short");
1035231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
1036231437Sluigi			"dropped_header_too_small", CTLFLAG_RD,
1037231437Sluigi			&stats->u0.xe201.rx_dropped_header_too_small, 0,
1038231437Sluigi			"Dropped Header Too Small");
1039231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
1040231437Sluigi			"dropped_tcp_length", CTLFLAG_RD,
1041231437Sluigi			&stats->u0.xe201.rx_dropped_invalid_tcp_length, 0,
1042231437Sluigi			"Dropped TCP Length");
1043231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt",
1044231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_dropped_runt, 0,
1045231437Sluigi			"Dropped runt");
1046231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs",
1047231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_ip_checksum_errors, 0,
1048231437Sluigi			"IP Checksum Errors");
1049231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs",
1050231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_tcp_checksum_errors, 0,
1051231437Sluigi			"TCP Checksum Errors");
1052231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs",
1053231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_udp_checksum_errors, 0,
1054231437Sluigi			"UDP Checksum Errors");
1055231437Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "input_fifo_overflow_drop",
1056231437Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_fifo_overflow, 0,
1057231437Sluigi			"Input FIFO Overflow Drop");
1058231437Sluigi
1059231437Sluigi	tx_stats_node = SYSCTL_ADD_NODE(ctx,
1060231437Sluigi					SYSCTL_CHILDREN(stats_node),
1061231437Sluigi					OID_AUTO, "tx", CTLFLAG_RD,
1062231437Sluigi					NULL, "TX Ethernet Statistics");
1063231437Sluigi	tx_stat_list = SYSCTL_CHILDREN(tx_stats_node);
1064231437Sluigi
1065231437Sluigi	SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts",
1066231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_pkts,
1067231437Sluigi			"Total Transmit Packets");
1068231437Sluigi	SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes",
1069231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_bytes,
1070231437Sluigi			"Total Transmit Bytes");
1071231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs",
1072231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_reqs, 0,
1073231437Sluigi			"Total Transmit Requests");
1074231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops",
1075231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_stops, 0,
1076231437Sluigi			"Total Transmit Stops");
1077231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs",
1078231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0,
1079231437Sluigi			"Total Transmit WRB's");
1080231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl",
1081231437Sluigi			CTLFLAG_RD, &stats->tx.t_tx_compl, 0,
1082231437Sluigi			"Total Transmit Completions");
1083231437Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO,
1084231437Sluigi			"total_ipv6_ext_hdr_tx_drop",
1085231437Sluigi			CTLFLAG_RD, &stats->tx.t_ipv6_ext_hdr_tx_drop, 0,
1086231437Sluigi			"Total Transmit IPV6 Drops");
1087273377Shselasky	SYSCTL_ADD_UQUAD(ctx, tx_stat_list, OID_AUTO, "pauseframes",
1088273377Shselasky			CTLFLAG_RD, &stats->u0.xe201.tx_pause_frames,
1089231437Sluigi			"Pause Frames");
1090273377Shselasky	SYSCTL_ADD_UQUAD(ctx, tx_stat_list, OID_AUTO, "controlframes",
1091273377Shselasky			CTLFLAG_RD, &stats->u0.xe201.tx_control_frames,
1092231437Sluigi			"Tx Control Frames");
1093231437Sluigi
1094231437Sluigi	for (i = 0; i < sc->nwqs; i++) {
1095231437Sluigi		sprintf(prefix, "queue%d",i);
1096231437Sluigi		queue_stats_node = SYSCTL_ADD_NODE(ctx,
1097231437Sluigi						SYSCTL_CHILDREN(tx_stats_node),
1098231437Sluigi						OID_AUTO, prefix, CTLFLAG_RD,
1099231437Sluigi						NULL, "Queue name");
1100231437Sluigi		queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
1101231437Sluigi
1102231437Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts",
1103231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts,
1104231437Sluigi			"Transmit Packets");
1105231437Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes",
1106231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes,
1107231437Sluigi			"Transmit Bytes");
1108231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs",
1109231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0,
1110231437Sluigi			"Transmit Requests");
1111231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops",
1112231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0,
1113231437Sluigi			"Transmit Stops");
1114231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs",
1115231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0,
1116231437Sluigi			"Transmit WRB's");
1117231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl",
1118231437Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0,
1119231437Sluigi			"Transmit Completions");
1120231437Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
1121231437Sluigi			"ipv6_ext_hdr_tx_drop", CTLFLAG_RD,
1122231437Sluigi			&sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0,
1123231437Sluigi			"Transmit IPV6 Ext Header Drop");
1124231437Sluigi
1125231437Sluigi	}
1126231437Sluigi	return;
1127231437Sluigi}
1128231437Sluigi
1129231437Sluigi
1130231437Sluigivoid
1131231437Sluigioce_refresh_queue_stats(POCE_SOFTC sc)
1132231437Sluigi{
1133231437Sluigi	struct oce_drv_stats *adapter_stats;
1134231437Sluigi	int i;
1135231437Sluigi
1136231437Sluigi	adapter_stats = &sc->oce_stats_info;
1137231437Sluigi
1138231437Sluigi	/* Caluculate total TX and TXstats from all queues */
1139231437Sluigi
1140231437Sluigi	bzero(&adapter_stats->rx, sizeof(struct oce_rx_stats));
1141231437Sluigi	for (i = 0; i < sc->nrqs; i++) {
1142231437Sluigi
1143231437Sluigi		adapter_stats->rx.t_rx_pkts += sc->rq[i]->rx_stats.rx_pkts;
1144231437Sluigi		adapter_stats->rx.t_rx_bytes += sc->rq[i]->rx_stats.rx_bytes;
1145231437Sluigi		adapter_stats->rx.t_rx_frags += sc->rq[i]->rx_stats.rx_frags;
1146231437Sluigi		adapter_stats->rx.t_rx_mcast_pkts +=
1147231437Sluigi					sc->rq[i]->rx_stats.rx_mcast_pkts;
1148231437Sluigi		adapter_stats->rx.t_rx_ucast_pkts +=
1149231437Sluigi					sc->rq[i]->rx_stats.rx_ucast_pkts;
1150231437Sluigi		adapter_stats->rx.t_rxcp_errs += sc-> rq[i]->rx_stats.rxcp_err;
1151231437Sluigi	}
1152231437Sluigi
1153231437Sluigi	bzero(&adapter_stats->tx, sizeof(struct oce_tx_stats));
1154231437Sluigi	for (i = 0; i < sc->nwqs; i++) {
1155231437Sluigi		adapter_stats->tx.t_tx_reqs += sc->wq[i]->tx_stats.tx_reqs;
1156231437Sluigi		adapter_stats->tx.t_tx_stops += sc->wq[i]->tx_stats.tx_stops;
1157231437Sluigi		adapter_stats->tx.t_tx_wrbs += sc->wq[i]->tx_stats.tx_wrbs;
1158231437Sluigi		adapter_stats->tx.t_tx_compl += sc->wq[i]->tx_stats.tx_compl;
1159231437Sluigi		adapter_stats->tx.t_tx_bytes += sc->wq[i]->tx_stats.tx_bytes;
1160231437Sluigi		adapter_stats->tx.t_tx_pkts += sc->wq[i]->tx_stats.tx_pkts;
1161231437Sluigi		adapter_stats->tx.t_ipv6_ext_hdr_tx_drop +=
1162231437Sluigi				sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop;
1163231437Sluigi	}
1164231437Sluigi
1165231437Sluigi}
1166231437Sluigi
1167231437Sluigi
1168231437Sluigi
1169231437Sluigistatic void
1170231437Sluigicopy_stats_to_sc_xe201(POCE_SOFTC sc)
1171231437Sluigi{
1172231437Sluigi	struct oce_xe201_stats *adapter_stats;
1173231437Sluigi	struct mbx_get_pport_stats *nic_mbx;
1174231437Sluigi	struct pport_stats *port_stats;
1175231437Sluigi
1176231437Sluigi	nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_pport_stats);
1177231437Sluigi	port_stats = &nic_mbx->params.rsp.pps;
1178231437Sluigi	adapter_stats = &sc->oce_stats_info.u0.xe201;
1179231437Sluigi
1180231437Sluigi	adapter_stats->tx_pkts = port_stats->tx_pkts;
1181231437Sluigi	adapter_stats->tx_unicast_pkts = port_stats->tx_unicast_pkts;
1182231437Sluigi	adapter_stats->tx_multicast_pkts = port_stats->tx_multicast_pkts;
1183231437Sluigi	adapter_stats->tx_broadcast_pkts = port_stats->tx_broadcast_pkts;
1184231437Sluigi	adapter_stats->tx_bytes = port_stats->tx_bytes;
1185231437Sluigi	adapter_stats->tx_unicast_bytes = port_stats->tx_unicast_bytes;
1186231437Sluigi	adapter_stats->tx_multicast_bytes = port_stats->tx_multicast_bytes;
1187231437Sluigi	adapter_stats->tx_broadcast_bytes = port_stats->tx_broadcast_bytes;
1188231437Sluigi	adapter_stats->tx_discards = port_stats->tx_discards;
1189231437Sluigi	adapter_stats->tx_errors = port_stats->tx_errors;
1190231437Sluigi	adapter_stats->tx_pause_frames = port_stats->tx_pause_frames;
1191231437Sluigi	adapter_stats->tx_pause_on_frames = port_stats->tx_pause_on_frames;
1192231437Sluigi	adapter_stats->tx_pause_off_frames = port_stats->tx_pause_off_frames;
1193231437Sluigi	adapter_stats->tx_internal_mac_errors =
1194231437Sluigi		port_stats->tx_internal_mac_errors;
1195231437Sluigi	adapter_stats->tx_control_frames = port_stats->tx_control_frames;
1196231437Sluigi	adapter_stats->tx_pkts_64_bytes = port_stats->tx_pkts_64_bytes;
1197231437Sluigi	adapter_stats->tx_pkts_65_to_127_bytes =
1198231437Sluigi		port_stats->tx_pkts_65_to_127_bytes;
1199231437Sluigi	adapter_stats->tx_pkts_128_to_255_bytes =
1200231437Sluigi		port_stats->tx_pkts_128_to_255_bytes;
1201231437Sluigi	adapter_stats->tx_pkts_256_to_511_bytes =
1202231437Sluigi		port_stats->tx_pkts_256_to_511_bytes;
1203231437Sluigi	adapter_stats->tx_pkts_512_to_1023_bytes =
1204231437Sluigi		port_stats->tx_pkts_512_to_1023_bytes;
1205231437Sluigi	adapter_stats->tx_pkts_1024_to_1518_bytes =
1206231437Sluigi		port_stats->tx_pkts_1024_to_1518_bytes;
1207231437Sluigi	adapter_stats->tx_pkts_1519_to_2047_bytes =
1208231437Sluigi		port_stats->tx_pkts_1519_to_2047_bytes;
1209231437Sluigi	adapter_stats->tx_pkts_2048_to_4095_bytes =
1210231437Sluigi		port_stats->tx_pkts_2048_to_4095_bytes;
1211231437Sluigi	adapter_stats->tx_pkts_4096_to_8191_bytes =
1212231437Sluigi		port_stats->tx_pkts_4096_to_8191_bytes;
1213231437Sluigi	adapter_stats->tx_pkts_8192_to_9216_bytes =
1214231437Sluigi		port_stats->tx_pkts_8192_to_9216_bytes;
1215231437Sluigi	adapter_stats->tx_lso_pkts = port_stats->tx_lso_pkts;
1216231437Sluigi	adapter_stats->rx_pkts = port_stats->rx_pkts;
1217231437Sluigi	adapter_stats->rx_unicast_pkts = port_stats->rx_unicast_pkts;
1218231437Sluigi	adapter_stats->rx_multicast_pkts = port_stats->rx_multicast_pkts;
1219231437Sluigi	adapter_stats->rx_broadcast_pkts = port_stats->rx_broadcast_pkts;
1220231437Sluigi	adapter_stats->rx_bytes = port_stats->rx_bytes;
1221231437Sluigi	adapter_stats->rx_unicast_bytes = port_stats->rx_unicast_bytes;
1222231437Sluigi	adapter_stats->rx_multicast_bytes = port_stats->rx_multicast_bytes;
1223231437Sluigi	adapter_stats->rx_broadcast_bytes = port_stats->rx_broadcast_bytes;
1224231437Sluigi	adapter_stats->rx_unknown_protos = port_stats->rx_unknown_protos;
1225231437Sluigi	adapter_stats->rx_discards = port_stats->rx_discards;
1226231437Sluigi	adapter_stats->rx_errors = port_stats->rx_errors;
1227231437Sluigi	adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
1228231437Sluigi	adapter_stats->rx_alignment_errors = port_stats->rx_alignment_errors;
1229231437Sluigi	adapter_stats->rx_symbol_errors = port_stats->rx_symbol_errors;
1230231437Sluigi	adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
1231231437Sluigi	adapter_stats->rx_pause_on_frames = port_stats->rx_pause_on_frames;
1232231437Sluigi	adapter_stats->rx_pause_off_frames = port_stats->rx_pause_off_frames;
1233231437Sluigi	adapter_stats->rx_frames_too_long = port_stats->rx_frames_too_long;
1234231437Sluigi	adapter_stats->rx_internal_mac_errors =
1235231437Sluigi		port_stats->rx_internal_mac_errors;
1236231437Sluigi	adapter_stats->rx_undersize_pkts = port_stats->rx_undersize_pkts;
1237231437Sluigi	adapter_stats->rx_oversize_pkts = port_stats->rx_oversize_pkts;
1238231437Sluigi	adapter_stats->rx_fragment_pkts = port_stats->rx_fragment_pkts;
1239231437Sluigi	adapter_stats->rx_jabbers = port_stats->rx_jabbers;
1240231437Sluigi	adapter_stats->rx_control_frames = port_stats->rx_control_frames;
1241231437Sluigi	adapter_stats->rx_control_frames_unknown_opcode =
1242231437Sluigi		port_stats->rx_control_frames_unknown_opcode;
1243231437Sluigi	adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
1244231437Sluigi	adapter_stats->rx_out_of_range_errors =
1245231437Sluigi		port_stats->rx_out_of_range_errors;
1246231437Sluigi	adapter_stats->rx_address_match_errors =
1247231437Sluigi		port_stats->rx_address_match_errors;
1248231437Sluigi	adapter_stats->rx_vlan_mismatch_errors =
1249231437Sluigi		port_stats->rx_vlan_mismatch_errors;
1250231437Sluigi	adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
1251231437Sluigi	adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
1252231437Sluigi	adapter_stats->rx_dropped_header_too_small =
1253231437Sluigi		port_stats->rx_dropped_header_too_small;
1254231437Sluigi	adapter_stats->rx_dropped_invalid_tcp_length =
1255231437Sluigi		port_stats->rx_dropped_invalid_tcp_length;
1256231437Sluigi	adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
1257231437Sluigi	adapter_stats->rx_ip_checksum_errors =
1258231437Sluigi		port_stats->rx_ip_checksum_errors;
1259231437Sluigi	adapter_stats->rx_tcp_checksum_errors =
1260231437Sluigi		port_stats->rx_tcp_checksum_errors;
1261231437Sluigi	adapter_stats->rx_udp_checksum_errors =
1262231437Sluigi		port_stats->rx_udp_checksum_errors;
1263231437Sluigi	adapter_stats->rx_non_rss_pkts = port_stats->rx_non_rss_pkts;
1264231437Sluigi	adapter_stats->rx_ipv4_pkts = port_stats->rx_ipv4_pkts;
1265231437Sluigi	adapter_stats->rx_ipv6_pkts = port_stats->rx_ipv6_pkts;
1266231437Sluigi	adapter_stats->rx_ipv4_bytes = port_stats->rx_ipv4_bytes;
1267231437Sluigi	adapter_stats->rx_ipv6_bytes = port_stats->rx_ipv6_bytes;
1268231437Sluigi	adapter_stats->rx_nic_pkts = port_stats->rx_nic_pkts;
1269231437Sluigi	adapter_stats->rx_tcp_pkts = port_stats->rx_tcp_pkts;
1270231437Sluigi	adapter_stats->rx_iscsi_pkts = port_stats->rx_iscsi_pkts;
1271231437Sluigi	adapter_stats->rx_management_pkts = port_stats->rx_management_pkts;
1272231437Sluigi	adapter_stats->rx_switched_unicast_pkts =
1273231437Sluigi		port_stats->rx_switched_unicast_pkts;
1274231437Sluigi	adapter_stats->rx_switched_multicast_pkts =
1275231437Sluigi		port_stats->rx_switched_multicast_pkts;
1276231437Sluigi	adapter_stats->rx_switched_broadcast_pkts =
1277231437Sluigi		port_stats->rx_switched_broadcast_pkts;
1278231437Sluigi	adapter_stats->num_forwards = port_stats->num_forwards;
1279231437Sluigi	adapter_stats->rx_fifo_overflow = port_stats->rx_fifo_overflow;
1280231437Sluigi	adapter_stats->rx_input_fifo_overflow =
1281231437Sluigi		port_stats->rx_input_fifo_overflow;
1282231437Sluigi	adapter_stats->rx_drops_too_many_frags =
1283231437Sluigi		port_stats->rx_drops_too_many_frags;
1284231437Sluigi	adapter_stats->rx_drops_invalid_queue =
1285231437Sluigi		port_stats->rx_drops_invalid_queue;
1286231437Sluigi	adapter_stats->rx_drops_mtu = port_stats->rx_drops_mtu;
1287231437Sluigi	adapter_stats->rx_pkts_64_bytes = port_stats->rx_pkts_64_bytes;
1288231437Sluigi	adapter_stats->rx_pkts_65_to_127_bytes =
1289231437Sluigi		port_stats->rx_pkts_65_to_127_bytes;
1290231437Sluigi	adapter_stats->rx_pkts_128_to_255_bytes =
1291231437Sluigi		port_stats->rx_pkts_128_to_255_bytes;
1292231437Sluigi	adapter_stats->rx_pkts_256_to_511_bytes =
1293231437Sluigi		port_stats->rx_pkts_256_to_511_bytes;
1294231437Sluigi	adapter_stats->rx_pkts_512_to_1023_bytes =
1295231437Sluigi		port_stats->rx_pkts_512_to_1023_bytes;
1296231437Sluigi	adapter_stats->rx_pkts_1024_to_1518_bytes =
1297231437Sluigi		port_stats->rx_pkts_1024_to_1518_bytes;
1298231437Sluigi	adapter_stats->rx_pkts_1519_to_2047_bytes =
1299231437Sluigi		port_stats->rx_pkts_1519_to_2047_bytes;
1300231437Sluigi	adapter_stats->rx_pkts_2048_to_4095_bytes =
1301231437Sluigi		port_stats->rx_pkts_2048_to_4095_bytes;
1302231437Sluigi	adapter_stats->rx_pkts_4096_to_8191_bytes =
1303231437Sluigi		port_stats->rx_pkts_4096_to_8191_bytes;
1304231437Sluigi	adapter_stats->rx_pkts_8192_to_9216_bytes =
1305231437Sluigi		port_stats->rx_pkts_8192_to_9216_bytes;
1306231437Sluigi}
1307231437Sluigi
1308231437Sluigi
1309231437Sluigi
1310231437Sluigistatic void
1311231437Sluigicopy_stats_to_sc_be2(POCE_SOFTC sc)
1312231437Sluigi{
1313231437Sluigi	struct oce_be_stats *adapter_stats;
1314231437Sluigi	struct oce_pmem_stats *pmem;
1315231437Sluigi	struct oce_rxf_stats_v0 *rxf_stats;
1316231437Sluigi	struct oce_port_rxf_stats_v0 *port_stats;
1317231437Sluigi	struct mbx_get_nic_stats_v0 *nic_mbx;
1318231437Sluigi	uint32_t port = sc->port_id;
1319231437Sluigi
1320231437Sluigi	nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats_v0);
1321231437Sluigi	pmem = &nic_mbx->params.rsp.stats.pmem;
1322231437Sluigi	rxf_stats = &nic_mbx->params.rsp.stats.rxf;
1323231437Sluigi	port_stats = &nic_mbx->params.rsp.stats.rxf.port[port];
1324231437Sluigi
1325231437Sluigi	adapter_stats = &sc->oce_stats_info.u0.be;
1326231437Sluigi
1327231437Sluigi
1328231437Sluigi	/* Update stats */
1329231437Sluigi	adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
1330231437Sluigi	adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
1331231437Sluigi	adapter_stats->rx_control_frames = port_stats->rx_control_frames;
1332231437Sluigi	adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
1333231437Sluigi	adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long;
1334231437Sluigi	adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
1335231437Sluigi	adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs;
1336231437Sluigi	adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs;
1337231437Sluigi	adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs;
1338231437Sluigi	adapter_stats->rxpp_fifo_overflow_drop =
1339231437Sluigi					port_stats->rxpp_fifo_overflow_drop;
1340231437Sluigi	adapter_stats->rx_dropped_tcp_length =
1341231437Sluigi		port_stats->rx_dropped_tcp_length;
1342231437Sluigi	adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
1343231437Sluigi	adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
1344231437Sluigi	adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors;
1345231437Sluigi	adapter_stats->rx_dropped_header_too_small =
1346231437Sluigi		port_stats->rx_dropped_header_too_small;
1347231437Sluigi	adapter_stats->rx_input_fifo_overflow_drop =
1348231437Sluigi		port_stats->rx_input_fifo_overflow_drop;
1349231437Sluigi	adapter_stats->rx_address_match_errors =
1350231437Sluigi		port_stats->rx_address_match_errors;
1351231437Sluigi	adapter_stats->rx_alignment_symbol_errors =
1352231437Sluigi		port_stats->rx_alignment_symbol_errors;
1353231437Sluigi	adapter_stats->tx_pauseframes = port_stats->tx_pauseframes;
1354231437Sluigi	adapter_stats->tx_controlframes = port_stats->tx_controlframes;
1355231437Sluigi
1356231437Sluigi	if (sc->if_id)
1357231437Sluigi		adapter_stats->jabber_events = rxf_stats->port1_jabber_events;
1358231437Sluigi	else
1359231437Sluigi		adapter_stats->jabber_events = rxf_stats->port0_jabber_events;
1360231437Sluigi
1361231437Sluigi	adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf;
1362231437Sluigi	adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb;
1363231437Sluigi	adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr;
1364231437Sluigi	adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring;
1365231437Sluigi	adapter_stats->forwarded_packets = rxf_stats->forwarded_packets;
1366231437Sluigi	adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu;
1367231437Sluigi	adapter_stats->rx_drops_no_tpre_descr =
1368231437Sluigi		rxf_stats->rx_drops_no_tpre_descr;
1369231437Sluigi	adapter_stats->rx_drops_too_many_frags =
1370231437Sluigi		rxf_stats->rx_drops_too_many_frags;
1371231437Sluigi	adapter_stats->eth_red_drops = pmem->eth_red_drops;
1372231437Sluigi}
1373231437Sluigi
1374231437Sluigi
1375231437Sluigistatic void
1376231437Sluigicopy_stats_to_sc_be3(POCE_SOFTC sc)
1377231437Sluigi{
1378231437Sluigi	struct oce_be_stats *adapter_stats;
1379231437Sluigi	struct oce_pmem_stats *pmem;
1380231437Sluigi	struct oce_rxf_stats_v1 *rxf_stats;
1381231437Sluigi	struct oce_port_rxf_stats_v1 *port_stats;
1382338938Sjpaetzel	struct mbx_get_nic_stats_v1 *nic_mbx;
1383231437Sluigi	uint32_t port = sc->port_id;
1384231437Sluigi
1385338938Sjpaetzel	nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats_v1);
1386231437Sluigi	pmem = &nic_mbx->params.rsp.stats.pmem;
1387231437Sluigi	rxf_stats = &nic_mbx->params.rsp.stats.rxf;
1388231437Sluigi	port_stats = &nic_mbx->params.rsp.stats.rxf.port[port];
1389231437Sluigi
1390231437Sluigi	adapter_stats = &sc->oce_stats_info.u0.be;
1391231437Sluigi
1392231437Sluigi	/* Update stats */
1393231437Sluigi	adapter_stats->pmem_fifo_overflow_drop =
1394231437Sluigi		port_stats->pmem_fifo_overflow_drop;
1395231437Sluigi	adapter_stats->rx_priority_pause_frames =
1396231437Sluigi		port_stats->rx_priority_pause_frames;
1397231437Sluigi	adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
1398231437Sluigi	adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
1399231437Sluigi	adapter_stats->rx_control_frames = port_stats->rx_control_frames;
1400231437Sluigi	adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
1401231437Sluigi	adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long;
1402231437Sluigi	adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
1403231437Sluigi	adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs;
1404231437Sluigi	adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs;
1405231437Sluigi	adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs;
1406231437Sluigi	adapter_stats->rx_dropped_tcp_length =
1407231437Sluigi		port_stats->rx_dropped_tcp_length;
1408231437Sluigi	adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
1409231437Sluigi	adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
1410231437Sluigi	adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors;
1411231437Sluigi	adapter_stats->rx_dropped_header_too_small =
1412231437Sluigi		port_stats->rx_dropped_header_too_small;
1413231437Sluigi	adapter_stats->rx_input_fifo_overflow_drop =
1414231437Sluigi		port_stats->rx_input_fifo_overflow_drop;
1415231437Sluigi	adapter_stats->rx_address_match_errors =
1416231437Sluigi		port_stats->rx_address_match_errors;
1417231437Sluigi	adapter_stats->rx_alignment_symbol_errors =
1418231437Sluigi		port_stats->rx_alignment_symbol_errors;
1419231437Sluigi	adapter_stats->rxpp_fifo_overflow_drop =
1420231437Sluigi		port_stats->rxpp_fifo_overflow_drop;
1421231437Sluigi	adapter_stats->tx_pauseframes = port_stats->tx_pauseframes;
1422231437Sluigi	adapter_stats->tx_controlframes = port_stats->tx_controlframes;
1423231437Sluigi	adapter_stats->jabber_events = port_stats->jabber_events;
1424231437Sluigi
1425231437Sluigi	adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf;
1426231437Sluigi	adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb;
1427231437Sluigi	adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr;
1428231437Sluigi	adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring;
1429231437Sluigi	adapter_stats->forwarded_packets = rxf_stats->forwarded_packets;
1430231437Sluigi	adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu;
1431231437Sluigi	adapter_stats->rx_drops_no_tpre_descr =
1432231437Sluigi		rxf_stats->rx_drops_no_tpre_descr;
1433231437Sluigi	adapter_stats->rx_drops_too_many_frags =
1434231437Sluigi		rxf_stats->rx_drops_too_many_frags;
1435231437Sluigi
1436231437Sluigi	adapter_stats->eth_red_drops = pmem->eth_red_drops;
1437231437Sluigi}
1438231437Sluigi
1439338938Sjpaetzelstatic void
1440338938Sjpaetzelcopy_stats_to_sc_sh(POCE_SOFTC sc)
1441338938Sjpaetzel{
1442338938Sjpaetzel        struct oce_be_stats *adapter_stats;
1443338938Sjpaetzel        struct oce_pmem_stats *pmem;
1444338938Sjpaetzel        struct oce_rxf_stats_v2 *rxf_stats;
1445338938Sjpaetzel        struct oce_port_rxf_stats_v2 *port_stats;
1446338938Sjpaetzel        struct mbx_get_nic_stats_v2 *nic_mbx;
1447338938Sjpaetzel	struct oce_erx_stats_v2 *erx_stats;
1448338938Sjpaetzel        uint32_t port = sc->port_id;
1449231437Sluigi
1450338938Sjpaetzel        nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats_v2);
1451338938Sjpaetzel        pmem = &nic_mbx->params.rsp.stats.pmem;
1452338938Sjpaetzel        rxf_stats = &nic_mbx->params.rsp.stats.rxf;
1453338938Sjpaetzel	erx_stats = &nic_mbx->params.rsp.stats.erx;
1454338938Sjpaetzel        port_stats = &nic_mbx->params.rsp.stats.rxf.port[port];
1455338938Sjpaetzel
1456338938Sjpaetzel        adapter_stats = &sc->oce_stats_info.u0.be;
1457338938Sjpaetzel
1458338938Sjpaetzel        /* Update stats */
1459338938Sjpaetzel        adapter_stats->pmem_fifo_overflow_drop =
1460338938Sjpaetzel                port_stats->pmem_fifo_overflow_drop;
1461338938Sjpaetzel        adapter_stats->rx_priority_pause_frames =
1462338938Sjpaetzel                port_stats->rx_priority_pause_frames;
1463338938Sjpaetzel        adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
1464338938Sjpaetzel        adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
1465338938Sjpaetzel        adapter_stats->rx_control_frames = port_stats->rx_control_frames;
1466338938Sjpaetzel        adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
1467338938Sjpaetzel        adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long;
1468338938Sjpaetzel        adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
1469338938Sjpaetzel        adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs;
1470338938Sjpaetzel        adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs;
1471338938Sjpaetzel        adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs;
1472338938Sjpaetzel        adapter_stats->rx_dropped_tcp_length =
1473338938Sjpaetzel                port_stats->rx_dropped_tcp_length;
1474338938Sjpaetzel        adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
1475338938Sjpaetzel        adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
1476338938Sjpaetzel        adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors;
1477338938Sjpaetzel        adapter_stats->rx_dropped_header_too_small =
1478338938Sjpaetzel                port_stats->rx_dropped_header_too_small;
1479338938Sjpaetzel        adapter_stats->rx_input_fifo_overflow_drop =
1480338938Sjpaetzel                port_stats->rx_input_fifo_overflow_drop;
1481338938Sjpaetzel        adapter_stats->rx_address_match_errors =
1482338938Sjpaetzel                port_stats->rx_address_match_errors;
1483338938Sjpaetzel        adapter_stats->rx_alignment_symbol_errors =
1484338938Sjpaetzel                port_stats->rx_alignment_symbol_errors;
1485338938Sjpaetzel        adapter_stats->rxpp_fifo_overflow_drop =
1486338938Sjpaetzel                port_stats->rxpp_fifo_overflow_drop;
1487338938Sjpaetzel        adapter_stats->tx_pauseframes = port_stats->tx_pauseframes;
1488338938Sjpaetzel        adapter_stats->tx_controlframes = port_stats->tx_controlframes;
1489338938Sjpaetzel        adapter_stats->jabber_events = port_stats->jabber_events;
1490338938Sjpaetzel
1491338938Sjpaetzel        adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf;
1492338938Sjpaetzel        adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb;
1493338938Sjpaetzel        adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr;
1494338938Sjpaetzel        adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring;
1495338938Sjpaetzel        adapter_stats->forwarded_packets = rxf_stats->forwarded_packets;
1496338938Sjpaetzel        adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu;
1497338938Sjpaetzel        adapter_stats->rx_drops_no_tpre_descr =
1498338938Sjpaetzel                rxf_stats->rx_drops_no_tpre_descr;
1499338938Sjpaetzel        adapter_stats->rx_drops_too_many_frags =
1500338938Sjpaetzel                rxf_stats->rx_drops_too_many_frags;
1501338938Sjpaetzel
1502338938Sjpaetzel        adapter_stats->eth_red_drops = pmem->eth_red_drops;
1503338938Sjpaetzel
1504338938Sjpaetzel	/* populate erx stats */
1505338938Sjpaetzel	for (int i = 0; i < sc->nrqs; i++)
1506338938Sjpaetzel		sc->rq[i]->rx_stats.rx_drops_no_frags = erx_stats->rx_drops_no_fragments[sc->rq[i]->rq_id];
1507338938Sjpaetzel}
1508338938Sjpaetzel
1509338938Sjpaetzel
1510338938Sjpaetzel
1511231437Sluigiint
1512231437Sluigioce_stats_init(POCE_SOFTC sc)
1513231437Sluigi{
1514338938Sjpaetzel	int rc = 0, sz = 0;
1515338938Sjpaetzel
1516338938Sjpaetzel
1517338938Sjpaetzel        if( IS_BE2(sc) )
1518338938Sjpaetzel		sz = sizeof(struct mbx_get_nic_stats_v0);
1519338938Sjpaetzel        else if( IS_BE3(sc) )
1520338938Sjpaetzel		sz = sizeof(struct mbx_get_nic_stats_v1);
1521338938Sjpaetzel        else if( IS_SH(sc))
1522338938Sjpaetzel		sz = sizeof(struct mbx_get_nic_stats_v2);
1523338938Sjpaetzel        else if( IS_XE201(sc) )
1524231437Sluigi		sz = sizeof(struct mbx_get_pport_stats);
1525231437Sluigi
1526231437Sluigi	rc = oce_dma_alloc(sc, sz, &sc->stats_mem, 0);
1527231437Sluigi
1528231437Sluigi	return rc;
1529231437Sluigi}
1530231437Sluigi
1531231437Sluigi
1532231437Sluigivoid
1533231437Sluigioce_stats_free(POCE_SOFTC sc)
1534231437Sluigi{
1535231437Sluigi
1536231437Sluigi	oce_dma_free(sc, &sc->stats_mem);
1537231437Sluigi
1538231437Sluigi}
1539231437Sluigi
1540231437Sluigi
1541231437Sluigiint
1542231437Sluigioce_refresh_nic_stats(POCE_SOFTC sc)
1543231437Sluigi{
1544231437Sluigi	int rc = 0, reset = 0;
1545231437Sluigi
1546338938Sjpaetzel	if( IS_BE2(sc) ) {
1547338938Sjpaetzel		rc = oce_mbox_get_nic_stats_v0(sc, &sc->stats_mem);
1548338938Sjpaetzel		if (!rc)
1549338938Sjpaetzel			copy_stats_to_sc_be2(sc);
1550338938Sjpaetzel	}else if( IS_BE3(sc) ) {
1551338938Sjpaetzel		rc = oce_mbox_get_nic_stats_v1(sc, &sc->stats_mem);
1552338938Sjpaetzel		if (!rc)
1553338938Sjpaetzel			copy_stats_to_sc_be3(sc);
1554338938Sjpaetzel	}else if( IS_SH(sc)) {
1555338938Sjpaetzel		rc = oce_mbox_get_nic_stats_v2(sc, &sc->stats_mem);
1556338938Sjpaetzel		if (!rc)
1557338938Sjpaetzel			copy_stats_to_sc_sh(sc);
1558338938Sjpaetzel	}else if( IS_XE201(sc) ){
1559231437Sluigi		rc = oce_mbox_get_pport_stats(sc, &sc->stats_mem, reset);
1560231437Sluigi		if (!rc)
1561231437Sluigi			copy_stats_to_sc_xe201(sc);
1562231437Sluigi	}
1563338938Sjpaetzel
1564231437Sluigi	return rc;
1565231437Sluigi}
1566247880Sdelphij
1567247880Sdelphijstatic int
1568247880Sdelphijoce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS)
1569247880Sdelphij{
1570247880Sdelphij	int result = 0, error;
1571247880Sdelphij	int rc = 0;
1572247880Sdelphij	POCE_SOFTC sc = (POCE_SOFTC) arg1;
1573247880Sdelphij
1574247880Sdelphij	/* sysctl default handler */
1575247880Sdelphij	error = sysctl_handle_int(oidp, &result, 0, req);
1576247880Sdelphij	if (error || !req->newptr)
1577247880Sdelphij		return (error);
1578247880Sdelphij
1579247880Sdelphij	if(result == -1) {
1580247880Sdelphij		return EINVAL;
1581247880Sdelphij	}
1582247880Sdelphij	bzero((char *)sfp_vpd_dump_buffer, TRANSCEIVER_DATA_SIZE);
1583247880Sdelphij
1584247880Sdelphij	rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A0);
1585247880Sdelphij	if(rc)
1586247880Sdelphij		return rc;
1587247880Sdelphij
1588247880Sdelphij	rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A2);
1589247880Sdelphij	if(rc)
1590247880Sdelphij		return rc;
1591247880Sdelphij
1592247880Sdelphij	return rc;
1593247880Sdelphij}
1594