Source-Changes-HG archive

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

[src/trunk]: src/sys/dev/pci Make Yukon EX, FE+, SUPR stable. The code is mai...



details:   https://anonhg.NetBSD.org/src/rev/7a3ebd3c28f0
branches:  trunk
changeset: 461088:7a3ebd3c28f0
user:      msaitoh <msaitoh%NetBSD.org@localhost>
date:      Fri Nov 15 12:38:09 2019 +0000

description:
Make Yukon EX, FE+, SUPR stable. The code is mainly taken from FreeBSD.

 At least, this change made my own Yukon EX machine (HP ProBook 4501s) much
stable than before.

diffstat:

 sys/dev/pci/if_msk.c   |  64 ++++++++++++++++++++++++++++++++++++++-----------
 sys/dev/pci/if_skreg.h |  20 +++++++++++++--
 2 files changed, 66 insertions(+), 18 deletions(-)

diffs (180 lines):

diff -r 78c642706b30 -r 7a3ebd3c28f0 sys/dev/pci/if_msk.c
--- a/sys/dev/pci/if_msk.c      Fri Nov 15 12:18:46 2019 +0000
+++ b/sys/dev/pci/if_msk.c      Fri Nov 15 12:38:09 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_msk.c,v 1.93 2019/11/10 21:16:36 chs Exp $ */
+/* $NetBSD: if_msk.c,v 1.94 2019/11/15 12:38:09 msaitoh Exp $ */
 /*     $OpenBSD: if_msk.c,v 1.79 2009/10/15 17:54:56 deraadt Exp $     */
 
 /*
@@ -52,7 +52,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_msk.c,v 1.93 2019/11/10 21:16:36 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_msk.c,v 1.94 2019/11/15 12:38:09 msaitoh Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -881,10 +881,27 @@
 mskc_reset(struct sk_softc *sc)
 {
        uint32_t imtimer_ticks, reg1;
+       uint16_t status;
        int reg;
 
        DPRINTFN(2, ("mskc_reset\n"));
 
+       /* Disable ASF */
+       if ((sc->sk_type == SK_YUKON_EX) || (sc->sk_type == SK_YUKON_SUPR)) {
+               CSR_WRITE_4(sc, SK_Y2_CPU_WDOG, 0);
+               status = CSR_READ_2(sc, SK_Y2_ASF_HCU_CCSR);
+               /* Clear AHB bridge & microcontroller reset. */
+               status &= ~(SK_Y2_ASF_HCU_CSSR_ARB_RST |
+                   SK_Y2_ASF_HCU_CSSR_CPU_RST_MODE);
+               /* Clear ASF microcontroller state. */
+               status &= ~SK_Y2_ASF_HCU_CSSR_UC_STATE_MSK;
+               status &= ~SK_Y2_ASF_HCU_CSSR_CPU_CLK_DIVIDE_MSK;
+               CSR_WRITE_2(sc, SK_Y2_ASF_HCU_CCSR, status);
+               CSR_WRITE_4(sc, SK_Y2_CPU_WDOG, 0);
+       } else
+               CSR_WRITE_1(sc, SK_Y2_ASF_CSR, SK_Y2_ASF_RESET);
+       CSR_WRITE_2(sc, SK_CSR, SK_CSR_ASF_OFF);
+
        CSR_WRITE_1(sc, SK_CSR, SK_CSR_SW_RESET);
        CSR_WRITE_1(sc, SK_CSR, SK_CSR_MASTER_RESET);
 
@@ -957,10 +974,6 @@
        DPRINTFN(2, ("mskc_reset: sk_link_ctrl=%x\n",
                     CSR_READ_2(sc, SK_LINK_CTRL)));
 
-       /* Disable ASF */
-       CSR_WRITE_1(sc, SK_Y2_ASF_CSR, SK_Y2_ASF_RESET);
-       CSR_WRITE_2(sc, SK_CSR, SK_CSR_ASF_OFF);
-
        /* Clear I2C IRQ noise */
        CSR_WRITE_4(sc, SK_I2CHWIRQ, 1);
 
