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

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

1.1       nbrk        1: /*     $OpenBSD: adw_pci.c,v 1.14 2007/04/10 17:47:55 miod Exp $ */
                      2: /* $NetBSD: adw_pci.c,v 1.7 2000/05/26 15:13:46 dante Exp $     */
                      3:
                      4: /*
                      5:  * Copyright (c) 1998, 1999, 2000 The NetBSD Foundation, Inc.
                      6:  * All rights reserved.
                      7:  *
                      8:  * Author: Baldassare Dante Profeta <dante@mclink.it>
                      9:  *
                     10:  * Redistribution and use in source and binary forms, with or without
                     11:  * modification, are permitted provided that the following conditions
                     12:  * are met:
                     13:  * 1. Redistributions of source code must retain the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer.
                     15:  * 2. Redistributions in binary form must reproduce the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer in the
                     17:  *    documentation and/or other materials provided with the distribution.
                     18:  * 3. All advertising materials mentioning features or use of this software
                     19:  *    must display the following acknowledgement:
                     20:  *        This product includes software developed by the NetBSD
                     21:  *        Foundation, Inc. and its contributors.
                     22:  * 4. Neither the name of The NetBSD Foundation nor the names of its
                     23:  *    contributors may be used to endorse or promote products derived
                     24:  *    from this software without specific prior written permission.
                     25:  *
                     26:  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
                     27:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     28:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
                     29:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
                     30:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     31:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     32:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     33:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     34:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     35:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     36:  * POSSIBILITY OF SUCH DAMAGE.
                     37:  */
                     38: /*
                     39:  * Device probe and attach routines for the following
                     40:  * Advanced Systems Inc. SCSI controllers:
                     41:  *
                     42:  *      ABP-940UW      - Bus-Master PCI Ultra-Wide (253 CDB)
                     43:  *     ABP-940UW (68)  - Bus-Master PCI Ultra-Wide (253 CDB)
                     44:  *     ABP-940UWD      - Bus-Master PCI Ultra-Wide (253 CDB)
                     45:  *     ABP-970UW       - Bus-Master PCI Ultra-Wide (253 CDB)
                     46:  *     ASB-3940UW      - Bus-Master PCI Ultra-Wide (253 CDB)
                     47:  *     ASB-3940U2W-00  - Bus-Master PCI Ultra2-Wide (253 CDB)
                     48:  *     ASB-3940U3W-00  - Bus-Master PCI Ultra3-Wide (253 CDB)
                     49:  */
                     50:
                     51: #include <sys/types.h>
                     52: #include <sys/param.h>
                     53: #include <sys/systm.h>
                     54: #include <sys/malloc.h>
                     55: #include <sys/kernel.h>
                     56: #include <sys/queue.h>
                     57: #include <sys/device.h>
                     58: #include <sys/timeout.h>
                     59:
                     60: #include <machine/bus.h>
                     61: #include <machine/intr.h>
                     62:
                     63: #include <scsi/scsi_all.h>
                     64: #include <scsi/scsiconf.h>
                     65:
                     66: #include <dev/pci/pcireg.h>
                     67: #include <dev/pci/pcivar.h>
                     68: #include <dev/pci/pcidevs.h>
                     69:
                     70: #include <dev/ic/adwlib.h>
                     71: #include <dev/microcode/adw/adwmcode.h>
                     72: #include <dev/ic/adw.h>
                     73:
                     74: /******************************************************************************/
                     75:
                     76: #define PCI_BASEADR_IO        0x10
                     77:
                     78: /******************************************************************************/
                     79:
                     80: int adw_pci_match(struct device *, void *, void *);
                     81: void adw_pci_attach(struct device *, struct device *, void *);
                     82:
                     83: struct cfattach adw_pci_ca =
                     84: {
                     85:        sizeof(ADW_SOFTC), adw_pci_match, adw_pci_attach
                     86: };
                     87:
                     88: const struct pci_matchid adw_pci_devices[] = {
                     89:        { PCI_VENDOR_ADVSYS, PCI_PRODUCT_ADVSYS_WIDE },
                     90:        { PCI_VENDOR_ADVSYS, PCI_PRODUCT_ADVSYS_U2W },
                     91:        { PCI_VENDOR_ADVSYS, PCI_PRODUCT_ADVSYS_U3W },
                     92: };
                     93:
                     94: /******************************************************************************/
                     95: /*
                     96:  * Check the slots looking for a board we recognise
                     97:  * If we find one, note its address (slot) and call
                     98:  * the actual probe routine to check it out.
                     99:  */
                    100: int
                    101: adw_pci_match(parent, match, aux)
                    102:        struct device  *parent;
                    103:        void           *match;
                    104:        void           *aux;
                    105: {
                    106:        return (pci_matchbyid((struct pci_attach_args *)aux, adw_pci_devices,
                    107:            sizeof(adw_pci_devices)/sizeof(adw_pci_devices[0])));
                    108: }
                    109:
                    110:
                    111: void
                    112: adw_pci_attach(parent, self, aux)
                    113:        struct device  *parent, *self;
                    114:        void           *aux;
                    115: {
                    116:        struct pci_attach_args *pa = aux;
                    117:        ADW_SOFTC      *sc = (void *) self;
                    118:        bus_space_tag_t iot;
                    119:        bus_space_handle_t ioh;
                    120:        pci_intr_handle_t ih;
                    121:        pci_chipset_tag_t pc = pa->pa_pc;
                    122:        pcireg_t        command;
                    123:        const char     *intrstr;
                    124:
                    125:        /*
                    126:         * Set chip type
                    127:         */
                    128:        switch (PCI_PRODUCT(pa->pa_id)) {
                    129:        case PCI_PRODUCT_ADVSYS_WIDE:
                    130:                sc->chip_type = ADW_CHIP_ASC3550;
                    131:                break;
                    132:
                    133:        case PCI_PRODUCT_ADVSYS_U2W:
                    134:                sc->chip_type = ADW_CHIP_ASC38C0800;
                    135:                break;
                    136:
                    137:        case PCI_PRODUCT_ADVSYS_U3W:
                    138:                sc->chip_type = ADW_CHIP_ASC38C1600;
                    139:                break;
                    140:
                    141:        default:
                    142:                printf("\n%s: unknown model: %d\n", sc->sc_dev.dv_xname,
                    143:                       PCI_PRODUCT(pa->pa_id));
                    144:                return;
                    145:        }
                    146:
                    147:        command = pci_conf_read(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
                    148:        if ( (command & PCI_COMMAND_PARITY_ENABLE) == 0)
                    149:                sc->cfg.control_flag |= CONTROL_FLAG_IGNORE_PERR;
                    150:
                    151:        /*
                    152:         * Map Device Registers for I/O
                    153:         */
                    154:        if (pci_mapreg_map(pa, PCI_BASEADR_IO, PCI_MAPREG_TYPE_IO, 0,
                    155:                           &iot, &ioh, NULL, NULL, 0)) {
                    156:                printf("\n%s: unable to map device registers\n",
                    157:                       sc->sc_dev.dv_xname);
                    158:                return;
                    159:        }
                    160:        sc->sc_iot = iot;
                    161:        sc->sc_ioh = ioh;
                    162:        sc->sc_dmat = pa->pa_dmat;
                    163:
                    164:        /*
                    165:         * Initialize the board
                    166:         */
                    167:        if (adw_init(sc)) {
                    168:                printf("%s: adw_init failed", sc->sc_dev.dv_xname);
                    169:                return;
                    170:        }
                    171:
                    172:        /*
                    173:         * Map Interrupt line
                    174:         */
                    175:        if (pci_intr_map(pa, &ih)) {
                    176:                printf("\n%s: couldn't map interrupt\n", sc->sc_dev.dv_xname);
                    177:                return;
                    178:        }
                    179:        intrstr = pci_intr_string(pc, ih);
                    180:
                    181:        /*
                    182:         * Establish Interrupt handler
                    183:         */
                    184:        sc->sc_ih = pci_intr_establish(pc, ih, IPL_BIO, adw_intr, sc,
                    185:                                       sc->sc_dev.dv_xname);
                    186:        if (sc->sc_ih == NULL) {
                    187:                printf("\n%s: couldn't establish interrupt", sc->sc_dev.dv_xname);
                    188:                if (intrstr != NULL)
                    189:                        printf(" at %s", intrstr);
                    190:                printf("\n");
                    191:                return;
                    192:        }
                    193:        printf(": %s\n", intrstr);
                    194:
                    195:        /*
                    196:         * Attach all the sub-devices we can find
                    197:         */
                    198:        adw_attach(sc);
                    199: }
                    200: /******************************************************************************/

CVSweb