At least the following vr(4) devices can be configured to permit
larger MTUs.

vr0 at pci0 dev 18 function 0 "VIA RhineII-2" rev 0x51: irq 11, address 
00:40:63:c0:5d:27
vr1 at pci2 dev 0 function 0 "VIA VT6105M RhineIII" rev 0x96: irq 5, address 
00:00:24:cd:72:30

This is extremely useful as it permits carrying stacked vlans
on Alix/net5501, and also permits carrying 1500 MTU packets within
pppoe(4) using the RFC4638 support.

As seems to be common for fast ethernet chips, the register to set
the length is 11 bits. When tested, both these NICs performed
stably with an MTU of 1748 (around 95Mb/s throughput on my test
machine, dmesg below); with a slightly higher MTU things mostly
still worked however throughput fluctuated; with a much higher
MTU connections stalled.

As I am unsure about the effects on the other ICs supported by
this driver, and because the Rx length is programmed whether or not
the mtu is actually raised, I have added a quirk so this is only
attempted on the "newer" ICs. (in quotes because my RHINEII_2 is
on a ~10 year old VIA EPIA board).

Tests so far have included use of vlan/svlan and NFS.

Any comments or additional test reports? (of course I am primarily
interested in reports of any change to *existing* behaviour, tests
of new support is a bonus but is less interesting).  Any OKs even,
or is it a bit close to release for this?

