Home | History | Annotate | Line # | Download | only in pcmcia
aic_pcmcia.c revision 1.1.2.12
      1  1.1.2.12  thorpej /*	$NetBSD: aic_pcmcia.c,v 1.1.2.12 1997/10/16 17:23:03 thorpej Exp $	*/
      2   1.1.2.9    enami 
      3   1.1.2.1     marc #include <sys/param.h>
      4   1.1.2.1     marc #include <sys/systm.h>
      5   1.1.2.1     marc #include <sys/select.h>
      6   1.1.2.1     marc #include <sys/device.h>
      7   1.1.2.1     marc 
      8   1.1.2.1     marc #include <machine/cpu.h>
      9   1.1.2.1     marc #include <machine/bus.h>
     10   1.1.2.1     marc #include <machine/intr.h>
     11   1.1.2.1     marc 
     12   1.1.2.8    enami #include <dev/scsipi/scsipi_all.h>
     13   1.1.2.8    enami #include <dev/scsipi/scsipiconf.h>
     14   1.1.2.8    enami #include <dev/scsipi/scsi_all.h>
     15   1.1.2.8    enami 
     16   1.1.2.8    enami #include <dev/ic/aic6360var.h>
     17   1.1.2.8    enami 
     18   1.1.2.1     marc #include <dev/pcmcia/pcmciareg.h>
     19   1.1.2.1     marc #include <dev/pcmcia/pcmciavar.h>
     20   1.1.2.1     marc 
     21  1.1.2.12  thorpej #define	PCMCIA_MANUFACTURER_ADAPTEC		0x012F
     22  1.1.2.12  thorpej #define	PCMCIA_PRODUCT_ADAPTEC_APA1460_1	0x0001
     23  1.1.2.12  thorpej #define	PCMCIA_PRODUCT_ADAPTEC_APA1460_2	0x0002
     24   1.1.2.1     marc 
     25   1.1.2.1     marc #ifdef __BROKEN_INDIRECT_CONFIG
     26  1.1.2.10    enami int	aic_pcmcia_match __P((struct device *, void *, void *));
     27   1.1.2.1     marc #else
     28  1.1.2.10    enami int	aic_pcmcia_match __P((struct device *, struct cfdata *, void *));
     29   1.1.2.1     marc #endif
     30  1.1.2.10    enami void	aic_pcmcia_attach __P((struct device *, struct device *, void *));
     31  1.1.2.10    enami 
     32  1.1.2.10    enami struct aic_pcmcia_softc {
     33  1.1.2.10    enami 	struct aic_softc sc_aic;		/* real "aic" softc */
     34  1.1.2.10    enami 
     35  1.1.2.10    enami 	/* PCMCIA-specific goo. */
     36  1.1.2.10    enami 	struct pcmcia_io_handle sc_pcioh;	/* PCMCIA i/o space info */
     37  1.1.2.10    enami 	int sc_io_window;			/* our i/o window */
     38  1.1.2.10    enami 	struct pcmcia_function *sc_pf;		/* our PCMCIA function */
     39  1.1.2.11    enami 	void *sc_ih;				/* interrupt handler */
     40  1.1.2.10    enami };
     41   1.1.2.1     marc 
     42   1.1.2.1     marc struct cfattach aic_pcmcia_ca = {
     43  1.1.2.10    enami 	sizeof(struct aic_pcmcia_softc), aic_pcmcia_match, aic_pcmcia_attach
     44   1.1.2.1     marc };
     45   1.1.2.1     marc 
     46   1.1.2.1     marc int
     47   1.1.2.1     marc aic_pcmcia_match(parent, match, aux)
     48  1.1.2.10    enami 	struct device *parent;
     49   1.1.2.1     marc #ifdef __BROKEN_INDIRECT_CONFIG
     50  1.1.2.10    enami 	void *match;
     51   1.1.2.1     marc #else
     52  1.1.2.10    enami 	struct cfdata *cf;
     53   1.1.2.1     marc #endif
     54  1.1.2.10    enami 	void *aux;
     55   1.1.2.1     marc {
     56  1.1.2.10    enami 	struct pcmcia_attach_args *pa = aux;
     57   1.1.2.1     marc 
     58  1.1.2.12  thorpej 	if (pa->manufacturer == PCMCIA_MANUFACTURER_ADAPTEC) {
     59  1.1.2.12  thorpej 		switch (pa->product) {
     60  1.1.2.12  thorpej 		case PCMCIA_PRODUCT_ADAPTEC_APA1460_1:
     61  1.1.2.12  thorpej 		case PCMCIA_PRODUCT_ADAPTEC_APA1460_2:
     62  1.1.2.12  thorpej 			if (pa->pf->number == 0)
     63  1.1.2.12  thorpej 				return (1);
     64  1.1.2.12  thorpej 		}
     65  1.1.2.12  thorpej 	}
     66   1.1.2.1     marc 
     67  1.1.2.10    enami 	return (0);
     68   1.1.2.1     marc }
     69   1.1.2.1     marc 
     70   1.1.2.1     marc void
     71   1.1.2.1     marc aic_pcmcia_attach(parent, self, aux)
     72  1.1.2.10    enami 	struct device *parent, *self;
     73  1.1.2.10    enami 	void *aux;
     74   1.1.2.1     marc {
     75  1.1.2.11    enami 	struct aic_pcmcia_softc *psc = (void *)self;
     76  1.1.2.10    enami 	struct aic_softc *sc = &psc->sc_aic;
     77  1.1.2.10    enami 	struct pcmcia_attach_args *pa = aux;
     78  1.1.2.10    enami 	struct pcmcia_config_entry *cfe;
     79  1.1.2.10    enami 	struct pcmcia_function *pf = pa->pf;
     80  1.1.2.10    enami 
     81  1.1.2.10    enami 	psc->sc_pf = pf;
     82  1.1.2.10    enami 
     83  1.1.2.10    enami 	for (cfe = pf->cfe_head.sqh_first; cfe; cfe = cfe->cfe_list.sqe_next) {
     84  1.1.2.10    enami 		if (cfe->num_memspace != 0 ||
     85  1.1.2.10    enami 		    cfe->num_iospace != 1)
     86  1.1.2.10    enami 			continue;
     87  1.1.2.10    enami 
     88  1.1.2.10    enami 		if (pcmcia_io_alloc(pa->pf, cfe->iospace[0].start,
     89  1.1.2.10    enami 		    cfe->iospace[0].length, 0, &psc->sc_pcioh) == 0)
     90  1.1.2.10    enami 			break;
     91  1.1.2.10    enami 	}
     92  1.1.2.10    enami 
     93  1.1.2.10    enami 	if (cfe == 0) {
     94  1.1.2.10    enami 		printf(": can't alloc i/o space\n");
     95  1.1.2.10    enami 		return;
     96  1.1.2.10    enami 	}
     97  1.1.2.10    enami 
     98  1.1.2.10    enami 	sc->sc_iot = psc->sc_pcioh.iot;
     99  1.1.2.10    enami 	sc->sc_ioh = psc->sc_pcioh.ioh;
    100  1.1.2.10    enami 
    101  1.1.2.10    enami 	/* Enable the card. */
    102  1.1.2.10    enami 	pcmcia_function_init(pf, cfe);
    103  1.1.2.10    enami 	if (pcmcia_function_enable(pf)) {
    104  1.1.2.10    enami 		printf(": function enable failed\n");
    105  1.1.2.10    enami 		return;
    106  1.1.2.10    enami 	}
    107  1.1.2.10    enami 
    108  1.1.2.11    enami 	/* Map in the io space */
    109  1.1.2.10    enami 	if (pcmcia_io_map(pa->pf, PCMCIA_WIDTH_AUTO, 0, psc->sc_pcioh.size,
    110  1.1.2.10    enami 	    &psc->sc_pcioh, &psc->sc_io_window)) {
    111  1.1.2.10    enami 		printf(": can't map i/o space\n");
    112  1.1.2.10    enami 		return;
    113  1.1.2.10    enami 	}
    114  1.1.2.10    enami 
    115  1.1.2.10    enami 	if (!aic_find(sc->sc_iot, sc->sc_ioh))
    116  1.1.2.10    enami 		printf(": coundn't find aic\n%s", sc->sc_dev.dv_xname);
    117  1.1.2.10    enami 
    118  1.1.2.10    enami 	printf(": APA-1460 SCSI Host Adapter\n");
    119  1.1.2.10    enami 
    120  1.1.2.10    enami 	aicattach(sc);
    121  1.1.2.10    enami 
    122  1.1.2.11    enami 	/* Establish the interrupt handler. */
    123  1.1.2.11    enami 	psc->sc_ih = pcmcia_intr_establish(pa->pf, IPL_BIO, aicintr, sc);
    124  1.1.2.11    enami 	if (psc->sc_ih == NULL)
    125  1.1.2.10    enami 		printf("%s: couldn't establish interrupt\n",
    126  1.1.2.10    enami 		    sc->sc_dev.dv_xname);
    127   1.1.2.1     marc }
    128