diff options
Diffstat (limited to 'sys/dev/pci/if_dc_pci.c')
-rw-r--r-- | sys/dev/pci/if_dc_pci.c | 63 |
1 files changed, 36 insertions, 27 deletions
diff --git a/sys/dev/pci/if_dc_pci.c b/sys/dev/pci/if_dc_pci.c index 27cb61a77aa..ff2b0aa6b38 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.11 2000/11/16 01:25:45 aaron Exp $ */ +/* $OpenBSD: if_dc_pci.c,v 1.12 2001/02/09 02:23:36 aaron Exp $ */ /* * Copyright (c) 1997, 1998, 1999 @@ -104,6 +104,10 @@ int dc_pci_probe __P((struct device *, void *, void *)); void dc_pci_attach __P((struct device *, struct device *, void *)); void dc_pci_acpi __P((struct device *, void *)); +extern void dc_read_eeprom __P((struct dc_softc *, caddr_t, int, int, + int)); +extern void dc_parse_21143_srom __P((struct dc_softc *)); + /* * Probe for a 21143 or clone chip. Check the PCI vendor and device * IDs against our list and return a device name if we find a match. @@ -263,6 +267,8 @@ void dc_pci_attach(parent, self, aux) sc->dc_type = DC_TYPE_21143; sc->dc_flags |= DC_TX_POLL|DC_TX_USE_TX_INTR; sc->dc_flags |= DC_REDUCED_MII_POLL; + /* Save EEPROM contents so we can parse them later. */ + dc_read_eeprom(sc, (caddr_t)&sc->dc_srom, 0, 512, 0); } break; case PCI_VENDOR_DAVICOM: @@ -424,32 +430,9 @@ void dc_pci_attach(parent, self, aux) * The tricky ones are the Macronix/PNIC II and the * Intel 21143. */ - if (DC_IS_INTEL(sc)) { - u_int32_t media, cwuc; - cwuc = pci_conf_read(pc, pa->pa_tag, DC_PCI_CWUC); - cwuc |= DC_CWUC_FORCE_WUL; - pci_conf_write(pc, pa->pa_tag, DC_PCI_CWUC, cwuc); - DELAY(10000); - media = pci_conf_read(pc, pa->pa_tag, DC_PCI_CWUC); - cwuc &= ~DC_CWUC_FORCE_WUL; - pci_conf_write(pc, pa->pa_tag, DC_PCI_CWUC, cwuc); - DELAY(10000); - if (media & DC_CWUC_MII_ABILITY) - sc->dc_pmode = DC_PMODE_MII; - if (media & DC_CWUC_SYM_ABILITY) { - sc->dc_pmode = DC_PMODE_SYM; - sc->dc_flags |= DC_21143_NWAY; - } - /* - * If none of the bits are set, then this NIC - * isn't meant to support 'wake up LAN' mode. - * This is usually only the case on multiport - * cards, and these cards almost always have - * MII transceivers. - */ - if (media == 0) - sc->dc_pmode = DC_PMODE_MII; - } else if (DC_IS_MACRONIX(sc) || DC_IS_PNICII(sc)) { + if (DC_IS_INTEL(sc)) + dc_parse_21143_srom(sc); + else if (DC_IS_MACRONIX(sc) || DC_IS_PNICII(sc)) { if (sc->dc_type == DC_TYPE_98713) sc->dc_pmode = DC_PMODE_MII; else @@ -457,6 +440,32 @@ void dc_pci_attach(parent, self, aux) } else if (!sc->dc_pmode) sc->dc_pmode = DC_PMODE_MII; +#ifdef SRM_MEDIA + sc->dc_srm_media = 0; + + /* Remember the SRM console media setting */ + if (DC_IS_INTEL(sc)) { + command = pci_read_config(dev, DC_PCI_CFDD, 4); + command &= ~(DC_CFDD_SNOOZE_MODE|DC_CFDD_SLEEP_MODE); + switch ((command >> 8) & 0xff) { + case 3: + sc->dc_srm_media = IFM_10_T; + break; + case 4: + sc->dc_srm_media = IFM_10_T | IFM_FDX; + break; + case 5: + sc->dc_srm_media = IFM_100_TX; + break; + case 6: + sc->dc_srm_media = IFM_100_TX | IFM_FDX; + break; + } + if (sc->dc_srm_media) + sc->dc_srm_media |= IFM_ACTIVE | IFM_ETHER; + } +#endif + dc_attach_common(sc); fail: |