]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/xe/if_xe.c
Add LLVM openmp trunk r351319 (just before the release_80 branch point)
[FreeBSD/FreeBSD.git] / sys / dev / xe / if_xe.c
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD AND BSD-3-Clause
3  *
4  * Copyright (c) 1998, 1999, 2003  Scott Mitchell
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 /*-
29  * Portions of this software were derived from Werner Koch's xirc2ps driver
30  * for Linux under the terms of the following license (from v1.30 of the
31  * xirc2ps driver):
32  *
33  * Copyright (c) 1997 by Werner Koch (dd9jn)
34  *
35  * Redistribution and use in source and binary forms, with or without
36  * modification, are permitted provided that the following conditions
37  * are met:
38  * 1. Redistributions of source code must retain the above copyright
39  *    notice, and the entire permission notice in its entirety,
40  *    including the disclaimer of warranties.
41  * 2. Redistributions in binary form must reproduce the above copyright
42  *    notice, this list of conditions and the following disclaimer in the
43  *    documentation and/or other materials provided with the distribution.
44  * 3. The name of the author may not be used to endorse or promote
45  *    products derived from this software without specific prior
46  *    written permission.
47  *
48  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
49  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
50  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
51  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
52  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
53  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
54  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
56  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
57  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
58  * OF THE POSSIBILITY OF SUCH DAMAGE.
59  */
60
61 #include <sys/cdefs.h>
62 __FBSDID("$FreeBSD$");
63
64 /*              
65  * FreeBSD device driver for Xircom CreditCard PCMCIA Ethernet adapters.  The
66  * following cards are currently known to work with the driver:
67  *   Xircom CreditCard 10/100 (CE3)
68  *   Xircom CreditCard Ethernet + Modem 28 (CEM28)
69  *   Xircom CreditCard Ethernet 10/100 + Modem 56 (CEM56)
70  *   Xircom RealPort Ethernet 10
71  *   Xircom RealPort Ethernet 10/100
72  *   Xircom RealPort Ethernet 10/100 + Modem 56 (REM56, REM56G)
73  *   Intel EtherExpress Pro/100 PC Card Mobile Adapter 16 (Pro/100 M16A)
74  *   Compaq Netelligent 10/100 PC Card (CPQ-10/100)
75  *
76  * Some other cards *should* work, but support for them is either broken or in 
77  * an unknown state at the moment.  I'm always interested in hearing from
78  * people who own any of these cards:
79  *   Xircom CreditCard 10Base-T (PS-CE2-10)
80  *   Xircom CreditCard Ethernet + ModemII (CEM2)
81  *   Xircom CEM28 and CEM33 Ethernet/Modem cards (may be variants of CEM2?)
82  *
83  * Thanks to all who assisted with the development and testing of the driver,
84  * especially: Werner Koch, Duke Kamstra, Duncan Barclay, Jason George, Dru
85  * Nelson, Mike Kephart, Bill Rainey and Douglas Rand.  Apologies if I've left
86  * out anyone who deserves a mention here.
87  *
88  * Special thanks to Ade Lovett for both hosting the mailing list and doing
89  * the CEM56/REM56 support code; and the FreeBSD UK Users' Group for hosting
90  * the web pages.
91  *
92  * Author email: <scott@uk.freebsd.org>
93  * Driver web page: http://ukug.uk.freebsd.org/~scott/xe_drv/
94  */
95
96
97 #include <sys/param.h>
98 #include <sys/cdefs.h>
99 #include <sys/errno.h>
100 #include <sys/kernel.h>
101 #include <sys/malloc.h>
102 #include <sys/mbuf.h>
103 #include <sys/socket.h>
104 #include <sys/sockio.h>
105 #include <sys/systm.h>
106 #include <sys/uio.h>
107 #include <sys/sysctl.h>
108
109 #include <sys/module.h>
110 #include <sys/bus.h>
111
112 #include <machine/bus.h>
113 #include <machine/resource.h>
114 #include <sys/rman.h>
115  
116 #include <net/ethernet.h>
117 #include <net/if.h>
118 #include <net/if_var.h>
119 #include <net/if_arp.h>
120 #include <net/if_dl.h>
121 #include <net/if_media.h>
122 #include <net/if_mib.h>
123 #include <net/bpf.h>
124 #include <net/if_types.h>
125
126 #include <dev/xe/if_xereg.h>
127 #include <dev/xe/if_xevar.h>
128
129 /*
130  * MII command structure
131  */
132 struct xe_mii_frame {
133         uint8_t         mii_stdelim;
134         uint8_t         mii_opcode;
135         uint8_t         mii_phyaddr;
136         uint8_t         mii_regaddr;
137         uint8_t         mii_turnaround;
138         uint16_t        mii_data;
139 };
140
141 /*
142  * Media autonegotiation progress constants
143  */
144 #define XE_AUTONEG_NONE         0       /* No autonegotiation in progress */
145 #define XE_AUTONEG_WAITING      1       /* Waiting for transmitter to go idle */
146 #define XE_AUTONEG_STARTED      2       /* Waiting for autonegotiation to complete */
147 #define XE_AUTONEG_100TX        3       /* Trying to force 100baseTX link */
148 #define XE_AUTONEG_FAIL         4       /* Autonegotiation failed */
149
150 /*
151  * Prototypes start here
152  */
153 static void     xe_init(void *xscp);
154 static void     xe_init_locked(struct xe_softc *scp);
155 static void     xe_start(struct ifnet *ifp);
156 static void     xe_start_locked(struct ifnet *ifp);
157 static int      xe_ioctl(struct ifnet *ifp, u_long command, caddr_t data);
158 static void     xe_watchdog(void *arg);
159 static void     xe_intr(void *xscp);
160 static void     xe_txintr(struct xe_softc *scp, uint8_t txst1);
161 static void     xe_macintr(struct xe_softc *scp, uint8_t rst0, uint8_t txst0,
162                     uint8_t txst1);
163 static void     xe_rxintr(struct xe_softc *scp, uint8_t rst0);
164 static int      xe_media_change(struct ifnet *ifp);
165 static void     xe_media_status(struct ifnet *ifp, struct ifmediareq *mrp);
166 static void     xe_setmedia(void *arg);
167 static void     xe_reset(struct xe_softc *scp);
168 static void     xe_enable_intr(struct xe_softc *scp);
169 static void     xe_disable_intr(struct xe_softc *scp);
170 static void     xe_set_multicast(struct xe_softc *scp);
171 static void     xe_set_addr(struct xe_softc *scp, uint8_t* addr, unsigned idx);
172 static void     xe_mchash(struct xe_softc *scp, const uint8_t *addr);
173 static int      xe_pio_write_packet(struct xe_softc *scp, struct mbuf *mbp);
174
175 /*
176  * MII functions
177  */
178 static void     xe_mii_sync(struct xe_softc *scp);
179 static int      xe_mii_init(struct xe_softc *scp);
180 static void     xe_mii_send(struct xe_softc *scp, uint32_t bits, int cnt);
181 static int      xe_mii_readreg(struct xe_softc *scp,
182                     struct xe_mii_frame *frame);
183 static int      xe_mii_writereg(struct xe_softc *scp,
184                     struct xe_mii_frame *frame);
185 static uint16_t xe_phy_readreg(struct xe_softc *scp, uint16_t reg);
186 static void     xe_phy_writereg(struct xe_softc *scp, uint16_t reg,
187                     uint16_t data);
188
189 /*
190  * Debugging functions
191  */
192 static void     xe_mii_dump(struct xe_softc *scp);
193 #if 0
194 static void     xe_reg_dump(struct xe_softc *scp);
195 #endif
196
197 /*
198  * Debug logging levels - set with hw.xe.debug sysctl
199  * 0 = None
200  * 1 = More hardware details, probe/attach progress
201  * 2 = Most function calls, ioctls and media selection progress
202  * 3 = Everything - interrupts, packets in/out and multicast address setup
203  */
204 #define XE_DEBUG
205 #ifdef XE_DEBUG
206
207 /* sysctl vars */
208 static SYSCTL_NODE(_hw, OID_AUTO, xe, CTLFLAG_RD, 0, "if_xe parameters");
209
210 int xe_debug = 0;
211 SYSCTL_INT(_hw_xe, OID_AUTO, debug, CTLFLAG_RW, &xe_debug, 0,
212     "if_xe debug level");
213
214 #define DEVPRINTF(level, arg)   if (xe_debug >= (level)) device_printf arg
215 #define DPRINTF(level, arg)     if (xe_debug >= (level)) printf arg
216 #define XE_MII_DUMP(scp)        if (xe_debug >= 3) xe_mii_dump(scp)
217 #if 0
218 #define XE_REG_DUMP(scp)        if (xe_debug >= 3) xe_reg_dump(scp)
219 #endif
220 #else
221 #define DEVPRINTF(level, arg)
222 #define DPRINTF(level, arg)
223 #define XE_MII_DUMP(scp)
224 #if 0
225 #define XE_REG_DUMP(scp)
226 #endif
227 #endif
228
229 /*
230  * Attach a device.
231  */
232 int
233 xe_attach(device_t dev)
234 {
235         struct xe_softc *scp = device_get_softc(dev);
236         int err;
237
238         DEVPRINTF(2, (dev, "attach\n"));
239
240         /* Initialise stuff... */
241         scp->dev = dev;
242         scp->ifp = if_alloc(IFT_ETHER);
243         if (scp->ifp == NULL)
244                 return (ENOSPC);
245         scp->ifm = &scp->ifmedia;
246         scp->autoneg_status = XE_AUTONEG_NONE;
247         mtx_init(&scp->lock, device_get_nameunit(dev), MTX_NETWORK_LOCK,
248             MTX_DEF);
249         callout_init_mtx(&scp->wdog_timer, &scp->lock, 0);
250
251         /* Initialise the ifnet structure */
252         scp->ifp->if_softc = scp;
253         if_initname(scp->ifp, device_get_name(dev), device_get_unit(dev));
254         scp->ifp->if_flags = (IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST);
255         scp->ifp->if_linkmib = &scp->mibdata;
256         scp->ifp->if_linkmiblen = sizeof(scp->mibdata);
257         scp->ifp->if_start = xe_start;
258         scp->ifp->if_ioctl = xe_ioctl;
259         scp->ifp->if_init = xe_init;
260         scp->ifp->if_baudrate = 100000000;
261         IFQ_SET_MAXLEN(&scp->ifp->if_snd, ifqmaxlen);
262
263         /* Initialise the ifmedia structure */
264         ifmedia_init(scp->ifm, 0, xe_media_change, xe_media_status);
265         callout_init_mtx(&scp->media_timer, &scp->lock, 0);
266
267         /* Add supported media types */
268         if (scp->mohawk) {
269                 ifmedia_add(scp->ifm, IFM_ETHER|IFM_100_TX, 0, NULL);
270                 ifmedia_add(scp->ifm, IFM_ETHER|IFM_10_T|IFM_FDX, 0, NULL);
271                 ifmedia_add(scp->ifm, IFM_ETHER|IFM_10_T|IFM_HDX, 0, NULL);
272         }
273         ifmedia_add(scp->ifm, IFM_ETHER|IFM_10_T, 0, NULL);
274         if (scp->ce2)
275                 ifmedia_add(scp->ifm, IFM_ETHER|IFM_10_2, 0, NULL);
276         ifmedia_add(scp->ifm, IFM_ETHER|IFM_AUTO, 0, NULL);
277
278         /* Default is to autoselect best supported media type */
279         ifmedia_set(scp->ifm, IFM_ETHER|IFM_AUTO);
280
281         /* Get the hardware into a known state */
282         XE_LOCK(scp);
283         xe_reset(scp);
284         XE_UNLOCK(scp);
285
286         /* Get hardware version numbers */
287         XE_SELECT_PAGE(4);
288         scp->version = XE_INB(XE_BOV);
289         if (scp->mohawk)
290                 scp->srev = (XE_INB(XE_BOV) & 0x70) >> 4;
291         else
292                 scp->srev = (XE_INB(XE_BOV) & 0x30) >> 4;
293
294         /* Print some useful information */
295         device_printf(dev, "version 0x%02x/0x%02x%s%s\n", scp->version,
296             scp->srev, scp->mohawk ? ", 100Mbps capable" : "",
297             scp->modem ?  ", with modem" : "");
298         if (scp->mohawk) {
299                 XE_SELECT_PAGE(0x10);
300                 DEVPRINTF(1, (dev,
301                     "DingoID=0x%04x, RevisionID=0x%04x, VendorID=0x%04x\n",
302                     XE_INW(XE_DINGOID), XE_INW(XE_RevID), XE_INW(XE_VendorID)));
303         }
304         if (scp->ce2) {
305                 XE_SELECT_PAGE(0x45);
306                 DEVPRINTF(1, (dev, "CE2 version = 0x%02x\n", XE_INB(XE_REV)));
307         }
308
309         /* Attach the interface */
310         ether_ifattach(scp->ifp, scp->enaddr);
311
312         err = bus_setup_intr(dev, scp->irq_res, INTR_TYPE_NET | INTR_MPSAFE,
313             NULL, xe_intr, scp, &scp->intrhand);
314         if (err) {
315                 ether_ifdetach(scp->ifp);
316                 mtx_destroy(&scp->lock);
317                 return (err);
318         }
319
320         gone_by_fcp101_dev(dev);
321
322         /* Done */
323         return (0);
324 }
325
326 /*
327  * Complete hardware intitialisation and enable output.  Exits without doing
328  * anything if there's no address assigned to the card, or if media selection
329  * is in progress (the latter implies we've already run this function).
330  */
331 static void
332 xe_init(void *xscp)
333 {
334         struct xe_softc *scp = xscp;
335
336         XE_LOCK(scp);
337         xe_init_locked(scp);
338         XE_UNLOCK(scp);
339 }
340
341 static void
342 xe_init_locked(struct xe_softc *scp)
343 {
344         unsigned i;
345
346         if (scp->autoneg_status != XE_AUTONEG_NONE)
347                 return;
348
349         DEVPRINTF(2, (scp->dev, "init\n"));
350
351         /* Reset transmitter flags */
352         scp->tx_queued = 0;
353         scp->tx_tpr = 0;
354         scp->tx_timeouts = 0;
355         scp->tx_thres = 64;
356         scp->tx_min = ETHER_MIN_LEN - ETHER_CRC_LEN;
357         scp->tx_timeout = 0;
358
359         /* Soft reset the card */
360         XE_SELECT_PAGE(0);
361         XE_OUTB(XE_CR, XE_CR_SOFT_RESET);
362         DELAY(40000);
363         XE_OUTB(XE_CR, 0);
364         DELAY(40000);
365
366         if (scp->mohawk) {
367                 /*
368                  * set GP1 and GP2 as outputs (bits 2 & 3)
369                  * set GP1 low to power on the ML6692 (bit 0)
370                  * set GP2 high to power on the 10Mhz chip (bit 1)
371                  */
372                 XE_SELECT_PAGE(4);
373                 XE_OUTB(XE_GPR0, XE_GPR0_GP2_SELECT | XE_GPR0_GP1_SELECT |
374                     XE_GPR0_GP2_OUT);
375         }
376
377         /* Shut off interrupts */
378         xe_disable_intr(scp);
379
380         /* Wait for everything to wake up */
381         DELAY(500000);
382
383         /* Check for PHY */
384         if (scp->mohawk)
385                 scp->phy_ok = xe_mii_init(scp);
386
387         /* Disable 'source insertion' (not sure what that means) */
388         XE_SELECT_PAGE(0x42);
389         XE_OUTB(XE_SWC0, XE_SWC0_NO_SRC_INSERT);
390
391         /* Set 8K/24K Tx/Rx buffer split */
392         if (scp->srev != 1) {
393                 XE_SELECT_PAGE(2);
394                 XE_OUTW(XE_RBS, 0x2000);
395         }
396
397         /* Enable early transmit mode on Mohawk/Dingo */
398         if (scp->mohawk) {
399                 XE_SELECT_PAGE(0x03);
400                 XE_OUTW(XE_TPT, scp->tx_thres);
401                 XE_SELECT_PAGE(0x01);
402                 XE_OUTB(XE_ECR, XE_INB(XE_ECR) | XE_ECR_EARLY_TX);
403         }
404
405         /* Put MAC address in first 'individual address' register */
406         XE_SELECT_PAGE(0x50);
407         for (i = 0; i < ETHER_ADDR_LEN; i++)
408                 XE_OUTB(0x08 + i, IF_LLADDR(scp->ifp)[scp->mohawk ? 5 - i : i]);
409
410         /* Set up multicast addresses */
411         xe_set_multicast(scp);
412
413         /* Fix the receive data offset -- reset can leave it off-by-one */
414         XE_SELECT_PAGE(0);
415         XE_OUTW(XE_DO, 0x2000);
416
417         /* Set interrupt masks */
418         XE_SELECT_PAGE(1);
419         XE_OUTB(XE_IMR0, XE_IMR0_TX_PACKET | XE_IMR0_MAC_INTR |
420             XE_IMR0_RX_PACKET);
421
422         /* Set MAC interrupt masks */
423         XE_SELECT_PAGE(0x40);
424         XE_OUTB(XE_RX0Msk,
425             ~(XE_RX0M_RX_OVERRUN | XE_RX0M_CRC_ERROR | XE_RX0M_ALIGN_ERROR |
426             XE_RX0M_LONG_PACKET));
427         XE_OUTB(XE_TX0Msk,
428             ~(XE_TX0M_SQE_FAIL | XE_TX0M_LATE_COLLISION | XE_TX0M_TX_UNDERRUN |
429             XE_TX0M_16_COLLISIONS | XE_TX0M_NO_CARRIER));
430
431         /* Clear MAC status registers */
432         XE_SELECT_PAGE(0x40);
433         XE_OUTB(XE_RST0, 0x00);
434         XE_OUTB(XE_TXST0, 0x00);
435
436         /* Enable receiver and put MAC online */
437         XE_SELECT_PAGE(0x40);
438         XE_OUTB(XE_CMD0, XE_CMD0_RX_ENABLE|XE_CMD0_ONLINE);
439
440         /* Set up IMR, enable interrupts */
441         xe_enable_intr(scp);
442
443         /* Start media selection */
444         xe_setmedia(scp);
445
446         /* Enable output */
447         scp->ifp->if_drv_flags |= IFF_DRV_RUNNING;
448         scp->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
449         callout_reset(&scp->wdog_timer, hz, xe_watchdog, scp);
450 }
451
452 /*
453  * Start output on interface.  Should be called at splimp() priority.  Check
454  * that the output is idle (ie, IFF_DRV_OACTIVE is not set) before calling this
455  * function.  If media selection is in progress we set IFF_DRV_OACTIVE ourselves
456  * and return immediately.
457  */
458 static void
459 xe_start(struct ifnet *ifp)
460 {
461         struct xe_softc *scp = ifp->if_softc;
462
463         XE_LOCK(scp);
464         xe_start_locked(ifp);
465         XE_UNLOCK(scp);
466 }
467
468 static void
469 xe_start_locked(struct ifnet *ifp)
470 {
471         struct xe_softc *scp = ifp->if_softc;
472         struct mbuf *mbp;
473
474         if (scp->autoneg_status != XE_AUTONEG_NONE) {
475                 ifp->if_drv_flags |= IFF_DRV_OACTIVE;
476                 return;
477         }
478
479         DEVPRINTF(3, (scp->dev, "start\n"));
480
481         /*
482          * Loop while there are packets to be sent, and space to send
483          * them.
484          */
485         for (;;) {
486                 /* Suck a packet off the send queue */
487                 IF_DEQUEUE(&ifp->if_snd, mbp);
488
489                 if (mbp == NULL) {
490                         /*
491                          * We are using the !OACTIVE flag to indicate
492                          * to the outside world that we can accept an
493                          * additional packet rather than that the
494                          * transmitter is _actually_ active. Indeed,
495                          * the transmitter may be active, but if we
496                          * haven't filled all the buffers with data
497                          * then we still want to accept more.
498                          */
499                         ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
500                         return;
501                 }
502
503                 if (xe_pio_write_packet(scp, mbp) != 0) {
504                         /* Push the packet back onto the queue */
505                         IF_PREPEND(&ifp->if_snd, mbp);
506                         ifp->if_drv_flags |= IFF_DRV_OACTIVE;
507                         return;
508                 }
509
510                 /* Tap off here if there is a bpf listener */
511                 BPF_MTAP(ifp, mbp);
512
513                 /* In case we don't hear from the card again... */
514                 scp->tx_timeout = 5;
515                 scp->tx_queued++;
516
517                 m_freem(mbp);
518         }
519 }
520
521 /*
522  * Process an ioctl request.  Adapted from the ed driver.
523  */
524 static int
525 xe_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
526 {
527         struct xe_softc *scp;
528         int error;
529
530         scp = ifp->if_softc;
531         error = 0;
532
533         switch (command) {
534         case SIOCSIFFLAGS:
535                 DEVPRINTF(2, (scp->dev, "ioctl: SIOCSIFFLAGS: 0x%04x\n",
536                         ifp->if_flags));
537                 /*
538                  * If the interface is marked up and stopped, then
539                  * start it.  If it is marked down and running, then
540                  * stop it.
541                  */
542                 XE_LOCK(scp);
543                 if (ifp->if_flags & IFF_UP) {
544                         if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
545                                 xe_reset(scp);
546                                 xe_init_locked(scp);
547                         }
548                 } else {
549                         if (ifp->if_drv_flags & IFF_DRV_RUNNING)
550                                 xe_stop(scp);
551                 }
552
553                 /* handle changes to PROMISC/ALLMULTI flags */
554                 xe_set_multicast(scp);
555                 XE_UNLOCK(scp);
556                 error = 0;
557                 break;
558         case SIOCADDMULTI:
559         case SIOCDELMULTI:
560                 DEVPRINTF(2, (scp->dev, "ioctl: SIOC{ADD,DEL}MULTI\n"));
561                 /*
562                  * Multicast list has (maybe) changed; set the
563                  * hardware filters accordingly.
564                  */
565                 XE_LOCK(scp);
566                 xe_set_multicast(scp);
567                 XE_UNLOCK(scp);
568                 error = 0;
569                 break;
570         case SIOCSIFMEDIA:
571         case SIOCGIFMEDIA:
572                 DEVPRINTF(3, (scp->dev, "ioctl: bounce to ifmedia_ioctl\n"));
573                 /*
574                  * Someone wants to get/set media options.
575                  */
576                 error = ifmedia_ioctl(ifp, (struct ifreq *)data, &scp->ifmedia,
577                     command);
578                 break;
579         default:
580                 DEVPRINTF(3, (scp->dev, "ioctl: bounce to ether_ioctl\n"));
581                 error = ether_ioctl(ifp, command, data);
582         }
583
584         return (error);
585 }
586
587 /*
588  * Card interrupt handler.
589  *
590  * This function is probably more complicated than it needs to be, as it
591  * attempts to deal with the case where multiple packets get sent between
592  * interrupts.  This is especially annoying when working out the collision
593  * stats.  Not sure whether this case ever really happens or not (maybe on a
594  * slow/heavily loaded machine?) so it's probably best to leave this like it
595  * is.
596  *
597  * Note that the crappy PIO used to get packets on and off the card means that 
598  * you will spend a lot of time in this routine -- I can get my P150 to spend
599  * 90% of its time servicing interrupts if I really hammer the network.  Could 
600  * fix this, but then you'd start dropping/losing packets.  The moral of this
601  * story?  If you want good network performance _and_ some cycles left over to 
602  * get your work done, don't buy a Xircom card.  Or convince them to tell me
603  * how to do memory-mapped I/O :)
604  */
605 static void
606 xe_txintr(struct xe_softc *scp, uint8_t txst1)
607 {
608         struct ifnet *ifp;
609         uint8_t tpr, sent, coll;
610
611         ifp = scp->ifp;
612
613         /* Update packet count, accounting for rollover */
614         tpr = XE_INB(XE_TPR);
615         sent = -scp->tx_tpr + tpr;
616
617         /* Update statistics if we actually sent anything */
618         if (sent > 0) {
619                 coll = txst1 & XE_TXST1_RETRY_COUNT;
620                 scp->tx_tpr = tpr;
621                 scp->tx_queued -= sent;
622                 if_inc_counter(ifp, IFCOUNTER_OPACKETS, sent);
623                 if_inc_counter(ifp, IFCOUNTER_COLLISIONS, coll);
624
625                 /*
626                  * According to the Xircom manual, Dingo will
627                  * sometimes manage to transmit a packet with
628                  * triggering an interrupt.  If this happens, we have
629                  * sent > 1 and the collision count only reflects
630                  * collisions on the last packet sent (the one that
631                  * triggered the interrupt).  Collision stats might
632                  * therefore be a bit low, but there doesn't seem to
633                  * be anything we can do about that.
634                  */
635                 switch (coll) {
636                 case 0:
637                         break;
638                 case 1:
639                         scp->mibdata.dot3StatsSingleCollisionFrames++;
640                         scp->mibdata.dot3StatsCollFrequencies[0]++;
641                         break;
642                 default:
643                         scp->mibdata.dot3StatsMultipleCollisionFrames++;
644                         scp->mibdata.dot3StatsCollFrequencies[coll-1]++;
645                 }
646         }
647         scp->tx_timeout = 0;
648         ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
649 }
650
651 /* Handle most MAC interrupts */
652 static void
653 xe_macintr(struct xe_softc *scp, uint8_t rst0, uint8_t txst0, uint8_t txst1)
654 {
655         struct ifnet *ifp;
656
657         ifp = scp->ifp;
658
659 #if 0
660         /* Carrier sense lost -- only in 10Mbit HDX mode */
661         if (txst0 & XE_TXST0_NO_CARRIER || !(txst1 & XE_TXST1_LINK_STATUS)) {
662                 /* XXX - Need to update media status here */
663                 device_printf(scp->dev, "no carrier\n");
664                 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
665                 scp->mibdata.dot3StatsCarrierSenseErrors++;
666         }
667 #endif
668         /* Excessive collisions -- try sending again */
669         if (txst0 & XE_TXST0_16_COLLISIONS) {
670                 if_inc_counter(ifp, IFCOUNTER_COLLISIONS, 16);
671                 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
672                 scp->mibdata.dot3StatsExcessiveCollisions++;
673                 scp->mibdata.dot3StatsMultipleCollisionFrames++;
674                 scp->mibdata.dot3StatsCollFrequencies[15]++;
675                 XE_OUTB(XE_CR, XE_CR_RESTART_TX);
676         }
677
678         /* Transmit underrun -- increase early transmit threshold */
679         if (txst0 & XE_TXST0_TX_UNDERRUN && scp->mohawk) {
680                 DEVPRINTF(1, (scp->dev, "transmit underrun"));
681                 if (scp->tx_thres < ETHER_MAX_LEN) {
682                         if ((scp->tx_thres += 64) > ETHER_MAX_LEN)
683                                 scp->tx_thres = ETHER_MAX_LEN;
684                         DPRINTF(1, (": increasing transmit threshold to %u",
685                             scp->tx_thres));
686                         XE_SELECT_PAGE(0x3);
687                         XE_OUTW(XE_TPT, scp->tx_thres);
688                         XE_SELECT_PAGE(0x0);
689                 }
690                 DPRINTF(1, ("\n"));
691                 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
692                 scp->mibdata.dot3StatsInternalMacTransmitErrors++;
693         }
694
695         /* Late collision -- just complain about it */
696         if (txst0 & XE_TXST0_LATE_COLLISION) {
697                 device_printf(scp->dev, "late collision\n");
698                 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
699                 scp->mibdata.dot3StatsLateCollisions++;
700         }
701
702         /* SQE test failure -- just complain about it */
703         if (txst0 & XE_TXST0_SQE_FAIL) {
704                 device_printf(scp->dev, "SQE test failure\n");
705                 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
706                 scp->mibdata.dot3StatsSQETestErrors++;
707         }
708
709         /* Packet too long -- what happens to these */
710         if (rst0 & XE_RST0_LONG_PACKET) {
711                 device_printf(scp->dev, "received giant packet\n");
712                 if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
713                 scp->mibdata.dot3StatsFrameTooLongs++;
714         }
715
716         /* CRC error -- packet dropped */
717         if (rst0 & XE_RST0_CRC_ERROR) {
718                 device_printf(scp->dev, "CRC error\n");
719                 if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
720                 scp->mibdata.dot3StatsFCSErrors++;
721         }
722 }
723
724 static void
725 xe_rxintr(struct xe_softc *scp, uint8_t rst0)
726 {
727         struct ifnet *ifp;
728         uint8_t esr, rsr;
729
730         ifp = scp->ifp;
731
732         /* Handle received packet(s) */
733         while ((esr = XE_INB(XE_ESR)) & XE_ESR_FULL_PACKET_RX) {
734                 rsr = XE_INB(XE_RSR);
735
736                 DEVPRINTF(3, (scp->dev, "intr: ESR=0x%02x, RSR=0x%02x\n", esr,
737                     rsr));
738
739                 /* Make sure packet is a good one */
740                 if (rsr & XE_RSR_RX_OK) {
741                         struct ether_header *ehp;
742                         struct mbuf *mbp;
743                         uint16_t len;
744
745                         len = XE_INW(XE_RBC) - ETHER_CRC_LEN;
746
747                         DEVPRINTF(3, (scp->dev, "intr: receive length = %d\n",
748                             len));
749
750                         if (len == 0) {
751                                 if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1);
752                                 continue;
753                         }
754
755                         /*
756                          * Allocate mbuf to hold received packet.  If
757                          * the mbuf header isn't big enough, we attach
758                          * an mbuf cluster to hold the packet.  Note
759                          * the +=2 to align the packet data on a
760                          * 32-bit boundary, and the +3 to allow for
761                          * the possibility of reading one more byte
762                          * than the actual packet length (we always
763                          * read 16-bit words).  XXX - Surely there's a
764                          * better way to do this alignment?
765                          */
766                         MGETHDR(mbp, M_NOWAIT, MT_DATA);
767                         if (mbp == NULL) {
768                                 if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1);
769                                 continue;
770                         }
771
772                         if (len + 3 > MHLEN) {
773                                 if (!(MCLGET(mbp, M_NOWAIT))) {
774                                         m_freem(mbp);
775                                         if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1);
776                                         continue;
777                                 }
778                         }
779
780                         mbp->m_data += 2;
781                         ehp = mtod(mbp, struct ether_header *);
782
783                         /*
784                          * Now get the packet in PIO mode, including
785                          * the Ethernet header but omitting the
786                          * trailing CRC.
787                          */
788
789                         /*
790                          * Work around a bug in CE2 cards.  There
791                          * seems to be a problem with duplicated and
792                          * extraneous bytes in the receive buffer, but
793                          * without any real documentation for the CE2
794                          * it's hard to tell for sure.  XXX - Needs
795                          * testing on CE2 hardware
796                          */
797                         if (scp->srev == 0) {
798                                 u_short rhs;
799
800                                 XE_SELECT_PAGE(5);
801                                 rhs = XE_INW(XE_RHSA);
802                                 XE_SELECT_PAGE(0);
803
804                                 rhs += 3;        /* Skip control info */
805
806                                 if (rhs >= 0x8000)
807                                         rhs = 0;
808
809                                 if (rhs + len > 0x8000) {
810                                         int i;
811
812                                         for (i = 0; i < len; i++, rhs++) {
813                                                 ((char *)ehp)[i] =
814                                                     XE_INB(XE_EDP);
815                                                 if (rhs == 0x8000) {
816                                                         rhs = 0;
817                                                         i--;
818                                                 }
819                                         }
820                                 } else
821                                         bus_read_multi_2(scp->port_res, XE_EDP, 
822                                             (uint16_t *)ehp, (len + 1) >> 1);
823                         } else
824                                 bus_read_multi_2(scp->port_res, XE_EDP, 
825                                     (uint16_t *)ehp, (len + 1) >> 1);
826
827                         /* Deliver packet to upper layers */
828                         mbp->m_pkthdr.rcvif = ifp;
829                         mbp->m_pkthdr.len = mbp->m_len = len;
830                         XE_UNLOCK(scp);
831                         (*ifp->if_input)(ifp, mbp);
832                         XE_LOCK(scp);
833                         if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
834
835                 } else if (rsr & XE_RSR_ALIGN_ERROR) {
836                         /* Packet alignment error -- drop packet */
837                         device_printf(scp->dev, "alignment error\n");
838                         scp->mibdata.dot3StatsAlignmentErrors++;
839                         if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
840                 }
841
842                 /* Skip to next packet, if there is one */
843                 XE_OUTW(XE_DO, 0x8000);
844         }
845
846         /* Clear receiver overruns now we have some free buffer space */
847         if (rst0 & XE_RST0_RX_OVERRUN) {
848                 DEVPRINTF(1, (scp->dev, "receive overrun\n"));
849                 if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
850                 scp->mibdata.dot3StatsInternalMacReceiveErrors++;
851                 XE_OUTB(XE_CR, XE_CR_CLEAR_OVERRUN);
852         }
853 }
854
855 static void
856 xe_intr(void *xscp)
857 {
858         struct xe_softc *scp = (struct xe_softc *) xscp;
859         struct ifnet *ifp;
860         uint8_t psr, isr, rst0, txst0, txst1;
861
862         ifp = scp->ifp;
863         XE_LOCK(scp);
864
865         /* Disable interrupts */
866         if (scp->mohawk)
867                 XE_OUTB(XE_CR, 0);
868
869         /* Cache current register page */
870         psr = XE_INB(XE_PR);
871
872         /* Read ISR to see what caused this interrupt */
873         while ((isr = XE_INB(XE_ISR)) != 0) {
874
875                 /* 0xff might mean the card is no longer around */
876                 if (isr == 0xff) {
877                         DEVPRINTF(3, (scp->dev,
878                             "intr: interrupt received for missing card?\n"));
879                         break;
880                 }
881
882                 /* Read other status registers */
883                 XE_SELECT_PAGE(0x40);
884                 rst0 = XE_INB(XE_RST0);
885                 XE_OUTB(XE_RST0, 0);
886                 txst0 = XE_INB(XE_TXST0);
887                 txst1 = XE_INB(XE_TXST1);
888                 XE_OUTB(XE_TXST0, 0);
889                 XE_OUTB(XE_TXST1, 0);
890                 XE_SELECT_PAGE(0);
891
892                 DEVPRINTF(3, (scp->dev,
893                     "intr: ISR=0x%02x, RST=0x%02x, TXT=0x%02x%02x\n", isr,
894                     rst0, txst1, txst0));
895
896                 if (isr & XE_ISR_TX_PACKET)
897                         xe_txintr(scp, txst1);
898
899                 if (isr & XE_ISR_MAC_INTR)
900                         xe_macintr(scp, rst0, txst0, txst1);
901
902                 xe_rxintr(scp, rst0);
903         }
904
905         /* Restore saved page */
906         XE_SELECT_PAGE(psr);
907
908         /* Re-enable interrupts */
909         XE_OUTB(XE_CR, XE_CR_ENABLE_INTR);
910
911         XE_UNLOCK(scp);
912 }
913
914 /*
915  * Device timeout/watchdog routine.  Called automatically if we queue a packet 
916  * for transmission but don't get an interrupt within a specified timeout
917  * (usually 5 seconds).  When this happens we assume the worst and reset the
918  * card.
919  */
920 static void
921 xe_watchdog(void *arg)
922 {
923         struct xe_softc *scp = arg;
924
925         XE_ASSERT_LOCKED(scp);
926
927         if (scp->tx_timeout && --scp->tx_timeout == 0) {
928                 device_printf(scp->dev, "watchdog timeout: resetting card\n");
929                 scp->tx_timeouts++;
930                 if_inc_counter(scp->ifp, IFCOUNTER_OERRORS, scp->tx_queued);
931                 xe_stop(scp);
932                 xe_reset(scp);
933                 xe_init_locked(scp);
934         }
935         callout_reset(&scp->wdog_timer, hz, xe_watchdog, scp);
936 }
937
938 /*
939  * Change media selection.
940  */
941 static int
942 xe_media_change(struct ifnet *ifp)
943 {
944         struct xe_softc *scp = ifp->if_softc;
945
946         DEVPRINTF(2, (scp->dev, "media_change\n"));
947
948         XE_LOCK(scp);
949         if (IFM_TYPE(scp->ifm->ifm_media) != IFM_ETHER) {
950                 XE_UNLOCK(scp);
951                 return(EINVAL);
952         }
953
954         /*
955          * Some card/media combos aren't always possible -- filter
956          * those out here.
957          */
958         if ((IFM_SUBTYPE(scp->ifm->ifm_media) == IFM_AUTO ||
959             IFM_SUBTYPE(scp->ifm->ifm_media) == IFM_100_TX) && !scp->phy_ok) {
960                 XE_UNLOCK(scp);
961                 return (EINVAL);
962         }
963
964         xe_setmedia(scp);
965         XE_UNLOCK(scp);
966
967         return (0);
968 }
969
970 /*
971  * Return current media selection.
972  */
973 static void
974 xe_media_status(struct ifnet *ifp, struct ifmediareq *mrp)
975 {
976         struct xe_softc *scp = ifp->if_softc;
977
978         DEVPRINTF(3, (scp->dev, "media_status\n"));
979
980         /* XXX - This is clearly wrong.  Will fix once I have CE2 working */
981         XE_LOCK(scp);
982         mrp->ifm_status = IFM_AVALID | IFM_ACTIVE;
983         mrp->ifm_active = ((struct xe_softc *)ifp->if_softc)->media;
984         XE_UNLOCK(scp);
985 }
986
987 /*
988  * Select active media.
989  */
990 static void
991 xe_setmedia(void *xscp)
992 {
993         struct xe_softc *scp = xscp;
994         uint16_t bmcr, bmsr, anar, lpar;
995
996         DEVPRINTF(2, (scp->dev, "setmedia\n"));
997
998         XE_ASSERT_LOCKED(scp);
999
1000         /* Cancel any pending timeout */
1001         callout_stop(&scp->media_timer);
1002         xe_disable_intr(scp);
1003
1004         /* Select media */
1005         scp->media = IFM_ETHER;
1006         switch (IFM_SUBTYPE(scp->ifm->ifm_media)) {
1007
1008         case IFM_AUTO:  /* Autoselect media */
1009                 scp->media = IFM_ETHER|IFM_AUTO;
1010
1011                 /*
1012                  * Autoselection is really awful.  It goes something like this:
1013                  *
1014                  * Wait until the transmitter goes idle (2sec timeout).
1015                  * Reset card
1016                  *   IF a 100Mbit PHY exists
1017                  *     Start NWAY autonegotiation (3.5sec timeout)
1018                  *     IF that succeeds
1019                  *       Select 100baseTX or 10baseT, whichever was detected
1020                  *     ELSE
1021                  *       Reset card
1022                  *       IF a 100Mbit PHY exists
1023                  *         Try to force a 100baseTX link (3sec timeout)
1024                  *         IF that succeeds
1025                  *           Select 100baseTX
1026                  *         ELSE
1027                  *           Disable the PHY
1028                  *         ENDIF
1029                  *       ENDIF
1030                  *     ENDIF
1031                  *   ENDIF
1032                  * IF nothing selected so far
1033                  *   IF a 100Mbit PHY exists
1034                  *     Select 10baseT
1035                  *   ELSE
1036                  *     Select 10baseT or 10base2, whichever is connected
1037                  *   ENDIF
1038                  * ENDIF
1039                  */
1040                 switch (scp->autoneg_status) {
1041                 case XE_AUTONEG_NONE:
1042                         DEVPRINTF(2, (scp->dev,
1043                             "Waiting for idle transmitter\n"));
1044                         scp->ifp->if_drv_flags |= IFF_DRV_OACTIVE;
1045                         scp->autoneg_status = XE_AUTONEG_WAITING;
1046                         /* FALL THROUGH */
1047                 case XE_AUTONEG_WAITING:
1048                         if (scp->tx_queued != 0) {
1049                                 callout_reset(&scp->media_timer, hz / 2,
1050                                     xe_setmedia, scp);
1051                                 return;
1052                         }
1053                         if (scp->phy_ok) {
1054                                 DEVPRINTF(2, (scp->dev,
1055                                         "Starting autonegotiation\n"));
1056                                 bmcr = xe_phy_readreg(scp, PHY_BMCR);
1057                                 bmcr &= ~(PHY_BMCR_AUTONEGENBL);
1058                                 xe_phy_writereg(scp, PHY_BMCR, bmcr);
1059                                 anar = xe_phy_readreg(scp, PHY_ANAR);
1060                                 anar &= ~(PHY_ANAR_100BT4 |
1061                                     PHY_ANAR_100BTXFULL | PHY_ANAR_10BTFULL);
1062                                 anar |= PHY_ANAR_100BTXHALF | PHY_ANAR_10BTHALF;
1063                                 xe_phy_writereg(scp, PHY_ANAR, anar);
1064                                 bmcr |= PHY_BMCR_AUTONEGENBL |
1065                                     PHY_BMCR_AUTONEGRSTR;
1066                                 xe_phy_writereg(scp, PHY_BMCR, bmcr);
1067                                 scp->autoneg_status = XE_AUTONEG_STARTED;
1068                                 callout_reset(&scp->media_timer, hz * 7/2,
1069                                     xe_setmedia, scp);
1070                                 return;
1071                         } else {
1072                                 scp->autoneg_status = XE_AUTONEG_FAIL;
1073                         }
1074                         break;
1075                 case XE_AUTONEG_STARTED:
1076                         bmsr = xe_phy_readreg(scp, PHY_BMSR);
1077                         lpar = xe_phy_readreg(scp, PHY_LPAR);
1078                         if (bmsr & (PHY_BMSR_AUTONEGCOMP | PHY_BMSR_LINKSTAT)) {
1079                                 DEVPRINTF(2, (scp->dev,
1080                                     "Autonegotiation complete!\n"));
1081
1082                                 /*
1083                                  * XXX - Shouldn't have to do this,
1084                                  * but (on my hub at least) the
1085                                  * transmitter won't work after a
1086                                  * successful autoneg.  So we see what
1087                                  * the negotiation result was and
1088                                  * force that mode.  I'm sure there is
1089                                  * an easy fix for this.
1090                                  */
1091                                 if (lpar & PHY_LPAR_100BTXHALF) {
1092                                         xe_phy_writereg(scp, PHY_BMCR,
1093                                             PHY_BMCR_SPEEDSEL);
1094                                         XE_MII_DUMP(scp);
1095                                         XE_SELECT_PAGE(2);
1096                                         XE_OUTB(XE_MSR, XE_INB(XE_MSR) | 0x08);
1097                                         scp->media = IFM_ETHER | IFM_100_TX;
1098                                         scp->autoneg_status = XE_AUTONEG_NONE;
1099                                 } else {
1100                                         /*
1101                                          * XXX - Bit of a hack going
1102                                          * on in here.  This is
1103                                          * derived from Ken Hughes
1104                                          * patch to the Linux driver
1105                                          * to make it work with 10Mbit
1106                                          * _autonegotiated_ links on
1107                                          * CE3B cards.  What's a CE3B
1108                                          * and how's it differ from a
1109                                          * plain CE3?  these are the
1110                                          * things we need to find out.
1111                                          */
1112                                         xe_phy_writereg(scp, PHY_BMCR, 0x0000);
1113                                         XE_SELECT_PAGE(2);
1114                                         /* BEGIN HACK */
1115                                         XE_OUTB(XE_MSR, XE_INB(XE_MSR) | 0x08);
1116                                         XE_SELECT_PAGE(0x42);
1117                                         XE_OUTB(XE_SWC1, 0x80);
1118                                         scp->media = IFM_ETHER | IFM_10_T;
1119                                         scp->autoneg_status = XE_AUTONEG_NONE;
1120                                         /* END HACK */
1121 #if 0
1122                                         /* Display PHY? */
1123                                         XE_OUTB(XE_MSR, XE_INB(XE_MSR) & ~0x08);
1124                                         scp->autoneg_status = XE_AUTONEG_FAIL;
1125 #endif
1126                                 }
1127                         } else {
1128                                 DEVPRINTF(2, (scp->dev,
1129                             "Autonegotiation failed; trying 100baseTX\n"));
1130                                 XE_MII_DUMP(scp);
1131                                 if (scp->phy_ok) {
1132                                         xe_phy_writereg(scp, PHY_BMCR,
1133                                             PHY_BMCR_SPEEDSEL);
1134                                         scp->autoneg_status = XE_AUTONEG_100TX;
1135                                         callout_reset(&scp->media_timer, hz * 3,
1136                                             xe_setmedia, scp);
1137                                         return;
1138                                 } else {
1139                                         scp->autoneg_status = XE_AUTONEG_FAIL;
1140                                 }
1141                         }
1142                         break;
1143                 case XE_AUTONEG_100TX:
1144                         (void)xe_phy_readreg(scp, PHY_BMSR);
1145                         bmsr = xe_phy_readreg(scp, PHY_BMSR);
1146                         if (bmsr & PHY_BMSR_LINKSTAT) {
1147                                 DEVPRINTF(2, (scp->dev,
1148                                     "Got 100baseTX link!\n"));
1149                                 XE_MII_DUMP(scp);
1150                                 XE_SELECT_PAGE(2);
1151                                 XE_OUTB(XE_MSR, XE_INB(XE_MSR) | 0x08);
1152                                 scp->media = IFM_ETHER | IFM_100_TX;
1153                                 scp->autoneg_status = XE_AUTONEG_NONE;
1154                         } else {
1155                                 DEVPRINTF(2, (scp->dev,
1156                                     "Autonegotiation failed; disabling PHY\n"));
1157                                 XE_MII_DUMP(scp);
1158                                 xe_phy_writereg(scp, PHY_BMCR, 0x0000);
1159                                 XE_SELECT_PAGE(2);
1160
1161                                 /* Disable PHY? */
1162                                 XE_OUTB(XE_MSR, XE_INB(XE_MSR) & ~0x08);
1163                                 scp->autoneg_status = XE_AUTONEG_FAIL;
1164                         }
1165                         break;
1166                 }
1167
1168                 /*
1169                  * If we got down here _and_ autoneg_status is
1170                  * XE_AUTONEG_FAIL, then either autonegotiation
1171                  * failed, or never got started to begin with.  In
1172                  * either case, select a suitable 10Mbit media and
1173                  * hope it works.  We don't need to reset the card
1174                  * again, since it will have been done already by the
1175                  * big switch above.
1176                  */
1177                 if (scp->autoneg_status == XE_AUTONEG_FAIL) {
1178                         DEVPRINTF(2, (scp->dev, "Selecting 10baseX\n"));
1179                         if (scp->mohawk) {
1180                                 XE_SELECT_PAGE(0x42);
1181                                 XE_OUTB(XE_SWC1, 0x80);
1182                                 scp->media = IFM_ETHER | IFM_10_T;
1183                                 scp->autoneg_status = XE_AUTONEG_NONE;
1184                         } else {
1185                                 XE_SELECT_PAGE(4);
1186                                 XE_OUTB(XE_GPR0, 4);
1187                                 DELAY(50000);
1188                                 XE_SELECT_PAGE(0x42);
1189                                 XE_OUTB(XE_SWC1,
1190                                     (XE_INB(XE_ESR) & XE_ESR_MEDIA_SELECT) ?
1191                                     0x80 : 0xc0);
1192                                 scp->media = IFM_ETHER | ((XE_INB(XE_ESR) &
1193                                     XE_ESR_MEDIA_SELECT) ? IFM_10_T : IFM_10_2);
1194                                 scp->autoneg_status = XE_AUTONEG_NONE;
1195                         }
1196                 }
1197                 break;
1198
1199         /*
1200          * If a specific media has been requested, we just reset the
1201          * card and select it (one small exception -- if 100baseTX is
1202          * requested but there is no PHY, we fall back to 10baseT
1203          * operation).
1204          */
1205         case IFM_100_TX:        /* Force 100baseTX */
1206                 if (scp->phy_ok) {
1207                         DEVPRINTF(2, (scp->dev, "Selecting 100baseTX\n"));
1208                         XE_SELECT_PAGE(0x42);
1209                         XE_OUTB(XE_SWC1, 0);
1210                         xe_phy_writereg(scp, PHY_BMCR, PHY_BMCR_SPEEDSEL);
1211                         XE_SELECT_PAGE(2);
1212                         XE_OUTB(XE_MSR, XE_INB(XE_MSR) | 0x08);
1213                         scp->media |= IFM_100_TX;
1214                         break;
1215                 }
1216                 /* FALLTHROUGH */
1217         case IFM_10_T:          /* Force 10baseT */
1218                 DEVPRINTF(2, (scp->dev, "Selecting 10baseT\n"));
1219                 if (scp->phy_ok) {
1220                         xe_phy_writereg(scp, PHY_BMCR, 0x0000);
1221                         XE_SELECT_PAGE(2);
1222
1223                         /* Disable PHY */
1224                         XE_OUTB(XE_MSR, XE_INB(XE_MSR) & ~0x08);
1225                 }
1226                 XE_SELECT_PAGE(0x42);
1227                 XE_OUTB(XE_SWC1, 0x80);
1228                 scp->media |= IFM_10_T;
1229                 break;
1230         case IFM_10_2:
1231                 DEVPRINTF(2, (scp->dev, "Selecting 10base2\n"));
1232                 XE_SELECT_PAGE(0x42);
1233                 XE_OUTB(XE_SWC1, 0xc0);
1234                 scp->media |= IFM_10_2;
1235                 break;
1236         }
1237
1238         /*
1239          * Finally, the LEDs are set to match whatever media was
1240          * chosen and the transmitter is unblocked.
1241          */
1242         DEVPRINTF(2, (scp->dev, "Setting LEDs\n"));
1243         XE_SELECT_PAGE(2);
1244         switch (IFM_SUBTYPE(scp->media)) {
1245         case IFM_100_TX:
1246         case IFM_10_T:
1247                 XE_OUTB(XE_LED, 0x3b);
1248                 if (scp->dingo)
1249                         XE_OUTB(0x0b, 0x04);    /* 100Mbit LED */
1250                 break;
1251         case IFM_10_2:
1252                 XE_OUTB(XE_LED, 0x3a);
1253                 break;
1254         }
1255
1256         /* Restart output? */
1257         xe_enable_intr(scp);
1258         scp->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
1259         xe_start_locked(scp->ifp);
1260 }
1261
1262 /*
1263  * Hard reset (power cycle) the card.
1264  */
1265 static void
1266 xe_reset(struct xe_softc *scp)
1267 {
1268
1269         DEVPRINTF(2, (scp->dev, "reset\n"));
1270
1271         XE_ASSERT_LOCKED(scp);
1272
1273         /* Power down */
1274         XE_SELECT_PAGE(4);
1275         XE_OUTB(XE_GPR1, 0);
1276         DELAY(40000);
1277
1278         /* Power up again */
1279         if (scp->mohawk)
1280                 XE_OUTB(XE_GPR1, XE_GPR1_POWER_DOWN);
1281         else
1282                 XE_OUTB(XE_GPR1, XE_GPR1_POWER_DOWN | XE_GPR1_AIC);
1283
1284         DELAY(40000);
1285         XE_SELECT_PAGE(0);
1286 }
1287
1288 /*
1289  * Take interface offline.  This is done by powering down the device, which I
1290  * assume means just shutting down the transceiver and Ethernet logic.  This
1291  * requires a _hard_ reset to recover from, as we need to power up again.
1292  */
1293 void
1294 xe_stop(struct xe_softc *scp)
1295 {
1296
1297         DEVPRINTF(2, (scp->dev, "stop\n"));
1298
1299         XE_ASSERT_LOCKED(scp);
1300
1301         /*
1302          * Shut off interrupts.
1303          */
1304         xe_disable_intr(scp);
1305
1306         /*
1307          * Power down.
1308          */
1309         XE_SELECT_PAGE(4);
1310         XE_OUTB(XE_GPR1, 0);
1311         XE_SELECT_PAGE(0);
1312         if (scp->mohawk) {
1313                 /*
1314                  * set GP1 and GP2 as outputs (bits 2 & 3)
1315                  * set GP1 high to power on the ML6692 (bit 0)
1316                  * set GP2 low to power on the 10Mhz chip (bit 1)
1317                  */
1318                 XE_SELECT_PAGE(4);
1319                 XE_OUTB(XE_GPR0, XE_GPR0_GP2_SELECT | XE_GPR0_GP1_SELECT |
1320                     XE_GPR0_GP1_OUT);
1321         }
1322
1323         /*
1324          * ~IFF_DRV_RUNNING == interface down.
1325          */
1326         scp->ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
1327         scp->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
1328         scp->tx_timeout = 0;
1329         callout_stop(&scp->wdog_timer);
1330         callout_stop(&scp->media_timer);
1331 }
1332
1333 /*
1334  * Enable interrupts from the card.
1335  */
1336 static void
1337 xe_enable_intr(struct xe_softc *scp)
1338 {
1339
1340         DEVPRINTF(2, (scp->dev, "enable_intr\n"));
1341
1342         XE_SELECT_PAGE(0);
1343         XE_OUTB(XE_CR, XE_CR_ENABLE_INTR);      /* Enable interrupts */
1344         if (scp->modem && !scp->dingo) {        /* This bit is just magic */
1345                 if (!(XE_INB(0x10) & 0x01)) {
1346                         XE_OUTB(0x10, 0x11);    /* Unmask master int enable */
1347                 }
1348         }
1349 }
1350
1351 /*
1352  * Disable interrupts from the card.
1353  */
1354 static void
1355 xe_disable_intr(struct xe_softc *scp)
1356 {
1357
1358         DEVPRINTF(2, (scp->dev, "disable_intr\n"));
1359
1360         XE_SELECT_PAGE(0);
1361         XE_OUTB(XE_CR, 0);                      /* Disable interrupts */
1362         if (scp->modem && !scp->dingo) {        /* More magic */
1363                 XE_OUTB(0x10, 0x10);            /* Mask the master int enable */
1364         }
1365 }
1366
1367 /*
1368  * Set up multicast filter and promiscuous modes.
1369  */
1370 static void
1371 xe_set_multicast(struct xe_softc *scp)
1372 {
1373         struct ifnet *ifp;
1374         struct ifmultiaddr *maddr;
1375         unsigned count, i;
1376
1377         DEVPRINTF(2, (scp->dev, "set_multicast\n"));
1378
1379         ifp = scp->ifp;
1380         XE_SELECT_PAGE(0x42);
1381
1382         /* Handle PROMISC flag */
1383         if (ifp->if_flags & IFF_PROMISC) {
1384                 XE_OUTB(XE_SWC1, XE_INB(XE_SWC1) | XE_SWC1_PROMISCUOUS);
1385                 return;
1386         } else
1387                 XE_OUTB(XE_SWC1, XE_INB(XE_SWC1) & ~XE_SWC1_PROMISCUOUS);
1388
1389         /* Handle ALLMULTI flag */
1390         if (ifp->if_flags & IFF_ALLMULTI) {
1391                 XE_OUTB(XE_SWC1, XE_INB(XE_SWC1) | XE_SWC1_ALLMULTI);
1392                 return;
1393         } else
1394                 XE_OUTB(XE_SWC1, XE_INB(XE_SWC1) & ~XE_SWC1_ALLMULTI);
1395
1396         /* Iterate over multicast address list */
1397         count = 0;
1398         if_maddr_rlock(ifp);
1399         CK_STAILQ_FOREACH(maddr, &ifp->if_multiaddrs, ifma_link) {
1400                 if (maddr->ifma_addr->sa_family != AF_LINK)
1401                         continue;
1402
1403                 count++;
1404
1405                 if (count < 10)
1406                         /*
1407                          * First 9 use Individual Addresses for exact
1408                          * matching.
1409                          */
1410                         xe_set_addr(scp,
1411                             LLADDR((struct sockaddr_dl *)maddr->ifma_addr),
1412                             count);
1413                 else if (scp->mohawk)
1414                         /* Use hash filter on Mohawk and Dingo */
1415                         xe_mchash(scp,
1416                             LLADDR((struct sockaddr_dl *)maddr->ifma_addr));
1417                 else
1418                         /* Nowhere else to put them on CE2 */
1419                         break;
1420         }
1421         if_maddr_runlock(ifp);
1422
1423         DEVPRINTF(2, (scp->dev, "set_multicast: count = %u\n", count));
1424
1425         /* Now do some cleanup and enable multicast handling as needed */
1426         if (count == 0) {
1427                 /* Disable all multicast handling */
1428                 XE_SELECT_PAGE(0x42);
1429                 XE_OUTB(XE_SWC1, XE_INB(XE_SWC1) &
1430                     ~(XE_SWC1_IA_ENABLE | XE_SWC1_ALLMULTI));
1431                 if (scp->mohawk) {
1432                         XE_SELECT_PAGE(0x02);
1433                         XE_OUTB(XE_MSR, XE_INB(XE_MSR) & ~XE_MSR_HASH_TABLE);
1434                 }
1435         } else if (count < 10) {
1436                 /*
1437                  * Full in any unused Individual Addresses with our
1438                  * MAC address.
1439                  */
1440                 for (i = count + 1; i < 10; i++)
1441                         xe_set_addr(scp, IF_LLADDR(scp->ifp), i);
1442
1443                 /* Enable Individual Address matching only */
1444                 XE_SELECT_PAGE(0x42);
1445                 XE_OUTB(XE_SWC1, (XE_INB(XE_SWC1) & ~XE_SWC1_ALLMULTI) |
1446                     XE_SWC1_IA_ENABLE);
1447                 if (scp->mohawk) {
1448                         XE_SELECT_PAGE(0x02);
1449                         XE_OUTB(XE_MSR, XE_INB(XE_MSR) & ~XE_MSR_HASH_TABLE);
1450                 }
1451         } else if (scp->mohawk) {
1452                 /* Check whether hash table is full */
1453                 XE_SELECT_PAGE(0x58);
1454                 for (i = 0x08; i < 0x10; i++)
1455                         if (XE_INB(i) != 0xff)
1456                                 break;
1457                 if (i == 0x10) {
1458                         /*
1459                          * Hash table full - enable
1460                          * promiscuous multicast matching
1461                          */
1462                         XE_SELECT_PAGE(0x42);
1463                         XE_OUTB(XE_SWC1, (XE_INB(XE_SWC1) &
1464                             ~XE_SWC1_IA_ENABLE) | XE_SWC1_ALLMULTI);
1465                         XE_SELECT_PAGE(0x02);
1466                         XE_OUTB(XE_MSR, XE_INB(XE_MSR) & ~XE_MSR_HASH_TABLE);
1467                 } else {
1468                         /* Enable hash table and Individual Address matching */
1469                         XE_SELECT_PAGE(0x42);
1470                         XE_OUTB(XE_SWC1, (XE_INB(XE_SWC1) & ~XE_SWC1_ALLMULTI) |
1471                             XE_SWC1_IA_ENABLE);
1472                         XE_SELECT_PAGE(0x02);
1473                         XE_OUTB(XE_MSR, XE_INB(XE_MSR) | XE_MSR_HASH_TABLE);
1474                 }
1475         } else {
1476                 /* Enable promiscuous multicast matching */
1477                 XE_SELECT_PAGE(0x42);
1478                 XE_OUTB(XE_SWC1, (XE_INB(XE_SWC1) & ~XE_SWC1_IA_ENABLE) |
1479                     XE_SWC1_ALLMULTI);
1480         }
1481
1482         XE_SELECT_PAGE(0);
1483 }
1484
1485 /*
1486  * Copy the Ethernet multicast address in addr to the on-chip registers for
1487  * Individual Address idx.  Assumes that addr is really a multicast address
1488  * and that idx > 0 (slot 0 is always used for the card MAC address).
1489  */
1490 static void
1491 xe_set_addr(struct xe_softc *scp, uint8_t* addr, unsigned idx)
1492 {
1493         uint8_t page, reg;
1494         unsigned i;
1495
1496         /*
1497          * Individual Addresses are stored in registers 8-F of pages
1498          * 0x50-0x57.  IA1 therefore starts at register 0xE on page
1499          * 0x50.  The expressions below compute the starting page and
1500          * register for any IA index > 0.
1501          */
1502         --idx;
1503         page = 0x50 + idx % 4 + idx / 4 * 3;
1504         reg = 0x0e - 2 * (idx % 4);
1505
1506         DEVPRINTF(3, (scp->dev,
1507             "set_addr: idx = %u, page = 0x%02x, reg = 0x%02x\n", idx + 1, page,
1508             reg));
1509
1510         /*
1511          * Copy the IA bytes.  Note that the byte order is reversed
1512          * for Mohawk and Dingo wrt. CE2 hardware.
1513          */
1514         XE_SELECT_PAGE(page);
1515         for (i = 0; i < ETHER_ADDR_LEN; i++) {
1516                 if (i > 0) {
1517                         DPRINTF(3, (":%02x", addr[i]));
1518                 } else {
1519                         DEVPRINTF(3, (scp->dev, "set_addr: %02x", addr[0]));
1520                 }
1521                 XE_OUTB(reg, addr[scp->mohawk ? 5 - i : i]);
1522                 if (++reg == 0x10) {
1523                         reg = 0x08;
1524                         XE_SELECT_PAGE(++page);
1525                 }
1526         }
1527         DPRINTF(3, ("\n"));
1528 }
1529
1530 /*
1531  * Set the appropriate bit in the multicast hash table for the supplied
1532  * Ethernet multicast address addr.  Assumes that addr is really a multicast
1533  * address.
1534  */
1535 static void
1536 xe_mchash(struct xe_softc* scp, const uint8_t *addr)
1537 {
1538         int bit;
1539         uint8_t byte, hash;
1540
1541         hash = ether_crc32_le(addr, ETHER_ADDR_LEN) & 0x3F;
1542
1543         /*
1544          * Top 3 bits of hash give register - 8, bottom 3 give bit
1545          * within register.
1546          */
1547         byte = hash >> 3 | 0x08;
1548         bit = 0x01 << (hash & 0x07);
1549
1550         DEVPRINTF(3, (scp->dev,
1551             "set_hash: hash = 0x%02x, byte = 0x%02x, bit = 0x%02x\n", hash,
1552             byte, bit));
1553
1554         XE_SELECT_PAGE(0x58);
1555         XE_OUTB(byte, XE_INB(byte) | bit);
1556 }
1557
1558 /*
1559  * Write an outgoing packet to the card using programmed I/O.
1560  */
1561 static int
1562 xe_pio_write_packet(struct xe_softc *scp, struct mbuf *mbp)
1563 {
1564         unsigned len, pad;
1565         unsigned char wantbyte;
1566         uint8_t *data;
1567         uint8_t savebyte[2];
1568
1569         /* Get total packet length */
1570         if (mbp->m_flags & M_PKTHDR)
1571                 len = mbp->m_pkthdr.len;
1572         else {
1573                 struct mbuf* mbp2 = mbp;
1574                 for (len = 0; mbp2 != NULL;
1575                      len += mbp2->m_len, mbp2 = mbp2->m_next);
1576         }
1577
1578         DEVPRINTF(3, (scp->dev, "pio_write_packet: len = %u\n", len));
1579
1580         /* Packets < minimum length may need to be padded out */
1581         pad = 0;
1582         if (len < scp->tx_min) {
1583                 pad = scp->tx_min - len;
1584                 len = scp->tx_min;
1585         }
1586
1587         /* Check transmit buffer space */
1588         XE_SELECT_PAGE(0);
1589         XE_OUTW(XE_TRS, len + 2);       /* Only effective on rev. 1 CE2 cards */
1590         if ((XE_INW(XE_TSO) & 0x7fff) <= len + 2)
1591                 return (1);
1592
1593         /* Send packet length to card */
1594         XE_OUTW(XE_EDP, len);
1595
1596         /*
1597          * Write packet to card using PIO (code stolen from the ed driver)
1598          */
1599         wantbyte = 0;
1600         while (mbp != NULL) {
1601                 len = mbp->m_len;
1602                 if (len > 0) {
1603                         data = mtod(mbp, caddr_t);
1604                         if (wantbyte) {         /* Finish the last word */
1605                                 savebyte[1] = *data;
1606                                 XE_OUTW(XE_EDP, *(u_short *)savebyte);
1607                                 data++;
1608                                 len--;
1609                                 wantbyte = 0;
1610                         }
1611                         if (len > 1) {          /* Output contiguous words */
1612                                 bus_write_multi_2(scp->port_res, XE_EDP,
1613                                     (uint16_t *)data, len >> 1);
1614                                 data += len & ~1;
1615                                 len &= 1;
1616                         }
1617                         if (len == 1) {         /* Save last byte, if needed */
1618                                 savebyte[0] = *data;
1619                                 wantbyte = 1;
1620                         }
1621                 }
1622                 mbp = mbp->m_next;
1623         }
1624
1625         /*
1626          * Send last byte of odd-length packets
1627          */
1628         if (wantbyte)
1629                 XE_OUTB(XE_EDP, savebyte[0]);
1630
1631         /*
1632          * Can just tell CE3 cards to send; short packets will be
1633          * padded out with random cruft automatically.  For CE2,
1634          * manually pad the packet with garbage; it will be sent when
1635          * the required number of bytes have been delivered to the
1636          * card.
1637          */
1638         if (scp->mohawk)
1639                 XE_OUTB(XE_CR, XE_CR_TX_PACKET | XE_CR_RESTART_TX |
1640                     XE_CR_ENABLE_INTR);
1641         else if (pad > 0) {
1642                 if (pad & 0x01)
1643                         XE_OUTB(XE_EDP, 0xaa);
1644                 pad >>= 1;
1645                 while (pad > 0) {
1646                         XE_OUTW(XE_EDP, 0xdead);
1647                         pad--;
1648                 }
1649         }
1650
1651         return (0);
1652 }
1653
1654 /**************************************************************
1655  *                                                            *
1656  *                  M I I  F U N C T I O N S                  *
1657  *                                                            *
1658  **************************************************************/
1659
1660 /*
1661  * Alternative MII/PHY handling code adapted from the xl driver.  It doesn't
1662  * seem to work any better than the xirc2_ps stuff, but it's cleaner code.
1663  * XXX - this stuff shouldn't be here.  It should all be abstracted off to
1664  * XXX - some kind of common MII-handling code, shared by all drivers.  But
1665  * XXX - that's a whole other mission.
1666  */
1667 #define XE_MII_SET(x)   XE_OUTB(XE_GPR2, (XE_INB(XE_GPR2) | 0x04) | (x))
1668 #define XE_MII_CLR(x)   XE_OUTB(XE_GPR2, (XE_INB(XE_GPR2) | 0x04) & ~(x))
1669
1670 /*
1671  * Sync the PHYs by setting data bit and strobing the clock 32 times.
1672  */
1673 static void
1674 xe_mii_sync(struct xe_softc *scp)
1675 {
1676         int i;
1677
1678         XE_SELECT_PAGE(2);
1679         XE_MII_SET(XE_MII_DIR|XE_MII_WRD);
1680
1681         for (i = 0; i < 32; i++) {
1682                 XE_MII_SET(XE_MII_CLK);
1683                 DELAY(1);
1684                 XE_MII_CLR(XE_MII_CLK);
1685                 DELAY(1);
1686         }
1687 }
1688
1689 /*
1690  * Look for a MII-compliant PHY.  If we find one, reset it.
1691  */
1692 static int
1693 xe_mii_init(struct xe_softc *scp)
1694 {
1695         uint16_t status;
1696
1697         status = xe_phy_readreg(scp, PHY_BMSR);
1698         if ((status & 0xff00) != 0x7800) {
1699                 DEVPRINTF(2, (scp->dev, "no PHY found, %0x\n", status));
1700                 return (0);
1701         } else {
1702                 DEVPRINTF(2, (scp->dev, "PHY OK!\n"));
1703
1704                 /* Reset the PHY */
1705                 xe_phy_writereg(scp, PHY_BMCR, PHY_BMCR_RESET);
1706                 DELAY(500);
1707                 while(xe_phy_readreg(scp, PHY_BMCR) & PHY_BMCR_RESET)
1708                         ;       /* nothing */
1709                 XE_MII_DUMP(scp);
1710                 return (1);
1711         }
1712 }
1713
1714 /*
1715  * Clock a series of bits through the MII.
1716  */
1717 static void
1718 xe_mii_send(struct xe_softc *scp, uint32_t bits, int cnt)
1719 {
1720         int i;
1721
1722         XE_SELECT_PAGE(2);
1723         XE_MII_CLR(XE_MII_CLK);
1724   
1725         for (i = (0x1 << (cnt - 1)); i; i >>= 1) {
1726                 if (bits & i) {
1727                         XE_MII_SET(XE_MII_WRD);
1728                 } else {
1729                         XE_MII_CLR(XE_MII_WRD);
1730                 }
1731                 DELAY(1);
1732                 XE_MII_CLR(XE_MII_CLK);
1733                 DELAY(1);
1734                 XE_MII_SET(XE_MII_CLK);
1735         }
1736 }
1737
1738 /*
1739  * Read an PHY register through the MII.
1740  */
1741 static int
1742 xe_mii_readreg(struct xe_softc *scp, struct xe_mii_frame *frame)
1743 {
1744         int i, ack;
1745
1746         XE_ASSERT_LOCKED(scp);
1747
1748         /*
1749          * Set up frame for RX.
1750          */
1751         frame->mii_stdelim = XE_MII_STARTDELIM;
1752         frame->mii_opcode = XE_MII_READOP;
1753         frame->mii_turnaround = 0;
1754         frame->mii_data = 0;
1755         
1756         XE_SELECT_PAGE(2);
1757         XE_OUTB(XE_GPR2, 0);
1758
1759         /*
1760          * Turn on data xmit.
1761          */
1762         XE_MII_SET(XE_MII_DIR);
1763
1764         xe_mii_sync(scp);
1765
1766         /*      
1767          * Send command/address info.
1768          */
1769         xe_mii_send(scp, frame->mii_stdelim, 2);
1770         xe_mii_send(scp, frame->mii_opcode, 2);
1771         xe_mii_send(scp, frame->mii_phyaddr, 5);
1772         xe_mii_send(scp, frame->mii_regaddr, 5);
1773
1774         /* Idle bit */
1775         XE_MII_CLR((XE_MII_CLK|XE_MII_WRD));
1776         DELAY(1);
1777         XE_MII_SET(XE_MII_CLK);
1778         DELAY(1);
1779
1780         /* Turn off xmit. */
1781         XE_MII_CLR(XE_MII_DIR);
1782
1783         /* Check for ack */
1784         XE_MII_CLR(XE_MII_CLK);
1785         DELAY(1);
1786         ack = XE_INB(XE_GPR2) & XE_MII_RDD;
1787         XE_MII_SET(XE_MII_CLK);
1788         DELAY(1);
1789
1790         /*
1791          * Now try reading data bits. If the ack failed, we still
1792          * need to clock through 16 cycles to keep the PHY(s) in sync.
1793          */
1794         if (ack) {
1795                 for(i = 0; i < 16; i++) {
1796                         XE_MII_CLR(XE_MII_CLK);
1797                         DELAY(1);
1798                         XE_MII_SET(XE_MII_CLK);
1799                         DELAY(1);
1800                 }
1801                 goto fail;
1802         }
1803
1804         for (i = 0x8000; i; i >>= 1) {
1805                 XE_MII_CLR(XE_MII_CLK);
1806                 DELAY(1);
1807                 if (!ack) {
1808                         if (XE_INB(XE_GPR2) & XE_MII_RDD)
1809                                 frame->mii_data |= i;
1810                         DELAY(1);
1811                 }
1812                 XE_MII_SET(XE_MII_CLK);
1813                 DELAY(1);
1814         }
1815
1816 fail:
1817         XE_MII_CLR(XE_MII_CLK);
1818         DELAY(1);
1819         XE_MII_SET(XE_MII_CLK);
1820         DELAY(1);
1821
1822         if (ack)
1823                 return(1);
1824         return(0);
1825 }
1826
1827 /*
1828  * Write to a PHY register through the MII.
1829  */
1830 static int
1831 xe_mii_writereg(struct xe_softc *scp, struct xe_mii_frame *frame)
1832 {
1833
1834         XE_ASSERT_LOCKED(scp);
1835
1836         /*
1837          * Set up frame for TX.
1838          */
1839         frame->mii_stdelim = XE_MII_STARTDELIM;
1840         frame->mii_opcode = XE_MII_WRITEOP;
1841         frame->mii_turnaround = XE_MII_TURNAROUND;
1842         
1843         XE_SELECT_PAGE(2);
1844
1845         /*              
1846          * Turn on data output.
1847          */
1848         XE_MII_SET(XE_MII_DIR);
1849
1850         xe_mii_sync(scp);
1851
1852         xe_mii_send(scp, frame->mii_stdelim, 2);
1853         xe_mii_send(scp, frame->mii_opcode, 2);
1854         xe_mii_send(scp, frame->mii_phyaddr, 5);
1855         xe_mii_send(scp, frame->mii_regaddr, 5);
1856         xe_mii_send(scp, frame->mii_turnaround, 2);
1857         xe_mii_send(scp, frame->mii_data, 16);
1858
1859         /* Idle bit. */
1860         XE_MII_SET(XE_MII_CLK);
1861         DELAY(1);
1862         XE_MII_CLR(XE_MII_CLK);
1863         DELAY(1);
1864
1865         /*
1866          * Turn off xmit.
1867          */
1868         XE_MII_CLR(XE_MII_DIR);
1869
1870         return(0);
1871 }
1872
1873 /*
1874  * Read a register from the PHY.
1875  */
1876 static uint16_t
1877 xe_phy_readreg(struct xe_softc *scp, uint16_t reg)
1878 {
1879         struct xe_mii_frame frame;
1880
1881         bzero((char *)&frame, sizeof(frame));
1882
1883         frame.mii_phyaddr = 0;
1884         frame.mii_regaddr = reg;
1885         xe_mii_readreg(scp, &frame);
1886
1887         return (frame.mii_data);
1888 }
1889
1890 /*
1891  * Write to a PHY register.
1892  */
1893 static void
1894 xe_phy_writereg(struct xe_softc *scp, uint16_t reg, uint16_t data)
1895 {
1896         struct xe_mii_frame frame;
1897
1898         bzero((char *)&frame, sizeof(frame));
1899
1900         frame.mii_phyaddr = 0;
1901         frame.mii_regaddr = reg;
1902         frame.mii_data = data;
1903         xe_mii_writereg(scp, &frame);
1904 }
1905
1906 /*
1907  * A bit of debugging code.
1908  */
1909 static void
1910 xe_mii_dump(struct xe_softc *scp)
1911 {
1912         int i;
1913
1914         device_printf(scp->dev, "MII registers: ");
1915         for (i = 0; i < 2; i++) {
1916                 printf(" %d:%04x", i, xe_phy_readreg(scp, i));
1917         }
1918         for (i = 4; i < 7; i++) {
1919                 printf(" %d:%04x", i, xe_phy_readreg(scp, i));
1920         }
1921         printf("\n");
1922 }
1923
1924 #if 0
1925 void
1926 xe_reg_dump(struct xe_softc *scp)
1927 {
1928         int page, i;
1929
1930         device_printf(scp->dev, "Common registers: ");
1931         for (i = 0; i < 8; i++) {
1932                 printf(" %2.2x", XE_INB(i));
1933         }
1934         printf("\n");
1935
1936         for (page = 0; page <= 8; page++) {
1937                 device_printf(scp->dev, "Register page %2.2x: ", page);
1938                 XE_SELECT_PAGE(page);
1939                 for (i = 8; i < 16; i++) {
1940                         printf(" %2.2x", XE_INB(i));
1941                 }
1942                 printf("\n");
1943         }
1944
1945         for (page = 0x10; page < 0x5f; page++) {
1946                 if ((page >= 0x11 && page <= 0x3f) ||
1947                     (page == 0x41) ||
1948                     (page >= 0x43 && page <= 0x4f) ||
1949                     (page >= 0x59))
1950                         continue;
1951                 device_printf(scp->dev, "Register page %2.2x: ", page);
1952                 XE_SELECT_PAGE(page);
1953                 for (i = 8; i < 16; i++) {
1954                         printf(" %2.2x", XE_INB(i));
1955                 }
1956                 printf("\n");
1957         }
1958 }
1959 #endif
1960
1961 int
1962 xe_activate(device_t dev)
1963 {
1964         struct xe_softc *sc = device_get_softc(dev);
1965         int start, i;
1966
1967         DEVPRINTF(2, (dev, "activate\n"));
1968
1969         if (!sc->modem) {
1970                 sc->port_rid = 0;       /* 0 is managed by pccard */
1971                 sc->port_res = bus_alloc_resource_anywhere(dev, SYS_RES_IOPORT,
1972                     &sc->port_rid, 16, RF_ACTIVE);
1973         } else if (sc->dingo) {
1974                 /*
1975                  * Find a 16 byte aligned ioport for the card.
1976                  */
1977                 DEVPRINTF(1, (dev, "Finding an aligned port for RealPort\n"));
1978                 sc->port_rid = 1;       /* 0 is managed by pccard */
1979                 start = 0x100;
1980                 do {
1981                         sc->port_res = bus_alloc_resource(dev, SYS_RES_IOPORT,
1982                             &sc->port_rid, start, 0x3ff, 16, RF_ACTIVE);
1983                         if (sc->port_res == NULL)
1984                                 break;
1985                         if ((rman_get_start(sc->port_res) & 0xf) == 0)
1986                                 break;
1987                         bus_release_resource(dev, SYS_RES_IOPORT, sc->port_rid, 
1988                             sc->port_res);
1989                         start = (rman_get_start(sc->port_res) + 15) & ~0xf;
1990                 } while (1);
1991                 DEVPRINTF(1, (dev, "RealPort port 0x%0jx, size 0x%0jx\n",
1992                     bus_get_resource_start(dev, SYS_RES_IOPORT, sc->port_rid),
1993                     bus_get_resource_count(dev, SYS_RES_IOPORT, sc->port_rid)));
1994         } else if (sc->ce2) {
1995                 /*
1996                  * Find contiguous I/O port for the Ethernet function
1997                  * on CEM2 and CEM3 cards.  We allocate window 0
1998                  * wherever pccard has decided it should be, then find
1999                  * an available window adjacent to it for the second
2000                  * function.  Not sure that both windows are actually
2001                  * needed.
2002                  */
2003                 DEVPRINTF(1, (dev, "Finding I/O port for CEM2/CEM3\n"));
2004                 sc->ce2_port_rid = 0;   /* 0 is managed by pccard */
2005                 sc->ce2_port_res = bus_alloc_resource_anywhere(dev,
2006                     SYS_RES_IOPORT, &sc->ce2_port_rid, 8, RF_ACTIVE);
2007                 if (sc->ce2_port_res == NULL) {
2008                         DEVPRINTF(1, (dev,
2009                             "Cannot allocate I/O port for modem\n"));
2010                         xe_deactivate(dev);
2011                         return (ENOMEM);
2012                 }
2013
2014                 sc->port_rid = 1;
2015                 start = bus_get_resource_start(dev, SYS_RES_IOPORT,
2016                     sc->ce2_port_rid);
2017                 for (i = 0; i < 2; i++) {
2018                         start += (i == 0 ? 8 : -24);
2019                         sc->port_res = bus_alloc_resource(dev, SYS_RES_IOPORT,
2020                             &sc->port_rid, start, start + 15, 16, RF_ACTIVE);
2021                         if (sc->port_res == NULL)
2022                                 continue;
2023                         if (bus_get_resource_start(dev, SYS_RES_IOPORT,
2024                             sc->port_rid) == start)
2025                                 break;
2026
2027                         bus_release_resource(dev, SYS_RES_IOPORT, sc->port_rid,
2028                             sc->port_res);
2029                         sc->port_res = NULL;
2030                 }
2031                 DEVPRINTF(1, (dev, "CEM2/CEM3 port 0x%0jx, size 0x%0jx\n",
2032                     bus_get_resource_start(dev, SYS_RES_IOPORT, sc->port_rid),
2033                     bus_get_resource_count(dev, SYS_RES_IOPORT, sc->port_rid)));
2034         }
2035
2036         if (!sc->port_res) {
2037                 DEVPRINTF(1, (dev, "Cannot allocate ioport\n"));
2038                 xe_deactivate(dev);
2039                 return (ENOMEM);
2040         }
2041
2042         sc->irq_rid = 0;
2043         sc->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irq_rid, 
2044             RF_ACTIVE);
2045         if (sc->irq_res == NULL) {
2046                 DEVPRINTF(1, (dev, "Cannot allocate irq\n"));
2047                 xe_deactivate(dev);
2048                 return (ENOMEM);
2049         }
2050
2051         return (0);
2052 }
2053
2054 void
2055 xe_deactivate(device_t dev)
2056 {
2057         struct xe_softc *sc = device_get_softc(dev);
2058         
2059         DEVPRINTF(2, (dev, "deactivate\n"));
2060         if (sc->intrhand)
2061                 bus_teardown_intr(dev, sc->irq_res, sc->intrhand);
2062         sc->intrhand = NULL;
2063         if (sc->port_res)
2064                 bus_release_resource(dev, SYS_RES_IOPORT, sc->port_rid, 
2065                     sc->port_res);
2066         sc->port_res = NULL;
2067         if (sc->ce2_port_res)
2068             bus_release_resource(dev, SYS_RES_IOPORT, sc->ce2_port_rid,
2069                 sc->ce2_port_res);
2070         sc->ce2_port_res = NULL;
2071         if (sc->irq_res)
2072                 bus_release_resource(dev, SYS_RES_IRQ, sc->irq_rid, 
2073                     sc->irq_res);
2074         sc->irq_res = NULL;
2075         if (sc->ifp)
2076                 if_free(sc->ifp);
2077         sc->ifp = NULL;
2078 }