summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-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);