summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>2009-06-26 16:58:47 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>2009-06-26 16:58:47 +0000
commit507a199df037c6f0928c55f8761c51c7935dba71 (patch)
tree2184fe709f23ee7fcf49306b244567a702bf905d /sys/dev
parentfc4c122129c4d2da0ff29b5f5ca69c6a324c13c6 (diff)
Using information gleamed from the FreeBSD driver, change the MAC address
reading to use the eeprom instead of CIS, and then the Xircom Cardbus cards can work in the expresscard adaptor, as pci devices. ok jsg
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/cardbus/if_dc_cardbus.c12
-rw-r--r--sys/dev/ic/dc.c3
-rw-r--r--sys/dev/pci/if_dc_pci.c24
3 files changed, 27 insertions, 12 deletions
diff --git a/sys/dev/cardbus/if_dc_cardbus.c b/sys/dev/cardbus/if_dc_cardbus.c
index 266db43a555..987c2efcc9b 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.28 2009/06/02 15:39:35 jsg Exp $ */
+/* $OpenBSD: if_dc_cardbus.c,v 1.29 2009/06/26 16:58:46 deraadt Exp $ */
/*
* Copyright (c) 1997, 1998, 1999
@@ -157,9 +157,11 @@ dc_cardbus_attach(struct device *parent, struct device *self, void *aux)
dc_cardbus_setup(csc);
- /* Get the eeprom width, but XIRCOM has no eeprom */
- if (!(PCI_VENDOR(ca->ca_id) == PCI_VENDOR_XIRCOM &&
+ /* Get the eeprom width */
+ if ((PCI_VENDOR(ca->ca_id) == PCI_VENDOR_XIRCOM &&
PCI_PRODUCT(ca->ca_id) == PCI_PRODUCT_XIRCOM_X3201_3_21143))
+ ; /* XIRCOM has non-standard eeprom */
+ else
dc_eeprom_width(sc);
switch (PCI_VENDOR(ca->ca_id)) {
@@ -179,10 +181,6 @@ dc_cardbus_attach(struct device *parent, struct device *self, void *aux)
sc->dc_flags |= DC_TX_INTR_ALWAYS|DC_TX_COALESCE |
DC_TX_ALIGN;
sc->dc_pmode = DC_PMODE_MII;
-
- bcopy(ca->ca_cis.funce.network.netid,
- &sc->sc_arpcom.ac_enaddr,
- sizeof sc->sc_arpcom.ac_enaddr);
}
break;
case PCI_VENDOR_ADMTEK:
diff --git a/sys/dev/ic/dc.c b/sys/dev/ic/dc.c
index 03ed39e7ca0..0e0ab657965 100644
--- a/sys/dev/ic/dc.c
+++ b/sys/dev/ic/dc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dc.c,v 1.109 2009/06/02 15:39:35 jsg Exp $ */
+/* $OpenBSD: dc.c,v 1.110 2009/06/26 16:58:46 deraadt Exp $ */
/*
* Copyright (c) 1997, 1998, 1999
@@ -1651,6 +1651,7 @@ dc_attach(struct dc_softc *sc)
&sc->sc_arpcom.ac_enaddr, ETHER_ADDR_LEN);
break;
case DC_TYPE_XIRCOM:
+ dc_read_eeprom(sc, (caddr_t)&sc->sc_arpcom.ac_enaddr, 3, 3, 0);
break;
default:
dc_read_eeprom(sc, (caddr_t)&sc->sc_arpcom.ac_enaddr,
diff --git a/sys/dev/pci/if_dc_pci.c b/sys/dev/pci/if_dc_pci.c
index d9558e090a8..d6e19ca72af 100644
--- a/sys/dev/pci/if_dc_pci.c
+++ b/sys/dev/pci/if_dc_pci.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_dc_pci.c,v 1.63 2009/06/02 15:39:35 jsg Exp $ */
+/* $OpenBSD: if_dc_pci.c,v 1.64 2009/06/26 16:58:45 deraadt Exp $ */
/*
* Copyright (c) 1997, 1998, 1999
@@ -111,6 +111,7 @@ struct dc_type dc_devs[] = {
{ PCI_VENDOR_MICROSOFT, PCI_PRODUCT_MICROSOFT_MN130 },
{ PCI_VENDOR_XIRCOM, PCI_PRODUCT_XIRCOM_X3201_3_21143 },
{ PCI_VENDOR_ADMTEK, PCI_PRODUCT_ADMTEK_AN985 },
+ { PCI_VENDOR_ABOCOM, PCI_PRODUCT_ABOCOM_FE2500 },
{ PCI_VENDOR_ABOCOM, PCI_PRODUCT_ABOCOM_FE2500MX },
{ PCI_VENDOR_ABOCOM, PCI_PRODUCT_ABOCOM_PCM200 },
{ PCI_VENDOR_DLINK, PCI_PRODUCT_DLINK_DRP32TXD },
@@ -274,9 +275,14 @@ dc_pci_attach(struct device *parent, struct device *self, void *aux)
/* Need this info to decide on a chip type. */
sc->dc_revision = PCI_REVISION(pa->pa_class);
- /* Get the eeprom width, but PNIC has no eeprom */
- if (!(PCI_VENDOR(pa->pa_id) == PCI_VENDOR_LITEON &&
+ /* Get the eeprom width, if possible */
+ if ((PCI_VENDOR(pa->pa_id) == PCI_VENDOR_LITEON &&
PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_LITEON_PNIC))
+ ; /* PNIC has non-standard eeprom */
+ else if ((PCI_VENDOR(pa->pa_id) == PCI_VENDOR_XIRCOM &&
+ PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_XIRCOM_X3201_3_21143))
+ ; /* XIRCOM has non-standard eeprom */
+ else
dc_eeprom_width(sc);
switch (PCI_VENDOR(pa->pa_id)) {
@@ -433,6 +439,16 @@ dc_pci_attach(struct device *parent, struct device *self, void *aux)
dc_read_srom(sc, sc->dc_romwidth);
}
break;
+ case PCI_VENDOR_XIRCOM:
+ if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_XIRCOM_X3201_3_21143) {
+ found = 1;
+ sc->dc_type = DC_TYPE_XIRCOM;
+ sc->dc_flags |= DC_TX_INTR_ALWAYS;
+ sc->dc_flags |= DC_TX_COALESCE;
+ sc->dc_flags |= DC_TX_ALIGN;
+ sc->dc_pmode = DC_PMODE_MII;
+ }
+ break;
}
if (found == 0) {
/* This shouldn't happen if probe has done its job... */
@@ -452,7 +468,7 @@ dc_pci_attach(struct device *parent, struct device *self, void *aux)
dc_reset(sc);
/* Take 21143 out of snooze mode */
- if (DC_IS_INTEL(sc)) {
+ if (DC_IS_INTEL(sc) || DC_IS_XIRCOM(sc)) {
command = pci_conf_read(pc, pa->pa_tag, DC_PCI_CFDD);
command &= ~(DC_CFDD_SNOOZE_MODE|DC_CFDD_SLEEP_MODE);
pci_conf_write(pc, pa->pa_tag, DC_PCI_CFDD, command);