From owner-tech+M38388@openbsd.org Tue Sep 2 11:55:02 2014 Delivered-To: david@gwynne.id.au Received: by 10.152.18.199 with SMTP id y7csp635071lad; Mon, 1 Sep 2014 18:55:03 -0700 (PDT) X-Received: by 10.50.111.80 with SMTP id ig16mr25220431igb.43.1409622902549; Mon, 01 Sep 2014 18:55:02 -0700 (PDT) Return-Path: Received: from shear.ucar.edu (lists.openbsd.org. [192.43.244.163]) by mx.google.com with ESMTPS id pz4si6361708icb.95.2014.09.01.18.55.02 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 01 Sep 2014 18:55:02 -0700 (PDT) Received-SPF: pass (google.com: manual fallback record for domain of owner-tech+M38388@openbsd.org designates 192.43.244.163 as permitted sender) client-ip=192.43.244.163; Authentication-Results: mx.google.com; spf=pass (google.com: manual fallback record for domain of owner-tech+M38388@openbsd.org designates 192.43.244.163 as permitted sender) smtp.mail=owner-tech+M38388@openbsd.org; dkim=pass header.i=@comstyle.com Received: from openbsd.org (localhost [127.0.0.1]) by shear.ucar.edu (8.14.8/8.14.5) with ESMTP id s8225owo008067; Mon, 1 Sep 2014 20:05:50 -0600 (MDT) Received: from mail.comstyle.com (speedy.comstyle.com [206.51.28.2]) by shear.ucar.edu (8.14.8/8.14.8) with ESMTP id s8225Ybo013278 (version=TLSv1/SSLv3 cipher=DHE-DSS-AES256-SHA bits=256 verify=NO) for ; Mon, 1 Sep 2014 20:05:37 -0600 (MDT) Received: from mail.comstyle.com (localhost [127.0.0.1]) by mail.comstyle.com (Postfix) with ESMTP id 5B9A3984BE for ; Mon, 1 Sep 2014 21:54:10 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=comstyle.com; h=date:from :to:subject:message-id:references:mime-version:content-type :in-reply-to; s=selector1; bh=6sqqAtHthdc5AesWz9/9lUA93J0=; b=bt w8RXixj+JWCUUW6waAoFALFD7ISFNw0UWYSYaD2ugIcNtnGWzXAC9fKWxGd7krYX 9AiES1Hz24DXo/eQTKeBHEB7BePcPVR6XOSnfbw9ZNigAGio2BDMa9u5R4pKs8J3 d2R5kyP3SVcoa8hER7DJ2nNXuJLz+oQcr4AlcJTqY= DomainKey-Signature: a=rsa-sha1; c=nofws; d=comstyle.com; h=date:from:to :subject:message-id:references:mime-version:content-type :in-reply-to; q=dns; s=selector1; b=O5hYDpDCguufpzGPNqKjBXJLTzR6 tdCTyWq+V5ZUOGdiBWV707MNeRqcBMC5QoVwylCVIoA2+eDinjCqWlb18V9VoKMw ogZUFtYOoQZYy62ktF6QtZAkzU21HXM6ciNtU/FVRHG2s7LGsHqIXYiBlhcwf3Kd ndhnpKj6R32puWc= X-comstyle-MailScanner-From: brad@comstyle.com X-comstyle-MailScanner-SpamCheck: not spam (whitelisted), SpamAssassin (not cached, score=-2.9, required 6, autolearn=not spam, ALL_TRUSTED -1.00, BAYES_00 -1.90) X-comstyle-MailScanner: Found to be clean X-comstyle-MailScanner-ID: D76ED984B3.AF7E1 X-comstyle-MailScanner-Information: Please contact the ISP for more information Received: from humpty.home.comstyle.com (unknown [IPv6:2001:470:b01e:3:c2c:cacd:a456:ddd3]) (using TLSv1.2 with cipher ECDHE-RSA-CHACHA20-POLY1305 (256/0 bits)) (No client certificate requested) (Authenticated sender: brad) by mail.comstyle.com (Postfix) with ESMTPSA id D76ED984B3 for ; Mon, 1 Sep 2014 21:54:05 -0400 (EDT) Date: Mon, 1 Sep 2014 21:54:04 -0400 From: Brad Smith To: tech@openbsd.org Subject: Re: bge(4) Jumbo support for newer chipsets Message-ID: <20140902015404.GA10616@humpty.home.comstyle.com> References: <20140827062526.GB29370@humpty.home.comstyle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140827062526.GB29370@humpty.home.comstyle.com> User-Agent: Mutt/1.5.23 (2014-03-12) List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Loop: tech@openbsd.org Precedence: list Sender: owner-tech@openbsd.org Status: RO Content-Length: 6865 Lines: 207 On Wed, Aug 27, 2014 at 02:25:27AM -0400, Brad Smith wrote: > Looking for some testing of the following diff to add Jumbo support for the > BCM5714 / BCM5780 and BCM5717 / BCM5719 / BCM5720 / BCM57765 / BCM57766 > chipsets. Here is an updated diff with bge_rxrinfo() being fixed. Index: if_bge.c =================================================================== RCS file: /home/cvs/src/sys/dev/pci/if_bge.c,v retrieving revision 1.360 diff -u -p -u -p -r1.360 if_bge.c --- if_bge.c 26 Aug 2014 11:01:21 -0000 1.360 +++ if_bge.c 2 Sep 2014 01:50:30 -0000 @@ -1117,10 +1117,10 @@ bge_newbuf(struct bge_softc *sc, int i) struct mbuf *m; int error; - m = MCLGETI(NULL, M_DONTWAIT, NULL, MCLBYTES); + m = MCLGETI(NULL, M_DONTWAIT, NULL, sc->bge_rx_std_len); if (!m) return (ENOBUFS); - m->m_len = m->m_pkthdr.len = MCLBYTES; + m->m_len = m->m_pkthdr.len = sc->bge_rx_std_len; if (!(sc->bge_flags & BGE_RX_ALIGNBUG)) m_adj(m, ETHER_ALIGN); @@ -1241,8 +1241,8 @@ bge_init_rx_ring_std(struct bge_softc *s return (0); for (i = 0; i < BGE_STD_RX_RING_CNT; i++) { - if (bus_dmamap_create(sc->bge_dmatag, MCLBYTES, 1, MCLBYTES, 0, - BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, + if (bus_dmamap_create(sc->bge_dmatag, sc->bge_rx_std_len, 1, + sc->bge_rx_std_len, 0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &sc->bge_cdata.bge_rx_std_map[i]) != 0) { printf("%s: unable to create dmamap for slot %d\n", sc->bge_dev.dv_xname, i); @@ -1485,6 +1485,7 @@ bge_init_tx_ring(struct bge_softc *sc) { int i; bus_dmamap_t dmamap; + bus_size_t txsegsz, txmaxsegsz; struct txdmamap_pool_entry *dma; if (sc->bge_flags & BGE_TXRING_VALID) @@ -1504,11 +1505,18 @@ bge_init_tx_ring(struct bge_softc *sc) if (BGE_CHIPREV(sc->bge_chipid) == BGE_CHIPREV_5700_BX) bge_writembx(sc, BGE_MBX_TX_NIC_PROD0_LO, 0); + if (BGE_IS_JUMBO_CAPABLE(sc)) { + txsegsz = 4096; + txmaxsegsz = BGE_JLEN; + } else { + txsegsz = MCLBYTES; + txmaxsegsz = MCLBYTES; + } + SLIST_INIT(&sc->txdma_list); for (i = 0; i < BGE_TX_RING_CNT; i++) { - if (bus_dmamap_create(sc->bge_dmatag, BGE_JLEN, - BGE_NTXSEG, BGE_JLEN, 0, BUS_DMA_NOWAIT, - &dmamap)) + if (bus_dmamap_create(sc->bge_dmatag, txmaxsegsz, + BGE_NTXSEG, txsegsz, 0, BUS_DMA_NOWAIT, &dmamap)) return (ENOBUFS); if (dmamap == NULL) panic("dmamap NULL in bge_init_tx_ring"); @@ -2001,7 +2009,7 @@ bge_blockinit(struct bge_softc *sc) * using this ring (i.e. once we set the MTU * high enough to require it). */ - if (BGE_IS_JUMBO_CAPABLE(sc)) { + if (sc->bge_flags & BGE_JUMBO_RING) { rcb = &sc->bge_rdata->bge_info.bge_jumbo_rx_rcb; BGE_HOSTADDR(rcb->bge_hostaddr, BGE_RING_DMA_ADDR(sc, bge_rx_jumbo_ring)); @@ -2065,7 +2073,7 @@ bge_blockinit(struct bge_softc *sc) * to work around HW bugs. */ CSR_WRITE_4(sc, BGE_RBDI_STD_REPL_THRESH, 8); - if (BGE_IS_JUMBO_CAPABLE(sc)) + if (sc->bge_flags & BGE_JUMBO_RING) CSR_WRITE_4(sc, BGE_RBDI_JUMBO_REPL_THRESH, 8); if (BGE_IS_5717_PLUS(sc)) { @@ -2699,7 +2707,8 @@ bge_attach(struct device *parent, struct case BGE_ASICREV_BCM5719: case BGE_ASICREV_BCM5720: sc->bge_flags |= BGE_5717_PLUS | BGE_5755_PLUS | BGE_575X_PLUS | - BGE_5705_PLUS; + BGE_5705_PLUS | BGE_JUMBO_CAPABLE | BGE_JUMBO_RING | + BGE_JUMBO_FRAME; if (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5719 || BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5720) { /* @@ -2707,6 +2716,13 @@ bge_attach(struct device *parent, struct * of TXMBUF available space. */ sc->bge_flags |= BGE_RDMA_BUG; + + if (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5719 && + sc->bge_chipid == BGE_CHIPID_BCM5719_A0) { + /* Jumbo frame on BCM5719 A0 does not work. */ + sc->bge_flags &= ~(BGE_JUMBO_CAPABLE | + BGE_JUMBO_RING | BGE_JUMBO_FRAME); + } } break; case BGE_ASICREV_BCM5755: @@ -2721,12 +2737,12 @@ bge_attach(struct device *parent, struct case BGE_ASICREV_BCM5701: case BGE_ASICREV_BCM5703: case BGE_ASICREV_BCM5704: - sc->bge_flags |= BGE_5700_FAMILY | BGE_JUMBO_CAPABLE; + sc->bge_flags |= BGE_5700_FAMILY | BGE_JUMBO_CAPABLE | BGE_JUMBO_RING; break; case BGE_ASICREV_BCM5714_A0: case BGE_ASICREV_BCM5780: case BGE_ASICREV_BCM5714: - sc->bge_flags |= BGE_5714_FAMILY; + sc->bge_flags |= BGE_5714_FAMILY | BGE_JUMBO_CAPABLE | BGE_JUMBO_STD; /* FALLTHROUGH */ case BGE_ASICREV_BCM5750: case BGE_ASICREV_BCM5752: @@ -2738,6 +2754,11 @@ bge_attach(struct device *parent, struct break; } + if (sc->bge_flags & BGE_JUMBO_STD) + sc->bge_rx_std_len = BGE_JLEN; + else + sc->bge_rx_std_len = MCLBYTES; + /* * When using the BCM5701 in PCI-X mode, data corruption has * been observed in the first few bytes of some received packets. @@ -4003,6 +4024,10 @@ bge_encap(struct bge_softc *sc, struct m } } + if (sc->bge_flags & BGE_JUMBO_FRAME && + m_head->m_pkthdr.len > ETHER_MAX_LEN) + csum_flags |= BGE_TXBDFLAG_JUMBO_FRAME; + if (!(BGE_CHIPREV(sc->bge_chipid) == BGE_CHIPREV_5700_BX)) goto doit; @@ -4232,7 +4257,7 @@ bge_init(void *xsc) } /* Init Jumbo RX ring. */ - if (BGE_IS_JUMBO_CAPABLE(sc)) + if (sc->bge_flags & BGE_JUMBO_RING) bge_init_rx_ring_jumbo(sc); /* Init our RX return ring index */ @@ -4508,7 +4533,7 @@ bge_rxrinfo(struct bge_softc *sc, struct memset(ifr, 0, sizeof(ifr)); if (ISSET(sc->bge_flags, BGE_RXRING_VALID)) { - ifr[n].ifr_size = MCLBYTES; + ifr[n].ifr_size = sc->bge_rx_std_len; strlcpy(ifr[n].ifr_name, "std", sizeof(ifr[n].ifr_name)); ifr[n].ifr_info = sc->bge_std_ring; @@ -4635,7 +4660,7 @@ bge_stop(struct bge_softc *sc) bge_free_rx_ring_std(sc); /* Free jumbo RX list. */ - if (BGE_IS_JUMBO_CAPABLE(sc)) + if (sc->bge_flags & BGE_JUMBO_RING) bge_free_rx_ring_jumbo(sc); /* Free TX buffers. */ Index: if_bgereg.h =================================================================== RCS file: /home/cvs/src/sys/dev/pci/if_bgereg.h,v retrieving revision 1.125 diff -u -p -u -p -r1.125 if_bgereg.h --- if_bgereg.h 24 Aug 2014 05:01:42 -0000 1.125 +++ if_bgereg.h 2 Sep 2014 01:49:57 -0000 @@ -2880,6 +2880,9 @@ struct bge_softc { #define BGE_TAGGED_STATUS 0x00200000 #define BGE_MSI 0x00400000 #define BGE_RDMA_BUG 0x00800000 +#define BGE_JUMBO_RING 0x01000000 +#define BGE_JUMBO_STD 0x02000000 +#define BGE_JUMBO_FRAME 0x04000000 u_int32_t bge_phy_flags; #define BGE_PHY_NO_3LED 0x00000001 @@ -2911,6 +2914,7 @@ struct bge_softc { u_int32_t bge_tx_prodidx; struct if_rxring bge_std_ring; u_int16_t bge_std; /* current std ring head */ + int bge_rx_std_len; struct if_rxring bge_jumbo_ring; u_int16_t bge_jumbo; /* current jumo ring head */ u_int32_t bge_stat_ticks; -- This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean.