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