]> CyberLeo.Net >> Repos - FreeBSD/releng/8.1.git/blob - sys/dev/msk/if_msk.c
Copy stable/8 to releng/8.1 in preparation for 8.1-RC1.
[FreeBSD/releng/8.1.git] / sys / dev / msk / if_msk.c
1 /******************************************************************************
2  *
3  * Name   : sky2.c
4  * Project: Gigabit Ethernet Driver for FreeBSD 5.x/6.x
5  * Version: $Revision: 1.23 $
6  * Date   : $Date: 2005/12/22 09:04:11 $
7  * Purpose: Main driver source file
8  *
9  *****************************************************************************/
10
11 /******************************************************************************
12  *
13  *      LICENSE:
14  *      Copyright (C) Marvell International Ltd. and/or its affiliates
15  *
16  *      The computer program files contained in this folder ("Files")
17  *      are provided to you under the BSD-type license terms provided
18  *      below, and any use of such Files and any derivative works
19  *      thereof created by you shall be governed by the following terms
20  *      and conditions:
21  *
22  *      - Redistributions of source code must retain the above copyright
23  *        notice, this list of conditions and the following disclaimer.
24  *      - Redistributions in binary form must reproduce the above
25  *        copyright notice, this list of conditions and the following
26  *        disclaimer in the documentation and/or other materials provided
27  *        with the distribution.
28  *      - Neither the name of Marvell nor the names of its contributors
29  *        may be used to endorse or promote products derived from this
30  *        software without specific prior written permission.
31  *
32  *      THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33  *      "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34  *      LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
35  *      FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
36  *      COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
37  *      INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
38  *      BUT NOT LIMITED TO, PROCUREMENT OF  SUBSTITUTE GOODS OR SERVICES;
39  *      LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
40  *      HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
41  *      STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
42  *      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
43  *      OF THE POSSIBILITY OF SUCH DAMAGE.
44  *      /LICENSE
45  *
46  *****************************************************************************/
47
48 /*-
49  * Copyright (c) 1997, 1998, 1999, 2000
50  *      Bill Paul <wpaul@ctr.columbia.edu>.  All rights reserved.
51  *
52  * Redistribution and use in source and binary forms, with or without
53  * modification, are permitted provided that the following conditions
54  * are met:
55  * 1. Redistributions of source code must retain the above copyright
56  *    notice, this list of conditions and the following disclaimer.
57  * 2. Redistributions in binary form must reproduce the above copyright
58  *    notice, this list of conditions and the following disclaimer in the
59  *    documentation and/or other materials provided with the distribution.
60  * 3. All advertising materials mentioning features or use of this software
61  *    must display the following acknowledgement:
62  *      This product includes software developed by Bill Paul.
63  * 4. Neither the name of the author nor the names of any co-contributors
64  *    may be used to endorse or promote products derived from this software
65  *    without specific prior written permission.
66  *
67  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
68  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
69  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
70  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
71  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
72  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
73  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
74  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
75  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
76  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
77  * THE POSSIBILITY OF SUCH DAMAGE.
78  */
79 /*-
80  * Copyright (c) 2003 Nathan L. Binkert <binkertn@umich.edu>
81  *
82  * Permission to use, copy, modify, and distribute this software for any
83  * purpose with or without fee is hereby granted, provided that the above
84  * copyright notice and this permission notice appear in all copies.
85  *
86  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
87  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
88  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
89  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
90  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
91  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
92  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
93  */
94
95 /*
96  * Device driver for the Marvell Yukon II Ethernet controller.
97  * Due to lack of documentation, this driver is based on the code from
98  * sk(4) and Marvell's myk(4) driver for FreeBSD 5.x.
99  */
100
101 #include <sys/cdefs.h>
102 __FBSDID("$FreeBSD$");
103
104 #include <sys/param.h>
105 #include <sys/systm.h>
106 #include <sys/bus.h>
107 #include <sys/endian.h>
108 #include <sys/mbuf.h>
109 #include <sys/malloc.h>
110 #include <sys/kernel.h>
111 #include <sys/module.h>
112 #include <sys/socket.h>
113 #include <sys/sockio.h>
114 #include <sys/queue.h>
115 #include <sys/sysctl.h>
116
117 #include <net/bpf.h>
118 #include <net/ethernet.h>
119 #include <net/if.h>
120 #include <net/if_arp.h>
121 #include <net/if_dl.h>
122 #include <net/if_media.h>
123 #include <net/if_types.h>
124 #include <net/if_vlan_var.h>
125
126 #include <netinet/in.h>
127 #include <netinet/in_systm.h>
128 #include <netinet/ip.h>
129 #include <netinet/tcp.h>
130 #include <netinet/udp.h>
131
132 #include <machine/bus.h>
133 #include <machine/in_cksum.h>
134 #include <machine/resource.h>
135 #include <sys/rman.h>
136
137 #include <dev/mii/mii.h>
138 #include <dev/mii/miivar.h>
139
140 #include <dev/pci/pcireg.h>
141 #include <dev/pci/pcivar.h>
142
143 #include <dev/msk/if_mskreg.h>
144
145 MODULE_DEPEND(msk, pci, 1, 1, 1);
146 MODULE_DEPEND(msk, ether, 1, 1, 1);
147 MODULE_DEPEND(msk, miibus, 1, 1, 1);
148
149 /* "device miibus" required.  See GENERIC if you get errors here. */
150 #include "miibus_if.h"
151
152 /* Tunables. */
153 static int msi_disable = 0;
154 TUNABLE_INT("hw.msk.msi_disable", &msi_disable);
155 static int legacy_intr = 0;
156 TUNABLE_INT("hw.msk.legacy_intr", &legacy_intr);
157 static int jumbo_disable = 0;
158 TUNABLE_INT("hw.msk.jumbo_disable", &jumbo_disable);
159
160 #define MSK_CSUM_FEATURES       (CSUM_TCP | CSUM_UDP)
161
162 /*
163  * Devices supported by this driver.
164  */
165 static struct msk_product {
166         uint16_t        msk_vendorid;
167         uint16_t        msk_deviceid;
168         const char      *msk_name;
169 } msk_products[] = {
170         { VENDORID_SK, DEVICEID_SK_YUKON2,
171             "SK-9Sxx Gigabit Ethernet" },
172         { VENDORID_SK, DEVICEID_SK_YUKON2_EXPR,
173             "SK-9Exx Gigabit Ethernet"},
174         { VENDORID_MARVELL, DEVICEID_MRVL_8021CU,
175             "Marvell Yukon 88E8021CU Gigabit Ethernet" },
176         { VENDORID_MARVELL, DEVICEID_MRVL_8021X,
177             "Marvell Yukon 88E8021 SX/LX Gigabit Ethernet" },
178         { VENDORID_MARVELL, DEVICEID_MRVL_8022CU,
179             "Marvell Yukon 88E8022CU Gigabit Ethernet" },
180         { VENDORID_MARVELL, DEVICEID_MRVL_8022X,
181             "Marvell Yukon 88E8022 SX/LX Gigabit Ethernet" },
182         { VENDORID_MARVELL, DEVICEID_MRVL_8061CU,
183             "Marvell Yukon 88E8061CU Gigabit Ethernet" },
184         { VENDORID_MARVELL, DEVICEID_MRVL_8061X,
185             "Marvell Yukon 88E8061 SX/LX Gigabit Ethernet" },
186         { VENDORID_MARVELL, DEVICEID_MRVL_8062CU,
187             "Marvell Yukon 88E8062CU Gigabit Ethernet" },
188         { VENDORID_MARVELL, DEVICEID_MRVL_8062X,
189             "Marvell Yukon 88E8062 SX/LX Gigabit Ethernet" },
190         { VENDORID_MARVELL, DEVICEID_MRVL_8035,
191             "Marvell Yukon 88E8035 Fast Ethernet" },
192         { VENDORID_MARVELL, DEVICEID_MRVL_8036,
193             "Marvell Yukon 88E8036 Fast Ethernet" },
194         { VENDORID_MARVELL, DEVICEID_MRVL_8038,
195             "Marvell Yukon 88E8038 Fast Ethernet" },
196         { VENDORID_MARVELL, DEVICEID_MRVL_8039,
197             "Marvell Yukon 88E8039 Fast Ethernet" },
198         { VENDORID_MARVELL, DEVICEID_MRVL_8040,
199             "Marvell Yukon 88E8040 Fast Ethernet" },
200         { VENDORID_MARVELL, DEVICEID_MRVL_8040T,
201             "Marvell Yukon 88E8040T Fast Ethernet" },
202         { VENDORID_MARVELL, DEVICEID_MRVL_8042,
203             "Marvell Yukon 88E8042 Fast Ethernet" },
204         { VENDORID_MARVELL, DEVICEID_MRVL_8048,
205             "Marvell Yukon 88E8048 Fast Ethernet" },
206         { VENDORID_MARVELL, DEVICEID_MRVL_4361,
207             "Marvell Yukon 88E8050 Gigabit Ethernet" },
208         { VENDORID_MARVELL, DEVICEID_MRVL_4360,
209             "Marvell Yukon 88E8052 Gigabit Ethernet" },
210         { VENDORID_MARVELL, DEVICEID_MRVL_4362,
211             "Marvell Yukon 88E8053 Gigabit Ethernet" },
212         { VENDORID_MARVELL, DEVICEID_MRVL_4363,
213             "Marvell Yukon 88E8055 Gigabit Ethernet" },
214         { VENDORID_MARVELL, DEVICEID_MRVL_4364,
215             "Marvell Yukon 88E8056 Gigabit Ethernet" },
216         { VENDORID_MARVELL, DEVICEID_MRVL_4365,
217             "Marvell Yukon 88E8070 Gigabit Ethernet" },
218         { VENDORID_MARVELL, DEVICEID_MRVL_436A,
219             "Marvell Yukon 88E8058 Gigabit Ethernet" },
220         { VENDORID_MARVELL, DEVICEID_MRVL_436B,
221             "Marvell Yukon 88E8071 Gigabit Ethernet" },
222         { VENDORID_MARVELL, DEVICEID_MRVL_436C,
223             "Marvell Yukon 88E8072 Gigabit Ethernet" },
224         { VENDORID_MARVELL, DEVICEID_MRVL_4380,
225             "Marvell Yukon 88E8057 Gigabit Ethernet" },
226         { VENDORID_MARVELL, DEVICEID_MRVL_4381,
227             "Marvell Yukon 88E8059 Gigabit Ethernet" },
228         { VENDORID_DLINK, DEVICEID_DLINK_DGE550SX,
229             "D-Link 550SX Gigabit Ethernet" },
230         { VENDORID_DLINK, DEVICEID_DLINK_DGE560SX,
231             "D-Link 560SX Gigabit Ethernet" },
232         { VENDORID_DLINK, DEVICEID_DLINK_DGE560T,
233             "D-Link 560T Gigabit Ethernet" }
234 };
235
236 static const char *model_name[] = {
237         "Yukon XL",
238         "Yukon EC Ultra",
239         "Yukon EX",
240         "Yukon EC",
241         "Yukon FE",
242         "Yukon FE+",
243         "Yukon Supreme",
244         "Yukon Ultra 2",
245         "Yukon Unknown",
246         "Yukon Optima",
247 };
248
249 static int mskc_probe(device_t);
250 static int mskc_attach(device_t);
251 static int mskc_detach(device_t);
252 static int mskc_shutdown(device_t);
253 static int mskc_setup_rambuffer(struct msk_softc *);
254 static int mskc_suspend(device_t);
255 static int mskc_resume(device_t);
256 static void mskc_reset(struct msk_softc *);
257
258 static int msk_probe(device_t);
259 static int msk_attach(device_t);
260 static int msk_detach(device_t);
261
262 static void msk_tick(void *);
263 static void msk_intr(void *);
264 static void msk_intr_phy(struct msk_if_softc *);
265 static void msk_intr_gmac(struct msk_if_softc *);
266 static __inline void msk_rxput(struct msk_if_softc *);
267 static int msk_handle_events(struct msk_softc *);
268 static void msk_handle_hwerr(struct msk_if_softc *, uint32_t);
269 static void msk_intr_hwerr(struct msk_softc *);
270 #ifndef __NO_STRICT_ALIGNMENT
271 static __inline void msk_fixup_rx(struct mbuf *);
272 #endif
273 static void msk_rxeof(struct msk_if_softc *, uint32_t, uint32_t, int);
274 static void msk_jumbo_rxeof(struct msk_if_softc *, uint32_t, uint32_t, int);
275 static void msk_txeof(struct msk_if_softc *, int);
276 static int msk_encap(struct msk_if_softc *, struct mbuf **);
277 static void msk_start(struct ifnet *);
278 static void msk_start_locked(struct ifnet *);
279 static int msk_ioctl(struct ifnet *, u_long, caddr_t);
280 static void msk_set_prefetch(struct msk_softc *, int, bus_addr_t, uint32_t);
281 static void msk_set_rambuffer(struct msk_if_softc *);
282 static void msk_set_tx_stfwd(struct msk_if_softc *);
283 static void msk_init(void *);
284 static void msk_init_locked(struct msk_if_softc *);
285 static void msk_stop(struct msk_if_softc *);
286 static void msk_watchdog(struct msk_if_softc *);
287 static int msk_mediachange(struct ifnet *);
288 static void msk_mediastatus(struct ifnet *, struct ifmediareq *);
289 static void msk_phy_power(struct msk_softc *, int);
290 static void msk_dmamap_cb(void *, bus_dma_segment_t *, int, int);
291 static int msk_status_dma_alloc(struct msk_softc *);
292 static void msk_status_dma_free(struct msk_softc *);
293 static int msk_txrx_dma_alloc(struct msk_if_softc *);
294 static int msk_rx_dma_jalloc(struct msk_if_softc *);
295 static void msk_txrx_dma_free(struct msk_if_softc *);
296 static void msk_rx_dma_jfree(struct msk_if_softc *);
297 static int msk_init_rx_ring(struct msk_if_softc *);
298 static int msk_init_jumbo_rx_ring(struct msk_if_softc *);
299 static void msk_init_tx_ring(struct msk_if_softc *);
300 static __inline void msk_discard_rxbuf(struct msk_if_softc *, int);
301 static __inline void msk_discard_jumbo_rxbuf(struct msk_if_softc *, int);
302 static int msk_newbuf(struct msk_if_softc *, int);
303 static int msk_jumbo_newbuf(struct msk_if_softc *, int);
304
305 static int msk_phy_readreg(struct msk_if_softc *, int, int);
306 static int msk_phy_writereg(struct msk_if_softc *, int, int, int);
307 static int msk_miibus_readreg(device_t, int, int);
308 static int msk_miibus_writereg(device_t, int, int, int);
309 static void msk_miibus_statchg(device_t);
310
311 static void msk_rxfilter(struct msk_if_softc *);
312 static void msk_setvlan(struct msk_if_softc *, struct ifnet *);
313
314 static void msk_stats_clear(struct msk_if_softc *);
315 static void msk_stats_update(struct msk_if_softc *);
316 static int msk_sysctl_stat32(SYSCTL_HANDLER_ARGS);
317 static int msk_sysctl_stat64(SYSCTL_HANDLER_ARGS);
318 static void msk_sysctl_node(struct msk_if_softc *);
319 static int sysctl_int_range(SYSCTL_HANDLER_ARGS, int, int);
320 static int sysctl_hw_msk_proc_limit(SYSCTL_HANDLER_ARGS);
321
322 static device_method_t mskc_methods[] = {
323         /* Device interface */
324         DEVMETHOD(device_probe,         mskc_probe),
325         DEVMETHOD(device_attach,        mskc_attach),
326         DEVMETHOD(device_detach,        mskc_detach),
327         DEVMETHOD(device_suspend,       mskc_suspend),
328         DEVMETHOD(device_resume,        mskc_resume),
329         DEVMETHOD(device_shutdown,      mskc_shutdown),
330
331         /* bus interface */
332         DEVMETHOD(bus_print_child,      bus_generic_print_child),
333         DEVMETHOD(bus_driver_added,     bus_generic_driver_added),
334
335         { NULL, NULL }
336 };
337
338 static driver_t mskc_driver = {
339         "mskc",
340         mskc_methods,
341         sizeof(struct msk_softc)
342 };
343
344 static devclass_t mskc_devclass;
345
346 static device_method_t msk_methods[] = {
347         /* Device interface */
348         DEVMETHOD(device_probe,         msk_probe),
349         DEVMETHOD(device_attach,        msk_attach),
350         DEVMETHOD(device_detach,        msk_detach),
351         DEVMETHOD(device_shutdown,      bus_generic_shutdown),
352
353         /* bus interface */
354         DEVMETHOD(bus_print_child,      bus_generic_print_child),
355         DEVMETHOD(bus_driver_added,     bus_generic_driver_added),
356
357         /* MII interface */
358         DEVMETHOD(miibus_readreg,       msk_miibus_readreg),
359         DEVMETHOD(miibus_writereg,      msk_miibus_writereg),
360         DEVMETHOD(miibus_statchg,       msk_miibus_statchg),
361
362         { NULL, NULL }
363 };
364
365 static driver_t msk_driver = {
366         "msk",
367         msk_methods,
368         sizeof(struct msk_if_softc)
369 };
370
371 static devclass_t msk_devclass;
372
373 DRIVER_MODULE(mskc, pci, mskc_driver, mskc_devclass, 0, 0);
374 DRIVER_MODULE(msk, mskc, msk_driver, msk_devclass, 0, 0);
375 DRIVER_MODULE(miibus, msk, miibus_driver, miibus_devclass, 0, 0);
376
377 static struct resource_spec msk_res_spec_io[] = {
378         { SYS_RES_IOPORT,       PCIR_BAR(1),    RF_ACTIVE },
379         { -1,                   0,              0 }
380 };
381
382 static struct resource_spec msk_res_spec_mem[] = {
383         { SYS_RES_MEMORY,       PCIR_BAR(0),    RF_ACTIVE },
384         { -1,                   0,              0 }
385 };
386
387 static struct resource_spec msk_irq_spec_legacy[] = {
388         { SYS_RES_IRQ,          0,              RF_ACTIVE | RF_SHAREABLE },
389         { -1,                   0,              0 }
390 };
391
392 static struct resource_spec msk_irq_spec_msi[] = {
393         { SYS_RES_IRQ,          1,              RF_ACTIVE },
394         { -1,                   0,              0 }
395 };
396
397 static int
398 msk_miibus_readreg(device_t dev, int phy, int reg)
399 {
400         struct msk_if_softc *sc_if;
401
402         if (phy != PHY_ADDR_MARV)
403                 return (0);
404
405         sc_if = device_get_softc(dev);
406
407         return (msk_phy_readreg(sc_if, phy, reg));
408 }
409
410 static int
411 msk_phy_readreg(struct msk_if_softc *sc_if, int phy, int reg)
412 {
413         struct msk_softc *sc;
414         int i, val;
415
416         sc = sc_if->msk_softc;
417
418         GMAC_WRITE_2(sc, sc_if->msk_port, GM_SMI_CTRL,
419             GM_SMI_CT_PHY_AD(phy) | GM_SMI_CT_REG_AD(reg) | GM_SMI_CT_OP_RD);
420
421         for (i = 0; i < MSK_TIMEOUT; i++) {
422                 DELAY(1);
423                 val = GMAC_READ_2(sc, sc_if->msk_port, GM_SMI_CTRL);
424                 if ((val & GM_SMI_CT_RD_VAL) != 0) {
425                         val = GMAC_READ_2(sc, sc_if->msk_port, GM_SMI_DATA);
426                         break;
427                 }
428         }
429
430         if (i == MSK_TIMEOUT) {
431                 if_printf(sc_if->msk_ifp, "phy failed to come ready\n");
432                 val = 0;
433         }
434
435         return (val);
436 }
437
438 static int
439 msk_miibus_writereg(device_t dev, int phy, int reg, int val)
440 {
441         struct msk_if_softc *sc_if;
442
443         if (phy != PHY_ADDR_MARV)
444                 return (0);
445
446         sc_if = device_get_softc(dev);
447
448         return (msk_phy_writereg(sc_if, phy, reg, val));
449 }
450
451 static int
452 msk_phy_writereg(struct msk_if_softc *sc_if, int phy, int reg, int val)
453 {
454         struct msk_softc *sc;
455         int i;
456
457         sc = sc_if->msk_softc;
458
459         GMAC_WRITE_2(sc, sc_if->msk_port, GM_SMI_DATA, val);
460         GMAC_WRITE_2(sc, sc_if->msk_port, GM_SMI_CTRL,
461             GM_SMI_CT_PHY_AD(phy) | GM_SMI_CT_REG_AD(reg));
462         for (i = 0; i < MSK_TIMEOUT; i++) {
463                 DELAY(1);
464                 if ((GMAC_READ_2(sc, sc_if->msk_port, GM_SMI_CTRL) &
465                     GM_SMI_CT_BUSY) == 0)
466                         break;
467         }
468         if (i == MSK_TIMEOUT)
469                 if_printf(sc_if->msk_ifp, "phy write timeout\n");
470
471         return (0);
472 }
473
474 static void
475 msk_miibus_statchg(device_t dev)
476 {
477         struct msk_softc *sc;
478         struct msk_if_softc *sc_if;
479         struct mii_data *mii;
480         struct ifnet *ifp;
481         uint32_t gmac;
482
483         sc_if = device_get_softc(dev);
484         sc = sc_if->msk_softc;
485
486         MSK_IF_LOCK_ASSERT(sc_if);
487
488         mii = device_get_softc(sc_if->msk_miibus);
489         ifp = sc_if->msk_ifp;
490         if (mii == NULL || ifp == NULL ||
491             (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
492                 return;
493
494         sc_if->msk_flags &= ~MSK_FLAG_LINK;
495         if ((mii->mii_media_status & (IFM_AVALID | IFM_ACTIVE)) ==
496             (IFM_AVALID | IFM_ACTIVE)) {
497                 switch (IFM_SUBTYPE(mii->mii_media_active)) {
498                 case IFM_10_T:
499                 case IFM_100_TX:
500                         sc_if->msk_flags |= MSK_FLAG_LINK;
501                         break;
502                 case IFM_1000_T:
503                 case IFM_1000_SX:
504                 case IFM_1000_LX:
505                 case IFM_1000_CX:
506                         if ((sc_if->msk_flags & MSK_FLAG_FASTETHER) == 0)
507                                 sc_if->msk_flags |= MSK_FLAG_LINK;
508                         break;
509                 default:
510                         break;
511                 }
512         }
513
514         if ((sc_if->msk_flags & MSK_FLAG_LINK) != 0) {
515                 /* Enable Tx FIFO Underrun. */
516                 CSR_WRITE_1(sc, MR_ADDR(sc_if->msk_port, GMAC_IRQ_MSK),
517                     GM_IS_TX_FF_UR | GM_IS_RX_FF_OR);
518                 /*
519                  * Because mii(4) notify msk(4) that it detected link status
520                  * change, there is no need to enable automatic
521                  * speed/flow-control/duplex updates.
522                  */
523                 gmac = GM_GPCR_AU_ALL_DIS;
524                 switch (IFM_SUBTYPE(mii->mii_media_active)) {
525                 case IFM_1000_SX:
526                 case IFM_1000_T:
527                         gmac |= GM_GPCR_SPEED_1000;
528                         break;
529                 case IFM_100_TX:
530                         gmac |= GM_GPCR_SPEED_100;
531                         break;
532                 case IFM_10_T:
533                         break;
534                 }
535
536                 /* Disable Rx flow control. */
537                 if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FLAG0) == 0)
538                         gmac |= GM_GPCR_FC_RX_DIS;
539                 /* Disable Tx flow control. */
540                 if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FLAG1) == 0)
541                         gmac |= GM_GPCR_FC_TX_DIS;
542                 if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0)
543                         gmac |= GM_GPCR_DUP_FULL;
544                 else
545                         gmac |= GM_GPCR_FC_RX_DIS | GM_GPCR_FC_TX_DIS;
546                 gmac |= GM_GPCR_RX_ENA | GM_GPCR_TX_ENA;
547                 GMAC_WRITE_2(sc, sc_if->msk_port, GM_GP_CTRL, gmac);
548                 /* Read again to ensure writing. */
549                 GMAC_READ_2(sc, sc_if->msk_port, GM_GP_CTRL);
550                 gmac = GMC_PAUSE_OFF;
551                 if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0) {
552                         if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FLAG0) != 0)
553                                 gmac = GMC_PAUSE_ON;
554                 }
555                 CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, GMAC_CTRL), gmac);
556
557                 /* Enable PHY interrupt for FIFO underrun/overflow. */
558                 msk_phy_writereg(sc_if, PHY_ADDR_MARV,
559                     PHY_MARV_INT_MASK, PHY_M_IS_FIFO_ERROR);
560         } else {
561                 /*
562                  * Link state changed to down.
563                  * Disable PHY interrupts.
564                  */
565                 msk_phy_writereg(sc_if, PHY_ADDR_MARV, PHY_MARV_INT_MASK, 0);
566                 /* Disable Rx/Tx MAC. */
567                 gmac = GMAC_READ_2(sc, sc_if->msk_port, GM_GP_CTRL);
568                 if ((GM_GPCR_RX_ENA | GM_GPCR_TX_ENA) != 0) {
569                         gmac &= ~(GM_GPCR_RX_ENA | GM_GPCR_TX_ENA);
570                         GMAC_WRITE_2(sc, sc_if->msk_port, GM_GP_CTRL, gmac);
571                         /* Read again to ensure writing. */
572                         GMAC_READ_2(sc, sc_if->msk_port, GM_GP_CTRL);
573                 }
574         }
575 }
576
577 static void
578 msk_rxfilter(struct msk_if_softc *sc_if)
579 {
580         struct msk_softc *sc;
581         struct ifnet *ifp;
582         struct ifmultiaddr *ifma;
583         uint32_t mchash[2];
584         uint32_t crc;
585         uint16_t mode;
586
587         sc = sc_if->msk_softc;
588
589         MSK_IF_LOCK_ASSERT(sc_if);
590
591         ifp = sc_if->msk_ifp;
592
593         bzero(mchash, sizeof(mchash));
594         mode = GMAC_READ_2(sc, sc_if->msk_port, GM_RX_CTRL);
595         if ((ifp->if_flags & IFF_PROMISC) != 0)
596                 mode &= ~(GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA);
597         else if ((ifp->if_flags & IFF_ALLMULTI) != 0) {
598                 mode |= GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA;
599                 mchash[0] = 0xffff;
600                 mchash[1] = 0xffff;
601         } else {
602                 mode |= GM_RXCR_UCF_ENA;
603                 if_maddr_rlock(ifp);
604                 TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
605                         if (ifma->ifma_addr->sa_family != AF_LINK)
606                                 continue;
607                         crc = ether_crc32_be(LLADDR((struct sockaddr_dl *)
608                             ifma->ifma_addr), ETHER_ADDR_LEN);
609                         /* Just want the 6 least significant bits. */
610                         crc &= 0x3f;
611                         /* Set the corresponding bit in the hash table. */
612                         mchash[crc >> 5] |= 1 << (crc & 0x1f);
613                 }
614                 if_maddr_runlock(ifp);
615                 if (mchash[0] != 0 || mchash[1] != 0)
616                         mode |= GM_RXCR_MCF_ENA;
617         }
618
619         GMAC_WRITE_2(sc, sc_if->msk_port, GM_MC_ADDR_H1,
620             mchash[0] & 0xffff);
621         GMAC_WRITE_2(sc, sc_if->msk_port, GM_MC_ADDR_H2,
622             (mchash[0] >> 16) & 0xffff);
623         GMAC_WRITE_2(sc, sc_if->msk_port, GM_MC_ADDR_H3,
624             mchash[1] & 0xffff);
625         GMAC_WRITE_2(sc, sc_if->msk_port, GM_MC_ADDR_H4,
626             (mchash[1] >> 16) & 0xffff);
627         GMAC_WRITE_2(sc, sc_if->msk_port, GM_RX_CTRL, mode);
628 }
629
630 static void
631 msk_setvlan(struct msk_if_softc *sc_if, struct ifnet *ifp)
632 {
633         struct msk_softc *sc;
634
635         sc = sc_if->msk_softc;
636         if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0) {
637                 CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, RX_GMF_CTRL_T),
638                     RX_VLAN_STRIP_ON);
639                 CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, TX_GMF_CTRL_T),
640                     TX_VLAN_TAG_ON);
641         } else {
642                 CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, RX_GMF_CTRL_T),
643                     RX_VLAN_STRIP_OFF);
644                 CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, TX_GMF_CTRL_T),
645                     TX_VLAN_TAG_OFF);
646         }
647 }
648
649 static int
650 msk_init_rx_ring(struct msk_if_softc *sc_if)
651 {
652         struct msk_ring_data *rd;
653         struct msk_rxdesc *rxd;
654         int i, prod;
655
656         MSK_IF_LOCK_ASSERT(sc_if);
657
658         sc_if->msk_cdata.msk_rx_cons = 0;
659         sc_if->msk_cdata.msk_rx_prod = 0;
660         sc_if->msk_cdata.msk_rx_putwm = MSK_PUT_WM;
661
662         rd = &sc_if->msk_rdata;
663         bzero(rd->msk_rx_ring, sizeof(struct msk_rx_desc) * MSK_RX_RING_CNT);
664         prod = sc_if->msk_cdata.msk_rx_prod;
665         for (i = 0; i < MSK_RX_RING_CNT; i++) {
666                 rxd = &sc_if->msk_cdata.msk_rxdesc[prod];
667                 rxd->rx_m = NULL;
668                 rxd->rx_le = &rd->msk_rx_ring[prod];
669                 if (msk_newbuf(sc_if, prod) != 0)
670                         return (ENOBUFS);
671                 MSK_INC(prod, MSK_RX_RING_CNT);
672         }
673
674         bus_dmamap_sync(sc_if->msk_cdata.msk_rx_ring_tag,
675             sc_if->msk_cdata.msk_rx_ring_map,
676             BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
677
678         /* Update prefetch unit. */
679         sc_if->msk_cdata.msk_rx_prod = MSK_RX_RING_CNT - 1;
680         CSR_WRITE_2(sc_if->msk_softc,
681             Y2_PREF_Q_ADDR(sc_if->msk_rxq, PREF_UNIT_PUT_IDX_REG),
682             sc_if->msk_cdata.msk_rx_prod);
683
684         return (0);
685 }
686
687 static int
688 msk_init_jumbo_rx_ring(struct msk_if_softc *sc_if)
689 {
690         struct msk_ring_data *rd;
691         struct msk_rxdesc *rxd;
692         int i, prod;
693
694         MSK_IF_LOCK_ASSERT(sc_if);
695
696         sc_if->msk_cdata.msk_rx_cons = 0;
697         sc_if->msk_cdata.msk_rx_prod = 0;
698         sc_if->msk_cdata.msk_rx_putwm = MSK_PUT_WM;
699
700         rd = &sc_if->msk_rdata;
701         bzero(rd->msk_jumbo_rx_ring,
702             sizeof(struct msk_rx_desc) * MSK_JUMBO_RX_RING_CNT);
703         prod = sc_if->msk_cdata.msk_rx_prod;
704         for (i = 0; i < MSK_JUMBO_RX_RING_CNT; i++) {
705                 rxd = &sc_if->msk_cdata.msk_jumbo_rxdesc[prod];
706                 rxd->rx_m = NULL;
707                 rxd->rx_le = &rd->msk_jumbo_rx_ring[prod];
708                 if (msk_jumbo_newbuf(sc_if, prod) != 0)
709                         return (ENOBUFS);
710                 MSK_INC(prod, MSK_JUMBO_RX_RING_CNT);
711         }
712
713         bus_dmamap_sync(sc_if->msk_cdata.msk_jumbo_rx_ring_tag,
714             sc_if->msk_cdata.msk_jumbo_rx_ring_map,
715             BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
716
717         sc_if->msk_cdata.msk_rx_prod = MSK_JUMBO_RX_RING_CNT - 1;
718         CSR_WRITE_2(sc_if->msk_softc,
719             Y2_PREF_Q_ADDR(sc_if->msk_rxq, PREF_UNIT_PUT_IDX_REG),
720             sc_if->msk_cdata.msk_rx_prod);
721
722         return (0);
723 }
724
725 static void
726 msk_init_tx_ring(struct msk_if_softc *sc_if)
727 {
728         struct msk_ring_data *rd;
729         struct msk_txdesc *txd;
730         int i;
731
732         sc_if->msk_cdata.msk_tso_mtu = 0;
733         sc_if->msk_cdata.msk_last_csum = 0;
734         sc_if->msk_cdata.msk_tx_prod = 0;
735         sc_if->msk_cdata.msk_tx_cons = 0;
736         sc_if->msk_cdata.msk_tx_cnt = 0;
737
738         rd = &sc_if->msk_rdata;
739         bzero(rd->msk_tx_ring, sizeof(struct msk_tx_desc) * MSK_TX_RING_CNT);
740         for (i = 0; i < MSK_TX_RING_CNT; i++) {
741                 txd = &sc_if->msk_cdata.msk_txdesc[i];
742                 txd->tx_m = NULL;
743                 txd->tx_le = &rd->msk_tx_ring[i];
744         }
745
746         bus_dmamap_sync(sc_if->msk_cdata.msk_tx_ring_tag,
747             sc_if->msk_cdata.msk_tx_ring_map,
748             BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
749 }
750
751 static __inline void
752 msk_discard_rxbuf(struct msk_if_softc *sc_if, int idx)
753 {
754         struct msk_rx_desc *rx_le;
755         struct msk_rxdesc *rxd;
756         struct mbuf *m;
757
758         rxd = &sc_if->msk_cdata.msk_rxdesc[idx];
759         m = rxd->rx_m;
760         rx_le = rxd->rx_le;
761         rx_le->msk_control = htole32(m->m_len | OP_PACKET | HW_OWNER);
762 }
763
764 static __inline void
765 msk_discard_jumbo_rxbuf(struct msk_if_softc *sc_if, int idx)
766 {
767         struct msk_rx_desc *rx_le;
768         struct msk_rxdesc *rxd;
769         struct mbuf *m;
770
771         rxd = &sc_if->msk_cdata.msk_jumbo_rxdesc[idx];
772         m = rxd->rx_m;
773         rx_le = rxd->rx_le;
774         rx_le->msk_control = htole32(m->m_len | OP_PACKET | HW_OWNER);
775 }
776
777 static int
778 msk_newbuf(struct msk_if_softc *sc_if, int idx)
779 {
780         struct msk_rx_desc *rx_le;
781         struct msk_rxdesc *rxd;
782         struct mbuf *m;
783         bus_dma_segment_t segs[1];
784         bus_dmamap_t map;
785         int nsegs;
786
787         m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
788         if (m == NULL)
789                 return (ENOBUFS);
790
791         m->m_len = m->m_pkthdr.len = MCLBYTES;
792         if ((sc_if->msk_flags & MSK_FLAG_RAMBUF) == 0)
793                 m_adj(m, ETHER_ALIGN);
794 #ifndef __NO_STRICT_ALIGNMENT
795         else
796                 m_adj(m, MSK_RX_BUF_ALIGN);
797 #endif
798
799         if (bus_dmamap_load_mbuf_sg(sc_if->msk_cdata.msk_rx_tag,
800             sc_if->msk_cdata.msk_rx_sparemap, m, segs, &nsegs,
801             BUS_DMA_NOWAIT) != 0) {
802                 m_freem(m);
803                 return (ENOBUFS);
804         }
805         KASSERT(nsegs == 1, ("%s: %d segments returned!", __func__, nsegs));
806
807         rxd = &sc_if->msk_cdata.msk_rxdesc[idx];
808         if (rxd->rx_m != NULL) {
809                 bus_dmamap_sync(sc_if->msk_cdata.msk_rx_tag, rxd->rx_dmamap,
810                     BUS_DMASYNC_POSTREAD);
811                 bus_dmamap_unload(sc_if->msk_cdata.msk_rx_tag, rxd->rx_dmamap);
812         }
813         map = rxd->rx_dmamap;
814         rxd->rx_dmamap = sc_if->msk_cdata.msk_rx_sparemap;
815         sc_if->msk_cdata.msk_rx_sparemap = map;
816         bus_dmamap_sync(sc_if->msk_cdata.msk_rx_tag, rxd->rx_dmamap,
817             BUS_DMASYNC_PREREAD);
818         rxd->rx_m = m;
819         rx_le = rxd->rx_le;
820         rx_le->msk_addr = htole32(MSK_ADDR_LO(segs[0].ds_addr));
821         rx_le->msk_control =
822             htole32(segs[0].ds_len | OP_PACKET | HW_OWNER);
823
824         return (0);
825 }
826
827 static int
828 msk_jumbo_newbuf(struct msk_if_softc *sc_if, int idx)
829 {
830         struct msk_rx_desc *rx_le;
831         struct msk_rxdesc *rxd;
832         struct mbuf *m;
833         bus_dma_segment_t segs[1];
834         bus_dmamap_t map;
835         int nsegs;
836
837         m = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, MJUM9BYTES);
838         if (m == NULL)
839                 return (ENOBUFS);
840         if ((m->m_flags & M_EXT) == 0) {
841                 m_freem(m);
842                 return (ENOBUFS);
843         }
844         m->m_len = m->m_pkthdr.len = MJUM9BYTES;
845         if ((sc_if->msk_flags & MSK_FLAG_RAMBUF) == 0)
846                 m_adj(m, ETHER_ALIGN);
847 #ifndef __NO_STRICT_ALIGNMENT
848         else
849                 m_adj(m, MSK_RX_BUF_ALIGN);
850 #endif
851
852         if (bus_dmamap_load_mbuf_sg(sc_if->msk_cdata.msk_jumbo_rx_tag,
853             sc_if->msk_cdata.msk_jumbo_rx_sparemap, m, segs, &nsegs,
854             BUS_DMA_NOWAIT) != 0) {
855                 m_freem(m);
856                 return (ENOBUFS);
857         }
858         KASSERT(nsegs == 1, ("%s: %d segments returned!", __func__, nsegs));
859
860         rxd = &sc_if->msk_cdata.msk_jumbo_rxdesc[idx];
861         if (rxd->rx_m != NULL) {
862                 bus_dmamap_sync(sc_if->msk_cdata.msk_jumbo_rx_tag,
863                     rxd->rx_dmamap, BUS_DMASYNC_POSTREAD);
864                 bus_dmamap_unload(sc_if->msk_cdata.msk_jumbo_rx_tag,
865                     rxd->rx_dmamap);
866         }
867         map = rxd->rx_dmamap;
868         rxd->rx_dmamap = sc_if->msk_cdata.msk_jumbo_rx_sparemap;
869         sc_if->msk_cdata.msk_jumbo_rx_sparemap = map;
870         bus_dmamap_sync(sc_if->msk_cdata.msk_jumbo_rx_tag, rxd->rx_dmamap,
871             BUS_DMASYNC_PREREAD);
872         rxd->rx_m = m;
873         rx_le = rxd->rx_le;
874         rx_le->msk_addr = htole32(MSK_ADDR_LO(segs[0].ds_addr));
875         rx_le->msk_control =
876             htole32(segs[0].ds_len | OP_PACKET | HW_OWNER);
877
878         return (0);
879 }
880
881 /*
882  * Set media options.
883  */
884 static int
885 msk_mediachange(struct ifnet *ifp)
886 {
887         struct msk_if_softc *sc_if;
888         struct mii_data *mii;
889         int error;
890
891         sc_if = ifp->if_softc;
892
893         MSK_IF_LOCK(sc_if);
894         mii = device_get_softc(sc_if->msk_miibus);
895         error = mii_mediachg(mii);
896         MSK_IF_UNLOCK(sc_if);
897
898         return (error);
899 }
900
901 /*
902  * Report current media status.
903  */
904 static void
905 msk_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
906 {
907         struct msk_if_softc *sc_if;
908         struct mii_data *mii;
909
910         sc_if = ifp->if_softc;
911         MSK_IF_LOCK(sc_if);
912         if ((ifp->if_flags & IFF_UP) == 0) {
913                 MSK_IF_UNLOCK(sc_if);
914                 return;
915         }
916         mii = device_get_softc(sc_if->msk_miibus);
917
918         mii_pollstat(mii);
919         MSK_IF_UNLOCK(sc_if);
920         ifmr->ifm_active = mii->mii_media_active;
921         ifmr->ifm_status = mii->mii_media_status;
922 }
923
924 static int
925 msk_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
926 {
927         struct msk_if_softc *sc_if;
928         struct ifreq *ifr;
929         struct mii_data *mii;
930         int error, mask;
931
932         sc_if = ifp->if_softc;
933         ifr = (struct ifreq *)data;
934         error = 0;
935
936         switch(command) {
937         case SIOCSIFMTU:
938                 MSK_IF_LOCK(sc_if);
939                 if (ifr->ifr_mtu > MSK_JUMBO_MTU || ifr->ifr_mtu < ETHERMIN)
940                         error = EINVAL;
941                 else if (ifp->if_mtu != ifr->ifr_mtu) {
942                         if (ifr->ifr_mtu > ETHERMTU) {
943                                 if ((sc_if->msk_flags & MSK_FLAG_JUMBO) == 0) {
944                                         error = EINVAL;
945                                         MSK_IF_UNLOCK(sc_if);
946                                         break;
947                                 }
948                                 if ((sc_if->msk_flags &
949                                     MSK_FLAG_JUMBO_NOCSUM) != 0) {
950                                         ifp->if_hwassist &=
951                                             ~(MSK_CSUM_FEATURES | CSUM_TSO);
952                                         ifp->if_capenable &=
953                                             ~(IFCAP_TSO4 | IFCAP_TXCSUM);
954                                         VLAN_CAPABILITIES(ifp);
955                                 }
956                         }
957                         ifp->if_mtu = ifr->ifr_mtu;
958                         msk_init_locked(sc_if);
959                 }
960                 MSK_IF_UNLOCK(sc_if);
961                 break;
962         case SIOCSIFFLAGS:
963                 MSK_IF_LOCK(sc_if);
964                 if ((ifp->if_flags & IFF_UP) != 0) {
965                         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0 &&
966                             ((ifp->if_flags ^ sc_if->msk_if_flags) &
967                             (IFF_PROMISC | IFF_ALLMULTI)) != 0)
968                                 msk_rxfilter(sc_if);
969                         else if ((sc_if->msk_flags & MSK_FLAG_DETACH) == 0)
970                                 msk_init_locked(sc_if);
971                 } else if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
972                         msk_stop(sc_if);
973                 sc_if->msk_if_flags = ifp->if_flags;
974                 MSK_IF_UNLOCK(sc_if);
975                 break;
976         case SIOCADDMULTI:
977         case SIOCDELMULTI:
978                 MSK_IF_LOCK(sc_if);
979                 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
980                         msk_rxfilter(sc_if);
981                 MSK_IF_UNLOCK(sc_if);
982                 break;
983         case SIOCGIFMEDIA:
984         case SIOCSIFMEDIA:
985                 mii = device_get_softc(sc_if->msk_miibus);
986                 error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command);
987                 break;
988         case SIOCSIFCAP:
989                 MSK_IF_LOCK(sc_if);
990                 mask = ifr->ifr_reqcap ^ ifp->if_capenable;
991                 if ((mask & IFCAP_TXCSUM) != 0 &&
992                     (IFCAP_TXCSUM & ifp->if_capabilities) != 0) {
993                         ifp->if_capenable ^= IFCAP_TXCSUM;
994                         if ((IFCAP_TXCSUM & ifp->if_capenable) != 0)
995                                 ifp->if_hwassist |= MSK_CSUM_FEATURES;
996                         else
997                                 ifp->if_hwassist &= ~MSK_CSUM_FEATURES;
998                 }
999                 if ((mask & IFCAP_RXCSUM) != 0 &&
1000                     (IFCAP_RXCSUM & ifp->if_capabilities) != 0)
1001                         ifp->if_capenable ^= IFCAP_RXCSUM;
1002                 if ((mask & IFCAP_VLAN_HWCSUM) != 0 &&
1003                     (IFCAP_VLAN_HWCSUM & ifp->if_capabilities) != 0)
1004                         ifp->if_capenable ^= IFCAP_VLAN_HWCSUM;
1005                 if ((mask & IFCAP_TSO4) != 0 &&
1006                     (IFCAP_TSO4 & ifp->if_capabilities) != 0) {
1007                         ifp->if_capenable ^= IFCAP_TSO4;
1008                         if ((IFCAP_TSO4 & ifp->if_capenable) != 0)
1009                                 ifp->if_hwassist |= CSUM_TSO;
1010                         else
1011                                 ifp->if_hwassist &= ~CSUM_TSO;
1012                 }
1013                 if ((mask & IFCAP_VLAN_HWTSO) != 0 &&
1014                     (IFCAP_VLAN_HWTSO & ifp->if_capabilities) != 0)
1015                         ifp->if_capenable ^= IFCAP_VLAN_HWTSO;
1016                 if ((mask & IFCAP_VLAN_HWTAGGING) != 0 &&
1017                     (IFCAP_VLAN_HWTAGGING & ifp->if_capabilities) != 0) {
1018                         ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
1019                         if ((IFCAP_VLAN_HWTAGGING & ifp->if_capenable) == 0)
1020                                 ifp->if_capenable &=
1021                                     ~(IFCAP_VLAN_HWTSO | IFCAP_VLAN_HWCSUM);
1022                         msk_setvlan(sc_if, ifp);
1023                 }
1024                 if (ifp->if_mtu > ETHERMTU &&
1025                     (sc_if->msk_flags & MSK_FLAG_JUMBO_NOCSUM) != 0) {
1026                         ifp->if_hwassist &= ~(MSK_CSUM_FEATURES | CSUM_TSO);
1027                         ifp->if_capenable &= ~(IFCAP_TSO4 | IFCAP_TXCSUM);
1028                 }
1029
1030                 VLAN_CAPABILITIES(ifp);
1031                 MSK_IF_UNLOCK(sc_if);
1032                 break;
1033         default:
1034                 error = ether_ioctl(ifp, command, data);
1035                 break;
1036         }
1037
1038         return (error);
1039 }
1040
1041 static int
1042 mskc_probe(device_t dev)
1043 {
1044         struct msk_product *mp;
1045         uint16_t vendor, devid;
1046         int i;
1047
1048         vendor = pci_get_vendor(dev);
1049         devid = pci_get_device(dev);
1050         mp = msk_products;
1051         for (i = 0; i < sizeof(msk_products)/sizeof(msk_products[0]);
1052             i++, mp++) {
1053                 if (vendor == mp->msk_vendorid && devid == mp->msk_deviceid) {
1054                         device_set_desc(dev, mp->msk_name);
1055                         return (BUS_PROBE_DEFAULT);
1056                 }
1057         }
1058
1059         return (ENXIO);
1060 }
1061
1062 static int
1063 mskc_setup_rambuffer(struct msk_softc *sc)
1064 {
1065         int next;
1066         int i;
1067
1068         /* Get adapter SRAM size. */
1069         sc->msk_ramsize = CSR_READ_1(sc, B2_E_0) * 4;
1070         if (bootverbose)
1071                 device_printf(sc->msk_dev,
1072                     "RAM buffer size : %dKB\n", sc->msk_ramsize);
1073         if (sc->msk_ramsize == 0)
1074                 return (0);
1075
1076         sc->msk_pflags |= MSK_FLAG_RAMBUF;
1077         /*
1078          * Give receiver 2/3 of memory and round down to the multiple
1079          * of 1024. Tx/Rx RAM buffer size of Yukon II shoud be multiple
1080          * of 1024.
1081          */
1082         sc->msk_rxqsize = rounddown((sc->msk_ramsize * 1024 * 2) / 3, 1024);
1083         sc->msk_txqsize = (sc->msk_ramsize * 1024) - sc->msk_rxqsize;
1084         for (i = 0, next = 0; i < sc->msk_num_port; i++) {
1085                 sc->msk_rxqstart[i] = next;
1086                 sc->msk_rxqend[i] = next + sc->msk_rxqsize - 1;
1087                 next = sc->msk_rxqend[i] + 1;
1088                 sc->msk_txqstart[i] = next;
1089                 sc->msk_txqend[i] = next + sc->msk_txqsize - 1;
1090                 next = sc->msk_txqend[i] + 1;
1091                 if (bootverbose) {
1092                         device_printf(sc->msk_dev,
1093                             "Port %d : Rx Queue %dKB(0x%08x:0x%08x)\n", i,
1094                             sc->msk_rxqsize / 1024, sc->msk_rxqstart[i],
1095                             sc->msk_rxqend[i]);
1096                         device_printf(sc->msk_dev,
1097                             "Port %d : Tx Queue %dKB(0x%08x:0x%08x)\n", i,
1098                             sc->msk_txqsize / 1024, sc->msk_txqstart[i],
1099                             sc->msk_txqend[i]);
1100                 }
1101         }
1102
1103         return (0);
1104 }
1105
1106 static void
1107 msk_phy_power(struct msk_softc *sc, int mode)
1108 {
1109         uint32_t our, val;
1110         int i;
1111
1112         switch (mode) {
1113         case MSK_PHY_POWERUP:
1114                 /* Switch power to VCC (WA for VAUX problem). */
1115                 CSR_WRITE_1(sc, B0_POWER_CTRL,
1116                     PC_VAUX_ENA | PC_VCC_ENA | PC_VAUX_OFF | PC_VCC_ON);
1117                 /* Disable Core Clock Division, set Clock Select to 0. */
1118                 CSR_WRITE_4(sc, B2_Y2_CLK_CTRL, Y2_CLK_DIV_DIS);
1119
1120                 val = 0;
1121                 if (sc->msk_hw_id == CHIP_ID_YUKON_XL &&
1122                     sc->msk_hw_rev > CHIP_REV_YU_XL_A1) {
1123                         /* Enable bits are inverted. */
1124                         val = Y2_PCI_CLK_LNK1_DIS | Y2_COR_CLK_LNK1_DIS |
1125                               Y2_CLK_GAT_LNK1_DIS | Y2_PCI_CLK_LNK2_DIS |
1126                               Y2_COR_CLK_LNK2_DIS | Y2_CLK_GAT_LNK2_DIS;
1127                 }
1128                 /*
1129                  * Enable PCI & Core Clock, enable clock gating for both Links.
1130                  */
1131                 CSR_WRITE_1(sc, B2_Y2_CLK_GATE, val);
1132
1133                 val = CSR_PCI_READ_4(sc, PCI_OUR_REG_1);
1134                 val &= ~(PCI_Y2_PHY1_POWD | PCI_Y2_PHY2_POWD);
1135                 if (sc->msk_hw_id == CHIP_ID_YUKON_XL) {
1136                         if (sc->msk_hw_rev > CHIP_REV_YU_XL_A1) {
1137                                 /* Deassert Low Power for 1st PHY. */
1138                                 val |= PCI_Y2_PHY1_COMA;
1139                                 if (sc->msk_num_port > 1)
1140                                         val |= PCI_Y2_PHY2_COMA;
1141                         }
1142                 }
1143                 /* Release PHY from PowerDown/COMA mode. */
1144                 CSR_PCI_WRITE_4(sc, PCI_OUR_REG_1, val);
1145                 switch (sc->msk_hw_id) {
1146                 case CHIP_ID_YUKON_EC_U:
1147                 case CHIP_ID_YUKON_EX:
1148                 case CHIP_ID_YUKON_FE_P:
1149                 case CHIP_ID_YUKON_UL_2:
1150                 case CHIP_ID_YUKON_OPT:
1151                         CSR_WRITE_2(sc, B0_CTST, Y2_HW_WOL_OFF);
1152
1153                         /* Enable all clocks. */
1154                         CSR_PCI_WRITE_4(sc, PCI_OUR_REG_3, 0);
1155                         our = CSR_PCI_READ_4(sc, PCI_OUR_REG_4);
1156                         our &= (PCI_FORCE_ASPM_REQUEST|PCI_ASPM_GPHY_LINK_DOWN|
1157                             PCI_ASPM_INT_FIFO_EMPTY|PCI_ASPM_CLKRUN_REQUEST);
1158                         /* Set all bits to 0 except bits 15..12. */
1159                         CSR_PCI_WRITE_4(sc, PCI_OUR_REG_4, our);
1160                         our = CSR_PCI_READ_4(sc, PCI_OUR_REG_5);
1161                         our &= PCI_CTL_TIM_VMAIN_AV_MSK;
1162                         CSR_PCI_WRITE_4(sc, PCI_OUR_REG_5, our);
1163                         CSR_PCI_WRITE_4(sc, PCI_CFG_REG_1, 0);
1164                         /*
1165                          * Disable status race, workaround for
1166                          * Yukon EC Ultra & Yukon EX.
1167                          */
1168                         val = CSR_READ_4(sc, B2_GP_IO);
1169                         val |= GLB_GPIO_STAT_RACE_DIS;
1170                         CSR_WRITE_4(sc, B2_GP_IO, val);
1171                         CSR_READ_4(sc, B2_GP_IO);
1172                         break;
1173                 default:
1174                         break;
1175                 }
1176                 for (i = 0; i < sc->msk_num_port; i++) {
1177                         CSR_WRITE_2(sc, MR_ADDR(i, GMAC_LINK_CTRL),
1178                             GMLC_RST_SET);
1179                         CSR_WRITE_2(sc, MR_ADDR(i, GMAC_LINK_CTRL),
1180                             GMLC_RST_CLR);
1181                 }
1182                 break;
1183         case MSK_PHY_POWERDOWN:
1184                 val = CSR_PCI_READ_4(sc, PCI_OUR_REG_1);
1185                 val |= PCI_Y2_PHY1_POWD | PCI_Y2_PHY2_POWD;
1186                 if (sc->msk_hw_id == CHIP_ID_YUKON_XL &&
1187                     sc->msk_hw_rev > CHIP_REV_YU_XL_A1) {
1188                         val &= ~PCI_Y2_PHY1_COMA;
1189                         if (sc->msk_num_port > 1)
1190                                 val &= ~PCI_Y2_PHY2_COMA;
1191                 }
1192                 CSR_PCI_WRITE_4(sc, PCI_OUR_REG_1, val);
1193
1194                 val = Y2_PCI_CLK_LNK1_DIS | Y2_COR_CLK_LNK1_DIS |
1195                       Y2_CLK_GAT_LNK1_DIS | Y2_PCI_CLK_LNK2_DIS |
1196                       Y2_COR_CLK_LNK2_DIS | Y2_CLK_GAT_LNK2_DIS;
1197                 if (sc->msk_hw_id == CHIP_ID_YUKON_XL &&
1198                     sc->msk_hw_rev > CHIP_REV_YU_XL_A1) {
1199                         /* Enable bits are inverted. */
1200                         val = 0;
1201                 }
1202                 /*
1203                  * Disable PCI & Core Clock, disable clock gating for
1204                  * both Links.
1205                  */
1206                 CSR_WRITE_1(sc, B2_Y2_CLK_GATE, val);
1207                 CSR_WRITE_1(sc, B0_POWER_CTRL,
1208                     PC_VAUX_ENA | PC_VCC_ENA | PC_VAUX_ON | PC_VCC_OFF);
1209                 break;
1210         default:
1211                 break;
1212         }
1213 }
1214
1215 static void
1216 mskc_reset(struct msk_softc *sc)
1217 {
1218         bus_addr_t addr;
1219         uint16_t status;
1220         uint32_t val;
1221         int i;
1222
1223         CSR_WRITE_2(sc, B0_CTST, CS_RST_CLR);
1224
1225         /* Disable ASF. */
1226         if (sc->msk_hw_id == CHIP_ID_YUKON_EX) {
1227                 status = CSR_READ_2(sc, B28_Y2_ASF_HCU_CCSR);
1228                 /* Clear AHB bridge & microcontroller reset. */
1229                 status &= ~(Y2_ASF_HCU_CCSR_AHB_RST |
1230                     Y2_ASF_HCU_CCSR_CPU_RST_MODE);
1231                 /* Clear ASF microcontroller state. */
1232                 status &= ~ Y2_ASF_HCU_CCSR_UC_STATE_MSK;
1233                 CSR_WRITE_2(sc, B28_Y2_ASF_HCU_CCSR, status);
1234         } else
1235                 CSR_WRITE_1(sc, B28_Y2_ASF_STAT_CMD, Y2_ASF_RESET);
1236         CSR_WRITE_2(sc, B0_CTST, Y2_ASF_DISABLE);
1237
1238         /*
1239          * Since we disabled ASF, S/W reset is required for Power Management.
1240          */
1241         CSR_WRITE_2(sc, B0_CTST, CS_RST_SET);
1242         CSR_WRITE_2(sc, B0_CTST, CS_RST_CLR);
1243
1244         /* Clear all error bits in the PCI status register. */
1245         status = pci_read_config(sc->msk_dev, PCIR_STATUS, 2);
1246         CSR_WRITE_1(sc, B2_TST_CTRL1, TST_CFG_WRITE_ON);
1247
1248         pci_write_config(sc->msk_dev, PCIR_STATUS, status |
1249             PCIM_STATUS_PERR | PCIM_STATUS_SERR | PCIM_STATUS_RMABORT |
1250             PCIM_STATUS_RTABORT | PCIM_STATUS_PERRREPORT, 2);
1251         CSR_WRITE_2(sc, B0_CTST, CS_MRST_CLR);
1252
1253         switch (sc->msk_bustype) {
1254         case MSK_PEX_BUS:
1255                 /* Clear all PEX errors. */
1256                 CSR_PCI_WRITE_4(sc, PEX_UNC_ERR_STAT, 0xffffffff);
1257                 val = CSR_PCI_READ_4(sc, PEX_UNC_ERR_STAT);
1258                 if ((val & PEX_RX_OV) != 0) {
1259                         sc->msk_intrmask &= ~Y2_IS_HW_ERR;
1260                         sc->msk_intrhwemask &= ~Y2_IS_PCI_EXP;
1261                 }
1262                 break;
1263         case MSK_PCI_BUS:
1264         case MSK_PCIX_BUS:
1265                 /* Set Cache Line Size to 2(8bytes) if configured to 0. */
1266                 val = pci_read_config(sc->msk_dev, PCIR_CACHELNSZ, 1);
1267                 if (val == 0)
1268                         pci_write_config(sc->msk_dev, PCIR_CACHELNSZ, 2, 1);
1269                 if (sc->msk_bustype == MSK_PCIX_BUS) {
1270                         /* Set Cache Line Size opt. */
1271                         val = pci_read_config(sc->msk_dev, PCI_OUR_REG_1, 4);
1272                         val |= PCI_CLS_OPT;
1273                         pci_write_config(sc->msk_dev, PCI_OUR_REG_1, val, 4);
1274                 }
1275                 break;
1276         }
1277         /* Set PHY power state. */
1278         msk_phy_power(sc, MSK_PHY_POWERUP);
1279
1280         /* Reset GPHY/GMAC Control */
1281         for (i = 0; i < sc->msk_num_port; i++) {
1282                 /* GPHY Control reset. */
1283                 CSR_WRITE_4(sc, MR_ADDR(i, GPHY_CTRL), GPC_RST_SET);
1284                 CSR_WRITE_4(sc, MR_ADDR(i, GPHY_CTRL), GPC_RST_CLR);
1285                 /* GMAC Control reset. */
1286                 CSR_WRITE_4(sc, MR_ADDR(i, GMAC_CTRL), GMC_RST_SET);
1287                 CSR_WRITE_4(sc, MR_ADDR(i, GMAC_CTRL), GMC_RST_CLR);
1288                 CSR_WRITE_4(sc, MR_ADDR(i, GMAC_CTRL), GMC_F_LOOPB_OFF);
1289                 if (sc->msk_hw_id == CHIP_ID_YUKON_EX)
1290                         CSR_WRITE_4(sc, MR_ADDR(i, GMAC_CTRL),
1291                             GMC_BYP_MACSECRX_ON | GMC_BYP_MACSECTX_ON |
1292                             GMC_BYP_RETR_ON);
1293         }
1294         if (sc->msk_hw_id == CHIP_ID_YUKON_OPT && sc->msk_hw_rev == 0) {
1295                 /* Disable PCIe PHY powerdown(reg 0x80, bit7). */
1296                 CSR_WRITE_4(sc, Y2_PEX_PHY_DATA, (0x0080 << 16) | 0x0080);
1297         }
1298         CSR_WRITE_1(sc, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
1299
1300         /* LED On. */
1301         CSR_WRITE_2(sc, B0_CTST, Y2_LED_STAT_ON);
1302
1303         /* Clear TWSI IRQ. */
1304         CSR_WRITE_4(sc, B2_I2C_IRQ, I2C_CLR_IRQ);
1305
1306         /* Turn off hardware timer. */
1307         CSR_WRITE_1(sc, B2_TI_CTRL, TIM_STOP);
1308         CSR_WRITE_1(sc, B2_TI_CTRL, TIM_CLR_IRQ);
1309
1310         /* Turn off descriptor polling. */
1311         CSR_WRITE_1(sc, B28_DPT_CTRL, DPT_STOP);
1312
1313         /* Turn off time stamps. */
1314         CSR_WRITE_1(sc, GMAC_TI_ST_CTRL, GMT_ST_STOP);
1315         CSR_WRITE_1(sc, GMAC_TI_ST_CTRL, GMT_ST_CLR_IRQ);
1316
1317         /* Configure timeout values. */
1318         for (i = 0; i < sc->msk_num_port; i++) {
1319                 CSR_WRITE_2(sc, SELECT_RAM_BUFFER(i, B3_RI_CTRL), RI_RST_SET);
1320                 CSR_WRITE_2(sc, SELECT_RAM_BUFFER(i, B3_RI_CTRL), RI_RST_CLR);
1321                 CSR_WRITE_1(sc, SELECT_RAM_BUFFER(i, B3_RI_WTO_R1),
1322                     MSK_RI_TO_53);
1323                 CSR_WRITE_1(sc, SELECT_RAM_BUFFER(i, B3_RI_WTO_XA1),
1324                     MSK_RI_TO_53);
1325                 CSR_WRITE_1(sc, SELECT_RAM_BUFFER(i, B3_RI_WTO_XS1),
1326                     MSK_RI_TO_53);
1327                 CSR_WRITE_1(sc, SELECT_RAM_BUFFER(i, B3_RI_RTO_R1),
1328                     MSK_RI_TO_53);
1329                 CSR_WRITE_1(sc, SELECT_RAM_BUFFER(i, B3_RI_RTO_XA1),
1330                     MSK_RI_TO_53);
1331                 CSR_WRITE_1(sc, SELECT_RAM_BUFFER(i, B3_RI_RTO_XS1),
1332                     MSK_RI_TO_53);
1333                 CSR_WRITE_1(sc, SELECT_RAM_BUFFER(i, B3_RI_WTO_R2),
1334                     MSK_RI_TO_53);
1335                 CSR_WRITE_1(sc, SELECT_RAM_BUFFER(i, B3_RI_WTO_XA2),
1336                     MSK_RI_TO_53);
1337                 CSR_WRITE_1(sc, SELECT_RAM_BUFFER(i, B3_RI_WTO_XS2),
1338                     MSK_RI_TO_53);
1339                 CSR_WRITE_1(sc, SELECT_RAM_BUFFER(i, B3_RI_RTO_R2),
1340                     MSK_RI_TO_53);
1341                 CSR_WRITE_1(sc, SELECT_RAM_BUFFER(i, B3_RI_RTO_XA2),
1342                     MSK_RI_TO_53);
1343                 CSR_WRITE_1(sc, SELECT_RAM_BUFFER(i, B3_RI_RTO_XS2),
1344                     MSK_RI_TO_53);
1345         }
1346
1347         /* Disable all interrupts. */
1348         CSR_WRITE_4(sc, B0_HWE_IMSK, 0);
1349         CSR_READ_4(sc, B0_HWE_IMSK);
1350         CSR_WRITE_4(sc, B0_IMSK, 0);
1351         CSR_READ_4(sc, B0_IMSK);
1352
1353         /*
1354          * On dual port PCI-X card, there is an problem where status
1355          * can be received out of order due to split transactions.
1356          */
1357         if (sc->msk_pcixcap != 0 && sc->msk_num_port > 1) {
1358                 uint16_t pcix_cmd;
1359
1360                 pcix_cmd = pci_read_config(sc->msk_dev,
1361                     sc->msk_pcixcap + PCIXR_COMMAND, 2);
1362                 /* Clear Max Outstanding Split Transactions. */
1363                 pcix_cmd &= ~PCIXM_COMMAND_MAX_SPLITS;
1364                 CSR_WRITE_1(sc, B2_TST_CTRL1, TST_CFG_WRITE_ON);
1365                 pci_write_config(sc->msk_dev,
1366                     sc->msk_pcixcap + PCIXR_COMMAND, pcix_cmd, 2);
1367                 CSR_WRITE_1(sc, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
1368         }
1369         if (sc->msk_expcap != 0) {
1370                 /* Change Max. Read Request Size to 2048 bytes. */
1371                 if (pci_get_max_read_req(sc->msk_dev) == 512)
1372                         pci_set_max_read_req(sc->msk_dev, 2048);
1373         }
1374
1375         /* Clear status list. */
1376         bzero(sc->msk_stat_ring,
1377             sizeof(struct msk_stat_desc) * MSK_STAT_RING_CNT);
1378         sc->msk_stat_cons = 0;
1379         bus_dmamap_sync(sc->msk_stat_tag, sc->msk_stat_map,
1380             BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1381         CSR_WRITE_4(sc, STAT_CTRL, SC_STAT_RST_SET);
1382         CSR_WRITE_4(sc, STAT_CTRL, SC_STAT_RST_CLR);
1383         /* Set the status list base address. */
1384         addr = sc->msk_stat_ring_paddr;
1385         CSR_WRITE_4(sc, STAT_LIST_ADDR_LO, MSK_ADDR_LO(addr));
1386         CSR_WRITE_4(sc, STAT_LIST_ADDR_HI, MSK_ADDR_HI(addr));
1387         /* Set the status list last index. */
1388         CSR_WRITE_2(sc, STAT_LAST_IDX, MSK_STAT_RING_CNT - 1);
1389         if (sc->msk_hw_id == CHIP_ID_YUKON_EC &&
1390             sc->msk_hw_rev == CHIP_REV_YU_EC_A1) {
1391                 /* WA for dev. #4.3 */
1392                 CSR_WRITE_2(sc, STAT_TX_IDX_TH, ST_TXTH_IDX_MASK);
1393                 /* WA for dev. #4.18 */
1394                 CSR_WRITE_1(sc, STAT_FIFO_WM, 0x21);
1395                 CSR_WRITE_1(sc, STAT_FIFO_ISR_WM, 0x07);
1396         } else {
1397                 CSR_WRITE_2(sc, STAT_TX_IDX_TH, 0x0a);
1398                 CSR_WRITE_1(sc, STAT_FIFO_WM, 0x10);
1399                 if (sc->msk_hw_id == CHIP_ID_YUKON_XL &&
1400                     sc->msk_hw_rev == CHIP_REV_YU_XL_A0)
1401                         CSR_WRITE_1(sc, STAT_FIFO_ISR_WM, 0x04);
1402                 else
1403                         CSR_WRITE_1(sc, STAT_FIFO_ISR_WM, 0x10);
1404                 CSR_WRITE_4(sc, STAT_ISR_TIMER_INI, 0x0190);
1405         }
1406         /*
1407          * Use default value for STAT_ISR_TIMER_INI, STAT_LEV_TIMER_INI.
1408          */
1409         CSR_WRITE_4(sc, STAT_TX_TIMER_INI, MSK_USECS(sc, 1000));
1410
1411         /* Enable status unit. */
1412         CSR_WRITE_4(sc, STAT_CTRL, SC_STAT_OP_ON);
1413
1414         CSR_WRITE_1(sc, STAT_TX_TIMER_CTRL, TIM_START);
1415         CSR_WRITE_1(sc, STAT_LEV_TIMER_CTRL, TIM_START);
1416         CSR_WRITE_1(sc, STAT_ISR_TIMER_CTRL, TIM_START);
1417 }
1418
1419 static int
1420 msk_probe(device_t dev)
1421 {
1422         struct msk_softc *sc;
1423         char desc[100];
1424
1425         sc = device_get_softc(device_get_parent(dev));
1426         /*
1427          * Not much to do here. We always know there will be
1428          * at least one GMAC present, and if there are two,
1429          * mskc_attach() will create a second device instance
1430          * for us.
1431          */
1432         snprintf(desc, sizeof(desc),
1433             "Marvell Technology Group Ltd. %s Id 0x%02x Rev 0x%02x",
1434             model_name[sc->msk_hw_id - CHIP_ID_YUKON_XL], sc->msk_hw_id,
1435             sc->msk_hw_rev);
1436         device_set_desc_copy(dev, desc);
1437
1438         return (BUS_PROBE_DEFAULT);
1439 }
1440
1441 static int
1442 msk_attach(device_t dev)
1443 {
1444         struct msk_softc *sc;
1445         struct msk_if_softc *sc_if;
1446         struct ifnet *ifp;
1447         struct msk_mii_data *mmd;
1448         int i, port, error;
1449         uint8_t eaddr[6];
1450
1451         if (dev == NULL)
1452                 return (EINVAL);
1453
1454         error = 0;
1455         sc_if = device_get_softc(dev);
1456         sc = device_get_softc(device_get_parent(dev));
1457         mmd = device_get_ivars(dev);
1458         port = mmd->port;
1459
1460         sc_if->msk_if_dev = dev;
1461         sc_if->msk_port = port;
1462         sc_if->msk_softc = sc;
1463         sc_if->msk_flags = sc->msk_pflags;
1464         sc->msk_if[port] = sc_if;
1465         /* Setup Tx/Rx queue register offsets. */
1466         if (port == MSK_PORT_A) {
1467                 sc_if->msk_txq = Q_XA1;
1468                 sc_if->msk_txsq = Q_XS1;
1469                 sc_if->msk_rxq = Q_R1;
1470         } else {
1471                 sc_if->msk_txq = Q_XA2;
1472                 sc_if->msk_txsq = Q_XS2;
1473                 sc_if->msk_rxq = Q_R2;
1474         }
1475
1476         callout_init_mtx(&sc_if->msk_tick_ch, &sc_if->msk_softc->msk_mtx, 0);
1477         msk_sysctl_node(sc_if);
1478
1479         if ((error = msk_txrx_dma_alloc(sc_if) != 0))
1480                 goto fail;
1481         msk_rx_dma_jalloc(sc_if);
1482
1483         ifp = sc_if->msk_ifp = if_alloc(IFT_ETHER);
1484         if (ifp == NULL) {
1485                 device_printf(sc_if->msk_if_dev, "can not if_alloc()\n");
1486                 error = ENOSPC;
1487                 goto fail;
1488         }
1489         ifp->if_softc = sc_if;
1490         if_initname(ifp, device_get_name(dev), device_get_unit(dev));
1491         ifp->if_mtu = ETHERMTU;
1492         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
1493         /*
1494          * IFCAP_RXCSUM capability is intentionally disabled as the hardware
1495          * has serious bug in Rx checksum offload for all Yukon II family
1496          * hardware. It seems there is a workaround to make it work somtimes.
1497          * However, the workaround also have to check OP code sequences to
1498          * verify whether the OP code is correct. Sometimes it should compute
1499          * IP/TCP/UDP checksum in driver in order to verify correctness of
1500          * checksum computed by hardware. If you have to compute checksum
1501          * with software to verify the hardware's checksum why have hardware
1502          * compute the checksum? I think there is no reason to spend time to
1503          * make Rx checksum offload work on Yukon II hardware.
1504          */
1505         ifp->if_capabilities = IFCAP_TXCSUM | IFCAP_TSO4;
1506         /*
1507          * Enable Rx checksum offloading if controller support new
1508          * descriptor format.
1509          */
1510         if ((sc_if->msk_flags & MSK_FLAG_DESCV2) != 0 &&
1511             (sc_if->msk_flags & MSK_FLAG_NORX_CSUM) == 0)
1512                 ifp->if_capabilities |= IFCAP_RXCSUM;
1513         ifp->if_hwassist = MSK_CSUM_FEATURES | CSUM_TSO;
1514         ifp->if_capenable = ifp->if_capabilities;
1515         ifp->if_ioctl = msk_ioctl;
1516         ifp->if_start = msk_start;
1517         ifp->if_timer = 0;
1518         ifp->if_watchdog = NULL;
1519         ifp->if_init = msk_init;
1520         IFQ_SET_MAXLEN(&ifp->if_snd, MSK_TX_RING_CNT - 1);
1521         ifp->if_snd.ifq_drv_maxlen = MSK_TX_RING_CNT - 1;
1522         IFQ_SET_READY(&ifp->if_snd);
1523         /*
1524          * Get station address for this interface. Note that
1525          * dual port cards actually come with three station
1526          * addresses: one for each port, plus an extra. The
1527          * extra one is used by the SysKonnect driver software
1528          * as a 'virtual' station address for when both ports
1529          * are operating in failover mode. Currently we don't
1530          * use this extra address.
1531          */
1532         MSK_IF_LOCK(sc_if);
1533         for (i = 0; i < ETHER_ADDR_LEN; i++)
1534                 eaddr[i] = CSR_READ_1(sc, B2_MAC_1 + (port * 8) + i);
1535
1536         /*
1537          * Call MI attach routine.  Can't hold locks when calling into ether_*.
1538          */
1539         MSK_IF_UNLOCK(sc_if);
1540         ether_ifattach(ifp, eaddr);
1541         MSK_IF_LOCK(sc_if);
1542
1543         /* VLAN capability setup */
1544         ifp->if_capabilities |= IFCAP_VLAN_MTU;
1545         if ((sc_if->msk_flags & MSK_FLAG_NOHWVLAN) == 0) {
1546                 /*
1547                  * Due to Tx checksum offload hardware bugs, msk(4) manually
1548                  * computes checksum for short frames. For VLAN tagged frames
1549                  * this workaround does not work so disable checksum offload
1550                  * for VLAN interface.
1551                  */
1552                 ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_HWTSO;
1553                 /*
1554                  * Enable Rx checksum offloading for VLAN taggedd frames
1555                  * if controller support new descriptor format.
1556                  */
1557                 if ((sc_if->msk_flags & MSK_FLAG_DESCV2) != 0 &&
1558                     (sc_if->msk_flags & MSK_FLAG_NORX_CSUM) == 0)
1559                         ifp->if_capabilities |= IFCAP_VLAN_HWCSUM;
1560         }
1561         ifp->if_capenable = ifp->if_capabilities;
1562
1563         /*
1564          * Tell the upper layer(s) we support long frames.
1565          * Must appear after the call to ether_ifattach() because
1566          * ether_ifattach() sets ifi_hdrlen to the default value.
1567          */
1568         ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
1569
1570         /*
1571          * Do miibus setup.
1572          */
1573         MSK_IF_UNLOCK(sc_if);
1574         error = mii_phy_probe(dev, &sc_if->msk_miibus, msk_mediachange,
1575             msk_mediastatus);
1576         if (error != 0) {
1577                 device_printf(sc_if->msk_if_dev, "no PHY found!\n");
1578                 ether_ifdetach(ifp);
1579                 error = ENXIO;
1580                 goto fail;
1581         }
1582
1583 fail:
1584         if (error != 0) {
1585                 /* Access should be ok even though lock has been dropped */
1586                 sc->msk_if[port] = NULL;
1587                 msk_detach(dev);
1588         }
1589
1590         return (error);
1591 }
1592
1593 /*
1594  * Attach the interface. Allocate softc structures, do ifmedia
1595  * setup and ethernet/BPF attach.
1596  */
1597 static int
1598 mskc_attach(device_t dev)
1599 {
1600         struct msk_softc *sc;
1601         struct msk_mii_data *mmd;
1602         int error, msic, msir, reg;
1603
1604         sc = device_get_softc(dev);
1605         sc->msk_dev = dev;
1606         mtx_init(&sc->msk_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
1607             MTX_DEF);
1608
1609         /*
1610          * Map control/status registers.
1611          */
1612         pci_enable_busmaster(dev);
1613
1614         /* Allocate I/O resource */
1615 #ifdef MSK_USEIOSPACE
1616         sc->msk_res_spec = msk_res_spec_io;
1617 #else
1618         sc->msk_res_spec = msk_res_spec_mem;
1619 #endif
1620         sc->msk_irq_spec = msk_irq_spec_legacy;
1621         error = bus_alloc_resources(dev, sc->msk_res_spec, sc->msk_res);
1622         if (error) {
1623                 if (sc->msk_res_spec == msk_res_spec_mem)
1624                         sc->msk_res_spec = msk_res_spec_io;
1625                 else
1626                         sc->msk_res_spec = msk_res_spec_mem;
1627                 error = bus_alloc_resources(dev, sc->msk_res_spec, sc->msk_res);
1628                 if (error) {
1629                         device_printf(dev, "couldn't allocate %s resources\n",
1630                             sc->msk_res_spec == msk_res_spec_mem ? "memory" :
1631                             "I/O");
1632                         mtx_destroy(&sc->msk_mtx);
1633                         return (ENXIO);
1634                 }
1635         }
1636
1637         CSR_WRITE_2(sc, B0_CTST, CS_RST_CLR);
1638         sc->msk_hw_id = CSR_READ_1(sc, B2_CHIP_ID);
1639         sc->msk_hw_rev = (CSR_READ_1(sc, B2_MAC_CFG) >> 4) & 0x0f;
1640         /* Bail out if chip is not recognized. */
1641         if (sc->msk_hw_id < CHIP_ID_YUKON_XL ||
1642             sc->msk_hw_id > CHIP_ID_YUKON_OPT ||
1643             sc->msk_hw_id == CHIP_ID_YUKON_SUPR ||
1644             sc->msk_hw_id == CHIP_ID_YUKON_UNKNOWN) {
1645                 device_printf(dev, "unknown device: id=0x%02x, rev=0x%02x\n",
1646                     sc->msk_hw_id, sc->msk_hw_rev);
1647                 mtx_destroy(&sc->msk_mtx);
1648                 return (ENXIO);
1649         }
1650
1651         SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
1652             SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
1653             OID_AUTO, "process_limit", CTLTYPE_INT | CTLFLAG_RW,
1654             &sc->msk_process_limit, 0, sysctl_hw_msk_proc_limit, "I",
1655             "max number of Rx events to process");
1656
1657         sc->msk_process_limit = MSK_PROC_DEFAULT;
1658         error = resource_int_value(device_get_name(dev), device_get_unit(dev),
1659             "process_limit", &sc->msk_process_limit);
1660         if (error == 0) {
1661                 if (sc->msk_process_limit < MSK_PROC_MIN ||
1662                     sc->msk_process_limit > MSK_PROC_MAX) {
1663                         device_printf(dev, "process_limit value out of range; "
1664                             "using default: %d\n", MSK_PROC_DEFAULT);
1665                         sc->msk_process_limit = MSK_PROC_DEFAULT;
1666                 }
1667         }
1668
1669         sc->msk_int_holdoff = MSK_INT_HOLDOFF_DEFAULT;
1670         SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
1671             SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO,
1672             "int_holdoff", CTLFLAG_RW, &sc->msk_int_holdoff, 0,
1673             "Maximum number of time to delay interrupts");
1674         resource_int_value(device_get_name(dev), device_get_unit(dev),
1675             "int_holdoff", &sc->msk_int_holdoff);
1676
1677         /* Soft reset. */
1678         CSR_WRITE_2(sc, B0_CTST, CS_RST_SET);
1679         CSR_WRITE_2(sc, B0_CTST, CS_RST_CLR);
1680         sc->msk_pmd = CSR_READ_1(sc, B2_PMD_TYP);
1681         /* Check number of MACs. */
1682         sc->msk_num_port = 1;
1683         if ((CSR_READ_1(sc, B2_Y2_HW_RES) & CFG_DUAL_MAC_MSK) ==
1684             CFG_DUAL_MAC_MSK) {
1685                 if (!(CSR_READ_1(sc, B2_Y2_CLK_GATE) & Y2_STATUS_LNK2_INAC))
1686                         sc->msk_num_port++;
1687         }
1688
1689         /* Check bus type. */
1690         if (pci_find_extcap(sc->msk_dev, PCIY_EXPRESS, &reg) == 0) {
1691                 sc->msk_bustype = MSK_PEX_BUS;
1692                 sc->msk_expcap = reg;
1693         } else if (pci_find_extcap(sc->msk_dev, PCIY_PCIX, &reg) == 0) {
1694                 sc->msk_bustype = MSK_PCIX_BUS;
1695                 sc->msk_pcixcap = reg;
1696         } else
1697                 sc->msk_bustype = MSK_PCI_BUS;
1698
1699         switch (sc->msk_hw_id) {
1700         case CHIP_ID_YUKON_EC:
1701                 sc->msk_clock = 125;    /* 125 MHz */
1702                 sc->msk_pflags |= MSK_FLAG_JUMBO;
1703                 break;
1704         case CHIP_ID_YUKON_EC_U:
1705                 sc->msk_clock = 125;    /* 125 MHz */
1706                 sc->msk_pflags |= MSK_FLAG_JUMBO | MSK_FLAG_JUMBO_NOCSUM;
1707                 break;
1708         case CHIP_ID_YUKON_EX:
1709                 sc->msk_clock = 125;    /* 125 MHz */
1710                 sc->msk_pflags |= MSK_FLAG_JUMBO | MSK_FLAG_DESCV2 |
1711                     MSK_FLAG_AUTOTX_CSUM;
1712                 /*
1713                  * Yukon Extreme seems to have silicon bug for
1714                  * automatic Tx checksum calculation capability.
1715                  */
1716                 if (sc->msk_hw_rev == CHIP_REV_YU_EX_B0)
1717                         sc->msk_pflags &= ~MSK_FLAG_AUTOTX_CSUM;
1718                 /*
1719                  * Yukon Extreme A0 could not use store-and-forward
1720                  * for jumbo frames, so disable Tx checksum
1721                  * offloading for jumbo frames.
1722                  */
1723                 if (sc->msk_hw_rev == CHIP_REV_YU_EX_A0)
1724                         sc->msk_pflags |= MSK_FLAG_JUMBO_NOCSUM;
1725                 break;
1726         case CHIP_ID_YUKON_FE:
1727                 sc->msk_clock = 100;    /* 100 MHz */
1728                 sc->msk_pflags |= MSK_FLAG_FASTETHER;
1729                 break;
1730         case CHIP_ID_YUKON_FE_P:
1731                 sc->msk_clock = 50;     /* 50 MHz */
1732                 sc->msk_pflags |= MSK_FLAG_FASTETHER | MSK_FLAG_DESCV2 |
1733                     MSK_FLAG_AUTOTX_CSUM;
1734                 if (sc->msk_hw_rev == CHIP_REV_YU_FE_P_A0) {
1735                         /*
1736                          * XXX
1737                          * FE+ A0 has status LE writeback bug so msk(4)
1738                          * does not rely on status word of received frame
1739                          * in msk_rxeof() which in turn disables all
1740                          * hardware assistance bits reported by the status
1741                          * word as well as validity of the recevied frame.
1742                          * Just pass received frames to upper stack with
1743                          * minimal test and let upper stack handle them.
1744                          */
1745                         sc->msk_pflags |= MSK_FLAG_NOHWVLAN |
1746                             MSK_FLAG_NORXCHK | MSK_FLAG_NORX_CSUM;
1747                 }
1748                 break;
1749         case CHIP_ID_YUKON_XL:
1750                 sc->msk_clock = 156;    /* 156 MHz */
1751                 sc->msk_pflags |= MSK_FLAG_JUMBO;
1752                 break;
1753         case CHIP_ID_YUKON_UL_2:
1754                 sc->msk_clock = 125;    /* 125 MHz */
1755                 sc->msk_pflags |= MSK_FLAG_JUMBO;
1756                 break;
1757         case CHIP_ID_YUKON_OPT:
1758                 sc->msk_clock = 125;    /* 125 MHz */
1759                 sc->msk_pflags |= MSK_FLAG_JUMBO | MSK_FLAG_DESCV2;
1760                 break;
1761         default:
1762                 sc->msk_clock = 156;    /* 156 MHz */
1763                 break;
1764         }
1765
1766         /* Allocate IRQ resources. */
1767         msic = pci_msi_count(dev);
1768         if (bootverbose)
1769                 device_printf(dev, "MSI count : %d\n", msic);
1770         if (legacy_intr != 0)
1771                 msi_disable = 1;
1772         if (msi_disable == 0 && msic > 0) {
1773                 msir = 1;
1774                 if (pci_alloc_msi(dev, &msir) == 0) {
1775                         if (msir == 1) {
1776                                 sc->msk_pflags |= MSK_FLAG_MSI;
1777                                 sc->msk_irq_spec = msk_irq_spec_msi;
1778                         } else
1779                                 pci_release_msi(dev);
1780                 }
1781         }
1782
1783         error = bus_alloc_resources(dev, sc->msk_irq_spec, sc->msk_irq);
1784         if (error) {
1785                 device_printf(dev, "couldn't allocate IRQ resources\n");
1786                 goto fail;
1787         }
1788
1789         if ((error = msk_status_dma_alloc(sc)) != 0)
1790                 goto fail;
1791
1792         /* Set base interrupt mask. */
1793         sc->msk_intrmask = Y2_IS_HW_ERR | Y2_IS_STAT_BMU;
1794         sc->msk_intrhwemask = Y2_IS_TIST_OV | Y2_IS_MST_ERR |
1795             Y2_IS_IRQ_STAT | Y2_IS_PCI_EXP | Y2_IS_PCI_NEXP;
1796
1797         /* Reset the adapter. */
1798         mskc_reset(sc);
1799
1800         if ((error = mskc_setup_rambuffer(sc)) != 0)
1801                 goto fail;
1802
1803         sc->msk_devs[MSK_PORT_A] = device_add_child(dev, "msk", -1);
1804         if (sc->msk_devs[MSK_PORT_A] == NULL) {
1805                 device_printf(dev, "failed to add child for PORT_A\n");
1806                 error = ENXIO;
1807                 goto fail;
1808         }
1809         mmd = malloc(sizeof(struct msk_mii_data), M_DEVBUF, M_WAITOK | M_ZERO);
1810         if (mmd == NULL) {
1811                 device_printf(dev, "failed to allocate memory for "
1812                     "ivars of PORT_A\n");
1813                 error = ENXIO;
1814                 goto fail;
1815         }
1816         mmd->port = MSK_PORT_A;
1817         mmd->pmd = sc->msk_pmd;
1818          if (sc->msk_pmd == 'L' || sc->msk_pmd == 'S' || sc->msk_pmd == 'P')
1819                 mmd->mii_flags |= MIIF_HAVEFIBER;
1820         device_set_ivars(sc->msk_devs[MSK_PORT_A], mmd);
1821
1822         if (sc->msk_num_port > 1) {
1823                 sc->msk_devs[MSK_PORT_B] = device_add_child(dev, "msk", -1);
1824                 if (sc->msk_devs[MSK_PORT_B] == NULL) {
1825                         device_printf(dev, "failed to add child for PORT_B\n");
1826                         error = ENXIO;
1827                         goto fail;
1828                 }
1829                 mmd = malloc(sizeof(struct msk_mii_data), M_DEVBUF, M_WAITOK | M_ZERO);
1830                 if (mmd == NULL) {
1831                         device_printf(dev, "failed to allocate memory for "
1832                             "ivars of PORT_B\n");
1833                         error = ENXIO;
1834                         goto fail;
1835                 }
1836                 mmd->port = MSK_PORT_B;
1837                 mmd->pmd = sc->msk_pmd;
1838                 if (sc->msk_pmd == 'L' || sc->msk_pmd == 'S' || sc->msk_pmd == 'P')
1839                         mmd->mii_flags |= MIIF_HAVEFIBER;
1840                 device_set_ivars(sc->msk_devs[MSK_PORT_B], mmd);
1841         }
1842
1843         error = bus_generic_attach(dev);
1844         if (error) {
1845                 device_printf(dev, "failed to attach port(s)\n");
1846                 goto fail;
1847         }
1848
1849         /* Hook interrupt last to avoid having to lock softc. */
1850         error = bus_setup_intr(dev, sc->msk_irq[0], INTR_TYPE_NET |
1851             INTR_MPSAFE, NULL, msk_intr, sc, &sc->msk_intrhand);
1852         if (error != 0) {
1853                 device_printf(dev, "couldn't set up interrupt handler\n");
1854                 goto fail;
1855         }
1856 fail:
1857         if (error != 0)
1858                 mskc_detach(dev);
1859
1860         return (error);
1861 }
1862
1863 /*
1864  * Shutdown hardware and free up resources. This can be called any
1865  * time after the mutex has been initialized. It is called in both
1866  * the error case in attach and the normal detach case so it needs
1867  * to be careful about only freeing resources that have actually been
1868  * allocated.
1869  */
1870 static int
1871 msk_detach(device_t dev)
1872 {
1873         struct msk_softc *sc;
1874         struct msk_if_softc *sc_if;
1875         struct ifnet *ifp;
1876
1877         sc_if = device_get_softc(dev);
1878         KASSERT(mtx_initialized(&sc_if->msk_softc->msk_mtx),
1879             ("msk mutex not initialized in msk_detach"));
1880         MSK_IF_LOCK(sc_if);
1881
1882         ifp = sc_if->msk_ifp;
1883         if (device_is_attached(dev)) {
1884                 /* XXX */
1885                 sc_if->msk_flags |= MSK_FLAG_DETACH;
1886                 msk_stop(sc_if);
1887                 /* Can't hold locks while calling detach. */
1888                 MSK_IF_UNLOCK(sc_if);
1889                 callout_drain(&sc_if->msk_tick_ch);
1890                 ether_ifdetach(ifp);
1891                 MSK_IF_LOCK(sc_if);
1892         }
1893
1894         /*
1895          * We're generally called from mskc_detach() which is using
1896          * device_delete_child() to get to here. It's already trashed
1897          * miibus for us, so don't do it here or we'll panic.
1898          *
1899          * if (sc_if->msk_miibus != NULL) {
1900          *      device_delete_child(dev, sc_if->msk_miibus);
1901          *      sc_if->msk_miibus = NULL;
1902          * }
1903          */
1904
1905         msk_rx_dma_jfree(sc_if);
1906         msk_txrx_dma_free(sc_if);
1907         bus_generic_detach(dev);
1908
1909         if (ifp)
1910                 if_free(ifp);
1911         sc = sc_if->msk_softc;
1912         sc->msk_if[sc_if->msk_port] = NULL;
1913         MSK_IF_UNLOCK(sc_if);
1914
1915         return (0);
1916 }
1917
1918 static int
1919 mskc_detach(device_t dev)
1920 {
1921         struct msk_softc *sc;
1922
1923         sc = device_get_softc(dev);
1924         KASSERT(mtx_initialized(&sc->msk_mtx), ("msk mutex not initialized"));
1925
1926         if (device_is_alive(dev)) {
1927                 if (sc->msk_devs[MSK_PORT_A] != NULL) {
1928                         free(device_get_ivars(sc->msk_devs[MSK_PORT_A]),
1929                             M_DEVBUF);
1930                         device_delete_child(dev, sc->msk_devs[MSK_PORT_A]);
1931                 }
1932                 if (sc->msk_devs[MSK_PORT_B] != NULL) {
1933                         free(device_get_ivars(sc->msk_devs[MSK_PORT_B]),
1934                             M_DEVBUF);
1935                         device_delete_child(dev, sc->msk_devs[MSK_PORT_B]);
1936                 }
1937                 bus_generic_detach(dev);
1938         }
1939
1940         /* Disable all interrupts. */
1941         CSR_WRITE_4(sc, B0_IMSK, 0);
1942         CSR_READ_4(sc, B0_IMSK);
1943         CSR_WRITE_4(sc, B0_HWE_IMSK, 0);
1944         CSR_READ_4(sc, B0_HWE_IMSK);
1945
1946         /* LED Off. */
1947         CSR_WRITE_2(sc, B0_CTST, Y2_LED_STAT_OFF);
1948
1949         /* Put hardware reset. */
1950         CSR_WRITE_2(sc, B0_CTST, CS_RST_SET);
1951
1952         msk_status_dma_free(sc);
1953
1954         if (sc->msk_intrhand) {
1955                 bus_teardown_intr(dev, sc->msk_irq[0], sc->msk_intrhand);
1956                 sc->msk_intrhand = NULL;
1957         }
1958         bus_release_resources(dev, sc->msk_irq_spec, sc->msk_irq);
1959         if ((sc->msk_pflags & MSK_FLAG_MSI) != 0)
1960                 pci_release_msi(dev);
1961         bus_release_resources(dev, sc->msk_res_spec, sc->msk_res);
1962         mtx_destroy(&sc->msk_mtx);
1963
1964         return (0);
1965 }
1966
1967 struct msk_dmamap_arg {
1968         bus_addr_t      msk_busaddr;
1969 };
1970
1971 static void
1972 msk_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error)
1973 {
1974         struct msk_dmamap_arg *ctx;
1975
1976         if (error != 0)
1977                 return;
1978         ctx = arg;
1979         ctx->msk_busaddr = segs[0].ds_addr;
1980 }
1981
1982 /* Create status DMA region. */
1983 static int
1984 msk_status_dma_alloc(struct msk_softc *sc)
1985 {
1986         struct msk_dmamap_arg ctx;
1987         int error;
1988
1989         error = bus_dma_tag_create(
1990                     bus_get_dma_tag(sc->msk_dev),       /* parent */
1991                     MSK_STAT_ALIGN, 0,          /* alignment, boundary */
1992                     BUS_SPACE_MAXADDR,          /* lowaddr */
1993                     BUS_SPACE_MAXADDR,          /* highaddr */
1994                     NULL, NULL,                 /* filter, filterarg */
1995                     MSK_STAT_RING_SZ,           /* maxsize */
1996                     1,                          /* nsegments */
1997                     MSK_STAT_RING_SZ,           /* maxsegsize */
1998                     0,                          /* flags */
1999                     NULL, NULL,                 /* lockfunc, lockarg */
2000                     &sc->msk_stat_tag);
2001         if (error != 0) {
2002                 device_printf(sc->msk_dev,
2003                     "failed to create status DMA tag\n");
2004                 return (error);
2005         }
2006
2007         /* Allocate DMA'able memory and load the DMA map for status ring. */
2008         error = bus_dmamem_alloc(sc->msk_stat_tag,
2009             (void **)&sc->msk_stat_ring, BUS_DMA_WAITOK | BUS_DMA_COHERENT |
2010             BUS_DMA_ZERO, &sc->msk_stat_map);
2011         if (error != 0) {
2012                 device_printf(sc->msk_dev,
2013                     "failed to allocate DMA'able memory for status ring\n");
2014                 return (error);
2015         }
2016
2017         ctx.msk_busaddr = 0;
2018         error = bus_dmamap_load(sc->msk_stat_tag,
2019             sc->msk_stat_map, sc->msk_stat_ring, MSK_STAT_RING_SZ,
2020             msk_dmamap_cb, &ctx, 0);
2021         if (error != 0) {
2022                 device_printf(sc->msk_dev,
2023                     "failed to load DMA'able memory for status ring\n");
2024                 return (error);
2025         }
2026         sc->msk_stat_ring_paddr = ctx.msk_busaddr;
2027
2028         return (0);
2029 }
2030
2031 static void
2032 msk_status_dma_free(struct msk_softc *sc)
2033 {
2034
2035         /* Destroy status block. */
2036         if (sc->msk_stat_tag) {
2037                 if (sc->msk_stat_map) {
2038                         bus_dmamap_unload(sc->msk_stat_tag, sc->msk_stat_map);
2039                         if (sc->msk_stat_ring) {
2040                                 bus_dmamem_free(sc->msk_stat_tag,
2041                                     sc->msk_stat_ring, sc->msk_stat_map);
2042                                 sc->msk_stat_ring = NULL;
2043                         }
2044                         sc->msk_stat_map = NULL;
2045                 }
2046                 bus_dma_tag_destroy(sc->msk_stat_tag);
2047                 sc->msk_stat_tag = NULL;
2048         }
2049 }
2050
2051 static int
2052 msk_txrx_dma_alloc(struct msk_if_softc *sc_if)
2053 {
2054         struct msk_dmamap_arg ctx;
2055         struct msk_txdesc *txd;
2056         struct msk_rxdesc *rxd;
2057         bus_size_t rxalign;
2058         int error, i;
2059
2060         /* Create parent DMA tag. */
2061         /*
2062          * XXX
2063          * It seems that Yukon II supports full 64bits DMA operations. But
2064          * it needs two descriptors(list elements) for 64bits DMA operations.
2065          * Since we don't know what DMA address mappings(32bits or 64bits)
2066          * would be used in advance for each mbufs, we limits its DMA space
2067          * to be in range of 32bits address space. Otherwise, we should check
2068          * what DMA address is used and chain another descriptor for the
2069          * 64bits DMA operation. This also means descriptor ring size is
2070          * variable. Limiting DMA address to be in 32bit address space greatly
2071          * simplyfies descriptor handling and possibly would increase
2072          * performance a bit due to efficient handling of descriptors.
2073          * Apart from harassing checksum offloading mechanisms, it seems
2074          * it's really bad idea to use a seperate descriptor for 64bit
2075          * DMA operation to save small descriptor memory. Anyway, I've
2076          * never seen these exotic scheme on ethernet interface hardware.
2077          */
2078         error = bus_dma_tag_create(
2079                     bus_get_dma_tag(sc_if->msk_if_dev), /* parent */
2080                     1, 0,                       /* alignment, boundary */
2081                     BUS_SPACE_MAXADDR_32BIT,    /* lowaddr */
2082                     BUS_SPACE_MAXADDR,          /* highaddr */
2083                     NULL, NULL,                 /* filter, filterarg */
2084                     BUS_SPACE_MAXSIZE_32BIT,    /* maxsize */
2085                     0,                          /* nsegments */
2086                     BUS_SPACE_MAXSIZE_32BIT,    /* maxsegsize */
2087                     0,                          /* flags */
2088                     NULL, NULL,                 /* lockfunc, lockarg */
2089                     &sc_if->msk_cdata.msk_parent_tag);
2090         if (error != 0) {
2091                 device_printf(sc_if->msk_if_dev,
2092                     "failed to create parent DMA tag\n");
2093                 goto fail;
2094         }
2095         /* Create tag for Tx ring. */
2096         error = bus_dma_tag_create(sc_if->msk_cdata.msk_parent_tag,/* parent */
2097                     MSK_RING_ALIGN, 0,          /* alignment, boundary */
2098                     BUS_SPACE_MAXADDR,          /* lowaddr */
2099                     BUS_SPACE_MAXADDR,          /* highaddr */
2100                     NULL, NULL,                 /* filter, filterarg */
2101                     MSK_TX_RING_SZ,             /* maxsize */
2102                     1,                          /* nsegments */
2103                     MSK_TX_RING_SZ,             /* maxsegsize */
2104                     0,                          /* flags */
2105                     NULL, NULL,                 /* lockfunc, lockarg */
2106                     &sc_if->msk_cdata.msk_tx_ring_tag);
2107         if (error != 0) {
2108                 device_printf(sc_if->msk_if_dev,
2109                     "failed to create Tx ring DMA tag\n");
2110                 goto fail;
2111         }
2112
2113         /* Create tag for Rx ring. */
2114         error = bus_dma_tag_create(sc_if->msk_cdata.msk_parent_tag,/* parent */
2115                     MSK_RING_ALIGN, 0,          /* alignment, boundary */
2116                     BUS_SPACE_MAXADDR,          /* lowaddr */
2117                     BUS_SPACE_MAXADDR,          /* highaddr */
2118                     NULL, NULL,                 /* filter, filterarg */
2119                     MSK_RX_RING_SZ,             /* maxsize */
2120                     1,                          /* nsegments */
2121                     MSK_RX_RING_SZ,             /* maxsegsize */
2122                     0,                          /* flags */
2123                     NULL, NULL,                 /* lockfunc, lockarg */
2124                     &sc_if->msk_cdata.msk_rx_ring_tag);
2125         if (error != 0) {
2126                 device_printf(sc_if->msk_if_dev,
2127                     "failed to create Rx ring DMA tag\n");
2128                 goto fail;
2129         }
2130
2131         /* Create tag for Tx buffers. */
2132         error = bus_dma_tag_create(sc_if->msk_cdata.msk_parent_tag,/* parent */
2133                     1, 0,                       /* alignment, boundary */
2134                     BUS_SPACE_MAXADDR,          /* lowaddr */
2135                     BUS_SPACE_MAXADDR,          /* highaddr */
2136                     NULL, NULL,                 /* filter, filterarg */
2137                     MSK_TSO_MAXSIZE,            /* maxsize */
2138                     MSK_MAXTXSEGS,              /* nsegments */
2139                     MSK_TSO_MAXSGSIZE,          /* maxsegsize */
2140                     0,                          /* flags */
2141                     NULL, NULL,                 /* lockfunc, lockarg */
2142                     &sc_if->msk_cdata.msk_tx_tag);
2143         if (error != 0) {
2144                 device_printf(sc_if->msk_if_dev,
2145                     "failed to create Tx DMA tag\n");
2146                 goto fail;
2147         }
2148
2149         rxalign = 1;
2150         /*
2151          * Workaround hardware hang which seems to happen when Rx buffer
2152          * is not aligned on multiple of FIFO word(8 bytes).
2153          */
2154         if ((sc_if->msk_flags & MSK_FLAG_RAMBUF) != 0)
2155                 rxalign = MSK_RX_BUF_ALIGN;
2156         /* Create tag for Rx buffers. */
2157         error = bus_dma_tag_create(sc_if->msk_cdata.msk_parent_tag,/* parent */
2158                     rxalign, 0,                 /* alignment, boundary */
2159                     BUS_SPACE_MAXADDR,          /* lowaddr */
2160                     BUS_SPACE_MAXADDR,          /* highaddr */
2161                     NULL, NULL,                 /* filter, filterarg */
2162                     MCLBYTES,                   /* maxsize */
2163                     1,                          /* nsegments */
2164                     MCLBYTES,                   /* maxsegsize */
2165                     0,                          /* flags */
2166                     NULL, NULL,                 /* lockfunc, lockarg */
2167                     &sc_if->msk_cdata.msk_rx_tag);
2168         if (error != 0) {
2169                 device_printf(sc_if->msk_if_dev,
2170                     "failed to create Rx DMA tag\n");
2171                 goto fail;
2172         }
2173
2174         /* Allocate DMA'able memory and load the DMA map for Tx ring. */
2175         error = bus_dmamem_alloc(sc_if->msk_cdata.msk_tx_ring_tag,
2176             (void **)&sc_if->msk_rdata.msk_tx_ring, BUS_DMA_WAITOK |
2177             BUS_DMA_COHERENT | BUS_DMA_ZERO, &sc_if->msk_cdata.msk_tx_ring_map);
2178         if (error != 0) {
2179                 device_printf(sc_if->msk_if_dev,
2180                     "failed to allocate DMA'able memory for Tx ring\n");
2181                 goto fail;
2182         }
2183
2184         ctx.msk_busaddr = 0;
2185         error = bus_dmamap_load(sc_if->msk_cdata.msk_tx_ring_tag,
2186             sc_if->msk_cdata.msk_tx_ring_map, sc_if->msk_rdata.msk_tx_ring,
2187             MSK_TX_RING_SZ, msk_dmamap_cb, &ctx, 0);
2188         if (error != 0) {
2189                 device_printf(sc_if->msk_if_dev,
2190                     "failed to load DMA'able memory for Tx ring\n");
2191                 goto fail;
2192         }
2193         sc_if->msk_rdata.msk_tx_ring_paddr = ctx.msk_busaddr;
2194
2195         /* Allocate DMA'able memory and load the DMA map for Rx ring. */
2196         error = bus_dmamem_alloc(sc_if->msk_cdata.msk_rx_ring_tag,
2197             (void **)&sc_if->msk_rdata.msk_rx_ring, BUS_DMA_WAITOK |
2198             BUS_DMA_COHERENT | BUS_DMA_ZERO, &sc_if->msk_cdata.msk_rx_ring_map);
2199         if (error != 0) {
2200                 device_printf(sc_if->msk_if_dev,
2201                     "failed to allocate DMA'able memory for Rx ring\n");
2202                 goto fail;
2203         }
2204
2205         ctx.msk_busaddr = 0;
2206         error = bus_dmamap_load(sc_if->msk_cdata.msk_rx_ring_tag,
2207             sc_if->msk_cdata.msk_rx_ring_map, sc_if->msk_rdata.msk_rx_ring,
2208             MSK_RX_RING_SZ, msk_dmamap_cb, &ctx, 0);
2209         if (error != 0) {
2210                 device_printf(sc_if->msk_if_dev,
2211                     "failed to load DMA'able memory for Rx ring\n");
2212                 goto fail;
2213         }
2214         sc_if->msk_rdata.msk_rx_ring_paddr = ctx.msk_busaddr;
2215
2216         /* Create DMA maps for Tx buffers. */
2217         for (i = 0; i < MSK_TX_RING_CNT; i++) {
2218                 txd = &sc_if->msk_cdata.msk_txdesc[i];
2219                 txd->tx_m = NULL;
2220                 txd->tx_dmamap = NULL;
2221                 error = bus_dmamap_create(sc_if->msk_cdata.msk_tx_tag, 0,
2222                     &txd->tx_dmamap);
2223                 if (error != 0) {
2224                         device_printf(sc_if->msk_if_dev,
2225                             "failed to create Tx dmamap\n");
2226                         goto fail;
2227                 }
2228         }
2229         /* Create DMA maps for Rx buffers. */
2230         if ((error = bus_dmamap_create(sc_if->msk_cdata.msk_rx_tag, 0,
2231             &sc_if->msk_cdata.msk_rx_sparemap)) != 0) {
2232                 device_printf(sc_if->msk_if_dev,
2233                     "failed to create spare Rx dmamap\n");
2234                 goto fail;
2235         }
2236         for (i = 0; i < MSK_RX_RING_CNT; i++) {
2237                 rxd = &sc_if->msk_cdata.msk_rxdesc[i];
2238                 rxd->rx_m = NULL;
2239                 rxd->rx_dmamap = NULL;
2240                 error = bus_dmamap_create(sc_if->msk_cdata.msk_rx_tag, 0,
2241                     &rxd->rx_dmamap);
2242                 if (error != 0) {
2243                         device_printf(sc_if->msk_if_dev,
2244                             "failed to create Rx dmamap\n");
2245                         goto fail;
2246                 }
2247         }
2248
2249 fail:
2250         return (error);
2251 }
2252
2253 static int
2254 msk_rx_dma_jalloc(struct msk_if_softc *sc_if)
2255 {
2256         struct msk_dmamap_arg ctx;
2257         struct msk_rxdesc *jrxd;
2258         bus_size_t rxalign;
2259         int error, i;
2260
2261         if (jumbo_disable != 0 || (sc_if->msk_flags & MSK_FLAG_JUMBO) == 0) {
2262                 sc_if->msk_flags &= ~MSK_FLAG_JUMBO;
2263                 device_printf(sc_if->msk_if_dev,
2264                     "disabling jumbo frame support\n");
2265                 return (0);
2266         }
2267         /* Create tag for jumbo Rx ring. */
2268         error = bus_dma_tag_create(sc_if->msk_cdata.msk_parent_tag,/* parent */
2269                     MSK_RING_ALIGN, 0,          /* alignment, boundary */
2270                     BUS_SPACE_MAXADDR,          /* lowaddr */
2271                     BUS_SPACE_MAXADDR,          /* highaddr */
2272                     NULL, NULL,                 /* filter, filterarg */
2273                     MSK_JUMBO_RX_RING_SZ,       /* maxsize */
2274                     1,                          /* nsegments */
2275                     MSK_JUMBO_RX_RING_SZ,       /* maxsegsize */
2276                     0,                          /* flags */
2277                     NULL, NULL,                 /* lockfunc, lockarg */
2278                     &sc_if->msk_cdata.msk_jumbo_rx_ring_tag);
2279         if (error != 0) {
2280                 device_printf(sc_if->msk_if_dev,
2281                     "failed to create jumbo Rx ring DMA tag\n");
2282                 goto jumbo_fail;
2283         }
2284
2285         rxalign = 1;
2286         /*
2287          * Workaround hardware hang which seems to happen when Rx buffer
2288          * is not aligned on multiple of FIFO word(8 bytes).
2289          */
2290         if ((sc_if->msk_flags & MSK_FLAG_RAMBUF) != 0)
2291                 rxalign = MSK_RX_BUF_ALIGN;
2292         /* Create tag for jumbo Rx buffers. */
2293         error = bus_dma_tag_create(sc_if->msk_cdata.msk_parent_tag,/* parent */
2294                     rxalign, 0,                 /* alignment, boundary */
2295                     BUS_SPACE_MAXADDR,          /* lowaddr */
2296                     BUS_SPACE_MAXADDR,          /* highaddr */
2297                     NULL, NULL,                 /* filter, filterarg */
2298                     MJUM9BYTES,                 /* maxsize */
2299                     1,                          /* nsegments */
2300                     MJUM9BYTES,                 /* maxsegsize */
2301                     0,                          /* flags */
2302                     NULL, NULL,                 /* lockfunc, lockarg */
2303                     &sc_if->msk_cdata.msk_jumbo_rx_tag);
2304         if (error != 0) {
2305                 device_printf(sc_if->msk_if_dev,
2306                     "failed to create jumbo Rx DMA tag\n");
2307                 goto jumbo_fail;
2308         }
2309
2310         /* Allocate DMA'able memory and load the DMA map for jumbo Rx ring. */
2311         error = bus_dmamem_alloc(sc_if->msk_cdata.msk_jumbo_rx_ring_tag,
2312             (void **)&sc_if->msk_rdata.msk_jumbo_rx_ring,
2313             BUS_DMA_WAITOK | BUS_DMA_COHERENT | BUS_DMA_ZERO,
2314             &sc_if->msk_cdata.msk_jumbo_rx_ring_map);
2315         if (error != 0) {
2316                 device_printf(sc_if->msk_if_dev,
2317                     "failed to allocate DMA'able memory for jumbo Rx ring\n");
2318                 goto jumbo_fail;
2319         }
2320
2321         ctx.msk_busaddr = 0;
2322         error = bus_dmamap_load(sc_if->msk_cdata.msk_jumbo_rx_ring_tag,
2323             sc_if->msk_cdata.msk_jumbo_rx_ring_map,
2324             sc_if->msk_rdata.msk_jumbo_rx_ring, MSK_JUMBO_RX_RING_SZ,
2325             msk_dmamap_cb, &ctx, 0);
2326         if (error != 0) {
2327                 device_printf(sc_if->msk_if_dev,
2328                     "failed to load DMA'able memory for jumbo Rx ring\n");
2329                 goto jumbo_fail;
2330         }
2331         sc_if->msk_rdata.msk_jumbo_rx_ring_paddr = ctx.msk_busaddr;
2332
2333         /* Create DMA maps for jumbo Rx buffers. */
2334         if ((error = bus_dmamap_create(sc_if->msk_cdata.msk_jumbo_rx_tag, 0,
2335             &sc_if->msk_cdata.msk_jumbo_rx_sparemap)) != 0) {
2336                 device_printf(sc_if->msk_if_dev,
2337                     "failed to create spare jumbo Rx dmamap\n");
2338                 goto jumbo_fail;
2339         }
2340         for (i = 0; i < MSK_JUMBO_RX_RING_CNT; i++) {
2341                 jrxd = &sc_if->msk_cdata.msk_jumbo_rxdesc[i];
2342                 jrxd->rx_m = NULL;
2343                 jrxd->rx_dmamap = NULL;
2344                 error = bus_dmamap_create(sc_if->msk_cdata.msk_jumbo_rx_tag, 0,
2345                     &jrxd->rx_dmamap);
2346                 if (error != 0) {
2347                         device_printf(sc_if->msk_if_dev,
2348                             "failed to create jumbo Rx dmamap\n");
2349                         goto jumbo_fail;
2350                 }
2351         }
2352
2353         return (0);
2354
2355 jumbo_fail:
2356         msk_rx_dma_jfree(sc_if);
2357         device_printf(sc_if->msk_if_dev, "disabling jumbo frame support "
2358             "due to resource shortage\n");
2359         sc_if->msk_flags &= ~MSK_FLAG_JUMBO;
2360         return (error);
2361 }
2362
2363 static void
2364 msk_txrx_dma_free(struct msk_if_softc *sc_if)
2365 {
2366         struct msk_txdesc *txd;
2367         struct msk_rxdesc *rxd;
2368         int i;
2369
2370         /* Tx ring. */
2371         if (sc_if->msk_cdata.msk_tx_ring_tag) {
2372                 if (sc_if->msk_cdata.msk_tx_ring_map)
2373                         bus_dmamap_unload(sc_if->msk_cdata.msk_tx_ring_tag,
2374                             sc_if->msk_cdata.msk_tx_ring_map);
2375                 if (sc_if->msk_cdata.msk_tx_ring_map &&
2376                     sc_if->msk_rdata.msk_tx_ring)
2377                         bus_dmamem_free(sc_if->msk_cdata.msk_tx_ring_tag,
2378                             sc_if->msk_rdata.msk_tx_ring,
2379                             sc_if->msk_cdata.msk_tx_ring_map);
2380                 sc_if->msk_rdata.msk_tx_ring = NULL;
2381                 sc_if->msk_cdata.msk_tx_ring_map = NULL;
2382                 bus_dma_tag_destroy(sc_if->msk_cdata.msk_tx_ring_tag);
2383                 sc_if->msk_cdata.msk_tx_ring_tag = NULL;
2384         }
2385         /* Rx ring. */
2386         if (sc_if->msk_cdata.msk_rx_ring_tag) {
2387                 if (sc_if->msk_cdata.msk_rx_ring_map)
2388                         bus_dmamap_unload(sc_if->msk_cdata.msk_rx_ring_tag,
2389                             sc_if->msk_cdata.msk_rx_ring_map);
2390                 if (sc_if->msk_cdata.msk_rx_ring_map &&
2391                     sc_if->msk_rdata.msk_rx_ring)
2392                         bus_dmamem_free(sc_if->msk_cdata.msk_rx_ring_tag,
2393                             sc_if->msk_rdata.msk_rx_ring,
2394                             sc_if->msk_cdata.msk_rx_ring_map);
2395                 sc_if->msk_rdata.msk_rx_ring = NULL;
2396                 sc_if->msk_cdata.msk_rx_ring_map = NULL;
2397                 bus_dma_tag_destroy(sc_if->msk_cdata.msk_rx_ring_tag);
2398                 sc_if->msk_cdata.msk_rx_ring_tag = NULL;
2399         }
2400         /* Tx buffers. */
2401         if (sc_if->msk_cdata.msk_tx_tag) {
2402                 for (i = 0; i < MSK_TX_RING_CNT; i++) {
2403                         txd = &sc_if->msk_cdata.msk_txdesc[i];
2404                         if (txd->tx_dmamap) {
2405                                 bus_dmamap_destroy(sc_if->msk_cdata.msk_tx_tag,
2406                                     txd->tx_dmamap);
2407                                 txd->tx_dmamap = NULL;
2408                         }
2409                 }
2410                 bus_dma_tag_destroy(sc_if->msk_cdata.msk_tx_tag);
2411                 sc_if->msk_cdata.msk_tx_tag = NULL;
2412         }
2413         /* Rx buffers. */
2414         if (sc_if->msk_cdata.msk_rx_tag) {
2415                 for (i = 0; i < MSK_RX_RING_CNT; i++) {
2416                         rxd = &sc_if->msk_cdata.msk_rxdesc[i];
2417                         if (rxd->rx_dmamap) {
2418                                 bus_dmamap_destroy(sc_if->msk_cdata.msk_rx_tag,
2419                                     rxd->rx_dmamap);
2420                                 rxd->rx_dmamap = NULL;
2421                         }
2422                 }
2423                 if (sc_if->msk_cdata.msk_rx_sparemap) {
2424                         bus_dmamap_destroy(sc_if->msk_cdata.msk_rx_tag,
2425                             sc_if->msk_cdata.msk_rx_sparemap);
2426                         sc_if->msk_cdata.msk_rx_sparemap = 0;
2427                 }
2428                 bus_dma_tag_destroy(sc_if->msk_cdata.msk_rx_tag);
2429                 sc_if->msk_cdata.msk_rx_tag = NULL;
2430         }
2431         if (sc_if->msk_cdata.msk_parent_tag) {
2432                 bus_dma_tag_destroy(sc_if->msk_cdata.msk_parent_tag);
2433                 sc_if->msk_cdata.msk_parent_tag = NULL;
2434         }
2435 }
2436
2437 static void
2438 msk_rx_dma_jfree(struct msk_if_softc *sc_if)
2439 {
2440         struct msk_rxdesc *jrxd;
2441         int i;
2442
2443         /* Jumbo Rx ring. */
2444         if (sc_if->msk_cdata.msk_jumbo_rx_ring_tag) {
2445                 if (sc_if->msk_cdata.msk_jumbo_rx_ring_map)
2446                         bus_dmamap_unload(sc_if->msk_cdata.msk_jumbo_rx_ring_tag,
2447                             sc_if->msk_cdata.msk_jumbo_rx_ring_map);
2448                 if (sc_if->msk_cdata.msk_jumbo_rx_ring_map &&
2449                     sc_if->msk_rdata.msk_jumbo_rx_ring)
2450                         bus_dmamem_free(sc_if->msk_cdata.msk_jumbo_rx_ring_tag,
2451                             sc_if->msk_rdata.msk_jumbo_rx_ring,
2452                             sc_if->msk_cdata.msk_jumbo_rx_ring_map);
2453                 sc_if->msk_rdata.msk_jumbo_rx_ring = NULL;
2454                 sc_if->msk_cdata.msk_jumbo_rx_ring_map = NULL;
2455                 bus_dma_tag_destroy(sc_if->msk_cdata.msk_jumbo_rx_ring_tag);
2456                 sc_if->msk_cdata.msk_jumbo_rx_ring_tag = NULL;
2457         }
2458         /* Jumbo Rx buffers. */
2459         if (sc_if->msk_cdata.msk_jumbo_rx_tag) {
2460                 for (i = 0; i < MSK_JUMBO_RX_RING_CNT; i++) {
2461                         jrxd = &sc_if->msk_cdata.msk_jumbo_rxdesc[i];
2462                         if (jrxd->rx_dmamap) {
2463                                 bus_dmamap_destroy(
2464                                     sc_if->msk_cdata.msk_jumbo_rx_tag,
2465                                     jrxd->rx_dmamap);
2466                                 jrxd->rx_dmamap = NULL;
2467                         }
2468                 }
2469                 if (sc_if->msk_cdata.msk_jumbo_rx_sparemap) {
2470                         bus_dmamap_destroy(sc_if->msk_cdata.msk_jumbo_rx_tag,
2471                             sc_if->msk_cdata.msk_jumbo_rx_sparemap);
2472                         sc_if->msk_cdata.msk_jumbo_rx_sparemap = 0;
2473                 }
2474                 bus_dma_tag_destroy(sc_if->msk_cdata.msk_jumbo_rx_tag);
2475                 sc_if->msk_cdata.msk_jumbo_rx_tag = NULL;
2476         }
2477 }
2478
2479 static int
2480 msk_encap(struct msk_if_softc *sc_if, struct mbuf **m_head)
2481 {
2482         struct msk_txdesc *txd, *txd_last;
2483         struct msk_tx_desc *tx_le;
2484         struct mbuf *m;
2485         bus_dmamap_t map;
2486         bus_dma_segment_t txsegs[MSK_MAXTXSEGS];
2487         uint32_t control, csum, prod, si;
2488         uint16_t offset, tcp_offset, tso_mtu;
2489         int error, i, nseg, tso;
2490
2491         MSK_IF_LOCK_ASSERT(sc_if);
2492
2493         tcp_offset = offset = 0;
2494         m = *m_head;
2495         if (((sc_if->msk_flags & MSK_FLAG_AUTOTX_CSUM) == 0 &&
2496             (m->m_pkthdr.csum_flags & MSK_CSUM_FEATURES) != 0) ||
2497             ((sc_if->msk_flags & MSK_FLAG_DESCV2) == 0 &&
2498             (m->m_pkthdr.csum_flags & CSUM_TSO) != 0)) {
2499                 /*
2500                  * Since mbuf has no protocol specific structure information
2501                  * in it we have to inspect protocol information here to
2502                  * setup TSO and checksum offload. I don't know why Marvell
2503                  * made a such decision in chip design because other GigE
2504                  * hardwares normally takes care of all these chores in
2505                  * hardware. However, TSO performance of Yukon II is very
2506                  * good such that it's worth to implement it.
2507                  */
2508                 struct ether_header *eh;
2509                 struct ip *ip;
2510                 struct tcphdr *tcp;
2511
2512                 if (M_WRITABLE(m) == 0) {
2513                         /* Get a writable copy. */
2514                         m = m_dup(*m_head, M_DONTWAIT);
2515                         m_freem(*m_head);
2516                         if (m == NULL) {
2517                                 *m_head = NULL;
2518                                 return (ENOBUFS);
2519                         }
2520                         *m_head = m;
2521                 }
2522
2523                 offset = sizeof(struct ether_header);
2524                 m = m_pullup(m, offset);
2525                 if (m == NULL) {
2526                         *m_head = NULL;
2527                         return (ENOBUFS);
2528                 }
2529                 eh = mtod(m, struct ether_header *);
2530                 /* Check if hardware VLAN insertion is off. */
2531                 if (eh->ether_type == htons(ETHERTYPE_VLAN)) {
2532                         offset = sizeof(struct ether_vlan_header);
2533                         m = m_pullup(m, offset);
2534                         if (m == NULL) {
2535                                 *m_head = NULL;
2536                                 return (ENOBUFS);
2537                         }
2538                 }
2539                 m = m_pullup(m, offset + sizeof(struct ip));
2540                 if (m == NULL) {
2541                         *m_head = NULL;
2542                         return (ENOBUFS);
2543                 }
2544                 ip = (struct ip *)(mtod(m, char *) + offset);
2545                 offset += (ip->ip_hl << 2);
2546                 tcp_offset = offset;
2547                 if ((m->m_pkthdr.csum_flags & CSUM_TSO) != 0) {
2548                         m = m_pullup(m, offset + sizeof(struct tcphdr));
2549                         if (m == NULL) {
2550                                 *m_head = NULL;
2551                                 return (ENOBUFS);
2552                         }
2553                         tcp = (struct tcphdr *)(mtod(m, char *) + offset);
2554                         offset += (tcp->th_off << 2);
2555                 } else if ((sc_if->msk_flags & MSK_FLAG_AUTOTX_CSUM) == 0 &&
2556                     (m->m_pkthdr.len < MSK_MIN_FRAMELEN) &&
2557                     (m->m_pkthdr.csum_flags & CSUM_TCP) != 0) {
2558                         /*
2559                          * It seems that Yukon II has Tx checksum offload bug
2560                          * for small TCP packets that's less than 60 bytes in
2561                          * size (e.g. TCP window probe packet, pure ACK packet).
2562                          * Common work around like padding with zeros to make
2563                          * the frame minimum ethernet frame size didn't work at
2564                          * all.
2565                          * Instead of disabling checksum offload completely we
2566                          * resort to S/W checksum routine when we encounter
2567                          * short TCP frames.
2568                          * Short UDP packets appear to be handled correctly by
2569                          * Yukon II. Also I assume this bug does not happen on
2570                          * controllers that use newer descriptor format or
2571                          * automatic Tx checksum calaulcation.
2572                          */
2573                         m = m_pullup(m, offset + sizeof(struct tcphdr));
2574                         if (m == NULL) {
2575                                 *m_head = NULL;
2576                                 return (ENOBUFS);
2577                         }
2578                         *(uint16_t *)(m->m_data + offset +
2579                             m->m_pkthdr.csum_data) = in_cksum_skip(m,
2580                             m->m_pkthdr.len, offset);
2581                         m->m_pkthdr.csum_flags &= ~CSUM_TCP;
2582                 }
2583                 *m_head = m;
2584         }
2585
2586         prod = sc_if->msk_cdata.msk_tx_prod;
2587         txd = &sc_if->msk_cdata.msk_txdesc[prod];
2588         txd_last = txd;
2589         map = txd->tx_dmamap;
2590         error = bus_dmamap_load_mbuf_sg(sc_if->msk_cdata.msk_tx_tag, map,
2591             *m_head, txsegs, &nseg, BUS_DMA_NOWAIT);
2592         if (error == EFBIG) {
2593                 m = m_collapse(*m_head, M_DONTWAIT, MSK_MAXTXSEGS);
2594                 if (m == NULL) {
2595                         m_freem(*m_head);
2596                         *m_head = NULL;
2597                         return (ENOBUFS);
2598                 }
2599                 *m_head = m;
2600                 error = bus_dmamap_load_mbuf_sg(sc_if->msk_cdata.msk_tx_tag,
2601                     map, *m_head, txsegs, &nseg, BUS_DMA_NOWAIT);
2602                 if (error != 0) {
2603                         m_freem(*m_head);
2604                         *m_head = NULL;
2605                         return (error);
2606                 }
2607         } else if (error != 0)
2608                 return (error);
2609         if (nseg == 0) {
2610                 m_freem(*m_head);
2611                 *m_head = NULL;
2612                 return (EIO);
2613         }
2614
2615         /* Check number of available descriptors. */
2616         if (sc_if->msk_cdata.msk_tx_cnt + nseg >=
2617             (MSK_TX_RING_CNT - MSK_RESERVED_TX_DESC_CNT)) {
2618                 bus_dmamap_unload(sc_if->msk_cdata.msk_tx_tag, map);
2619                 return (ENOBUFS);
2620         }
2621
2622         control = 0;
2623         tso = 0;
2624         tx_le = NULL;
2625
2626         /* Check TSO support. */
2627         if ((m->m_pkthdr.csum_flags & CSUM_TSO) != 0) {
2628                 if ((sc_if->msk_flags & MSK_FLAG_DESCV2) != 0)
2629                         tso_mtu = m->m_pkthdr.tso_segsz;
2630                 else
2631                         tso_mtu = offset + m->m_pkthdr.tso_segsz;
2632                 if (tso_mtu != sc_if->msk_cdata.msk_tso_mtu) {
2633                         tx_le = &sc_if->msk_rdata.msk_tx_ring[prod];
2634                         tx_le->msk_addr = htole32(tso_mtu);
2635                         if ((sc_if->msk_flags & MSK_FLAG_DESCV2) != 0)
2636                                 tx_le->msk_control = htole32(OP_MSS | HW_OWNER);
2637                         else
2638                                 tx_le->msk_control =
2639                                     htole32(OP_LRGLEN | HW_OWNER);
2640                         sc_if->msk_cdata.msk_tx_cnt++;
2641                         MSK_INC(prod, MSK_TX_RING_CNT);
2642                         sc_if->msk_cdata.msk_tso_mtu = tso_mtu;
2643                 }
2644                 tso++;
2645         }
2646         /* Check if we have a VLAN tag to insert. */
2647         if ((m->m_flags & M_VLANTAG) != 0) {
2648                 if (tx_le == NULL) {
2649                         tx_le = &sc_if->msk_rdata.msk_tx_ring[prod];
2650                         tx_le->msk_addr = htole32(0);
2651                         tx_le->msk_control = htole32(OP_VLAN | HW_OWNER |
2652                             htons(m->m_pkthdr.ether_vtag));
2653                         sc_if->msk_cdata.msk_tx_cnt++;
2654                         MSK_INC(prod, MSK_TX_RING_CNT);
2655                 } else {
2656                         tx_le->msk_control |= htole32(OP_VLAN |
2657                             htons(m->m_pkthdr.ether_vtag));
2658                 }
2659                 control |= INS_VLAN;
2660         }
2661         /* Check if we have to handle checksum offload. */
2662         if (tso == 0 && (m->m_pkthdr.csum_flags & MSK_CSUM_FEATURES) != 0) {
2663                 if ((sc_if->msk_flags & MSK_FLAG_AUTOTX_CSUM) != 0)
2664                         control |= CALSUM;
2665                 else {
2666                         control |= CALSUM | WR_SUM | INIT_SUM | LOCK_SUM;
2667                         if ((m->m_pkthdr.csum_flags & CSUM_UDP) != 0)
2668                                 control |= UDPTCP;
2669                         /* Checksum write position. */
2670                         csum = (tcp_offset + m->m_pkthdr.csum_data) & 0xffff;
2671                         /* Checksum start position. */
2672                         csum |= (uint32_t)tcp_offset << 16;
2673                         if (csum != sc_if->msk_cdata.msk_last_csum) {
2674                                 tx_le = &sc_if->msk_rdata.msk_tx_ring[prod];
2675                                 tx_le->msk_addr = htole32(csum);
2676                                 tx_le->msk_control = htole32(1 << 16 |
2677                                     (OP_TCPLISW | HW_OWNER));
2678                                 sc_if->msk_cdata.msk_tx_cnt++;
2679                                 MSK_INC(prod, MSK_TX_RING_CNT);
2680                                 sc_if->msk_cdata.msk_last_csum = csum;
2681                         }
2682                 }
2683         }
2684
2685         si = prod;
2686         tx_le = &sc_if->msk_rdata.msk_tx_ring[prod];
2687         tx_le->msk_addr = htole32(MSK_ADDR_LO(txsegs[0].ds_addr));
2688         if (tso == 0)
2689                 tx_le->msk_control = htole32(txsegs[0].ds_len | control |
2690                     OP_PACKET);
2691         else
2692                 tx_le->msk_control = htole32(txsegs[0].ds_len | control |
2693                     OP_LARGESEND);
2694         sc_if->msk_cdata.msk_tx_cnt++;
2695         MSK_INC(prod, MSK_TX_RING_CNT);
2696
2697         for (i = 1; i < nseg; i++) {
2698                 tx_le = &sc_if->msk_rdata.msk_tx_ring[prod];
2699                 tx_le->msk_addr = htole32(MSK_ADDR_LO(txsegs[i].ds_addr));
2700                 tx_le->msk_control = htole32(txsegs[i].ds_len | control |
2701                     OP_BUFFER | HW_OWNER);
2702                 sc_if->msk_cdata.msk_tx_cnt++;
2703                 MSK_INC(prod, MSK_TX_RING_CNT);
2704         }
2705         /* Update producer index. */
2706         sc_if->msk_cdata.msk_tx_prod = prod;
2707
2708         /* Set EOP on the last desciptor. */
2709         prod = (prod + MSK_TX_RING_CNT - 1) % MSK_TX_RING_CNT;
2710         tx_le = &sc_if->msk_rdata.msk_tx_ring[prod];
2711         tx_le->msk_control |= htole32(EOP);
2712
2713         /* Turn the first descriptor ownership to hardware. */
2714         tx_le = &sc_if->msk_rdata.msk_tx_ring[si];
2715         tx_le->msk_control |= htole32(HW_OWNER);
2716
2717         txd = &sc_if->msk_cdata.msk_txdesc[prod];
2718         map = txd_last->tx_dmamap;
2719         txd_last->tx_dmamap = txd->tx_dmamap;
2720         txd->tx_dmamap = map;
2721         txd->tx_m = m;
2722
2723         /* Sync descriptors. */
2724         bus_dmamap_sync(sc_if->msk_cdata.msk_tx_tag, map, BUS_DMASYNC_PREWRITE);
2725         bus_dmamap_sync(sc_if->msk_cdata.msk_tx_ring_tag,
2726             sc_if->msk_cdata.msk_tx_ring_map,
2727             BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2728
2729         return (0);
2730 }
2731
2732 static void
2733 msk_start(struct ifnet *ifp)
2734 {
2735         struct msk_if_softc *sc_if;
2736
2737         sc_if = ifp->if_softc;
2738         MSK_IF_LOCK(sc_if);
2739         msk_start_locked(ifp);
2740         MSK_IF_UNLOCK(sc_if);
2741 }
2742
2743 static void
2744 msk_start_locked(struct ifnet *ifp)
2745 {
2746         struct msk_if_softc *sc_if;
2747         struct mbuf *m_head;
2748         int enq;
2749
2750         sc_if = ifp->if_softc;
2751         MSK_IF_LOCK_ASSERT(sc_if);
2752
2753         if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
2754             IFF_DRV_RUNNING || (sc_if->msk_flags & MSK_FLAG_LINK) == 0)
2755                 return;
2756
2757         for (enq = 0; !IFQ_DRV_IS_EMPTY(&ifp->if_snd) &&
2758             sc_if->msk_cdata.msk_tx_cnt <
2759             (MSK_TX_RING_CNT - MSK_RESERVED_TX_DESC_CNT); ) {
2760                 IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head);
2761                 if (m_head == NULL)
2762                         break;
2763                 /*
2764                  * Pack the data into the transmit ring. If we
2765                  * don't have room, set the OACTIVE flag and wait
2766                  * for the NIC to drain the ring.
2767                  */
2768                 if (msk_encap(sc_if, &m_head) != 0) {
2769                         if (m_head == NULL)
2770                                 break;
2771                         IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
2772                         ifp->if_drv_flags |= IFF_DRV_OACTIVE;
2773                         break;
2774                 }
2775
2776                 enq++;
2777                 /*
2778                  * If there's a BPF listener, bounce a copy of this frame
2779                  * to him.
2780                  */
2781                 ETHER_BPF_MTAP(ifp, m_head);
2782         }
2783
2784         if (enq > 0) {
2785                 /* Transmit */
2786                 CSR_WRITE_2(sc_if->msk_softc,
2787                     Y2_PREF_Q_ADDR(sc_if->msk_txq, PREF_UNIT_PUT_IDX_REG),
2788                     sc_if->msk_cdata.msk_tx_prod);
2789
2790                 /* Set a timeout in case the chip goes out to lunch. */
2791                 sc_if->msk_watchdog_timer = MSK_TX_TIMEOUT;
2792         }
2793 }
2794
2795 static void
2796 msk_watchdog(struct msk_if_softc *sc_if)
2797 {
2798         struct ifnet *ifp;
2799
2800         MSK_IF_LOCK_ASSERT(sc_if);
2801
2802         if (sc_if->msk_watchdog_timer == 0 || --sc_if->msk_watchdog_timer)
2803                 return;
2804         ifp = sc_if->msk_ifp;
2805         if ((sc_if->msk_flags & MSK_FLAG_LINK) == 0) {
2806                 if (bootverbose)
2807                         if_printf(sc_if->msk_ifp, "watchdog timeout "
2808                            "(missed link)\n");
2809                 ifp->if_oerrors++;
2810                 ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
2811                 msk_init_locked(sc_if);
2812                 return;
2813         }
2814
2815         if_printf(ifp, "watchdog timeout\n");
2816         ifp->if_oerrors++;
2817         ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
2818         msk_init_locked(sc_if);
2819         if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
2820                 msk_start_locked(ifp);
2821 }
2822
2823 static int
2824 mskc_shutdown(device_t dev)
2825 {
2826         struct msk_softc *sc;
2827         int i;
2828
2829         sc = device_get_softc(dev);
2830         MSK_LOCK(sc);
2831         for (i = 0; i < sc->msk_num_port; i++) {
2832                 if (sc->msk_if[i] != NULL && sc->msk_if[i]->msk_ifp != NULL &&
2833                     ((sc->msk_if[i]->msk_ifp->if_drv_flags &
2834                     IFF_DRV_RUNNING) != 0))
2835                         msk_stop(sc->msk_if[i]);
2836         }
2837         MSK_UNLOCK(sc);
2838
2839         /* Put hardware reset. */
2840         CSR_WRITE_2(sc, B0_CTST, CS_RST_SET);
2841         return (0);
2842 }
2843
2844 static int
2845 mskc_suspend(device_t dev)
2846 {
2847         struct msk_softc *sc;
2848         int i;
2849
2850         sc = device_get_softc(dev);
2851
2852         MSK_LOCK(sc);
2853
2854         for (i = 0; i < sc->msk_num_port; i++) {
2855                 if (sc->msk_if[i] != NULL && sc->msk_if[i]->msk_ifp != NULL &&
2856                     ((sc->msk_if[i]->msk_ifp->if_drv_flags &
2857                     IFF_DRV_RUNNING) != 0))
2858                         msk_stop(sc->msk_if[i]);
2859         }
2860
2861         /* Disable all interrupts. */
2862         CSR_WRITE_4(sc, B0_IMSK, 0);
2863         CSR_READ_4(sc, B0_IMSK);
2864         CSR_WRITE_4(sc, B0_HWE_IMSK, 0);
2865         CSR_READ_4(sc, B0_HWE_IMSK);
2866
2867         msk_phy_power(sc, MSK_PHY_POWERDOWN);
2868
2869         /* Put hardware reset. */
2870         CSR_WRITE_2(sc, B0_CTST, CS_RST_SET);
2871         sc->msk_pflags |= MSK_FLAG_SUSPEND;
2872
2873         MSK_UNLOCK(sc);
2874
2875         return (0);
2876 }
2877
2878 static int
2879 mskc_resume(device_t dev)
2880 {
2881         struct msk_softc *sc;
2882         int i;
2883
2884         sc = device_get_softc(dev);
2885
2886         MSK_LOCK(sc);
2887
2888         mskc_reset(sc);
2889         for (i = 0; i < sc->msk_num_port; i++) {
2890                 if (sc->msk_if[i] != NULL && sc->msk_if[i]->msk_ifp != NULL &&
2891                     ((sc->msk_if[i]->msk_ifp->if_flags & IFF_UP) != 0)) {
2892                         sc->msk_if[i]->msk_ifp->if_drv_flags &=
2893                             ~IFF_DRV_RUNNING;
2894                         msk_init_locked(sc->msk_if[i]);
2895                 }
2896         }
2897         sc->msk_pflags &= ~MSK_FLAG_SUSPEND;
2898
2899         MSK_UNLOCK(sc);
2900
2901         return (0);
2902 }
2903
2904 #ifndef __NO_STRICT_ALIGNMENT
2905 static __inline void
2906 msk_fixup_rx(struct mbuf *m)
2907 {
2908         int i;
2909         uint16_t *src, *dst;
2910
2911         src = mtod(m, uint16_t *);
2912         dst = src - 3;
2913
2914         for (i = 0; i < (m->m_len / sizeof(uint16_t) + 1); i++)
2915                 *dst++ = *src++;
2916
2917         m->m_data -= (MSK_RX_BUF_ALIGN - ETHER_ALIGN);
2918 }
2919 #endif
2920
2921 static void
2922 msk_rxeof(struct msk_if_softc *sc_if, uint32_t status, uint32_t control,
2923     int len)
2924 {
2925         struct mbuf *m;
2926         struct ifnet *ifp;
2927         struct msk_rxdesc *rxd;
2928         int cons, rxlen;
2929
2930         ifp = sc_if->msk_ifp;
2931
2932         MSK_IF_LOCK_ASSERT(sc_if);
2933
2934         cons = sc_if->msk_cdata.msk_rx_cons;
2935         do {
2936                 rxlen = status >> 16;
2937                 if ((status & GMR_FS_VLAN) != 0 &&
2938                     (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0)
2939                         rxlen -= ETHER_VLAN_ENCAP_LEN;
2940                 if ((sc_if->msk_flags & MSK_FLAG_NORXCHK) != 0) {
2941                         /*
2942                          * For controllers that returns bogus status code
2943                          * just do minimal check and let upper stack
2944                          * handle this frame.
2945                          */
2946                         if (len > MSK_MAX_FRAMELEN || len < ETHER_HDR_LEN) {
2947                                 ifp->if_ierrors++;
2948                                 msk_discard_rxbuf(sc_if, cons);
2949                                 break;
2950                         }
2951                 } else if (len > sc_if->msk_framesize ||
2952                     ((status & GMR_FS_ANY_ERR) != 0) ||
2953                     ((status & GMR_FS_RX_OK) == 0) || (rxlen != len)) {
2954                         /* Don't count flow-control packet as errors. */
2955                         if ((status & GMR_FS_GOOD_FC) == 0)
2956                                 ifp->if_ierrors++;
2957                         msk_discard_rxbuf(sc_if, cons);
2958                         break;
2959                 }
2960                 rxd = &sc_if->msk_cdata.msk_rxdesc[cons];
2961                 m = rxd->rx_m;
2962                 if (msk_newbuf(sc_if, cons) != 0) {
2963                         ifp->if_iqdrops++;
2964                         /* Reuse old buffer. */
2965                         msk_discard_rxbuf(sc_if, cons);
2966                         break;
2967                 }
2968                 m->m_pkthdr.rcvif = ifp;
2969                 m->m_pkthdr.len = m->m_len = len;
2970 #ifndef __NO_STRICT_ALIGNMENT
2971                 if ((sc_if->msk_flags & MSK_FLAG_RAMBUF) != 0)
2972                         msk_fixup_rx(m);
2973 #endif
2974                 ifp->if_ipackets++;
2975                 if ((ifp->if_capenable & IFCAP_RXCSUM) != 0 &&
2976                     (control & (CSS_IPV4 | CSS_IPFRAG)) == CSS_IPV4) {
2977                         m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED;
2978                         if ((control & CSS_IPV4_CSUM_OK) != 0)
2979                                 m->m_pkthdr.csum_flags |= CSUM_IP_VALID;
2980                         if ((control & (CSS_TCP | CSS_UDP)) != 0 &&
2981                             (control & (CSS_TCPUDP_CSUM_OK)) != 0) {
2982                                 m->m_pkthdr.csum_flags |= CSUM_DATA_VALID |
2983                                     CSUM_PSEUDO_HDR;
2984                                 m->m_pkthdr.csum_data = 0xffff;
2985                         }
2986                 }
2987                 /* Check for VLAN tagged packets. */
2988                 if ((status & GMR_FS_VLAN) != 0 &&
2989                     (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0) {
2990                         m->m_pkthdr.ether_vtag = sc_if->msk_vtag;
2991                         m->m_flags |= M_VLANTAG;
2992                 }
2993                 MSK_IF_UNLOCK(sc_if);
2994                 (*ifp->if_input)(ifp, m);
2995                 MSK_IF_LOCK(sc_if);
2996         } while (0);
2997
2998         MSK_INC(sc_if->msk_cdata.msk_rx_cons, MSK_RX_RING_CNT);
2999         MSK_INC(sc_if->msk_cdata.msk_rx_prod, MSK_RX_RING_CNT);
3000 }
3001
3002 static void
3003 msk_jumbo_rxeof(struct msk_if_softc *sc_if, uint32_t status, uint32_t control,
3004     int len)
3005 {
3006         struct mbuf *m;
3007         struct ifnet *ifp;
3008         struct msk_rxdesc *jrxd;
3009         int cons, rxlen;
3010
3011         ifp = sc_if->msk_ifp;
3012
3013         MSK_IF_LOCK_ASSERT(sc_if);
3014
3015         cons = sc_if->msk_cdata.msk_rx_cons;
3016         do {
3017                 rxlen = status >> 16;
3018                 if ((status & GMR_FS_VLAN) != 0 &&
3019                     (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0)
3020                         rxlen -= ETHER_VLAN_ENCAP_LEN;
3021                 if (len > sc_if->msk_framesize ||
3022                     ((status & GMR_FS_ANY_ERR) != 0) ||
3023                     ((status & GMR_FS_RX_OK) == 0) || (rxlen != len)) {
3024                         /* Don't count flow-control packet as errors. */
3025                         if ((status & GMR_FS_GOOD_FC) == 0)
3026                                 ifp->if_ierrors++;
3027                         msk_discard_jumbo_rxbuf(sc_if, cons);
3028                         break;
3029                 }
3030                 jrxd = &sc_if->msk_cdata.msk_jumbo_rxdesc[cons];
3031                 m = jrxd->rx_m;
3032                 if (msk_jumbo_newbuf(sc_if, cons) != 0) {
3033                         ifp->if_iqdrops++;
3034                         /* Reuse old buffer. */
3035                         msk_discard_jumbo_rxbuf(sc_if, cons);
3036                         break;
3037                 }
3038                 m->m_pkthdr.rcvif = ifp;
3039                 m->m_pkthdr.len = m->m_len = len;
3040 #ifndef __NO_STRICT_ALIGNMENT
3041                 if ((sc_if->msk_flags & MSK_FLAG_RAMBUF) != 0)
3042                         msk_fixup_rx(m);
3043 #endif
3044                 ifp->if_ipackets++;
3045                 if ((ifp->if_capenable & IFCAP_RXCSUM) != 0 &&
3046                     (control & (CSS_IPV4 | CSS_IPFRAG)) == CSS_IPV4) {
3047                         m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED;
3048                         if ((control & CSS_IPV4_CSUM_OK) != 0)
3049                                 m->m_pkthdr.csum_flags |= CSUM_IP_VALID;
3050                         if ((control & (CSS_TCP | CSS_UDP)) != 0 &&
3051                             (control & (CSS_TCPUDP_CSUM_OK)) != 0) {
3052                                 m->m_pkthdr.csum_flags |= CSUM_DATA_VALID |
3053                                     CSUM_PSEUDO_HDR;
3054                                 m->m_pkthdr.csum_data = 0xffff;
3055                         }
3056                 }
3057                 /* Check for VLAN tagged packets. */
3058                 if ((status & GMR_FS_VLAN) != 0 &&
3059                     (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0) {
3060                         m->m_pkthdr.ether_vtag = sc_if->msk_vtag;
3061                         m->m_flags |= M_VLANTAG;
3062                 }
3063                 MSK_IF_UNLOCK(sc_if);
3064                 (*ifp->if_input)(ifp, m);
3065                 MSK_IF_LOCK(sc_if);
3066         } while (0);
3067
3068         MSK_INC(sc_if->msk_cdata.msk_rx_cons, MSK_JUMBO_RX_RING_CNT);
3069         MSK_INC(sc_if->msk_cdata.msk_rx_prod, MSK_JUMBO_RX_RING_CNT);
3070 }
3071
3072 static void
3073 msk_txeof(struct msk_if_softc *sc_if, int idx)
3074 {
3075         struct msk_txdesc *txd;
3076         struct msk_tx_desc *cur_tx;
3077         struct ifnet *ifp;
3078         uint32_t control;
3079         int cons, prog;
3080
3081         MSK_IF_LOCK_ASSERT(sc_if);
3082
3083         ifp = sc_if->msk_ifp;
3084
3085         bus_dmamap_sync(sc_if->msk_cdata.msk_tx_ring_tag,
3086             sc_if->msk_cdata.msk_tx_ring_map,
3087             BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
3088         /*
3089          * Go through our tx ring and free mbufs for those
3090          * frames that have been sent.
3091          */
3092         cons = sc_if->msk_cdata.msk_tx_cons;
3093         prog = 0;
3094         for (; cons != idx; MSK_INC(cons, MSK_TX_RING_CNT)) {
3095                 if (sc_if->msk_cdata.msk_tx_cnt <= 0)
3096                         break;
3097                 prog++;
3098                 cur_tx = &sc_if->msk_rdata.msk_tx_ring[cons];
3099                 control = le32toh(cur_tx->msk_control);
3100                 sc_if->msk_cdata.msk_tx_cnt--;
3101                 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
3102                 if ((control & EOP) == 0)
3103                         continue;
3104                 txd = &sc_if->msk_cdata.msk_txdesc[cons];
3105                 bus_dmamap_sync(sc_if->msk_cdata.msk_tx_tag, txd->tx_dmamap,
3106                     BUS_DMASYNC_POSTWRITE);
3107                 bus_dmamap_unload(sc_if->msk_cdata.msk_tx_tag, txd->tx_dmamap);
3108
3109                 ifp->if_opackets++;
3110                 KASSERT(txd->tx_m != NULL, ("%s: freeing NULL mbuf!",
3111                     __func__));
3112                 m_freem(txd->tx_m);
3113                 txd->tx_m = NULL;
3114         }
3115
3116         if (prog > 0) {
3117                 sc_if->msk_cdata.msk_tx_cons = cons;
3118                 if (sc_if->msk_cdata.msk_tx_cnt == 0)
3119                         sc_if->msk_watchdog_timer = 0;
3120                 /* No need to sync LEs as we didn't update LEs. */
3121         }
3122 }
3123
3124 static void
3125 msk_tick(void *xsc_if)
3126 {
3127         struct msk_if_softc *sc_if;
3128         struct mii_data *mii;
3129
3130         sc_if = xsc_if;
3131
3132         MSK_IF_LOCK_ASSERT(sc_if);
3133
3134         mii = device_get_softc(sc_if->msk_miibus);
3135
3136         mii_tick(mii);
3137         if ((sc_if->msk_flags & MSK_FLAG_LINK) == 0)
3138                 msk_miibus_statchg(sc_if->msk_if_dev);
3139         msk_handle_events(sc_if->msk_softc);
3140         msk_watchdog(sc_if);
3141         callout_reset(&sc_if->msk_tick_ch, hz, msk_tick, sc_if);
3142 }
3143
3144 static void
3145 msk_intr_phy(struct msk_if_softc *sc_if)
3146 {
3147         uint16_t status;
3148
3149         msk_phy_readreg(sc_if, PHY_ADDR_MARV, PHY_MARV_INT_STAT);
3150         status = msk_phy_readreg(sc_if, PHY_ADDR_MARV, PHY_MARV_INT_STAT);
3151         /* Handle FIFO Underrun/Overflow? */
3152         if ((status & PHY_M_IS_FIFO_ERROR))
3153                 device_printf(sc_if->msk_if_dev,
3154                     "PHY FIFO underrun/overflow.\n");
3155 }
3156
3157 static void
3158 msk_intr_gmac(struct msk_if_softc *sc_if)
3159 {
3160         struct msk_softc *sc;
3161         uint8_t status;
3162
3163         sc = sc_if->msk_softc;
3164         status = CSR_READ_1(sc, MR_ADDR(sc_if->msk_port, GMAC_IRQ_SRC));
3165
3166         /* GMAC Rx FIFO overrun. */
3167         if ((status & GM_IS_RX_FF_OR) != 0)
3168                 CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, RX_GMF_CTRL_T),
3169                     GMF_CLI_RX_FO);
3170         /* GMAC Tx FIFO underrun. */
3171         if ((status & GM_IS_TX_FF_UR) != 0) {
3172                 CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, TX_GMF_CTRL_T),
3173                     GMF_CLI_TX_FU);
3174                 device_printf(sc_if->msk_if_dev, "Tx FIFO underrun!\n");
3175                 /*
3176                  * XXX
3177                  * In case of Tx underrun, we may need to flush/reset
3178                  * Tx MAC but that would also require resynchronization
3179                  * with status LEs. Reintializing status LEs would
3180                  * affect other port in dual MAC configuration so it
3181                  * should be avoided as possible as we can.
3182                  * Due to lack of documentation it's all vague guess but
3183                  * it needs more investigation.
3184                  */
3185         }
3186 }
3187
3188 static void
3189 msk_handle_hwerr(struct msk_if_softc *sc_if, uint32_t status)
3190 {
3191         struct msk_softc *sc;
3192
3193         sc = sc_if->msk_softc;
3194         if ((status & Y2_IS_PAR_RD1) != 0) {
3195                 device_printf(sc_if->msk_if_dev,
3196                     "RAM buffer read parity error\n");
3197                 /* Clear IRQ. */
3198                 CSR_WRITE_2(sc, SELECT_RAM_BUFFER(sc_if->msk_port, B3_RI_CTRL),
3199                     RI_CLR_RD_PERR);
3200         }
3201         if ((status & Y2_IS_PAR_WR1) != 0) {
3202                 device_printf(sc_if->msk_if_dev,
3203                     "RAM buffer write parity error\n");
3204                 /* Clear IRQ. */
3205                 CSR_WRITE_2(sc, SELECT_RAM_BUFFER(sc_if->msk_port, B3_RI_CTRL),
3206                     RI_CLR_WR_PERR);
3207         }
3208         if ((status & Y2_IS_PAR_MAC1) != 0) {
3209                 device_printf(sc_if->msk_if_dev, "Tx MAC parity error\n");
3210                 /* Clear IRQ. */
3211                 CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, TX_GMF_CTRL_T),
3212                     GMF_CLI_TX_PE);
3213         }
3214         if ((status & Y2_IS_PAR_RX1) != 0) {
3215                 device_printf(sc_if->msk_if_dev, "Rx parity error\n");
3216                 /* Clear IRQ. */
3217                 CSR_WRITE_4(sc, Q_ADDR(sc_if->msk_rxq, Q_CSR), BMU_CLR_IRQ_PAR);
3218         }
3219         if ((status & (Y2_IS_TCP_TXS1 | Y2_IS_TCP_TXA1)) != 0) {
3220                 device_printf(sc_if->msk_if_dev, "TCP segmentation error\n");
3221                 /* Clear IRQ. */
3222                 CSR_WRITE_4(sc, Q_ADDR(sc_if->msk_txq, Q_CSR), BMU_CLR_IRQ_TCP);
3223         }
3224 }
3225
3226 static void
3227 msk_intr_hwerr(struct msk_softc *sc)
3228 {
3229         uint32_t status;
3230         uint32_t tlphead[4];
3231
3232         status = CSR_READ_4(sc, B0_HWE_ISRC);
3233         /* Time Stamp timer overflow. */
3234         if ((status & Y2_IS_TIST_OV) != 0)
3235                 CSR_WRITE_1(sc, GMAC_TI_ST_CTRL, GMT_ST_CLR_IRQ);
3236         if ((status & Y2_IS_PCI_NEXP) != 0) {
3237                 /*
3238                  * PCI Express Error occured which is not described in PEX
3239                  * spec.
3240                  * This error is also mapped either to Master Abort(
3241                  * Y2_IS_MST_ERR) or Target Abort (Y2_IS_IRQ_STAT) bit and
3242                  * can only be cleared there.
3243                  */
3244                 device_printf(sc->msk_dev,
3245                     "PCI Express protocol violation error\n");
3246         }
3247
3248         if ((status & (Y2_IS_MST_ERR | Y2_IS_IRQ_STAT)) != 0) {
3249                 uint16_t v16;
3250
3251                 if ((status & Y2_IS_MST_ERR) != 0)
3252                         device_printf(sc->msk_dev,
3253                             "unexpected IRQ Status error\n");
3254                 else
3255                         device_printf(sc->msk_dev,
3256                             "unexpected IRQ Master error\n");
3257                 /* Reset all bits in the PCI status register. */
3258                 v16 = pci_read_config(sc->msk_dev, PCIR_STATUS, 2);
3259                 CSR_WRITE_1(sc, B2_TST_CTRL1, TST_CFG_WRITE_ON);
3260                 pci_write_config(sc->msk_dev, PCIR_STATUS, v16 |
3261                     PCIM_STATUS_PERR | PCIM_STATUS_SERR | PCIM_STATUS_RMABORT |
3262                     PCIM_STATUS_RTABORT | PCIM_STATUS_PERRREPORT, 2);
3263                 CSR_WRITE_1(sc, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
3264         }
3265
3266         /* Check for PCI Express Uncorrectable Error. */
3267         if ((status & Y2_IS_PCI_EXP) != 0) {
3268                 uint32_t v32;
3269
3270                 /*
3271                  * On PCI Express bus bridges are called root complexes (RC).
3272                  * PCI Express errors are recognized by the root complex too,
3273                  * which requests the system to handle the problem. After
3274                  * error occurence it may be that no access to the adapter
3275                  * may be performed any longer.
3276                  */
3277
3278                 v32 = CSR_PCI_READ_4(sc, PEX_UNC_ERR_STAT);
3279                 if ((v32 & PEX_UNSUP_REQ) != 0) {
3280                         /* Ignore unsupported request error. */
3281                         device_printf(sc->msk_dev,
3282                             "Uncorrectable PCI Express error\n");
3283                 }
3284                 if ((v32 & (PEX_FATAL_ERRORS | PEX_POIS_TLP)) != 0) {
3285                         int i;
3286
3287                         /* Get TLP header form Log Registers. */
3288                         for (i = 0; i < 4; i++)
3289                                 tlphead[i] = CSR_PCI_READ_4(sc,
3290                                     PEX_HEADER_LOG + i * 4);
3291                         /* Check for vendor defined broadcast message. */
3292                         if (!(tlphead[0] == 0x73004001 && tlphead[1] == 0x7f)) {
3293                                 sc->msk_intrhwemask &= ~Y2_IS_PCI_EXP;
3294                                 CSR_WRITE_4(sc, B0_HWE_IMSK,
3295                                     sc->msk_intrhwemask);
3296                                 CSR_READ_4(sc, B0_HWE_IMSK);
3297                         }
3298                 }
3299                 /* Clear the interrupt. */
3300                 CSR_WRITE_1(sc, B2_TST_CTRL1, TST_CFG_WRITE_ON);
3301                 CSR_PCI_WRITE_4(sc, PEX_UNC_ERR_STAT, 0xffffffff);
3302                 CSR_WRITE_1(sc, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
3303         }
3304
3305         if ((status & Y2_HWE_L1_MASK) != 0 && sc->msk_if[MSK_PORT_A] != NULL)
3306                 msk_handle_hwerr(sc->msk_if[MSK_PORT_A], status);
3307         if ((status & Y2_HWE_L2_MASK) != 0 && sc->msk_if[MSK_PORT_B] != NULL)
3308                 msk_handle_hwerr(sc->msk_if[MSK_PORT_B], status >> 8);
3309 }
3310
3311 static __inline void
3312 msk_rxput(struct msk_if_softc *sc_if)
3313 {
3314         struct msk_softc *sc;
3315
3316         sc = sc_if->msk_softc;
3317         if (sc_if->msk_framesize > (MCLBYTES - MSK_RX_BUF_ALIGN))
3318                 bus_dmamap_sync(
3319                     sc_if->msk_cdata.msk_jumbo_rx_ring_tag,
3320                     sc_if->msk_cdata.msk_jumbo_rx_ring_map,
3321                     BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
3322         else
3323                 bus_dmamap_sync(
3324                     sc_if->msk_cdata.msk_rx_ring_tag,
3325                     sc_if->msk_cdata.msk_rx_ring_map,
3326                     BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
3327         CSR_WRITE_2(sc, Y2_PREF_Q_ADDR(sc_if->msk_rxq,
3328             PREF_UNIT_PUT_IDX_REG), sc_if->msk_cdata.msk_rx_prod);
3329 }
3330
3331 static int
3332 msk_handle_events(struct msk_softc *sc)
3333 {
3334         struct msk_if_softc *sc_if;
3335         int rxput[2];
3336         struct msk_stat_desc *sd;
3337         uint32_t control, status;
3338         int cons, len, port, rxprog;
3339
3340         if (sc->msk_stat_cons == CSR_READ_2(sc, STAT_PUT_IDX))
3341                 return (0);
3342
3343         /* Sync status LEs. */
3344         bus_dmamap_sync(sc->msk_stat_tag, sc->msk_stat_map,
3345             BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
3346
3347         rxput[MSK_PORT_A] = rxput[MSK_PORT_B] = 0;
3348         rxprog = 0;
3349         cons = sc->msk_stat_cons;
3350         for (;;) {
3351                 sd = &sc->msk_stat_ring[cons];
3352                 control = le32toh(sd->msk_control);
3353                 if ((control & HW_OWNER) == 0)
3354                         break;
3355                 control &= ~HW_OWNER;
3356                 sd->msk_control = htole32(control);
3357                 status = le32toh(sd->msk_status);
3358                 len = control & STLE_LEN_MASK;
3359                 port = (control >> 16) & 0x01;
3360                 sc_if = sc->msk_if[port];
3361                 if (sc_if == NULL) {
3362                         device_printf(sc->msk_dev, "invalid port opcode "
3363                             "0x%08x\n", control & STLE_OP_MASK);
3364                         continue;
3365                 }
3366
3367                 switch (control & STLE_OP_MASK) {
3368                 case OP_RXVLAN:
3369                         sc_if->msk_vtag = ntohs(len);
3370                         break;
3371                 case OP_RXCHKSVLAN:
3372                         sc_if->msk_vtag = ntohs(len);
3373                         break;
3374                 case OP_RXSTAT:
3375                         if (!(sc_if->msk_ifp->if_drv_flags & IFF_DRV_RUNNING))
3376                                 break;
3377                         if (sc_if->msk_framesize >
3378                             (MCLBYTES - MSK_RX_BUF_ALIGN))
3379                                 msk_jumbo_rxeof(sc_if, status, control, len);
3380                         else
3381                                 msk_rxeof(sc_if, status, control, len);
3382                         rxprog++;
3383                         /*
3384                          * Because there is no way to sync single Rx LE
3385                          * put the DMA sync operation off until the end of
3386                          * event processing.
3387                          */
3388                         rxput[port]++;
3389                         /* Update prefetch unit if we've passed water mark. */
3390                         if (rxput[port] >= sc_if->msk_cdata.msk_rx_putwm) {
3391                                 msk_rxput(sc_if);
3392                                 rxput[port] = 0;
3393                         }
3394                         break;
3395                 case OP_TXINDEXLE:
3396                         if (sc->msk_if[MSK_PORT_A] != NULL)
3397                                 msk_txeof(sc->msk_if[MSK_PORT_A],
3398                                     status & STLE_TXA1_MSKL);
3399                         if (sc->msk_if[MSK_PORT_B] != NULL)
3400                                 msk_txeof(sc->msk_if[MSK_PORT_B],
3401                                     ((status & STLE_TXA2_MSKL) >>
3402                                     STLE_TXA2_SHIFTL) |
3403                                     ((len & STLE_TXA2_MSKH) <<
3404                                     STLE_TXA2_SHIFTH));
3405                         break;
3406                 default:
3407                         device_printf(sc->msk_dev, "unhandled opcode 0x%08x\n",
3408                             control & STLE_OP_MASK);
3409                         break;
3410                 }
3411                 MSK_INC(cons, MSK_STAT_RING_CNT);
3412                 if (rxprog > sc->msk_process_limit)
3413                         break;
3414         }
3415
3416         sc->msk_stat_cons = cons;
3417         bus_dmamap_sync(sc->msk_stat_tag, sc->msk_stat_map,
3418             BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
3419
3420         if (rxput[MSK_PORT_A] > 0)
3421                 msk_rxput(sc->msk_if[MSK_PORT_A]);
3422         if (rxput[MSK_PORT_B] > 0)
3423                 msk_rxput(sc->msk_if[MSK_PORT_B]);
3424
3425         return (sc->msk_stat_cons != CSR_READ_2(sc, STAT_PUT_IDX));
3426 }
3427
3428 static void
3429 msk_intr(void *xsc)
3430 {
3431         struct msk_softc *sc;
3432         struct msk_if_softc *sc_if0, *sc_if1;
3433         struct ifnet *ifp0, *ifp1;
3434         uint32_t status;
3435         int domore;
3436
3437         sc = xsc;
3438         MSK_LOCK(sc);
3439
3440         /* Reading B0_Y2_SP_ISRC2 masks further interrupts. */
3441         status = CSR_READ_4(sc, B0_Y2_SP_ISRC2);
3442         if (status == 0 || status == 0xffffffff ||
3443             (sc->msk_pflags & MSK_FLAG_SUSPEND) != 0 ||
3444             (status & sc->msk_intrmask) == 0) {
3445                 CSR_WRITE_4(sc, B0_Y2_SP_ICR, 2);
3446                 MSK_UNLOCK(sc);
3447                 return;
3448         }
3449
3450         sc_if0 = sc->msk_if[MSK_PORT_A];
3451         sc_if1 = sc->msk_if[MSK_PORT_B];
3452         ifp0 = ifp1 = NULL;
3453         if (sc_if0 != NULL)
3454                 ifp0 = sc_if0->msk_ifp;
3455         if (sc_if1 != NULL)
3456                 ifp1 = sc_if1->msk_ifp;
3457
3458         if ((status & Y2_IS_IRQ_PHY1) != 0 && sc_if0 != NULL)
3459                 msk_intr_phy(sc_if0);
3460         if ((status & Y2_IS_IRQ_PHY2) != 0 && sc_if1 != NULL)
3461                 msk_intr_phy(sc_if1);
3462         if ((status & Y2_IS_IRQ_MAC1) != 0 && sc_if0 != NULL)
3463                 msk_intr_gmac(sc_if0);
3464         if ((status & Y2_IS_IRQ_MAC2) != 0 && sc_if1 != NULL)
3465                 msk_intr_gmac(sc_if1);
3466         if ((status & (Y2_IS_CHK_RX1 | Y2_IS_CHK_RX2)) != 0) {
3467                 device_printf(sc->msk_dev, "Rx descriptor error\n");
3468                 sc->msk_intrmask &= ~(Y2_IS_CHK_RX1 | Y2_IS_CHK_RX2);
3469                 CSR_WRITE_4(sc, B0_IMSK, sc->msk_intrmask);
3470                 CSR_READ_4(sc, B0_IMSK);
3471         }
3472         if ((status & (Y2_IS_CHK_TXA1 | Y2_IS_CHK_TXA2)) != 0) {
3473                 device_printf(sc->msk_dev, "Tx descriptor error\n");
3474                 sc->msk_intrmask &= ~(Y2_IS_CHK_TXA1 | Y2_IS_CHK_TXA2);
3475                 CSR_WRITE_4(sc, B0_IMSK, sc->msk_intrmask);
3476                 CSR_READ_4(sc, B0_IMSK);
3477         }
3478         if ((status & Y2_IS_HW_ERR) != 0)
3479                 msk_intr_hwerr(sc);
3480
3481         domore = msk_handle_events(sc);
3482         if ((status & Y2_IS_STAT_BMU) != 0 && domore == 0)
3483                 CSR_WRITE_4(sc, STAT_CTRL, SC_STAT_CLR_IRQ);
3484
3485         /* Reenable interrupts. */
3486         CSR_WRITE_4(sc, B0_Y2_SP_ICR, 2);
3487
3488         if (ifp0 != NULL && (ifp0->if_drv_flags & IFF_DRV_RUNNING) != 0 &&
3489             !IFQ_DRV_IS_EMPTY(&ifp0->if_snd))
3490                 msk_start_locked(ifp0);
3491         if (ifp1 != NULL && (ifp1->if_drv_flags & IFF_DRV_RUNNING) != 0 &&
3492             !IFQ_DRV_IS_EMPTY(&ifp1->if_snd))
3493                 msk_start_locked(ifp1);
3494
3495         MSK_UNLOCK(sc);
3496 }
3497
3498 static void
3499 msk_set_tx_stfwd(struct msk_if_softc *sc_if)
3500 {
3501         struct msk_softc *sc;
3502         struct ifnet *ifp;
3503
3504         ifp = sc_if->msk_ifp;
3505         sc = sc_if->msk_softc;
3506         switch (sc->msk_hw_id) {
3507         case CHIP_ID_YUKON_EX:
3508                 if (sc->msk_hw_rev == CHIP_REV_YU_EX_A0)
3509                         goto yukon_ex_workaround;
3510                 if (ifp->if_mtu > ETHERMTU)
3511                         CSR_WRITE_4(sc,
3512                             MR_ADDR(sc_if->msk_port, TX_GMF_CTRL_T),
3513                             TX_JUMBO_ENA | TX_STFW_ENA);
3514                 else
3515                         CSR_WRITE_4(sc,
3516                             MR_ADDR(sc_if->msk_port, TX_GMF_CTRL_T),
3517                             TX_JUMBO_DIS | TX_STFW_ENA);
3518                 break;
3519         default:
3520 yukon_ex_workaround:
3521                 if (ifp->if_mtu > ETHERMTU) {
3522                         /* Set Tx GMAC FIFO Almost Empty Threshold. */
3523                         CSR_WRITE_4(sc,
3524                             MR_ADDR(sc_if->msk_port, TX_GMF_AE_THR),
3525                             MSK_ECU_JUMBO_WM << 16 | MSK_ECU_AE_THR);
3526                         /* Disable Store & Forward mode for Tx. */
3527                         CSR_WRITE_4(sc,
3528                             MR_ADDR(sc_if->msk_port, TX_GMF_CTRL_T),
3529                             TX_JUMBO_ENA | TX_STFW_DIS);
3530                 } else {
3531                         /* Enable Store & Forward mode for Tx. */
3532                         CSR_WRITE_4(sc,
3533                             MR_ADDR(sc_if->msk_port, TX_GMF_CTRL_T),
3534                             TX_JUMBO_DIS | TX_STFW_ENA);
3535                 }
3536                 break;
3537         }
3538 }
3539
3540 static void
3541 msk_init(void *xsc)
3542 {
3543         struct msk_if_softc *sc_if = xsc;
3544
3545         MSK_IF_LOCK(sc_if);
3546         msk_init_locked(sc_if);
3547         MSK_IF_UNLOCK(sc_if);
3548 }
3549
3550 static void
3551 msk_init_locked(struct msk_if_softc *sc_if)
3552 {
3553         struct msk_softc *sc;
3554         struct ifnet *ifp;
3555         struct mii_data  *mii;
3556         uint8_t *eaddr;
3557         uint16_t gmac;
3558         uint32_t reg;
3559         int error;
3560
3561         MSK_IF_LOCK_ASSERT(sc_if);
3562
3563         ifp = sc_if->msk_ifp;
3564         sc = sc_if->msk_softc;
3565         mii = device_get_softc(sc_if->msk_miibus);
3566
3567         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
3568                 return;
3569
3570         error = 0;
3571         /* Cancel pending I/O and free all Rx/Tx buffers. */
3572         msk_stop(sc_if);
3573
3574         if (ifp->if_mtu < ETHERMTU)
3575                 sc_if->msk_framesize = ETHERMTU;
3576         else
3577                 sc_if->msk_framesize = ifp->if_mtu;
3578         sc_if->msk_framesize += ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
3579         if (ifp->if_mtu > ETHERMTU &&
3580             (sc_if->msk_flags & MSK_FLAG_JUMBO_NOCSUM) != 0) {
3581                 ifp->if_hwassist &= ~(MSK_CSUM_FEATURES | CSUM_TSO);
3582                 ifp->if_capenable &= ~(IFCAP_TSO4 | IFCAP_TXCSUM);
3583         }
3584
3585         /* GMAC Control reset. */
3586         CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, GMAC_CTRL), GMC_RST_SET);
3587         CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, GMAC_CTRL), GMC_RST_CLR);
3588         CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, GMAC_CTRL), GMC_F_LOOPB_OFF);
3589         if (sc->msk_hw_id == CHIP_ID_YUKON_EX)
3590                 CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, GMAC_CTRL),
3591                     GMC_BYP_MACSECRX_ON | GMC_BYP_MACSECTX_ON |
3592                     GMC_BYP_RETR_ON);
3593
3594         /*
3595          * Initialize GMAC first such that speed/duplex/flow-control
3596          * parameters are renegotiated when interface is brought up.
3597          */
3598         GMAC_WRITE_2(sc, sc_if->msk_port, GM_GP_CTRL, 0);
3599
3600         /* Dummy read the Interrupt Source Register. */
3601         CSR_READ_1(sc, MR_ADDR(sc_if->msk_port, GMAC_IRQ_SRC));
3602
3603         /* Clear MIB stats. */
3604         msk_stats_clear(sc_if);
3605
3606         /* Disable FCS. */
3607         GMAC_WRITE_2(sc, sc_if->msk_port, GM_RX_CTRL, GM_RXCR_CRC_DIS);
3608
3609         /* Setup Transmit Control Register. */
3610         GMAC_WRITE_2(sc, sc_if->msk_port, GM_TX_CTRL, TX_COL_THR(TX_COL_DEF));
3611
3612         /* Setup Transmit Flow Control Register. */
3613         GMAC_WRITE_2(sc, sc_if->msk_port, GM_TX_FLOW_CTRL, 0xffff);
3614
3615         /* Setup Transmit Parameter Register. */
3616         GMAC_WRITE_2(sc, sc_if->msk_port, GM_TX_PARAM,
3617             TX_JAM_LEN_VAL(TX_JAM_LEN_DEF) | TX_JAM_IPG_VAL(TX_JAM_IPG_DEF) |
3618             TX_IPG_JAM_DATA(TX_IPG_JAM_DEF) | TX_BACK_OFF_LIM(TX_BOF_LIM_DEF));
3619
3620         gmac = DATA_BLIND_VAL(DATA_BLIND_DEF) |
3621             GM_SMOD_VLAN_ENA | IPG_DATA_VAL(IPG_DATA_DEF);
3622
3623         if (ifp->if_mtu > ETHERMTU)
3624                 gmac |= GM_SMOD_JUMBO_ENA;
3625         GMAC_WRITE_2(sc, sc_if->msk_port, GM_SERIAL_MODE, gmac);
3626
3627         /* Set station address. */
3628         eaddr = IF_LLADDR(ifp);
3629         GMAC_WRITE_2(sc, sc_if->msk_port, GM_SRC_ADDR_1L,
3630             eaddr[0] | (eaddr[1] << 8));
3631         GMAC_WRITE_2(sc, sc_if->msk_port, GM_SRC_ADDR_1M,
3632             eaddr[2] | (eaddr[3] << 8));
3633         GMAC_WRITE_2(sc, sc_if->msk_port, GM_SRC_ADDR_1H,
3634             eaddr[4] | (eaddr[5] << 8));
3635         GMAC_WRITE_2(sc, sc_if->msk_port, GM_SRC_ADDR_2L,
3636             eaddr[0] | (eaddr[1] << 8));
3637         GMAC_WRITE_2(sc, sc_if->msk_port, GM_SRC_ADDR_2M,
3638             eaddr[2] | (eaddr[3] << 8));
3639         GMAC_WRITE_2(sc, sc_if->msk_port, GM_SRC_ADDR_2H,
3640             eaddr[4] | (eaddr[5] << 8));
3641
3642         /* Disable interrupts for counter overflows. */
3643         GMAC_WRITE_2(sc, sc_if->msk_port, GM_TX_IRQ_MSK, 0);
3644         GMAC_WRITE_2(sc, sc_if->msk_port, GM_RX_IRQ_MSK, 0);
3645         GMAC_WRITE_2(sc, sc_if->msk_port, GM_TR_IRQ_MSK, 0);
3646
3647         /* Configure Rx MAC FIFO. */
3648         CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, RX_GMF_CTRL_T), GMF_RST_SET);
3649         CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, RX_GMF_CTRL_T), GMF_RST_CLR);
3650         reg = GMF_OPER_ON | GMF_RX_F_FL_ON;
3651         if (sc->msk_hw_id == CHIP_ID_YUKON_FE_P ||
3652             sc->msk_hw_id == CHIP_ID_YUKON_EX)
3653                 reg |= GMF_RX_OVER_ON;
3654         CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, RX_GMF_CTRL_T), reg);
3655
3656         /* Set receive filter. */
3657         msk_rxfilter(sc_if);
3658
3659         if (sc->msk_hw_id == CHIP_ID_YUKON_XL) {
3660                 /* Clear flush mask - HW bug. */
3661                 CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, RX_GMF_FL_MSK), 0);
3662         } else {
3663                 /* Flush Rx MAC FIFO on any flow control or error. */
3664                 CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, RX_GMF_FL_MSK),
3665                     GMR_FS_ANY_ERR);
3666         }
3667
3668         /*
3669          * Set Rx FIFO flush threshold to 64 bytes + 1 FIFO word
3670          * due to hardware hang on receipt of pause frames.
3671          */
3672         reg = RX_GMF_FL_THR_DEF + 1;
3673         /* Another magic for Yukon FE+ - From Linux. */
3674         if (sc->msk_hw_id == CHIP_ID_YUKON_FE_P &&
3675             sc->msk_hw_rev == CHIP_REV_YU_FE_P_A0)
3676                 reg = 0x178;
3677         CSR_WRITE_2(sc, MR_ADDR(sc_if->msk_port, RX_GMF_FL_THR), reg);
3678
3679         /* Configure Tx MAC FIFO. */
3680         CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, TX_GMF_CTRL_T), GMF_RST_SET);
3681         CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, TX_GMF_CTRL_T), GMF_RST_CLR);
3682         CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, TX_GMF_CTRL_T), GMF_OPER_ON);
3683
3684         /* Configure hardware VLAN tag insertion/stripping. */
3685         msk_setvlan(sc_if, ifp);
3686
3687         if ((sc_if->msk_flags & MSK_FLAG_RAMBUF) == 0) {
3688                 /* Set Rx Pause threshould. */
3689                 CSR_WRITE_2(sc, MR_ADDR(sc_if->msk_port, RX_GMF_LP_THR),
3690                     MSK_ECU_LLPP);
3691                 CSR_WRITE_2(sc, MR_ADDR(sc_if->msk_port, RX_GMF_UP_THR),
3692                     MSK_ECU_ULPP);
3693                 /* Configure store-and-forward for Tx. */
3694                 msk_set_tx_stfwd(sc_if);
3695         }
3696
3697         if (sc->msk_hw_id == CHIP_ID_YUKON_FE_P &&
3698             sc->msk_hw_rev == CHIP_REV_YU_FE_P_A0) {
3699                 /* Disable dynamic watermark - from Linux. */
3700                 reg = CSR_READ_4(sc, MR_ADDR(sc_if->msk_port, TX_GMF_EA));
3701                 reg &= ~0x03;
3702                 CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, TX_GMF_EA), reg);
3703         }
3704
3705         /*
3706          * Disable Force Sync bit and Alloc bit in Tx RAM interface
3707          * arbiter as we don't use Sync Tx queue.
3708          */
3709         CSR_WRITE_1(sc, MR_ADDR(sc_if->msk_port, TXA_CTRL),
3710             TXA_DIS_FSYNC | TXA_DIS_ALLOC | TXA_STOP_RC);
3711         /* Enable the RAM Interface Arbiter. */
3712         CSR_WRITE_1(sc, MR_ADDR(sc_if->msk_port, TXA_CTRL), TXA_ENA_ARB);
3713
3714         /* Setup RAM buffer. */
3715         msk_set_rambuffer(sc_if);
3716
3717         /* Disable Tx sync Queue. */
3718         CSR_WRITE_1(sc, RB_ADDR(sc_if->msk_txsq, RB_CTRL), RB_RST_SET);
3719
3720         /* Setup Tx Queue Bus Memory Interface. */
3721         CSR_WRITE_4(sc, Q_ADDR(sc_if->msk_txq, Q_CSR), BMU_CLR_RESET);
3722         CSR_WRITE_4(sc, Q_ADDR(sc_if->msk_txq, Q_CSR), BMU_OPER_INIT);
3723         CSR_WRITE_4(sc, Q_ADDR(sc_if->msk_txq, Q_CSR), BMU_FIFO_OP_ON);
3724         CSR_WRITE_2(sc, Q_ADDR(sc_if->msk_txq, Q_WM), MSK_BMU_TX_WM);
3725         switch (sc->msk_hw_id) {
3726         case CHIP_ID_YUKON_EC_U:
3727                 if (sc->msk_hw_rev == CHIP_REV_YU_EC_U_A0) {
3728                         /* Fix for Yukon-EC Ultra: set BMU FIFO level */
3729                         CSR_WRITE_2(sc, Q_ADDR(sc_if->msk_txq, Q_AL),
3730                             MSK_ECU_TXFF_LEV);
3731                 }
3732                 break;
3733         case CHIP_ID_YUKON_EX:
3734                 /*
3735                  * Yukon Extreme seems to have silicon bug for
3736                  * automatic Tx checksum calculation capability.
3737                  */
3738                 if (sc->msk_hw_rev == CHIP_REV_YU_EX_B0)
3739                         CSR_WRITE_4(sc, Q_ADDR(sc_if->msk_txq, Q_F),
3740                             F_TX_CHK_AUTO_OFF);
3741                 break;
3742         }
3743
3744         /* Setup Rx Queue Bus Memory Interface. */
3745         CSR_WRITE_4(sc, Q_ADDR(sc_if->msk_rxq, Q_CSR), BMU_CLR_RESET);
3746         CSR_WRITE_4(sc, Q_ADDR(sc_if->msk_rxq, Q_CSR), BMU_OPER_INIT);
3747         CSR_WRITE_4(sc, Q_ADDR(sc_if->msk_rxq, Q_CSR), BMU_FIFO_OP_ON);
3748         CSR_WRITE_2(sc, Q_ADDR(sc_if->msk_rxq, Q_WM), MSK_BMU_RX_WM);
3749         if (sc->msk_hw_id == CHIP_ID_YUKON_EC_U &&
3750             sc->msk_hw_rev >= CHIP_REV_YU_EC_U_A1) {
3751                 /* MAC Rx RAM Read is controlled by hardware. */
3752                 CSR_WRITE_4(sc, Q_ADDR(sc_if->msk_rxq, Q_F), F_M_RX_RAM_DIS);
3753         }
3754
3755         msk_set_prefetch(sc, sc_if->msk_txq,
3756             sc_if->msk_rdata.msk_tx_ring_paddr, MSK_TX_RING_CNT - 1);
3757         msk_init_tx_ring(sc_if);
3758
3759         /* Disable Rx checksum offload and RSS hash. */
3760         CSR_WRITE_4(sc, Q_ADDR(sc_if->msk_rxq, Q_CSR),
3761             BMU_DIS_RX_CHKSUM | BMU_DIS_RX_RSS_HASH);
3762         if (sc_if->msk_framesize > (MCLBYTES - MSK_RX_BUF_ALIGN)) {
3763                 msk_set_prefetch(sc, sc_if->msk_rxq,
3764                     sc_if->msk_rdata.msk_jumbo_rx_ring_paddr,
3765                     MSK_JUMBO_RX_RING_CNT - 1);
3766                 error = msk_init_jumbo_rx_ring(sc_if);
3767          } else {
3768                 msk_set_prefetch(sc, sc_if->msk_rxq,
3769                     sc_if->msk_rdata.msk_rx_ring_paddr,
3770                     MSK_RX_RING_CNT - 1);
3771                 error = msk_init_rx_ring(sc_if);
3772         }
3773         if (error != 0) {
3774                 device_printf(sc_if->msk_if_dev,
3775                     "initialization failed: no memory for Rx buffers\n");
3776                 msk_stop(sc_if);
3777                 return;
3778         }
3779         if (sc->msk_hw_id == CHIP_ID_YUKON_EX) {
3780                 /* Disable flushing of non-ASF packets. */
3781                 CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, RX_GMF_CTRL_T),
3782                     GMF_RX_MACSEC_FLUSH_OFF);
3783         }
3784
3785         /* Configure interrupt handling. */
3786         if (sc_if->msk_port == MSK_PORT_A) {
3787                 sc->msk_intrmask |= Y2_IS_PORT_A;
3788                 sc->msk_intrhwemask |= Y2_HWE_L1_MASK;
3789         } else {
3790                 sc->msk_intrmask |= Y2_IS_PORT_B;
3791                 sc->msk_intrhwemask |= Y2_HWE_L2_MASK;
3792         }
3793         /* Configure IRQ moderation mask. */
3794         CSR_WRITE_4(sc, B2_IRQM_MSK, sc->msk_intrmask);
3795         if (sc->msk_int_holdoff > 0) {
3796                 /* Configure initial IRQ moderation timer value. */
3797                 CSR_WRITE_4(sc, B2_IRQM_INI,
3798                     MSK_USECS(sc, sc->msk_int_holdoff));
3799                 CSR_WRITE_4(sc, B2_IRQM_VAL,
3800                     MSK_USECS(sc, sc->msk_int_holdoff));
3801                 /* Start IRQ moderation. */
3802                 CSR_WRITE_1(sc, B2_IRQM_CTRL, TIM_START);
3803         }
3804         CSR_WRITE_4(sc, B0_HWE_IMSK, sc->msk_intrhwemask);
3805         CSR_READ_4(sc, B0_HWE_IMSK);
3806         CSR_WRITE_4(sc, B0_IMSK, sc->msk_intrmask);
3807         CSR_READ_4(sc, B0_IMSK);
3808
3809         sc_if->msk_flags &= ~MSK_FLAG_LINK;
3810         mii_mediachg(mii);
3811
3812         ifp->if_drv_flags |= IFF_DRV_RUNNING;
3813         ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
3814
3815         callout_reset(&sc_if->msk_tick_ch, hz, msk_tick, sc_if);
3816 }
3817
3818 static void
3819 msk_set_rambuffer(struct msk_if_softc *sc_if)
3820 {
3821         struct msk_softc *sc;
3822         int ltpp, utpp;
3823
3824         sc = sc_if->msk_softc;
3825         if ((sc_if->msk_flags & MSK_FLAG_RAMBUF) == 0)
3826                 return;
3827
3828         /* Setup Rx Queue. */
3829         CSR_WRITE_1(sc, RB_ADDR(sc_if->msk_rxq, RB_CTRL), RB_RST_CLR);
3830         CSR_WRITE_4(sc, RB_ADDR(sc_if->msk_rxq, RB_START),
3831             sc->msk_rxqstart[sc_if->msk_port] / 8);
3832         CSR_WRITE_4(sc, RB_ADDR(sc_if->msk_rxq, RB_END),
3833             sc->msk_rxqend[sc_if->msk_port] / 8);
3834         CSR_WRITE_4(sc, RB_ADDR(sc_if->msk_rxq, RB_WP),
3835             sc->msk_rxqstart[sc_if->msk_port] / 8);
3836         CSR_WRITE_4(sc, RB_ADDR(sc_if->msk_rxq, RB_RP),
3837             sc->msk_rxqstart[sc_if->msk_port] / 8);
3838
3839         utpp = (sc->msk_rxqend[sc_if->msk_port] + 1 -
3840             sc->msk_rxqstart[sc_if->msk_port] - MSK_RB_ULPP) / 8;
3841         ltpp = (sc->msk_rxqend[sc_if->msk_port] + 1 -
3842             sc->msk_rxqstart[sc_if->msk_port] - MSK_RB_LLPP_B) / 8;
3843         if (sc->msk_rxqsize < MSK_MIN_RXQ_SIZE)
3844                 ltpp += (MSK_RB_LLPP_B - MSK_RB_LLPP_S) / 8;
3845         CSR_WRITE_4(sc, RB_ADDR(sc_if->msk_rxq, RB_RX_UTPP), utpp);
3846         CSR_WRITE_4(sc, RB_ADDR(sc_if->msk_rxq, RB_RX_LTPP), ltpp);
3847         /* Set Rx priority(RB_RX_UTHP/RB_RX_LTHP) thresholds? */
3848
3849         CSR_WRITE_1(sc, RB_ADDR(sc_if->msk_rxq, RB_CTRL), RB_ENA_OP_MD);
3850         CSR_READ_1(sc, RB_ADDR(sc_if->msk_rxq, RB_CTRL));
3851
3852         /* Setup Tx Queue. */
3853         CSR_WRITE_1(sc, RB_ADDR(sc_if->msk_txq, RB_CTRL), RB_RST_CLR);
3854         CSR_WRITE_4(sc, RB_ADDR(sc_if->msk_txq, RB_START),
3855             sc->msk_txqstart[sc_if->msk_port] / 8);
3856         CSR_WRITE_4(sc, RB_ADDR(sc_if->msk_txq, RB_END),
3857             sc->msk_txqend[sc_if->msk_port] / 8);
3858         CSR_WRITE_4(sc, RB_ADDR(sc_if->msk_txq, RB_WP),
3859             sc->msk_txqstart[sc_if->msk_port] / 8);
3860         CSR_WRITE_4(sc, RB_ADDR(sc_if->msk_txq, RB_RP),
3861             sc->msk_txqstart[sc_if->msk_port] / 8);
3862         /* Enable Store & Forward for Tx side. */
3863         CSR_WRITE_1(sc, RB_ADDR(sc_if->msk_txq, RB_CTRL), RB_ENA_STFWD);
3864         CSR_WRITE_1(sc, RB_ADDR(sc_if->msk_txq, RB_CTRL), RB_ENA_OP_MD);
3865         CSR_READ_1(sc, RB_ADDR(sc_if->msk_txq, RB_CTRL));
3866 }
3867
3868 static void
3869 msk_set_prefetch(struct msk_softc *sc, int qaddr, bus_addr_t addr,
3870     uint32_t count)
3871 {
3872
3873         /* Reset the prefetch unit. */
3874         CSR_WRITE_4(sc, Y2_PREF_Q_ADDR(qaddr, PREF_UNIT_CTRL_REG),
3875             PREF_UNIT_RST_SET);
3876         CSR_WRITE_4(sc, Y2_PREF_Q_ADDR(qaddr, PREF_UNIT_CTRL_REG),
3877             PREF_UNIT_RST_CLR);
3878         /* Set LE base address. */
3879         CSR_WRITE_4(sc, Y2_PREF_Q_ADDR(qaddr, PREF_UNIT_ADDR_LOW_REG),
3880             MSK_ADDR_LO(addr));
3881         CSR_WRITE_4(sc, Y2_PREF_Q_ADDR(qaddr, PREF_UNIT_ADDR_HI_REG),
3882             MSK_ADDR_HI(addr));
3883         /* Set the list last index. */
3884         CSR_WRITE_2(sc, Y2_PREF_Q_ADDR(qaddr, PREF_UNIT_LAST_IDX_REG),
3885             count);
3886         /* Turn on prefetch unit. */
3887         CSR_WRITE_4(sc, Y2_PREF_Q_ADDR(qaddr, PREF_UNIT_CTRL_REG),
3888             PREF_UNIT_OP_ON);
3889         /* Dummy read to ensure write. */
3890         CSR_READ_4(sc, Y2_PREF_Q_ADDR(qaddr, PREF_UNIT_CTRL_REG));
3891 }
3892
3893 static void
3894 msk_stop(struct msk_if_softc *sc_if)
3895 {
3896         struct msk_softc *sc;
3897         struct msk_txdesc *txd;
3898         struct msk_rxdesc *rxd;
3899         struct msk_rxdesc *jrxd;
3900         struct ifnet *ifp;
3901         uint32_t val;
3902         int i;
3903
3904         MSK_IF_LOCK_ASSERT(sc_if);
3905         sc = sc_if->msk_softc;
3906         ifp = sc_if->msk_ifp;
3907
3908         callout_stop(&sc_if->msk_tick_ch);
3909         sc_if->msk_watchdog_timer = 0;
3910
3911         /* Disable interrupts. */
3912         if (sc_if->msk_port == MSK_PORT_A) {
3913                 sc->msk_intrmask &= ~Y2_IS_PORT_A;
3914                 sc->msk_intrhwemask &= ~Y2_HWE_L1_MASK;
3915         } else {
3916                 sc->msk_intrmask &= ~Y2_IS_PORT_B;
3917                 sc->msk_intrhwemask &= ~Y2_HWE_L2_MASK;
3918         }
3919         CSR_WRITE_4(sc, B0_HWE_IMSK, sc->msk_intrhwemask);
3920         CSR_READ_4(sc, B0_HWE_IMSK);
3921         CSR_WRITE_4(sc, B0_IMSK, sc->msk_intrmask);
3922         CSR_READ_4(sc, B0_IMSK);
3923
3924         /* Disable Tx/Rx MAC. */
3925         val = GMAC_READ_2(sc, sc_if->msk_port, GM_GP_CTRL);
3926         val &= ~(GM_GPCR_RX_ENA | GM_GPCR_TX_ENA);
3927         GMAC_WRITE_2(sc, sc_if->msk_port, GM_GP_CTRL, val);
3928         /* Read again to ensure writing. */
3929         GMAC_READ_2(sc, sc_if->msk_port, GM_GP_CTRL);
3930         /* Update stats and clear counters. */
3931         msk_stats_update(sc_if);
3932
3933         /* Stop Tx BMU. */
3934         CSR_WRITE_4(sc, Q_ADDR(sc_if->msk_txq, Q_CSR), BMU_STOP);
3935         val = CSR_READ_4(sc, Q_ADDR(sc_if->msk_txq, Q_CSR));
3936         for (i = 0; i < MSK_TIMEOUT; i++) {
3937                 if ((val & (BMU_STOP | BMU_IDLE)) == 0) {
3938                         CSR_WRITE_4(sc, Q_ADDR(sc_if->msk_txq, Q_CSR),
3939                             BMU_STOP);
3940                         val = CSR_READ_4(sc, Q_ADDR(sc_if->msk_txq, Q_CSR));
3941                 } else
3942                         break;
3943                 DELAY(1);
3944         }
3945         if (i == MSK_TIMEOUT)
3946                 device_printf(sc_if->msk_if_dev, "Tx BMU stop failed\n");
3947         CSR_WRITE_1(sc, RB_ADDR(sc_if->msk_txq, RB_CTRL),
3948             RB_RST_SET | RB_DIS_OP_MD);
3949
3950         /* Disable all GMAC interrupt. */
3951         CSR_WRITE_1(sc, MR_ADDR(sc_if->msk_port, GMAC_IRQ_MSK), 0);
3952         /* Disable PHY interrupt. */
3953         msk_phy_writereg(sc_if, PHY_ADDR_MARV, PHY_MARV_INT_MASK, 0);
3954
3955         /* Disable the RAM Interface Arbiter. */
3956         CSR_WRITE_1(sc, MR_ADDR(sc_if->msk_port, TXA_CTRL), TXA_DIS_ARB);
3957
3958         /* Reset the PCI FIFO of the async Tx queue */
3959         CSR_WRITE_4(sc, Q_ADDR(sc_if->msk_txq, Q_CSR),
3960             BMU_RST_SET | BMU_FIFO_RST);
3961
3962         /* Reset the Tx prefetch units. */
3963         CSR_WRITE_4(sc, Y2_PREF_Q_ADDR(sc_if->msk_txq, PREF_UNIT_CTRL_REG),
3964             PREF_UNIT_RST_SET);
3965
3966         /* Reset the RAM Buffer async Tx queue. */
3967         CSR_WRITE_1(sc, RB_ADDR(sc_if->msk_txq, RB_CTRL), RB_RST_SET);
3968
3969         /* Reset Tx MAC FIFO. */
3970         CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, TX_GMF_CTRL_T), GMF_RST_SET);
3971         /* Set Pause Off. */
3972         CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, GMAC_CTRL), GMC_PAUSE_OFF);
3973
3974         /*
3975          * The Rx Stop command will not work for Yukon-2 if the BMU does not
3976          * reach the end of packet and since we can't make sure that we have
3977          * incoming data, we must reset the BMU while it is not during a DMA
3978          * transfer. Since it is possible that the Rx path is still active,
3979          * the Rx RAM buffer will be stopped first, so any possible incoming
3980          * data will not trigger a DMA. After the RAM buffer is stopped, the
3981          * BMU is polled until any DMA in progress is ended and only then it
3982          * will be reset.
3983          */
3984
3985         /* Disable the RAM Buffer receive queue. */
3986         CSR_WRITE_1(sc, RB_ADDR(sc_if->msk_rxq, RB_CTRL), RB_DIS_OP_MD);
3987         for (i = 0; i < MSK_TIMEOUT; i++) {
3988                 if (CSR_READ_1(sc, RB_ADDR(sc_if->msk_rxq, Q_RSL)) ==
3989                     CSR_READ_1(sc, RB_ADDR(sc_if->msk_rxq, Q_RL)))
3990                         break;
3991                 DELAY(1);
3992         }
3993         if (i == MSK_TIMEOUT)
3994                 device_printf(sc_if->msk_if_dev, "Rx BMU stop failed\n");
3995         CSR_WRITE_4(sc, Q_ADDR(sc_if->msk_rxq, Q_CSR),
3996             BMU_RST_SET | BMU_FIFO_RST);
3997         /* Reset the Rx prefetch unit. */
3998         CSR_WRITE_4(sc, Y2_PREF_Q_ADDR(sc_if->msk_rxq, PREF_UNIT_CTRL_REG),
3999             PREF_UNIT_RST_SET);
4000         /* Reset the RAM Buffer receive queue. */
4001         CSR_WRITE_1(sc, RB_ADDR(sc_if->msk_rxq, RB_CTRL), RB_RST_SET);
4002         /* Reset Rx MAC FIFO. */
4003         CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, RX_GMF_CTRL_T), GMF_RST_SET);
4004
4005         /* Free Rx and Tx mbufs still in the queues. */
4006         for (i = 0; i < MSK_RX_RING_CNT; i++) {
4007                 rxd = &sc_if->msk_cdata.msk_rxdesc[i];
4008                 if (rxd->rx_m != NULL) {
4009                         bus_dmamap_sync(sc_if->msk_cdata.msk_rx_tag,
4010                             rxd->rx_dmamap, BUS_DMASYNC_POSTREAD);
4011                         bus_dmamap_unload(sc_if->msk_cdata.msk_rx_tag,
4012                             rxd->rx_dmamap);
4013                         m_freem(rxd->rx_m);
4014                         rxd->rx_m = NULL;
4015                 }
4016         }
4017         for (i = 0; i < MSK_JUMBO_RX_RING_CNT; i++) {
4018                 jrxd = &sc_if->msk_cdata.msk_jumbo_rxdesc[i];
4019                 if (jrxd->rx_m != NULL) {
4020                         bus_dmamap_sync(sc_if->msk_cdata.msk_jumbo_rx_tag,
4021                             jrxd->rx_dmamap, BUS_DMASYNC_POSTREAD);
4022                         bus_dmamap_unload(sc_if->msk_cdata.msk_jumbo_rx_tag,
4023                             jrxd->rx_dmamap);
4024                         m_freem(jrxd->rx_m);
4025                         jrxd->rx_m = NULL;
4026                 }
4027         }
4028         for (i = 0; i < MSK_TX_RING_CNT; i++) {
4029                 txd = &sc_if->msk_cdata.msk_txdesc[i];
4030                 if (txd->tx_m != NULL) {
4031                         bus_dmamap_sync(sc_if->msk_cdata.msk_tx_tag,
4032                             txd->tx_dmamap, BUS_DMASYNC_POSTWRITE);
4033                         bus_dmamap_unload(sc_if->msk_cdata.msk_tx_tag,
4034                             txd->tx_dmamap);
4035                         m_freem(txd->tx_m);
4036                         txd->tx_m = NULL;
4037                 }
4038         }
4039
4040         /*
4041          * Mark the interface down.
4042          */
4043         ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
4044         sc_if->msk_flags &= ~MSK_FLAG_LINK;
4045 }
4046
4047 /*
4048  * When GM_PAR_MIB_CLR bit of GM_PHY_ADDR is set, reading lower
4049  * counter clears high 16 bits of the counter such that accessing
4050  * lower 16 bits should be the last operation.
4051  */
4052 #define MSK_READ_MIB32(x, y)                                    \
4053         (((uint32_t)GMAC_READ_2(sc, x, (y) + 4)) << 16) +       \
4054         (uint32_t)GMAC_READ_2(sc, x, y)
4055 #define MSK_READ_MIB64(x, y)                                    \
4056         (((uint64_t)MSK_READ_MIB32(x, (y) + 8)) << 32) +        \
4057         (uint64_t)MSK_READ_MIB32(x, y)
4058
4059 static void
4060 msk_stats_clear(struct msk_if_softc *sc_if)
4061 {
4062         struct msk_softc *sc;
4063         uint32_t reg;
4064         uint16_t gmac;
4065         int i;
4066
4067         MSK_IF_LOCK_ASSERT(sc_if);
4068
4069         sc = sc_if->msk_softc;
4070         /* Set MIB Clear Counter Mode. */
4071         gmac = GMAC_READ_2(sc, sc_if->msk_port, GM_PHY_ADDR);
4072         GMAC_WRITE_2(sc, sc_if->msk_port, GM_PHY_ADDR, gmac | GM_PAR_MIB_CLR);
4073         /* Read all MIB Counters with Clear Mode set. */
4074         for (i = GM_RXF_UC_OK; i <= GM_TXE_FIFO_UR; i += sizeof(uint32_t))
4075                 reg = MSK_READ_MIB32(sc_if->msk_port, i);
4076         /* Clear MIB Clear Counter Mode. */
4077         gmac &= ~GM_PAR_MIB_CLR;
4078         GMAC_WRITE_2(sc, sc_if->msk_port, GM_PHY_ADDR, gmac);
4079 }
4080
4081 static void
4082 msk_stats_update(struct msk_if_softc *sc_if)
4083 {
4084         struct msk_softc *sc;
4085         struct ifnet *ifp;
4086         struct msk_hw_stats *stats;
4087         uint16_t gmac;
4088         uint32_t reg;
4089
4090         MSK_IF_LOCK_ASSERT(sc_if);
4091
4092         ifp = sc_if->msk_ifp;
4093         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
4094                 return;
4095         sc = sc_if->msk_softc;
4096         stats = &sc_if->msk_stats;
4097         /* Set MIB Clear Counter Mode. */
4098         gmac = GMAC_READ_2(sc, sc_if->msk_port, GM_PHY_ADDR);
4099         GMAC_WRITE_2(sc, sc_if->msk_port, GM_PHY_ADDR, gmac | GM_PAR_MIB_CLR);
4100
4101         /* Rx stats. */
4102         stats->rx_ucast_frames +=
4103             MSK_READ_MIB32(sc_if->msk_port, GM_RXF_UC_OK);
4104         stats->rx_bcast_frames +=
4105             MSK_READ_MIB32(sc_if->msk_port, GM_RXF_BC_OK);
4106         stats->rx_pause_frames +=
4107             MSK_READ_MIB32(sc_if->msk_port, GM_RXF_MPAUSE);
4108         stats->rx_mcast_frames +=
4109             MSK_READ_MIB32(sc_if->msk_port, GM_RXF_MC_OK);
4110         stats->rx_crc_errs +=
4111             MSK_READ_MIB32(sc_if->msk_port, GM_RXF_FCS_ERR);
4112         reg = MSK_READ_MIB32(sc_if->msk_port, GM_RXF_SPARE1);
4113         stats->rx_good_octets +=
4114             MSK_READ_MIB64(sc_if->msk_port, GM_RXO_OK_LO);
4115         stats->rx_bad_octets +=
4116             MSK_READ_MIB64(sc_if->msk_port, GM_RXO_ERR_LO);
4117         stats->rx_runts +=
4118             MSK_READ_MIB32(sc_if->msk_port, GM_RXF_SHT);
4119         stats->rx_runt_errs +=
4120             MSK_READ_MIB32(sc_if->msk_port, GM_RXE_FRAG);
4121         stats->rx_pkts_64 +=
4122             MSK_READ_MIB32(sc_if->msk_port, GM_RXF_64B);
4123         stats->rx_pkts_65_127 +=
4124             MSK_READ_MIB32(sc_if->msk_port, GM_RXF_127B);
4125         stats->rx_pkts_128_255 +=
4126             MSK_READ_MIB32(sc_if->msk_port, GM_RXF_255B);
4127         stats->rx_pkts_256_511 +=
4128             MSK_READ_MIB32(sc_if->msk_port, GM_RXF_511B);
4129         stats->rx_pkts_512_1023 +=
4130             MSK_READ_MIB32(sc_if->msk_port, GM_RXF_1023B);
4131         stats->rx_pkts_1024_1518 +=
4132             MSK_READ_MIB32(sc_if->msk_port, GM_RXF_1518B);
4133         stats->rx_pkts_1519_max +=
4134             MSK_READ_MIB32(sc_if->msk_port, GM_RXF_MAX_SZ);
4135         stats->rx_pkts_too_long +=
4136             MSK_READ_MIB32(sc_if->msk_port, GM_RXF_LNG_ERR);
4137         stats->rx_pkts_jabbers +=
4138             MSK_READ_MIB32(sc_if->msk_port, GM_RXF_JAB_PKT);
4139         reg = MSK_READ_MIB32(sc_if->msk_port, GM_RXF_SPARE2);
4140         stats->rx_fifo_oflows +=
4141             MSK_READ_MIB32(sc_if->msk_port, GM_RXE_FIFO_OV);
4142         reg = MSK_READ_MIB32(sc_if->msk_port, GM_RXF_SPARE3);
4143
4144         /* Tx stats. */
4145         stats->tx_ucast_frames +=
4146             MSK_READ_MIB32(sc_if->msk_port, GM_TXF_UC_OK);
4147         stats->tx_bcast_frames +=
4148             MSK_READ_MIB32(sc_if->msk_port, GM_TXF_BC_OK);
4149         stats->tx_pause_frames +=
4150             MSK_READ_MIB32(sc_if->msk_port, GM_TXF_MPAUSE);
4151         stats->tx_mcast_frames +=
4152             MSK_READ_MIB32(sc_if->msk_port, GM_TXF_MC_OK);
4153         stats->tx_octets +=
4154             MSK_READ_MIB64(sc_if->msk_port, GM_TXO_OK_LO);
4155         stats->tx_pkts_64 +=
4156             MSK_READ_MIB32(sc_if->msk_port, GM_TXF_64B);
4157         stats->tx_pkts_65_127 +=
4158             MSK_READ_MIB32(sc_if->msk_port, GM_TXF_127B);
4159         stats->tx_pkts_128_255 +=
4160             MSK_READ_MIB32(sc_if->msk_port, GM_TXF_255B);
4161         stats->tx_pkts_256_511 +=
4162             MSK_READ_MIB32(sc_if->msk_port, GM_TXF_511B);
4163         stats->tx_pkts_512_1023 +=
4164             MSK_READ_MIB32(sc_if->msk_port, GM_TXF_1023B);
4165         stats->tx_pkts_1024_1518 +=
4166             MSK_READ_MIB32(sc_if->msk_port, GM_TXF_1518B);
4167         stats->tx_pkts_1519_max +=
4168             MSK_READ_MIB32(sc_if->msk_port, GM_TXF_MAX_SZ);
4169         reg = MSK_READ_MIB32(sc_if->msk_port, GM_TXF_SPARE1);
4170         stats->tx_colls +=
4171             MSK_READ_MIB32(sc_if->msk_port, GM_TXF_COL);
4172         stats->tx_late_colls +=
4173             MSK_READ_MIB32(sc_if->msk_port, GM_TXF_LAT_COL);
4174         stats->tx_excess_colls +=
4175             MSK_READ_MIB32(sc_if->msk_port, GM_TXF_ABO_COL);
4176         stats->tx_multi_colls +=
4177             MSK_READ_MIB32(sc_if->msk_port, GM_TXF_MUL_COL);
4178         stats->tx_single_colls +=
4179             MSK_READ_MIB32(sc_if->msk_port, GM_TXF_SNG_COL);
4180         stats->tx_underflows +=
4181             MSK_READ_MIB32(sc_if->msk_port, GM_TXE_FIFO_UR);
4182         /* Clear MIB Clear Counter Mode. */
4183         gmac &= ~GM_PAR_MIB_CLR;
4184         GMAC_WRITE_2(sc, sc_if->msk_port, GM_PHY_ADDR, gmac);
4185 }
4186
4187 static int
4188 msk_sysctl_stat32(SYSCTL_HANDLER_ARGS)
4189 {
4190         struct msk_softc *sc;
4191         struct msk_if_softc *sc_if;
4192         uint32_t result, *stat;
4193         int off;
4194
4195         sc_if = (struct msk_if_softc *)arg1;
4196         sc = sc_if->msk_softc;
4197         off = arg2;
4198         stat = (uint32_t *)((uint8_t *)&sc_if->msk_stats + off);
4199
4200         MSK_IF_LOCK(sc_if);
4201         result = MSK_READ_MIB32(sc_if->msk_port, GM_MIB_CNT_BASE + off * 2);
4202         result += *stat;
4203         MSK_IF_UNLOCK(sc_if);
4204
4205         return (sysctl_handle_int(oidp, &result, 0, req));
4206 }
4207
4208 static int
4209 msk_sysctl_stat64(SYSCTL_HANDLER_ARGS)
4210 {
4211         struct msk_softc *sc;
4212         struct msk_if_softc *sc_if;
4213         uint64_t result, *stat;
4214         int off;
4215
4216         sc_if = (struct msk_if_softc *)arg1;
4217         sc = sc_if->msk_softc;
4218         off = arg2;
4219         stat = (uint64_t *)((uint8_t *)&sc_if->msk_stats + off);
4220
4221         MSK_IF_LOCK(sc_if);
4222         result = MSK_READ_MIB64(sc_if->msk_port, GM_MIB_CNT_BASE + off * 2);
4223         result += *stat;
4224         MSK_IF_UNLOCK(sc_if);
4225
4226         return (sysctl_handle_quad(oidp, &result, 0, req));
4227 }
4228
4229 #undef MSK_READ_MIB32
4230 #undef MSK_READ_MIB64
4231
4232 #define MSK_SYSCTL_STAT32(sc, c, o, p, n, d)                            \
4233         SYSCTL_ADD_PROC(c, p, OID_AUTO, o, CTLTYPE_UINT | CTLFLAG_RD,   \
4234             sc, offsetof(struct msk_hw_stats, n), msk_sysctl_stat32,    \
4235             "IU", d)
4236 #define MSK_SYSCTL_STAT64(sc, c, o, p, n, d)                            \
4237         SYSCTL_ADD_PROC(c, p, OID_AUTO, o, CTLTYPE_UINT | CTLFLAG_RD,   \
4238             sc, offsetof(struct msk_hw_stats, n), msk_sysctl_stat64,    \
4239             "Q", d)
4240
4241 static void
4242 msk_sysctl_node(struct msk_if_softc *sc_if)
4243 {
4244         struct sysctl_ctx_list *ctx;
4245         struct sysctl_oid_list *child, *schild;
4246         struct sysctl_oid *tree;
4247
4248         ctx = device_get_sysctl_ctx(sc_if->msk_if_dev);
4249         child = SYSCTL_CHILDREN(device_get_sysctl_tree(sc_if->msk_if_dev));
4250
4251         tree = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats", CTLFLAG_RD,
4252             NULL, "MSK Statistics");
4253         schild = child = SYSCTL_CHILDREN(tree);
4254         tree = SYSCTL_ADD_NODE(ctx, schild, OID_AUTO, "rx", CTLFLAG_RD,
4255             NULL, "MSK RX Statistics");
4256         child = SYSCTL_CHILDREN(tree);
4257         MSK_SYSCTL_STAT32(sc_if, ctx, "ucast_frames",
4258             child, rx_ucast_frames, "Good unicast frames");
4259         MSK_SYSCTL_STAT32(sc_if, ctx, "bcast_frames",
4260             child, rx_bcast_frames, "Good broadcast frames");
4261         MSK_SYSCTL_STAT32(sc_if, ctx, "pause_frames",
4262             child, rx_pause_frames, "Pause frames");
4263         MSK_SYSCTL_STAT32(sc_if, ctx, "mcast_frames",
4264             child, rx_mcast_frames, "Multicast frames");
4265         MSK_SYSCTL_STAT32(sc_if, ctx, "crc_errs",
4266             child, rx_crc_errs, "CRC errors");
4267         MSK_SYSCTL_STAT64(sc_if, ctx, "good_octets",
4268             child, rx_good_octets, "Good octets");
4269         MSK_SYSCTL_STAT64(sc_if, ctx, "bad_octets",
4270             child, rx_bad_octets, "Bad octets");
4271         MSK_SYSCTL_STAT32(sc_if, ctx, "frames_64",
4272             child, rx_pkts_64, "64 bytes frames");
4273         MSK_SYSCTL_STAT32(sc_if, ctx, "frames_65_127",
4274             child, rx_pkts_65_127, "65 to 127 bytes frames");
4275         MSK_SYSCTL_STAT32(sc_if, ctx, "frames_128_255",
4276             child, rx_pkts_128_255, "128 to 255 bytes frames");
4277         MSK_SYSCTL_STAT32(sc_if, ctx, "frames_256_511",
4278             child, rx_pkts_256_511, "256 to 511 bytes frames");
4279         MSK_SYSCTL_STAT32(sc_if, ctx, "frames_512_1023",
4280             child, rx_pkts_512_1023, "512 to 1023 bytes frames");
4281         MSK_SYSCTL_STAT32(sc_if, ctx, "frames_1024_1518",
4282             child, rx_pkts_1024_1518, "1024 to 1518 bytes frames");
4283         MSK_SYSCTL_STAT32(sc_if, ctx, "frames_1519_max",
4284             child, rx_pkts_1519_max, "1519 to max frames");
4285         MSK_SYSCTL_STAT32(sc_if, ctx, "frames_too_long",
4286             child, rx_pkts_too_long, "frames too long");
4287         MSK_SYSCTL_STAT32(sc_if, ctx, "jabbers",
4288             child, rx_pkts_jabbers, "Jabber errors");
4289         MSK_SYSCTL_STAT32(sc_if, ctx, "overflows",
4290             child, rx_fifo_oflows, "FIFO overflows");
4291
4292         tree = SYSCTL_ADD_NODE(ctx, schild, OID_AUTO, "tx", CTLFLAG_RD,
4293             NULL, "MSK TX Statistics");
4294         child = SYSCTL_CHILDREN(tree);
4295         MSK_SYSCTL_STAT32(sc_if, ctx, "ucast_frames",
4296             child, tx_ucast_frames, "Unicast frames");
4297         MSK_SYSCTL_STAT32(sc_if, ctx, "bcast_frames",
4298             child, tx_bcast_frames, "Broadcast frames");
4299         MSK_SYSCTL_STAT32(sc_if, ctx, "pause_frames",
4300             child, tx_pause_frames, "Pause frames");
4301         MSK_SYSCTL_STAT32(sc_if, ctx, "mcast_frames",
4302             child, tx_mcast_frames, "Multicast frames");
4303         MSK_SYSCTL_STAT64(sc_if, ctx, "octets",
4304             child, tx_octets, "Octets");
4305         MSK_SYSCTL_STAT32(sc_if, ctx, "frames_64",
4306             child, tx_pkts_64, "64 bytes frames");
4307         MSK_SYSCTL_STAT32(sc_if, ctx, "frames_65_127",
4308             child, tx_pkts_65_127, "65 to 127 bytes frames");
4309         MSK_SYSCTL_STAT32(sc_if, ctx, "frames_128_255",
4310             child, tx_pkts_128_255, "128 to 255 bytes frames");
4311         MSK_SYSCTL_STAT32(sc_if, ctx, "frames_256_511",
4312             child, tx_pkts_256_511, "256 to 511 bytes frames");
4313         MSK_SYSCTL_STAT32(sc_if, ctx, "frames_512_1023",
4314             child, tx_pkts_512_1023, "512 to 1023 bytes frames");
4315         MSK_SYSCTL_STAT32(sc_if, ctx, "frames_1024_1518",
4316             child, tx_pkts_1024_1518, "1024 to 1518 bytes frames");
4317         MSK_SYSCTL_STAT32(sc_if, ctx, "frames_1519_max",
4318             child, tx_pkts_1519_max, "1519 to max frames");
4319         MSK_SYSCTL_STAT32(sc_if, ctx, "colls",
4320             child, tx_colls, "Collisions");
4321         MSK_SYSCTL_STAT32(sc_if, ctx, "late_colls",
4322             child, tx_late_colls, "Late collisions");
4323         MSK_SYSCTL_STAT32(sc_if, ctx, "excess_colls",
4324             child, tx_excess_colls, "Excessive collisions");
4325         MSK_SYSCTL_STAT32(sc_if, ctx, "multi_colls",
4326             child, tx_multi_colls, "Multiple collisions");
4327         MSK_SYSCTL_STAT32(sc_if, ctx, "single_colls",
4328             child, tx_single_colls, "Single collisions");
4329         MSK_SYSCTL_STAT32(sc_if, ctx, "underflows",
4330             child, tx_underflows, "FIFO underflows");
4331 }
4332
4333 #undef MSK_SYSCTL_STAT32
4334 #undef MSK_SYSCTL_STAT64
4335
4336 static int
4337 sysctl_int_range(SYSCTL_HANDLER_ARGS, int low, int high)
4338 {
4339         int error, value;
4340
4341         if (!arg1)
4342                 return (EINVAL);
4343         value = *(int *)arg1;
4344         error = sysctl_handle_int(oidp, &value, 0, req);
4345         if (error || !req->newptr)
4346                 return (error);
4347         if (value < low || value > high)
4348                 return (EINVAL);
4349         *(int *)arg1 = value;
4350
4351         return (0);
4352 }
4353
4354 static int
4355 sysctl_hw_msk_proc_limit(SYSCTL_HANDLER_ARGS)
4356 {
4357
4358         return (sysctl_int_range(oidp, arg1, arg2, req, MSK_PROC_MIN,
4359             MSK_PROC_MAX));
4360 }