xref: /freebsd/sys/dev/cxgb/common/cxgb_vsc7323.c (revision 685dc743dc3b5645e34836464128e1c0558b404b)
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