[BACK]Return to if_ath_pci.c CVS log [TXT][DIR] Up to [local] / sys / dev / pci

Annotation of sys/dev/pci/if_ath_pci.c, Revision 1.1.1.1

1.1       nbrk        1: /*      $OpenBSD: if_ath_pci.c,v 1.15 2007/06/06 21:41:31 reyk Exp $   */
                      2: /*     $NetBSD: if_ath_pci.c,v 1.7 2004/06/30 05:58:17 mycroft Exp $   */
                      3:
                      4: /*-
                      5:  * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting
                      6:  * All rights reserved.
                      7:  *
                      8:  * Redistribution and use in source and binary forms, with or without
                      9:  * modification, are permitted provided that the following conditions
                     10:  * are met:
                     11:  * 1. Redistributions of source code must retain the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer,
                     13:  *    without modification.
                     14:  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
                     15:  *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
                     16:  *    redistribution must be conditioned upon including a substantially
                     17:  *    similar Disclaimer requirement for further binary redistribution.
                     18:  * 3. Neither the names of the above-listed copyright holders nor the names
                     19:  *    of any contributors may be used to endorse or promote products derived
                     20:  *    from this software without specific prior written permission.
                     21:  *
                     22:  * NO WARRANTY
                     23:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
                     24:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
                     25:  * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
                     26:  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
                     27:  * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
                     28:  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     29:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     30:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
                     31:  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     32:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
                     33:  * THE POSSIBILITY OF SUCH DAMAGES.
                     34:  */
                     35:
                     36: /*
                     37:  * PCI front-end for the Atheros Wireless LAN controller driver.
                     38:  */
                     39:
                     40: #include <sys/param.h>
                     41: #include <sys/systm.h>
                     42: #include <sys/mbuf.h>
                     43: #include <sys/malloc.h>
                     44: #include <sys/kernel.h>
                     45: #include <sys/lock.h>
                     46: #include <sys/socket.h>
                     47: #include <sys/sockio.h>
                     48: #include <sys/errno.h>
                     49: #include <sys/device.h>
                     50: #include <sys/gpio.h>
                     51:
                     52: #include <machine/bus.h>
                     53:
                     54: #include <net/if.h>
                     55: #include <net/if_dl.h>
                     56: #include <net/if_media.h>
                     57: #include <net/if_llc.h>
                     58: #include <net/if_arp.h>
                     59: #ifdef INET
                     60: #include <netinet/in.h>
                     61: #include <netinet/if_ether.h>
                     62: #endif
                     63:
                     64: #include <net80211/ieee80211_var.h>
                     65: #include <net80211/ieee80211_rssadapt.h>
                     66:
                     67: #include <dev/gpio/gpiovar.h>
                     68:
                     69: #include <dev/pci/pcivar.h>
                     70: #include <dev/pci/pcireg.h>
                     71: #include <dev/pci/pcidevs.h>
                     72:
                     73: #include <dev/ic/athvar.h>
                     74:
                     75: /*
                     76:  * PCI glue.
                     77:  */
                     78:
                     79: struct ath_pci_softc {
                     80:        struct ath_softc        sc_sc;
                     81:
                     82:        pci_chipset_tag_t       sc_pc;
                     83:        pcitag_t                sc_pcitag;
                     84:
                     85:        void                    *sc_ih;         /* interrupt handler */
                     86: };
                     87:
                     88: /* Base Address Register */
                     89: #define ATH_BAR0       0x10
                     90:
                     91: int     ath_pci_match(struct device *, void *, void *);
                     92: void    ath_pci_attach(struct device *, struct device *, void *);
                     93: void    ath_pci_shutdown(void *);
                     94: int     ath_pci_detach(struct device *, int);
                     95:
                     96: struct cfattach ath_pci_ca = {
                     97:        sizeof(struct ath_pci_softc),
                     98:        ath_pci_match,
                     99:        ath_pci_attach,
                    100:        ath_pci_detach
                    101: };
                    102:
                    103: int
                    104: ath_pci_match(struct device *parent, void *match, void *aux)
                    105: {
                    106:        const char* devname;
                    107:        struct pci_attach_args *pa = aux;
                    108:        pci_vendor_id_t vendor;
                    109:
                    110:        vendor = PCI_VENDOR(pa->pa_id);
                    111:        if (vendor == 0x128c)
                    112:                vendor = PCI_VENDOR_ATHEROS;
                    113:        devname = ath_hal_probe(vendor, PCI_PRODUCT(pa->pa_id));
                    114:        if (devname)
                    115:                return 1;
                    116:
                    117:        return 0;
                    118: }
                    119:
                    120: void
                    121: ath_pci_attach(struct device *parent, struct device *self, void *aux)
                    122: {
                    123:        struct ath_pci_softc *psc = (struct ath_pci_softc *)self;
                    124:        struct ath_softc *sc = &psc->sc_sc;
                    125:        struct pci_attach_args *pa = aux;
                    126:        pci_chipset_tag_t pc = pa->pa_pc;
                    127:        pcitag_t pt = pa->pa_tag;
                    128:        bus_space_tag_t iot;
                    129:        bus_space_handle_t ioh;
                    130:        pci_intr_handle_t ih;
                    131:        pcireg_t mem_type;
                    132:        void *hook;
                    133:        const char *intrstr = NULL;
                    134:
                    135:        psc->sc_pc = pc;
                    136:        psc->sc_pcitag = pt;
                    137:
                    138:        /*
                    139:         * Setup memory-mapping of PCI registers.
                    140:         */
                    141:        mem_type = pci_mapreg_type(pc, pa->pa_tag, ATH_BAR0);
                    142:        if (mem_type != PCI_MAPREG_TYPE_MEM &&
                    143:            mem_type != PCI_MAPREG_MEM_TYPE_64BIT) {
                    144:                printf(": bad PCI register type %d\n", (int)mem_type);
                    145:                goto bad;
                    146:        }
                    147:        if (mem_type == PCI_MAPREG_MEM_TYPE_64BIT)
                    148:                sc->sc_64bit = 1;
                    149:        if (pci_mapreg_map(pa, ATH_BAR0, mem_type, 0, &iot, &ioh,
                    150:            NULL, NULL, 0)) {
                    151:                printf(": cannot map register space\n");
                    152:                goto bad;
                    153:        }
                    154:        sc->sc_st = iot;
                    155:        sc->sc_sh = ioh;
                    156:
                    157:        sc->sc_invalid = 1;
                    158:
                    159:        /*
                    160:         * Arrange interrupt line.
                    161:         */
                    162:        if (pci_intr_map(pa, &ih)) {
                    163:                printf(": couldn't map interrupt\n");
                    164:                goto bad1;
                    165:        }
                    166:
                    167:        intrstr = pci_intr_string(pc, ih);
                    168:        psc->sc_ih = pci_intr_establish(pc, ih, IPL_NET, ath_intr, sc,
                    169:            sc->sc_dev.dv_xname);
                    170:        if (psc->sc_ih == NULL) {
                    171:                printf(": couldn't map interrupt\n");
                    172:                goto bad2;
                    173:        }
                    174:
                    175:        printf(": %s\n", intrstr);
                    176:
                    177:        sc->sc_dmat = pa->pa_dmat;
                    178:
                    179:        hook = shutdownhook_establish(ath_pci_shutdown, psc);
                    180:        if (hook == NULL) {
                    181:                printf(": couldn't make shutdown hook\n");
                    182:                goto bad3;
                    183:        }
                    184:
                    185:        if (ath_attach(PCI_PRODUCT(pa->pa_id), sc) == 0)
                    186:                return;
                    187:
                    188:        shutdownhook_disestablish(hook);
                    189:
                    190: bad3:  pci_intr_disestablish(pc, psc->sc_ih);
                    191: bad2:  /* XXX */
                    192: bad1:  /* XXX */
                    193: bad:
                    194:        return;
                    195: }
                    196:
                    197: int
                    198: ath_pci_detach(struct device *self, int flags)
                    199: {
                    200:        struct ath_pci_softc *psc = (struct ath_pci_softc *)self;
                    201:
                    202:        ath_detach(&psc->sc_sc, flags);
                    203:        pci_intr_disestablish(psc->sc_pc, psc->sc_ih);
                    204:
                    205:        return (0);
                    206: }
                    207:
                    208: void
                    209: ath_pci_shutdown(void *self)
                    210: {
                    211:        struct ath_pci_softc *psc = (struct ath_pci_softc *)self;
                    212:
                    213:        ath_shutdown(&psc->sc_sc);
                    214: }

CVSweb