1231663Sluigi/*-
2252905Sdelphij * Copyright (C) 2013 Emulex
3231663Sluigi * All rights reserved.
4231663Sluigi *
5231663Sluigi * Redistribution and use in source and binary forms, with or without
6231663Sluigi * modification, are permitted provided that the following conditions are met:
7231663Sluigi *
8231663Sluigi * 1. Redistributions of source code must retain the above copyright notice,
9231663Sluigi *    this list of conditions and the following disclaimer.
10231663Sluigi *
11231663Sluigi * 2. Redistributions in binary form must reproduce the above copyright
12231663Sluigi *    notice, this list of conditions and the following disclaimer in the
13231663Sluigi *    documentation and/or other materials provided with the distribution.
14231663Sluigi *
15231663Sluigi * 3. Neither the name of the Emulex Corporation nor the names of its
16231663Sluigi *    contributors may be used to endorse or promote products derived from
17231663Sluigi *    this software without specific prior written permission.
18231663Sluigi *
19231663Sluigi * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20231663Sluigi * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21231663Sluigi * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22231663Sluigi * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23231663Sluigi * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24231663Sluigi * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25231663Sluigi * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26231663Sluigi * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27231663Sluigi * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28231663Sluigi * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29231663Sluigi * POSSIBILITY OF SUCH DAMAGE.
30231663Sluigi *
31231663Sluigi * Contact Information:
32231663Sluigi * freebsd-drivers@emulex.com
33231663Sluigi *
34231663Sluigi * Emulex
35231663Sluigi * 3333 Susan Street
36231663Sluigi * Costa Mesa, CA 92626
37231663Sluigi */
38231663Sluigi
39231663Sluigi/* $FreeBSD$ */
40231663Sluigi
41231663Sluigi#include "oce_if.h"
42231663Sluigi
43231663Sluigistatic void copy_stats_to_sc_xe201(POCE_SOFTC sc);
44231663Sluigistatic void copy_stats_to_sc_be3(POCE_SOFTC sc);
45231663Sluigistatic void copy_stats_to_sc_be2(POCE_SOFTC sc);
46231663Sluigistatic int  oce_sysctl_loopback(SYSCTL_HANDLER_ARGS);
47268044Sdelphijstatic int  oce_sys_aic_enable(SYSCTL_HANDLER_ARGS);
48231663Sluigistatic int  oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
49258586Sdelphijstatic int oce_skyhawk_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
50231663Sluigistatic int  oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS);
51231663Sluigistatic int  oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
52248062Sdelphijstatic int oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS);
53231663Sluigistatic boolean_t oce_phy_flashing_required(POCE_SOFTC sc);
54231663Sluigistatic boolean_t oce_img_flashing_required(POCE_SOFTC sc, const char *p,
55231663Sluigi				int img_optype, uint32_t img_offset,
56231663Sluigi				uint32_t img_size, uint32_t hdrs_size);
57231663Sluigistatic void oce_add_stats_sysctls_be3(POCE_SOFTC sc,
58231663Sluigi				struct sysctl_ctx_list *ctx,
59231663Sluigi				struct sysctl_oid *stats_node);
60231663Sluigistatic void oce_add_stats_sysctls_xe201(POCE_SOFTC sc,
61231663Sluigi				struct sysctl_ctx_list *ctx,
62231663Sluigi				struct sysctl_oid *stats_node);
63231663Sluigi
64258586Sdelphij
65231663Sluigiextern char component_revision[32];
66248062Sdelphijuint32_t sfp_vpd_dump_buffer[TRANSCEIVER_DATA_NUM_ELE];
67231663Sluigi
68258586Sdelphijstruct flash_img_attri {
69258586Sdelphij	int img_offset;
70258586Sdelphij	int img_size;
71258586Sdelphij	int img_type;
72258586Sdelphij	bool skip_image;
73258586Sdelphij	int optype;
74258586Sdelphij};
75258586Sdelphij
76231663Sluigivoid
77231663Sluigioce_add_sysctls(POCE_SOFTC sc)
78231663Sluigi{
79231663Sluigi
80231663Sluigi	struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev);
81231663Sluigi	struct sysctl_oid *tree = device_get_sysctl_tree(sc->dev);
82231663Sluigi	struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree);
83231663Sluigi	struct sysctl_oid *stats_node;
84231663Sluigi
85231663Sluigi	SYSCTL_ADD_STRING(ctx, child,
86231663Sluigi			OID_AUTO, "component_revision",
87231663Sluigi			CTLTYPE_INT | CTLFLAG_RD,
88231663Sluigi			&component_revision,
89231663Sluigi			sizeof(component_revision),
90231663Sluigi			"EMULEX One-Connect device driver revision");
91231663Sluigi
92231663Sluigi	SYSCTL_ADD_STRING(ctx, child,
93231663Sluigi			OID_AUTO, "firmware_version",
94231663Sluigi			CTLTYPE_INT | CTLFLAG_RD,
95231663Sluigi			&sc->fw_version,
96231663Sluigi			sizeof(sc->fw_version),
97231663Sluigi			"EMULEX One-Connect Firmware Version");
98231663Sluigi
99231663Sluigi	SYSCTL_ADD_INT(ctx, child,
100231663Sluigi			OID_AUTO, "max_rsp_handled",
101231663Sluigi			CTLTYPE_INT | CTLFLAG_RW,
102231663Sluigi			&oce_max_rsp_handled,
103231663Sluigi			sizeof(oce_max_rsp_handled),
104231663Sluigi			"Maximum receive frames handled per interupt");
105231663Sluigi
106248062Sdelphij	if ((sc->function_mode & FNM_FLEX10_MODE) ||
107248062Sdelphij	    (sc->function_mode & FNM_UMC_MODE))
108231663Sluigi		SYSCTL_ADD_UINT(ctx, child,
109231663Sluigi				OID_AUTO, "speed",
110231663Sluigi				CTLFLAG_RD,
111231663Sluigi				&sc->qos_link_speed,
112231663Sluigi				0,"QOS Speed");
113231663Sluigi	else
114231663Sluigi		SYSCTL_ADD_UINT(ctx, child,
115231663Sluigi				OID_AUTO, "speed",
116231663Sluigi				CTLFLAG_RD,
117231663Sluigi				&sc->speed,
118231663Sluigi				0,"Link Speed");
119231663Sluigi
120248062Sdelphij	if (sc->function_mode & FNM_UMC_MODE)
121248062Sdelphij		SYSCTL_ADD_UINT(ctx, child,
122248062Sdelphij				OID_AUTO, "pvid",
123248062Sdelphij				CTLFLAG_RD,
124248062Sdelphij				&sc->pvid,
125248062Sdelphij				0,"PVID");
126248062Sdelphij
127231663Sluigi	SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "loop_back",
128231663Sluigi		CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0,
129231663Sluigi		oce_sysctl_loopback, "I", "Loop Back Tests");
130231663Sluigi
131231663Sluigi	SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "fw_upgrade",
132231663Sluigi		CTLTYPE_STRING | CTLFLAG_RW, (void *)sc, 0,
133231663Sluigi		oce_sys_fwupgrade, "A", "Firmware ufi file");
134231663Sluigi
135268044Sdelphij	SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "aic_enable",
136268044Sdelphij		CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 1,
137268044Sdelphij		oce_sys_aic_enable, "I", "aic flags");
138268044Sdelphij
139248062Sdelphij        /*
140248062Sdelphij         *  Dumps Transceiver data
141248062Sdelphij	 *  "sysctl dev.oce.0.sfp_vpd_dump=0"
142248062Sdelphij         *  "sysctl -x dev.oce.0.sfp_vpd_dump_buffer" for hex dump
143248062Sdelphij         *  "sysctl -b dev.oce.0.sfp_vpd_dump_buffer > sfp.bin" for binary dump
144248062Sdelphij         */
145248062Sdelphij	SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "sfp_vpd_dump",
146248062Sdelphij			CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, oce_sysctl_sfp_vpd_dump,
147248062Sdelphij			"I", "Initiate a sfp_vpd_dump operation");
148248062Sdelphij	SYSCTL_ADD_OPAQUE(ctx, child, OID_AUTO, "sfp_vpd_dump_buffer",
149248062Sdelphij			CTLFLAG_RD, sfp_vpd_dump_buffer,
150248062Sdelphij			TRANSCEIVER_DATA_SIZE, "IU", "Access sfp_vpd_dump buffer");
151248062Sdelphij
152231663Sluigi	stats_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats",
153231663Sluigi				CTLFLAG_RD, NULL, "Ethernet Statistics");
154231663Sluigi
155252905Sdelphij	if (IS_BE(sc) || IS_SH(sc))
156231663Sluigi		oce_add_stats_sysctls_be3(sc, ctx, stats_node);
157231663Sluigi	else
158231663Sluigi		oce_add_stats_sysctls_xe201(sc, ctx, stats_node);
159231663Sluigi
160231663Sluigi
161231663Sluigi}
162231663Sluigi
163231663Sluigi
164231663Sluigistatic uint32_t
165231663Sluigioce_loopback_test(struct oce_softc *sc, uint8_t loopback_type)
166231663Sluigi{
167231663Sluigi	uint32_t status = 0;
168231663Sluigi
169258586Sdelphij	oce_mbox_cmd_set_loopback(sc, sc->port_id, loopback_type, 1);
170258586Sdelphij	status = oce_mbox_cmd_test_loopback(sc, sc->port_id, loopback_type,
171231663Sluigi				1500, 2, 0xabc);
172258586Sdelphij	oce_mbox_cmd_set_loopback(sc, sc->port_id, OCE_NO_LOOPBACK, 1);
173231663Sluigi
174231663Sluigi	return status;
175231663Sluigi}
176231663Sluigi
177231663Sluigistatic int
178268044Sdelphijoce_sys_aic_enable(SYSCTL_HANDLER_ARGS)
179268044Sdelphij{
180268044Sdelphij	int value = 0;
181268044Sdelphij	uint32_t status, vector;
182268044Sdelphij	POCE_SOFTC sc = (struct oce_softc *)arg1;
183268044Sdelphij	struct oce_aic_obj *aic;
184268044Sdelphij
185268044Sdelphij	status = sysctl_handle_int(oidp, &value, 0, req);
186268044Sdelphij	if (status || !req->newptr)
187268044Sdelphij		return status;
188268044Sdelphij
189268044Sdelphij	for (vector = 0; vector < sc->intr_count; vector++) {
190268044Sdelphij		aic = &sc->aic_obj[vector];
191268044Sdelphij
192268044Sdelphij		if (value == 0){
193268044Sdelphij			aic->max_eqd = aic->min_eqd = aic->et_eqd = 0;
194268044Sdelphij			aic->enable = 0;
195268044Sdelphij		}
196268044Sdelphij		else {
197268044Sdelphij			aic->max_eqd = OCE_MAX_EQD;
198268044Sdelphij			aic->min_eqd = OCE_MIN_EQD;
199268044Sdelphij			aic->et_eqd = OCE_MIN_EQD;
200268044Sdelphij			aic->enable = TRUE;
201268044Sdelphij		}
202268044Sdelphij	}
203268044Sdelphij	return 0;
204268044Sdelphij}
205268044Sdelphij
206268044Sdelphijstatic int
207231663Sluigioce_sysctl_loopback(SYSCTL_HANDLER_ARGS)
208231663Sluigi{
209231663Sluigi	int value = 0;
210231663Sluigi	uint32_t status;
211231663Sluigi	struct oce_softc *sc  = (struct oce_softc *)arg1;
212231663Sluigi
213231663Sluigi	status = sysctl_handle_int(oidp, &value, 0, req);
214231663Sluigi	if (status || !req->newptr)
215231663Sluigi		return status;
216231663Sluigi
217231663Sluigi	if (value != 1) {
218231663Sluigi		device_printf(sc->dev,
219231663Sluigi			"Not a Valid value. Set to loop_back=1 to run tests\n");
220231663Sluigi		return 0;
221231663Sluigi	}
222231663Sluigi
223231663Sluigi	if ((status = oce_loopback_test(sc, OCE_MAC_LOOPBACK))) {
224231663Sluigi		device_printf(sc->dev,
225231663Sluigi			"MAC Loopback Test = Failed (Error status = %d)\n",
226231663Sluigi			 status);
227231663Sluigi	} else
228231663Sluigi		device_printf(sc->dev, "MAC Loopback Test = Success\n");
229231663Sluigi
230231663Sluigi	if ((status = oce_loopback_test(sc, OCE_PHY_LOOPBACK))) {
231231663Sluigi		device_printf(sc->dev,
232231663Sluigi			"PHY Loopback Test = Failed (Error status = %d)\n",
233231663Sluigi			 status);
234231663Sluigi	} else
235231663Sluigi		device_printf(sc->dev, "PHY Loopback Test = Success\n");
236231663Sluigi
237231663Sluigi	if ((status = oce_loopback_test(sc, OCE_ONE_PORT_EXT_LOOPBACK))) {
238231663Sluigi		device_printf(sc->dev,
239231663Sluigi			"EXT Loopback Test = Failed (Error status = %d)\n",
240231663Sluigi			 status);
241231663Sluigi	} else
242231663Sluigi		device_printf(sc->dev, "EXT Loopback Test = Success\n");
243231663Sluigi
244231663Sluigi	return 0;
245231663Sluigi}
246231663Sluigi
247231663Sluigi
248231663Sluigistatic int
249231663Sluigioce_sys_fwupgrade(SYSCTL_HANDLER_ARGS)
250231663Sluigi{
251231663Sluigi	char ufiname[256] = {0};
252231663Sluigi	uint32_t status = 1;
253231663Sluigi	struct oce_softc *sc  = (struct oce_softc *)arg1;
254231663Sluigi	const struct firmware *fw;
255231663Sluigi
256231663Sluigi	status = sysctl_handle_string(oidp, ufiname, sizeof(ufiname), req);
257231663Sluigi	if (status || !req->newptr)
258231663Sluigi		return status;
259231663Sluigi
260231663Sluigi	fw = firmware_get(ufiname);
261231663Sluigi	if (fw == NULL) {
262231663Sluigi		device_printf(sc->dev, "Unable to get Firmware. "
263231663Sluigi			"Make sure %s is copied to /boot/modules\n", ufiname);
264231663Sluigi		return ENOENT;
265231663Sluigi	}
266231663Sluigi
267258586Sdelphij	if (IS_BE(sc)) {
268231663Sluigi		if ((sc->flags & OCE_FLAGS_BE2)) {
269231663Sluigi			device_printf(sc->dev,
270231663Sluigi				"Flashing not supported for BE2 yet.\n");
271231663Sluigi			status = 1;
272231663Sluigi			goto done;
273231663Sluigi		}
274231663Sluigi		status = oce_be3_fwupgrade(sc, fw);
275258586Sdelphij	} else if (IS_SH(sc)) {
276258586Sdelphij		status = oce_skyhawk_fwupgrade(sc,fw);
277231663Sluigi	} else
278231663Sluigi		status = oce_lancer_fwupgrade(sc, fw);
279231663Sluigidone:
280231663Sluigi	if (status) {
281231663Sluigi		device_printf(sc->dev, "Firmware Upgrade failed\n");
282231663Sluigi	} else {
283231663Sluigi		device_printf(sc->dev, "Firmware Flashed successfully\n");
284231663Sluigi	}
285231663Sluigi
286231663Sluigi	/* Release Firmware*/
287231663Sluigi	firmware_put(fw, FIRMWARE_UNLOAD);
288231663Sluigi
289231663Sluigi	return status;
290231663Sluigi}
291231663Sluigi
292258586Sdelphijstatic void oce_fill_flash_img_data(POCE_SOFTC sc, const struct flash_sec_info * fsec,
293258586Sdelphij				struct flash_img_attri *pimg, int i,
294258586Sdelphij				const struct firmware *fw, int bin_offset)
295231663Sluigi{
296258586Sdelphij	if (IS_SH(sc)) {
297258586Sdelphij		pimg->img_offset = HOST_32(fsec->fsec_entry[i].offset);
298258586Sdelphij		pimg->img_size   = HOST_32(fsec->fsec_entry[i].pad_size);
299231663Sluigi	}
300231663Sluigi
301258586Sdelphij	pimg->img_type = HOST_32(fsec->fsec_entry[i].type);
302258586Sdelphij	pimg->skip_image = FALSE;
303258586Sdelphij	switch (pimg->img_type) {
304258586Sdelphij		case IMG_ISCSI:
305258586Sdelphij			pimg->optype = 0;
306258586Sdelphij			if (IS_BE3(sc)) {
307258586Sdelphij				pimg->img_offset = 2097152;
308258586Sdelphij				pimg->img_size   = 2097152;
309258586Sdelphij			}
310231663Sluigi			break;
311258586Sdelphij		case IMG_REDBOOT:
312258586Sdelphij			pimg->optype = 1;
313258586Sdelphij			if (IS_BE3(sc)) {
314258586Sdelphij				pimg->img_offset = 262144;
315258586Sdelphij				pimg->img_size   = 1048576;
316258586Sdelphij			}
317258586Sdelphij			if (!oce_img_flashing_required(sc, fw->data,
318258586Sdelphij						pimg->optype,
319258586Sdelphij						pimg->img_offset,
320258586Sdelphij						pimg->img_size,
321258586Sdelphij						bin_offset))
322258586Sdelphij				pimg->skip_image = TRUE;
323258586Sdelphij			break;
324258586Sdelphij		case IMG_BIOS:
325258586Sdelphij			pimg->optype = 2;
326258586Sdelphij			if (IS_BE3(sc)) {
327258586Sdelphij				pimg->img_offset = 12582912;
328258586Sdelphij				pimg->img_size   = 524288;
329258586Sdelphij			}
330258586Sdelphij			break;
331258586Sdelphij		case IMG_PXEBIOS:
332258586Sdelphij			pimg->optype = 3;
333258586Sdelphij			if (IS_BE3(sc)) {
334258586Sdelphij				pimg->img_offset =  13107200;;
335258586Sdelphij				pimg->img_size   = 524288;
336258586Sdelphij			}
337258586Sdelphij			break;
338258586Sdelphij		case IMG_FCOEBIOS:
339258586Sdelphij			pimg->optype = 8;
340258586Sdelphij			if (IS_BE3(sc)) {
341258586Sdelphij				pimg->img_offset = 13631488;
342258586Sdelphij				pimg->img_size   = 524288;
343258586Sdelphij			}
344258586Sdelphij			break;
345258586Sdelphij		case IMG_ISCSI_BAK:
346258586Sdelphij			pimg->optype = 9;
347258586Sdelphij			if (IS_BE3(sc)) {
348258586Sdelphij				pimg->img_offset = 4194304;
349258586Sdelphij				pimg->img_size   = 2097152;
350258586Sdelphij			}
351258586Sdelphij			break;
352258586Sdelphij		case IMG_FCOE:
353258586Sdelphij			pimg->optype = 10;
354258586Sdelphij			if (IS_BE3(sc)) {
355258586Sdelphij				pimg->img_offset = 6291456;
356258586Sdelphij				pimg->img_size   = 2097152;
357258586Sdelphij			}
358258586Sdelphij			break;
359258586Sdelphij		case IMG_FCOE_BAK:
360258586Sdelphij			pimg->optype = 11;
361258586Sdelphij			if (IS_BE3(sc)) {
362258586Sdelphij				pimg->img_offset = 8388608;
363258586Sdelphij				pimg->img_size   = 2097152;
364258586Sdelphij			}
365258586Sdelphij			break;
366258586Sdelphij		case IMG_NCSI:
367258586Sdelphij			pimg->optype = 13;
368258586Sdelphij			if (IS_BE3(sc)) {
369258586Sdelphij				pimg->img_offset = 15990784;
370258586Sdelphij				pimg->img_size   = 262144;
371258586Sdelphij			}
372258586Sdelphij			break;
373258586Sdelphij		case IMG_PHY:
374258586Sdelphij			pimg->optype = 99;
375258586Sdelphij			if (IS_BE3(sc)) {
376258586Sdelphij				pimg->img_offset = 1310720;
377258586Sdelphij				pimg->img_size   = 262144;
378258586Sdelphij			}
379258586Sdelphij			if (!oce_phy_flashing_required(sc))
380258586Sdelphij				pimg->skip_image = TRUE;
381258586Sdelphij			break;
382258586Sdelphij		default:
383258586Sdelphij			pimg->skip_image = TRUE;
384258586Sdelphij			break;
385231663Sluigi	}
386231663Sluigi
387231663Sluigi}
388231663Sluigi
389231663Sluigistatic int
390258586Sdelphijoce_sh_be3_flashdata(POCE_SOFTC sc, const struct firmware *fw, int32_t num_imgs)
391231663Sluigi{
392231663Sluigi	char cookie[2][16] =    {"*** SE FLAS", "H DIRECTORY *** "};
393231663Sluigi	const char *p = (const char *)fw->data;
394231663Sluigi	const struct flash_sec_info *fsec = NULL;
395231663Sluigi	struct mbx_common_read_write_flashrom *req;
396258586Sdelphij	int rc = 0, i, bin_offset = 0, opcode, num_bytes;
397231663Sluigi	OCE_DMA_MEM dma_mem;
398258586Sdelphij	struct flash_img_attri imgatt;
399231663Sluigi
400231663Sluigi	/* Validate Cookie */
401231663Sluigi	bin_offset = (sizeof(struct flash_file_hdr) +
402258586Sdelphij			(num_imgs * sizeof(struct image_hdr)));
403231663Sluigi	p += bin_offset;
404231663Sluigi	while (p < ((const char *)fw->data + fw->datasize)) {
405231663Sluigi		fsec = (const struct flash_sec_info *)p;
406231663Sluigi		if (!memcmp(cookie, fsec->cookie, sizeof(cookie)))
407231663Sluigi			break;
408231663Sluigi		fsec = NULL;
409231663Sluigi		p += 32;
410231663Sluigi	}
411231663Sluigi
412231663Sluigi	if (!fsec) {
413231663Sluigi		device_printf(sc->dev,
414258586Sdelphij				"Invalid Cookie. Firmware image corrupted ?\n");
415231663Sluigi		return EINVAL;
416231663Sluigi	}
417231663Sluigi
418258586Sdelphij	rc = oce_dma_alloc(sc, sizeof(struct mbx_common_read_write_flashrom),
419258586Sdelphij				&dma_mem, 0);
420231663Sluigi	if (rc) {
421231663Sluigi		device_printf(sc->dev,
422258586Sdelphij				"Memory allocation failure while flashing\n");
423231663Sluigi		return ENOMEM;
424231663Sluigi	}
425231663Sluigi	req = OCE_DMAPTR(&dma_mem, struct mbx_common_read_write_flashrom);
426231663Sluigi
427258586Sdelphij	if (IS_SH(sc))
428258586Sdelphij		num_imgs = HOST_32(fsec->fsec_hdr.num_images);
429258586Sdelphij	else if (IS_BE3(sc))
430258586Sdelphij		num_imgs = MAX_FLASH_COMP;
431231663Sluigi
432258586Sdelphij	for (i = 0; i < num_imgs; i++) {
433258586Sdelphij
434258586Sdelphij		bzero(&imgatt, sizeof(struct flash_img_attri));
435258586Sdelphij
436258586Sdelphij		oce_fill_flash_img_data(sc, fsec, &imgatt, i, fw, bin_offset);
437258586Sdelphij
438258586Sdelphij		if (imgatt.skip_image)
439231663Sluigi			continue;
440231663Sluigi
441231663Sluigi		p = fw->data;
442258586Sdelphij		p = p + bin_offset + imgatt.img_offset;
443258586Sdelphij
444258586Sdelphij		if ((p + imgatt.img_size) > ((const char *)fw->data + fw->datasize)) {
445231663Sluigi			rc = 1;
446231663Sluigi			goto ret;
447231663Sluigi		}
448231663Sluigi
449258586Sdelphij		while (imgatt.img_size) {
450231663Sluigi
451258586Sdelphij			if (imgatt.img_size > 32*1024)
452231663Sluigi				num_bytes = 32*1024;
453231663Sluigi			else
454258586Sdelphij				num_bytes = imgatt.img_size;
455258586Sdelphij			imgatt.img_size -= num_bytes;
456231663Sluigi
457258586Sdelphij			if (!imgatt.img_size)
458231663Sluigi				opcode = FLASHROM_OPER_FLASH;
459231663Sluigi			else
460231663Sluigi				opcode = FLASHROM_OPER_SAVE;
461231663Sluigi
462231663Sluigi			memcpy(req->data_buffer, p, num_bytes);
463231663Sluigi			p += num_bytes;
464231663Sluigi
465258586Sdelphij			rc = oce_mbox_write_flashrom(sc, imgatt.optype, opcode,
466258586Sdelphij					&dma_mem, num_bytes);
467231663Sluigi			if (rc) {
468231663Sluigi				device_printf(sc->dev,
469258586Sdelphij						"cmd to write to flash rom failed.\n");
470231663Sluigi				rc = EIO;
471231663Sluigi				goto ret;
472231663Sluigi			}
473231663Sluigi			/* Leave the CPU for others for some time */
474231663Sluigi			pause("yield", 10);
475231663Sluigi
476231663Sluigi		}
477258586Sdelphij
478231663Sluigi	}
479258586Sdelphij
480231663Sluigiret:
481231663Sluigi	oce_dma_free(sc, &dma_mem);
482231663Sluigi	return rc;
483258586Sdelphij}
484231663Sluigi
485258586Sdelphij#define UFI_TYPE2		2
486258586Sdelphij#define UFI_TYPE3		3
487258586Sdelphij#define UFI_TYPE3R		10
488258586Sdelphij#define UFI_TYPE4		4
489258586Sdelphij#define UFI_TYPE4R		11
490258586Sdelphijstatic int oce_get_ufi_type(POCE_SOFTC sc,
491258586Sdelphij			    const struct flash_file_hdr *fhdr)
492258586Sdelphij{
493258586Sdelphij	if (fhdr == NULL)
494258586Sdelphij		goto be_get_ufi_exit;
495258586Sdelphij
496258586Sdelphij	if (IS_SH(sc) && fhdr->build[0] == '4') {
497258586Sdelphij		if (fhdr->asic_type_rev >= 0x10)
498258586Sdelphij			return UFI_TYPE4R;
499258586Sdelphij		else
500258586Sdelphij			return UFI_TYPE4;
501258586Sdelphij	} else if (IS_BE3(sc) && fhdr->build[0] == '3') {
502258586Sdelphij		if (fhdr->asic_type_rev == 0x10)
503258586Sdelphij			return UFI_TYPE3R;
504258586Sdelphij		else
505258586Sdelphij			return UFI_TYPE3;
506258586Sdelphij	} else if (IS_BE2(sc) && fhdr->build[0] == '2')
507258586Sdelphij		return UFI_TYPE2;
508258586Sdelphij
509258586Sdelphijbe_get_ufi_exit:
510258586Sdelphij	device_printf(sc->dev,
511258586Sdelphij		"UFI and Interface are not compatible for flashing\n");
512258586Sdelphij	return -1;
513231663Sluigi}
514231663Sluigi
515231663Sluigi
516258586Sdelphijstatic int
517258586Sdelphijoce_skyhawk_fwupgrade(POCE_SOFTC sc, const struct firmware *fw)
518258586Sdelphij{
519258586Sdelphij	int rc = 0, num_imgs = 0, i = 0, ufi_type;
520258586Sdelphij	const struct flash_file_hdr *fhdr;
521258586Sdelphij	const struct image_hdr *img_ptr;
522258586Sdelphij
523258586Sdelphij	fhdr = (const struct flash_file_hdr *)fw->data;
524258586Sdelphij
525258586Sdelphij	ufi_type = oce_get_ufi_type(sc, fhdr);
526258586Sdelphij
527258586Sdelphij	/* Display flash version */
528258586Sdelphij	device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]);
529258586Sdelphij
530258586Sdelphij	num_imgs = fhdr->num_imgs;
531258586Sdelphij	for (i = 0; i < num_imgs; i++) {
532258586Sdelphij		img_ptr = (const struct image_hdr *)((const char *)fw->data +
533258586Sdelphij				sizeof(struct flash_file_hdr) +
534258586Sdelphij				(i * sizeof(struct image_hdr)));
535258586Sdelphij
536258586Sdelphij		if (img_ptr->imageid != 1)
537258586Sdelphij			continue;
538258586Sdelphij
539258586Sdelphij		switch (ufi_type) {
540258586Sdelphij			case UFI_TYPE4R:
541258586Sdelphij				rc = oce_sh_be3_flashdata(sc, fw,
542258586Sdelphij						num_imgs);
543258586Sdelphij				break;
544258586Sdelphij			case UFI_TYPE4:
545258586Sdelphij				if (sc->asic_revision < 0x10)
546258586Sdelphij					rc = oce_sh_be3_flashdata(sc, fw,
547258586Sdelphij								   num_imgs);
548258586Sdelphij				else {
549258586Sdelphij					rc = -1;
550258586Sdelphij					device_printf(sc->dev,
551258586Sdelphij						"Cant load SH A0 UFI on B0\n");
552258586Sdelphij				}
553258586Sdelphij				break;
554258586Sdelphij			default:
555258586Sdelphij				rc = -1;
556258586Sdelphij				break;
557258586Sdelphij
558258586Sdelphij		}
559258586Sdelphij	}
560258586Sdelphij
561258586Sdelphij	return rc;
562258586Sdelphij}
563258586Sdelphij
564258586Sdelphijstatic int
565258586Sdelphijoce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw)
566258586Sdelphij{
567258586Sdelphij	int rc = 0, num_imgs = 0, i = 0;
568258586Sdelphij	const struct flash_file_hdr *fhdr;
569258586Sdelphij	const struct image_hdr *img_ptr;
570258586Sdelphij
571258586Sdelphij	fhdr = (const struct flash_file_hdr *)fw->data;
572258586Sdelphij	if (fhdr->build[0] != '3') {
573258586Sdelphij		device_printf(sc->dev, "Invalid BE3 firmware image\n");
574258586Sdelphij		return EINVAL;
575258586Sdelphij	}
576258586Sdelphij	/* Display flash version */
577258586Sdelphij	device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]);
578258586Sdelphij
579258586Sdelphij	num_imgs = fhdr->num_imgs;
580258586Sdelphij	for (i = 0; i < num_imgs; i++) {
581258586Sdelphij		img_ptr = (const struct image_hdr *)((const char *)fw->data +
582258586Sdelphij				sizeof(struct flash_file_hdr) +
583258586Sdelphij				(i * sizeof(struct image_hdr)));
584258586Sdelphij		if (img_ptr->imageid == 1) {
585258586Sdelphij			rc = oce_sh_be3_flashdata(sc, fw, num_imgs);
586258586Sdelphij
587258586Sdelphij			break;
588258586Sdelphij		}
589258586Sdelphij	}
590258586Sdelphij
591258586Sdelphij	return rc;
592258586Sdelphij}
593258586Sdelphij
594258586Sdelphij
595231663Sluigistatic boolean_t
596231663Sluigioce_phy_flashing_required(POCE_SOFTC sc)
597231663Sluigi{
598231663Sluigi	int status = 0;
599231663Sluigi	struct oce_phy_info phy_info;
600231663Sluigi
601231663Sluigi	status = oce_mbox_get_phy_info(sc, &phy_info);
602231663Sluigi	if (status)
603231663Sluigi		return FALSE;
604231663Sluigi
605231663Sluigi	if ((phy_info.phy_type == TN_8022) &&
606231663Sluigi		(phy_info.interface_type == PHY_TYPE_BASET_10GB)) {
607231663Sluigi		return TRUE;
608231663Sluigi	}
609231663Sluigi
610231663Sluigi	return FALSE;
611231663Sluigi}
612231663Sluigi
613231663Sluigi
614231663Sluigistatic boolean_t
615231663Sluigioce_img_flashing_required(POCE_SOFTC sc, const char *p,
616231663Sluigi				int img_optype, uint32_t img_offset,
617231663Sluigi				uint32_t img_size, uint32_t hdrs_size)
618231663Sluigi{
619231663Sluigi	uint32_t crc_offset;
620231663Sluigi	uint8_t flashed_crc[4];
621231663Sluigi	int status;
622231663Sluigi
623231663Sluigi	crc_offset = hdrs_size + img_offset + img_size - 4;
624231663Sluigi
625231663Sluigi	p += crc_offset;
626231663Sluigi
627231663Sluigi	status = oce_mbox_get_flashrom_crc(sc, flashed_crc,
628231663Sluigi			(img_size - 4), img_optype);
629231663Sluigi	if (status)
630231663Sluigi		return TRUE; /* Some thing worng. ReFlash */
631231663Sluigi
632231663Sluigi	/*update redboot only if crc does not match*/
633231663Sluigi	if (bcmp(flashed_crc, p, 4))
634231663Sluigi		return TRUE;
635231663Sluigi	else
636231663Sluigi		return FALSE;
637231663Sluigi}
638231663Sluigi
639231663Sluigi
640231663Sluigistatic int
641231663Sluigioce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw)
642231663Sluigi{
643231663Sluigi
644231663Sluigi	int rc = 0;
645231663Sluigi	OCE_DMA_MEM dma_mem;
646231663Sluigi	const uint8_t *data = NULL;
647231663Sluigi	uint8_t *dest_image_ptr = NULL;
648231663Sluigi	size_t size = 0;
649231663Sluigi	uint32_t data_written = 0, chunk_size = 0;
650231663Sluigi	uint32_t offset = 0, add_status = 0;
651231663Sluigi
652231663Sluigi	if (!IS_ALIGNED(fw->datasize, sizeof(uint32_t))) {
653231663Sluigi		device_printf(sc->dev,
654231663Sluigi			"Lancer FW image is not 4 byte aligned.");
655231663Sluigi		return EINVAL;
656231663Sluigi	}
657231663Sluigi
658231663Sluigi	rc = oce_dma_alloc(sc, 32*1024, &dma_mem, 0);
659231663Sluigi	if (rc) {
660231663Sluigi		device_printf(sc->dev,
661231663Sluigi			"Memory allocation failure while flashing Lancer\n");
662231663Sluigi		return ENOMEM;
663231663Sluigi	}
664231663Sluigi
665231663Sluigi	size = fw->datasize;
666231663Sluigi	data = fw->data;
667231663Sluigi	dest_image_ptr = OCE_DMAPTR(&dma_mem, uint8_t);
668231663Sluigi
669231663Sluigi	while (size) {
670231663Sluigi		chunk_size = MIN(size, (32*1024));
671231663Sluigi
672231663Sluigi		bcopy(data, dest_image_ptr, chunk_size);
673231663Sluigi
674231663Sluigi		rc = oce_mbox_lancer_write_flashrom(sc, chunk_size, offset,
675231663Sluigi				&dma_mem, &data_written, &add_status);
676231663Sluigi
677231663Sluigi		if (rc)
678231663Sluigi			break;
679231663Sluigi
680231663Sluigi		size	-= data_written;
681231663Sluigi		data	+= data_written;
682231663Sluigi		offset	+= data_written;
683231663Sluigi		pause("yield", 10);
684231663Sluigi
685231663Sluigi	}
686231663Sluigi
687231663Sluigi	if (!rc)
688231663Sluigi		/* Commit the firmware*/
689231663Sluigi		rc = oce_mbox_lancer_write_flashrom(sc, 0, offset, &dma_mem,
690231663Sluigi						&data_written, &add_status);
691231663Sluigi	if (rc) {
692231663Sluigi		device_printf(sc->dev, "Lancer firmware load error. "
693231663Sluigi			"Addstatus = 0x%x, status = %d \n", add_status, rc);
694231663Sluigi		rc = EIO;
695231663Sluigi	}
696231663Sluigi	oce_dma_free(sc, &dma_mem);
697231663Sluigi	return rc;
698231663Sluigi
699231663Sluigi}
700231663Sluigi
701231663Sluigi
702231663Sluigistatic void
703231663Sluigioce_add_stats_sysctls_be3(POCE_SOFTC sc,
704231663Sluigi				  struct sysctl_ctx_list *ctx,
705231663Sluigi				  struct sysctl_oid *stats_node)
706231663Sluigi{
707231663Sluigi	struct sysctl_oid *rx_stats_node, *tx_stats_node;
708231663Sluigi	struct sysctl_oid_list *rx_stat_list, *tx_stat_list;
709231663Sluigi	struct sysctl_oid_list *queue_stats_list;
710231663Sluigi	struct sysctl_oid *queue_stats_node;
711231663Sluigi	struct oce_drv_stats *stats;
712231663Sluigi	char prefix[32];
713231663Sluigi	int i;
714231663Sluigi
715231663Sluigi	stats = &sc->oce_stats_info;
716231663Sluigi
717231663Sluigi	rx_stats_node = SYSCTL_ADD_NODE(ctx,
718231663Sluigi					SYSCTL_CHILDREN(stats_node),
719231663Sluigi					OID_AUTO,"rx", CTLFLAG_RD,
720231663Sluigi					NULL, "RX Ethernet Statistics");
721231663Sluigi	rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
722231663Sluigi
723231663Sluigi
724231663Sluigi	SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts",
725231663Sluigi			CTLFLAG_RD, &stats->rx.t_rx_pkts,
726231663Sluigi			"Total Received Packets");
727231663Sluigi	SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes",
728231663Sluigi			CTLFLAG_RD, &stats->rx.t_rx_bytes,
729231663Sluigi			"Total Received Bytes");
730231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags",
731231663Sluigi			CTLFLAG_RD, &stats->rx.t_rx_frags, 0,
732231663Sluigi			"Total Received Fragements");
733231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts",
734231663Sluigi			CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0,
735231663Sluigi			"Total Received Multicast Packets");
736231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts",
737231663Sluigi			CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0,
738231663Sluigi			"Total Received Unicast Packets");
739231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs",
740231663Sluigi			CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0,
741231663Sluigi			"Total Receive completion errors");
742231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames",
743231663Sluigi			CTLFLAG_RD, &stats->u0.be.rx_pause_frames, 0,
744231663Sluigi			"Pause Frames");
745231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "priority_pause_frames",
746231663Sluigi			CTLFLAG_RD, &stats->u0.be.rx_priority_pause_frames, 0,
747231663Sluigi			"Priority Pause Frames");
748231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames",
749231663Sluigi			CTLFLAG_RD, &stats->u0.be.rx_control_frames, 0,
750231663Sluigi			"Control Frames");
751231663Sluigi
752231663Sluigi	for (i = 0; i < sc->nrqs; i++) {
753231663Sluigi		sprintf(prefix, "queue%d",i);
754231663Sluigi		queue_stats_node = SYSCTL_ADD_NODE(ctx,
755231663Sluigi						SYSCTL_CHILDREN(rx_stats_node),
756231663Sluigi						OID_AUTO, prefix, CTLFLAG_RD,
757231663Sluigi						NULL, "Queue name");
758231663Sluigi		queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
759231663Sluigi
760231663Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts",
761231663Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts,
762231663Sluigi			"Receive Packets");
763231663Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes",
764231663Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes,
765231663Sluigi			"Recived Bytes");
766231663Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags",
767231663Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0,
768231663Sluigi			"Received Fragments");
769231663Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
770231663Sluigi				"rx_mcast_pkts", CTLFLAG_RD,
771231663Sluigi				&sc->rq[i]->rx_stats.rx_mcast_pkts, 0,
772231663Sluigi					"Received Multicast Packets");
773231663Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
774231663Sluigi				"rx_ucast_pkts", CTLFLAG_RD,
775231663Sluigi				&sc->rq[i]->rx_stats.rx_ucast_pkts, 0,
776231663Sluigi					"Received Unicast Packets");
777231663Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err",
778231663Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0,
779231663Sluigi			"Received Completion Errors");
780231663Sluigi
781231663Sluigi	}
782231663Sluigi
783231663Sluigi	rx_stats_node = SYSCTL_ADD_NODE(ctx,
784231663Sluigi					SYSCTL_CHILDREN(rx_stats_node),
785231663Sluigi					OID_AUTO, "err", CTLFLAG_RD,
786231663Sluigi					NULL, "Receive Error Stats");
787231663Sluigi	rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
788231663Sluigi
789231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs",
790231663Sluigi			CTLFLAG_RD, &stats->u0.be.rx_crc_errors, 0,
791231663Sluigi			"CRC Errors");
792231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pbuf_errors",
793231663Sluigi			CTLFLAG_RD, &stats->u0.be.rx_drops_no_pbuf, 0,
794231663Sluigi			"Drops due to pbuf full");
795231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "erx_errors",
796231663Sluigi			CTLFLAG_RD, &stats->u0.be.rx_drops_no_erx_descr, 0,
797231663Sluigi			"ERX Errors");
798231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors",
799231663Sluigi			CTLFLAG_RD, &stats->u0.be.rx_drops_too_many_frags, 0,
800231663Sluigi			"RX Alignmnet Errors");
801231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors",
802231663Sluigi			CTLFLAG_RD, &stats->u0.be.rx_in_range_errors, 0,
803231663Sluigi			"In Range Errors");
804231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors",
805231663Sluigi			CTLFLAG_RD, &stats->u0.be.rx_out_range_errors, 0,
806231663Sluigi			"Out Range Errors");
807231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long",
808231663Sluigi			CTLFLAG_RD, &stats->u0.be.rx_frame_too_long, 0,
809231663Sluigi			"Frame Too Long");
810231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors",
811231663Sluigi			CTLFLAG_RD, &stats->u0.be.rx_address_match_errors, 0,
812231663Sluigi			"Address Match Errors");
813231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small",
814231663Sluigi			CTLFLAG_RD, &stats->u0.be.rx_dropped_too_small, 0,
815231663Sluigi			"Dropped Too Small");
816231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short",
817231663Sluigi			CTLFLAG_RD, &stats->u0.be.rx_dropped_too_short, 0,
818231663Sluigi			"Dropped Too Short");
819231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
820231663Sluigi			"dropped_header_too_small", CTLFLAG_RD,
821231663Sluigi			&stats->u0.be.rx_dropped_header_too_small, 0,
822231663Sluigi			"Dropped Header Too Small");
823231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_tcp_length",
824231663Sluigi			CTLFLAG_RD, &stats->u0.be.rx_dropped_tcp_length, 0,
825231663Sluigi			"Dropped TCP Length");
826231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt",
827231663Sluigi			CTLFLAG_RD, &stats->u0.be.rx_dropped_runt, 0,
828231663Sluigi			"Dropped runt");
829231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs",
830231663Sluigi			CTLFLAG_RD, &stats->u0.be.rx_ip_checksum_errs, 0,
831231663Sluigi			"IP Checksum Errors");
832231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs",
833231663Sluigi			CTLFLAG_RD, &stats->u0.be.rx_tcp_checksum_errs, 0,
834231663Sluigi			"TCP Checksum Errors");
835231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs",
836231663Sluigi			CTLFLAG_RD, &stats->u0.be.rx_udp_checksum_errs, 0,
837231663Sluigi			"UDP Checksum Errors");
838231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "fifo_overflow_drop",
839231663Sluigi			CTLFLAG_RD, &stats->u0.be.rxpp_fifo_overflow_drop, 0,
840231663Sluigi			"FIFO Overflow Drop");
841231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
842231663Sluigi			"input_fifo_overflow_drop", CTLFLAG_RD,
843231663Sluigi			&stats->u0.be.rx_input_fifo_overflow_drop, 0,
844231663Sluigi			"Input FIFO Overflow Drop");
845231663Sluigi
846231663Sluigi	tx_stats_node = SYSCTL_ADD_NODE(ctx,
847231663Sluigi					SYSCTL_CHILDREN(stats_node), OID_AUTO,
848231663Sluigi					"tx",CTLFLAG_RD, NULL,
849231663Sluigi					"TX Ethernet Statistics");
850231663Sluigi	tx_stat_list = SYSCTL_CHILDREN(tx_stats_node);
851231663Sluigi
852231663Sluigi	SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts",
853231663Sluigi			CTLFLAG_RD, &stats->tx.t_tx_pkts,
854231663Sluigi			"Total Transmit Packets");
855231663Sluigi	SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes",
856231663Sluigi			CTLFLAG_RD, &stats->tx.t_tx_bytes,
857231663Sluigi			"Total Transmit Bytes");
858231663Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs",
859231663Sluigi			CTLFLAG_RD, &stats->tx.t_tx_reqs, 0,
860231663Sluigi			"Total Transmit Requests");
861231663Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops",
862231663Sluigi			CTLFLAG_RD, &stats->tx.t_tx_stops, 0,
863231663Sluigi			"Total Transmit Stops");
864231663Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs",
865231663Sluigi			CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0,
866231663Sluigi			"Total Transmit WRB's");
867231663Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl",
868231663Sluigi			CTLFLAG_RD, &stats->tx.t_tx_compl, 0,
869231663Sluigi			"Total Transmit Completions");
870231663Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO,
871231663Sluigi			"total_ipv6_ext_hdr_tx_drop", CTLFLAG_RD,
872231663Sluigi			&stats->tx.t_ipv6_ext_hdr_tx_drop, 0,
873231663Sluigi			"Total Transmit IPV6 Drops");
874231663Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes",
875231663Sluigi			CTLFLAG_RD, &stats->u0.be.tx_pauseframes, 0,
876231663Sluigi			"Pause Frames");
877231663Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "priority_pauseframes",
878231663Sluigi			CTLFLAG_RD, &stats->u0.be.tx_priority_pauseframes, 0,
879231663Sluigi			"Priority Pauseframes");
880231663Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes",
881231663Sluigi			CTLFLAG_RD, &stats->u0.be.tx_controlframes, 0,
882231663Sluigi			"Tx Control Frames");
883231663Sluigi
884231663Sluigi	for (i = 0; i < sc->nwqs; i++) {
885231663Sluigi		sprintf(prefix, "queue%d",i);
886231663Sluigi		queue_stats_node = SYSCTL_ADD_NODE(ctx,
887231663Sluigi						SYSCTL_CHILDREN(tx_stats_node),
888231663Sluigi						OID_AUTO, prefix, CTLFLAG_RD,
889231663Sluigi						NULL, "Queue name");
890231663Sluigi		queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
891231663Sluigi
892231663Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts",
893231663Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts,
894231663Sluigi			"Transmit Packets");
895231663Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes",
896231663Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes,
897231663Sluigi			"Transmit Bytes");
898231663Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs",
899231663Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0,
900231663Sluigi			"Transmit Requests");
901231663Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops",
902231663Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0,
903231663Sluigi			"Transmit Stops");
904231663Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs",
905231663Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0,
906231663Sluigi			"Transmit WRB's");
907231663Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl",
908231663Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0,
909231663Sluigi			"Transmit Completions");
910231663Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
911231663Sluigi			"ipv6_ext_hdr_tx_drop",CTLFLAG_RD,
912231663Sluigi			&sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0,
913231663Sluigi			"Transmit IPV6 Ext Header Drop");
914231663Sluigi
915231663Sluigi	}
916231663Sluigi	return;
917231663Sluigi}
918231663Sluigi
919231663Sluigi
920231663Sluigistatic void
921231663Sluigioce_add_stats_sysctls_xe201(POCE_SOFTC sc,
922231663Sluigi				  struct sysctl_ctx_list *ctx,
923231663Sluigi				  struct sysctl_oid *stats_node)
924231663Sluigi{
925231663Sluigi	struct sysctl_oid *rx_stats_node, *tx_stats_node;
926231663Sluigi	struct sysctl_oid_list *rx_stat_list, *tx_stat_list;
927231663Sluigi	struct sysctl_oid_list *queue_stats_list;
928231663Sluigi	struct sysctl_oid *queue_stats_node;
929231663Sluigi	struct oce_drv_stats *stats;
930231663Sluigi	char prefix[32];
931231663Sluigi	int i;
932231663Sluigi
933231663Sluigi	stats = &sc->oce_stats_info;
934231663Sluigi
935231663Sluigi	rx_stats_node = SYSCTL_ADD_NODE(ctx,
936231663Sluigi					SYSCTL_CHILDREN(stats_node),
937231663Sluigi					OID_AUTO, "rx", CTLFLAG_RD,
938231663Sluigi					NULL, "RX Ethernet Statistics");
939231663Sluigi	rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
940231663Sluigi
941231663Sluigi
942231663Sluigi	SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts",
943231663Sluigi			CTLFLAG_RD, &stats->rx.t_rx_pkts,
944231663Sluigi			"Total Received Packets");
945231663Sluigi	SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes",
946231663Sluigi			CTLFLAG_RD, &stats->rx.t_rx_bytes,
947231663Sluigi			"Total Received Bytes");
948231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags",
949231663Sluigi			CTLFLAG_RD, &stats->rx.t_rx_frags, 0,
950231663Sluigi			"Total Received Fragements");
951231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts",
952231663Sluigi			CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0,
953231663Sluigi			"Total Received Multicast Packets");
954231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts",
955231663Sluigi			CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0,
956231663Sluigi			"Total Received Unicast Packets");
957231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs",
958231663Sluigi			CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0,
959231663Sluigi			"Total Receive completion errors");
960231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames",
961231663Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_pause_frames, 0,
962231663Sluigi			"Pause Frames");
963231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames",
964231663Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_control_frames, 0,
965231663Sluigi			"Control Frames");
966231663Sluigi
967231663Sluigi	for (i = 0; i < sc->nrqs; i++) {
968231663Sluigi		sprintf(prefix, "queue%d",i);
969231663Sluigi		queue_stats_node = SYSCTL_ADD_NODE(ctx,
970231663Sluigi						SYSCTL_CHILDREN(rx_stats_node),
971231663Sluigi						OID_AUTO, prefix, CTLFLAG_RD,
972231663Sluigi						NULL, "Queue name");
973231663Sluigi		queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
974231663Sluigi
975231663Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts",
976231663Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts,
977231663Sluigi			"Receive Packets");
978231663Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes",
979231663Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes,
980231663Sluigi			"Recived Bytes");
981231663Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags",
982231663Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0,
983231663Sluigi			"Received Fragments");
984231663Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
985231663Sluigi			"rx_mcast_pkts", CTLFLAG_RD,
986231663Sluigi			&sc->rq[i]->rx_stats.rx_mcast_pkts, 0,
987231663Sluigi			"Received Multicast Packets");
988231663Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
989231663Sluigi			"rx_ucast_pkts",CTLFLAG_RD,
990231663Sluigi			&sc->rq[i]->rx_stats.rx_ucast_pkts, 0,
991231663Sluigi			"Received Unicast Packets");
992231663Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err",
993231663Sluigi			CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0,
994231663Sluigi			"Received Completion Errors");
995231663Sluigi
996231663Sluigi	}
997231663Sluigi
998231663Sluigi	rx_stats_node = SYSCTL_ADD_NODE(ctx,
999231663Sluigi					SYSCTL_CHILDREN(rx_stats_node),
1000231663Sluigi					OID_AUTO, "err", CTLFLAG_RD,
1001231663Sluigi					NULL, "Receive Error Stats");
1002231663Sluigi	rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
1003231663Sluigi
1004231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs",
1005231663Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_crc_errors, 0,
1006231663Sluigi			"CRC Errors");
1007231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors",
1008231663Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_alignment_errors, 0,
1009231663Sluigi			"RX Alignmnet Errors");
1010231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors",
1011231663Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_in_range_errors, 0,
1012231663Sluigi			"In Range Errors");
1013231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors",
1014231663Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_out_of_range_errors, 0,
1015231663Sluigi			"Out Range Errors");
1016231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long",
1017231663Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_frames_too_long, 0,
1018231663Sluigi			"Frame Too Long");
1019231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors",
1020231663Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_address_match_errors, 0,
1021231663Sluigi			"Address Match Errors");
1022231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small",
1023231663Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_small, 0,
1024231663Sluigi			"Dropped Too Small");
1025231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short",
1026231663Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_short, 0,
1027231663Sluigi			"Dropped Too Short");
1028231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
1029231663Sluigi			"dropped_header_too_small", CTLFLAG_RD,
1030231663Sluigi			&stats->u0.xe201.rx_dropped_header_too_small, 0,
1031231663Sluigi			"Dropped Header Too Small");
1032231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
1033231663Sluigi			"dropped_tcp_length", CTLFLAG_RD,
1034231663Sluigi			&stats->u0.xe201.rx_dropped_invalid_tcp_length, 0,
1035231663Sluigi			"Dropped TCP Length");
1036231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt",
1037231663Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_dropped_runt, 0,
1038231663Sluigi			"Dropped runt");
1039231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs",
1040231663Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_ip_checksum_errors, 0,
1041231663Sluigi			"IP Checksum Errors");
1042231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs",
1043231663Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_tcp_checksum_errors, 0,
1044231663Sluigi			"TCP Checksum Errors");
1045231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs",
1046231663Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_udp_checksum_errors, 0,
1047231663Sluigi			"UDP Checksum Errors");
1048231663Sluigi	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "input_fifo_overflow_drop",
1049231663Sluigi			CTLFLAG_RD, &stats->u0.xe201.rx_fifo_overflow, 0,
1050231663Sluigi			"Input FIFO Overflow Drop");
1051231663Sluigi
1052231663Sluigi	tx_stats_node = SYSCTL_ADD_NODE(ctx,
1053231663Sluigi					SYSCTL_CHILDREN(stats_node),
1054231663Sluigi					OID_AUTO, "tx", CTLFLAG_RD,
1055231663Sluigi					NULL, "TX Ethernet Statistics");
1056231663Sluigi	tx_stat_list = SYSCTL_CHILDREN(tx_stats_node);
1057231663Sluigi
1058231663Sluigi	SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts",
1059231663Sluigi			CTLFLAG_RD, &stats->tx.t_tx_pkts,
1060231663Sluigi			"Total Transmit Packets");
1061231663Sluigi	SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes",
1062231663Sluigi			CTLFLAG_RD, &stats->tx.t_tx_bytes,
1063231663Sluigi			"Total Transmit Bytes");
1064231663Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs",
1065231663Sluigi			CTLFLAG_RD, &stats->tx.t_tx_reqs, 0,
1066231663Sluigi			"Total Transmit Requests");
1067231663Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops",
1068231663Sluigi			CTLFLAG_RD, &stats->tx.t_tx_stops, 0,
1069231663Sluigi			"Total Transmit Stops");
1070231663Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs",
1071231663Sluigi			CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0,
1072231663Sluigi			"Total Transmit WRB's");
1073231663Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl",
1074231663Sluigi			CTLFLAG_RD, &stats->tx.t_tx_compl, 0,
1075231663Sluigi			"Total Transmit Completions");
1076231663Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO,
1077231663Sluigi			"total_ipv6_ext_hdr_tx_drop",
1078231663Sluigi			CTLFLAG_RD, &stats->tx.t_ipv6_ext_hdr_tx_drop, 0,
1079231663Sluigi			"Total Transmit IPV6 Drops");
1080231663Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes",
1081231663Sluigi			CTLFLAG_RD, &stats->u0.xe201.tx_pause_frames, 0,
1082231663Sluigi			"Pause Frames");
1083231663Sluigi	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes",
1084231663Sluigi			CTLFLAG_RD, &stats->u0.xe201.tx_control_frames, 0,
1085231663Sluigi			"Tx Control Frames");
1086231663Sluigi
1087231663Sluigi	for (i = 0; i < sc->nwqs; i++) {
1088231663Sluigi		sprintf(prefix, "queue%d",i);
1089231663Sluigi		queue_stats_node = SYSCTL_ADD_NODE(ctx,
1090231663Sluigi						SYSCTL_CHILDREN(tx_stats_node),
1091231663Sluigi						OID_AUTO, prefix, CTLFLAG_RD,
1092231663Sluigi						NULL, "Queue name");
1093231663Sluigi		queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
1094231663Sluigi
1095231663Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts",
1096231663Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts,
1097231663Sluigi			"Transmit Packets");
1098231663Sluigi		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes",
1099231663Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes,
1100231663Sluigi			"Transmit Bytes");
1101231663Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs",
1102231663Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0,
1103231663Sluigi			"Transmit Requests");
1104231663Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops",
1105231663Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0,
1106231663Sluigi			"Transmit Stops");
1107231663Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs",
1108231663Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0,
1109231663Sluigi			"Transmit WRB's");
1110231663Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl",
1111231663Sluigi			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0,
1112231663Sluigi			"Transmit Completions");
1113231663Sluigi		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
1114231663Sluigi			"ipv6_ext_hdr_tx_drop", CTLFLAG_RD,
1115231663Sluigi			&sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0,
1116231663Sluigi			"Transmit IPV6 Ext Header Drop");
1117231663Sluigi
1118231663Sluigi	}
1119231663Sluigi	return;
1120231663Sluigi}
1121231663Sluigi
1122231663Sluigi
1123231663Sluigivoid
1124231663Sluigioce_refresh_queue_stats(POCE_SOFTC sc)
1125231663Sluigi{
1126231663Sluigi	struct oce_drv_stats *adapter_stats;
1127231663Sluigi	int i;
1128231663Sluigi
1129231663Sluigi	adapter_stats = &sc->oce_stats_info;
1130231663Sluigi
1131231663Sluigi	/* Caluculate total TX and TXstats from all queues */
1132231663Sluigi
1133231663Sluigi	bzero(&adapter_stats->rx, sizeof(struct oce_rx_stats));
1134231663Sluigi	for (i = 0; i < sc->nrqs; i++) {
1135231663Sluigi
1136231663Sluigi		adapter_stats->rx.t_rx_pkts += sc->rq[i]->rx_stats.rx_pkts;
1137231663Sluigi		adapter_stats->rx.t_rx_bytes += sc->rq[i]->rx_stats.rx_bytes;
1138231663Sluigi		adapter_stats->rx.t_rx_frags += sc->rq[i]->rx_stats.rx_frags;
1139231663Sluigi		adapter_stats->rx.t_rx_mcast_pkts +=
1140231663Sluigi					sc->rq[i]->rx_stats.rx_mcast_pkts;
1141231663Sluigi		adapter_stats->rx.t_rx_ucast_pkts +=
1142231663Sluigi					sc->rq[i]->rx_stats.rx_ucast_pkts;
1143231663Sluigi		adapter_stats->rx.t_rxcp_errs += sc-> rq[i]->rx_stats.rxcp_err;
1144231663Sluigi	}
1145231663Sluigi
1146231663Sluigi	bzero(&adapter_stats->tx, sizeof(struct oce_tx_stats));
1147231663Sluigi	for (i = 0; i < sc->nwqs; i++) {
1148231663Sluigi		adapter_stats->tx.t_tx_reqs += sc->wq[i]->tx_stats.tx_reqs;
1149231663Sluigi		adapter_stats->tx.t_tx_stops += sc->wq[i]->tx_stats.tx_stops;
1150231663Sluigi		adapter_stats->tx.t_tx_wrbs += sc->wq[i]->tx_stats.tx_wrbs;
1151231663Sluigi		adapter_stats->tx.t_tx_compl += sc->wq[i]->tx_stats.tx_compl;
1152231663Sluigi		adapter_stats->tx.t_tx_bytes += sc->wq[i]->tx_stats.tx_bytes;
1153231663Sluigi		adapter_stats->tx.t_tx_pkts += sc->wq[i]->tx_stats.tx_pkts;
1154231663Sluigi		adapter_stats->tx.t_ipv6_ext_hdr_tx_drop +=
1155231663Sluigi				sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop;
1156231663Sluigi	}
1157231663Sluigi
1158231663Sluigi}
1159231663Sluigi
1160231663Sluigi
1161231663Sluigi
1162231663Sluigistatic void
1163231663Sluigicopy_stats_to_sc_xe201(POCE_SOFTC sc)
1164231663Sluigi{
1165231663Sluigi	struct oce_xe201_stats *adapter_stats;
1166231663Sluigi	struct mbx_get_pport_stats *nic_mbx;
1167231663Sluigi	struct pport_stats *port_stats;
1168231663Sluigi
1169231663Sluigi	nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_pport_stats);
1170231663Sluigi	port_stats = &nic_mbx->params.rsp.pps;
1171231663Sluigi	adapter_stats = &sc->oce_stats_info.u0.xe201;
1172231663Sluigi
1173231663Sluigi	adapter_stats->tx_pkts = port_stats->tx_pkts;
1174231663Sluigi	adapter_stats->tx_unicast_pkts = port_stats->tx_unicast_pkts;
1175231663Sluigi	adapter_stats->tx_multicast_pkts = port_stats->tx_multicast_pkts;
1176231663Sluigi	adapter_stats->tx_broadcast_pkts = port_stats->tx_broadcast_pkts;
1177231663Sluigi	adapter_stats->tx_bytes = port_stats->tx_bytes;
1178231663Sluigi	adapter_stats->tx_unicast_bytes = port_stats->tx_unicast_bytes;
1179231663Sluigi	adapter_stats->tx_multicast_bytes = port_stats->tx_multicast_bytes;
1180231663Sluigi	adapter_stats->tx_broadcast_bytes = port_stats->tx_broadcast_bytes;
1181231663Sluigi	adapter_stats->tx_discards = port_stats->tx_discards;
1182231663Sluigi	adapter_stats->tx_errors = port_stats->tx_errors;
1183231663Sluigi	adapter_stats->tx_pause_frames = port_stats->tx_pause_frames;
1184231663Sluigi	adapter_stats->tx_pause_on_frames = port_stats->tx_pause_on_frames;
1185231663Sluigi	adapter_stats->tx_pause_off_frames = port_stats->tx_pause_off_frames;
1186231663Sluigi	adapter_stats->tx_internal_mac_errors =
1187231663Sluigi		port_stats->tx_internal_mac_errors;
1188231663Sluigi	adapter_stats->tx_control_frames = port_stats->tx_control_frames;
1189231663Sluigi	adapter_stats->tx_pkts_64_bytes = port_stats->tx_pkts_64_bytes;
1190231663Sluigi	adapter_stats->tx_pkts_65_to_127_bytes =
1191231663Sluigi		port_stats->tx_pkts_65_to_127_bytes;
1192231663Sluigi	adapter_stats->tx_pkts_128_to_255_bytes =
1193231663Sluigi		port_stats->tx_pkts_128_to_255_bytes;
1194231663Sluigi	adapter_stats->tx_pkts_256_to_511_bytes =
1195231663Sluigi		port_stats->tx_pkts_256_to_511_bytes;
1196231663Sluigi	adapter_stats->tx_pkts_512_to_1023_bytes =
1197231663Sluigi		port_stats->tx_pkts_512_to_1023_bytes;
1198231663Sluigi	adapter_stats->tx_pkts_1024_to_1518_bytes =
1199231663Sluigi		port_stats->tx_pkts_1024_to_1518_bytes;
1200231663Sluigi	adapter_stats->tx_pkts_1519_to_2047_bytes =
1201231663Sluigi		port_stats->tx_pkts_1519_to_2047_bytes;
1202231663Sluigi	adapter_stats->tx_pkts_2048_to_4095_bytes =
1203231663Sluigi		port_stats->tx_pkts_2048_to_4095_bytes;
1204231663Sluigi	adapter_stats->tx_pkts_4096_to_8191_bytes =
1205231663Sluigi		port_stats->tx_pkts_4096_to_8191_bytes;
1206231663Sluigi	adapter_stats->tx_pkts_8192_to_9216_bytes =
1207231663Sluigi		port_stats->tx_pkts_8192_to_9216_bytes;
1208231663Sluigi	adapter_stats->tx_lso_pkts = port_stats->tx_lso_pkts;
1209231663Sluigi	adapter_stats->rx_pkts = port_stats->rx_pkts;
1210231663Sluigi	adapter_stats->rx_unicast_pkts = port_stats->rx_unicast_pkts;
1211231663Sluigi	adapter_stats->rx_multicast_pkts = port_stats->rx_multicast_pkts;
1212231663Sluigi	adapter_stats->rx_broadcast_pkts = port_stats->rx_broadcast_pkts;
1213231663Sluigi	adapter_stats->rx_bytes = port_stats->rx_bytes;
1214231663Sluigi	adapter_stats->rx_unicast_bytes = port_stats->rx_unicast_bytes;
1215231663Sluigi	adapter_stats->rx_multicast_bytes = port_stats->rx_multicast_bytes;
1216231663Sluigi	adapter_stats->rx_broadcast_bytes = port_stats->rx_broadcast_bytes;
1217231663Sluigi	adapter_stats->rx_unknown_protos = port_stats->rx_unknown_protos;
1218231663Sluigi	adapter_stats->rx_discards = port_stats->rx_discards;
1219231663Sluigi	adapter_stats->rx_errors = port_stats->rx_errors;
1220231663Sluigi	adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
1221231663Sluigi	adapter_stats->rx_alignment_errors = port_stats->rx_alignment_errors;
1222231663Sluigi	adapter_stats->rx_symbol_errors = port_stats->rx_symbol_errors;
1223231663Sluigi	adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
1224231663Sluigi	adapter_stats->rx_pause_on_frames = port_stats->rx_pause_on_frames;
1225231663Sluigi	adapter_stats->rx_pause_off_frames = port_stats->rx_pause_off_frames;
1226231663Sluigi	adapter_stats->rx_frames_too_long = port_stats->rx_frames_too_long;
1227231663Sluigi	adapter_stats->rx_internal_mac_errors =
1228231663Sluigi		port_stats->rx_internal_mac_errors;
1229231663Sluigi	adapter_stats->rx_undersize_pkts = port_stats->rx_undersize_pkts;
1230231663Sluigi	adapter_stats->rx_oversize_pkts = port_stats->rx_oversize_pkts;
1231231663Sluigi	adapter_stats->rx_fragment_pkts = port_stats->rx_fragment_pkts;
1232231663Sluigi	adapter_stats->rx_jabbers = port_stats->rx_jabbers;
1233231663Sluigi	adapter_stats->rx_control_frames = port_stats->rx_control_frames;
1234231663Sluigi	adapter_stats->rx_control_frames_unknown_opcode =
1235231663Sluigi		port_stats->rx_control_frames_unknown_opcode;
1236231663Sluigi	adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
1237231663Sluigi	adapter_stats->rx_out_of_range_errors =
1238231663Sluigi		port_stats->rx_out_of_range_errors;
1239231663Sluigi	adapter_stats->rx_address_match_errors =
1240231663Sluigi		port_stats->rx_address_match_errors;
1241231663Sluigi	adapter_stats->rx_vlan_mismatch_errors =
1242231663Sluigi		port_stats->rx_vlan_mismatch_errors;
1243231663Sluigi	adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
1244231663Sluigi	adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
1245231663Sluigi	adapter_stats->rx_dropped_header_too_small =
1246231663Sluigi		port_stats->rx_dropped_header_too_small;
1247231663Sluigi	adapter_stats->rx_dropped_invalid_tcp_length =
1248231663Sluigi		port_stats->rx_dropped_invalid_tcp_length;
1249231663Sluigi	adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
1250231663Sluigi	adapter_stats->rx_ip_checksum_errors =
1251231663Sluigi		port_stats->rx_ip_checksum_errors;
1252231663Sluigi	adapter_stats->rx_tcp_checksum_errors =
1253231663Sluigi		port_stats->rx_tcp_checksum_errors;
1254231663Sluigi	adapter_stats->rx_udp_checksum_errors =
1255231663Sluigi		port_stats->rx_udp_checksum_errors;
1256231663Sluigi	adapter_stats->rx_non_rss_pkts = port_stats->rx_non_rss_pkts;
1257231663Sluigi	adapter_stats->rx_ipv4_pkts = port_stats->rx_ipv4_pkts;
1258231663Sluigi	adapter_stats->rx_ipv6_pkts = port_stats->rx_ipv6_pkts;
1259231663Sluigi	adapter_stats->rx_ipv4_bytes = port_stats->rx_ipv4_bytes;
1260231663Sluigi	adapter_stats->rx_ipv6_bytes = port_stats->rx_ipv6_bytes;
1261231663Sluigi	adapter_stats->rx_nic_pkts = port_stats->rx_nic_pkts;
1262231663Sluigi	adapter_stats->rx_tcp_pkts = port_stats->rx_tcp_pkts;
1263231663Sluigi	adapter_stats->rx_iscsi_pkts = port_stats->rx_iscsi_pkts;
1264231663Sluigi	adapter_stats->rx_management_pkts = port_stats->rx_management_pkts;
1265231663Sluigi	adapter_stats->rx_switched_unicast_pkts =
1266231663Sluigi		port_stats->rx_switched_unicast_pkts;
1267231663Sluigi	adapter_stats->rx_switched_multicast_pkts =
1268231663Sluigi		port_stats->rx_switched_multicast_pkts;
1269231663Sluigi	adapter_stats->rx_switched_broadcast_pkts =
1270231663Sluigi		port_stats->rx_switched_broadcast_pkts;
1271231663Sluigi	adapter_stats->num_forwards = port_stats->num_forwards;
1272231663Sluigi	adapter_stats->rx_fifo_overflow = port_stats->rx_fifo_overflow;
1273231663Sluigi	adapter_stats->rx_input_fifo_overflow =
1274231663Sluigi		port_stats->rx_input_fifo_overflow;
1275231663Sluigi	adapter_stats->rx_drops_too_many_frags =
1276231663Sluigi		port_stats->rx_drops_too_many_frags;
1277231663Sluigi	adapter_stats->rx_drops_invalid_queue =
1278231663Sluigi		port_stats->rx_drops_invalid_queue;
1279231663Sluigi	adapter_stats->rx_drops_mtu = port_stats->rx_drops_mtu;
1280231663Sluigi	adapter_stats->rx_pkts_64_bytes = port_stats->rx_pkts_64_bytes;
1281231663Sluigi	adapter_stats->rx_pkts_65_to_127_bytes =
1282231663Sluigi		port_stats->rx_pkts_65_to_127_bytes;
1283231663Sluigi	adapter_stats->rx_pkts_128_to_255_bytes =
1284231663Sluigi		port_stats->rx_pkts_128_to_255_bytes;
1285231663Sluigi	adapter_stats->rx_pkts_256_to_511_bytes =
1286231663Sluigi		port_stats->rx_pkts_256_to_511_bytes;
1287231663Sluigi	adapter_stats->rx_pkts_512_to_1023_bytes =
1288231663Sluigi		port_stats->rx_pkts_512_to_1023_bytes;
1289231663Sluigi	adapter_stats->rx_pkts_1024_to_1518_bytes =
1290231663Sluigi		port_stats->rx_pkts_1024_to_1518_bytes;
1291231663Sluigi	adapter_stats->rx_pkts_1519_to_2047_bytes =
1292231663Sluigi		port_stats->rx_pkts_1519_to_2047_bytes;
1293231663Sluigi	adapter_stats->rx_pkts_2048_to_4095_bytes =
1294231663Sluigi		port_stats->rx_pkts_2048_to_4095_bytes;
1295231663Sluigi	adapter_stats->rx_pkts_4096_to_8191_bytes =
1296231663Sluigi		port_stats->rx_pkts_4096_to_8191_bytes;
1297231663Sluigi	adapter_stats->rx_pkts_8192_to_9216_bytes =
1298231663Sluigi		port_stats->rx_pkts_8192_to_9216_bytes;
1299231663Sluigi}
1300231663Sluigi
1301231663Sluigi
1302231663Sluigi
1303231663Sluigistatic void
1304231663Sluigicopy_stats_to_sc_be2(POCE_SOFTC sc)
1305231663Sluigi{
1306231663Sluigi	struct oce_be_stats *adapter_stats;
1307231663Sluigi	struct oce_pmem_stats *pmem;
1308231663Sluigi	struct oce_rxf_stats_v0 *rxf_stats;
1309231663Sluigi	struct oce_port_rxf_stats_v0 *port_stats;
1310231663Sluigi	struct mbx_get_nic_stats_v0 *nic_mbx;
1311231663Sluigi	uint32_t port = sc->port_id;
1312231663Sluigi
1313231663Sluigi	nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats_v0);
1314231663Sluigi	pmem = &nic_mbx->params.rsp.stats.pmem;
1315231663Sluigi	rxf_stats = &nic_mbx->params.rsp.stats.rxf;
1316231663Sluigi	port_stats = &nic_mbx->params.rsp.stats.rxf.port[port];
1317231663Sluigi
1318231663Sluigi	adapter_stats = &sc->oce_stats_info.u0.be;
1319231663Sluigi
1320231663Sluigi
1321231663Sluigi	/* Update stats */
1322231663Sluigi	adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
1323231663Sluigi	adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
1324231663Sluigi	adapter_stats->rx_control_frames = port_stats->rx_control_frames;
1325231663Sluigi	adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
1326231663Sluigi	adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long;
1327231663Sluigi	adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
1328231663Sluigi	adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs;
1329231663Sluigi	adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs;
1330231663Sluigi	adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs;
1331231663Sluigi	adapter_stats->rxpp_fifo_overflow_drop =
1332231663Sluigi					port_stats->rxpp_fifo_overflow_drop;
1333231663Sluigi	adapter_stats->rx_dropped_tcp_length =
1334231663Sluigi		port_stats->rx_dropped_tcp_length;
1335231663Sluigi	adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
1336231663Sluigi	adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
1337231663Sluigi	adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors;
1338231663Sluigi	adapter_stats->rx_dropped_header_too_small =
1339231663Sluigi		port_stats->rx_dropped_header_too_small;
1340231663Sluigi	adapter_stats->rx_input_fifo_overflow_drop =
1341231663Sluigi		port_stats->rx_input_fifo_overflow_drop;
1342231663Sluigi	adapter_stats->rx_address_match_errors =
1343231663Sluigi		port_stats->rx_address_match_errors;
1344231663Sluigi	adapter_stats->rx_alignment_symbol_errors =
1345231663Sluigi		port_stats->rx_alignment_symbol_errors;
1346231663Sluigi	adapter_stats->tx_pauseframes = port_stats->tx_pauseframes;
1347231663Sluigi	adapter_stats->tx_controlframes = port_stats->tx_controlframes;
1348231663Sluigi
1349231663Sluigi	if (sc->if_id)
1350231663Sluigi		adapter_stats->jabber_events = rxf_stats->port1_jabber_events;
1351231663Sluigi	else
1352231663Sluigi		adapter_stats->jabber_events = rxf_stats->port0_jabber_events;
1353231663Sluigi
1354231663Sluigi	adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf;
1355231663Sluigi	adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb;
1356231663Sluigi	adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr;
1357231663Sluigi	adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring;
1358231663Sluigi	adapter_stats->forwarded_packets = rxf_stats->forwarded_packets;
1359231663Sluigi	adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu;
1360231663Sluigi	adapter_stats->rx_drops_no_tpre_descr =
1361231663Sluigi		rxf_stats->rx_drops_no_tpre_descr;
1362231663Sluigi	adapter_stats->rx_drops_too_many_frags =
1363231663Sluigi		rxf_stats->rx_drops_too_many_frags;
1364231663Sluigi	adapter_stats->eth_red_drops = pmem->eth_red_drops;
1365231663Sluigi}
1366231663Sluigi
1367231663Sluigi
1368231663Sluigistatic void
1369231663Sluigicopy_stats_to_sc_be3(POCE_SOFTC sc)
1370231663Sluigi{
1371231663Sluigi	struct oce_be_stats *adapter_stats;
1372231663Sluigi	struct oce_pmem_stats *pmem;
1373231663Sluigi	struct oce_rxf_stats_v1 *rxf_stats;
1374231663Sluigi	struct oce_port_rxf_stats_v1 *port_stats;
1375231663Sluigi	struct mbx_get_nic_stats *nic_mbx;
1376231663Sluigi	uint32_t port = sc->port_id;
1377231663Sluigi
1378231663Sluigi	nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats);
1379231663Sluigi	pmem = &nic_mbx->params.rsp.stats.pmem;
1380231663Sluigi	rxf_stats = &nic_mbx->params.rsp.stats.rxf;
1381231663Sluigi	port_stats = &nic_mbx->params.rsp.stats.rxf.port[port];
1382231663Sluigi
1383231663Sluigi	adapter_stats = &sc->oce_stats_info.u0.be;
1384231663Sluigi
1385231663Sluigi	/* Update stats */
1386231663Sluigi	adapter_stats->pmem_fifo_overflow_drop =
1387231663Sluigi		port_stats->pmem_fifo_overflow_drop;
1388231663Sluigi	adapter_stats->rx_priority_pause_frames =
1389231663Sluigi		port_stats->rx_priority_pause_frames;
1390231663Sluigi	adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
1391231663Sluigi	adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
1392231663Sluigi	adapter_stats->rx_control_frames = port_stats->rx_control_frames;
1393231663Sluigi	adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
1394231663Sluigi	adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long;
1395231663Sluigi	adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
1396231663Sluigi	adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs;
1397231663Sluigi	adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs;
1398231663Sluigi	adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs;
1399231663Sluigi	adapter_stats->rx_dropped_tcp_length =
1400231663Sluigi		port_stats->rx_dropped_tcp_length;
1401231663Sluigi	adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
1402231663Sluigi	adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
1403231663Sluigi	adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors;
1404231663Sluigi	adapter_stats->rx_dropped_header_too_small =
1405231663Sluigi		port_stats->rx_dropped_header_too_small;
1406231663Sluigi	adapter_stats->rx_input_fifo_overflow_drop =
1407231663Sluigi		port_stats->rx_input_fifo_overflow_drop;
1408231663Sluigi	adapter_stats->rx_address_match_errors =
1409231663Sluigi		port_stats->rx_address_match_errors;
1410231663Sluigi	adapter_stats->rx_alignment_symbol_errors =
1411231663Sluigi		port_stats->rx_alignment_symbol_errors;
1412231663Sluigi	adapter_stats->rxpp_fifo_overflow_drop =
1413231663Sluigi		port_stats->rxpp_fifo_overflow_drop;
1414231663Sluigi	adapter_stats->tx_pauseframes = port_stats->tx_pauseframes;
1415231663Sluigi	adapter_stats->tx_controlframes = port_stats->tx_controlframes;
1416231663Sluigi	adapter_stats->jabber_events = port_stats->jabber_events;
1417231663Sluigi
1418231663Sluigi	adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf;
1419231663Sluigi	adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb;
1420231663Sluigi	adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr;
1421231663Sluigi	adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring;
1422231663Sluigi	adapter_stats->forwarded_packets = rxf_stats->forwarded_packets;
1423231663Sluigi	adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu;
1424231663Sluigi	adapter_stats->rx_drops_no_tpre_descr =
1425231663Sluigi		rxf_stats->rx_drops_no_tpre_descr;
1426231663Sluigi	adapter_stats->rx_drops_too_many_frags =
1427231663Sluigi		rxf_stats->rx_drops_too_many_frags;
1428231663Sluigi
1429231663Sluigi	adapter_stats->eth_red_drops = pmem->eth_red_drops;
1430231663Sluigi}
1431231663Sluigi
1432231663Sluigi
1433231663Sluigiint
1434231663Sluigioce_stats_init(POCE_SOFTC sc)
1435231663Sluigi{
1436231663Sluigi	int rc = 0, sz;
1437231663Sluigi
1438252905Sdelphij	if (IS_BE(sc) || IS_SH(sc)) {
1439231663Sluigi		if (sc->flags & OCE_FLAGS_BE2)
1440231663Sluigi			sz = sizeof(struct mbx_get_nic_stats_v0);
1441231663Sluigi		else
1442231663Sluigi			sz = sizeof(struct mbx_get_nic_stats);
1443231663Sluigi	} else
1444231663Sluigi		sz = sizeof(struct mbx_get_pport_stats);
1445231663Sluigi
1446231663Sluigi	rc = oce_dma_alloc(sc, sz, &sc->stats_mem, 0);
1447231663Sluigi
1448231663Sluigi	return rc;
1449231663Sluigi}
1450231663Sluigi
1451231663Sluigi
1452231663Sluigivoid
1453231663Sluigioce_stats_free(POCE_SOFTC sc)
1454231663Sluigi{
1455231663Sluigi
1456231663Sluigi	oce_dma_free(sc, &sc->stats_mem);
1457231663Sluigi
1458231663Sluigi}
1459231663Sluigi
1460231663Sluigi
1461231663Sluigiint
1462231663Sluigioce_refresh_nic_stats(POCE_SOFTC sc)
1463231663Sluigi{
1464231663Sluigi	int rc = 0, reset = 0;
1465231663Sluigi
1466252905Sdelphij	if (IS_BE(sc) || IS_SH(sc)) {
1467231663Sluigi		if (sc->flags & OCE_FLAGS_BE2) {
1468231663Sluigi			rc = oce_mbox_get_nic_stats_v0(sc, &sc->stats_mem);
1469231663Sluigi			if (!rc)
1470231663Sluigi				copy_stats_to_sc_be2(sc);
1471231663Sluigi		} else {
1472231663Sluigi			rc = oce_mbox_get_nic_stats(sc, &sc->stats_mem);
1473231663Sluigi			if (!rc)
1474231663Sluigi				copy_stats_to_sc_be3(sc);
1475231663Sluigi		}
1476231663Sluigi
1477231663Sluigi	} else {
1478231663Sluigi		rc = oce_mbox_get_pport_stats(sc, &sc->stats_mem, reset);
1479231663Sluigi		if (!rc)
1480231663Sluigi			copy_stats_to_sc_xe201(sc);
1481231663Sluigi	}
1482231663Sluigi
1483231663Sluigi	return rc;
1484231663Sluigi}
1485248062Sdelphij
1486248062Sdelphijstatic int
1487248062Sdelphijoce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS)
1488248062Sdelphij{
1489248062Sdelphij	int result = 0, error;
1490248062Sdelphij	int rc = 0;
1491248062Sdelphij	POCE_SOFTC sc = (POCE_SOFTC) arg1;
1492248062Sdelphij
1493248062Sdelphij	/* sysctl default handler */
1494248062Sdelphij	error = sysctl_handle_int(oidp, &result, 0, req);
1495248062Sdelphij	if (error || !req->newptr)
1496248062Sdelphij		return (error);
1497248062Sdelphij
1498248062Sdelphij	if(result == -1) {
1499248062Sdelphij		return EINVAL;
1500248062Sdelphij	}
1501248062Sdelphij	bzero((char *)sfp_vpd_dump_buffer, TRANSCEIVER_DATA_SIZE);
1502248062Sdelphij
1503248062Sdelphij	rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A0);
1504248062Sdelphij	if(rc)
1505248062Sdelphij		return rc;
1506248062Sdelphij
1507248062Sdelphij	rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A2);
1508248062Sdelphij	if(rc)
1509248062Sdelphij		return rc;
1510248062Sdelphij
1511248062Sdelphij	return rc;
1512248062Sdelphij}
1513