Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/pci Add some bugfixes and enhancement from FreeBSD:



details:   https://anonhg.NetBSD.org/src/rev/8fd11ef788e1
branches:  trunk
changeset: 785139:8fd11ef788e1
user:      msaitoh <msaitoh%NetBSD.org@localhost>
date:      Tue Feb 26 11:06:23 2013 +0000

description:
Add some bugfixes and enhancement from FreeBSD:

- Workaround for BCM5906 silicon bug. When auto-negotiation results in
 half-duplex operation, excess collision on the ethernet link may cause
 internal chip delays that may result in subsequent valid frames being
 dropped due to insufficient receive buffer resources.
 (FreeBSD: r214219, r214251, r214292)

- Allow write DMA to request larger DMA burst size to get better
 performance on BCM5785.
 (FreeBSD r213333: OpenBSD 1.294)

- Enable TX MAC state machine lockup fix for both BCM5755 or higher
 and BCM5906. Publicly available data sheet just says it may happen
 due to corrupted TxMbuf.
 (FreeBSD r214216)

- Follow Broadcom datasheet:
 Delay 100 microseconds after enabling transmit MAC.
 Delay 10 microseconds after enabling receive MAC.
 (FreeBSD r241220)

diffstat:

 sys/dev/pci/if_bge.c    |  27 ++++++++++++++++++++++++---
 sys/dev/pci/if_bgereg.h |   6 +++++-
 2 files changed, 29 insertions(+), 4 deletions(-)

diffs (121 lines):

diff -r 74c06ae33f4c -r 8fd11ef788e1 sys/dev/pci/if_bge.c
--- a/sys/dev/pci/if_bge.c      Tue Feb 26 11:03:17 2013 +0000
+++ b/sys/dev/pci/if_bge.c      Tue Feb 26 11:06:23 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_bge.c,v 1.205 2013/02/26 11:03:17 msaitoh Exp $     */
+/*     $NetBSD: if_bge.c,v 1.206 2013/02/26 11:06:23 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.205 2013/02/26 11:03:17 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_bge.c,v 1.206 2013/02/26 11:06:23 msaitoh Exp $");
 
 #include "vlan.h"
 
@@ -699,6 +699,7 @@
        { BGE_CHIPID_BCM5787_A0, "BCM5754/5787 A0" },
        { BGE_CHIPID_BCM5787_A1, "BCM5754/5787 A1" },
        { BGE_CHIPID_BCM5787_A2, "BCM5754/5787 A2" },
+       { BGE_CHIPID_BCM5906_A0, "BCM5906 A0" },
        { BGE_CHIPID_BCM5906_A1, "BCM5906 A1" },
        { BGE_CHIPID_BCM5906_A2, "BCM5906 A2" },
        { BGE_CHIPID_BCM57780_A0, "BCM57780 A0" },
@@ -2097,6 +2098,14 @@
                    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
        }
 
+       /* Choose de-pipeline mode for BCM5906 A0, A1 and A2. */
+       if (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5906) {
+               if (sc->bge_chipid == BGE_CHIPID_BCM5906_A0 ||
+                   sc->bge_chipid == BGE_CHIPID_BCM5906_A1 ||
+                   sc->bge_chipid == BGE_CHIPID_BCM5906_A2)
+                       CSR_WRITE_4(sc, BGE_ISO_PKT_TX,
+                           (CSR_READ_4(sc, BGE_ISO_PKT_TX) & ~3) | 2);
+       }
        /*
         * Set the BD ring replenish thresholds. The recommended
         * values are 1/8th the number of descriptors allocated to
@@ -2309,6 +2318,9 @@
        if (BGE_IS_5755_PLUS(sc))
                val |= BGE_WDMAMODE_STATUS_TAG_FIX;
 
+       if (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5785)
+               val |= BGE_WDMAMODE_BURST_ALL_DATA;
+
        /* Turn on write DMA state machine */
        CSR_WRITE_4(sc, BGE_WDMA_MODE, val);
 
