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