cxgb_vsc7323.c revision 1.1.4.2       1  1.1.4.2  rmind 
      2  1.1.4.2  rmind /**************************************************************************
      3  1.1.4.2  rmind 
      4  1.1.4.2  rmind Copyright (c) 2007, Chelsio Inc.
      5  1.1.4.2  rmind All rights reserved.
      6  1.1.4.2  rmind 
      7  1.1.4.2  rmind Redistribution and use in source and binary forms, with or without
      8  1.1.4.2  rmind modification, are permitted provided that the following conditions are met:
      9  1.1.4.2  rmind 
     10  1.1.4.2  rmind  1. Redistributions of source code must retain the above copyright notice,
     11  1.1.4.2  rmind     this list of conditions and the following disclaimer.
     12  1.1.4.2  rmind 
     13  1.1.4.2  rmind  2. Neither the name of the Chelsio Corporation nor the names of its
     14  1.1.4.2  rmind     contributors may be used to endorse or promote products derived from
     15  1.1.4.2  rmind     this software without specific prior written permission.
     16  1.1.4.2  rmind 
     17  1.1.4.2  rmind THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     18  1.1.4.2  rmind AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     19  1.1.4.2  rmind IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     20  1.1.4.2  rmind ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     21  1.1.4.2  rmind LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     22  1.1.4.2  rmind CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     23  1.1.4.2  rmind SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     24  1.1.4.2  rmind INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     25  1.1.4.2  rmind CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     26  1.1.4.2  rmind ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     27  1.1.4.2  rmind POSSIBILITY OF SUCH DAMAGE.
     28  1.1.4.2  rmind 
     29  1.1.4.2  rmind ***************************************************************************/
     30  1.1.4.2  rmind 
     31  1.1.4.2  rmind #include <sys/cdefs.h>
     32  1.1.4.2  rmind __KERNEL_RCSID(0, "$NetBSD: cxgb_vsc7323.c,v 1.1.4.2 2010/05/30 05:17:40 rmind Exp $");
     33  1.1.4.2  rmind 
     34  1.1.4.2  rmind #ifdef CONFIG_DEFINED
     35  1.1.4.2  rmind #include <common/cxgb_common.h>
     36  1.1.4.2  rmind #else
     37  1.1.4.2  rmind #include "cxgb_common.h"
     38  1.1.4.2  rmind #endif
     39  1.1.4.2  rmind 
     40  1.1.4.2  rmind enum {
     41  1.1.4.2  rmind     ELMR_ADDR    = 0,
     42  1.1.4.2  rmind     ELMR_STAT    = 1,
     43  1.1.4.2  rmind     ELMR_DATA_LO = 2,
     44  1.1.4.2  rmind     ELMR_DATA_HI = 3,
     45  1.1.4.2  rmind 
     46  1.1.4.2  rmind     ELMR_THRES0  = 0xe000,
     47  1.1.4.2  rmind     ELMR_BW      = 0xe00c,
     48  1.1.4.2  rmind     ELMR_FIFO_SZ = 0xe00d,
     49  1.1.4.2  rmind     ELMR_STATS   = 0xf000,
     50  1.1.4.2  rmind 
     51  1.1.4.2  rmind     ELMR_MDIO_ADDR = 10
     52  1.1.4.2  rmind };
     53  1.1.4.2  rmind 
     54  1.1.4.2  rmind #define VSC_REG(block, subblock, reg) \
     55  1.1.4.2  rmind     ((reg) | ((subblock) << 8) | ((block) << 12))
     56  1.1.4.2  rmind 
     57  1.1.4.2  rmind int t3_elmr_blk_write(adapter_t *adap, int start, const u32 *vals, int n)
     58  1.1.4.2  rmind {
     59  1.1.4.2  rmind     int ret;
     60  1.1.4.2  rmind     const struct mdio_ops *mo = adapter_info(adap)->mdio_ops;
     61  1.1.4.2  rmind 
     62  1.1.4.2  rmind     ELMR_LOCK(adap);
     63  1.1.4.2  rmind     ret = mo->write(adap, ELMR_MDIO_ADDR, 0, ELMR_ADDR, start);
     64  1.1.4.2  rmind     for ( ; !ret && n; n--, vals++) {
     65  1.1.4.2  rmind         ret = mo->write(adap, ELMR_MDIO_ADDR, 0, ELMR_DATA_LO,
     66  1.1.4.2  rmind                 *vals & 0xffff);
     67  1.1.4.2  rmind         if (!ret)
     68  1.1.4.2  rmind             ret = mo->write(adap, ELMR_MDIO_ADDR, 0, ELMR_DATA_HI,
     69  1.1.4.2  rmind                     *vals >> 16);
     70  1.1.4.2  rmind     }
     71  1.1.4.2  rmind     ELMR_UNLOCK(adap);
     72  1.1.4.2  rmind     return ret;
     73  1.1.4.2  rmind }
     74  1.1.4.2  rmind 
     75  1.1.4.2  rmind static int elmr_write(adapter_t *adap, int addr, u32 val)
     76  1.1.4.2  rmind {
     77  1.1.4.2  rmind     return t3_elmr_blk_write(adap, addr, &val, 1);
     78  1.1.4.2  rmind }
     79  1.1.4.2  rmind 
     80  1.1.4.2  rmind int t3_elmr_blk_read(adapter_t *adap, int start, u32 *vals, int n)
     81  1.1.4.2  rmind {
     82  1.1.4.2  rmind     int i, ret;
     83  1.1.4.2  rmind     unsigned int v;
     84  1.1.4.2  rmind     const struct mdio_ops *mo = adapter_info(adap)->mdio_ops;
     85  1.1.4.2  rmind 
     86  1.1.4.2  rmind     ELMR_LOCK(adap);
     87  1.1.4.2  rmind 
     88  1.1.4.2  rmind     ret = mo->write(adap, ELMR_MDIO_ADDR, 0, ELMR_ADDR, start);
     89  1.1.4.2  rmind     if (ret)
     90  1.1.4.2  rmind         goto out;
     91  1.1.4.2  rmind 
     92  1.1.4.2  rmind     for (i = 0; i < 5; i++) {
     93  1.1.4.2  rmind         ret = mo->read(adap, ELMR_MDIO_ADDR, 0, ELMR_STAT, &v);
     94  1.1.4.2  rmind         if (ret)
     95  1.1.4.2  rmind             goto out;
     96  1.1.4.2  rmind         if (v == 1)
     97  1.1.4.2  rmind             break;
     98  1.1.4.2  rmind         udelay(5);
     99  1.1.4.2  rmind     }
    100  1.1.4.2  rmind     if (v != 1) {
    101  1.1.4.2  rmind         ret = -ETIMEDOUT;
    102  1.1.4.2  rmind         goto out;
    103  1.1.4.2  rmind     }
    104  1.1.4.2  rmind 
    105  1.1.4.2  rmind     for ( ; !ret && n; n--, vals++) {
    106  1.1.4.2  rmind         ret = mo->read(adap, ELMR_MDIO_ADDR, 0, ELMR_DATA_LO, vals);
    107  1.1.4.2  rmind         if (!ret) {
    108  1.1.4.2  rmind             ret = mo->read(adap, ELMR_MDIO_ADDR, 0, ELMR_DATA_HI,
    109  1.1.4.2  rmind                        &v);
    110  1.1.4.2  rmind             *vals |= v << 16;
    111  1.1.4.2  rmind         }
    112  1.1.4.2  rmind     }
    113  1.1.4.2  rmind out:    ELMR_UNLOCK(adap);
    114  1.1.4.2  rmind     return ret;
    115  1.1.4.2  rmind }
    116  1.1.4.2  rmind 
    117  1.1.4.2  rmind int t3_vsc7323_init(adapter_t *adap, int nports)
    118  1.1.4.2  rmind {
    119  1.1.4.2  rmind     static struct addr_val_pair sys_avp[] = {
    120  1.1.4.2  rmind         { VSC_REG(7, 15, 0xf),  2 },
    121  1.1.4.2  rmind         { VSC_REG(7, 15, 0x19), 0xd6 },
    122  1.1.4.2  rmind         { VSC_REG(7, 15, 7),    0xc },
    123  1.1.4.2  rmind         { VSC_REG(7, 1, 0),     0x220 },
    124  1.1.4.2  rmind     };
    125  1.1.4.2  rmind     static struct addr_val_pair fifo_avp[] = {
    126  1.1.4.2  rmind         { VSC_REG(2, 0, 0x2f), 0 },
    127  1.1.4.2  rmind         { VSC_REG(2, 0, 0xf),  0xa0010291 },
    128  1.1.4.2  rmind         { VSC_REG(2, 1, 0x2f), 1 },
    129  1.1.4.2  rmind         { VSC_REG(2, 1, 0xf),  0xa026301 }
    130  1.1.4.2  rmind     };
    131  1.1.4.2  rmind     static struct addr_val_pair xg_avp[] = {
    132  1.1.4.2  rmind         { VSC_REG(1, 10, 0),    0x600b },
    133  1.1.4.2  rmind         { VSC_REG(1, 10, 1),    0x70600 }, //QUANTA = 96*1024*8/512
    134  1.1.4.2  rmind         { VSC_REG(1, 10, 2),    0x2710 },
    135  1.1.4.2  rmind         { VSC_REG(1, 10, 5),    0x65 },
    136  1.1.4.2  rmind         { VSC_REG(1, 10, 7),    0x23 },
    137  1.1.4.2  rmind         { VSC_REG(1, 10, 0x23), 0x800007bf },
    138  1.1.4.2  rmind         { VSC_REG(1, 10, 0x23), 0x000007bf },
    139  1.1.4.2  rmind         { VSC_REG(1, 10, 0x23), 0x800007bf },
    140  1.1.4.2  rmind         { VSC_REG(1, 10, 0x24), 4 }
    141  1.1.4.2  rmind     };
    142  1.1.4.2  rmind 
    143  1.1.4.2  rmind     int i, ret, ing_step, egr_step, ing_bot, egr_bot;
    144  1.1.4.2  rmind 
    145  1.1.4.2  rmind     for (i = 0; i < ARRAY_SIZE(sys_avp); i++)
    146  1.1.4.2  rmind         if ((ret = t3_elmr_blk_write(adap, sys_avp[i].reg_addr,
    147  1.1.4.2  rmind                          &sys_avp[i].val, 1)))
    148  1.1.4.2  rmind             return ret;
    149  1.1.4.2  rmind 
    150  1.1.4.2  rmind     ing_step = 0xc0 / nports;
    151  1.1.4.2  rmind     egr_step = 0x40 / nports;
    152  1.1.4.2  rmind     ing_bot = egr_bot = 0;
    153  1.1.4.2  rmind //  ing_wm = ing_step * 64;
    154  1.1.4.2  rmind //  egr_wm = egr_step * 64;
    155  1.1.4.2  rmind 
    156  1.1.4.2  rmind     /* {ING,EGR}_CONTROL.CLR = 1 here */
    157  1.1.4.2  rmind     for (i = 0; i < nports; i++) {
    158  1.1.4.2  rmind         if (
    159  1.1.4.2  rmind             (ret = elmr_write(adap, VSC_REG(2, 0, 0x10 + i),
    160  1.1.4.2  rmind                 ((ing_bot + ing_step) << 16) | ing_bot)) ||
    161  1.1.4.2  rmind             (ret = elmr_write(adap, VSC_REG(2, 0, 0x40 + i),
    162  1.1.4.2  rmind                 0x6000bc0)) ||
    163  1.1.4.2  rmind             (ret = elmr_write(adap, VSC_REG(2, 0, 0x50 + i), 1)) ||
    164  1.1.4.2  rmind             (ret = elmr_write(adap, VSC_REG(2, 1, 0x10 + i),
    165  1.1.4.2  rmind                 ((egr_bot + egr_step) << 16) | egr_bot)) ||
    166  1.1.4.2  rmind             (ret = elmr_write(adap, VSC_REG(2, 1, 0x40 + i),
    167  1.1.4.2  rmind                 0x2000280)) ||
    168  1.1.4.2  rmind             (ret = elmr_write(adap, VSC_REG(2, 1, 0x50 + i), 0)))
    169  1.1.4.2  rmind             return ret;
    170  1.1.4.2  rmind         ing_bot += ing_step;
    171  1.1.4.2  rmind         egr_bot += egr_step;
    172  1.1.4.2  rmind     }
    173  1.1.4.2  rmind 
    174  1.1.4.2  rmind     for (i = 0; i < ARRAY_SIZE(fifo_avp); i++)
    175  1.1.4.2  rmind         if ((ret = t3_elmr_blk_write(adap, fifo_avp[i].reg_addr,
    176  1.1.4.2  rmind                          &fifo_avp[i].val, 1)))
    177  1.1.4.2  rmind             return ret;
    178  1.1.4.2  rmind 
    179  1.1.4.2  rmind     for (i = 0; i < ARRAY_SIZE(xg_avp); i++)
    180  1.1.4.2  rmind         if ((ret = t3_elmr_blk_write(adap, xg_avp[i].reg_addr,
    181  1.1.4.2  rmind                          &xg_avp[i].val, 1)))
    182  1.1.4.2  rmind             return ret;
    183  1.1.4.2  rmind 
    184  1.1.4.2  rmind     for (i = 0; i < nports; i++)
    185  1.1.4.2  rmind         if ((ret = elmr_write(adap, VSC_REG(1, i, 0), 0xa59c)) ||
    186  1.1.4.2  rmind             (ret = elmr_write(adap, VSC_REG(1, i, 5),
    187  1.1.4.2  rmind                  (i << 12) | 0x63)) ||
    188  1.1.4.2  rmind             (ret = elmr_write(adap, VSC_REG(1, i, 0xb), 0x96)) ||
    189  1.1.4.2  rmind             (ret = elmr_write(adap, VSC_REG(1, i, 0x15), 0x21)) ||
    190  1.1.4.2  rmind             (ret = elmr_write(adap, ELMR_THRES0 + i, 768)))
    191  1.1.4.2  rmind             return ret;
    192  1.1.4.2  rmind 
    193  1.1.4.2  rmind     if ((ret = elmr_write(adap, ELMR_BW, 7)))
    194  1.1.4.2  rmind         return ret;
    195  1.1.4.2  rmind 
    196  1.1.4.2  rmind     return ret;
    197  1.1.4.2  rmind }
    198  1.1.4.2  rmind 
    199  1.1.4.2  rmind int t3_vsc7323_set_speed_fc(adapter_t *adap, int speed, int fc, int port)
    200  1.1.4.2  rmind {
    201  1.1.4.2  rmind     int mode, clk, r;
    202  1.1.4.2  rmind 
    203  1.1.4.2  rmind     if (speed >= 0) {
    204  1.1.4.2  rmind         if (speed == SPEED_10)
    205  1.1.4.2  rmind             mode = clk = 1;
    206  1.1.4.2  rmind         else if (speed == SPEED_100)
    207  1.1.4.2  rmind             mode = 1, clk = 2;
    208  1.1.4.2  rmind         else if (speed == SPEED_1000)
    209  1.1.4.2  rmind             mode = clk = 3;
    210  1.1.4.2  rmind         else
    211  1.1.4.2  rmind             return -EINVAL;
    212  1.1.4.2  rmind 
    213  1.1.4.2  rmind         if ((r = elmr_write(adap, VSC_REG(1, port, 0),
    214  1.1.4.2  rmind                     0xa590 | (mode << 2))) ||
    215  1.1.4.2  rmind             (r = elmr_write(adap, VSC_REG(1, port, 0xb),
    216  1.1.4.2  rmind                     0x91 | (clk << 1))) ||
    217  1.1.4.2  rmind             (r = elmr_write(adap, VSC_REG(1, port, 0xb),
    218  1.1.4.2  rmind                     0x90 | (clk << 1))) ||
    219  1.1.4.2  rmind             (r = elmr_write(adap, VSC_REG(1, port, 0),
    220  1.1.4.2  rmind                     0xa593 | (mode << 2))))
    221  1.1.4.2  rmind             return r;
    222  1.1.4.2  rmind     }
    223  1.1.4.2  rmind 
    224  1.1.4.2  rmind     r = (fc & PAUSE_RX) ? 0x60200 : 0x20200; //QUANTA = 32*1024*8/512
    225  1.1.4.2  rmind     if (fc & PAUSE_TX)
    226  1.1.4.2  rmind         r |= (1 << 19);
    227  1.1.4.2  rmind     return elmr_write(adap, VSC_REG(1, port, 1), r);
    228  1.1.4.2  rmind }
    229  1.1.4.2  rmind 
    230  1.1.4.2  rmind int t3_vsc7323_set_mtu(adapter_t *adap, unsigned int mtu, int port)
    231  1.1.4.2  rmind {
    232  1.1.4.2  rmind     return elmr_write(adap, VSC_REG(1, port, 2), mtu);
    233  1.1.4.2  rmind }
    234  1.1.4.2  rmind 
    235  1.1.4.2  rmind int t3_vsc7323_set_addr(adapter_t *adap, u8 addr[6], int port)
    236  1.1.4.2  rmind {
    237  1.1.4.2  rmind     int ret;
    238  1.1.4.2  rmind 
    239  1.1.4.2  rmind     ret = elmr_write(adap, VSC_REG(1, port, 3),
    240  1.1.4.2  rmind              (addr[0] << 16) | (addr[1] << 8) | addr[2]);
    241  1.1.4.2  rmind     if (!ret)
    242  1.1.4.2  rmind         ret = elmr_write(adap, VSC_REG(1, port, 4),
    243  1.1.4.2  rmind                  (addr[3] << 16) | (addr[4] << 8) | addr[5]);
    244  1.1.4.2  rmind     return ret;
    245  1.1.4.2  rmind }
    246  1.1.4.2  rmind 
    247  1.1.4.2  rmind int t3_vsc7323_enable(adapter_t *adap, int port, int which)
    248  1.1.4.2  rmind {
    249  1.1.4.2  rmind     int ret;
    250  1.1.4.2  rmind     unsigned int v, orig;
    251  1.1.4.2  rmind 
    252  1.1.4.2  rmind     ret = t3_elmr_blk_read(adap, VSC_REG(1, port, 0), &v, 1);
    253  1.1.4.2  rmind     if (!ret) {
    254  1.1.4.2  rmind         orig = v;
    255  1.1.4.2  rmind         if (which & MAC_DIRECTION_TX)
    256  1.1.4.2  rmind             v |= 1;
    257  1.1.4.2  rmind         if (which & MAC_DIRECTION_RX)
    258  1.1.4.2  rmind             v |= 2;
    259  1.1.4.2  rmind         if (v != orig)
    260  1.1.4.2  rmind             ret = elmr_write(adap, VSC_REG(1, port, 0), v);
    261  1.1.4.2  rmind     }
    262  1.1.4.2  rmind     return ret;
    263  1.1.4.2  rmind }
    264  1.1.4.2  rmind 
    265  1.1.4.2  rmind int t3_vsc7323_disable(adapter_t *adap, int port, int which)
    266  1.1.4.2  rmind {
    267  1.1.4.2  rmind     int ret;
    268  1.1.4.2  rmind     unsigned int v, orig;
    269  1.1.4.2  rmind 
    270  1.1.4.2  rmind     ret = t3_elmr_blk_read(adap, VSC_REG(1, port, 0), &v, 1);
    271  1.1.4.2  rmind     if (!ret) {
    272  1.1.4.2  rmind         orig = v;
    273  1.1.4.2  rmind         if (which & MAC_DIRECTION_TX)
    274  1.1.4.2  rmind             v &= ~1;
    275  1.1.4.2  rmind         if (which & MAC_DIRECTION_RX)
    276  1.1.4.2  rmind             v &= ~2;
    277  1.1.4.2  rmind         if (v != orig)
    278  1.1.4.2  rmind             ret = elmr_write(adap, VSC_REG(1, port, 0), v);
    279  1.1.4.2  rmind     }
    280  1.1.4.2  rmind     return ret;
    281  1.1.4.2  rmind }
    282  1.1.4.2  rmind 
    283  1.1.4.2  rmind #define STATS0_START 1
    284  1.1.4.2  rmind #define STATS1_START 0x24
    285  1.1.4.2  rmind #define NSTATS0 (0x1d - STATS0_START + 1)
    286  1.1.4.2  rmind #define NSTATS1 (0x2a - STATS1_START + 1)
    287  1.1.4.2  rmind 
    288  1.1.4.2  rmind #define ELMR_STAT(port, reg) (ELMR_STATS + port * 0x40 + reg)
    289  1.1.4.2  rmind 
    290  1.1.4.2  rmind const struct mac_stats *t3_vsc7323_update_stats(struct cmac *mac)
    291  1.1.4.2  rmind {
    292  1.1.4.2  rmind     int ret;
    293  1.1.4.2  rmind     u64 rx_ucast, tx_ucast;
    294  1.1.4.2  rmind     u32 stats0[NSTATS0], stats1[NSTATS1];
    295  1.1.4.2  rmind 
    296  1.1.4.2  rmind     ret = t3_elmr_blk_read(mac->adapter,
    297  1.1.4.2  rmind                    ELMR_STAT(mac->ext_port, STATS0_START),
    298  1.1.4.2  rmind                    stats0, NSTATS0);
    299  1.1.4.2  rmind     if (!ret)
    300  1.1.4.2  rmind         ret = t3_elmr_blk_read(mac->adapter,
    301  1.1.4.2  rmind                        ELMR_STAT(mac->ext_port, STATS1_START),
    302  1.1.4.2  rmind                        stats1, NSTATS1);
    303  1.1.4.2  rmind     if (ret)
    304  1.1.4.2  rmind         goto out;
    305  1.1.4.2  rmind 
    306  1.1.4.2  rmind     /*
    307  1.1.4.2  rmind      * HW counts Rx/Tx unicast frames but we want all the frames.
    308  1.1.4.2  rmind      */
    309  1.1.4.2  rmind     rx_ucast = mac->stats.rx_frames - mac->stats.rx_mcast_frames -
    310  1.1.4.2  rmind            mac->stats.rx_bcast_frames;
    311  1.1.4.2  rmind     rx_ucast += (u64)(stats0[6 - STATS0_START] - (u32)rx_ucast);
    312  1.1.4.2  rmind     tx_ucast = mac->stats.tx_frames - mac->stats.tx_mcast_frames -
    313  1.1.4.2  rmind            mac->stats.tx_bcast_frames;
    314  1.1.4.2  rmind     tx_ucast += (u64)(stats0[27 - STATS0_START] - (u32)tx_ucast);
    315  1.1.4.2  rmind 
    316  1.1.4.2  rmind #define RMON_UPDATE(mac, name, hw_stat) \
    317  1.1.4.2  rmind     mac->stats.name += (u64)((hw_stat) - (u32)(mac->stats.name))
    318  1.1.4.2  rmind 
    319  1.1.4.2  rmind     RMON_UPDATE(mac, rx_octets, stats0[4 - STATS0_START]);
    320  1.1.4.2  rmind     RMON_UPDATE(mac, rx_frames, stats0[6 - STATS0_START]);
    321  1.1.4.2  rmind     RMON_UPDATE(mac, rx_frames, stats0[7 - STATS0_START]);
    322  1.1.4.2  rmind     RMON_UPDATE(mac, rx_frames, stats0[8 - STATS0_START]);
    323  1.1.4.2  rmind     RMON_UPDATE(mac, rx_mcast_frames, stats0[7 - STATS0_START]);
    324  1.1.4.2  rmind     RMON_UPDATE(mac, rx_bcast_frames, stats0[8 - STATS0_START]);
    325  1.1.4.2  rmind     RMON_UPDATE(mac, rx_fcs_errs, stats0[9 - STATS0_START]);
    326  1.1.4.2  rmind     RMON_UPDATE(mac, rx_pause, stats0[2 - STATS0_START]);
    327  1.1.4.2  rmind     RMON_UPDATE(mac, rx_jabber, stats0[16 - STATS0_START]);
    328  1.1.4.2  rmind     RMON_UPDATE(mac, rx_short, stats0[11 - STATS0_START]);
    329  1.1.4.2  rmind     RMON_UPDATE(mac, rx_symbol_errs, stats0[1 - STATS0_START]);
    330  1.1.4.2  rmind     RMON_UPDATE(mac, rx_too_long, stats0[15 - STATS0_START]);
    331  1.1.4.2  rmind 
    332  1.1.4.2  rmind     RMON_UPDATE(mac, rx_frames_64,        stats0[17 - STATS0_START]);
    333  1.1.4.2  rmind     RMON_UPDATE(mac, rx_frames_65_127,    stats0[18 - STATS0_START]);
    334  1.1.4.2  rmind     RMON_UPDATE(mac, rx_frames_128_255,   stats0[19 - STATS0_START]);
    335  1.1.4.2  rmind     RMON_UPDATE(mac, rx_frames_256_511,   stats0[20 - STATS0_START]);
    336  1.1.4.2  rmind     RMON_UPDATE(mac, rx_frames_512_1023,  stats0[21 - STATS0_START]);
    337  1.1.4.2  rmind     RMON_UPDATE(mac, rx_frames_1024_1518, stats0[22 - STATS0_START]);
    338  1.1.4.2  rmind     RMON_UPDATE(mac, rx_frames_1519_max,  stats0[23 - STATS0_START]);
    339  1.1.4.2  rmind 
    340  1.1.4.2  rmind     RMON_UPDATE(mac, tx_octets, stats0[26 - STATS0_START]);
    341  1.1.4.2  rmind     RMON_UPDATE(mac, tx_frames, stats0[27 - STATS0_START]);
    342  1.1.4.2  rmind     RMON_UPDATE(mac, tx_frames, stats0[28 - STATS0_START]);
    343  1.1.4.2  rmind     RMON_UPDATE(mac, tx_frames, stats0[29 - STATS0_START]);
    344  1.1.4.2  rmind     RMON_UPDATE(mac, tx_mcast_frames, stats0[28 - STATS0_START]);
    345  1.1.4.2  rmind     RMON_UPDATE(mac, tx_bcast_frames, stats0[29 - STATS0_START]);
    346  1.1.4.2  rmind     RMON_UPDATE(mac, tx_pause, stats0[25 - STATS0_START]);
    347  1.1.4.2  rmind 
    348  1.1.4.2  rmind     RMON_UPDATE(mac, tx_underrun, 0);
    349  1.1.4.2  rmind 
    350  1.1.4.2  rmind     RMON_UPDATE(mac, tx_frames_64,        stats1[36 - STATS1_START]);
    351  1.1.4.2  rmind     RMON_UPDATE(mac, tx_frames_65_127,    stats1[37 - STATS1_START]);
    352  1.1.4.2  rmind     RMON_UPDATE(mac, tx_frames_128_255,   stats1[38 - STATS1_START]);
    353  1.1.4.2  rmind     RMON_UPDATE(mac, tx_frames_256_511,   stats1[39 - STATS1_START]);
    354  1.1.4.2  rmind     RMON_UPDATE(mac, tx_frames_512_1023,  stats1[40 - STATS1_START]);
    355  1.1.4.2  rmind     RMON_UPDATE(mac, tx_frames_1024_1518, stats1[41 - STATS1_START]);
    356  1.1.4.2  rmind     RMON_UPDATE(mac, tx_frames_1519_max,  stats1[42 - STATS1_START]);
    357  1.1.4.2  rmind 
    358  1.1.4.2  rmind #undef RMON_UPDATE
    359  1.1.4.2  rmind 
    360  1.1.4.2  rmind     mac->stats.rx_frames = rx_ucast + mac->stats.rx_mcast_frames +
    361  1.1.4.2  rmind                    mac->stats.rx_bcast_frames;
    362  1.1.4.2  rmind     mac->stats.tx_frames = tx_ucast + mac->stats.tx_mcast_frames +
    363  1.1.4.2  rmind                    mac->stats.tx_bcast_frames;
    364  1.1.4.2  rmind out:    return &mac->stats;
    365  1.1.4.2  rmind }
    366