Module Name: src Committed By: msaitoh Date: Wed Mar 27 10:26:06 UTC 2013
Modified Files: src/sys/dev/pci: if_bge.c if_bgereg.h Log Message: Fix a bug that chips which have BCM5906 ASIC touch GPIO wrongly. To generate a diff of this commit: cvs rdiff -u -r1.227 -r1.228 src/sys/dev/pci/if_bge.c cvs rdiff -u -r1.68 -r1.69 src/sys/dev/pci/if_bgereg.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/if_bge.c diff -u src/sys/dev/pci/if_bge.c:1.227 src/sys/dev/pci/if_bge.c:1.228 --- src/sys/dev/pci/if_bge.c:1.227 Sun Mar 24 22:33:59 2013 +++ src/sys/dev/pci/if_bge.c Wed Mar 27 10:26:05 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: if_bge.c,v 1.227 2013/03/24 22:33:59 msaitoh Exp $ */ +/* $NetBSD: if_bge.c,v 1.228 2013/03/27 10:26:05 msaitoh Exp $ */ /* * Copyright (c) 2001 Wind River Systems @@ -79,7 +79,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_bge.c,v 1.227 2013/03/24 22:33:59 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_bge.c,v 1.228 2013/03/27 10:26:05 msaitoh Exp $"); #include "vlan.h" @@ -1130,11 +1130,15 @@ bge_ape_send_event(struct bge_softc *sc, if ((sc->bge_mfw_flags & BGE_MFW_ON_APE) == 0) return; + printf("%s: APE event 0x%08x send\n", device_xname(sc->bge_dev), event); + /* Wait up to 1ms for APE to service previous event. */ for (i = 10; i > 0; i--) { if (bge_ape_lock(sc, BGE_APE_LOCK_MEM) != 0) break; apedata = APE_READ_4(sc, BGE_APE_EVENT_STATUS); + printf("%s: APE data 0x%08x -> 0x%08x\n", + device_xname(sc->bge_dev), apedata, event); if ((apedata & BGE_APE_EVENT_STATUS_EVENT_PENDING) == 0) { APE_WRITE_4(sc, BGE_APE_EVENT_STATUS, event | BGE_APE_EVENT_STATUS_EVENT_PENDING); @@ -3478,6 +3482,15 @@ bge_attach(device_t parent, device_t sel sc->bge_chipid != BGE_CHIPID_BCM5705_A1))) sc->bge_flags |= BGE_PHY_NO_WIRESPEED; + if (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5719 || + BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5720 || + BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM57766 || + (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_BROADCOM_BCM5718 && + sc->bge_chipid != BGE_CHIPID_BCM5717_A0) || + (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM57765 && + sc->bge_chipid != BGE_CHIPID_BCM57765_A0)) + sc->bge_flags |= BGE_PHY_EEE; + /* Set various PHY bug flags. */ if (sc->bge_chipid == BGE_CHIPID_BCM5701_A0 || sc->bge_chipid == BGE_CHIPID_BCM5701_B0) @@ -3517,6 +3530,9 @@ bge_attach(device_t parent, device_t sel "without-seeprom", &no_seeprom) && no_seeprom) sc->bge_flags |= BGE_NO_EEPROM; + else if (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5906) + sc->bge_flags |= BGE_NO_EEPROM; + /* Now check the 'ROM failed' bit on the RX CPU */ else if (CSR_READ_4(sc, BGE_RXCPU_MODE) & BGE_RXCPUMODE_ROMFAIL) sc->bge_flags |= BGE_NO_EEPROM; @@ -4116,6 +4132,13 @@ bge_reset(struct bge_softc *sc) BGE_CLRBIT(sc, BGE_CPMU_CLCK_ORIDE, CPMU_CLCK_ORIDE_MAC_ORIDE_EN); + if ((sc->bge_flags & BGE_PHY_EEE) != 0) { + uint32_t eeemode; + + eeemode = CSR_READ_4(sc, BGE_CPMU_EEE_MODE); + printf("EEEMODE = %x\n", eeemode); + CSR_WRITE_4(sc, BGE_CPMU_EEE_MODE, 0); + } return 0; } @@ -5670,6 +5693,13 @@ bge_link_upd(struct bge_softc *sc) IFM_SUBTYPE(mii->mii_media_active) == IFM_NONE)) BGE_STS_CLRBIT(sc, BGE_STS_LINK); } + } else { + /* + * For controllers that call mii_tick, we have to poll + * link status. + */ + mii_pollstat(mii); + bge_miibus_statchg(ifp); } /* Clear the attention */ Index: src/sys/dev/pci/if_bgereg.h diff -u src/sys/dev/pci/if_bgereg.h:1.68 src/sys/dev/pci/if_bgereg.h:1.69 --- src/sys/dev/pci/if_bgereg.h:1.68 Thu Mar 21 12:56:03 2013 +++ src/sys/dev/pci/if_bgereg.h Wed Mar 27 10:26:06 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: if_bgereg.h,v 1.68 2013/03/21 12:56:03 msaitoh Exp $ */ +/* $NetBSD: if_bgereg.h,v 1.69 2013/03/27 10:26:06 msaitoh Exp $ */ /* * Copyright (c) 2001 Wind River Systems * Copyright (c) 1997, 1998, 1999, 2001 @@ -1222,6 +1222,7 @@ #define BGE_CPMU_MUTEX_GNT 0x3660 #define BGE_CPMU_PHY_STRAP 0x3664 #define BGE_CPMU_PADRNG_CTL 0x3668 +#define BGE_CPMU_EEE_MODE 0x36b0 /* CPMU Control register */ #define BGE_CPMU_CTRL_LINK_IDLE_MODE 0x00000200 @@ -1264,6 +1265,9 @@ /* CPMU Padring Control register */ #define BGE_CPMU_PADRNG_CTL_RDIV2 0x00040000 +/* CPMU EEE_MODE register */ +#define BGE_CPMU_EEEMODE_LPIENABLE 0x00000080 + /* * Mbuf Cluster Free registers (has nothing to do with BSD mbufs) */ @@ -2628,4 +2632,5 @@ struct vpd_key { #define BGE_57765_PLUS 0x08000000 #define BGE_APE 0x10000000 #define BGE_CPMU_PRESENT 0x20000000 +#define BGE_PHY_EEE 0x40000000 #define BGE_TSO 0x80000000