Home | History | Annotate | Line # | Download | only in pcmcia
if_ne_pcmcia.c revision 1.4.2.2
      1  1.4.2.2  thorpej /*	$NetBSD: if_ne_pcmcia.c,v 1.4.2.2 1997/11/20 04:03:47 thorpej Exp $	*/
      2      1.2  thorpej 
      3      1.2  thorpej /*
      4      1.2  thorpej  * Copyright (c) 1997 Marc Horowitz.  All rights reserved.
      5      1.2  thorpej  *
      6      1.2  thorpej  * Redistribution and use in source and binary forms, with or without
      7      1.2  thorpej  * modification, are permitted provided that the following conditions
      8      1.2  thorpej  * are met:
      9      1.2  thorpej  * 1. Redistributions of source code must retain the above copyright
     10      1.2  thorpej  *    notice, this list of conditions and the following disclaimer.
     11      1.2  thorpej  * 2. Redistributions in binary form must reproduce the above copyright
     12      1.2  thorpej  *    notice, this list of conditions and the following disclaimer in the
     13      1.2  thorpej  *    documentation and/or other materials provided with the distribution.
     14      1.2  thorpej  * 3. All advertising materials mentioning features or use of this software
     15      1.2  thorpej  *    must display the following acknowledgement:
     16      1.2  thorpej  *	This product includes software developed by Marc Horowitz.
     17      1.2  thorpej  * 4. The name of the author may not be used to endorse or promote products
     18      1.2  thorpej  *    derived from this software without specific prior written permission.
     19      1.2  thorpej  *
     20      1.2  thorpej  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     21      1.2  thorpej  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     22      1.2  thorpej  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     23      1.2  thorpej  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     24      1.2  thorpej  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     25      1.2  thorpej  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26      1.2  thorpej  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     27      1.2  thorpej  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28      1.2  thorpej  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     29      1.2  thorpej  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30      1.2  thorpej  */
     31      1.2  thorpej 
     32      1.2  thorpej #include <sys/param.h>
     33      1.2  thorpej #include <sys/systm.h>
     34      1.2  thorpej #include <sys/select.h>
     35      1.2  thorpej #include <sys/device.h>
     36      1.2  thorpej #include <sys/socket.h>
     37      1.2  thorpej 
     38      1.2  thorpej #include <net/if_types.h>
     39      1.2  thorpej #include <net/if.h>
     40  1.4.2.1  thorpej #include <net/if_media.h>
     41      1.2  thorpej #include <net/if_ether.h>
     42      1.2  thorpej 
     43      1.2  thorpej #include <machine/bus.h>
     44      1.2  thorpej #include <machine/intr.h>
     45      1.2  thorpej 
     46      1.2  thorpej #include <dev/pcmcia/pcmciareg.h>
     47      1.2  thorpej #include <dev/pcmcia/pcmciavar.h>
     48      1.2  thorpej 
     49      1.2  thorpej #include <dev/ic/dp8390reg.h>
     50      1.2  thorpej #include <dev/ic/dp8390var.h>
     51      1.2  thorpej 
     52      1.2  thorpej #include <dev/ic/ne2000reg.h>
     53      1.2  thorpej #include <dev/ic/ne2000var.h>
     54      1.2  thorpej 
     55      1.2  thorpej #ifdef __BROKEN_INDIRECT_CONFIG
     56      1.2  thorpej int ne_pcmcia_match __P((struct device *, void *, void *));
     57      1.2  thorpej #else
     58      1.2  thorpej int ne_pcmcia_match __P((struct device *, struct cfdata *, void *));
     59      1.2  thorpej #endif
     60      1.2  thorpej void ne_pcmcia_attach __P((struct device *, struct device *, void *));
     61      1.2  thorpej 
     62      1.2  thorpej int	ne_pcmcia_enable __P((struct dp8390_softc *));
     63      1.2  thorpej void	ne_pcmcia_disable __P((struct dp8390_softc *));
     64      1.2  thorpej 
     65      1.2  thorpej struct ne_pcmcia_softc {
     66      1.2  thorpej 	struct ne2000_softc sc_ne2000;		/* real "ne2000" softc */
     67      1.2  thorpej 
     68      1.2  thorpej 	/* PCMCIA-specific goo */
     69      1.2  thorpej 	struct pcmcia_io_handle sc_pcioh;	/* PCMCIA i/o information */
     70      1.2  thorpej 	int sc_asic_io_window;			/* i/o window for ASIC */
     71      1.2  thorpej 	int sc_nic_io_window;			/* i/o window for NIC */
     72      1.2  thorpej 	struct pcmcia_function *sc_pf;		/* our PCMCIA function */
     73      1.2  thorpej 	void *sc_ih;				/* interrupt handle */
     74      1.2  thorpej };
     75      1.2  thorpej 
     76      1.2  thorpej struct cfattach ne_pcmcia_ca = {
     77      1.2  thorpej 	sizeof(struct ne_pcmcia_softc), ne_pcmcia_match, ne_pcmcia_attach
     78      1.2  thorpej };
     79      1.2  thorpej 
     80      1.2  thorpej struct ne2000dev {
     81      1.2  thorpej     char *name;
     82      1.4    enami     int32_t manufacturer;
     83      1.4    enami     int32_t product;
     84      1.2  thorpej     char *cis1_info0;
     85      1.2  thorpej     char *cis1_info1;
     86      1.2  thorpej     int function;
     87      1.2  thorpej     int enet_maddr;
     88      1.2  thorpej     unsigned char enet_vendor[3];
     89      1.2  thorpej } ne2000devs[] = {
     90      1.2  thorpej     { "PreMax PE-200",
     91      1.2  thorpej       0xffff, 0xffff, "PMX   ", "PE-200", 0,
     92      1.2  thorpej       0x07f0, { 0x00, 0x20, 0xe0 } },
     93      1.2  thorpej     { "National Semiconductor InfoMover",
     94      1.2  thorpej       0x00a4, 0x0002, NULL, NULL, 0,
     95      1.2  thorpej       0x0ff0, { 0x08, 0x00, 0x5a } },
     96      1.2  thorpej     { "DEC DEPCM-BA",
     97      1.2  thorpej       0x0000, 0x0000, "DIGITAL", "DEPCM-XX", 0,
     98      1.2  thorpej       0x0ff0, { 0x00, 0x00, 0xe8 } },
     99      1.2  thorpej     /* this card might need pcic_alloc_iobase < 0x400, and/or
    100      1.2  thorpej        CIRRUS_PD672X on TI TravelMate 5000 needs it: */
    101      1.2  thorpej     { "Linksys EthernetCard",
    102      1.2  thorpej       0x0149, 0x0265, "LINKSYS", "E-CARD",
    103      1.2  thorpej       0, -1, { 0x00, 0x80, 0xc8 } },
    104      1.2  thorpej     { "Planet SmartCOM 2000",
    105      1.4    enami       /* This card doesn't have manufacturer and product id in CIS.  */
    106      1.4    enami       PCMCIA_MANUFACTURER_INVALID, PCMCIA_PRODUCT_INVALID,
    107      1.4    enami       "PCMCIA", "UE2212", 0,
    108      1.2  thorpej       0xff0, { 0x00, 0x00, 0xe8 } },
    109  1.4.2.2  thorpej     { "D-Link DE-650",
    110  1.4.2.2  thorpej       PCMCIA_MANUFACTURER_INVALID, PCMCIA_PRODUCT_INVALID,
    111  1.4.2.2  thorpej       "D-Link", "DE-650", 0,
    112  1.4.2.2  thorpej       0x0040, { 0x00, 0x80, 0xc8 } },
    113      1.2  thorpej #if 0
    114      1.2  thorpej     /* the rest of these are stolen from the linux pcnet pcmcia device
    115      1.2  thorpej        driver.  Since I don't know the manfid or cis info strings for
    116      1.2  thorpej        any of them, they're not compiled in until I do. */
    117      1.2  thorpej 
    118      1.2  thorpej     { "Accton EN2212",
    119      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    120      1.2  thorpej       0x0ff0, { 0x00, 0x00, 0xe8 } },
    121      1.2  thorpej     { "Allied Telesis LA-PCM",
    122      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    123      1.2  thorpej       0x0ff0, { 0x00, 0x00, 0xf4 } },
    124      1.2  thorpej     { "APEX MultiCard",
    125      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    126      1.2  thorpej       0x03f4, { 0x00, 0x20, 0xe5 } },
    127      1.2  thorpej     { "ASANTE FriendlyNet",
    128      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    129      1.2  thorpej       0x4910, { 0x00, 0x00, 0x94 } },
    130      1.2  thorpej     { "Danpex EN-6200P2",
    131      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    132      1.2  thorpej       0x0110, { 0x00, 0x40, 0xc7 } },
    133      1.2  thorpej     { "DataTrek NetCard",
    134      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    135      1.2  thorpej       0x0ff0, { 0x00, 0x20, 0xe8 } },
    136      1.2  thorpej     { "Dayna CommuniCard E",
    137      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    138      1.2  thorpej       0x0110, { 0x00, 0x80, 0x19 } },
    139      1.2  thorpej     { "EP-210 Ethernet",
    140      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    141      1.2  thorpej       0x0110, { 0x00, 0x40, 0x33 } },
    142      1.2  thorpej     { "Epson EEN10B",
    143      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    144      1.2  thorpej       0x0ff0, { 0x00, 0x00, 0x48 } },
    145      1.2  thorpej     { "ELECOM Laneed LD-CDWA",
    146      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    147      1.2  thorpej       0x00b8, { 0x08, 0x00, 0x42 } },
    148      1.2  thorpej     { "Grey Cell GCS2220",
    149      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    150      1.2  thorpej       0x0000, { 0x00, 0x47, 0x43 } },
    151      1.2  thorpej     { "Hypertec Ethernet",
    152      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    153      1.2  thorpej       0x01c0, { 0x00, 0x40, 0x4c } },
    154      1.2  thorpej     { "IBM CCAE",
    155      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    156      1.2  thorpej       0x0ff0, { 0x08, 0x00, 0x5a } },
    157      1.2  thorpej     { "IBM CCAE",
    158      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    159      1.2  thorpej       0x0ff0, { 0x00, 0x04, 0xac } },
    160      1.2  thorpej     { "IBM CCAE",
    161      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    162      1.2  thorpej       0x0ff0, { 0x00, 0x06, 0x29 } },
    163      1.2  thorpej     { "IBM FME",
    164      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    165      1.2  thorpej       0x0374, { 0x00, 0x04, 0xac } },
    166      1.2  thorpej     { "IBM FME",
    167      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    168      1.2  thorpej       0x0374, { 0x08, 0x00, 0x5a } },
    169      1.2  thorpej     { "I-O DATA PCLA/T",
    170      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    171      1.2  thorpej       0x0ff0, { 0x00, 0xa0, 0xb0 } },
    172      1.2  thorpej     { "Katron PE-520",
    173      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    174      1.2  thorpej       0x0110, { 0x00, 0x40, 0xf6 } },
    175      1.2  thorpej     { "Kingston KNE-PCM/x",
    176      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    177      1.2  thorpej       0x0ff0, { 0x00, 0xc0, 0xf0 } },
    178      1.2  thorpej     { "Kingston KNE-PCM/x",
    179      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    180      1.2  thorpej       0x0ff0, { 0xe2, 0x0c, 0x0f } },
    181      1.2  thorpej     { "Kingston KNE-PC2",
    182      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    183      1.2  thorpej       0x0180, { 0x00, 0xc0, 0xf0 } },
    184      1.2  thorpej     { "Longshine LCS-8534",
    185      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    186      1.2  thorpej       0x0000, { 0x08, 0x00, 0x00 } },
    187      1.2  thorpej     { "Maxtech PCN2000",
    188      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    189      1.2  thorpej       0x5000, { 0x00, 0x00, 0xe8 } },
    190      1.2  thorpej     { "NDC Instant-Link",
    191      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    192      1.2  thorpej       0x003a, { 0x00, 0x80, 0xc6 } },
    193      1.2  thorpej     { "NE2000 Compatible",
    194      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    195      1.2  thorpej       0x0ff0, { 0x00, 0xa0, 0x0c } },
    196      1.2  thorpej     { "Network General Sniffer",
    197      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    198      1.2  thorpej       0x0ff0, { 0x00, 0x00, 0x65 } },
    199      1.2  thorpej     { "Panasonic VEL211",
    200      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    201      1.2  thorpej       0x0ff0, { 0x00, 0x80, 0x45 } },
    202      1.2  thorpej     { "RPTI EP400",
    203      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    204      1.2  thorpej       0x0110, { 0x00, 0x40, 0x95 } },
    205      1.2  thorpej     { "SCM Ethernet",
    206      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    207      1.2  thorpej       0x0ff0, { 0x00, 0x20, 0xcb } },
    208      1.2  thorpej     { "Socket EA",
    209      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    210      1.2  thorpej       0x4000, { 0x00, 0xc0, 0x1b } },
    211      1.2  thorpej     { "Volktek NPL-402CT",
    212      1.2  thorpej       0x0000, 0x0000, NULL, NULL, 0,
    213      1.2  thorpej       0x0060, { 0x00, 0x40, 0x05 } },
    214      1.2  thorpej #endif
    215      1.2  thorpej };
    216      1.2  thorpej 
    217      1.2  thorpej #define	NE2000_NDEVS	(sizeof(ne2000devs) / sizeof(ne2000devs[0]))
    218      1.2  thorpej 
    219      1.2  thorpej #define ne2000_match(card, fct, n) \
    220      1.4    enami ((((((card)->manufacturer != PCMCIA_MANUFACTURER_INVALID) && \
    221      1.4    enami     ((card)->manufacturer == ne2000devs[(n)].manufacturer) && \
    222      1.4    enami     ((card)->product != PCMCIA_PRODUCT_INVALID) && \
    223      1.2  thorpej     ((card)->product == ne2000devs[(n)].product)) || \
    224      1.2  thorpej    ((ne2000devs[(n)].cis1_info0) && (ne2000devs[(n)].cis1_info1) && \
    225      1.2  thorpej     (strcmp((card)->cis1_info[0], ne2000devs[(n)].cis1_info0) == 0) && \
    226      1.2  thorpej     (strcmp((card)->cis1_info[1], ne2000devs[(n)].cis1_info1) == 0))) && \
    227      1.3    enami   ((fct) == ne2000devs[(n)].function))? \
    228      1.2  thorpej  &ne2000devs[(n)]:NULL)
    229      1.2  thorpej 
    230      1.2  thorpej int
    231      1.2  thorpej ne_pcmcia_match(parent, match, aux)
    232      1.2  thorpej 	struct device *parent;
    233      1.2  thorpej #ifdef __BROKEN_INDIRECT_CONFIG
    234      1.2  thorpej 	void *match;
    235      1.2  thorpej #else
    236      1.2  thorpej 	struct cfdata *cf;
    237      1.2  thorpej #endif
    238      1.2  thorpej 	void *aux;
    239      1.2  thorpej {
    240      1.2  thorpej 	struct pcmcia_attach_args *pa = aux;
    241      1.2  thorpej 	int i;
    242      1.2  thorpej 
    243      1.2  thorpej 	for (i = 0; i < NE2000_NDEVS; i++) {
    244      1.2  thorpej 		if (ne2000_match(pa->card, pa->pf->number, i))
    245      1.2  thorpej 			return (1);
    246      1.2  thorpej 	}
    247      1.2  thorpej 
    248      1.2  thorpej 	return (0);
    249      1.2  thorpej }
    250      1.2  thorpej 
    251      1.2  thorpej void
    252      1.2  thorpej ne_pcmcia_attach(parent, self, aux)
    253      1.2  thorpej 	struct device *parent, *self;
    254      1.2  thorpej 	void *aux;
    255      1.2  thorpej {
    256      1.2  thorpej 	struct ne_pcmcia_softc *psc = (void *) self;
    257      1.2  thorpej 	struct ne2000_softc *nsc = &psc->sc_ne2000;
    258      1.2  thorpej 	struct dp8390_softc *dsc = &nsc->sc_dp8390;
    259      1.2  thorpej 	struct pcmcia_attach_args *pa = aux;
    260      1.2  thorpej 	struct pcmcia_config_entry *cfe;
    261      1.2  thorpej 	struct ne2000dev *ne_dev;
    262      1.2  thorpej 	struct pcmcia_mem_handle pcmh;
    263      1.2  thorpej 	bus_addr_t offset;
    264      1.2  thorpej 	int i, j, mwindow;
    265      1.2  thorpej 	u_int8_t myea[6], *enaddr = NULL;
    266      1.2  thorpej 
    267      1.2  thorpej 	psc->sc_pf = pa->pf;
    268      1.2  thorpej 	cfe = pa->pf->cfe_head.sqh_first;
    269      1.2  thorpej 
    270      1.2  thorpej #if 0
    271      1.2  thorpej 	/*
    272      1.2  thorpej 	 * Some ne2000 driver's claim to have memory; others don't.
    273      1.2  thorpej 	 * Since I don't care, I don't check.
    274      1.2  thorpej 	 */
    275      1.2  thorpej 
    276      1.2  thorpej 	if (cfe->num_memspace != 1) {
    277      1.2  thorpej 		printf(": unexpected number of memory spaces "
    278      1.2  thorpej 		    " %d should be 1\n", cfe->num_memspace);
    279      1.2  thorpej 		return;
    280      1.2  thorpej 	}
    281      1.2  thorpej #endif
    282      1.2  thorpej 
    283      1.2  thorpej 	if (cfe->num_iospace == 1) {
    284      1.2  thorpej 		if (cfe->iospace[0].length != NE2000_NPORTS) {
    285      1.2  thorpej 			printf(": unexpected I/O space configuration\n");
    286      1.2  thorpej 			return;
    287      1.2  thorpej 		}
    288      1.2  thorpej 	} else if (cfe->num_iospace == 2) {
    289      1.2  thorpej 		/*
    290      1.2  thorpej 		 * Some cards report a separate space for NIC and ASIC.
    291      1.2  thorpej 		 * This make some sense, but we must allocate a single
    292      1.2  thorpej 		 * NE2000_NPORTS-sized chunk, due to brain damaged
    293      1.2  thorpej 		 * address decoders on some of these cards.
    294      1.2  thorpej 		 */
    295      1.2  thorpej 		if ((cfe->iospace[0].length + cfe->iospace[1].length) !=
    296      1.2  thorpej 		    NE2000_NPORTS) {
    297      1.2  thorpej 			printf(": unexpected I/O space configuration\n");
    298      1.2  thorpej 			return;
    299      1.2  thorpej 		}
    300      1.2  thorpej 	} else {
    301      1.2  thorpej 		printf(": unexpected number of i/o spaces %d"
    302      1.2  thorpej 		    " should be 1 or 2\n", cfe->num_iospace);
    303      1.2  thorpej 	}
    304      1.2  thorpej 
    305      1.2  thorpej 	if (pcmcia_io_alloc(pa->pf, 0, NE2000_NPORTS, NE2000_NPORTS,
    306      1.2  thorpej 	    &psc->sc_pcioh)) {
    307      1.2  thorpej 		printf(": can't alloc i/o space\n");
    308      1.2  thorpej 		return;
    309      1.2  thorpej 	}
    310      1.2  thorpej 
    311      1.2  thorpej 	dsc->sc_regt = psc->sc_pcioh.iot;
    312      1.2  thorpej 	dsc->sc_regh = psc->sc_pcioh.ioh;
    313      1.2  thorpej 
    314      1.2  thorpej 	nsc->sc_asict = psc->sc_pcioh.iot;
    315      1.2  thorpej 	if (bus_space_subregion(dsc->sc_regt, dsc->sc_regh,
    316      1.2  thorpej 	    NE2000_ASIC_OFFSET, NE2000_ASIC_NPORTS,
    317      1.2  thorpej 	    &nsc->sc_asich)) {
    318      1.2  thorpej 		printf(": can't get subregion for asic\n");
    319      1.2  thorpej 		return;
    320      1.2  thorpej 	}
    321      1.2  thorpej 
    322      1.2  thorpej 	/* Set up power management hooks. */
    323      1.2  thorpej 	dsc->sc_enable = ne_pcmcia_enable;
    324      1.2  thorpej 	dsc->sc_disable = ne_pcmcia_disable;
    325      1.2  thorpej 
    326      1.2  thorpej 	/* Enable the card. */
    327      1.2  thorpej 	pcmcia_function_init(pa->pf, cfe);
    328      1.2  thorpej 	if (pcmcia_function_enable(pa->pf)) {
    329      1.2  thorpej 		printf(": function enable failed\n");
    330      1.2  thorpej 		return;
    331      1.2  thorpej 	}
    332      1.2  thorpej 
    333      1.2  thorpej 	/* some cards claim to be io16, but they're lying. */
    334      1.2  thorpej 	if (pcmcia_io_map(pa->pf, PCMCIA_WIDTH_IO8,
    335      1.2  thorpej 	    NE2000_NIC_OFFSET, NE2000_NIC_NPORTS,
    336      1.2  thorpej 	    &psc->sc_pcioh, &psc->sc_nic_io_window)) {
    337      1.2  thorpej 		printf(": can't map NIC i/o space\n");
    338      1.2  thorpej 		return;
    339      1.2  thorpej 	}
    340      1.2  thorpej 
    341      1.2  thorpej 	if (pcmcia_io_map(pa->pf, PCMCIA_WIDTH_IO16,
    342      1.2  thorpej 	    NE2000_ASIC_OFFSET, NE2000_ASIC_NPORTS,
    343      1.2  thorpej 	    &psc->sc_pcioh, &psc->sc_asic_io_window)) {
    344      1.2  thorpej 		printf(": can't map ASIC i/o space\n");
    345      1.2  thorpej 		return;
    346      1.2  thorpej 	}
    347      1.2  thorpej 
    348      1.2  thorpej 	printf("\n");
    349      1.2  thorpej 
    350      1.2  thorpej 	/*
    351      1.2  thorpej 	 * Read the station address from the board.
    352      1.2  thorpej 	 */
    353      1.2  thorpej 	for (i = 0; i < NE2000_NDEVS; i++) {
    354      1.2  thorpej 		if ((ne_dev = ne2000_match(pa->card, pa->pf->number, i))
    355      1.2  thorpej 		    != NULL) {
    356      1.2  thorpej 			if (ne_dev->enet_maddr >= 0) {
    357      1.2  thorpej 				if (pcmcia_mem_alloc(pa->pf,
    358      1.2  thorpej 				    ETHER_ADDR_LEN * 2, &pcmh)) {
    359      1.2  thorpej 					printf("%s: can't alloc mem for"
    360      1.2  thorpej 					    " enet addr\n",
    361      1.2  thorpej 					    dsc->sc_dev.dv_xname);
    362      1.2  thorpej 					return;
    363      1.2  thorpej 				}
    364      1.2  thorpej 				if (pcmcia_mem_map(pa->pf, PCMCIA_MEM_ATTR,
    365      1.2  thorpej 				    ne_dev->enet_maddr, ETHER_ADDR_LEN * 2,
    366      1.2  thorpej 				    &pcmh, &offset, &mwindow)) {
    367      1.2  thorpej 					printf("%s: can't map mem for"
    368      1.2  thorpej 					    " enet addr\n",
    369      1.2  thorpej 					    dsc->sc_dev.dv_xname);
    370      1.2  thorpej 					return;
    371      1.2  thorpej 				}
    372      1.2  thorpej 				for (j = 0; j < ETHER_ADDR_LEN; j++)
    373      1.2  thorpej 					myea[j] = bus_space_read_1(pcmh.memt,
    374      1.2  thorpej 					    pcmh.memh, offset + (j * 2));
    375      1.2  thorpej 				pcmcia_mem_unmap(pa->pf, mwindow);
    376      1.2  thorpej 				pcmcia_mem_free(pa->pf, &pcmh);
    377      1.2  thorpej 				enaddr = myea;
    378      1.2  thorpej 			}
    379      1.2  thorpej 			break;
    380      1.2  thorpej 		}
    381      1.2  thorpej 	}
    382      1.2  thorpej 
    383      1.2  thorpej 	if (enaddr != NULL) {
    384      1.2  thorpej 		/*
    385      1.2  thorpej 		 * Make sure this is what we expect.
    386      1.2  thorpej 		 */
    387      1.2  thorpej 		if (enaddr[0] != ne_dev->enet_vendor[0] ||
    388      1.2  thorpej 		    enaddr[1] != ne_dev->enet_vendor[1] ||
    389      1.2  thorpej 		    enaddr[2] != ne_dev->enet_vendor[2]) {
    390      1.2  thorpej 			printf("\n%s: enet addr has incorrect vendor code\n",
    391      1.2  thorpej 			    dsc->sc_dev.dv_xname);
    392      1.2  thorpej 			printf("%s: (%02x:%02x:%02x should be "
    393      1.2  thorpej 			    "%02x:%02x:%02x)\n", dsc->sc_dev.dv_xname,
    394      1.2  thorpej 			    enaddr[0], enaddr[1], enaddr[2],
    395      1.2  thorpej 			    ne_dev->enet_vendor[0],
    396      1.2  thorpej 			    ne_dev->enet_vendor[1],
    397      1.2  thorpej 			    ne_dev->enet_vendor[2]);
    398      1.2  thorpej 			return;
    399      1.2  thorpej 		}
    400      1.2  thorpej 	}
    401      1.2  thorpej 
    402      1.2  thorpej 	printf("%s: %s Ethernet\n", dsc->sc_dev.dv_xname, ne_dev->name);
    403      1.2  thorpej 
    404      1.2  thorpej 	ne2000_attach(nsc, enaddr);
    405      1.2  thorpej 
    406      1.2  thorpej 	pcmcia_function_disable(pa->pf);
    407      1.2  thorpej }
    408      1.2  thorpej 
    409      1.2  thorpej int
    410      1.2  thorpej ne_pcmcia_enable(dsc)
    411      1.2  thorpej 	struct dp8390_softc *dsc;
    412      1.2  thorpej {
    413      1.2  thorpej 	struct ne_pcmcia_softc *psc = (struct ne_pcmcia_softc *)dsc;
    414      1.2  thorpej 
    415      1.2  thorpej 	/* set up the interrupt */
    416      1.2  thorpej 	psc->sc_ih = pcmcia_intr_establish(psc->sc_pf, IPL_NET, dp8390_intr,
    417      1.2  thorpej 	    dsc);
    418      1.2  thorpej 	if (psc->sc_ih == NULL) {
    419      1.2  thorpej 		printf("%s: couldn't establish interrupt\n",
    420      1.2  thorpej 		    dsc->sc_dev.dv_xname);
    421      1.2  thorpej 		return (1);
    422      1.2  thorpej 	}
    423      1.2  thorpej 
    424      1.2  thorpej 	return (pcmcia_function_enable(psc->sc_pf));
    425      1.2  thorpej }
    426      1.2  thorpej 
    427      1.2  thorpej void
    428      1.2  thorpej ne_pcmcia_disable(dsc)
    429      1.2  thorpej 	struct dp8390_softc *dsc;
    430      1.2  thorpej {
    431      1.2  thorpej 	struct ne_pcmcia_softc *psc = (struct ne_pcmcia_softc *)dsc;
    432      1.2  thorpej 
    433      1.2  thorpej 	pcmcia_function_disable(psc->sc_pf);
    434      1.2  thorpej 
    435      1.2  thorpej 	pcmcia_intr_disestablish(psc->sc_pf, psc->sc_ih);
    436      1.2  thorpej }
    437