diff options
author | chuck <chuck@cvs.openbsd.org> | 1997-03-20 22:03:46 +0000 |
---|---|---|
committer | chuck <chuck@cvs.openbsd.org> | 1997-03-20 22:03:46 +0000 |
commit | 8717bf526986fc5a9192b883d13c30516e7c0146 (patch) | |
tree | 298e1e392a43b540ab423abc02c6861694c51e5c /sys | |
parent | df71f16849724b74ad56317ce73d483cb162dd7a (diff) |
update for adaptec support
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/pci/if_en_pci.c | 98 |
1 files changed, 83 insertions, 15 deletions
diff --git a/sys/dev/pci/if_en_pci.c b/sys/dev/pci/if_en_pci.c index d7ac0872de2..db13e03ea96 100644 --- a/sys/dev/pci/if_en_pci.c +++ b/sys/dev/pci/if_en_pci.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_en_pci.c,v 1.3 1996/10/31 01:05:11 niklas Exp $ */ +/* $OpenBSD: if_en_pci.c,v 1.4 1997/03/20 22:03:45 chuck Exp $ */ /* * @@ -43,12 +43,11 @@ */ #include <sys/param.h> -#include <sys/types.h> +#include <sys/systm.h> #include <sys/device.h> #include <sys/mbuf.h> #include <sys/socket.h> #include <sys/socketvar.h> -#include <sys/systm.h> #include <net/if.h> @@ -86,7 +85,7 @@ struct en_pci_softc { #define PCI_CBMA 0x10 /* - * tonga (pci bridge) + * tonga (pci bridge). ENI cards only! */ #define EN_TONGA 0x60 /* PCI config addr of tonga reg */ @@ -96,10 +95,25 @@ struct en_pci_softc { #define TONGA_SWAP_WORD 0x20 /* + * adaptec pci bridge. ADP cards only! + */ + +#define ADP_PCIREG 0x050040 /* PCI control register */ + +#define ADP_PCIREG_RESET 0x1 /* reset card */ +#define ADP_PCIREG_IENABLE 0x2 /* interrupt enable */ +#define ADP_PCIREG_SWAP_WORD 0x4 /* swap byte on slave access */ +#define ADP_PCIREG_SWAP_DMA 0x8 /* swap bytes on DMA */ + +/* * prototypes */ +#ifdef __BROKEN_INDIRECT_CONFIG static int en_pci_match __P((struct device *, void *, void *)); +#else +static int en_pci_match __P((struct device *, struct cfdata *, void *)); +#endif static void en_pci_attach __P((struct device *, struct device *, void *)); /* @@ -110,6 +124,35 @@ struct cfattach en_pci_ca = { sizeof(struct en_pci_softc), en_pci_match, en_pci_attach, }; +#if !defined(MIDWAY_ENIONLY) + +static void adp_busreset __P((void *)); + +/* + * bus specific reset function [ADP only!] + */ + +static void adp_busreset(v) + +void *v; + +{ + struct en_softc *sc = (struct en_softc *) v; + u_int32_t dummy; + + bus_space_write_4(sc->en_memt, sc->en_base, ADP_PCIREG, ADP_PCIREG_RESET); + DELAY(1000); /* let it reset */ + dummy = bus_space_read_4(sc->en_memt, sc->en_base, ADP_PCIREG); + bus_space_write_4(sc->en_memt, sc->en_base, ADP_PCIREG, + (ADP_PCIREG_SWAP_WORD|ADP_PCIREG_SWAP_DMA|ADP_PCIREG_IENABLE)); + dummy = bus_space_read_4(sc->en_memt, sc->en_base, ADP_PCIREG); + if ((dummy & (ADP_PCIREG_SWAP_WORD|ADP_PCIREG_SWAP_DMA)) != + (ADP_PCIREG_SWAP_WORD|ADP_PCIREG_SWAP_DMA)) + printf("adp_busreset: Adaptec ATM did NOT reset!\n"); + +} +#endif + /***********************************************************************/ /* @@ -119,17 +162,29 @@ struct cfattach en_pci_ca = { static int en_pci_match(parent, match, aux) struct device *parent; +#ifdef __BROKEN_INDIRECT_CONFIG void *match; +#else +struct cfdata *match; +#endif void *aux; { struct pci_attach_args *pa = (struct pci_attach_args *) aux; - if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_EFFICIENTNETS) - return 0; +#if !defined(MIDWAY_ADPONLY) + if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_EFFICIENTNETS && + (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_EFFICIENTNETS_ENI155PF || + PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_EFFICIENTNETS_ENI155PA)) + return 1; +#endif - if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_EFFICIENTNETS_ENI155P) +#if !defined(MIDWAY_ENIONLY) + if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_ADP && + (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_ADP_AIC5900 || + PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_ADP_AIC5905)) return 1; +#endif return 0; } @@ -144,14 +199,15 @@ void *aux; struct en_softc *sc = (void *)self; struct en_pci_softc *scp = (void *)self; struct pci_attach_args *pa = aux; - bus_mem_addr_t membase; + bus_addr_t membase; pci_intr_handle_t ih; const char *intrstr; int retval; printf("\n"); - sc->en_bc = pa->pa_bc; + sc->en_memt = pa->pa_memt; + sc->is_adaptec = (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_ADP) ? 1 : 0; scp->en_pc = pa->pa_pc; /* @@ -164,8 +220,7 @@ void *aux; return; } intrstr = pci_intr_string(scp->en_pc, ih); - scp->sc_ih = pci_intr_establish(scp->en_pc, ih, IPL_NET, en_intr, sc, - sc->sc_dev.dv_xname); + scp->sc_ih = pci_intr_establish(scp->en_pc, ih, IPL_NET, en_intr, sc); if (scp->sc_ih == NULL) { printf("%s: couldn't establish interrupt\n", sc->sc_dev.dv_xname); if (intrstr != NULL) @@ -183,7 +238,8 @@ void *aux; retval = pci_mem_find(scp->en_pc, pa->pa_tag, PCI_CBMA, &membase, &sc->en_obmemsz, NULL); if (retval == 0) - retval = bus_mem_map(sc->en_bc, membase, sc->en_obmemsz, 0, &sc->en_base); + retval = bus_space_map(sc->en_memt, membase, sc->en_obmemsz, 0, + &sc->en_base); if (retval) { printf("%s: couldn't map memory\n", sc->sc_dev.dv_xname); @@ -191,11 +247,23 @@ void *aux; } /* - * set up swapping + * set up pci bridge */ - pci_conf_write(scp->en_pc, pa->pa_tag, EN_TONGA, - (TONGA_SWAP_DMA|TONGA_SWAP_WORD)); +#if !defined(MIDWAY_ENIONLY) + if (sc->is_adaptec) { + sc->en_busreset = adp_busreset; + adp_busreset(sc); + } +#endif + +#if !defined(MIDWAY_ADPONLY) + if (!sc->is_adaptec) { + sc->en_busreset = NULL; + pci_conf_write(scp->en_pc, pa->pa_tag, EN_TONGA, + (TONGA_SWAP_DMA|TONGA_SWAP_WORD)); + } +#endif /* * done PCI specific stuff |