The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/isapnp/if_le_isapnp.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: if_le_isapnp.c,v 1.24 2002/10/04 16:16:32 tsutsui Exp $        */
    2 
    3 /*-
    4  * Copyright (c) 1997 The NetBSD Foundation, Inc.
    5  * All rights reserved.
    6  *
    7  * This code is derived from software contributed to The NetBSD Foundation
    8  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
    9  * NASA Ames Research Center.
   10  *
   11  * Redistribution and use in source and binary forms, with or without
   12  * modification, are permitted provided that the following conditions
   13  * are met:
   14  * 1. Redistributions of source code must retain the above copyright
   15  *    notice, this list of conditions and the following disclaimer.
   16  * 2. Redistributions in binary form must reproduce the above copyright
   17  *    notice, this list of conditions and the following disclaimer in the
   18  *    documentation and/or other materials provided with the distribution.
   19  * 3. All advertising materials mentioning features or use of this software
   20  *    must display the following acknowledgement:
   21  *      This product includes software developed by the NetBSD
   22  *      Foundation, Inc. and its contributors.
   23  * 4. Neither the name of The NetBSD Foundation nor the names of its
   24  *    contributors may be used to endorse or promote products derived
   25  *    from this software without specific prior written permission.
   26  *
   27  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   28  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   29  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   30  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   31  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   32  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   33  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   34  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   35  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   36  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   37  * POSSIBILITY OF SUCH DAMAGE.
   38  */
   39 
   40 /*
   41  * Copyright (c) 1997 Jonathan Stone <jonathan@NetBSD.org> and 
   42  * Matthias Drochner. All rights reserved.
   43  *
   44  * Redistribution and use in source and binary forms, with or without
   45  * modification, are permitted provided that the following conditions
   46  * are met:
   47  * 1. Redistributions of source code must retain the above copyright
   48  *    notice, this list of conditions and the following disclaimer.
   49  * 2. Redistributions in binary form must reproduce the above copyright
   50  *    notice, this list of conditions and the following disclaimer in the
   51  *    documentation and/or other materials provided with the distribution.
   52  * 3. All advertising materials mentioning features or use of this software
   53  *    must display the following acknowledgement:
   54  *      This product includes software developed by Jonathan Stone.
   55  * 4. The name of the author may not be used to endorse or promote products
   56  *    derived from this software without specific prior written permission.
   57  *
   58  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   59  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   60  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   61  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   62  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   63  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   64  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   65  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   66  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   67  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   68  */
   69 
   70 #include <sys/cdefs.h>
   71 __KERNEL_RCSID(0, "$NetBSD: if_le_isapnp.c,v 1.24 2002/10/04 16:16:32 tsutsui Exp $");
   72 
   73 #include <sys/param.h>
   74 #include <sys/systm.h>
   75 #include <sys/mbuf.h>
   76 #include <sys/socket.h>
   77 #include <sys/ioctl.h>
   78 #include <sys/errno.h>
   79 #include <sys/syslog.h>
   80 #include <sys/select.h>
   81 #include <sys/device.h>
   82 
   83 #include <uvm/uvm_extern.h>
   84 
   85 #include <net/if.h>
   86 #include <net/if_dl.h>
   87 #include <net/if_ether.h>
   88 #include <net/if_media.h>
   89 
   90 #include <machine/cpu.h>
   91 #include <machine/bus.h>
   92 #include <machine/intr.h>
   93 
   94 #include <dev/isa/isavar.h>
   95 #include <dev/isa/isadmavar.h>
   96 
   97 #include <dev/isapnp/isapnpreg.h>
   98 #include <dev/isapnp/isapnpvar.h>
   99 #include <dev/isapnp/isapnpdevs.h>
  100 
  101 #include <dev/ic/lancereg.h>
  102 #include <dev/ic/lancevar.h>
  103 #include <dev/ic/am7990reg.h>
  104 #include <dev/ic/am7990var.h>
  105 
  106 #define LE_ISAPNP_MEMSIZE       16384
  107 
  108 #define PCNET_SAPROM    0x00
  109 #define PCNET_RDP       0x10
  110 #define PCNET_RAP       0x12
  111 
  112 /*
  113  * Ethernet software status per interface.
  114  *
  115  * Each interface is referenced by a network interface structure,
  116  * ethercom.ec_if, which the routing code uses to locate the interface.
  117  * This structure contains the output queue for the interface, its address, ...
  118  */
  119 struct le_isapnp_softc {
  120         struct  am7990_softc sc_am7990; /* glue to MI code */
  121 
  122         void    *sc_ih;
  123         bus_space_tag_t sc_iot;         /* space cookie */
  124         bus_space_handle_t sc_ioh;      /* bus space handle */
  125         bus_dma_tag_t   sc_dmat;        /* bus dma tag */
  126         bus_dmamap_t    sc_dmam;        /* bus dma map */
  127         int     sc_rap, sc_rdp;         /* offsets to LANCE registers */
  128 };
  129 
  130 int le_isapnp_match __P((struct device *, struct cfdata *, void *));
  131 void le_isapnp_attach __P((struct device *, struct device *, void *));
  132 
  133 CFATTACH_DECL(le_isapnp, sizeof(struct le_isapnp_softc),
  134     le_isapnp_match, le_isapnp_attach, NULL, NULL);
  135 
  136 int     le_isapnp_intredge __P((void *));
  137 static void le_isapnp_wrcsr __P((struct lance_softc *, u_int16_t, u_int16_t));
  138 static u_int16_t le_isapnp_rdcsr __P((struct lance_softc *, u_int16_t));
  139 
  140 static void
  141 le_isapnp_wrcsr(sc, port, val)
  142         struct lance_softc *sc;
  143         u_int16_t port, val;
  144 {
  145         struct le_isapnp_softc *lesc = (struct le_isapnp_softc *)sc;
  146         bus_space_tag_t iot = lesc->sc_iot;
  147         bus_space_handle_t ioh = lesc->sc_ioh;
  148 
  149         bus_space_write_2(iot, ioh, lesc->sc_rap, port);
  150         bus_space_write_2(iot, ioh, lesc->sc_rdp, val);
  151 }
  152 
  153 static u_int16_t
  154 le_isapnp_rdcsr(sc, port)
  155         struct lance_softc *sc;
  156         u_int16_t port;
  157 {
  158         struct le_isapnp_softc *lesc = (struct le_isapnp_softc *)sc;
  159         bus_space_tag_t iot = lesc->sc_iot;
  160         bus_space_handle_t ioh = lesc->sc_ioh;
  161         u_int16_t val;
  162 
  163         bus_space_write_2(iot, ioh, lesc->sc_rap, port);
  164         val = bus_space_read_2(iot, ioh, lesc->sc_rdp);
  165         return (val);
  166 }
  167 
  168 int
  169 le_isapnp_match(parent, match, aux)
  170         struct device *parent;
  171         struct cfdata *match;
  172         void *aux;
  173 {
  174         int pri, variant;
  175 
  176         pri = isapnp_devmatch(aux, &isapnp_le_devinfo, &variant);
  177         if (pri && variant > 0)
  178                 pri = 0;
  179         return (pri);
  180 }
  181 
  182 void
  183 le_isapnp_attach(parent, self, aux)
  184         struct device *parent, *self;
  185         void *aux;
  186 {
  187         struct le_isapnp_softc *lesc = (struct le_isapnp_softc *)self;
  188         struct lance_softc *sc = &lesc->sc_am7990.lsc;
  189         struct isapnp_attach_args *ipa = aux;
  190         bus_space_tag_t iot;
  191         bus_space_handle_t ioh;
  192         bus_dma_tag_t dmat;
  193         bus_dma_segment_t seg;
  194         int i, rseg, error;
  195 
  196         if (isapnp_config(ipa->ipa_iot, ipa->ipa_memt, ipa)) {
  197                 printf(": error in region allocation\n");
  198                 return;
  199         }
  200 
  201         lesc->sc_iot = iot = ipa->ipa_iot;
  202         lesc->sc_ioh = ioh = ipa->ipa_io[0].h;
  203         lesc->sc_dmat = dmat = ipa->ipa_dmat;
  204 
  205         lesc->sc_rap = PCNET_RAP;
  206         lesc->sc_rdp = PCNET_RDP;
  207 
  208         /*
  209          * Extract the physical MAC address from the ROM.
  210          */
  211         for (i = 0; i < sizeof(sc->sc_enaddr); i++)
  212                 sc->sc_enaddr[i] = bus_space_read_1(iot, ioh, PCNET_SAPROM + i);
  213 
  214         /*
  215          * Allocate a DMA area for the card.
  216          */
  217         if (bus_dmamem_alloc(dmat, LE_ISAPNP_MEMSIZE, PAGE_SIZE, 0, &seg, 1,
  218             &rseg, BUS_DMA_NOWAIT)) {
  219                 printf(": couldn't allocate memory for card\n");
  220                 return;
  221         }
  222         if (bus_dmamem_map(dmat, &seg, rseg, LE_ISAPNP_MEMSIZE,
  223             (caddr_t *)&sc->sc_mem, BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) {
  224                 printf(": couldn't map memory for card\n");
  225                 return;
  226         }
  227 
  228         /*
  229          * Create and load the DMA map for the DMA area.
  230          */
  231         if (bus_dmamap_create(dmat, LE_ISAPNP_MEMSIZE, 1,
  232             LE_ISAPNP_MEMSIZE, 0, BUS_DMA_NOWAIT, &lesc->sc_dmam)) {
  233                 printf(": couldn't create DMA map\n");
  234                 bus_dmamem_free(dmat, &seg, rseg);
  235                 return;
  236         }
  237         if (bus_dmamap_load(dmat, lesc->sc_dmam,
  238             sc->sc_mem, LE_ISAPNP_MEMSIZE, NULL, BUS_DMA_NOWAIT)) {
  239                 printf(": coundn't load DMA map\n");
  240                 bus_dmamem_free(dmat, &seg, rseg);
  241                 return;
  242         }
  243 
  244         sc->sc_conf3 = 0;
  245         sc->sc_addr = lesc->sc_dmam->dm_segs[0].ds_addr;
  246         sc->sc_memsize = LE_ISAPNP_MEMSIZE;
  247 
  248         sc->sc_copytodesc = lance_copytobuf_contig;
  249         sc->sc_copyfromdesc = lance_copyfrombuf_contig;
  250         sc->sc_copytobuf = lance_copytobuf_contig;
  251         sc->sc_copyfrombuf = lance_copyfrombuf_contig;
  252         sc->sc_zerobuf = lance_zerobuf_contig;
  253 
  254         sc->sc_rdcsr = le_isapnp_rdcsr;
  255         sc->sc_wrcsr = le_isapnp_wrcsr;
  256         sc->sc_hwinit = NULL;
  257 
  258         if (ipa->ipa_ndrq > 0) {
  259                 if ((error = isa_dmacascade(ipa->ipa_ic,
  260                     ipa->ipa_drq[0].num)) != 0) {
  261                         printf(": unable to cascade DRQ, error = %d\n", error);
  262                         return;
  263                 }
  264         }
  265 
  266         lesc->sc_ih = isa_intr_establish(ipa->ipa_ic, ipa->ipa_irq[0].num,
  267             ipa->ipa_irq[0].type, IPL_NET, le_isapnp_intredge, sc);
  268 
  269         printf(": %s %s\n", ipa->ipa_devident, ipa->ipa_devclass);
  270 
  271         printf("%s", sc->sc_dev.dv_xname);
  272         am7990_config(&lesc->sc_am7990);
  273 }
  274 
  275 
  276 /*
  277  * Controller interrupt.
  278  */
  279 int
  280 le_isapnp_intredge(arg)
  281         void *arg;
  282 {
  283 
  284         if (am7990_intr(arg) == 0)
  285                 return (0);
  286         for (;;)
  287                 if (am7990_intr(arg) == 0)
  288                         return (1);
  289 }

Cache object: b3ece4c275ced9a54f22cb037073c28a


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.