Home | History | Annotate | Line # | Download | only in isa
if_ne_isa.c revision 1.21.22.2
      1  1.21.22.2      yamt /*	$NetBSD: if_ne_isa.c,v 1.21.22.2 2006/12/10 07:17:27 yamt Exp $	*/
      2        1.2   thorpej 
      3        1.2   thorpej /*-
      4        1.8   thorpej  * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
      5        1.2   thorpej  * All rights reserved.
      6        1.2   thorpej  *
      7        1.2   thorpej  * This code is derived from software contributed to The NetBSD Foundation
      8        1.2   thorpej  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
      9        1.2   thorpej  * NASA Ames Research Center.
     10        1.2   thorpej  *
     11        1.2   thorpej  * Redistribution and use in source and binary forms, with or without
     12        1.2   thorpej  * modification, are permitted provided that the following conditions
     13        1.2   thorpej  * are met:
     14        1.2   thorpej  * 1. Redistributions of source code must retain the above copyright
     15        1.2   thorpej  *    notice, this list of conditions and the following disclaimer.
     16        1.2   thorpej  * 2. Redistributions in binary form must reproduce the above copyright
     17        1.2   thorpej  *    notice, this list of conditions and the following disclaimer in the
     18        1.2   thorpej  *    documentation and/or other materials provided with the distribution.
     19        1.2   thorpej  * 3. All advertising materials mentioning features or use of this software
     20        1.2   thorpej  *    must display the following acknowledgement:
     21        1.2   thorpej  *	This product includes software developed by the NetBSD
     22        1.2   thorpej  *	Foundation, Inc. and its contributors.
     23        1.2   thorpej  * 4. Neither the name of The NetBSD Foundation nor the names of its
     24        1.2   thorpej  *    contributors may be used to endorse or promote products derived
     25        1.2   thorpej  *    from this software without specific prior written permission.
     26        1.2   thorpej  *
     27        1.2   thorpej  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     28        1.2   thorpej  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     29        1.2   thorpej  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     30        1.2   thorpej  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     31        1.2   thorpej  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     32        1.2   thorpej  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     33        1.2   thorpej  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     34        1.2   thorpej  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     35        1.2   thorpej  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     36        1.2   thorpej  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     37        1.2   thorpej  * POSSIBILITY OF SUCH DAMAGE.
     38        1.2   thorpej  */
     39       1.12     lukem 
     40       1.12     lukem #include <sys/cdefs.h>
     41  1.21.22.2      yamt __KERNEL_RCSID(0, "$NetBSD: if_ne_isa.c,v 1.21.22.2 2006/12/10 07:17:27 yamt Exp $");
     42        1.2   thorpej 
     43        1.2   thorpej #include <sys/param.h>
     44        1.2   thorpej #include <sys/systm.h>
     45        1.2   thorpej #include <sys/mbuf.h>
     46        1.2   thorpej #include <sys/socket.h>
     47        1.2   thorpej #include <sys/ioctl.h>
     48        1.2   thorpej #include <sys/errno.h>
     49        1.2   thorpej #include <sys/syslog.h>
     50        1.2   thorpej #include <sys/select.h>
     51        1.2   thorpej #include <sys/device.h>
     52        1.2   thorpej 
     53        1.2   thorpej #include <net/if.h>
     54        1.2   thorpej #include <net/if_dl.h>
     55        1.2   thorpej #include <net/if_ether.h>
     56        1.2   thorpej #include <net/if_media.h>
     57        1.2   thorpej 
     58        1.2   thorpej #include <machine/intr.h>
     59        1.2   thorpej #include <machine/bus.h>
     60        1.2   thorpej 
     61        1.2   thorpej #include <dev/ic/dp8390reg.h>
     62        1.2   thorpej #include <dev/ic/dp8390var.h>
     63        1.2   thorpej 
     64        1.2   thorpej #include <dev/ic/ne2000reg.h>
     65        1.2   thorpej #include <dev/ic/ne2000var.h>
     66        1.2   thorpej 
     67        1.8   thorpej #include <dev/ic/rtl80x9reg.h>
     68       1.20     perry #include <dev/ic/rtl80x9var.h>
     69        1.8   thorpej 
     70        1.2   thorpej #include <dev/isa/isavar.h>
     71        1.2   thorpej 
     72       1.19     perry int	ne_isa_match(struct device *, struct cfdata *, void *);
     73       1.19     perry void	ne_isa_attach(struct device *, struct device *, void *);
     74        1.2   thorpej 
     75        1.2   thorpej struct ne_isa_softc {
     76        1.2   thorpej 	struct	ne2000_softc sc_ne2000;		/* real "ne2000" softc */
     77        1.2   thorpej 
     78        1.2   thorpej 	/* ISA-specific goo. */
     79        1.2   thorpej 	void	*sc_ih;				/* interrupt cookie */
     80        1.2   thorpej };
     81        1.2   thorpej 
     82       1.15   thorpej CFATTACH_DECL(ne_isa, sizeof(struct ne_isa_softc),
     83       1.16   thorpej     ne_isa_match, ne_isa_attach, NULL, NULL);
     84        1.2   thorpej 
     85        1.2   thorpej int
     86  1.21.22.2      yamt ne_isa_match(struct device *parent, struct cfdata *match,
     87  1.21.22.1      yamt     void *aux)
     88        1.2   thorpej {
     89        1.2   thorpej 	struct isa_attach_args *ia = aux;
     90        1.2   thorpej 	bus_space_tag_t nict = ia->ia_iot;
     91        1.2   thorpej 	bus_space_handle_t nich;
     92        1.2   thorpej 	bus_space_tag_t asict;
     93        1.2   thorpej 	bus_space_handle_t asich;
     94        1.2   thorpej 	int rv = 0;
     95        1.2   thorpej 
     96       1.13   thorpej 	if (ia->ia_nio < 1)
     97       1.13   thorpej 		return (0);
     98       1.13   thorpej 	if (ia->ia_nirq < 1)
     99       1.13   thorpej 		return (0);
    100       1.13   thorpej 
    101       1.13   thorpej 	if (ISA_DIRECT_CONFIG(ia))
    102       1.13   thorpej 		return (0);
    103       1.13   thorpej 
    104        1.2   thorpej 	/* Disallow wildcarded values. */
    105       1.18  drochner 	if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT)
    106        1.2   thorpej 		return (0);
    107       1.18  drochner 	if (ia->ia_irq[0].ir_irq == ISA_UNKNOWN_IRQ)
    108        1.2   thorpej 		return (0);
    109        1.2   thorpej 
    110        1.2   thorpej 	/* Make sure this is a valid NE[12]000 i/o address. */
    111       1.13   thorpej 	if ((ia->ia_io[0].ir_addr & 0x1f) != 0)
    112        1.2   thorpej 		return (0);
    113        1.2   thorpej 
    114        1.2   thorpej 	/* Map i/o space. */
    115       1.13   thorpej 	if (bus_space_map(nict, ia->ia_io[0].ir_addr, NE2000_NPORTS, 0, &nich))
    116        1.2   thorpej 		return (0);
    117        1.2   thorpej 
    118        1.2   thorpej 	asict = nict;
    119        1.2   thorpej 	if (bus_space_subregion(nict, nich, NE2000_ASIC_OFFSET,
    120        1.2   thorpej 	    NE2000_ASIC_NPORTS, &asich))
    121        1.2   thorpej 		goto out;
    122        1.2   thorpej 
    123        1.2   thorpej 	/* Look for an NE2000-compatible card. */
    124        1.2   thorpej 	rv = ne2000_detect(nict, nich, asict, asich);
    125        1.2   thorpej 
    126       1.13   thorpej 	if (rv) {
    127       1.13   thorpej 		ia->ia_nio = 1;
    128       1.13   thorpej 		ia->ia_io[0].ir_size = NE2000_NPORTS;
    129       1.13   thorpej 
    130       1.13   thorpej 		ia->ia_nirq = 1;
    131       1.13   thorpej 
    132       1.13   thorpej 		ia->ia_niomem = 0;
    133       1.13   thorpej 		ia->ia_ndrq = 0;
    134       1.13   thorpej 	}
    135        1.2   thorpej 
    136        1.2   thorpej  out:
    137        1.2   thorpej 	bus_space_unmap(nict, nich, NE2000_NPORTS);
    138        1.2   thorpej 	return (rv);
    139        1.2   thorpej }
    140        1.2   thorpej 
    141        1.2   thorpej void
    142  1.21.22.2      yamt ne_isa_attach(struct device *parent, struct device *self, void *aux)
    143        1.2   thorpej {
    144        1.2   thorpej 	struct ne_isa_softc *isc = (struct ne_isa_softc *)self;
    145        1.2   thorpej 	struct ne2000_softc *nsc = &isc->sc_ne2000;
    146        1.2   thorpej 	struct dp8390_softc *dsc = &nsc->sc_dp8390;
    147        1.2   thorpej 	struct isa_attach_args *ia = aux;
    148        1.2   thorpej 	bus_space_tag_t nict = ia->ia_iot;
    149        1.2   thorpej 	bus_space_handle_t nich;
    150        1.2   thorpej 	bus_space_tag_t asict = nict;
    151        1.2   thorpej 	bus_space_handle_t asich;
    152        1.2   thorpej 	const char *typestr;
    153        1.8   thorpej 	int netype;
    154        1.2   thorpej 
    155        1.2   thorpej 	printf("\n");
    156        1.2   thorpej 
    157        1.2   thorpej 	/* Map i/o space. */
    158       1.13   thorpej 	if (bus_space_map(nict, ia->ia_io[0].ir_addr, NE2000_NPORTS,
    159       1.13   thorpej 	    0, &nich)) {
    160        1.2   thorpej 		printf("%s: can't map i/o space\n", dsc->sc_dev.dv_xname);
    161        1.2   thorpej 		return;
    162        1.2   thorpej 	}
    163        1.2   thorpej 
    164        1.2   thorpej 	if (bus_space_subregion(nict, nich, NE2000_ASIC_OFFSET,
    165        1.2   thorpej 	    NE2000_ASIC_NPORTS, &asich)) {
    166        1.2   thorpej 		printf("%s: can't subregion i/o space\n", dsc->sc_dev.dv_xname);
    167        1.2   thorpej 		return;
    168        1.2   thorpej 	}
    169        1.2   thorpej 
    170        1.2   thorpej 	dsc->sc_regt = nict;
    171        1.2   thorpej 	dsc->sc_regh = nich;
    172        1.2   thorpej 
    173        1.2   thorpej 	nsc->sc_asict = asict;
    174        1.2   thorpej 	nsc->sc_asich = asich;
    175        1.2   thorpej 
    176        1.2   thorpej 	/*
    177        1.2   thorpej 	 * Detect it again, so we can print some information about the
    178        1.2   thorpej 	 * interface.
    179        1.2   thorpej 	 */
    180        1.8   thorpej 	netype = ne2000_detect(nict, nich, asict, asich);
    181        1.8   thorpej 	switch (netype) {
    182        1.2   thorpej 	case NE2000_TYPE_NE1000:
    183        1.2   thorpej 		typestr = "NE1000";
    184        1.2   thorpej 		break;
    185        1.2   thorpej 
    186        1.2   thorpej 	case NE2000_TYPE_NE2000:
    187        1.2   thorpej 		typestr = "NE2000";
    188        1.8   thorpej 		/*
    189       1.17       wiz 		 * Check for a Realtek 8019.
    190        1.8   thorpej 		 */
    191        1.8   thorpej 		bus_space_write_1(nict, nich, ED_P0_CR,
    192        1.8   thorpej 		    ED_CR_PAGE_0 | ED_CR_STP);
    193        1.8   thorpej 		if (bus_space_read_1(nict, nich, NERTL_RTL0_8019ID0) ==
    194        1.8   thorpej 								RTL0_8019ID0 &&
    195        1.8   thorpej 		    bus_space_read_1(nict, nich, NERTL_RTL0_8019ID1) ==
    196        1.8   thorpej 								RTL0_8019ID1) {
    197        1.9  christos 			typestr = "NE2000 (RTL8019)";
    198        1.8   thorpej 			dsc->sc_mediachange = rtl80x9_mediachange;
    199        1.8   thorpej 			dsc->sc_mediastatus = rtl80x9_mediastatus;
    200        1.8   thorpej 			dsc->init_card = rtl80x9_init_card;
    201       1.10   thorpej 			dsc->sc_media_init = rtl80x9_media_init;
    202        1.8   thorpej 		}
    203        1.2   thorpej 		break;
    204        1.2   thorpej 
    205        1.2   thorpej 	default:
    206        1.2   thorpej 		printf("%s: where did the card go?!\n", dsc->sc_dev.dv_xname);
    207        1.2   thorpej 		return;
    208        1.2   thorpej 	}
    209        1.2   thorpej 
    210        1.2   thorpej 	printf("%s: %s Ethernet\n", dsc->sc_dev.dv_xname, typestr);
    211        1.2   thorpej 
    212        1.2   thorpej 	/* This interface is always enabled. */
    213        1.2   thorpej 	dsc->sc_enabled = 1;
    214        1.2   thorpej 
    215        1.2   thorpej 	/*
    216        1.2   thorpej 	 * Do generic NE2000 attach.  This will read the station address
    217        1.2   thorpej 	 * from the EEPROM.
    218        1.2   thorpej 	 */
    219       1.10   thorpej 	ne2000_attach(nsc, NULL);
    220        1.2   thorpej 
    221        1.2   thorpej 	/* Establish the interrupt handler. */
    222       1.13   thorpej 	isc->sc_ih = isa_intr_establish(ia->ia_ic, ia->ia_irq[0].ir_irq,
    223       1.13   thorpej 	    IST_EDGE, IPL_NET, dp8390_intr, dsc);
    224        1.2   thorpej 	if (isc->sc_ih == NULL)
    225        1.2   thorpej 		printf("%s: couldn't establish interrupt handler\n",
    226        1.2   thorpej 		    dsc->sc_dev.dv_xname);
    227        1.2   thorpej }
    228