summaryrefslogtreecommitdiff
path: root/sys/dev/cardbus/if_dc_cardbus.c
diff options
context:
space:
mode:
authorAaron Campbell <aaron@cvs.openbsd.org>2001-04-06 17:14:15 +0000
committerAaron Campbell <aaron@cvs.openbsd.org>2001-04-06 17:14:15 +0000
commitf67f86e6bf0c7085a6ee865a10e6d5e1676e4fd3 (patch)
tree55af680b03f8502c577f58ad7417ed3d6a29486d /sys/dev/cardbus/if_dc_cardbus.c
parent3bad4cdb0cb491946c31d3d458bb5e9ae4ec7419 (diff)
- For CardBus 21143 cards, parse the SROM. Makes my SMC EZ CardBus 10/100 work.
- General cleanup in the dc CardBus attachment. - Split detach up into bus-dependent and bus-independent parts. - Some function and variable renaming for consistency.
Diffstat (limited to 'sys/dev/cardbus/if_dc_cardbus.c')
-rw-r--r--sys/dev/cardbus/if_dc_cardbus.c169
1 files changed, 65 insertions, 104 deletions
diff --git a/sys/dev/cardbus/if_dc_cardbus.c b/sys/dev/cardbus/if_dc_cardbus.c
index 12c56d7a915..a221eb8dcdc 100644
--- a/sys/dev/cardbus/if_dc_cardbus.c
+++ b/sys/dev/cardbus/if_dc_cardbus.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_dc_cardbus.c,v 1.4 2001/03/25 06:12:28 csapuntz Exp $ */
+/* $OpenBSD: if_dc_cardbus.c,v 1.5 2001/04/06 17:14:14 aaron Exp $ */
#include <sys/param.h>
#include <sys/systm.h>
@@ -41,26 +41,29 @@
#define DC_CFDA_SUSPEND 0x80000000
#define DC_CFDA_STANDBY 0x40000000
-struct dc_cardbus_softc {
- struct dc_softc sc_dc;
- int sc_intrline;
+struct dc_cardbus_softc {
+ struct dc_softc sc_dc;
+ int sc_intrline;
- cardbus_devfunc_t sc_ct;
- cardbustag_t sc_tag;
- bus_size_t sc_mapsize;
- int sc_actype;
+ cardbus_devfunc_t sc_ct;
+ cardbustag_t sc_tag;
+ bus_size_t sc_mapsize;
+ int sc_actype;
};
-int dc_cardbus_match __P((struct device *, void *, void *));
-void dc_cardbus_attach __P((struct device *, struct device *,void *));
-int dc_cardbus_detach __P((struct device *, int));
-int dc_cardbus_activate __P((struct device *, enum devact));
-void dc_cardbus_setup __P((struct dc_cardbus_softc *csc));
+int dc_cardbus_match __P((struct device *, void *, void *));
+void dc_cardbus_attach __P((struct device *, struct device *,void *));
+int dc_cardbus_detach __P((struct device *, int));
+
+void dc_cardbus_setup __P((struct dc_cardbus_softc *csc));
+
+extern void dc_eeprom_width __P((struct dc_softc *));
+extern void dc_read_srom __P((struct dc_softc *, int));
+extern void dc_parse_21143_srom __P((struct dc_softc *));
struct cfattach dc_cardbus_ca = {
- sizeof(struct dc_cardbus_softc), dc_cardbus_match,
- dc_cardbus_attach, dc_cardbus_detach,
- dc_cardbus_activate
+ sizeof(struct dc_cardbus_softc), dc_cardbus_match, dc_cardbus_attach,
+ dc_cardbus_detach
};
struct dc_type dc_cardbus_devs[] = {
@@ -107,14 +110,35 @@ dc_cardbus_attach(parent, self, aux)
Cardbus_function_enable(ct);
+ if (Cardbus_mapreg_map(ct, PCI_CBIO,
+ PCI_MAPREG_TYPE_IO, 0, &sc->dc_btag, &sc->dc_bhandle, &addr,
+ &csc->sc_mapsize) == 0) {
+
+ csc->sc_actype = CARDBUS_IO_ENABLE;
+ } else if (Cardbus_mapreg_map(ct, PCI_CBMEM,
+ PCI_MAPREG_TYPE_MEM|PCI_MAPREG_MEM_TYPE_32BIT, 0,
+ &sc->dc_btag, &sc->dc_bhandle, &addr, &csc->sc_mapsize) == 0) {
+ csc->sc_actype = CARDBUS_MEM_ENABLE;
+ } else {
+ printf(": can\'t map device registers\n");
+ return;
+ }
+
+ csc->sc_intrline = ca->ca_intrline;
+
+ sc->dc_cachesize = pci_conf_read(cc, ca->ca_tag, DC_PCI_CFLT) & 0xFF;
+
+ dc_cardbus_setup(csc);
+
switch (PCI_VENDOR(ca->ca_id)) {
case PCI_VENDOR_DEC:
if (PCI_PRODUCT(ca->ca_id) == PCI_PRODUCT_DEC_21142) {
sc->dc_type = DC_TYPE_21143;
sc->dc_flags |= DC_TX_POLL|DC_TX_USE_TX_INTR;
sc->dc_flags |= DC_REDUCED_MII_POLL;
-
- sc->dc_pmode = DC_PMODE_MII;
+ dc_eeprom_width(sc);
+ dc_read_srom(sc, sc->dc_romwidth);
+ dc_parse_21143_srom(sc);
}
break;
case PCI_VENDOR_XIRCOM:
@@ -134,6 +158,7 @@ dc_cardbus_attach(parent, self, aux)
sc->dc_type = DC_TYPE_AN983;
sc->dc_flags |= DC_TX_USE_TX_INTR|DC_TX_ADMTEK_WAR;
sc->dc_pmode = DC_PMODE_MII;
+ dc_eeprom_width(sc);
}
break;
default:
@@ -141,41 +166,20 @@ dc_cardbus_attach(parent, self, aux)
return;
}
- if (Cardbus_mapreg_map(ct, PCI_CBIO,
- PCI_MAPREG_TYPE_IO, 0, &sc->dc_btag, &sc->dc_bhandle, &addr,
- &csc->sc_mapsize) == 0) {
-
- csc->sc_actype = CARDBUS_IO_ENABLE;
- } else if (Cardbus_mapreg_map(ct, PCI_CBMEM,
- PCI_MAPREG_TYPE_MEM|PCI_MAPREG_MEM_TYPE_32BIT, 0,
- &sc->dc_btag, &sc->dc_bhandle, &addr, &csc->sc_mapsize) == 0) {
- csc->sc_actype = CARDBUS_MEM_ENABLE;
- } else {
- printf(": can\'t map device registers\n");
- return;
- }
-
- csc->sc_intrline = ca->ca_intrline;
-
- sc->dc_cachesize = pci_conf_read(cc, ca->ca_tag, DC_PCI_CFLT) & 0xFF;
-
- dc_cardbus_setup(csc);
- cardbus_save_bar(ct);
-
/*
* set latency timer, do we really need this?
*/
- reg = cardbus_conf_read(cc, cf, ca->ca_tag, CARDBUS_BHLC_REG);
- if (CARDBUS_LATTIMER(reg) < 0x20) {
- reg &= ~(CARDBUS_LATTIMER_MASK << CARDBUS_LATTIMER_SHIFT);
- reg |= (0x20 << CARDBUS_LATTIMER_SHIFT);
- cardbus_conf_write(cc, cf, ca->ca_tag, CARDBUS_BHLC_REG, reg);
+ reg = cardbus_conf_read(cc, cf, ca->ca_tag, PCI_BHLC_REG);
+ if (PCI_LATTIMER(reg) < 0x20) {
+ reg &= ~(PCI_LATTIMER_MASK << PCI_LATTIMER_SHIFT);
+ reg |= (0x20 << PCI_LATTIMER_SHIFT);
+ cardbus_conf_write(cc, cf, ca->ca_tag, PCI_BHLC_REG, reg);
}
- sc->sc_ih = cardbus_intr_establish(cc, cf,
- ca->ca_intrline, IPL_NET, dc_intr, csc);
+ sc->sc_ih = cardbus_intr_establish(cc, cf, ca->ca_intrline, IPL_NET,
+ dc_intr, csc);
if (sc->sc_ih == NULL) {
- printf(": can\'t establish interrupt at %d\n",
+ printf(": can't establish interrupt at %d\n",
ca->ca_intrline);
return;
} else
@@ -183,8 +187,8 @@ dc_cardbus_attach(parent, self, aux)
dc_reset(sc);
- sc->dc_revision = CARDBUS_REVISION(ca->ca_class);
- dc_attach_common(sc);
+ sc->dc_revision = PCI_REVISION(ca->ca_class);
+ dc_attach(sc);
}
int
@@ -195,63 +199,22 @@ dc_cardbus_detach(self, flags)
struct dc_cardbus_softc *csc = (struct dc_cardbus_softc *)self;
struct dc_softc *sc = &csc->sc_dc;
struct cardbus_devfunc *ct = csc->sc_ct;
- struct ifnet *ifp = &sc->arpcom.ac_if;
int rv = 0;
- if (LIST_FIRST(&sc->sc_mii.mii_phys) != NULL)
- mii_detach(&sc->sc_mii, MII_PHY_ANY, MII_OFFSET_ANY);
+ rv = dc_detach(sc);
+ if (rv)
+ return (rv);
+
+ cardbus_intr_disestablish(ct->ct_cc, ct->ct_cf, sc->sc_ih);
/* unmap cardbus resources */
Cardbus_mapreg_unmap(ct,
csc->sc_actype == CARDBUS_IO_ENABLE ? PCI_CBIO : PCI_CBMEM,
sc->dc_btag, sc->dc_bhandle, csc->sc_mapsize);
- ether_ifdetach(ifp);
- if_detach(ifp);
-
return (rv);
}
-int
-dc_cardbus_activate(dev, act)
- struct device *dev;
- enum devact act;
-{
- struct dc_cardbus_softc *csc = (struct dc_cardbus_softc *)dev;
- struct dc_softc *sc = &csc->sc_dc;
- cardbus_devfunc_t ct = csc->sc_ct;
- int s;
-
- s = splnet();
- switch (act) {
- case DVACT_ACTIVATE:
- Cardbus_function_enable(ct);
- cardbus_restore_bar(ct);
- dc_cardbus_setup(csc);
- sc->sc_ih = cardbus_intr_establish(ct->ct_cc, ct->ct_cf,
- csc->sc_intrline, IPL_NET, dc_intr, csc);
- if (sc->sc_ih == NULL) {
- printf(": can\'t establish interrupt at %d\n",
- csc->sc_intrline);
- Cardbus_function_disable(ct);
- splx(s);
- return -1;
- } else
- printf("%s: interrupting at %d",
- sc->sc_dev.dv_xname, csc->sc_intrline);
- break;
-
- case DVACT_DEACTIVATE:
- cardbus_save_bar(ct);
- cardbus_intr_disestablish(ct->ct_cc, ct->ct_cf, sc->sc_ih);
- Cardbus_function_disable(ct);
- break;
- }
-
- splx(s);
- return 0;
-}
-
void
dc_cardbus_setup(csc)
struct dc_cardbus_softc *csc;
@@ -267,12 +230,10 @@ dc_cardbus_setup(csc)
if (reg | (DC_CFDA_SUSPEND|DC_CFDA_STANDBY)) {
cardbus_conf_write(cc, cf, csc->sc_tag, PCI_CFDA,
reg & ~(DC_CFDA_SUSPEND|DC_CFDA_STANDBY));
-#if 0
-printf("wakeup %x\n", cardbus_conf_read(cc, cf, csc->sc_tag, PCI_CFDA));
-#endif
}
- if (cardbus_get_capability(cc, cf, csc->sc_tag, PCI_CAP_PWRMGMT, &r, 0)) {
+ if (cardbus_get_capability(cc, cf, csc->sc_tag, PCI_CAP_PWRMGMT, &r,
+ 0)) {
r = cardbus_conf_read(cc, cf, csc->sc_tag, r + 4) & 3;
if (r) {
printf("%s: awakening from state D%d\n",
@@ -284,9 +245,9 @@ printf("wakeup %x\n", cardbus_conf_read(cc, cf, csc->sc_tag, PCI_CFDA));
(*ct->ct_cf->cardbus_ctrl)(cc, csc->sc_actype);
(*ct->ct_cf->cardbus_ctrl)(cc, CARDBUS_BM_ENABLE);
- reg = cardbus_conf_read(cc, cf, csc->sc_tag, CARDBUS_COMMAND_STATUS_REG);
- reg |= CARDBUS_COMMAND_IO_ENABLE | CARDBUS_COMMAND_MEM_ENABLE |
- CARDBUS_COMMAND_MASTER_ENABLE;
- cardbus_conf_write(cc, cf, csc->sc_tag, CARDBUS_COMMAND_STATUS_REG, reg);
- reg = cardbus_conf_read(cc, cf, csc->sc_tag, CARDBUS_COMMAND_STATUS_REG);
+ reg = cardbus_conf_read(cc, cf, csc->sc_tag, PCI_COMMAND_STATUS_REG);
+ reg |= PCI_COMMAND_IO_ENABLE | PCI_COMMAND_MEM_ENABLE |
+ PCI_COMMAND_MASTER_ENABLE;
+ cardbus_conf_write(cc, cf, csc->sc_tag, PCI_COMMAND_STATUS_REG, reg);
+ reg = cardbus_conf_read(cc, cf, csc->sc_tag, PCI_COMMAND_STATUS_REG);
}