@@ -1096,9 +1109,9 @@
 {
        /* GMAC and GPHY Reset */
        SK_IF_WRITE_4(sc_if, 0, SK_GMAC_CTRL, SK_GMAC_RESET_SET);
-       SK_IF_WRITE_4(sc_if, 0, SK_GPHY_CTRL, SK_GPHY_RESET_SET);
+       SK_IF_WRITE_1(sc_if, 0, SK_GPHY_CTRL, SK_GPHY_RESET_SET);
        DELAY(1000);
-       SK_IF_WRITE_4(sc_if, 0, SK_GPHY_CTRL, SK_GPHY_RESET_CLEAR);
+       SK_IF_WRITE_1(sc_if, 0, SK_GPHY_CTRL, SK_GPHY_RESET_CLEAR);
        SK_IF_WRITE_4(sc_if, 0, SK_GMAC_CTRL, SK_GMAC_LOOP_OFF |
                      SK_GMAC_PAUSE_ON | SK_GMAC_RESET_CLEAR);
 }
@@ -2404,17 +2417,31 @@
 
        /* Configure RX MAC FIFO */
        SK_IF_WRITE_1(sc_if, 0, SK_RXMF1_CTRL_TEST, SK_RFCTL_RESET_CLEAR);
-       SK_IF_WRITE_2(sc_if, 0, SK_RXMF1_CTRL_TEST, SK_RFCTL_OPERATION_ON |
-           SK_RFCTL_FIFO_FLUSH_ON);
-
-       /* Increase flush threshold to 64 bytes */
-       SK_IF_WRITE_2(sc_if, 0, SK_RXMF1_FLUSH_THRESHOLD,
-           SK_RFCTL_FIFO_THRESHOLD + 1);
+       v =  SK_RFCTL_OPERATION_ON | SK_RFCTL_FIFO_FLUSH_ON;
+       if ((sc->sk_type == SK_YUKON_EX) || (sc->sk_type == SK_YUKON_FE_P))
+               v |= SK_RFCTL_RX_OVER_ON;
+       SK_IF_WRITE_2(sc_if, 0, SK_RXMF1_CTRL_TEST, v);
+
+       if ((sc->sk_type == SK_YUKON_FE_P) &&
+           (sc->sk_rev == SK_YUKON_FE_P_REV_A0))
+               v = 0x178; /* Magic value */
+       else {
+               /* Increase flush threshold to 64 bytes */
+               v = SK_RFCTL_FIFO_THRESHOLD + 1;
+       }
+       SK_IF_WRITE_2(sc_if, 0, SK_RXMF1_FLUSH_THRESHOLD, v);
 
        /* Configure TX MAC FIFO */
        SK_IF_WRITE_1(sc_if, 0, SK_TXMF1_CTRL_TEST, SK_TFCTL_RESET_CLEAR);
        SK_IF_WRITE_2(sc_if, 0, SK_TXMF1_CTRL_TEST, SK_TFCTL_OPERATION_ON);
 
+       if ((sc->sk_type == SK_YUKON_FE_P) &&
+           (sc->sk_rev == SK_YUKON_FE_P_REV_A0)) {
+               v = SK_IF_READ_2(sc_if, 0, SK_TXMF1_END);
+               v &= ~SK_TXEND_WM_ON;
+               SK_IF_WRITE_2(sc_if, 0, SK_TXMF1_END, v);
+       }       
+
 #if 1
        SK_YU_WRITE_2(sc_if, YUKON_GPCR, YU_GPCR_TXEN | YU_GPCR_RXEN);
 #endif
@@ -2451,7 +2478,7 @@
        /* Configure transmit arbiter(s) */
        SK_IF_WRITE_1(sc_if, 0, SK_TXAR1_COUNTERCTL, SK_TXARCTL_ON);
 #if 0
