Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 10 Jul 2013 11:35:12 +0900
From:      Yonghyeon PYUN <pyunyh@gmail.com>
To:        Andreas Longwitz <longwitz@incore.de>
Cc:        freebsd-net@freebsd.org
Subject:   Re: sis(4) flow control
Message-ID:  <20130710023512.GB2753@michelle.cdnetworks.com>
In-Reply-To: <51DC1599.8040805@incore.de>
References:  <51DC1599.8040805@incore.de>

next in thread | previous in thread | raw e-mail | index | archive | help

--1UWUbFP1cBYEclgG
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Tue, Jul 09, 2013 at 03:52:25PM +0200, Andreas Longwitz wrote:
> Some of my soekris boxes run with sis interfaces. Because I need
> ethernet flow control on these boxes I use the following patch (against
> 8-Stable) for some years:
> 
> --- if_sis.c.orig      2013-05-15 20:01:16.000000000 +0200
> +++ if_sis.c           2013-06-24 15:58:05.000000000 +0200
> @@ -1965,6 +1965,18 @@
>         }
>  #endif
> 
> +       if (sc->sis_type == SIS_TYPE_83815 && sc->sis_srr >= NS_SRR_16A) {
> +             if (ifp->if_flags & IFF_LINK0) {
> +                /*
> +                 * Configure Ethernet flow control for outgoing frames.
> +                 * Enable reception of 802.3x multicast pause frames.
> +                 */
> +                SIS_SETBIT(sc, NS_PCR, NS_PCR_PAUSE );
> +             } else {
> +                SIS_CLRBIT(sc, NS_PCR, NS_PCR_PAUSE );
> +             }
> +       }
> +
>         mii = device_get_softc(sc->sis_miibus);
> 
>         /* Set MAC address */
> 
> Other network drivers (eg. vr) have this functionality inside, it would
> be fine if sis learns flow control too.
> 

Hmm, does the change really make flow-control work?
I believe flow-control should be negotiated with remote link
partner so you have to announce flow-control capability to link
partner. In addition, it seems DP83815/DP83816 does not support
TX flow-control so it just honors RX pause frames.
Try attached patch and let me know how it works.

--1UWUbFP1cBYEclgG
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment; filename="sis.flow.diff"

Index: sys/dev/sis/if_sis.c
===================================================================
--- sys/dev/sis/if_sis.c	(revision 253125)
+++ sys/dev/sis/if_sis.c	(working copy)
@@ -619,10 +619,22 @@ sis_miibus_statchg(device_t dev)
 		SIS_SETBIT(sc, SIS_TX_CFG,
 		    (SIS_TXCFG_IGN_HBEAT | SIS_TXCFG_IGN_CARR));
 		SIS_SETBIT(sc, SIS_RX_CFG, SIS_RXCFG_RX_TXPKTS);
+		if (sc->sis_type == SIS_TYPE_83815) {
+			if ((IFM_OPTIONS(mii->mii_media_active) &
+			    IFM_ETH_RXPAUSE) != 0)
+				SIS_SETBIT(sc, NS_PCR, NS_PCR_PAUSE_DA |
+				    NS_PCR_PAUSE_MCAST | NS_PCR_PAUSE_ENABLE);
+			else
+				SIS_CLRBIT(sc, NS_PCR, NS_PCR_PAUSE_DA |
+				    NS_PCR_PAUSE_MCAST | NS_PCR_PAUSE_ENABLE);
+		}
 	} else {
 		SIS_CLRBIT(sc, SIS_TX_CFG,
 		    (SIS_TXCFG_IGN_HBEAT | SIS_TXCFG_IGN_CARR));
 		SIS_CLRBIT(sc, SIS_RX_CFG, SIS_RXCFG_RX_TXPKTS);
+		if (sc->sis_type == SIS_TYPE_83815)
+			SIS_CLRBIT(sc, NS_PCR, NS_PCR_PAUSE_DA |
+			    NS_PCR_PAUSE_MCAST | NS_PCR_PAUSE_ENABLE);
 	}
 
 	if (sc->sis_type == SIS_TYPE_83815 && sc->sis_srr >= NS_SRR_16A) {
@@ -1074,7 +1086,8 @@ sis_attach(device_t dev)
 	 * Do MII setup.
 	 */
 	error = mii_attach(dev, &sc->sis_miibus, ifp, sis_ifmedia_upd,
-	    sis_ifmedia_sts, BMSR_DEFCAPMASK, MII_PHY_ANY, MII_OFFSET_ANY, 0);
+	    sis_ifmedia_sts, BMSR_DEFCAPMASK, MII_PHY_ANY, MII_OFFSET_ANY,
+	    sc->sis_type == SIS_TYPE_83815 ? MIIF_DOPAUSE : 0);
 	if (error != 0) {
 		device_printf(dev, "attaching PHYs failed\n");
 		goto fail;
Index: sys/dev/sis/if_sisreg.h
===================================================================
--- sys/dev/sis/if_sisreg.h	(revision 253125)
+++ sys/dev/sis/if_sisreg.h	(working copy)
@@ -78,6 +78,7 @@
 #define NS_IHR			0x1C
 #define NS_CLKRUN		0x3C
 #define	NS_WCSR			0x40
+#define	NS_PCR			0x44
 #define NS_SRR			0x58
 #define NS_BMCR			0x80
 #define NS_BMSR			0x84
@@ -123,6 +124,15 @@
 #define	NS_WCSR_DET_PATTERN3	0x40000000
 #define	NS_WCSR_DET_MAGIC	0x80000000
 
+#define	NS_PCR_PAUSE_CNT_MASK	0x0000FFFF
+#define	NS_PCR_MLD_ENABLE	0x00010000
+#define	NS_PCR_PAUSE_NEG	0x00200000
+#define	NS_PCR_PAUSE_RCVD	0x00400000
+#define	NS_PCR_PAUSE_ACT	0x00800000
+#define	NS_PCR_PAUSE_DA		0x20000000
+#define	NS_PCR_PAUSE_MCAST	0x40000000
+#define	NS_PCR_PAUSE_ENABLE	0x80000000
+
 /* NS silicon revisions */
 #define NS_SRR_15C		0x302
 #define NS_SRR_15D		0x403

--1UWUbFP1cBYEclgG--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20130710023512.GB2753>