@@ -4304,6 +4316,7 @@
 {
        struct bge_softc *sc = ifp->if_softc;
        const uint16_t *m;
+       uint32_t mode;
        int s, error = 0;
 
        s = splnet();
@@ -4384,11 +4397,19 @@
        /* Init TX ring. */
        bge_init_tx_ring(sc);
 
+       /* Enable TX MAC state machine lockup fix. */
+       mode = CSR_READ_4(sc, BGE_TX_MODE);
+       if (BGE_IS_5755_PLUS(sc) ||
+           BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5906)
+               mode |= BGE_TXMODE_MBUF_LOCKUP_FIX;
+
        /* Turn on transmitter */
-       BGE_SETBIT(sc, BGE_TX_MODE, BGE_TXMODE_ENABLE);
+       CSR_WRITE_4(sc, BGE_TX_MODE, mode | BGE_TXMODE_ENABLE);
+       DELAY(100);
 
        /* Turn on receiver */
        BGE_SETBIT(sc, BGE_RX_MODE, BGE_RXMODE_ENABLE);
+       DELAY(10);
 
        CSR_WRITE_4(sc, BGE_MAX_RX_FRAME_LOWAT, 2);
 
diff -r 74c06ae33f4c -r 8fd11ef788e1 sys/dev/pci/if_bgereg.h
--- a/sys/dev/pci/if_bgereg.h   Tue Feb 26 11:03:17 2013 +0000
+++ b/sys/dev/pci/if_bgereg.h   Tue Feb 26 11:06:23 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_bgereg.h,v 1.59 2013/02/26 11:03:17 msaitoh Exp $   */
+/*     $NetBSD: if_bgereg.h,v 1.60 2013/02/26 11:06:23 msaitoh Exp $   */
 /*
  * Copyright (c) 2001 Wind River Systems
  * Copyright (c) 1997, 1998, 1999, 2001
@@ -318,6 +318,7 @@
 #define BGE_CHIPID_BCM5787_A0          0xb000
 #define BGE_CHIPID_BCM5787_A1          0xb001
 #define BGE_CHIPID_BCM5787_A2          0xb002
+#define        BGE_CHIPID_BCM5906_A0           0xc000
 #define BGE_CHIPID_BCM5906_A1          0xc001
 #define BGE_CHIPID_BCM5906_A2          0xc002
 #define BGE_CHIPID_BCM57762            0x57766000
@@ -734,6 +735,7 @@
 #define BGE_TXMODE_FLOWCTL_ENABLE      0x00000010
 #define BGE_TXMODE_BIGBACKOFF_ENABLE   0x00000020
 #define BGE_TXMODE_LONGPAUSE_ENABLE    0x00000040
+#define        BGE_TXMODE_MBUF_LOCKUP_FIX      0x00000100
 
 /* Transmit MAC status register */
 #define BGE_TXSTAT_RX_XOFFED           0x00000001
@@ -820,6 +822,7 @@
 #define BGE_SDI_STATS_CTL              0x0C08
 #define BGE_SDI_STATS_ENABLE_MASK      0x0C0C
 #define BGE_SDI_STATS_INCREMENT_MASK   0x0C10
+#define        BGE_ISO_PKT_TX                  0x0C20
 #define BGE_LOCSTATS_COS0              0x0C80
 #define BGE_LOCSTATS_COS1              0x0C84
 #define BGE_LOCSTATS_COS2              0x0C88
@@ -1435,6 +1438,7 @@
 #define BGE_WDMAMODE_LOCREAD_TOOBIG    0x00000200
 #define BGE_WDMAMODE_ALL_ATTNS         0x000003FC
 #define BGE_WDMAMODE_STATUS_TAG_FIX    0x20000000
+#define        BGE_WDMAMODE_BURST_ALL_DATA     0xC0000000
 
 /* Write DMA status register */
 #define BGE_WDMASTAT_PCI_TGT_ABRT_ATTN 0x00000004



Home | Main Index | Thread Index | Old Index