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