(I also note that for sis(4) we programme the chip to permit 2046
byte frames - the datasheet's description of SIS_RXCFG_RX_JABBER is
"Accept Long Packets" - so we could increase permitted MTU there
i.e.  "ifp->if_hardmtu = 2046 - ETHER_HDR_LEN - ETHER_CRC_LEN",
however I don't have test hardware handy at the moment).


Index: if_vr.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_vr.c,v
retrieving revision 1.126
diff -u -p -r1.126 if_vr.c
--- if_vr.c     28 Jan 2013 02:57:02 -0000      1.126
+++ if_vr.c     7 Feb 2013 17:17:25 -0000
@@ -164,6 +164,7 @@ int vr_alloc_mbuf(struct vr_softc *, str
 #define        VR_Q_CAM                (1<<2)
 #define        VR_Q_HWTAG              (1<<3)
 #define        VR_Q_INTDISABLE         (1<<4)
+#define        VR_Q_BABYJUMBO          (1<<5) /* others may work too */
 
 struct vr_type {
        pci_vendor_id_t         vr_vid;
@@ -175,11 +176,12 @@ struct vr_type {
        { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_RHINEII,
            VR_Q_NEEDALIGN },
        { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_RHINEII_2,
-           0 },
+           VR_Q_BABYJUMBO },
        { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT6105,
-           0 },
+           VR_Q_BABYJUMBO },
        { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT6105M,
-           VR_Q_CSUM | VR_Q_CAM | VR_Q_HWTAG | VR_Q_INTDISABLE },
+           VR_Q_CSUM | VR_Q_CAM | VR_Q_HWTAG | VR_Q_INTDISABLE |
+           VR_Q_BABYJUMBO },
        { PCI_VENDOR_DELTA, PCI_PRODUCT_DELTA_RHINEII,
            VR_Q_NEEDALIGN },
        { PCI_VENDOR_ADDTRON, PCI_PRODUCT_ADDTRON_RHINEII,
@@ -630,6 +632,9 @@ vr_attach(struct device *parent, struct 
        ifp->if_ioctl = vr_ioctl;
        ifp->if_start = vr_start;
        ifp->if_watchdog = vr_watchdog;
+       if (sc->vr_quirks & VR_Q_BABYJUMBO)
+               ifp->if_hardmtu = VR_RXLEN_BABYJUMBO -
+                   ETHER_HDR_LEN - ETHER_CRC_LEN;
        IFQ_SET_READY(&ifp->if_snd);
        bcopy(sc->sc_dev.dv_xname, ifp->if_xname, IFNAMSIZ);
 
@@ -1745,7 +1750,10 @@ vr_alloc_mbuf(struct vr_softc *sc, struc
        r->vr_mbuf = m;
        d = r->vr_ptr;
        d->vr_data = htole32(r->vr_map->dm_segs[0].ds_addr);
-       d->vr_ctl = htole32(VR_RXCTL | VR_RXLEN);
+       if (sc->vr_quirks & VR_Q_BABYJUMBO)
+               d->vr_ctl = htole32(VR_RXCTL | VR_RXLEN_BABYJUMBO);
+       else
+               d->vr_ctl = htole32(VR_RXCTL | VR_RXLEN);
 
        bus_dmamap_sync(sc->sc_dmat, sc->sc_listmap.vrm_map, 0,
            sc->sc_listmap.vrm_map->dm_mapsize, BUS_DMASYNC_PREWRITE);
Index: if_vrreg.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_vrreg.h,v
retrieving revision 1.34
diff -u -p -r1.34 if_vrreg.h
--- if_vrreg.h  28 Jan 2013 02:57:02 -0000      1.34
+++ if_vrreg.h  7 Feb 2013 17:17:25 -0000
@@ -437,6 +437,8 @@ struct vr_desc {
 #define VR_TX_LIST_CNT         128
 #define VR_MIN_FRAMELEN                60
 #define VR_RXLEN               1524
+/* determined experimentally; seems intermittent with higher values */
+#define VR_RXLEN_BABYJUMBO     1758
 #define VR_TX_INTR_THRESH      8
 
 struct vr_list_data {



OpenBSD 5.3-beta (GENERIC) #16: Thu Feb  7 16:54:44 GMT 2013
    st...@i386.spacehopper.org:/usr/src/sys/arch/i386/compile/GENERIC
cpu0: VIA Samuel 2 ("CentaurHauls" 686-class) 534 MHz
cpu0: FPU,DE,TSC,MSR,MTRR,PGE,MMX,3DNOW
real mem  = 796389376 (759MB)
avail mem = 772386816 (736MB)
mainbus0 at root
bios0 at mainbus0: AT/286+ BIOS, date 03/18/02, BIOS32 rev. 0 @ 0xfb370, SMBIOS 
rev. 2.2 @ 0xf0800 (43 entries)
bios0: vendor Award Software International, Inc. version "6.00 PG" date 
03/18/2002
bios0: VIA Technologies, Inc. VT8601
apm0 at bios0: Power Management spec V1.2 (slowidle)
acpi at bios0 function 0x0 not configured
pcibios0 at bios0: rev 2.1 @ 0xf0000/0xdce4
pcibios0: PCI IRQ Routing Table rev 1.0 @ 0xfdc70/112 (5 entries)
pcibios0: PCI Exclusive IRQs: 5 10 11 12
pcibios0: PCI Interrupt Router at 000:17:0 ("VIA VT8231 ISA" rev 0x00)
pcibios0: PCI bus #2 is the last bus
bios0: ROM list: 0xc0000/0xc000 0xcc000/0x9800
cpu0 at mainbus0: (uniprocessor)
pci0 at mainbus0 bus 0: configuration mode 1 (bios)
pchb0 at pci0 dev 0 function 0 "VIA VT8601 PCI" rev 0x05
viaagp0 at pchb0: v2
agp0 at viaagp0: aperture at 0xd0000000, size 0x10000000
ppb0 at pci0 dev 1 function 0 "VIA VT82C601 AGP" rev 0x00
pci1 at ppb0 bus 1
vga1 at pci1 dev 0 function 0 "Trident CyberBlade i1" rev 0x6a
wsdisplay0 at vga1 mux 1: console (80x25, vt100 emulation)
wsdisplay0: screen 1-5 added (80x25, vt100 emulation)
pcib0 at pci0 dev 17 function 0 "VIA VT8231 ISA" rev 0x10
pciide0 at pci0 dev 17 function 1 "VIA VT82C571 IDE" rev 0x06: ATA100, channel 
0 configured to compatibility, channel 1 configured to compatibility
wd0 at pciide0 channel 0 drive 0: <InnoDisk Corp. - EDC4000 1GB>
wd0: 2-sector PIO, LBA, 999MB, 2047248 sectors
wd0(pciide0:0:0): using PIO mode 4, Ultra-DMA mode 4
pciide0: channel 1 disabled (no drives)
uhci0 at pci0 dev 17 function 2 "VIA VT83C572 USB" rev 0x1e: irq 10
uhci1 at pci0 dev 17 function 3 "VIA VT83C572 USB" rev 0x1e: irq 10
viapm0 at pci0 dev 17 function 4 "VIA VT8231 PMG" rev 0x10: SMI
iic0 at viapm0
iic0: addr 0x20 06=80 0e=03 0f=05 10=20 13=05 14=21 15=04 1b=02 86=80 8e=03 
8f=05 90=20 93=05 94=21 95=04 9b=02 words 00=0000 01=0000 02=0000 03=0000 
04=0000 05=0080 06=8000 07=0000
spdmem0 at iic0 addr 0x50: 256MB SDRAM non-parity PC133CL2
spdmem1 at iic0 addr 0x51: 512MB SDRAM non-parity PC133CL2
viapm0: 24-bit timer at 3579545Hz
auvia0 at pci0 dev 17 function 5 "VIA VT82C686 AC97" rev 0x40: irq 12
ac97: codec id 0x56494161 (VIA Technologies VT1612A)
ac97: codec features headphone, 18 bit DAC, 18 bit ADC, KS Waves 3D
audio0 at auvia0
vr0 at pci0 dev 18 function 0 "VIA RhineII-2" rev 0x51: irq 11, address 
00:40:63:c0:5d:27
ukphy0 at vr0 phy 1: Generic IEEE 802.3u media interface, rev. 5: OUI 0x004063, 
model 0x0032
ppb1 at pci0 dev 20 function 0 "TI PCI2250 PCI-PCI" rev 0x02
pci2 at ppb1 bus 2
vr1 at pci2 dev 0 function 0 "VIA VT6105M RhineIII" rev 0x96: irq 5, address 
00:00:24:cd:72:30
ukphy1 at vr1 phy 1: Generic IEEE 802.3u media interface, rev. 3: OUI 0x004063, 
model 0x0034
vr2 at pci2 dev 1 function 0 "VIA VT6105M RhineIII" rev 0x96: irq 12, address 
00:00:24:cd:72:31
ukphy2 at vr2 phy 1: Generic IEEE 802.3u media interface, rev. 3: OUI 0x004063, 
model 0x0034
vr3 at pci2 dev 2 function 0 "VIA VT6105M RhineIII" rev 0x96: irq 10, address 
00:00:24:cd:72:32
ukphy3 at vr3 phy 1: Generic IEEE 802.3u media interface, rev. 3: OUI 0x004063, 
model 0x0034
vr4 at pci2 dev 3 function 0 "VIA VT6105M RhineIII" rev 0x96: irq 11, address 
00:00:24:cd:72:33
ukphy4 at vr4 phy 1: Generic IEEE 802.3u media interface, rev. 3: OUI 0x004063, 
model 0x0034
isa0 at pcib0
isadma0 at isa0
com0 at isa0 port 0x3f8/8 irq 4: ns16550a, 16 byte fifo
com0: console
pckbc0 at isa0 port 0x60/5
pckbd0 at pckbc0 (kbd slot)
pckbc0: using irq 1 for kbd slot
wskbd0 at pckbd0: console keyboard, using wsdisplay0
pcppi0 at isa0 port 0x61
spkr0 at pcppi0
lpt0 at isa0 port 0x378/4 irq 7
npx0 at isa0 port 0xf0/16: reported by CPUID; using exception 16
usb0 at uhci0: USB revision 1.0
uhub0 at usb0 "VIA UHCI root hub" rev 1.00/1.00 addr 1
usb1 at uhci1: USB revision 1.0
uhub1 at usb1 "VIA UHCI root hub" rev 1.00/1.00 addr 1
mtrr: Pentium Pro MTRR support
vscsi0 at root
scsibus0 at vscsi0: 256 targets
softraid0 at root
scsibus1 at softraid0: 256 targets
root on wd0a (d4dbc8b67776f0f1.a) swap on wd0b dump on wd0b

Reply via email to