xref: /dragonfly/sys/dev/netif/oce/oce_sysctl.c (revision 26595b18)
1229aec1cSSascha Wildner /*-
2c976b08eSSascha Wildner  * Copyright (C) 2013 Emulex
3229aec1cSSascha Wildner  * All rights reserved.
4229aec1cSSascha Wildner  *
5229aec1cSSascha Wildner  * Redistribution and use in source and binary forms, with or without
6229aec1cSSascha Wildner  * modification, are permitted provided that the following conditions are met:
7229aec1cSSascha Wildner  *
8229aec1cSSascha Wildner  * 1. Redistributions of source code must retain the above copyright notice,
9229aec1cSSascha Wildner  *    this list of conditions and the following disclaimer.
10229aec1cSSascha Wildner  *
11229aec1cSSascha Wildner  * 2. Redistributions in binary form must reproduce the above copyright
12229aec1cSSascha Wildner  *    notice, this list of conditions and the following disclaimer in the
13229aec1cSSascha Wildner  *    documentation and/or other materials provided with the distribution.
14229aec1cSSascha Wildner  *
15229aec1cSSascha Wildner  * 3. Neither the name of the Emulex Corporation nor the names of its
16229aec1cSSascha Wildner  *    contributors may be used to endorse or promote products derived from
17229aec1cSSascha Wildner  *    this software without specific prior written permission.
18229aec1cSSascha Wildner  *
19229aec1cSSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20229aec1cSSascha Wildner  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21229aec1cSSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22229aec1cSSascha Wildner  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23229aec1cSSascha Wildner  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24229aec1cSSascha Wildner  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25229aec1cSSascha Wildner  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26229aec1cSSascha Wildner  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27229aec1cSSascha Wildner  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28229aec1cSSascha Wildner  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29229aec1cSSascha Wildner  * POSSIBILITY OF SUCH DAMAGE.
30229aec1cSSascha Wildner  *
31229aec1cSSascha Wildner  * Contact Information:
32229aec1cSSascha Wildner  * freebsd-drivers@emulex.com
33229aec1cSSascha Wildner  *
34229aec1cSSascha Wildner  * Emulex
35229aec1cSSascha Wildner  * 3333 Susan Street
36229aec1cSSascha Wildner  * Costa Mesa, CA 92626
37229aec1cSSascha Wildner  */
38229aec1cSSascha Wildner 
39c976b08eSSascha Wildner /* $FreeBSD: src/sys/dev/oce/oce_sysctl.c,v 1.6 2013/07/07 00:30:13 svnexp Exp $ */
40229aec1cSSascha Wildner 
41229aec1cSSascha Wildner 
42229aec1cSSascha Wildner #include "oce_if.h"
43229aec1cSSascha Wildner 
44229aec1cSSascha Wildner static void copy_stats_to_sc_xe201(POCE_SOFTC sc);
45229aec1cSSascha Wildner static void copy_stats_to_sc_be3(POCE_SOFTC sc);
46229aec1cSSascha Wildner static void copy_stats_to_sc_be2(POCE_SOFTC sc);
47229aec1cSSascha Wildner static int  oce_sysctl_loopback(SYSCTL_HANDLER_ARGS);
48229aec1cSSascha Wildner static int  oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
49229aec1cSSascha Wildner static int  oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS);
50229aec1cSSascha Wildner static int  oce_be3_flashdata(POCE_SOFTC sc, const struct firmware
51229aec1cSSascha Wildner 						*fw, int num_imgs);
52229aec1cSSascha Wildner static int  oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
53229aec1cSSascha Wildner static int oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS);
54229aec1cSSascha Wildner static boolean_t oce_phy_flashing_required(POCE_SOFTC sc);
55229aec1cSSascha Wildner static boolean_t oce_img_flashing_required(POCE_SOFTC sc, const char *p,
56229aec1cSSascha Wildner 				int img_optype, uint32_t img_offset,
57229aec1cSSascha Wildner 				uint32_t img_size, uint32_t hdrs_size);
58229aec1cSSascha Wildner static void oce_add_stats_sysctls_be3(POCE_SOFTC sc,
59229aec1cSSascha Wildner 				struct sysctl_ctx_list *ctx,
60229aec1cSSascha Wildner 				struct sysctl_oid *stats_node);
61229aec1cSSascha Wildner static void oce_add_stats_sysctls_xe201(POCE_SOFTC sc,
62229aec1cSSascha Wildner 				struct sysctl_ctx_list *ctx,
63229aec1cSSascha Wildner 				struct sysctl_oid *stats_node);
64229aec1cSSascha Wildner 
65229aec1cSSascha Wildner extern char component_revision[32];
66229aec1cSSascha Wildner uint32_t sfp_vpd_dump_buffer[TRANSCEIVER_DATA_NUM_ELE];
67229aec1cSSascha Wildner 
68229aec1cSSascha Wildner void
oce_add_sysctls(POCE_SOFTC sc)69229aec1cSSascha Wildner oce_add_sysctls(POCE_SOFTC sc)
70229aec1cSSascha Wildner {
71229aec1cSSascha Wildner 
72*26595b18SSascha Wildner 	struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev);
73*26595b18SSascha Wildner 	struct sysctl_oid *tree = device_get_sysctl_tree(sc->dev);
74229aec1cSSascha Wildner 	struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree);
75229aec1cSSascha Wildner 	struct sysctl_oid *stats_node;
76229aec1cSSascha Wildner 
77229aec1cSSascha Wildner 	SYSCTL_ADD_STRING(ctx, child,
78229aec1cSSascha Wildner 			OID_AUTO, "component_revision",
79229aec1cSSascha Wildner 			CTLTYPE_INT | CTLFLAG_RD,
80229aec1cSSascha Wildner 			&component_revision,
81229aec1cSSascha Wildner 			sizeof(component_revision),
82229aec1cSSascha Wildner 			"EMULEX One-Connect device driver revision");
83229aec1cSSascha Wildner 
84229aec1cSSascha Wildner 	SYSCTL_ADD_STRING(ctx, child,
85229aec1cSSascha Wildner 			OID_AUTO, "firmware_version",
86229aec1cSSascha Wildner 			CTLTYPE_INT | CTLFLAG_RD,
87229aec1cSSascha Wildner 			&sc->fw_version,
88229aec1cSSascha Wildner 			sizeof(sc->fw_version),
89229aec1cSSascha Wildner 			"EMULEX One-Connect Firmware Version");
90229aec1cSSascha Wildner 
91229aec1cSSascha Wildner 	SYSCTL_ADD_INT(ctx, child,
92229aec1cSSascha Wildner 			OID_AUTO, "max_rsp_handled",
93229aec1cSSascha Wildner 			CTLTYPE_INT | CTLFLAG_RW,
94229aec1cSSascha Wildner 			&oce_max_rsp_handled,
95229aec1cSSascha Wildner 			sizeof(oce_max_rsp_handled),
96f734ea4bSSascha Wildner 			"Maximum receive frames handled per interrupt");
97229aec1cSSascha Wildner 
98229aec1cSSascha Wildner 	if ((sc->function_mode & FNM_FLEX10_MODE) ||
99229aec1cSSascha Wildner 	    (sc->function_mode & FNM_UMC_MODE))
100229aec1cSSascha Wildner 		SYSCTL_ADD_UINT(ctx, child,
101229aec1cSSascha Wildner 				OID_AUTO, "speed",
102229aec1cSSascha Wildner 				CTLFLAG_RD,
103229aec1cSSascha Wildner 				&sc->qos_link_speed,
104229aec1cSSascha Wildner 				0,"QOS Speed");
105229aec1cSSascha Wildner 	else
106229aec1cSSascha Wildner 		SYSCTL_ADD_UINT(ctx, child,
107229aec1cSSascha Wildner 				OID_AUTO, "speed",
108229aec1cSSascha Wildner 				CTLFLAG_RD,
109229aec1cSSascha Wildner 				&sc->speed,
110229aec1cSSascha Wildner 				0,"Link Speed");
111229aec1cSSascha Wildner 
112229aec1cSSascha Wildner 	if (sc->function_mode & FNM_UMC_MODE)
113229aec1cSSascha Wildner 		SYSCTL_ADD_UINT(ctx, child,
114229aec1cSSascha Wildner 				OID_AUTO, "pvid",
115229aec1cSSascha Wildner 				CTLFLAG_RD,
116229aec1cSSascha Wildner 				&sc->pvid,
117229aec1cSSascha Wildner 				0,"PVID");
118229aec1cSSascha Wildner 
119229aec1cSSascha Wildner 	SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "loop_back",
120229aec1cSSascha Wildner 		CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0,
121229aec1cSSascha Wildner 		oce_sysctl_loopback, "I", "Loop Back Tests");
122229aec1cSSascha Wildner 
123229aec1cSSascha Wildner 	SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "fw_upgrade",
124229aec1cSSascha Wildner 		CTLTYPE_STRING | CTLFLAG_RW, (void *)sc, 0,
125229aec1cSSascha Wildner 		oce_sys_fwupgrade, "A", "Firmware ufi file");
126229aec1cSSascha Wildner 
127229aec1cSSascha Wildner         /*
128229aec1cSSascha Wildner          *  Dumps Transceiver data
1295906ca80SSascha Wildner 	 *  "sysctl hw.oce0.sfp_vpd_dump=0"
1305906ca80SSascha Wildner          *  "sysctl -x hw.oce0.sfp_vpd_dump_buffer" for hex dump
1315906ca80SSascha Wildner          *  "sysctl -b hw.oce0.sfp_vpd_dump_buffer > sfp.bin" for binary dump
132229aec1cSSascha Wildner          */
133229aec1cSSascha Wildner 	SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "sfp_vpd_dump",
134229aec1cSSascha Wildner 			CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, oce_sysctl_sfp_vpd_dump,
135229aec1cSSascha Wildner 			"I", "Initiate a sfp_vpd_dump operation");
136229aec1cSSascha Wildner 	SYSCTL_ADD_OPAQUE(ctx, child, OID_AUTO, "sfp_vpd_dump_buffer",
137229aec1cSSascha Wildner 			CTLFLAG_RD, sfp_vpd_dump_buffer,
138229aec1cSSascha Wildner 			TRANSCEIVER_DATA_SIZE, "IU", "Access sfp_vpd_dump buffer");
139229aec1cSSascha Wildner 
140229aec1cSSascha Wildner 	stats_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats",
141229aec1cSSascha Wildner 				CTLFLAG_RD, NULL, "Ethernet Statistics");
142229aec1cSSascha Wildner 
143c976b08eSSascha Wildner 	if (IS_BE(sc) || IS_SH(sc))
144229aec1cSSascha Wildner 		oce_add_stats_sysctls_be3(sc, ctx, stats_node);
145229aec1cSSascha Wildner 	else
146229aec1cSSascha Wildner 		oce_add_stats_sysctls_xe201(sc, ctx, stats_node);
147229aec1cSSascha Wildner 
148229aec1cSSascha Wildner 
149229aec1cSSascha Wildner }
150229aec1cSSascha Wildner 
151229aec1cSSascha Wildner 
152229aec1cSSascha Wildner static uint32_t
oce_loopback_test(struct oce_softc * sc,uint8_t loopback_type)153229aec1cSSascha Wildner oce_loopback_test(struct oce_softc *sc, uint8_t loopback_type)
154229aec1cSSascha Wildner {
155229aec1cSSascha Wildner 	uint32_t status = 0;
156229aec1cSSascha Wildner 
157229aec1cSSascha Wildner 	oce_mbox_cmd_set_loopback(sc, sc->if_id, loopback_type, 1);
158229aec1cSSascha Wildner 	status = oce_mbox_cmd_test_loopback(sc, sc->if_id, loopback_type,
159229aec1cSSascha Wildner 				1500, 2, 0xabc);
160229aec1cSSascha Wildner 	oce_mbox_cmd_set_loopback(sc, sc->if_id, OCE_NO_LOOPBACK, 1);
161229aec1cSSascha Wildner 
162229aec1cSSascha Wildner 	return status;
163229aec1cSSascha Wildner }
164229aec1cSSascha Wildner 
165229aec1cSSascha Wildner static int
oce_sysctl_loopback(SYSCTL_HANDLER_ARGS)166229aec1cSSascha Wildner oce_sysctl_loopback(SYSCTL_HANDLER_ARGS)
167229aec1cSSascha Wildner {
168229aec1cSSascha Wildner 	int value = 0;
169229aec1cSSascha Wildner 	uint32_t status;
170229aec1cSSascha Wildner 	struct oce_softc *sc  = (struct oce_softc *)arg1;
171229aec1cSSascha Wildner 
172229aec1cSSascha Wildner 	status = sysctl_handle_int(oidp, &value, 0, req);
173229aec1cSSascha Wildner 	if (status || !req->newptr)
174229aec1cSSascha Wildner 		return status;
175229aec1cSSascha Wildner 
176229aec1cSSascha Wildner 	if (value != 1) {
177229aec1cSSascha Wildner 		device_printf(sc->dev,
178229aec1cSSascha Wildner 			"Not a Valid value. Set to loop_back=1 to run tests\n");
179229aec1cSSascha Wildner 		return 0;
180229aec1cSSascha Wildner 	}
181229aec1cSSascha Wildner 
182229aec1cSSascha Wildner 	if ((status = oce_loopback_test(sc, OCE_MAC_LOOPBACK))) {
183229aec1cSSascha Wildner 		device_printf(sc->dev,
184229aec1cSSascha Wildner 			"MAC Loopback Test = Failed (Error status = %d)\n",
185229aec1cSSascha Wildner 			 status);
186229aec1cSSascha Wildner 	} else
187229aec1cSSascha Wildner 		device_printf(sc->dev, "MAC Loopback Test = Success\n");
188229aec1cSSascha Wildner 
189229aec1cSSascha Wildner 	if ((status = oce_loopback_test(sc, OCE_PHY_LOOPBACK))) {
190229aec1cSSascha Wildner 		device_printf(sc->dev,
191229aec1cSSascha Wildner 			"PHY Loopback Test = Failed (Error status = %d)\n",
192229aec1cSSascha Wildner 			 status);
193229aec1cSSascha Wildner 	} else
194229aec1cSSascha Wildner 		device_printf(sc->dev, "PHY Loopback Test = Success\n");
195229aec1cSSascha Wildner 
196229aec1cSSascha Wildner 	if ((status = oce_loopback_test(sc, OCE_ONE_PORT_EXT_LOOPBACK))) {
197229aec1cSSascha Wildner 		device_printf(sc->dev,
198229aec1cSSascha Wildner 			"EXT Loopback Test = Failed (Error status = %d)\n",
199229aec1cSSascha Wildner 			 status);
200229aec1cSSascha Wildner 	} else
201229aec1cSSascha Wildner 		device_printf(sc->dev, "EXT Loopback Test = Success\n");
202229aec1cSSascha Wildner 
203229aec1cSSascha Wildner 	return 0;
204229aec1cSSascha Wildner }
205229aec1cSSascha Wildner 
206229aec1cSSascha Wildner 
207229aec1cSSascha Wildner static int
oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS)208229aec1cSSascha Wildner oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS)
209229aec1cSSascha Wildner {
210229aec1cSSascha Wildner 	char ufiname[256] = {0};
211229aec1cSSascha Wildner 	uint32_t status = 1;
212229aec1cSSascha Wildner 	struct oce_softc *sc  = (struct oce_softc *)arg1;
213229aec1cSSascha Wildner 	const struct firmware *fw;
214229aec1cSSascha Wildner 
215229aec1cSSascha Wildner 	status = sysctl_handle_string(oidp, ufiname, sizeof(ufiname), req);
216229aec1cSSascha Wildner 	if (status || !req->newptr)
217229aec1cSSascha Wildner 		return status;
218229aec1cSSascha Wildner 
219229aec1cSSascha Wildner 	fw = firmware_get(ufiname);
220229aec1cSSascha Wildner 	if (fw == NULL) {
221229aec1cSSascha Wildner 		device_printf(sc->dev, "Unable to get Firmware. "
2225906ca80SSascha Wildner 			"Make sure %s is copied to /boot/kernel\n", ufiname);
223229aec1cSSascha Wildner 		return ENOENT;
224229aec1cSSascha Wildner 	}
225229aec1cSSascha Wildner 
226c976b08eSSascha Wildner 	if (IS_BE(sc) || IS_SH(sc)) {
227229aec1cSSascha Wildner 		if ((sc->flags & OCE_FLAGS_BE2)) {
228229aec1cSSascha Wildner 			device_printf(sc->dev,
229229aec1cSSascha Wildner 				"Flashing not supported for BE2 yet.\n");
230229aec1cSSascha Wildner 			status = 1;
231229aec1cSSascha Wildner 			goto done;
232229aec1cSSascha Wildner 		}
233229aec1cSSascha Wildner 		status = oce_be3_fwupgrade(sc, fw);
234229aec1cSSascha Wildner 	} else
235229aec1cSSascha Wildner 		status = oce_lancer_fwupgrade(sc, fw);
236229aec1cSSascha Wildner done:
237229aec1cSSascha Wildner 	if (status) {
238229aec1cSSascha Wildner 		device_printf(sc->dev, "Firmware Upgrade failed\n");
239229aec1cSSascha Wildner 	} else {
240229aec1cSSascha Wildner 		device_printf(sc->dev, "Firmware Flashed successfully\n");
241229aec1cSSascha Wildner 	}
242229aec1cSSascha Wildner 
243229aec1cSSascha Wildner 	/* Release Firmware*/
244229aec1cSSascha Wildner 	firmware_put(fw, FIRMWARE_UNLOAD);
245229aec1cSSascha Wildner 
246229aec1cSSascha Wildner 	return status;
247229aec1cSSascha Wildner }
248229aec1cSSascha Wildner 
249229aec1cSSascha Wildner 
250229aec1cSSascha Wildner static int
oce_be3_fwupgrade(POCE_SOFTC sc,const struct firmware * fw)251229aec1cSSascha Wildner oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw)
252229aec1cSSascha Wildner {
253229aec1cSSascha Wildner 	int rc = 0, num_imgs = 0, i = 0;
254229aec1cSSascha Wildner 	const struct flash_file_hdr *fhdr;
255229aec1cSSascha Wildner 	const struct image_hdr *img_ptr;
256229aec1cSSascha Wildner 
257229aec1cSSascha Wildner 	fhdr = (const struct flash_file_hdr *)fw->data;
258229aec1cSSascha Wildner 	if (fhdr->build[0] != '3') {
259229aec1cSSascha Wildner 		device_printf(sc->dev, "Invalid BE3 firmware image\n");
260229aec1cSSascha Wildner 		return EINVAL;
261229aec1cSSascha Wildner 	}
262229aec1cSSascha Wildner 	/* Display flash version */
263229aec1cSSascha Wildner 	device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]);
264229aec1cSSascha Wildner 
265229aec1cSSascha Wildner 	num_imgs = fhdr->num_imgs;
266229aec1cSSascha Wildner 	for (i = 0; i < num_imgs; i++) {
267229aec1cSSascha Wildner 		img_ptr = (const struct image_hdr *)((const char *)fw->data +
268229aec1cSSascha Wildner 				sizeof(struct flash_file_hdr) +
269229aec1cSSascha Wildner 				(i * sizeof(struct image_hdr)));
270229aec1cSSascha Wildner 		if (img_ptr->imageid == 1) {
271229aec1cSSascha Wildner 			rc = oce_be3_flashdata(sc, fw, num_imgs);
272229aec1cSSascha Wildner 			break;
273229aec1cSSascha Wildner 		}
274229aec1cSSascha Wildner 	}
275229aec1cSSascha Wildner 
276229aec1cSSascha Wildner 	return rc;
277229aec1cSSascha Wildner }
278229aec1cSSascha Wildner 
279229aec1cSSascha Wildner 
280229aec1cSSascha Wildner static int
oce_be3_flashdata(POCE_SOFTC sc,const struct firmware * fw,int num_imgs)281229aec1cSSascha Wildner oce_be3_flashdata(POCE_SOFTC sc, const struct firmware *fw, int num_imgs)
282229aec1cSSascha Wildner {
283229aec1cSSascha Wildner 	char cookie[2][16] =    {"*** SE FLAS", "H DIRECTORY *** "};
284229aec1cSSascha Wildner 	const char *p = (const char *)fw->data;
285229aec1cSSascha Wildner 	const struct flash_sec_info *fsec = NULL;
286229aec1cSSascha Wildner 	struct mbx_common_read_write_flashrom *req;
287229aec1cSSascha Wildner 	int rc = 0, i, img_type, bin_offset = 0;
288229aec1cSSascha Wildner 	boolean_t skip_image;
289229aec1cSSascha Wildner 	uint32_t optype = 0, size = 0, start = 0, num_bytes = 0;
290229aec1cSSascha Wildner 	uint32_t opcode = 0;
291229aec1cSSascha Wildner 	OCE_DMA_MEM dma_mem;
292229aec1cSSascha Wildner 
293229aec1cSSascha Wildner 	/* Validate Cookie */
294229aec1cSSascha Wildner 	bin_offset = (sizeof(struct flash_file_hdr) +
295229aec1cSSascha Wildner 		(num_imgs * sizeof(struct image_hdr)));
296229aec1cSSascha Wildner 	p += bin_offset;
297229aec1cSSascha Wildner 	while (p < ((const char *)fw->data + fw->datasize)) {
298229aec1cSSascha Wildner 		fsec = (const struct flash_sec_info *)p;
299229aec1cSSascha Wildner 		if (!memcmp(cookie, fsec->cookie, sizeof(cookie)))
300229aec1cSSascha Wildner 			break;
301229aec1cSSascha Wildner 		fsec = NULL;
302229aec1cSSascha Wildner 		p += 32;
303229aec1cSSascha Wildner 	}
304229aec1cSSascha Wildner 
305229aec1cSSascha Wildner 	if (!fsec) {
306229aec1cSSascha Wildner 		device_printf(sc->dev,
307229aec1cSSascha Wildner 			"Invalid Cookie. Firmware image corrupted ?\n");
308229aec1cSSascha Wildner 		return EINVAL;
309229aec1cSSascha Wildner 	}
310229aec1cSSascha Wildner 
311229aec1cSSascha Wildner 	rc = oce_dma_alloc(sc, sizeof(struct mbx_common_read_write_flashrom)
312229aec1cSSascha Wildner 			+ 32*1024, &dma_mem, 0);
313229aec1cSSascha Wildner 	if (rc) {
314229aec1cSSascha Wildner 		device_printf(sc->dev,
315229aec1cSSascha Wildner 			"Memory allocation failure while flashing\n");
316229aec1cSSascha Wildner 		return ENOMEM;
317229aec1cSSascha Wildner 	}
318229aec1cSSascha Wildner 	req = OCE_DMAPTR(&dma_mem, struct mbx_common_read_write_flashrom);
319229aec1cSSascha Wildner 
320229aec1cSSascha Wildner 	for (i = 0; i < MAX_FLASH_COMP; i++) {
321229aec1cSSascha Wildner 
322229aec1cSSascha Wildner 		img_type = fsec->fsec_entry[i].type;
323229aec1cSSascha Wildner 		skip_image = FALSE;
324229aec1cSSascha Wildner 		switch (img_type) {
325229aec1cSSascha Wildner 		case IMG_ISCSI:
326229aec1cSSascha Wildner 			optype = 0;
327229aec1cSSascha Wildner 			size = 2097152;
328229aec1cSSascha Wildner 			start = 2097152;
329229aec1cSSascha Wildner 			break;
330229aec1cSSascha Wildner 		case IMG_REDBOOT:
331229aec1cSSascha Wildner 			optype = 1;
332229aec1cSSascha Wildner 			size = 1048576;
333229aec1cSSascha Wildner 			start = 262144;
334229aec1cSSascha Wildner 			if (!oce_img_flashing_required(sc, fw->data,
335229aec1cSSascha Wildner 				optype, start, size, bin_offset))
336229aec1cSSascha Wildner 				skip_image = TRUE;
337229aec1cSSascha Wildner 			break;
338229aec1cSSascha Wildner 		case IMG_BIOS:
339229aec1cSSascha Wildner 			optype = 2;
340229aec1cSSascha Wildner 			size = 524288;
341229aec1cSSascha Wildner 			start = 12582912;
342229aec1cSSascha Wildner 			break;
343229aec1cSSascha Wildner 		case IMG_PXEBIOS:
344229aec1cSSascha Wildner 			optype = 3;
345229aec1cSSascha Wildner 			size = 524288;
346229aec1cSSascha Wildner 			start = 13107200;
347229aec1cSSascha Wildner 			break;
348229aec1cSSascha Wildner 		case IMG_FCOEBIOS:
349229aec1cSSascha Wildner 			optype = 8;
350229aec1cSSascha Wildner 			size = 524288;
351229aec1cSSascha Wildner 			start = 13631488;
352229aec1cSSascha Wildner 			break;
353229aec1cSSascha Wildner 		case IMG_ISCSI_BAK:
354229aec1cSSascha Wildner 			optype = 9;
355229aec1cSSascha Wildner 			size = 2097152;
356229aec1cSSascha Wildner 			start = 4194304;
357229aec1cSSascha Wildner 			break;
358229aec1cSSascha Wildner 		case IMG_FCOE:
359229aec1cSSascha Wildner 			optype = 10;
360229aec1cSSascha Wildner 			size = 2097152;
361229aec1cSSascha Wildner 			start = 6291456;
362229aec1cSSascha Wildner 			break;
363229aec1cSSascha Wildner 		case IMG_FCOE_BAK:
364229aec1cSSascha Wildner 			optype = 11;
365229aec1cSSascha Wildner 			size = 2097152;
366229aec1cSSascha Wildner 			start = 8388608;
367229aec1cSSascha Wildner 			break;
368229aec1cSSascha Wildner 		case IMG_NCSI:
369229aec1cSSascha Wildner 			optype = 13;
370229aec1cSSascha Wildner 			size = 262144;
371229aec1cSSascha Wildner 			start = 15990784;
372229aec1cSSascha Wildner 			break;
373229aec1cSSascha Wildner 		case IMG_PHY:
374229aec1cSSascha Wildner 			optype = 99;
375229aec1cSSascha Wildner 			size = 262144;
376229aec1cSSascha Wildner 			start = 1310720;
377229aec1cSSascha Wildner 			if (!oce_phy_flashing_required(sc))
378229aec1cSSascha Wildner 				skip_image = TRUE;
379229aec1cSSascha Wildner 			break;
380229aec1cSSascha Wildner 		default:
381229aec1cSSascha Wildner 			skip_image = TRUE;
382229aec1cSSascha Wildner 			break;
383229aec1cSSascha Wildner 		}
384229aec1cSSascha Wildner 		if (skip_image)
385229aec1cSSascha Wildner 			continue;
386229aec1cSSascha Wildner 
387229aec1cSSascha Wildner 		p = fw->data;
388229aec1cSSascha Wildner 		p = p + bin_offset + start;
389229aec1cSSascha Wildner 		if ((p + size) > ((const char *)fw->data + fw->datasize)) {
390229aec1cSSascha Wildner 			rc = 1;
391229aec1cSSascha Wildner 			goto ret;
392229aec1cSSascha Wildner 		}
393229aec1cSSascha Wildner 
394229aec1cSSascha Wildner 		while (size) {
395229aec1cSSascha Wildner 
396229aec1cSSascha Wildner 			if (size > 32*1024)
397229aec1cSSascha Wildner 				num_bytes = 32*1024;
398229aec1cSSascha Wildner 			else
399229aec1cSSascha Wildner 				num_bytes = size;
400229aec1cSSascha Wildner 			size -= num_bytes;
401229aec1cSSascha Wildner 
402229aec1cSSascha Wildner 			if (!size)
403229aec1cSSascha Wildner 				opcode = FLASHROM_OPER_FLASH;
404229aec1cSSascha Wildner 			else
405229aec1cSSascha Wildner 				opcode = FLASHROM_OPER_SAVE;
406229aec1cSSascha Wildner 
407229aec1cSSascha Wildner 			memcpy(req->data_buffer, p, num_bytes);
408229aec1cSSascha Wildner 			p += num_bytes;
409229aec1cSSascha Wildner 
410229aec1cSSascha Wildner 			rc = oce_mbox_write_flashrom(sc, optype, opcode,
411229aec1cSSascha Wildner 						&dma_mem, num_bytes);
412229aec1cSSascha Wildner 			if (rc) {
413229aec1cSSascha Wildner 				device_printf(sc->dev,
414229aec1cSSascha Wildner 					"cmd to write to flash rom failed.\n");
415229aec1cSSascha Wildner 				rc = EIO;
416229aec1cSSascha Wildner 				goto ret;
417229aec1cSSascha Wildner 			}
418229aec1cSSascha Wildner 			/* Leave the CPU for others for some time */
419229aec1cSSascha Wildner 			tsleep(oce_be3_flashdata, 0, "yield", 10);
420229aec1cSSascha Wildner 
421229aec1cSSascha Wildner 		}
422229aec1cSSascha Wildner 	}
423229aec1cSSascha Wildner ret:
424229aec1cSSascha Wildner 	oce_dma_free(sc, &dma_mem);
425229aec1cSSascha Wildner 	return rc;
426229aec1cSSascha Wildner 
427229aec1cSSascha Wildner }
428229aec1cSSascha Wildner 
429229aec1cSSascha Wildner 
430229aec1cSSascha Wildner static boolean_t
oce_phy_flashing_required(POCE_SOFTC sc)431229aec1cSSascha Wildner oce_phy_flashing_required(POCE_SOFTC sc)
432229aec1cSSascha Wildner {
433229aec1cSSascha Wildner 	int status = 0;
434229aec1cSSascha Wildner 	struct oce_phy_info phy_info;
435229aec1cSSascha Wildner 
436229aec1cSSascha Wildner 	status = oce_mbox_get_phy_info(sc, &phy_info);
437229aec1cSSascha Wildner 	if (status)
438229aec1cSSascha Wildner 		return FALSE;
439229aec1cSSascha Wildner 
440229aec1cSSascha Wildner 	if ((phy_info.phy_type == TN_8022) &&
441229aec1cSSascha Wildner 		(phy_info.interface_type == PHY_TYPE_BASET_10GB)) {
442229aec1cSSascha Wildner 		return TRUE;
443229aec1cSSascha Wildner 	}
444229aec1cSSascha Wildner 
445229aec1cSSascha Wildner 	return FALSE;
446229aec1cSSascha Wildner }
447229aec1cSSascha Wildner 
448229aec1cSSascha Wildner 
449229aec1cSSascha Wildner static boolean_t
oce_img_flashing_required(POCE_SOFTC sc,const char * p,int img_optype,uint32_t img_offset,uint32_t img_size,uint32_t hdrs_size)450229aec1cSSascha Wildner oce_img_flashing_required(POCE_SOFTC sc, const char *p,
451229aec1cSSascha Wildner 				int img_optype, uint32_t img_offset,
452229aec1cSSascha Wildner 				uint32_t img_size, uint32_t hdrs_size)
453229aec1cSSascha Wildner {
454229aec1cSSascha Wildner 	uint32_t crc_offset;
455229aec1cSSascha Wildner 	uint8_t flashed_crc[4];
456229aec1cSSascha Wildner 	int status;
457229aec1cSSascha Wildner 
458229aec1cSSascha Wildner 	crc_offset = hdrs_size + img_offset + img_size - 4;
459229aec1cSSascha Wildner 
460229aec1cSSascha Wildner 	p += crc_offset;
461229aec1cSSascha Wildner 
462229aec1cSSascha Wildner 	status = oce_mbox_get_flashrom_crc(sc, flashed_crc,
463229aec1cSSascha Wildner 			(img_size - 4), img_optype);
464229aec1cSSascha Wildner 	if (status)
465229aec1cSSascha Wildner 		return TRUE; /* Some thing worng. ReFlash */
466229aec1cSSascha Wildner 
467229aec1cSSascha Wildner 	/*update redboot only if crc does not match*/
468229aec1cSSascha Wildner 	if (bcmp(flashed_crc, p, 4))
469229aec1cSSascha Wildner 		return TRUE;
470229aec1cSSascha Wildner 	else
471229aec1cSSascha Wildner 		return FALSE;
472229aec1cSSascha Wildner }
473229aec1cSSascha Wildner 
474229aec1cSSascha Wildner 
475229aec1cSSascha Wildner static int
oce_lancer_fwupgrade(POCE_SOFTC sc,const struct firmware * fw)476229aec1cSSascha Wildner oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw)
477229aec1cSSascha Wildner {
478229aec1cSSascha Wildner 
479229aec1cSSascha Wildner 	int rc = 0;
480229aec1cSSascha Wildner 	OCE_DMA_MEM dma_mem;
481229aec1cSSascha Wildner 	const uint8_t *data = NULL;
482229aec1cSSascha Wildner 	uint8_t *dest_image_ptr = NULL;
483229aec1cSSascha Wildner 	size_t size = 0;
484229aec1cSSascha Wildner 	uint32_t data_written = 0, chunk_size = 0;
485229aec1cSSascha Wildner 	uint32_t offset = 0, add_status = 0;
486229aec1cSSascha Wildner 
487229aec1cSSascha Wildner 	if (!IS_ALIGNED(fw->datasize, sizeof(uint32_t))) {
488229aec1cSSascha Wildner 		device_printf(sc->dev,
489229aec1cSSascha Wildner 			"Lancer FW image is not 4 byte aligned.");
490229aec1cSSascha Wildner 		return EINVAL;
491229aec1cSSascha Wildner 	}
492229aec1cSSascha Wildner 
493229aec1cSSascha Wildner 	rc = oce_dma_alloc(sc, 32*1024, &dma_mem, 0);
494229aec1cSSascha Wildner 	if (rc) {
495229aec1cSSascha Wildner 		device_printf(sc->dev,
496229aec1cSSascha Wildner 			"Memory allocation failure while flashing Lancer\n");
497229aec1cSSascha Wildner 		return ENOMEM;
498229aec1cSSascha Wildner 	}
499229aec1cSSascha Wildner 
500229aec1cSSascha Wildner 	size = fw->datasize;
501229aec1cSSascha Wildner 	data = fw->data;
502229aec1cSSascha Wildner 	dest_image_ptr = OCE_DMAPTR(&dma_mem, uint8_t);
503229aec1cSSascha Wildner 
504229aec1cSSascha Wildner 	while (size) {
505229aec1cSSascha Wildner 		chunk_size = MIN(size, (32*1024));
506229aec1cSSascha Wildner 
507229aec1cSSascha Wildner 		bcopy(data, dest_image_ptr, chunk_size);
508229aec1cSSascha Wildner 
509229aec1cSSascha Wildner 		rc = oce_mbox_lancer_write_flashrom(sc, chunk_size, offset,
510229aec1cSSascha Wildner 				&dma_mem, &data_written, &add_status);
511229aec1cSSascha Wildner 
512229aec1cSSascha Wildner 		if (rc)
513229aec1cSSascha Wildner 			break;
514229aec1cSSascha Wildner 
515229aec1cSSascha Wildner 		size	-= data_written;
516229aec1cSSascha Wildner 		data	+= data_written;
517229aec1cSSascha Wildner 		offset	+= data_written;
518229aec1cSSascha Wildner 		tsleep(oce_lancer_fwupgrade, 0, "yield", 10);
519229aec1cSSascha Wildner 
520229aec1cSSascha Wildner 	}
521229aec1cSSascha Wildner 
522229aec1cSSascha Wildner 	if (!rc)
523229aec1cSSascha Wildner 		/* Commit the firmware*/
524229aec1cSSascha Wildner 		rc = oce_mbox_lancer_write_flashrom(sc, 0, offset, &dma_mem,
525229aec1cSSascha Wildner 						&data_written, &add_status);
526229aec1cSSascha Wildner 	if (rc) {
527229aec1cSSascha Wildner 		device_printf(sc->dev, "Lancer firmware load error. "
528229aec1cSSascha Wildner 			"Addstatus = 0x%x, status = %d \n", add_status, rc);
529229aec1cSSascha Wildner 		rc = EIO;
530229aec1cSSascha Wildner 	}
531229aec1cSSascha Wildner 	oce_dma_free(sc, &dma_mem);
532229aec1cSSascha Wildner 	return rc;
533229aec1cSSascha Wildner 
534229aec1cSSascha Wildner }
535229aec1cSSascha Wildner 
536229aec1cSSascha Wildner 
537229aec1cSSascha Wildner static void
oce_add_stats_sysctls_be3(POCE_SOFTC sc,struct sysctl_ctx_list * ctx,struct sysctl_oid * stats_node)538229aec1cSSascha Wildner oce_add_stats_sysctls_be3(POCE_SOFTC sc,
539229aec1cSSascha Wildner 				  struct sysctl_ctx_list *ctx,
540229aec1cSSascha Wildner 				  struct sysctl_oid *stats_node)
541229aec1cSSascha Wildner {
542229aec1cSSascha Wildner 	struct sysctl_oid *rx_stats_node, *tx_stats_node;
543229aec1cSSascha Wildner 	struct sysctl_oid_list *rx_stat_list, *tx_stat_list;
544229aec1cSSascha Wildner 	struct sysctl_oid_list *queue_stats_list;
545229aec1cSSascha Wildner 	struct sysctl_oid *queue_stats_node;
546229aec1cSSascha Wildner 	struct oce_drv_stats *stats;
547229aec1cSSascha Wildner 	char prefix[32];
548229aec1cSSascha Wildner 	int i;
549229aec1cSSascha Wildner 
550229aec1cSSascha Wildner 	stats = &sc->oce_stats_info;
551229aec1cSSascha Wildner 
552229aec1cSSascha Wildner 	rx_stats_node = SYSCTL_ADD_NODE(ctx,
553229aec1cSSascha Wildner 					SYSCTL_CHILDREN(stats_node),
554229aec1cSSascha Wildner 					OID_AUTO,"rx", CTLFLAG_RD,
555229aec1cSSascha Wildner 					NULL, "RX Ethernet Statistics");
556229aec1cSSascha Wildner 	rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
557229aec1cSSascha Wildner 
558229aec1cSSascha Wildner 
559229aec1cSSascha Wildner 	SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts",
560229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->rx.t_rx_pkts, 0,
561229aec1cSSascha Wildner 			"Total Received Packets");
562229aec1cSSascha Wildner 	SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes",
563229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->rx.t_rx_bytes, 0,
564229aec1cSSascha Wildner 			"Total Received Bytes");
565229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags",
566229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->rx.t_rx_frags, 0,
567229aec1cSSascha Wildner 			"Total Received Fragements");
568229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts",
569229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0,
570229aec1cSSascha Wildner 			"Total Received Multicast Packets");
571229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts",
572229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0,
573229aec1cSSascha Wildner 			"Total Received Unicast Packets");
574229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs",
575229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0,
576229aec1cSSascha Wildner 			"Total Receive completion errors");
577229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames",
578229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.rx_pause_frames, 0,
579229aec1cSSascha Wildner 			"Pause Frames");
580229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "priority_pause_frames",
581229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.rx_priority_pause_frames, 0,
582229aec1cSSascha Wildner 			"Priority Pause Frames");
583229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames",
584229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.rx_control_frames, 0,
585229aec1cSSascha Wildner 			"Control Frames");
586229aec1cSSascha Wildner 
587229aec1cSSascha Wildner 	for (i = 0; i < sc->nrqs; i++) {
588229aec1cSSascha Wildner 		ksprintf(prefix, "queue%d",i);
589229aec1cSSascha Wildner 		queue_stats_node = SYSCTL_ADD_NODE(ctx,
590229aec1cSSascha Wildner 						SYSCTL_CHILDREN(rx_stats_node),
591229aec1cSSascha Wildner 						OID_AUTO, prefix, CTLFLAG_RD,
592229aec1cSSascha Wildner 						NULL, "Queue name");
593229aec1cSSascha Wildner 		queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
594229aec1cSSascha Wildner 
595229aec1cSSascha Wildner 		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts",
596229aec1cSSascha Wildner 			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts, 0,
597229aec1cSSascha Wildner 			"Receive Packets");
598229aec1cSSascha Wildner 		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes",
599229aec1cSSascha Wildner 			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes, 0,
600f734ea4bSSascha Wildner 			"Received Bytes");
601229aec1cSSascha Wildner 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags",
602229aec1cSSascha Wildner 			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0,
603229aec1cSSascha Wildner 			"Received Fragments");
604229aec1cSSascha Wildner 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
605229aec1cSSascha Wildner 				"rx_mcast_pkts", CTLFLAG_RD,
606229aec1cSSascha Wildner 				&sc->rq[i]->rx_stats.rx_mcast_pkts, 0,
607229aec1cSSascha Wildner 					"Received Multicast Packets");
608229aec1cSSascha Wildner 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
609229aec1cSSascha Wildner 				"rx_ucast_pkts", CTLFLAG_RD,
610229aec1cSSascha Wildner 				&sc->rq[i]->rx_stats.rx_ucast_pkts, 0,
611229aec1cSSascha Wildner 					"Received Unicast Packets");
612229aec1cSSascha Wildner 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err",
613229aec1cSSascha Wildner 			CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0,
614229aec1cSSascha Wildner 			"Received Completion Errors");
615229aec1cSSascha Wildner 
616229aec1cSSascha Wildner 	}
617229aec1cSSascha Wildner 
618229aec1cSSascha Wildner 	rx_stats_node = SYSCTL_ADD_NODE(ctx,
619229aec1cSSascha Wildner 					SYSCTL_CHILDREN(rx_stats_node),
620229aec1cSSascha Wildner 					OID_AUTO, "err", CTLFLAG_RD,
621229aec1cSSascha Wildner 					NULL, "Receive Error Stats");
622229aec1cSSascha Wildner 	rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
623229aec1cSSascha Wildner 
624229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs",
625229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.rx_crc_errors, 0,
626229aec1cSSascha Wildner 			"CRC Errors");
627229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pbuf_errors",
628229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.rx_drops_no_pbuf, 0,
629229aec1cSSascha Wildner 			"Drops due to pbuf full");
630229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "erx_errors",
631229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.rx_drops_no_erx_descr, 0,
632229aec1cSSascha Wildner 			"ERX Errors");
633229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors",
634229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.rx_drops_too_many_frags, 0,
6352250180cSSascha Wildner 			"RX Alignment Errors");
636229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors",
637229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.rx_in_range_errors, 0,
638229aec1cSSascha Wildner 			"In Range Errors");
639229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors",
640229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.rx_out_range_errors, 0,
641229aec1cSSascha Wildner 			"Out Range Errors");
642229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long",
643229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.rx_frame_too_long, 0,
644229aec1cSSascha Wildner 			"Frame Too Long");
645229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors",
646229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.rx_address_match_errors, 0,
647229aec1cSSascha Wildner 			"Address Match Errors");
648229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small",
649229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.rx_dropped_too_small, 0,
650229aec1cSSascha Wildner 			"Dropped Too Small");
651229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short",
652229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.rx_dropped_too_short, 0,
653229aec1cSSascha Wildner 			"Dropped Too Short");
654229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
655229aec1cSSascha Wildner 			"dropped_header_too_small", CTLFLAG_RD,
656229aec1cSSascha Wildner 			&stats->u0.be.rx_dropped_header_too_small, 0,
657229aec1cSSascha Wildner 			"Dropped Header Too Small");
658229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_tcp_length",
659229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.rx_dropped_tcp_length, 0,
660229aec1cSSascha Wildner 			"Dropped TCP Length");
661229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt",
662229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.rx_dropped_runt, 0,
663229aec1cSSascha Wildner 			"Dropped runt");
664229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs",
665229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.rx_ip_checksum_errs, 0,
666229aec1cSSascha Wildner 			"IP Checksum Errors");
667229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs",
668229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.rx_tcp_checksum_errs, 0,
669229aec1cSSascha Wildner 			"TCP Checksum Errors");
670229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs",
671229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.rx_udp_checksum_errs, 0,
672229aec1cSSascha Wildner 			"UDP Checksum Errors");
673229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "fifo_overflow_drop",
674229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.rxpp_fifo_overflow_drop, 0,
675229aec1cSSascha Wildner 			"FIFO Overflow Drop");
676229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
677229aec1cSSascha Wildner 			"input_fifo_overflow_drop", CTLFLAG_RD,
678229aec1cSSascha Wildner 			&stats->u0.be.rx_input_fifo_overflow_drop, 0,
679229aec1cSSascha Wildner 			"Input FIFO Overflow Drop");
680229aec1cSSascha Wildner 
681229aec1cSSascha Wildner 	tx_stats_node = SYSCTL_ADD_NODE(ctx,
682229aec1cSSascha Wildner 					SYSCTL_CHILDREN(stats_node), OID_AUTO,
683229aec1cSSascha Wildner 					"tx",CTLFLAG_RD, NULL,
684229aec1cSSascha Wildner 					"TX Ethernet Statistics");
685229aec1cSSascha Wildner 	tx_stat_list = SYSCTL_CHILDREN(tx_stats_node);
686229aec1cSSascha Wildner 
687229aec1cSSascha Wildner 	SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts",
688229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->tx.t_tx_pkts, 0,
689229aec1cSSascha Wildner 			"Total Transmit Packets");
690229aec1cSSascha Wildner 	SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes",
691229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->tx.t_tx_bytes, 0,
692229aec1cSSascha Wildner 			"Total Transmit Bytes");
693229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs",
694229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->tx.t_tx_reqs, 0,
695229aec1cSSascha Wildner 			"Total Transmit Requests");
696229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops",
697229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->tx.t_tx_stops, 0,
698229aec1cSSascha Wildner 			"Total Transmit Stops");
699229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs",
700229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0,
701229aec1cSSascha Wildner 			"Total Transmit WRB's");
702229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl",
703229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->tx.t_tx_compl, 0,
704229aec1cSSascha Wildner 			"Total Transmit Completions");
705229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO,
706229aec1cSSascha Wildner 			"total_ipv6_ext_hdr_tx_drop", CTLFLAG_RD,
707229aec1cSSascha Wildner 			&stats->tx.t_ipv6_ext_hdr_tx_drop, 0,
708229aec1cSSascha Wildner 			"Total Transmit IPV6 Drops");
709229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes",
710229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.tx_pauseframes, 0,
711229aec1cSSascha Wildner 			"Pause Frames");
712229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "priority_pauseframes",
713229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.tx_priority_pauseframes, 0,
714229aec1cSSascha Wildner 			"Priority Pauseframes");
715229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes",
716229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.be.tx_controlframes, 0,
717229aec1cSSascha Wildner 			"Tx Control Frames");
718229aec1cSSascha Wildner 
719229aec1cSSascha Wildner 	for (i = 0; i < sc->nwqs; i++) {
720229aec1cSSascha Wildner 		ksprintf(prefix, "queue%d",i);
721229aec1cSSascha Wildner 		queue_stats_node = SYSCTL_ADD_NODE(ctx,
722229aec1cSSascha Wildner 						SYSCTL_CHILDREN(tx_stats_node),
723229aec1cSSascha Wildner 						OID_AUTO, prefix, CTLFLAG_RD,
724229aec1cSSascha Wildner 						NULL, "Queue name");
725229aec1cSSascha Wildner 		queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
726229aec1cSSascha Wildner 
727229aec1cSSascha Wildner 		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts",
728229aec1cSSascha Wildner 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts, 0,
729229aec1cSSascha Wildner 			"Transmit Packets");
730229aec1cSSascha Wildner 		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes",
731229aec1cSSascha Wildner 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes, 0,
732229aec1cSSascha Wildner 			"Transmit Bytes");
733229aec1cSSascha Wildner 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs",
734229aec1cSSascha Wildner 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0,
735229aec1cSSascha Wildner 			"Transmit Requests");
736229aec1cSSascha Wildner 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops",
737229aec1cSSascha Wildner 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0,
738229aec1cSSascha Wildner 			"Transmit Stops");
739229aec1cSSascha Wildner 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs",
740229aec1cSSascha Wildner 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0,
741229aec1cSSascha Wildner 			"Transmit WRB's");
742229aec1cSSascha Wildner 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl",
743229aec1cSSascha Wildner 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0,
744229aec1cSSascha Wildner 			"Transmit Completions");
745229aec1cSSascha Wildner 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
746229aec1cSSascha Wildner 			"ipv6_ext_hdr_tx_drop",CTLFLAG_RD,
747229aec1cSSascha Wildner 			&sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0,
748229aec1cSSascha Wildner 			"Transmit IPV6 Ext Header Drop");
749229aec1cSSascha Wildner 
750229aec1cSSascha Wildner 	}
751229aec1cSSascha Wildner 	return;
752229aec1cSSascha Wildner }
753229aec1cSSascha Wildner 
754229aec1cSSascha Wildner 
755229aec1cSSascha Wildner static void
oce_add_stats_sysctls_xe201(POCE_SOFTC sc,struct sysctl_ctx_list * ctx,struct sysctl_oid * stats_node)756229aec1cSSascha Wildner oce_add_stats_sysctls_xe201(POCE_SOFTC sc,
757229aec1cSSascha Wildner 				  struct sysctl_ctx_list *ctx,
758229aec1cSSascha Wildner 				  struct sysctl_oid *stats_node)
759229aec1cSSascha Wildner {
760229aec1cSSascha Wildner 	struct sysctl_oid *rx_stats_node, *tx_stats_node;
761229aec1cSSascha Wildner 	struct sysctl_oid_list *rx_stat_list, *tx_stat_list;
762229aec1cSSascha Wildner 	struct sysctl_oid_list *queue_stats_list;
763229aec1cSSascha Wildner 	struct sysctl_oid *queue_stats_node;
764229aec1cSSascha Wildner 	struct oce_drv_stats *stats;
765229aec1cSSascha Wildner 	char prefix[32];
766229aec1cSSascha Wildner 	int i;
767229aec1cSSascha Wildner 
768229aec1cSSascha Wildner 	stats = &sc->oce_stats_info;
769229aec1cSSascha Wildner 
770229aec1cSSascha Wildner 	rx_stats_node = SYSCTL_ADD_NODE(ctx,
771229aec1cSSascha Wildner 					SYSCTL_CHILDREN(stats_node),
772229aec1cSSascha Wildner 					OID_AUTO, "rx", CTLFLAG_RD,
773229aec1cSSascha Wildner 					NULL, "RX Ethernet Statistics");
774229aec1cSSascha Wildner 	rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
775229aec1cSSascha Wildner 
776229aec1cSSascha Wildner 
777229aec1cSSascha Wildner 	SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts",
778229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->rx.t_rx_pkts, 0,
779229aec1cSSascha Wildner 			"Total Received Packets");
780229aec1cSSascha Wildner 	SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes",
781229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->rx.t_rx_bytes, 0,
782229aec1cSSascha Wildner 			"Total Received Bytes");
783229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags",
784229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->rx.t_rx_frags, 0,
785229aec1cSSascha Wildner 			"Total Received Fragements");
786229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts",
787229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0,
788229aec1cSSascha Wildner 			"Total Received Multicast Packets");
789229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts",
790229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0,
791229aec1cSSascha Wildner 			"Total Received Unicast Packets");
792229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs",
793229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0,
794229aec1cSSascha Wildner 			"Total Receive completion errors");
795229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames",
796229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.xe201.rx_pause_frames, 0,
797229aec1cSSascha Wildner 			"Pause Frames");
798229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames",
799229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.xe201.rx_control_frames, 0,
800229aec1cSSascha Wildner 			"Control Frames");
801229aec1cSSascha Wildner 
802229aec1cSSascha Wildner 	for (i = 0; i < sc->nrqs; i++) {
803229aec1cSSascha Wildner 		ksprintf(prefix, "queue%d",i);
804229aec1cSSascha Wildner 		queue_stats_node = SYSCTL_ADD_NODE(ctx,
805229aec1cSSascha Wildner 						SYSCTL_CHILDREN(rx_stats_node),
806229aec1cSSascha Wildner 						OID_AUTO, prefix, CTLFLAG_RD,
807229aec1cSSascha Wildner 						NULL, "Queue name");
808229aec1cSSascha Wildner 		queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
809229aec1cSSascha Wildner 
810229aec1cSSascha Wildner 		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts",
811229aec1cSSascha Wildner 			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts, 0,
812229aec1cSSascha Wildner 			"Receive Packets");
813229aec1cSSascha Wildner 		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes",
814229aec1cSSascha Wildner 			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes, 0,
815f734ea4bSSascha Wildner 			"Received Bytes");
816229aec1cSSascha Wildner 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags",
817229aec1cSSascha Wildner 			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0,
818229aec1cSSascha Wildner 			"Received Fragments");
819229aec1cSSascha Wildner 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
820229aec1cSSascha Wildner 			"rx_mcast_pkts", CTLFLAG_RD,
821229aec1cSSascha Wildner 			&sc->rq[i]->rx_stats.rx_mcast_pkts, 0,
822229aec1cSSascha Wildner 			"Received Multicast Packets");
823229aec1cSSascha Wildner 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
824229aec1cSSascha Wildner 			"rx_ucast_pkts",CTLFLAG_RD,
825229aec1cSSascha Wildner 			&sc->rq[i]->rx_stats.rx_ucast_pkts, 0,
826229aec1cSSascha Wildner 			"Received Unicast Packets");
827229aec1cSSascha Wildner 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err",
828229aec1cSSascha Wildner 			CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0,
829229aec1cSSascha Wildner 			"Received Completion Errors");
830229aec1cSSascha Wildner 
831229aec1cSSascha Wildner 	}
832229aec1cSSascha Wildner 
833229aec1cSSascha Wildner 	rx_stats_node = SYSCTL_ADD_NODE(ctx,
834229aec1cSSascha Wildner 					SYSCTL_CHILDREN(rx_stats_node),
835229aec1cSSascha Wildner 					OID_AUTO, "err", CTLFLAG_RD,
836229aec1cSSascha Wildner 					NULL, "Receive Error Stats");
837229aec1cSSascha Wildner 	rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
838229aec1cSSascha Wildner 
839229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs",
840229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.xe201.rx_crc_errors, 0,
841229aec1cSSascha Wildner 			"CRC Errors");
842229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors",
843229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.xe201.rx_alignment_errors, 0,
8442250180cSSascha Wildner 			"RX Alignment Errors");
845229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors",
846229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.xe201.rx_in_range_errors, 0,
847229aec1cSSascha Wildner 			"In Range Errors");
848229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors",
849229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.xe201.rx_out_of_range_errors, 0,
850229aec1cSSascha Wildner 			"Out Range Errors");
851229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long",
852229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.xe201.rx_frames_too_long, 0,
853229aec1cSSascha Wildner 			"Frame Too Long");
854229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors",
855229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.xe201.rx_address_match_errors, 0,
856229aec1cSSascha Wildner 			"Address Match Errors");
857229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small",
858229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_small, 0,
859229aec1cSSascha Wildner 			"Dropped Too Small");
860229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short",
861229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_short, 0,
862229aec1cSSascha Wildner 			"Dropped Too Short");
863229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
864229aec1cSSascha Wildner 			"dropped_header_too_small", CTLFLAG_RD,
865229aec1cSSascha Wildner 			&stats->u0.xe201.rx_dropped_header_too_small, 0,
866229aec1cSSascha Wildner 			"Dropped Header Too Small");
867229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
868229aec1cSSascha Wildner 			"dropped_tcp_length", CTLFLAG_RD,
869229aec1cSSascha Wildner 			&stats->u0.xe201.rx_dropped_invalid_tcp_length, 0,
870229aec1cSSascha Wildner 			"Dropped TCP Length");
871229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt",
872229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.xe201.rx_dropped_runt, 0,
873229aec1cSSascha Wildner 			"Dropped runt");
874229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs",
875229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.xe201.rx_ip_checksum_errors, 0,
876229aec1cSSascha Wildner 			"IP Checksum Errors");
877229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs",
878229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.xe201.rx_tcp_checksum_errors, 0,
879229aec1cSSascha Wildner 			"TCP Checksum Errors");
880229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs",
881229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.xe201.rx_udp_checksum_errors, 0,
882229aec1cSSascha Wildner 			"UDP Checksum Errors");
883229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "input_fifo_overflow_drop",
884229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.xe201.rx_fifo_overflow, 0,
885229aec1cSSascha Wildner 			"Input FIFO Overflow Drop");
886229aec1cSSascha Wildner 
887229aec1cSSascha Wildner 	tx_stats_node = SYSCTL_ADD_NODE(ctx,
888229aec1cSSascha Wildner 					SYSCTL_CHILDREN(stats_node),
889229aec1cSSascha Wildner 					OID_AUTO, "tx", CTLFLAG_RD,
890229aec1cSSascha Wildner 					NULL, "TX Ethernet Statistics");
891229aec1cSSascha Wildner 	tx_stat_list = SYSCTL_CHILDREN(tx_stats_node);
892229aec1cSSascha Wildner 
893229aec1cSSascha Wildner 	SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts",
894229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->tx.t_tx_pkts, 0,
895229aec1cSSascha Wildner 			"Total Transmit Packets");
896229aec1cSSascha Wildner 	SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes",
897229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->tx.t_tx_bytes, 0,
898229aec1cSSascha Wildner 			"Total Transmit Bytes");
899229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs",
900229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->tx.t_tx_reqs, 0,
901229aec1cSSascha Wildner 			"Total Transmit Requests");
902229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops",
903229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->tx.t_tx_stops, 0,
904229aec1cSSascha Wildner 			"Total Transmit Stops");
905229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs",
906229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0,
907229aec1cSSascha Wildner 			"Total Transmit WRB's");
908229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl",
909229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->tx.t_tx_compl, 0,
910229aec1cSSascha Wildner 			"Total Transmit Completions");
911229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO,
912229aec1cSSascha Wildner 			"total_ipv6_ext_hdr_tx_drop",
913229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->tx.t_ipv6_ext_hdr_tx_drop, 0,
914229aec1cSSascha Wildner 			"Total Transmit IPV6 Drops");
915229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes",
916229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.xe201.tx_pause_frames, 0,
917229aec1cSSascha Wildner 			"Pause Frames");
918229aec1cSSascha Wildner 	SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes",
919229aec1cSSascha Wildner 			CTLFLAG_RD, &stats->u0.xe201.tx_control_frames, 0,
920229aec1cSSascha Wildner 			"Tx Control Frames");
921229aec1cSSascha Wildner 
922229aec1cSSascha Wildner 	for (i = 0; i < sc->nwqs; i++) {
923229aec1cSSascha Wildner 		ksprintf(prefix, "queue%d",i);
924229aec1cSSascha Wildner 		queue_stats_node = SYSCTL_ADD_NODE(ctx,
925229aec1cSSascha Wildner 						SYSCTL_CHILDREN(tx_stats_node),
926229aec1cSSascha Wildner 						OID_AUTO, prefix, CTLFLAG_RD,
927229aec1cSSascha Wildner 						NULL, "Queue name");
928229aec1cSSascha Wildner 		queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
929229aec1cSSascha Wildner 
930229aec1cSSascha Wildner 		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts",
931229aec1cSSascha Wildner 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts, 0,
932229aec1cSSascha Wildner 			"Transmit Packets");
933229aec1cSSascha Wildner 		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes",
934229aec1cSSascha Wildner 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes, 0,
935229aec1cSSascha Wildner 			"Transmit Bytes");
936229aec1cSSascha Wildner 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs",
937229aec1cSSascha Wildner 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0,
938229aec1cSSascha Wildner 			"Transmit Requests");
939229aec1cSSascha Wildner 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops",
940229aec1cSSascha Wildner 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0,
941229aec1cSSascha Wildner 			"Transmit Stops");
942229aec1cSSascha Wildner 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs",
943229aec1cSSascha Wildner 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0,
944229aec1cSSascha Wildner 			"Transmit WRB's");
945229aec1cSSascha Wildner 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl",
946229aec1cSSascha Wildner 			CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0,
947229aec1cSSascha Wildner 			"Transmit Completions");
948229aec1cSSascha Wildner 		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
949229aec1cSSascha Wildner 			"ipv6_ext_hdr_tx_drop", CTLFLAG_RD,
950229aec1cSSascha Wildner 			&sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0,
951229aec1cSSascha Wildner 			"Transmit IPV6 Ext Header Drop");
952229aec1cSSascha Wildner 
953229aec1cSSascha Wildner 	}
954229aec1cSSascha Wildner 	return;
955229aec1cSSascha Wildner }
956229aec1cSSascha Wildner 
957229aec1cSSascha Wildner 
958229aec1cSSascha Wildner void
oce_refresh_queue_stats(POCE_SOFTC sc)959229aec1cSSascha Wildner oce_refresh_queue_stats(POCE_SOFTC sc)
960229aec1cSSascha Wildner {
961229aec1cSSascha Wildner 	struct oce_drv_stats *adapter_stats;
962229aec1cSSascha Wildner 	int i;
963229aec1cSSascha Wildner 
964229aec1cSSascha Wildner 	adapter_stats = &sc->oce_stats_info;
965229aec1cSSascha Wildner 
966229aec1cSSascha Wildner 	/* Caluculate total TX and TXstats from all queues */
967229aec1cSSascha Wildner 
968229aec1cSSascha Wildner 	bzero(&adapter_stats->rx, sizeof(struct oce_rx_stats));
969229aec1cSSascha Wildner 	for (i = 0; i < sc->nrqs; i++) {
970229aec1cSSascha Wildner 
971229aec1cSSascha Wildner 		adapter_stats->rx.t_rx_pkts += sc->rq[i]->rx_stats.rx_pkts;
972229aec1cSSascha Wildner 		adapter_stats->rx.t_rx_bytes += sc->rq[i]->rx_stats.rx_bytes;
973229aec1cSSascha Wildner 		adapter_stats->rx.t_rx_frags += sc->rq[i]->rx_stats.rx_frags;
974229aec1cSSascha Wildner 		adapter_stats->rx.t_rx_mcast_pkts +=
975229aec1cSSascha Wildner 					sc->rq[i]->rx_stats.rx_mcast_pkts;
976229aec1cSSascha Wildner 		adapter_stats->rx.t_rx_ucast_pkts +=
977229aec1cSSascha Wildner 					sc->rq[i]->rx_stats.rx_ucast_pkts;
978229aec1cSSascha Wildner 		adapter_stats->rx.t_rxcp_errs += sc-> rq[i]->rx_stats.rxcp_err;
979229aec1cSSascha Wildner 	}
980229aec1cSSascha Wildner 
981229aec1cSSascha Wildner 	bzero(&adapter_stats->tx, sizeof(struct oce_tx_stats));
982229aec1cSSascha Wildner 	for (i = 0; i < sc->nwqs; i++) {
983229aec1cSSascha Wildner 		adapter_stats->tx.t_tx_reqs += sc->wq[i]->tx_stats.tx_reqs;
984229aec1cSSascha Wildner 		adapter_stats->tx.t_tx_stops += sc->wq[i]->tx_stats.tx_stops;
985229aec1cSSascha Wildner 		adapter_stats->tx.t_tx_wrbs += sc->wq[i]->tx_stats.tx_wrbs;
986229aec1cSSascha Wildner 		adapter_stats->tx.t_tx_compl += sc->wq[i]->tx_stats.tx_compl;
987229aec1cSSascha Wildner 		adapter_stats->tx.t_tx_bytes += sc->wq[i]->tx_stats.tx_bytes;
988229aec1cSSascha Wildner 		adapter_stats->tx.t_tx_pkts += sc->wq[i]->tx_stats.tx_pkts;
989229aec1cSSascha Wildner 		adapter_stats->tx.t_ipv6_ext_hdr_tx_drop +=
990229aec1cSSascha Wildner 				sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop;
991229aec1cSSascha Wildner 	}
992229aec1cSSascha Wildner 
993229aec1cSSascha Wildner }
994229aec1cSSascha Wildner 
995229aec1cSSascha Wildner 
996229aec1cSSascha Wildner 
997229aec1cSSascha Wildner static void
copy_stats_to_sc_xe201(POCE_SOFTC sc)998229aec1cSSascha Wildner copy_stats_to_sc_xe201(POCE_SOFTC sc)
999229aec1cSSascha Wildner {
1000229aec1cSSascha Wildner 	struct oce_xe201_stats *adapter_stats;
1001229aec1cSSascha Wildner 	struct mbx_get_pport_stats *nic_mbx;
1002229aec1cSSascha Wildner 	struct pport_stats *port_stats;
1003229aec1cSSascha Wildner 
1004229aec1cSSascha Wildner 	nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_pport_stats);
1005229aec1cSSascha Wildner 	port_stats = &nic_mbx->params.rsp.pps;
1006229aec1cSSascha Wildner 	adapter_stats = &sc->oce_stats_info.u0.xe201;
1007229aec1cSSascha Wildner 
1008229aec1cSSascha Wildner 	adapter_stats->tx_pkts = port_stats->tx_pkts;
1009229aec1cSSascha Wildner 	adapter_stats->tx_unicast_pkts = port_stats->tx_unicast_pkts;
1010229aec1cSSascha Wildner 	adapter_stats->tx_multicast_pkts = port_stats->tx_multicast_pkts;
1011229aec1cSSascha Wildner 	adapter_stats->tx_broadcast_pkts = port_stats->tx_broadcast_pkts;
1012229aec1cSSascha Wildner 	adapter_stats->tx_bytes = port_stats->tx_bytes;
1013229aec1cSSascha Wildner 	adapter_stats->tx_unicast_bytes = port_stats->tx_unicast_bytes;
1014229aec1cSSascha Wildner 	adapter_stats->tx_multicast_bytes = port_stats->tx_multicast_bytes;
1015229aec1cSSascha Wildner 	adapter_stats->tx_broadcast_bytes = port_stats->tx_broadcast_bytes;
1016229aec1cSSascha Wildner 	adapter_stats->tx_discards = port_stats->tx_discards;
1017229aec1cSSascha Wildner 	adapter_stats->tx_errors = port_stats->tx_errors;
1018229aec1cSSascha Wildner 	adapter_stats->tx_pause_frames = port_stats->tx_pause_frames;
1019229aec1cSSascha Wildner 	adapter_stats->tx_pause_on_frames = port_stats->tx_pause_on_frames;
1020229aec1cSSascha Wildner 	adapter_stats->tx_pause_off_frames = port_stats->tx_pause_off_frames;
1021229aec1cSSascha Wildner 	adapter_stats->tx_internal_mac_errors =
1022229aec1cSSascha Wildner 		port_stats->tx_internal_mac_errors;
1023229aec1cSSascha Wildner 	adapter_stats->tx_control_frames = port_stats->tx_control_frames;
1024229aec1cSSascha Wildner 	adapter_stats->tx_pkts_64_bytes = port_stats->tx_pkts_64_bytes;
1025229aec1cSSascha Wildner 	adapter_stats->tx_pkts_65_to_127_bytes =
1026229aec1cSSascha Wildner 		port_stats->tx_pkts_65_to_127_bytes;
1027229aec1cSSascha Wildner 	adapter_stats->tx_pkts_128_to_255_bytes =
1028229aec1cSSascha Wildner 		port_stats->tx_pkts_128_to_255_bytes;
1029229aec1cSSascha Wildner 	adapter_stats->tx_pkts_256_to_511_bytes =
1030229aec1cSSascha Wildner 		port_stats->tx_pkts_256_to_511_bytes;
1031229aec1cSSascha Wildner 	adapter_stats->tx_pkts_512_to_1023_bytes =
1032229aec1cSSascha Wildner 		port_stats->tx_pkts_512_to_1023_bytes;
1033229aec1cSSascha Wildner 	adapter_stats->tx_pkts_1024_to_1518_bytes =
1034229aec1cSSascha Wildner 		port_stats->tx_pkts_1024_to_1518_bytes;
1035229aec1cSSascha Wildner 	adapter_stats->tx_pkts_1519_to_2047_bytes =
1036229aec1cSSascha Wildner 		port_stats->tx_pkts_1519_to_2047_bytes;
1037229aec1cSSascha Wildner 	adapter_stats->tx_pkts_2048_to_4095_bytes =
1038229aec1cSSascha Wildner 		port_stats->tx_pkts_2048_to_4095_bytes;
1039229aec1cSSascha Wildner 	adapter_stats->tx_pkts_4096_to_8191_bytes =
1040229aec1cSSascha Wildner 		port_stats->tx_pkts_4096_to_8191_bytes;
1041229aec1cSSascha Wildner 	adapter_stats->tx_pkts_8192_to_9216_bytes =
1042229aec1cSSascha Wildner 		port_stats->tx_pkts_8192_to_9216_bytes;
1043229aec1cSSascha Wildner 	adapter_stats->tx_lso_pkts = port_stats->tx_lso_pkts;
1044229aec1cSSascha Wildner 	adapter_stats->rx_pkts = port_stats->rx_pkts;
1045229aec1cSSascha Wildner 	adapter_stats->rx_unicast_pkts = port_stats->rx_unicast_pkts;
1046229aec1cSSascha Wildner 	adapter_stats->rx_multicast_pkts = port_stats->rx_multicast_pkts;
1047229aec1cSSascha Wildner 	adapter_stats->rx_broadcast_pkts = port_stats->rx_broadcast_pkts;
1048229aec1cSSascha Wildner 	adapter_stats->rx_bytes = port_stats->rx_bytes;
1049229aec1cSSascha Wildner 	adapter_stats->rx_unicast_bytes = port_stats->rx_unicast_bytes;
1050229aec1cSSascha Wildner 	adapter_stats->rx_multicast_bytes = port_stats->rx_multicast_bytes;
1051229aec1cSSascha Wildner 	adapter_stats->rx_broadcast_bytes = port_stats->rx_broadcast_bytes;
1052229aec1cSSascha Wildner 	adapter_stats->rx_unknown_protos = port_stats->rx_unknown_protos;
1053229aec1cSSascha Wildner 	adapter_stats->rx_discards = port_stats->rx_discards;
1054229aec1cSSascha Wildner 	adapter_stats->rx_errors = port_stats->rx_errors;
1055229aec1cSSascha Wildner 	adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
1056229aec1cSSascha Wildner 	adapter_stats->rx_alignment_errors = port_stats->rx_alignment_errors;
1057229aec1cSSascha Wildner 	adapter_stats->rx_symbol_errors = port_stats->rx_symbol_errors;
1058229aec1cSSascha Wildner 	adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
1059229aec1cSSascha Wildner 	adapter_stats->rx_pause_on_frames = port_stats->rx_pause_on_frames;
1060229aec1cSSascha Wildner 	adapter_stats->rx_pause_off_frames = port_stats->rx_pause_off_frames;
1061229aec1cSSascha Wildner 	adapter_stats->rx_frames_too_long = port_stats->rx_frames_too_long;
1062229aec1cSSascha Wildner 	adapter_stats->rx_internal_mac_errors =
1063229aec1cSSascha Wildner 		port_stats->rx_internal_mac_errors;
1064229aec1cSSascha Wildner 	adapter_stats->rx_undersize_pkts = port_stats->rx_undersize_pkts;
1065229aec1cSSascha Wildner 	adapter_stats->rx_oversize_pkts = port_stats->rx_oversize_pkts;
1066229aec1cSSascha Wildner 	adapter_stats->rx_fragment_pkts = port_stats->rx_fragment_pkts;
1067229aec1cSSascha Wildner 	adapter_stats->rx_jabbers = port_stats->rx_jabbers;
1068229aec1cSSascha Wildner 	adapter_stats->rx_control_frames = port_stats->rx_control_frames;
1069229aec1cSSascha Wildner 	adapter_stats->rx_control_frames_unknown_opcode =
1070229aec1cSSascha Wildner 		port_stats->rx_control_frames_unknown_opcode;
1071229aec1cSSascha Wildner 	adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
1072229aec1cSSascha Wildner 	adapter_stats->rx_out_of_range_errors =
1073229aec1cSSascha Wildner 		port_stats->rx_out_of_range_errors;
1074229aec1cSSascha Wildner 	adapter_stats->rx_address_match_errors =
1075229aec1cSSascha Wildner 		port_stats->rx_address_match_errors;
1076229aec1cSSascha Wildner 	adapter_stats->rx_vlan_mismatch_errors =
1077229aec1cSSascha Wildner 		port_stats->rx_vlan_mismatch_errors;
1078229aec1cSSascha Wildner 	adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
1079229aec1cSSascha Wildner 	adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
1080229aec1cSSascha Wildner 	adapter_stats->rx_dropped_header_too_small =
1081229aec1cSSascha Wildner 		port_stats->rx_dropped_header_too_small;
1082229aec1cSSascha Wildner 	adapter_stats->rx_dropped_invalid_tcp_length =
1083229aec1cSSascha Wildner 		port_stats->rx_dropped_invalid_tcp_length;
1084229aec1cSSascha Wildner 	adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
1085229aec1cSSascha Wildner 	adapter_stats->rx_ip_checksum_errors =
1086229aec1cSSascha Wildner 		port_stats->rx_ip_checksum_errors;
1087229aec1cSSascha Wildner 	adapter_stats->rx_tcp_checksum_errors =
1088229aec1cSSascha Wildner 		port_stats->rx_tcp_checksum_errors;
1089229aec1cSSascha Wildner 	adapter_stats->rx_udp_checksum_errors =
1090229aec1cSSascha Wildner 		port_stats->rx_udp_checksum_errors;
1091229aec1cSSascha Wildner 	adapter_stats->rx_non_rss_pkts = port_stats->rx_non_rss_pkts;
1092229aec1cSSascha Wildner 	adapter_stats->rx_ipv4_pkts = port_stats->rx_ipv4_pkts;
1093229aec1cSSascha Wildner 	adapter_stats->rx_ipv6_pkts = port_stats->rx_ipv6_pkts;
1094229aec1cSSascha Wildner 	adapter_stats->rx_ipv4_bytes = port_stats->rx_ipv4_bytes;
1095229aec1cSSascha Wildner 	adapter_stats->rx_ipv6_bytes = port_stats->rx_ipv6_bytes;
1096229aec1cSSascha Wildner 	adapter_stats->rx_nic_pkts = port_stats->rx_nic_pkts;
1097229aec1cSSascha Wildner 	adapter_stats->rx_tcp_pkts = port_stats->rx_tcp_pkts;
1098229aec1cSSascha Wildner 	adapter_stats->rx_iscsi_pkts = port_stats->rx_iscsi_pkts;
1099229aec1cSSascha Wildner 	adapter_stats->rx_management_pkts = port_stats->rx_management_pkts;
1100229aec1cSSascha Wildner 	adapter_stats->rx_switched_unicast_pkts =
1101229aec1cSSascha Wildner 		port_stats->rx_switched_unicast_pkts;
1102229aec1cSSascha Wildner 	adapter_stats->rx_switched_multicast_pkts =
1103229aec1cSSascha Wildner 		port_stats->rx_switched_multicast_pkts;
1104229aec1cSSascha Wildner 	adapter_stats->rx_switched_broadcast_pkts =
1105229aec1cSSascha Wildner 		port_stats->rx_switched_broadcast_pkts;
1106229aec1cSSascha Wildner 	adapter_stats->num_forwards = port_stats->num_forwards;
1107229aec1cSSascha Wildner 	adapter_stats->rx_fifo_overflow = port_stats->rx_fifo_overflow;
1108229aec1cSSascha Wildner 	adapter_stats->rx_input_fifo_overflow =
1109229aec1cSSascha Wildner 		port_stats->rx_input_fifo_overflow;
1110229aec1cSSascha Wildner 	adapter_stats->rx_drops_too_many_frags =
1111229aec1cSSascha Wildner 		port_stats->rx_drops_too_many_frags;
1112229aec1cSSascha Wildner 	adapter_stats->rx_drops_invalid_queue =
1113229aec1cSSascha Wildner 		port_stats->rx_drops_invalid_queue;
1114229aec1cSSascha Wildner 	adapter_stats->rx_drops_mtu = port_stats->rx_drops_mtu;
1115229aec1cSSascha Wildner 	adapter_stats->rx_pkts_64_bytes = port_stats->rx_pkts_64_bytes;
1116229aec1cSSascha Wildner 	adapter_stats->rx_pkts_65_to_127_bytes =
1117229aec1cSSascha Wildner 		port_stats->rx_pkts_65_to_127_bytes;
1118229aec1cSSascha Wildner 	adapter_stats->rx_pkts_128_to_255_bytes =
1119229aec1cSSascha Wildner 		port_stats->rx_pkts_128_to_255_bytes;
1120229aec1cSSascha Wildner 	adapter_stats->rx_pkts_256_to_511_bytes =
1121229aec1cSSascha Wildner 		port_stats->rx_pkts_256_to_511_bytes;
1122229aec1cSSascha Wildner 	adapter_stats->rx_pkts_512_to_1023_bytes =
1123229aec1cSSascha Wildner 		port_stats->rx_pkts_512_to_1023_bytes;
1124229aec1cSSascha Wildner 	adapter_stats->rx_pkts_1024_to_1518_bytes =
1125229aec1cSSascha Wildner 		port_stats->rx_pkts_1024_to_1518_bytes;
1126229aec1cSSascha Wildner 	adapter_stats->rx_pkts_1519_to_2047_bytes =
1127229aec1cSSascha Wildner 		port_stats->rx_pkts_1519_to_2047_bytes;
1128229aec1cSSascha Wildner 	adapter_stats->rx_pkts_2048_to_4095_bytes =
1129229aec1cSSascha Wildner 		port_stats->rx_pkts_2048_to_4095_bytes;
1130229aec1cSSascha Wildner 	adapter_stats->rx_pkts_4096_to_8191_bytes =
1131229aec1cSSascha Wildner 		port_stats->rx_pkts_4096_to_8191_bytes;
1132229aec1cSSascha Wildner 	adapter_stats->rx_pkts_8192_to_9216_bytes =
1133229aec1cSSascha Wildner 		port_stats->rx_pkts_8192_to_9216_bytes;
1134229aec1cSSascha Wildner }
1135229aec1cSSascha Wildner 
1136229aec1cSSascha Wildner 
1137229aec1cSSascha Wildner 
1138229aec1cSSascha Wildner static void
copy_stats_to_sc_be2(POCE_SOFTC sc)1139229aec1cSSascha Wildner copy_stats_to_sc_be2(POCE_SOFTC sc)
1140229aec1cSSascha Wildner {
1141229aec1cSSascha Wildner 	struct oce_be_stats *adapter_stats;
1142229aec1cSSascha Wildner 	struct oce_pmem_stats *pmem;
1143229aec1cSSascha Wildner 	struct oce_rxf_stats_v0 *rxf_stats;
1144229aec1cSSascha Wildner 	struct oce_port_rxf_stats_v0 *port_stats;
1145229aec1cSSascha Wildner 	struct mbx_get_nic_stats_v0 *nic_mbx;
1146229aec1cSSascha Wildner 	uint32_t port = sc->port_id;
1147229aec1cSSascha Wildner 
1148229aec1cSSascha Wildner 	nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats_v0);
1149229aec1cSSascha Wildner 	pmem = &nic_mbx->params.rsp.stats.pmem;
1150229aec1cSSascha Wildner 	rxf_stats = &nic_mbx->params.rsp.stats.rxf;
1151229aec1cSSascha Wildner 	port_stats = &nic_mbx->params.rsp.stats.rxf.port[port];
1152229aec1cSSascha Wildner 
1153229aec1cSSascha Wildner 	adapter_stats = &sc->oce_stats_info.u0.be;
1154229aec1cSSascha Wildner 
1155229aec1cSSascha Wildner 
1156229aec1cSSascha Wildner 	/* Update stats */
1157229aec1cSSascha Wildner 	adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
1158229aec1cSSascha Wildner 	adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
1159229aec1cSSascha Wildner 	adapter_stats->rx_control_frames = port_stats->rx_control_frames;
1160229aec1cSSascha Wildner 	adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
1161229aec1cSSascha Wildner 	adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long;
1162229aec1cSSascha Wildner 	adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
1163229aec1cSSascha Wildner 	adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs;
1164229aec1cSSascha Wildner 	adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs;
1165229aec1cSSascha Wildner 	adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs;
1166229aec1cSSascha Wildner 	adapter_stats->rxpp_fifo_overflow_drop =
1167229aec1cSSascha Wildner 					port_stats->rxpp_fifo_overflow_drop;
1168229aec1cSSascha Wildner 	adapter_stats->rx_dropped_tcp_length =
1169229aec1cSSascha Wildner 		port_stats->rx_dropped_tcp_length;
1170229aec1cSSascha Wildner 	adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
1171229aec1cSSascha Wildner 	adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
1172229aec1cSSascha Wildner 	adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors;
1173229aec1cSSascha Wildner 	adapter_stats->rx_dropped_header_too_small =
1174229aec1cSSascha Wildner 		port_stats->rx_dropped_header_too_small;
1175229aec1cSSascha Wildner 	adapter_stats->rx_input_fifo_overflow_drop =
1176229aec1cSSascha Wildner 		port_stats->rx_input_fifo_overflow_drop;
1177229aec1cSSascha Wildner 	adapter_stats->rx_address_match_errors =
1178229aec1cSSascha Wildner 		port_stats->rx_address_match_errors;
1179229aec1cSSascha Wildner 	adapter_stats->rx_alignment_symbol_errors =
1180229aec1cSSascha Wildner 		port_stats->rx_alignment_symbol_errors;
1181229aec1cSSascha Wildner 	adapter_stats->tx_pauseframes = port_stats->tx_pauseframes;
1182229aec1cSSascha Wildner 	adapter_stats->tx_controlframes = port_stats->tx_controlframes;
1183229aec1cSSascha Wildner 
1184229aec1cSSascha Wildner 	if (sc->if_id)
1185229aec1cSSascha Wildner 		adapter_stats->jabber_events = rxf_stats->port1_jabber_events;
1186229aec1cSSascha Wildner 	else
1187229aec1cSSascha Wildner 		adapter_stats->jabber_events = rxf_stats->port0_jabber_events;
1188229aec1cSSascha Wildner 
1189229aec1cSSascha Wildner 	adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf;
1190229aec1cSSascha Wildner 	adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb;
1191229aec1cSSascha Wildner 	adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr;
1192229aec1cSSascha Wildner 	adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring;
1193229aec1cSSascha Wildner 	adapter_stats->forwarded_packets = rxf_stats->forwarded_packets;
1194229aec1cSSascha Wildner 	adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu;
1195229aec1cSSascha Wildner 	adapter_stats->rx_drops_no_tpre_descr =
1196229aec1cSSascha Wildner 		rxf_stats->rx_drops_no_tpre_descr;
1197229aec1cSSascha Wildner 	adapter_stats->rx_drops_too_many_frags =
1198229aec1cSSascha Wildner 		rxf_stats->rx_drops_too_many_frags;
1199229aec1cSSascha Wildner 	adapter_stats->eth_red_drops = pmem->eth_red_drops;
1200229aec1cSSascha Wildner }
1201229aec1cSSascha Wildner 
1202229aec1cSSascha Wildner 
1203229aec1cSSascha Wildner static void
copy_stats_to_sc_be3(POCE_SOFTC sc)1204229aec1cSSascha Wildner copy_stats_to_sc_be3(POCE_SOFTC sc)
1205229aec1cSSascha Wildner {
1206229aec1cSSascha Wildner 	struct oce_be_stats *adapter_stats;
1207229aec1cSSascha Wildner 	struct oce_pmem_stats *pmem;
1208229aec1cSSascha Wildner 	struct oce_rxf_stats_v1 *rxf_stats;
1209229aec1cSSascha Wildner 	struct oce_port_rxf_stats_v1 *port_stats;
1210229aec1cSSascha Wildner 	struct mbx_get_nic_stats *nic_mbx;
1211229aec1cSSascha Wildner 	uint32_t port = sc->port_id;
1212229aec1cSSascha Wildner 
1213229aec1cSSascha Wildner 	nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats);
1214229aec1cSSascha Wildner 	pmem = &nic_mbx->params.rsp.stats.pmem;
1215229aec1cSSascha Wildner 	rxf_stats = &nic_mbx->params.rsp.stats.rxf;
1216229aec1cSSascha Wildner 	port_stats = &nic_mbx->params.rsp.stats.rxf.port[port];
1217229aec1cSSascha Wildner 
1218229aec1cSSascha Wildner 	adapter_stats = &sc->oce_stats_info.u0.be;
1219229aec1cSSascha Wildner 
1220229aec1cSSascha Wildner 	/* Update stats */
1221229aec1cSSascha Wildner 	adapter_stats->pmem_fifo_overflow_drop =
1222229aec1cSSascha Wildner 		port_stats->pmem_fifo_overflow_drop;
1223229aec1cSSascha Wildner 	adapter_stats->rx_priority_pause_frames =
1224229aec1cSSascha Wildner 		port_stats->rx_priority_pause_frames;
1225229aec1cSSascha Wildner 	adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
1226229aec1cSSascha Wildner 	adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
1227229aec1cSSascha Wildner 	adapter_stats->rx_control_frames = port_stats->rx_control_frames;
1228229aec1cSSascha Wildner 	adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
1229229aec1cSSascha Wildner 	adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long;
1230229aec1cSSascha Wildner 	adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
1231229aec1cSSascha Wildner 	adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs;
1232229aec1cSSascha Wildner 	adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs;
1233229aec1cSSascha Wildner 	adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs;
1234229aec1cSSascha Wildner 	adapter_stats->rx_dropped_tcp_length =
1235229aec1cSSascha Wildner 		port_stats->rx_dropped_tcp_length;
1236229aec1cSSascha Wildner 	adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
1237229aec1cSSascha Wildner 	adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
1238229aec1cSSascha Wildner 	adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors;
1239229aec1cSSascha Wildner 	adapter_stats->rx_dropped_header_too_small =
1240229aec1cSSascha Wildner 		port_stats->rx_dropped_header_too_small;
1241229aec1cSSascha Wildner 	adapter_stats->rx_input_fifo_overflow_drop =
1242229aec1cSSascha Wildner 		port_stats->rx_input_fifo_overflow_drop;
1243229aec1cSSascha Wildner 	adapter_stats->rx_address_match_errors =
1244229aec1cSSascha Wildner 		port_stats->rx_address_match_errors;
1245229aec1cSSascha Wildner 	adapter_stats->rx_alignment_symbol_errors =
1246229aec1cSSascha Wildner 		port_stats->rx_alignment_symbol_errors;
1247229aec1cSSascha Wildner 	adapter_stats->rxpp_fifo_overflow_drop =
1248229aec1cSSascha Wildner 		port_stats->rxpp_fifo_overflow_drop;
1249229aec1cSSascha Wildner 	adapter_stats->tx_pauseframes = port_stats->tx_pauseframes;
1250229aec1cSSascha Wildner 	adapter_stats->tx_controlframes = port_stats->tx_controlframes;
1251229aec1cSSascha Wildner 	adapter_stats->jabber_events = port_stats->jabber_events;
1252229aec1cSSascha Wildner 
1253229aec1cSSascha Wildner 	adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf;
1254229aec1cSSascha Wildner 	adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb;
1255229aec1cSSascha Wildner 	adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr;
1256229aec1cSSascha Wildner 	adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring;
1257229aec1cSSascha Wildner 	adapter_stats->forwarded_packets = rxf_stats->forwarded_packets;
1258229aec1cSSascha Wildner 	adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu;
1259229aec1cSSascha Wildner 	adapter_stats->rx_drops_no_tpre_descr =
1260229aec1cSSascha Wildner 		rxf_stats->rx_drops_no_tpre_descr;
1261229aec1cSSascha Wildner 	adapter_stats->rx_drops_too_many_frags =
1262229aec1cSSascha Wildner 		rxf_stats->rx_drops_too_many_frags;
1263229aec1cSSascha Wildner 
1264229aec1cSSascha Wildner 	adapter_stats->eth_red_drops = pmem->eth_red_drops;
1265229aec1cSSascha Wildner }
1266229aec1cSSascha Wildner 
1267229aec1cSSascha Wildner 
1268229aec1cSSascha Wildner int
oce_stats_init(POCE_SOFTC sc)1269229aec1cSSascha Wildner oce_stats_init(POCE_SOFTC sc)
1270229aec1cSSascha Wildner {
1271229aec1cSSascha Wildner 	int rc = 0, sz;
1272229aec1cSSascha Wildner 
1273c976b08eSSascha Wildner 	if (IS_BE(sc) || IS_SH(sc)) {
1274229aec1cSSascha Wildner 		if (sc->flags & OCE_FLAGS_BE2)
1275229aec1cSSascha Wildner 			sz = sizeof(struct mbx_get_nic_stats_v0);
1276229aec1cSSascha Wildner 		else
1277229aec1cSSascha Wildner 			sz = sizeof(struct mbx_get_nic_stats);
1278229aec1cSSascha Wildner 	} else
1279229aec1cSSascha Wildner 		sz = sizeof(struct mbx_get_pport_stats);
1280229aec1cSSascha Wildner 
1281229aec1cSSascha Wildner 	rc = oce_dma_alloc(sc, sz, &sc->stats_mem, 0);
1282229aec1cSSascha Wildner 
1283229aec1cSSascha Wildner 	return rc;
1284229aec1cSSascha Wildner }
1285229aec1cSSascha Wildner 
1286229aec1cSSascha Wildner 
1287229aec1cSSascha Wildner void
oce_stats_free(POCE_SOFTC sc)1288229aec1cSSascha Wildner oce_stats_free(POCE_SOFTC sc)
1289229aec1cSSascha Wildner {
1290229aec1cSSascha Wildner 
1291229aec1cSSascha Wildner 	oce_dma_free(sc, &sc->stats_mem);
1292229aec1cSSascha Wildner 
1293229aec1cSSascha Wildner }
1294229aec1cSSascha Wildner 
1295229aec1cSSascha Wildner 
1296229aec1cSSascha Wildner int
oce_refresh_nic_stats(POCE_SOFTC sc)1297229aec1cSSascha Wildner oce_refresh_nic_stats(POCE_SOFTC sc)
1298229aec1cSSascha Wildner {
1299229aec1cSSascha Wildner 	int rc = 0, reset = 0;
1300229aec1cSSascha Wildner 
1301c976b08eSSascha Wildner 	if (IS_BE(sc) || IS_SH(sc)) {
1302229aec1cSSascha Wildner 		if (sc->flags & OCE_FLAGS_BE2) {
1303229aec1cSSascha Wildner 			rc = oce_mbox_get_nic_stats_v0(sc, &sc->stats_mem);
1304229aec1cSSascha Wildner 			if (!rc)
1305229aec1cSSascha Wildner 				copy_stats_to_sc_be2(sc);
1306229aec1cSSascha Wildner 		} else {
1307229aec1cSSascha Wildner 			rc = oce_mbox_get_nic_stats(sc, &sc->stats_mem);
1308229aec1cSSascha Wildner 			if (!rc)
1309229aec1cSSascha Wildner 				copy_stats_to_sc_be3(sc);
1310229aec1cSSascha Wildner 		}
1311229aec1cSSascha Wildner 
1312229aec1cSSascha Wildner 	} else {
1313229aec1cSSascha Wildner 		rc = oce_mbox_get_pport_stats(sc, &sc->stats_mem, reset);
1314229aec1cSSascha Wildner 		if (!rc)
1315229aec1cSSascha Wildner 			copy_stats_to_sc_xe201(sc);
1316229aec1cSSascha Wildner 	}
1317229aec1cSSascha Wildner 
1318229aec1cSSascha Wildner 	return rc;
1319229aec1cSSascha Wildner }
1320229aec1cSSascha Wildner 
1321229aec1cSSascha Wildner static int
oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS)1322229aec1cSSascha Wildner oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS)
1323229aec1cSSascha Wildner {
1324229aec1cSSascha Wildner 	int result = 0, error;
1325229aec1cSSascha Wildner 	int rc = 0;
1326229aec1cSSascha Wildner 	POCE_SOFTC sc = (POCE_SOFTC) arg1;
1327229aec1cSSascha Wildner 
1328229aec1cSSascha Wildner 	/* sysctl default handler */
1329229aec1cSSascha Wildner 	error = sysctl_handle_int(oidp, &result, 0, req);
1330229aec1cSSascha Wildner 	if (error || !req->newptr)
1331229aec1cSSascha Wildner 		return (error);
1332229aec1cSSascha Wildner 
1333229aec1cSSascha Wildner 	if(result == -1) {
1334229aec1cSSascha Wildner 		return EINVAL;
1335229aec1cSSascha Wildner 	}
1336229aec1cSSascha Wildner 	bzero((char *)sfp_vpd_dump_buffer, TRANSCEIVER_DATA_SIZE);
1337229aec1cSSascha Wildner 
1338229aec1cSSascha Wildner 	rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A0);
1339229aec1cSSascha Wildner 	if(rc)
1340229aec1cSSascha Wildner 		return rc;
1341229aec1cSSascha Wildner 
1342c8dd1ae6SSascha Wildner 	return oce_mbox_read_transrecv_data(sc, PAGE_NUM_A2);
1343229aec1cSSascha Wildner }
1344