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

Reply via email to