linux/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.h
<<
>>
Prefs
   1/* bnx2x_stats.h: QLogic Everest network driver.
   2 *
   3 * Copyright (c) 2007-2013 Broadcom Corporation
   4 * Copyright (c) 2014 QLogic Corporation
   5 * All rights reserved
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License as published by
   9 * the Free Software Foundation.
  10 *
  11 * Maintained by: Ariel Elior <ariel.elior@qlogic.com>
  12 * Written by: Eliezer Tamir
  13 * Based on code from Michael Chan's bnx2 driver
  14 * UDP CSUM errata workaround by Arik Gendelman
  15 * Slowpath and fastpath rework by Vladislav Zolotarov
  16 * Statistics and Link management by Yitchak Gertner
  17 *
  18 */
  19#ifndef BNX2X_STATS_H
  20#define BNX2X_STATS_H
  21
  22#include <linux/types.h>
  23
  24struct nig_stats {
  25        u32 brb_discard;
  26        u32 brb_packet;
  27        u32 brb_truncate;
  28        u32 flow_ctrl_discard;
  29        u32 flow_ctrl_octets;
  30        u32 flow_ctrl_packet;
  31        u32 mng_discard;
  32        u32 mng_octet_inp;
  33        u32 mng_octet_out;
  34        u32 mng_packet_inp;
  35        u32 mng_packet_out;
  36        u32 pbf_octets;
  37        u32 pbf_packet;
  38        u32 safc_inp;
  39        u32 egress_mac_pkt0_lo;
  40        u32 egress_mac_pkt0_hi;
  41        u32 egress_mac_pkt1_lo;
  42        u32 egress_mac_pkt1_hi;
  43};
  44
  45enum bnx2x_stats_event {
  46        STATS_EVENT_PMF = 0,
  47        STATS_EVENT_LINK_UP,
  48        STATS_EVENT_UPDATE,
  49        STATS_EVENT_STOP,
  50        STATS_EVENT_MAX
  51};
  52
  53enum bnx2x_stats_state {
  54        STATS_STATE_DISABLED = 0,
  55        STATS_STATE_ENABLED,
  56        STATS_STATE_MAX
  57};
  58
  59struct bnx2x_eth_stats {
  60        u32 total_bytes_received_hi;
  61        u32 total_bytes_received_lo;
  62        u32 total_bytes_transmitted_hi;
  63        u32 total_bytes_transmitted_lo;
  64        u32 total_unicast_packets_received_hi;
  65        u32 total_unicast_packets_received_lo;
  66        u32 total_multicast_packets_received_hi;
  67        u32 total_multicast_packets_received_lo;
  68        u32 total_broadcast_packets_received_hi;
  69        u32 total_broadcast_packets_received_lo;
  70        u32 total_unicast_packets_transmitted_hi;
  71        u32 total_unicast_packets_transmitted_lo;
  72        u32 total_multicast_packets_transmitted_hi;
  73        u32 total_multicast_packets_transmitted_lo;
  74        u32 total_broadcast_packets_transmitted_hi;
  75        u32 total_broadcast_packets_transmitted_lo;
  76        u32 valid_bytes_received_hi;
  77        u32 valid_bytes_received_lo;
  78
  79        u32 error_bytes_received_hi;
  80        u32 error_bytes_received_lo;
  81        u32 etherstatsoverrsizepkts_hi;
  82        u32 etherstatsoverrsizepkts_lo;
  83        u32 no_buff_discard_hi;
  84        u32 no_buff_discard_lo;
  85
  86        u32 rx_stat_ifhcinbadoctets_hi;
  87        u32 rx_stat_ifhcinbadoctets_lo;
  88        u32 tx_stat_ifhcoutbadoctets_hi;
  89        u32 tx_stat_ifhcoutbadoctets_lo;
  90        u32 rx_stat_dot3statsfcserrors_hi;
  91        u32 rx_stat_dot3statsfcserrors_lo;
  92        u32 rx_stat_dot3statsalignmenterrors_hi;
  93        u32 rx_stat_dot3statsalignmenterrors_lo;
  94        u32 rx_stat_dot3statscarriersenseerrors_hi;
  95        u32 rx_stat_dot3statscarriersenseerrors_lo;
  96        u32 rx_stat_falsecarriererrors_hi;
  97        u32 rx_stat_falsecarriererrors_lo;
  98        u32 rx_stat_etherstatsundersizepkts_hi;
  99        u32 rx_stat_etherstatsundersizepkts_lo;
 100        u32 rx_stat_dot3statsframestoolong_hi;
 101        u32 rx_stat_dot3statsframestoolong_lo;
 102        u32 rx_stat_etherstatsfragments_hi;
 103        u32 rx_stat_etherstatsfragments_lo;
 104        u32 rx_stat_etherstatsjabbers_hi;
 105        u32 rx_stat_etherstatsjabbers_lo;
 106        u32 rx_stat_maccontrolframesreceived_hi;
 107        u32 rx_stat_maccontrolframesreceived_lo;
 108        u32 rx_stat_bmac_xpf_hi;
 109        u32 rx_stat_bmac_xpf_lo;
 110        u32 rx_stat_bmac_xcf_hi;
 111        u32 rx_stat_bmac_xcf_lo;
 112        u32 rx_stat_xoffstateentered_hi;
 113        u32 rx_stat_xoffstateentered_lo;
 114        u32 rx_stat_xonpauseframesreceived_hi;
 115        u32 rx_stat_xonpauseframesreceived_lo;
 116        u32 rx_stat_xoffpauseframesreceived_hi;
 117        u32 rx_stat_xoffpauseframesreceived_lo;
 118        u32 tx_stat_outxonsent_hi;
 119        u32 tx_stat_outxonsent_lo;
 120        u32 tx_stat_outxoffsent_hi;
 121        u32 tx_stat_outxoffsent_lo;
 122        u32 tx_stat_flowcontroldone_hi;
 123        u32 tx_stat_flowcontroldone_lo;
 124        u32 tx_stat_etherstatscollisions_hi;
 125        u32 tx_stat_etherstatscollisions_lo;
 126        u32 tx_stat_dot3statssinglecollisionframes_hi;
 127        u32 tx_stat_dot3statssinglecollisionframes_lo;
 128        u32 tx_stat_dot3statsmultiplecollisionframes_hi;
 129        u32 tx_stat_dot3statsmultiplecollisionframes_lo;
 130        u32 tx_stat_dot3statsdeferredtransmissions_hi;
 131        u32 tx_stat_dot3statsdeferredtransmissions_lo;
 132        u32 tx_stat_dot3statsexcessivecollisions_hi;
 133        u32 tx_stat_dot3statsexcessivecollisions_lo;
 134        u32 tx_stat_dot3statslatecollisions_hi;
 135        u32 tx_stat_dot3statslatecollisions_lo;
 136        u32 tx_stat_etherstatspkts64octets_hi;
 137        u32 tx_stat_etherstatspkts64octets_lo;
 138        u32 tx_stat_etherstatspkts65octetsto127octets_hi;
 139        u32 tx_stat_etherstatspkts65octetsto127octets_lo;
 140        u32 tx_stat_etherstatspkts128octetsto255octets_hi;
 141        u32 tx_stat_etherstatspkts128octetsto255octets_lo;
 142        u32 tx_stat_etherstatspkts256octetsto511octets_hi;
 143        u32 tx_stat_etherstatspkts256octetsto511octets_lo;
 144        u32 tx_stat_etherstatspkts512octetsto1023octets_hi;
 145        u32 tx_stat_etherstatspkts512octetsto1023octets_lo;
 146        u32 tx_stat_etherstatspkts1024octetsto1522octets_hi;
 147        u32 tx_stat_etherstatspkts1024octetsto1522octets_lo;
 148        u32 tx_stat_etherstatspktsover1522octets_hi;
 149        u32 tx_stat_etherstatspktsover1522octets_lo;
 150        u32 tx_stat_bmac_2047_hi;
 151        u32 tx_stat_bmac_2047_lo;
 152        u32 tx_stat_bmac_4095_hi;
 153        u32 tx_stat_bmac_4095_lo;
 154        u32 tx_stat_bmac_9216_hi;
 155        u32 tx_stat_bmac_9216_lo;
 156        u32 tx_stat_bmac_16383_hi;
 157        u32 tx_stat_bmac_16383_lo;
 158        u32 tx_stat_dot3statsinternalmactransmiterrors_hi;
 159        u32 tx_stat_dot3statsinternalmactransmiterrors_lo;
 160        u32 tx_stat_bmac_ufl_hi;
 161        u32 tx_stat_bmac_ufl_lo;
 162
 163        u32 pause_frames_received_hi;
 164        u32 pause_frames_received_lo;
 165        u32 pause_frames_sent_hi;
 166        u32 pause_frames_sent_lo;
 167
 168        u32 etherstatspkts1024octetsto1522octets_hi;
 169        u32 etherstatspkts1024octetsto1522octets_lo;
 170        u32 etherstatspktsover1522octets_hi;
 171        u32 etherstatspktsover1522octets_lo;
 172
 173        u32 brb_drop_hi;
 174        u32 brb_drop_lo;
 175        u32 brb_truncate_hi;
 176        u32 brb_truncate_lo;
 177
 178        u32 mac_filter_discard;
 179        u32 mf_tag_discard;
 180        u32 brb_truncate_discard;
 181        u32 mac_discard;
 182
 183        u32 driver_xoff;
 184        u32 rx_err_discard_pkt;
 185        u32 rx_skb_alloc_failed;
 186        u32 hw_csum_err;
 187
 188        u32 nig_timer_max;
 189
 190        /* TPA */
 191        u32 total_tpa_aggregations_hi;
 192        u32 total_tpa_aggregations_lo;
 193        u32 total_tpa_aggregated_frames_hi;
 194        u32 total_tpa_aggregated_frames_lo;
 195        u32 total_tpa_bytes_hi;
 196        u32 total_tpa_bytes_lo;
 197
 198        /* PFC */
 199        u32 pfc_frames_received_hi;
 200        u32 pfc_frames_received_lo;
 201        u32 pfc_frames_sent_hi;
 202        u32 pfc_frames_sent_lo;
 203
 204        /* Recovery */
 205        u32 recoverable_error;
 206        u32 unrecoverable_error;
 207        u32 driver_filtered_tx_pkt;
 208        /* src: Clear-on-Read register; Will not survive PMF Migration */
 209        u32 eee_tx_lpi;
 210};
 211
 212struct bnx2x_eth_q_stats {
 213        u32 total_unicast_bytes_received_hi;
 214        u32 total_unicast_bytes_received_lo;
 215        u32 total_broadcast_bytes_received_hi;
 216        u32 total_broadcast_bytes_received_lo;
 217        u32 total_multicast_bytes_received_hi;
 218        u32 total_multicast_bytes_received_lo;
 219        u32 total_bytes_received_hi;
 220        u32 total_bytes_received_lo;
 221        u32 total_unicast_bytes_transmitted_hi;
 222        u32 total_unicast_bytes_transmitted_lo;
 223        u32 total_broadcast_bytes_transmitted_hi;
 224        u32 total_broadcast_bytes_transmitted_lo;
 225        u32 total_multicast_bytes_transmitted_hi;
 226        u32 total_multicast_bytes_transmitted_lo;
 227        u32 total_bytes_transmitted_hi;
 228        u32 total_bytes_transmitted_lo;
 229        u32 total_unicast_packets_received_hi;
 230        u32 total_unicast_packets_received_lo;
 231        u32 total_multicast_packets_received_hi;
 232        u32 total_multicast_packets_received_lo;
 233        u32 total_broadcast_packets_received_hi;
 234        u32 total_broadcast_packets_received_lo;
 235        u32 total_unicast_packets_transmitted_hi;
 236        u32 total_unicast_packets_transmitted_lo;
 237        u32 total_multicast_packets_transmitted_hi;
 238        u32 total_multicast_packets_transmitted_lo;
 239        u32 total_broadcast_packets_transmitted_hi;
 240        u32 total_broadcast_packets_transmitted_lo;
 241        u32 valid_bytes_received_hi;
 242        u32 valid_bytes_received_lo;
 243
 244        u32 etherstatsoverrsizepkts_hi;
 245        u32 etherstatsoverrsizepkts_lo;
 246        u32 no_buff_discard_hi;
 247        u32 no_buff_discard_lo;
 248
 249        u32 driver_xoff;
 250        u32 rx_err_discard_pkt;
 251        u32 rx_skb_alloc_failed;
 252        u32 hw_csum_err;
 253
 254        u32 total_packets_received_checksum_discarded_hi;
 255        u32 total_packets_received_checksum_discarded_lo;
 256        u32 total_packets_received_ttl0_discarded_hi;
 257        u32 total_packets_received_ttl0_discarded_lo;
 258        u32 total_transmitted_dropped_packets_error_hi;
 259        u32 total_transmitted_dropped_packets_error_lo;
 260
 261        /* TPA */
 262        u32 total_tpa_aggregations_hi;
 263        u32 total_tpa_aggregations_lo;
 264        u32 total_tpa_aggregated_frames_hi;
 265        u32 total_tpa_aggregated_frames_lo;
 266        u32 total_tpa_bytes_hi;
 267        u32 total_tpa_bytes_lo;
 268        u32 driver_filtered_tx_pkt;
 269};
 270
 271struct bnx2x_eth_stats_old {
 272        u32 rx_stat_dot3statsframestoolong_hi;
 273        u32 rx_stat_dot3statsframestoolong_lo;
 274};
 275
 276struct bnx2x_eth_q_stats_old {
 277        /* Fields to perserve over fw reset*/
 278        u32 total_unicast_bytes_received_hi;
 279        u32 total_unicast_bytes_received_lo;
 280        u32 total_broadcast_bytes_received_hi;
 281        u32 total_broadcast_bytes_received_lo;
 282        u32 total_multicast_bytes_received_hi;
 283        u32 total_multicast_bytes_received_lo;
 284        u32 total_unicast_bytes_transmitted_hi;
 285        u32 total_unicast_bytes_transmitted_lo;
 286        u32 total_broadcast_bytes_transmitted_hi;
 287        u32 total_broadcast_bytes_transmitted_lo;
 288        u32 total_multicast_bytes_transmitted_hi;
 289        u32 total_multicast_bytes_transmitted_lo;
 290        u32 total_tpa_bytes_hi;
 291        u32 total_tpa_bytes_lo;
 292
 293        /* Fields to perserve last of */
 294        u32 total_bytes_received_hi;
 295        u32 total_bytes_received_lo;
 296        u32 total_bytes_transmitted_hi;
 297        u32 total_bytes_transmitted_lo;
 298        u32 total_unicast_packets_received_hi;
 299        u32 total_unicast_packets_received_lo;
 300        u32 total_multicast_packets_received_hi;
 301        u32 total_multicast_packets_received_lo;
 302        u32 total_broadcast_packets_received_hi;
 303        u32 total_broadcast_packets_received_lo;
 304        u32 total_unicast_packets_transmitted_hi;
 305        u32 total_unicast_packets_transmitted_lo;
 306        u32 total_multicast_packets_transmitted_hi;
 307        u32 total_multicast_packets_transmitted_lo;
 308        u32 total_broadcast_packets_transmitted_hi;
 309        u32 total_broadcast_packets_transmitted_lo;
 310        u32 valid_bytes_received_hi;
 311        u32 valid_bytes_received_lo;
 312
 313        u32 total_tpa_bytes_hi_old;
 314        u32 total_tpa_bytes_lo_old;
 315
 316        u32 driver_xoff_old;
 317        u32 rx_err_discard_pkt_old;
 318        u32 rx_skb_alloc_failed_old;
 319        u32 hw_csum_err_old;
 320        u32 driver_filtered_tx_pkt_old;
 321};
 322
 323struct bnx2x_net_stats_old {
 324         u32 rx_dropped;
 325};
 326
 327struct bnx2x_fw_port_stats_old {
 328         u32 mac_filter_discard;
 329         u32 mf_tag_discard;
 330         u32 brb_truncate_discard;
 331         u32 mac_discard;
 332};
 333
 334/****************************************************************************
 335* Macros
 336****************************************************************************/
 337
 338/* sum[hi:lo] += add[hi:lo] */
 339#define ADD_64(s_hi, a_hi, s_lo, a_lo) \
 340        do { \
 341                s_lo += a_lo; \
 342                s_hi += a_hi + ((s_lo < a_lo) ? 1 : 0); \
 343        } while (0)
 344
 345#define LE32_0 ((__force __le32) 0)
 346#define LE16_0 ((__force __le16) 0)
 347
 348/* The _force is for cases where high value is 0 */
 349#define ADD_64_LE(s_hi, a_hi_le, s_lo, a_lo_le) \
 350                ADD_64(s_hi, le32_to_cpu(a_hi_le), \
 351                       s_lo, le32_to_cpu(a_lo_le))
 352
 353#define ADD_64_LE16(s_hi, a_hi_le, s_lo, a_lo_le) \
 354                ADD_64(s_hi, le16_to_cpu(a_hi_le), \
 355                       s_lo, le16_to_cpu(a_lo_le))
 356
 357/* difference = minuend - subtrahend */
 358#define DIFF_64(d_hi, m_hi, s_hi, d_lo, m_lo, s_lo) \
 359        do { \
 360                if (m_lo < s_lo) { \
 361                        /* underflow */ \
 362                        d_hi = m_hi - s_hi; \
 363                        if (d_hi > 0) { \
 364                                /* we can 'loan' 1 */ \
 365                                d_hi--; \
 366                                d_lo = m_lo + (UINT_MAX - s_lo) + 1; \
 367                        } else { \
 368                                /* m_hi <= s_hi */ \
 369                                d_hi = 0; \
 370                                d_lo = 0; \
 371                        } \
 372                } else { \
 373                        /* m_lo >= s_lo */ \
 374                        if (m_hi < s_hi) { \
 375                                d_hi = 0; \
 376                                d_lo = 0; \
 377                        } else { \
 378                                /* m_hi >= s_hi */ \
 379                                d_hi = m_hi - s_hi; \
 380                                d_lo = m_lo - s_lo; \
 381                        } \
 382                } \
 383        } while (0)
 384
 385#define UPDATE_STAT64(s, t) \
 386        do { \
 387                DIFF_64(diff.hi, new->s##_hi, pstats->mac_stx[0].t##_hi, \
 388                        diff.lo, new->s##_lo, pstats->mac_stx[0].t##_lo); \
 389                pstats->mac_stx[0].t##_hi = new->s##_hi; \
 390                pstats->mac_stx[0].t##_lo = new->s##_lo; \
 391                ADD_64(pstats->mac_stx[1].t##_hi, diff.hi, \
 392                       pstats->mac_stx[1].t##_lo, diff.lo); \
 393        } while (0)
 394
 395#define UPDATE_STAT64_NIG(s, t) \
 396        do { \
 397                DIFF_64(diff.hi, new->s##_hi, old->s##_hi, \
 398                        diff.lo, new->s##_lo, old->s##_lo); \
 399                ADD_64(estats->t##_hi, diff.hi, \
 400                       estats->t##_lo, diff.lo); \
 401        } while (0)
 402
 403/* sum[hi:lo] += add */
 404#define ADD_EXTEND_64(s_hi, s_lo, a) \
 405        do { \
 406                s_lo += a; \
 407                s_hi += (s_lo < a) ? 1 : 0; \
 408        } while (0)
 409
 410#define ADD_STAT64(diff, t) \
 411        do { \
 412                ADD_64(pstats->mac_stx[1].t##_hi, new->diff##_hi, \
 413                       pstats->mac_stx[1].t##_lo, new->diff##_lo); \
 414        } while (0)
 415
 416#define UPDATE_EXTEND_STAT(s) \
 417        do { \
 418                ADD_EXTEND_64(pstats->mac_stx[1].s##_hi, \
 419                              pstats->mac_stx[1].s##_lo, \
 420                              new->s); \
 421        } while (0)
 422
 423#define UPDATE_EXTEND_TSTAT_X(s, t, size) \
 424        do { \
 425                diff = le##size##_to_cpu(tclient->s) - \
 426                       le##size##_to_cpu(old_tclient->s); \
 427                old_tclient->s = tclient->s; \
 428                ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \
 429        } while (0)
 430
 431#define UPDATE_EXTEND_TSTAT(s, t) UPDATE_EXTEND_TSTAT_X(s, t, 32)
 432
 433#define UPDATE_EXTEND_E_TSTAT(s, t, size) \
 434        do { \
 435                UPDATE_EXTEND_TSTAT_X(s, t, size); \
 436                ADD_EXTEND_64(estats->t##_hi, estats->t##_lo, diff); \
 437        } while (0)
 438
 439#define UPDATE_EXTEND_USTAT(s, t) \
 440        do { \
 441                diff = le32_to_cpu(uclient->s) - le32_to_cpu(old_uclient->s); \
 442                old_uclient->s = uclient->s; \
 443                ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \
 444        } while (0)
 445
 446#define UPDATE_EXTEND_E_USTAT(s, t) \
 447        do { \
 448                UPDATE_EXTEND_USTAT(s, t); \
 449                ADD_EXTEND_64(estats->t##_hi, estats->t##_lo, diff); \
 450        } while (0)
 451
 452#define UPDATE_EXTEND_XSTAT(s, t) \
 453        do { \
 454                diff = le32_to_cpu(xclient->s) - le32_to_cpu(old_xclient->s); \
 455                old_xclient->s = xclient->s; \
 456                ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \
 457        } while (0)
 458
 459#define UPDATE_QSTAT(s, t) \
 460        do { \
 461                qstats->t##_lo = qstats_old->t##_lo + le32_to_cpu(s.lo); \
 462                qstats->t##_hi = qstats_old->t##_hi + le32_to_cpu(s.hi) \
 463                        + ((qstats->t##_lo < qstats_old->t##_lo) ? 1 : 0); \
 464        } while (0)
 465
 466#define UPDATE_QSTAT_OLD(f) \
 467        do { \
 468                qstats_old->f = qstats->f; \
 469        } while (0)
 470
 471#define UPDATE_ESTAT_QSTAT_64(s) \
 472        do { \
 473                ADD_64(estats->s##_hi, qstats->s##_hi, \
 474                       estats->s##_lo, qstats->s##_lo); \
 475                SUB_64(estats->s##_hi, qstats_old->s##_hi_old, \
 476                       estats->s##_lo, qstats_old->s##_lo_old); \
 477                qstats_old->s##_hi_old = qstats->s##_hi; \
 478                qstats_old->s##_lo_old = qstats->s##_lo; \
 479        } while (0)
 480
 481#define UPDATE_ESTAT_QSTAT(s) \
 482        do { \
 483                estats->s += qstats->s; \
 484                estats->s -= qstats_old->s##_old; \
 485                qstats_old->s##_old = qstats->s; \
 486        } while (0)
 487
 488#define UPDATE_FSTAT_QSTAT(s) \
 489        do { \
 490                ADD_64(fstats->s##_hi, qstats->s##_hi, \
 491                       fstats->s##_lo, qstats->s##_lo); \
 492                SUB_64(fstats->s##_hi, qstats_old->s##_hi, \
 493                       fstats->s##_lo, qstats_old->s##_lo); \
 494                estats->s##_hi = fstats->s##_hi; \
 495                estats->s##_lo = fstats->s##_lo; \
 496                qstats_old->s##_hi = qstats->s##_hi; \
 497                qstats_old->s##_lo = qstats->s##_lo; \
 498        } while (0)
 499
 500#define UPDATE_FW_STAT(s) \
 501        do { \
 502                estats->s = le32_to_cpu(tport->s) + fwstats->s; \
 503        } while (0)
 504
 505#define UPDATE_FW_STAT_OLD(f) \
 506        do { \
 507                fwstats->f = estats->f; \
 508        } while (0)
 509
 510#define UPDATE_ESTAT(s, t) \
 511        do { \
 512                SUB_64(estats->s##_hi, estats_old->t##_hi, \
 513                       estats->s##_lo, estats_old->t##_lo); \
 514                ADD_64(estats->s##_hi, estats->t##_hi, \
 515                       estats->s##_lo, estats->t##_lo); \
 516                estats_old->t##_hi = estats->t##_hi; \
 517                estats_old->t##_lo = estats->t##_lo; \
 518        } while (0)
 519
 520/* minuend -= subtrahend */
 521#define SUB_64(m_hi, s_hi, m_lo, s_lo) \
 522        do { \
 523                DIFF_64(m_hi, m_hi, s_hi, m_lo, m_lo, s_lo); \
 524        } while (0)
 525
 526/* minuend[hi:lo] -= subtrahend */
 527#define SUB_EXTEND_64(m_hi, m_lo, s) \
 528        do { \
 529                SUB_64(m_hi, 0, m_lo, s); \
 530        } while (0)
 531
 532#define SUB_EXTEND_USTAT(s, t) \
 533        do { \
 534                diff = le32_to_cpu(uclient->s) - le32_to_cpu(old_uclient->s); \
 535                SUB_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \
 536        } while (0)
 537
 538/* forward */
 539struct bnx2x;
 540
 541void bnx2x_memset_stats(struct bnx2x *bp);
 542void bnx2x_stats_init(struct bnx2x *bp);
 543void bnx2x_stats_handle(struct bnx2x *bp, enum bnx2x_stats_event event);
 544int bnx2x_stats_safe_exec(struct bnx2x *bp,
 545                          void (func_to_exec)(void *cookie),
 546                          void *cookie);
 547
 548/**
 549 * bnx2x_save_statistics - save statistics when unloading.
 550 *
 551 * @bp:         driver handle
 552 */
 553void bnx2x_save_statistics(struct bnx2x *bp);
 554
 555void bnx2x_afex_collect_stats(struct bnx2x *bp, void *void_afex_stats,
 556                              u32 stats_type);
 557#endif /* BNX2X_STATS_H */
 558