-           SK_TXARCTL_ON | SK_TXARCTL_FSYNC_ON);
+/*         SK_TXARCTL_ON | SK_TXARCTL_FSYNC_ON); */
 #endif
 
        if (sc->sk_ramsize) {
@@ -2559,6 +2586,13 @@
        SK_IF_WRITE_2(sc_if, 0, SK_RXQ1_Y2_PREF_PUTIDX,
            sc_if->sk_cdata.sk_rx_prod);
 
+       
+       if ((sc->sk_type == SK_YUKON_EX) || (sc->sk_type == SK_YUKON_SUPR)) {
+               /* Disable flushing of non-ASF packets. */
+               SK_IF_WRITE_4(sc_if, 0, SK_RXMF1_CTRL_TEST,
+                   SK_RFCTL_RX_MACSEC_FLUSH_OFF);
+       }
+
        /* Configure interrupt handling */
        if (sc_if->sk_port == SK_PORT_A)
                sc->sk_intrmask |= SK_Y2_INTRS1;
diff -r 78c642706b30 -r 7a3ebd3c28f0 sys/dev/pci/if_skreg.h
--- a/sys/dev/pci/if_skreg.h    Fri Nov 15 12:18:46 2019 +0000
+++ b/sys/dev/pci/if_skreg.h    Fri Nov 15 12:38:09 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_skreg.h,v 1.26 2019/03/05 08:25:02 msaitoh Exp $ */
+/* $NetBSD: if_skreg.h,v 1.27 2019/11/15 12:38:09 msaitoh Exp $ */
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -1112,7 +1112,11 @@
 #define SK_RXMF1_READ_LEVEL    0x0C78
 
 /* Receive MAC FIFO 1 Control/Test */
-#define SK_RFCTL_WR_PTR_TST_ON 0x00004000      /* Write pointer test on*/
+#define SK_RFCTL_RX_MACSEC_FLUSH_ON  0x00800000
+#define SK_RFCTL_RX_MACSEC_FLUSH_OFF 0x00400000
+#define SK_RFCTL_RX_OVER_ON    0x00080000      /* Flush on RX Overrun on */
+#define SK_RFCTL_RX_OVER_OFF   0x00040000      /* Flush on RX Overrun off */
+#define SK_RFCTL_WR_PTR_TST_ON 0x00004000      /* Write pointer test on */
 #define SK_RFCTL_WR_PTR_TST_OFF        0x00002000      /* Write pointer test off */
 #define SK_RFCTL_WR_PTR_STEP   0x00001000      /* Write pointer increment */
 #define SK_RFCTL_RD_PTR_TST_ON 0x00000400      /* Read pointer test on */
@@ -1199,6 +1203,9 @@
 #define SK_TXMF1_RESTART_PTR   0x0D74
 #define SK_TXMF1_READ_LEVEL    0x0D78
 
+/* Transmit MAC FIFO End Address */
+#define SK_TXEND_WM_ON         0x00000003      /* ??? */
+
 /* Transmit MAC FIFO Control/Test */
 #define SK_TFCTL_WR_PTR_TST_ON 0x00004000      /* Write pointer test on*/
 #define SK_TFCTL_WR_PTR_TST_OFF        0x00002000      /* Write pointer test off */
@@ -1275,9 +1282,16 @@
 #define SK_TSTAMP_STOP         0x02
 #define SK_TSTAMP_START                0x04
 
+#define SK_Y2_CPU_WDOG         0x0e48
+
 #define SK_Y2_ASF_CSR          0x0e68
+#define SK_Y2_ASF_RESET                0x08
 
-#define SK_Y2_ASF_RESET                0x08
+#define SK_Y2_ASF_HCU_CCSR     0x0e68
+#define SK_Y2_ASF_HCU_CSSR_ARB_RST     __BIT(9)
+#define SK_Y2_ASF_HCU_CSSR_CPU_RST_MODE        __BIT(8)
+#define SK_Y2_ASF_HCU_CSSR_CPU_CLK_DIVIDE_MSK  __BITS(4, 3)
+#define SK_Y2_ASF_HCU_CSSR_UC_STATE_MSK        __BITS(1, 0)
 
 #define SK_Y2_LEV_ITIMERINIT   0x0eb0
 #define SK_Y2_LEV_ITIMERCTL    0x0eb8



Home | Main Index | Thread Index | Old Index