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