[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openbsd-tech
Subject:    Re: bnx(4) flow control support.
From:       Mike Belopuhov <mkb () crypt ! org ! ru>
Date:       2012-06-28 14:20:51
Message-ID: 20120628142051.GB26648 () gir ! theapt ! org
[Download RAW message or body]

On Thu, Jun 28, 2012 at 16:07 +0200, Peter Hessler wrote:
> So we have been running with this diff in the office, and it is working
> well for us.
> 
> 
> bnx0 at pci7 dev 0 function 0 "Broadcom BCM5709" rev 0x20: apic 0 int 6
> bnx0: address 1c:c1:de:e4:5e:b0
> brgphy0 at bnx0 phy 1: BCM5709 10/100/1000baseT PHY, rev. 8
> 
> As a side note, having TXPAUSE and RXPAUSE enabled, with a seperate
> interrupt colascing diff makes a significant speed improvement.
> 
> 

the diff makes sense to me, ok mikeb

> 
> On 2011 Sep 22 (Thu) at 22:00:22 +0200 (+0200), Paul de Weerd wrote:
> :An oldie, but I dug it up from the archives to test on my R210 II.
> :Diff applies (slightly offset) and works just fine.  ifconfig bnx now
> :shows:
> :
> :media: Ethernet autoselect (1000baseT full-duplex,rxpause,txpause)
> :
> :For the record, this is a Broadcom BCM5716 (see dmesg posted to misc@
> :yesterday):
> :
> :bnx1 at pci1 dev 0 function 1 "Broadcom BCM5716" rev 0x20: apic 0 int 17
> :
> :Paul 'WEiRD' de Weerd
> :
> :On Mon, Jun 28, 2010 at 03:34:23PM -0400, Brad wrote:
> :| Here is an older diff I had to add flow control support to bnx(4)
> :| which I have dug out and updated to -current src. I have tested
> :| it with the following adapters and could use some testing with a
> :| BCM5709 chipset. This supports flow control on all copper adapters
> :| and BCM5706 with fiber, but not BCM5708/BCM5709 with fiber yet.
> :| 
> :| bnx0 at pci1 dev 7 function 0 "Broadcom BCM5706" rev 0x02: apic 2 int 16 (irq 12)
> :| bnx0: address 00:10:18:15:f8:8a
> :| brgphy1 at bnx0 phy 1: BCM5706 10/100/1000baseT/SX PHY, rev. 2
> :| 
> :| bnx1 at pci5 dev 0 function 0 "Broadcom BCM5708" rev 0x11: apic 2 int 16 (irq 12)
> :| bnx1: address 00:10:18:15:fa:3e
> :| brgphy2 at bnx1 phy 1: BCM5708C 10/100/1000baseT PHY, rev. 5
> :| 
> :| Please test with any bnx(4) chipsets and provide a dmesg.
> :| 
> :| 
> :| Index: if_bnx.c
> :| ===================================================================
> :| RCS file: /cvs/src/sys/dev/pci/if_bnx.c,v
> :| retrieving revision 1.88
> :| diff -u -p -r1.88 if_bnx.c
> :| --- if_bnx.c	24 May 2010 21:23:23 -0000	1.88
> :| +++ if_bnx.c	28 Jun 2010 19:15:52 -0000
> :| @@ -913,6 +913,9 @@ bnx_attachhook(void *xsc)
> :|  	/* Look for our PHY. */
> :|  	ifmedia_init(&sc->bnx_mii.mii_media, 0, bnx_ifmedia_upd,
> :|  	    bnx_ifmedia_sts);
> :| +	if (BNX_CHIP_NUM(sc) == BNX_CHIP_NUM_5706 ||
> :| +	    (!(sc->bnx_phy_flags & BNX_PHY_SERDES_FLAG)))
> :| +		mii_flags |= MIIF_DOPAUSE;
> :|  	if (sc->bnx_phy_flags & BNX_PHY_SERDES_FLAG)
> :|  		mii_flags |= MIIF_HAVEFIBER;
> :|  	mii_attach(&sc->bnx_dev, &sc->bnx_mii, 0xffffffff,
> :| @@ -1279,6 +1282,7 @@ bnx_miibus_statchg(struct device *dev)
> :|  {
> :|  	struct bnx_softc	*sc = (struct bnx_softc *)dev;
> :|  	struct mii_data		*mii = &sc->bnx_mii;
> :| +	u_int32_t		rx_mode = sc->rx_mode;
> :|  	int			val;
> :|  
> :|  	val = REG_RD(sc, BNX_EMAC_MODE);
> :| @@ -1286,6 +1290,15 @@ bnx_miibus_statchg(struct device *dev)
> :|  		BNX_EMAC_MODE_MAC_LOOP | BNX_EMAC_MODE_FORCE_LINK | 
> :|  		BNX_EMAC_MODE_25G);
> :|  
> :| +	/*
> :| +	 * Get flow control negotiation result.
> :| +	 */
> :| +	if (IFM_SUBTYPE(mii->mii_media.ifm_cur->ifm_media) == IFM_AUTO &&
> :| +	    (mii->mii_media_active & IFM_ETH_FMASK) != sc->bnx_flowflags) {
> :| +		sc->bnx_flowflags = mii->mii_media_active & IFM_ETH_FMASK;
> :| +		mii->mii_media_active &= ~IFM_ETH_FMASK;
> :| +	}
> :| +
> :|  	/* Set MII or GMII interface based on the speed
> :|  	 * negotiated by the PHY.
> :|  	 */
> :| @@ -1325,6 +1338,34 @@ bnx_miibus_statchg(struct device *dev)
> :|  		DBPRINT(sc, BNX_INFO, "Setting Full-Duplex interface.\n");
> :|  
> :|  	REG_WR(sc, BNX_EMAC_MODE, val);
> :| +
> :| +	/*
> :| +	 * 802.3x flow control
> :| +	 */
> :| +	if (sc->bnx_flowflags & IFM_ETH_RXPAUSE) {
> :| +		DBPRINT(sc, BNX_INFO, "Enabling RX mode flow control.\n");
> :| +		rx_mode |= BNX_EMAC_RX_MODE_FLOW_EN;
> :| +	} else {
> :| +		DBPRINT(sc, BNX_INFO, "Disabling RX mode flow control.\n");
> :| +		rx_mode &= ~BNX_EMAC_RX_MODE_FLOW_EN;
> :| +	}
> :| +
> :| +	if (sc->bnx_flowflags & IFM_ETH_TXPAUSE) {
> :| +		DBPRINT(sc, BNX_INFO, "Enabling TX mode flow control.\n");
> :| +		BNX_SETBIT(sc, BNX_EMAC_TX_MODE, BNX_EMAC_TX_MODE_FLOW_EN);
> :| +	} else {
> :| +		DBPRINT(sc, BNX_INFO, "Disabling TX mode flow control.\n");
> :| +		BNX_CLRBIT(sc, BNX_EMAC_TX_MODE, BNX_EMAC_TX_MODE_FLOW_EN);
> :| +	}
> :| +
> :| +	/* Only make changes if the recive mode has actually changed. */
> :| +	if (rx_mode != sc->rx_mode) {
> :| +		DBPRINT(sc, BNX_VERBOSE, "Enabling new receive mode: 0x%08X\n",
> :| +		    rx_mode);
> :| +
> :| +		sc->rx_mode = rx_mode;
> :| +		REG_WR(sc, BNX_EMAC_RX_MODE, rx_mode);
> :| +	}
> :|  }
> :|  
> :|  /****************************************************************************/
> :| @@ -3954,6 +3995,13 @@ bnx_init_rx_context(struct bnx_softc *sc
> :|  	val = BNX_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_VALUE |
> :|  		BNX_L2CTX_CTX_TYPE_SIZE_L2 | (0x02 << 8);
> :|  
> :| +	/*
> :| +	 * Set the level for generating pause frames
> :| +	 * when the number of available rx_bd's gets
> :| +	 * too low (the low watermark) and the level
> :| +	 * when pause frames can be stopped (the high
> :| +	 * watermark).
> :| +	 */
> :|  	if (BNX_CHIP_NUM(sc) == BNX_CHIP_NUM_5709) {
> :|  		u_int32_t lo_water, hi_water;
> :|  
> :| @@ -3967,7 +4015,8 @@ bnx_init_rx_context(struct bnx_softc *sc
> :|  			hi_water = 0xf;
> :|  		else if (hi_water == 0)
> :|  			lo_water = 0;
> :| -		val |= lo_water |
> :| +
> :| +		val |= (lo_water << BNX_L2CTX_RX_LO_WATER_MARK_SHIFT) |
> :|  		    (hi_water << BNX_L2CTX_RX_HI_WATER_MARK_SHIFT);
> :|  	}
> :|  
> :| @@ -4202,8 +4251,9 @@ bnx_ifmedia_sts(struct ifnet *ifp, struc
> :|  	mii = &sc->bnx_mii;
> :|  
> :|  	mii_pollstat(mii);
> :| -	ifmr->ifm_active = mii->mii_media_active;
> :|  	ifmr->ifm_status = mii->mii_media_status;
> :| +	ifmr->ifm_active = (mii->mii_media_active & ~IFM_ETH_FMASK) |
> :| +	    sc->bnx_flowflags;
> :|  
> :|  	splx(s);
> :|  }
> :| @@ -5091,6 +5141,20 @@ bnx_ioctl(struct ifnet *ifp, u_long comm
> :|  		break;
> :|  
> :|  	case SIOCSIFMEDIA:
> :| +		/* Flow control requires full-duplex mode. */
> :| +		if (IFM_SUBTYPE(ifr->ifr_media) == IFM_AUTO ||
> :| +		    (ifr->ifr_media & IFM_FDX) == 0)
> :| +			ifr->ifr_media &= ~IFM_ETH_FMASK;
> :| +
> :| +		if (IFM_SUBTYPE(ifr->ifr_media) != IFM_AUTO) {
> :| +			if ((ifr->ifr_media & IFM_ETH_FMASK) == IFM_FLOW) {
> :| +				/* We can do both TXPAUSE and RXPAUSE. */
> :| +				ifr->ifr_media |=
> :| +				    IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE;
> :| +			}
> :| +			sc->bnx_flowflags = ifr->ifr_media & IFM_ETH_FMASK;
> :| +		}
> :| +		/* FALLTHROUGH */
> :|  	case SIOCGIFMEDIA:
> :|  		DBPRINT(sc, BNX_VERBOSE, "bnx_phy_flags = 0x%08X\n",
> :|  		    sc->bnx_phy_flags);
> :| Index: if_bnxreg.h
> :| ===================================================================
> :| RCS file: /cvs/src/sys/dev/pci/if_bnxreg.h,v
> :| retrieving revision 1.35
> :| diff -u -p -r1.35 if_bnxreg.h
> :| --- if_bnxreg.h	24 May 2010 21:23:23 -0000	1.35
> :| +++ if_bnxreg.h	28 Jun 2010 19:15:55 -0000
> :| @@ -4809,6 +4809,8 @@ struct bnx_softc {
> :|  	u_int32_t		bnx_shared_hw_cfg;
> :|  	u_int32_t		bnx_port_hw_cfg;
> :|  
> :| +	int			bnx_flowflags;
> :| +
> :|  	u_int16_t		bus_speed_mhz;		/* PCI bus speed */
> :|  	struct flash_spec	*bnx_flash_info;	/* Flash NVRAM settings */
> :|  	u_int32_t		bnx_flash_size;		/* Flash NVRAM size */
> :| 
> :| -- 
> :| This message has been scanned for viruses and
> :| dangerous content by MailScanner, and is
> :| believed to be clean.
> :| 
> :
> :-- 
> :>++++++++[<++++++++++>-]<+++++++.>+++[<------>-]<.>+++[<+
> :+++++++++++>-]<.>++[<------------>-]<+.--------------.[-]
> :                 http://www.weirdnet.nl/                 
> :
> 
> -- 
> Teach children to be polite and courteous in the home, and, when they
> grows up, they will never be able to edge a car onto a freeway.

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic