1ef72318fSKip Macy /**************************************************************************
2*4d846d26SWarner Losh SPDX-License-Identifier: BSD-2-Clause
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 #include <common/cxgb_common.h>
33ef72318fSKip Macy
34ef72318fSKip Macy enum {
35ef72318fSKip Macy ELMR_ADDR = 0,
36ef72318fSKip Macy ELMR_STAT = 1,
37ef72318fSKip Macy ELMR_DATA_LO = 2,
38ef72318fSKip Macy ELMR_DATA_HI = 3,
39ef72318fSKip Macy
405c5df3daSKip Macy ELMR_THRES0 = 0xe000,
415c5df3daSKip Macy ELMR_BW = 0xe00c,
425c5df3daSKip Macy ELMR_FIFO_SZ = 0xe00d,
435c5df3daSKip Macy ELMR_STATS = 0xf000,
445c5df3daSKip Macy
45ef72318fSKip Macy ELMR_MDIO_ADDR = 10
46ef72318fSKip Macy };
47ef72318fSKip Macy
48ef72318fSKip Macy #define VSC_REG(block, subblock, reg) \
49ef72318fSKip Macy ((reg) | ((subblock) << 8) | ((block) << 12))
50ef72318fSKip Macy
t3_elmr_blk_write(adapter_t * adap,int start,const u32 * vals,int n)51ef72318fSKip Macy int t3_elmr_blk_write(adapter_t *adap, int start, const u32 *vals, int n)
52ef72318fSKip Macy {
53ef72318fSKip Macy int ret;
54ef72318fSKip Macy const struct mdio_ops *mo = adapter_info(adap)->mdio_ops;
55ef72318fSKip Macy
56ef72318fSKip Macy ELMR_LOCK(adap);
57ef72318fSKip Macy ret = mo->write(adap, ELMR_MDIO_ADDR, 0, ELMR_ADDR, start);
58ef72318fSKip Macy for ( ; !ret && n; n--, vals++) {
59ef72318fSKip Macy ret = mo->write(adap, ELMR_MDIO_ADDR, 0, ELMR_DATA_LO,
60ef72318fSKip Macy *vals & 0xffff);
61ef72318fSKip Macy if (!ret)
62ef72318fSKip Macy ret = mo->write(adap, ELMR_MDIO_ADDR, 0, ELMR_DATA_HI,
63ef72318fSKip Macy *vals >> 16);
64ef72318fSKip Macy }
65ef72318fSKip Macy ELMR_UNLOCK(adap);
66ef72318fSKip Macy return ret;
67ef72318fSKip Macy }
68ef72318fSKip Macy
elmr_write(adapter_t * adap,int addr,u32 val)69ef72318fSKip Macy static int elmr_write(adapter_t *adap, int addr, u32 val)
70ef72318fSKip Macy {
71ef72318fSKip Macy return t3_elmr_blk_write(adap, addr, &val, 1);
72ef72318fSKip Macy }
73ef72318fSKip Macy
t3_elmr_blk_read(adapter_t * adap,int start,u32 * vals,int n)74ef72318fSKip Macy int t3_elmr_blk_read(adapter_t *adap, int start, u32 *vals, int n)
75ef72318fSKip Macy {
765c5df3daSKip Macy int i, ret;
77ef72318fSKip Macy unsigned int v;
78ef72318fSKip Macy const struct mdio_ops *mo = adapter_info(adap)->mdio_ops;
79ef72318fSKip Macy
80ef72318fSKip Macy ELMR_LOCK(adap);
81ef72318fSKip Macy
82ef72318fSKip Macy ret = mo->write(adap, ELMR_MDIO_ADDR, 0, ELMR_ADDR, start);
83ef72318fSKip Macy if (ret)
84ef72318fSKip Macy goto out;
855c5df3daSKip Macy
865c5df3daSKip Macy for (i = 0; i < 5; i++) {
87ef72318fSKip Macy ret = mo->read(adap, ELMR_MDIO_ADDR, 0, ELMR_STAT, &v);
88ef72318fSKip Macy if (ret)
89ef72318fSKip Macy goto out;
905c5df3daSKip Macy if (v == 1)
915c5df3daSKip Macy break;
925c5df3daSKip Macy udelay(5);
935c5df3daSKip Macy }
94ef72318fSKip Macy if (v != 1) {
95ef72318fSKip Macy ret = -ETIMEDOUT;
96ef72318fSKip Macy goto out;
97ef72318fSKip Macy }
98ef72318fSKip Macy
99ef72318fSKip Macy for ( ; !ret && n; n--, vals++) {
100ef72318fSKip Macy ret = mo->read(adap, ELMR_MDIO_ADDR, 0, ELMR_DATA_LO, vals);
101ef72318fSKip Macy if (!ret) {
102ef72318fSKip Macy ret = mo->read(adap, ELMR_MDIO_ADDR, 0, ELMR_DATA_HI,
103ef72318fSKip Macy &v);
104ef72318fSKip Macy *vals |= v << 16;
105ef72318fSKip Macy }
106ef72318fSKip Macy }
107ef72318fSKip Macy out: ELMR_UNLOCK(adap);
108ef72318fSKip Macy return ret;
109ef72318fSKip Macy }
110ef72318fSKip Macy
t3_vsc7323_init(adapter_t * adap,int nports)111ef72318fSKip Macy int t3_vsc7323_init(adapter_t *adap, int nports)
112ef72318fSKip Macy {
113ef72318fSKip Macy static struct addr_val_pair sys_avp[] = {
114ef72318fSKip Macy { VSC_REG(7, 15, 0xf), 2 },
115ef72318fSKip Macy { VSC_REG(7, 15, 0x19), 0xd6 },
116ef72318fSKip Macy { VSC_REG(7, 15, 7), 0xc },
117ef72318fSKip Macy { VSC_REG(7, 1, 0), 0x220 },
118ef72318fSKip Macy };
119ef72318fSKip Macy static struct addr_val_pair fifo_avp[] = {
120ef72318fSKip Macy { VSC_REG(2, 0, 0x2f), 0 },
121ef72318fSKip Macy { VSC_REG(2, 0, 0xf), 0xa0010291 },
122ef72318fSKip Macy { VSC_REG(2, 1, 0x2f), 1 },
123ac3a6d9cSKip Macy { VSC_REG(2, 1, 0xf), 0xa026301 }
124ef72318fSKip Macy };
125ef72318fSKip Macy static struct addr_val_pair xg_avp[] = {
126ef72318fSKip Macy { VSC_REG(1, 10, 0), 0x600b },
127ac3a6d9cSKip Macy { VSC_REG(1, 10, 1), 0x70600 }, //QUANTA = 96*1024*8/512
128ac3a6d9cSKip Macy { VSC_REG(1, 10, 2), 0x2710 },
129ef72318fSKip Macy { VSC_REG(1, 10, 5), 0x65 },
130ac3a6d9cSKip Macy { VSC_REG(1, 10, 7), 0x23 },
131ac3a6d9cSKip Macy { VSC_REG(1, 10, 0x23), 0x800007bf },
132ac3a6d9cSKip Macy { VSC_REG(1, 10, 0x23), 0x000007bf },
133ef72318fSKip Macy { VSC_REG(1, 10, 0x23), 0x800007bf },
134ef72318fSKip Macy { VSC_REG(1, 10, 0x24), 4 }
135ef72318fSKip Macy };
136ef72318fSKip Macy
137ef72318fSKip Macy int i, ret, ing_step, egr_step, ing_bot, egr_bot;
138ef72318fSKip Macy
139ef72318fSKip Macy for (i = 0; i < ARRAY_SIZE(sys_avp); i++)
140ef72318fSKip Macy if ((ret = t3_elmr_blk_write(adap, sys_avp[i].reg_addr,
141ef72318fSKip Macy &sys_avp[i].val, 1)))
142ef72318fSKip Macy return ret;
143ef72318fSKip Macy
144ef72318fSKip Macy ing_step = 0xc0 / nports;
145ef72318fSKip Macy egr_step = 0x40 / nports;
146ef72318fSKip Macy ing_bot = egr_bot = 0;
147ef72318fSKip Macy // ing_wm = ing_step * 64;
148ef72318fSKip Macy // egr_wm = egr_step * 64;
149ef72318fSKip Macy
150ef72318fSKip Macy /* {ING,EGR}_CONTROL.CLR = 1 here */
151ac3a6d9cSKip Macy for (i = 0; i < nports; i++) {
152ac3a6d9cSKip Macy if (
153ac3a6d9cSKip Macy (ret = elmr_write(adap, VSC_REG(2, 0, 0x10 + i),
154ef72318fSKip Macy ((ing_bot + ing_step) << 16) | ing_bot)) ||
155ac3a6d9cSKip Macy (ret = elmr_write(adap, VSC_REG(2, 0, 0x40 + i),
1565c5df3daSKip Macy 0x6000bc0)) ||
157ac3a6d9cSKip Macy (ret = elmr_write(adap, VSC_REG(2, 0, 0x50 + i), 1)) ||
158ef72318fSKip Macy (ret = elmr_write(adap, VSC_REG(2, 1, 0x10 + i),
159ef72318fSKip Macy ((egr_bot + egr_step) << 16) | egr_bot)) ||
160ef72318fSKip Macy (ret = elmr_write(adap, VSC_REG(2, 1, 0x40 + i),
161ef72318fSKip Macy 0x2000280)) ||
162ef72318fSKip Macy (ret = elmr_write(adap, VSC_REG(2, 1, 0x50 + i), 0)))
163ef72318fSKip Macy return ret;
164ac3a6d9cSKip Macy ing_bot += ing_step;
165ac3a6d9cSKip Macy egr_bot += egr_step;
166ac3a6d9cSKip Macy }
167ef72318fSKip Macy
168ef72318fSKip Macy for (i = 0; i < ARRAY_SIZE(fifo_avp); i++)
169ef72318fSKip Macy if ((ret = t3_elmr_blk_write(adap, fifo_avp[i].reg_addr,
170ef72318fSKip Macy &fifo_avp[i].val, 1)))
171ef72318fSKip Macy return ret;
172ef72318fSKip Macy
173ef72318fSKip Macy for (i = 0; i < ARRAY_SIZE(xg_avp); i++)
174ef72318fSKip Macy if ((ret = t3_elmr_blk_write(adap, xg_avp[i].reg_addr,
175ef72318fSKip Macy &xg_avp[i].val, 1)))
176ef72318fSKip Macy return ret;
177ef72318fSKip Macy
178ef72318fSKip Macy for (i = 0; i < nports; i++)
179ef72318fSKip Macy if ((ret = elmr_write(adap, VSC_REG(1, i, 0), 0xa59c)) ||
180ef72318fSKip Macy (ret = elmr_write(adap, VSC_REG(1, i, 5),
181ef72318fSKip Macy (i << 12) | 0x63)) ||
182ef72318fSKip Macy (ret = elmr_write(adap, VSC_REG(1, i, 0xb), 0x96)) ||
1835c5df3daSKip Macy (ret = elmr_write(adap, VSC_REG(1, i, 0x15), 0x21)) ||
1845c5df3daSKip Macy (ret = elmr_write(adap, ELMR_THRES0 + i, 768)))
185ef72318fSKip Macy return ret;
1865c5df3daSKip Macy
1875c5df3daSKip Macy if ((ret = elmr_write(adap, ELMR_BW, 7)))
1885c5df3daSKip Macy return ret;
1895c5df3daSKip Macy
190ef72318fSKip Macy return ret;
191ef72318fSKip Macy }
192ef72318fSKip Macy
t3_vsc7323_set_speed_fc(adapter_t * adap,int speed,int fc,int port)193ef72318fSKip Macy int t3_vsc7323_set_speed_fc(adapter_t *adap, int speed, int fc, int port)
194ef72318fSKip Macy {
195ef72318fSKip Macy int mode, clk, r;
196ef72318fSKip Macy
197ef72318fSKip Macy if (speed >= 0) {
198ef72318fSKip Macy if (speed == SPEED_10)
199ef72318fSKip Macy mode = clk = 1;
200ef72318fSKip Macy else if (speed == SPEED_100)
201ef72318fSKip Macy mode = 1, clk = 2;
202ef72318fSKip Macy else if (speed == SPEED_1000)
203ef72318fSKip Macy mode = clk = 3;
204ef72318fSKip Macy else
205ef72318fSKip Macy return -EINVAL;
206ef72318fSKip Macy
207ef72318fSKip Macy if ((r = elmr_write(adap, VSC_REG(1, port, 0),
208ef72318fSKip Macy 0xa590 | (mode << 2))) ||
209ef72318fSKip Macy (r = elmr_write(adap, VSC_REG(1, port, 0xb),
210ef72318fSKip Macy 0x91 | (clk << 1))) ||
211ef72318fSKip Macy (r = elmr_write(adap, VSC_REG(1, port, 0xb),
212ef72318fSKip Macy 0x90 | (clk << 1))) ||
213ef72318fSKip Macy (r = elmr_write(adap, VSC_REG(1, port, 0),
214ef72318fSKip Macy 0xa593 | (mode << 2))))
215ef72318fSKip Macy return r;
216ef72318fSKip Macy }
217ef72318fSKip Macy
218ac3a6d9cSKip Macy r = (fc & PAUSE_RX) ? 0x60200 : 0x20200; //QUANTA = 32*1024*8/512
219ef72318fSKip Macy if (fc & PAUSE_TX)
220ef72318fSKip Macy r |= (1 << 19);
221ef72318fSKip Macy return elmr_write(adap, VSC_REG(1, port, 1), r);
222ef72318fSKip Macy }
223ef72318fSKip Macy
t3_vsc7323_set_mtu(adapter_t * adap,unsigned int mtu,int port)224ef72318fSKip Macy int t3_vsc7323_set_mtu(adapter_t *adap, unsigned int mtu, int port)
225ef72318fSKip Macy {
226ef72318fSKip Macy return elmr_write(adap, VSC_REG(1, port, 2), mtu);
227ef72318fSKip Macy }
228ef72318fSKip Macy
t3_vsc7323_set_addr(adapter_t * adap,u8 addr[6],int port)229ef72318fSKip Macy int t3_vsc7323_set_addr(adapter_t *adap, u8 addr[6], int port)
230ef72318fSKip Macy {
231ef72318fSKip Macy int ret;
232ef72318fSKip Macy
233ef72318fSKip Macy ret = elmr_write(adap, VSC_REG(1, port, 3),
234ef72318fSKip Macy (addr[0] << 16) | (addr[1] << 8) | addr[2]);
235ef72318fSKip Macy if (!ret)
236ef72318fSKip Macy ret = elmr_write(adap, VSC_REG(1, port, 4),
237ef72318fSKip Macy (addr[3] << 16) | (addr[4] << 8) | addr[5]);
238ef72318fSKip Macy return ret;
239ef72318fSKip Macy }
240ef72318fSKip Macy
t3_vsc7323_enable(adapter_t * adap,int port,int which)241ef72318fSKip Macy int t3_vsc7323_enable(adapter_t *adap, int port, int which)
242ef72318fSKip Macy {
243ef72318fSKip Macy int ret;
244ef72318fSKip Macy unsigned int v, orig;
245ef72318fSKip Macy
246ef72318fSKip Macy ret = t3_elmr_blk_read(adap, VSC_REG(1, port, 0), &v, 1);
247ef72318fSKip Macy if (!ret) {
248ef72318fSKip Macy orig = v;
249ef72318fSKip Macy if (which & MAC_DIRECTION_TX)
250ef72318fSKip Macy v |= 1;
251ef72318fSKip Macy if (which & MAC_DIRECTION_RX)
252ef72318fSKip Macy v |= 2;
253ef72318fSKip Macy if (v != orig)
254ef72318fSKip Macy ret = elmr_write(adap, VSC_REG(1, port, 0), v);
255ef72318fSKip Macy }
256ef72318fSKip Macy return ret;
257ef72318fSKip Macy }
258ef72318fSKip Macy
t3_vsc7323_disable(adapter_t * adap,int port,int which)259ef72318fSKip Macy int t3_vsc7323_disable(adapter_t *adap, int port, int which)
260ef72318fSKip Macy {
261ef72318fSKip Macy int ret;
262ef72318fSKip Macy unsigned int v, orig;
263ef72318fSKip Macy
264ef72318fSKip Macy ret = t3_elmr_blk_read(adap, VSC_REG(1, port, 0), &v, 1);
265ef72318fSKip Macy if (!ret) {
266ef72318fSKip Macy orig = v;
267ef72318fSKip Macy if (which & MAC_DIRECTION_TX)
268ef72318fSKip Macy v &= ~1;
269ef72318fSKip Macy if (which & MAC_DIRECTION_RX)
270ef72318fSKip Macy v &= ~2;
271ef72318fSKip Macy if (v != orig)
272ef72318fSKip Macy ret = elmr_write(adap, VSC_REG(1, port, 0), v);
273ef72318fSKip Macy }
274ef72318fSKip Macy return ret;
275ef72318fSKip Macy }
276ef72318fSKip Macy
277ef72318fSKip Macy #define STATS0_START 1
278ef72318fSKip Macy #define STATS1_START 0x24
279ef72318fSKip Macy #define NSTATS0 (0x1d - STATS0_START + 1)
280ef72318fSKip Macy #define NSTATS1 (0x2a - STATS1_START + 1)
281ef72318fSKip Macy
2825c5df3daSKip Macy #define ELMR_STAT(port, reg) (ELMR_STATS + port * 0x40 + reg)
2835c5df3daSKip Macy
t3_vsc7323_update_stats(struct cmac * mac)284ef72318fSKip Macy const struct mac_stats *t3_vsc7323_update_stats(struct cmac *mac)
285ef72318fSKip Macy {
286ef72318fSKip Macy int ret;
287ef72318fSKip Macy u64 rx_ucast, tx_ucast;
288ef72318fSKip Macy u32 stats0[NSTATS0], stats1[NSTATS1];
289ef72318fSKip Macy
290ef72318fSKip Macy ret = t3_elmr_blk_read(mac->adapter,
2915c5df3daSKip Macy ELMR_STAT(mac->ext_port, STATS0_START),
292ef72318fSKip Macy stats0, NSTATS0);
293ef72318fSKip Macy if (!ret)
294ef72318fSKip Macy ret = t3_elmr_blk_read(mac->adapter,
2955c5df3daSKip Macy ELMR_STAT(mac->ext_port, STATS1_START),
296ef72318fSKip Macy stats1, NSTATS1);
297ef72318fSKip Macy if (ret)
298ef72318fSKip Macy goto out;
299ef72318fSKip Macy
300ef72318fSKip Macy /*
301ef72318fSKip Macy * HW counts Rx/Tx unicast frames but we want all the frames.
302ef72318fSKip Macy */
303ef72318fSKip Macy rx_ucast = mac->stats.rx_frames - mac->stats.rx_mcast_frames -
304ef72318fSKip Macy mac->stats.rx_bcast_frames;
305ef72318fSKip Macy rx_ucast += (u64)(stats0[6 - STATS0_START] - (u32)rx_ucast);
306ef72318fSKip Macy tx_ucast = mac->stats.tx_frames - mac->stats.tx_mcast_frames -
307ef72318fSKip Macy mac->stats.tx_bcast_frames;
308ef72318fSKip Macy tx_ucast += (u64)(stats0[27 - STATS0_START] - (u32)tx_ucast);
309ef72318fSKip Macy
310ef72318fSKip Macy #define RMON_UPDATE(mac, name, hw_stat) \
311ef72318fSKip Macy mac->stats.name += (u64)((hw_stat) - (u32)(mac->stats.name))
312ef72318fSKip Macy
313ef72318fSKip Macy RMON_UPDATE(mac, rx_octets, stats0[4 - STATS0_START]);
314ef72318fSKip Macy RMON_UPDATE(mac, rx_frames, stats0[6 - STATS0_START]);
315ef72318fSKip Macy RMON_UPDATE(mac, rx_frames, stats0[7 - STATS0_START]);
316ef72318fSKip Macy RMON_UPDATE(mac, rx_frames, stats0[8 - STATS0_START]);
317ef72318fSKip Macy RMON_UPDATE(mac, rx_mcast_frames, stats0[7 - STATS0_START]);
318ef72318fSKip Macy RMON_UPDATE(mac, rx_bcast_frames, stats0[8 - STATS0_START]);
319ef72318fSKip Macy RMON_UPDATE(mac, rx_fcs_errs, stats0[9 - STATS0_START]);
320ef72318fSKip Macy RMON_UPDATE(mac, rx_pause, stats0[2 - STATS0_START]);
321ef72318fSKip Macy RMON_UPDATE(mac, rx_jabber, stats0[16 - STATS0_START]);
322ef72318fSKip Macy RMON_UPDATE(mac, rx_short, stats0[11 - STATS0_START]);
323ef72318fSKip Macy RMON_UPDATE(mac, rx_symbol_errs, stats0[1 - STATS0_START]);
324ef72318fSKip Macy RMON_UPDATE(mac, rx_too_long, stats0[15 - STATS0_START]);
325ef72318fSKip Macy
326ef72318fSKip Macy RMON_UPDATE(mac, rx_frames_64, stats0[17 - STATS0_START]);
327ef72318fSKip Macy RMON_UPDATE(mac, rx_frames_65_127, stats0[18 - STATS0_START]);
328ef72318fSKip Macy RMON_UPDATE(mac, rx_frames_128_255, stats0[19 - STATS0_START]);
329ef72318fSKip Macy RMON_UPDATE(mac, rx_frames_256_511, stats0[20 - STATS0_START]);
330ef72318fSKip Macy RMON_UPDATE(mac, rx_frames_512_1023, stats0[21 - STATS0_START]);
331ef72318fSKip Macy RMON_UPDATE(mac, rx_frames_1024_1518, stats0[22 - STATS0_START]);
332ef72318fSKip Macy RMON_UPDATE(mac, rx_frames_1519_max, stats0[23 - STATS0_START]);
333ef72318fSKip Macy
334ef72318fSKip Macy RMON_UPDATE(mac, tx_octets, stats0[26 - STATS0_START]);
335ef72318fSKip Macy RMON_UPDATE(mac, tx_frames, stats0[27 - STATS0_START]);
336ef72318fSKip Macy RMON_UPDATE(mac, tx_frames, stats0[28 - STATS0_START]);
337ef72318fSKip Macy RMON_UPDATE(mac, tx_frames, stats0[29 - STATS0_START]);
338ef72318fSKip Macy RMON_UPDATE(mac, tx_mcast_frames, stats0[28 - STATS0_START]);
339ef72318fSKip Macy RMON_UPDATE(mac, tx_bcast_frames, stats0[29 - STATS0_START]);
340ef72318fSKip Macy RMON_UPDATE(mac, tx_pause, stats0[25 - STATS0_START]);
341ef72318fSKip Macy
342ef72318fSKip Macy RMON_UPDATE(mac, tx_underrun, 0);
343ef72318fSKip Macy
344ef72318fSKip Macy RMON_UPDATE(mac, tx_frames_64, stats1[36 - STATS1_START]);
345ef72318fSKip Macy RMON_UPDATE(mac, tx_frames_65_127, stats1[37 - STATS1_START]);
346ef72318fSKip Macy RMON_UPDATE(mac, tx_frames_128_255, stats1[38 - STATS1_START]);
347ef72318fSKip Macy RMON_UPDATE(mac, tx_frames_256_511, stats1[39 - STATS1_START]);
348ef72318fSKip Macy RMON_UPDATE(mac, tx_frames_512_1023, stats1[40 - STATS1_START]);
349ef72318fSKip Macy RMON_UPDATE(mac, tx_frames_1024_1518, stats1[41 - STATS1_START]);
350ef72318fSKip Macy RMON_UPDATE(mac, tx_frames_1519_max, stats1[42 - STATS1_START]);
351ef72318fSKip Macy
352ef72318fSKip Macy #undef RMON_UPDATE
353ef72318fSKip Macy
354ef72318fSKip Macy mac->stats.rx_frames = rx_ucast + mac->stats.rx_mcast_frames +
355ef72318fSKip Macy mac->stats.rx_bcast_frames;
356ef72318fSKip Macy mac->stats.tx_frames = tx_ucast + mac->stats.tx_mcast_frames +
357ef72318fSKip Macy mac->stats.tx_bcast_frames;
358ef72318fSKip Macy out: return &mac->stats;
359ef72318fSKip Macy }
360