On Sun, Nov 19, 2017 at 03:09:38PM -0500, Eduard Nicodei wrote: > >-------- Original Message -------- > >Subject: Re: sunxi/sxie.c: ~3KB/s TX speed (6.2 + uboot 17.03) > >Local Time: November 14, 2017 12:07 AM > >UTC Time: November 14, 2017 12:07 AM > >From: artturi....@gmail.com > >To: Eduard Nicodei <enico...@protonmail.com> > >arm@openbsd.org > > > >On Mon, Nov 13, 2017 at 06:33:48PM -0500, Eduard Nicodei wrote: > >>Hi, > >>I've had same problem as Artturi > >>(https://marc.info/?l=openbsd-bugs&m=150071170630651&w=2), but on a > >>Olinuxino A10 Lime. After trying u-boot 17.03 I noticed that TX speeds > >>were very slow (~3KB/s). > >>Here is what the packets look like on the other machine (192.168.1.17): > >>192.168.1.3.1484 > 192.168.1.17.30000: S 3400651399:3400651399(0) win 16384 > >> 192.168.1.17.30000 > 192.168.1.3.1484: S 2057093871:2057093871(0) ack > >> 3400651400 win 28960 > >> 192.168.1.3.1484 > 192.168.1.17.30000: . ack 1 win 256 > >> 0b:90:d0:de:44:1c 5f:bd:8a:25:ff:c6 69ef 118: > >> e506 fdff 29fe dfef 0094 3fff 0894 ffee > >> a0a9 f9ab 8446 dcf3 ba20 5c47 0249 f3de > >> c90a d7d1 0028 9ef4 9381 8b69 7103 8ef4 > >> 6e68 f7 > >> 192.168.1.3.1484 > 192.168.1.17.30000: . 1:1449(1448) ack 1 win 256 > >> 192.168.1.17.30000 > 192.168.1.3.1484: . ack 1449 win 249 > >> 0b:90:d0:de:44:1c 5f:bd:8a:25:ff:c6 69ef 1514: > >> e506 fdff 29fe dfef 0094 3fff 0894 ffee > >> a0a9 f9ab 8446 dcf3 ba20 5c47 0249 f3de > >> c90a d7d1 0028 9ef4 9381 8b69 7103 8ef4 > >> 6e68 f7 > >> 192.168.1.3.1484 > 192.168.1.17.30000: . 1501:2949(1448) ack 1 win 256 > >> 192.168.1.17.30000 > 192.168.1.3.1484: . ack 1449 win 272 > >> 192.168.1.3.1484 > 192.168.1.17.30000: . 4397:5845(1448) ack 1 win 256 > >> 192.168.1.17.30000 > 192.168.1.3.1484: . ack 1449 win 295 > >>On the Olinuxino Lime (192.168.1.3) they look OK: > >>192.168.1.3.1484 > 192.168.1.17.30000: S 3400651399:3400651399(0) win 16384 > >> 192.168.1.17.30000 > 192.168.1.3.1484: S 2057093871:2057093871(0) ack > >> 3400651400 win 28960 > >> 192.168.1.3.1484 > 192.168.1.17.30000: . ack 1 win 256 > >> 192.168.1.3.1484 > 192.168.1.17.30000: . 1:1449(1448) ack 1 win 256 > >> 192.168.1.3.1484 > 192.168.1.17.30000: P 1449:1501(52) ack 1 win 256 > >> 192.168.1.3.1484 > 192.168.1.17.30000: . 1501:2949(1448) ack 1 win 256 > >> 192.168.1.3.1484 > 192.168.1.17.30000: . 2949:4397(1448) ack 1 win 256 > >> 192.168.1.3.1484 > 192.168.1.17.30000: . 4397:5845(1448) ack 1 win 256 > >> 192.168.1.3.1484 > 192.168.1.17.30000: . 5845:7293(1448) ack 1 win 256 > >> 192.168.1.17.30000 > 192.168.1.3.1484: . ack 1449 win 249 > >> 192.168.1.3.1484 > 192.168.1.17.30000: . 7293:8741(1448) ack 1 win 256 > >> 192.168.1.17.30000 > 192.168.1.3.1484: . ack 1449 win 272 > >> 192.168.1.3.1484 > 192.168.1.17.30000: . 8741:10189(1448) ack 1 win 256 > >> 192.168.1.17.30000 > 192.168.1.3.1484: . ack 1449 win 295 > >> 192.168.1.3.1484 > 192.168.1.17.30000: . 10189:11637(1448) ack 1 win 256 > >> 192.168.1.17.30000 > 192.168.1.3.1484: . ack 1449 win 317 > >>I believe this might be caused by sxie driver using two TX FIFOs: I hacked > >>a bit the kernel and when using only 1 TX FIFO it did not send any mangled > >>frames (though packets were getting dropped by ifq_enqueue). I also added > >>some counters to keep track which queue was being used and the numbers of > >>mangled frames were close the number of times the second FIFO was used. > >>I would like to investigate further, but I would like to know if this could > >>be caused by the older u-boot or if it seems like an actual fault with the > >>driver? > >>Has anybody had good TX speed using sxie? I saw John DiMarco also reported > >>a TX speed of about 4KB/s but that was over a year ago > >>(https://marc.info/?l=openbsd-arm&m=147378434716041&w=2). > >>I booted a debian image and it run at a few *MB/s so I'm pretty confident > >>it's not a hw problem. > >>Many Thanks, > >> Eduard > >> > >I can get ip and even ssh in on -current and latest u-boot, > > but yeah it's broken enough that i did shutdown my boards w/it, > > i know it used to do way more IRQs too. > > I don't know yet, nor really feel like it'd be worth my time to do > > anything than install something else on it, but it might be related > > that someone did fuckup the timers on it too, tick does around 66/update > > in systat, and stattick barely 100. > > > > fwiw., i got some fixes commited to u-boot for sun4i_emac, > > but otherwise it's unable to boot sd0a:/bsd w/bootarm.efi, > > so still broken&useless, it will be(U-Boot 2017.11). > > > > -Artturi > >>U-Boot SPL 2017.03 (Apr 03 2017 - 11:14:00) > >> DRAM: 512 MiB > >> CPU: 912000000Hz, AXI/AHB/APB: 3/2/2 > >> Trying to boot from MMC1 > >>U-Boot 2017.03 (Apr 03 2017 - 11:14:00 -0600) Allwinner Technology > >>CPU: Allwinner A10 (SUN4I) > >> Model: Olimex A10-OLinuXino-LIME > >> I2C: ready > >> DRAM: 512 MiB > >> MMC: SUNXI SD/MMC: 0 > >> *** Warning - bad CRC, using default environment > >>In: serial > >> Out: serial > >> Err: serial > >> SCSI: SATA link 0 timeout. > >> AHCI 0001.0100 32 slots 1 ports 3 Gbps 0x1 impl SATA mode > >> flags: ncq stag pm led clo only pmp pio slum part ccc apst > >> Net: eth0: ethernet@01c0b000 > >> starting USB... > >> USB0: USB EHCI 1.00 > >> USB1: USB OHCI 1.0 > >> USB2: USB EHCI 1.00 > >> USB3: USB OHCI 1.0 > >> scanning bus 0 for devices... 1 USB Device(s) found > >> scanning bus 2 for devices... 1 USB Device(s) found > >> scanning usb for storage devices... 0 Storage Device(s) found > >> Hit any key to stop autoboot: 0 > >> switch to partitions #0, OK > >> mmc0 is current device > >> Scanning mmc 0:1... > >> reading /sun4i-a10-olinuxino-lime.dtb > >> 26581 bytes read in 30 ms (865.2 KiB/s) > >> Found EFI removable media binary efi/boot/bootarm.efi > >> reading efi/boot/bootarm.efi > >> 67436 bytes read in 42 ms (1.5 MiB/s) > >>Starting EFI application at 42000000 ... > >> > >>Scanning disks on scsi... > >> Scanning disks on usb... > >> Scanning disks on mmc... > >> MMC Device 1 not found > >> MMC Device 2 not found > >> MMC Device 3 not found > >> Found 6 disks > >>>>OpenBSD/armv7 BOOTARM 1.0 > >>>> boot> > >>>> booting sd0a:/bsd: 3935884+166328+562136 > >>>> [273417+90+522736+245831]=0x5785f4 > >>>>OpenBSD/armv7 booting ... > >> arg0 0xc08785f4 arg1 0x0 arg2 0x48000000 > >> Allocating page tables > >> freestart = 0x40879000, free_pages = 128903 (0x0001f787) > >> IRQ stack: p0x408a7000 v0xc08a7000 > >> ABT stack: p0x408a8000 v0xc08a8000 > >> UND stack: p0x408a9000 v0xc08a9000 > >> SVC stack: p0x408aa000 v0xc08aa000 > >> Creating L1 page table at 0x4087c000 > >> Mapping kernel > >> Constructing L2 page tables > >> undefined page pmap [ using 1042532 bytes of bsd ELF symbol table ] > >> board type: 0 > >> Copyright (c) 1982, 1986, 1989, 1991, 1993 > >> The Regents of the University of California. All rights reserved. > >> Copyright (c) 1995-2017 OpenBSD. All rights reserved. > >> https://www.OpenBSD.org > >>OpenBSD 6.2-current (GENERIC) #122: Sat Nov 11 11:05:42 MST 2017 > >>dera...@armv7.openbsd.org:/usr/src/sys/arch/armv7/compile/GENERIC > >> real mem = 536870912 (512MB) > >> avail mem = 517271552 (493MB) > >> mainbus0 at root: Olimex A10-OLinuXino-LIME > >> cpu0 at mainbus0: ARM Cortex-A8 r3p2 (ARMv7) > >> cpu0: DC enabled IC enabled WB disabled EABT branch prediction enabled > >> cpu0: 32KB(64b/l,4way) I-cache, 32KB(64b/l,4way) wr-back D-cache > >> sxiccmu0 at mainbus0 > >> simplebus0 at mainbus0: "soc" > >> sxipio0 at simplebus0: 175 pins > >> sxitimer0 at simplebus0: cntrtimer @ 24000KHz > >> sxie0 at simplebus0, address 02:02:0a:81:e6:6c > >> rlphy0 at sxie0 phy 1: RTL8201L 10/100 PHY, rev. 1 > >> sximmc0 at simplebus0 > >> sdmmc0 at sximmc0: 4-bit, sd high-speed, mmc high-speed, dma > >> ehci0 at simplebus0 > >> > > > Thanks for the reply Artturi! > > > You are right, I did not notice the tick/stattick values. > > Regarding sxie.c, I've gone ahead and yanked out the second TX FIFO, used > ifq_restart in the ISR (as per example in ifq.h) and increased send queue max > length from 1 to IFQ_MAXLEN. Now I'm getting a much more healthy 1MB/s TX > and ~8MB/s RX, even when doing both. > > If anybody more knowlegable thinks it's worth it and would like to give some > feedback on the diff, I would be more than happy to clean it up and submit to > tech@. I agree though that giving up on the second TX FIFO might be just > side-stepping the problem. > > > Regards, > Eduard >
I gave your diff a spin, and there was no more garbage being sent, but i think i ran into another bug, that i wasn't aware of. As if there was something wrong with receiving&&||ARP too. Could you run a test like this?: 1. reboot board with sxie 2. run some load on it (preferably causing traffic, distccd in my case) 3. let it idle enough, so that "$ arp -an" does show expired entrys on it 4. remove the arp entry for host w/sxie from one of those hosts with expired entries on host/sxie 5. try to ping it from the host you did 4. on for me it doesn't, but otherway around things work, and so does static entries i had already forgotten about.. i used to run w/nothing but static setups some years ago, now i prefer dhcpd. diff (that doesn't really fix anything yet) below for the missing sxie_miibus_statchg(), and in case you follow current, there's diff you'll want on tech@ for emac. -Artturi diff --git a/sys/arch/armv7/sunxi/sxie.c b/sys/arch/armv7/sunxi/sxie.c index db6d862aa34..9e92d50685a 100644 --- a/sys/arch/armv7/sunxi/sxie.c +++ b/sys/arch/armv7/sunxi/sxie.c @@ -717,19 +717,32 @@ sxie_miibus_writereg(struct device *dev, int phy, int reg, int val) void sxie_miibus_statchg(struct device *dev) { - /* XXX */ -#if 0 struct sxie_softc *sc = (struct sxie_softc *)dev; + uint64_t mma = sc->sc_mii.mii_media_active; + uint64_t _valid = IFM_ACTIVE | IFM_AVALID; + + if ((mma & _valid) != _valid) + return; /* no link */ - switch (IFM_SUBTYPE(sc->sc_mii.mii_media_active)) { + switch (IFM_SUBTYPE(mma)) { case IFM_10_T: + SXICLR4(sc, SXIE_MACSUPP, 1 << 8); + break; case IFM_100_TX: - /*case IFM_1000_T: only on GMAC */ + SXISET4(sc, SXIE_MACSUPP, 1 << 8); break; default: break; } -#endif + + if (mma & IFM_FLOW) { + SXICMS4(sc, SXIE_MACCR0, SXIE_MACTXFC | SXIE_MACRXFC, + (mma & IFM_ETH_TXPAUSE ? SXIE_MACTXFC : 0) | + (mma & IFM_ETH_RXPAUSE ? SXIE_MACRXFC : 0)); + } else + SXICLR4(sc, SXIE_MACCR0, SXIE_MACTXFC | SXIE_MACRXFC); + + SXICMS4(sc, SXIE_MACCR1, 1, mma & IFM_FDX ? 1 : 0); } int > > Index: sys/arch/armv7/sunxi/sxie.c > =================================================================== > RCS file: /cvs/src/sys/arch/armv7/sunxi/sxie.c,v > retrieving revision 1.25 > diff -u -p -r1.25 sxie.c > --- sys/arch/armv7/sunxi/sxie.c 22 Jan 2017 10:17:37 -0000 1.25 > +++ sys/arch/armv7/sunxi/sxie.c 19 Nov 2017 00:06:19 -0000 > @@ -97,7 +97,7 @@ > #define SXIE_MACA2 0x00a0 > > /* i once spent hours on pretty defines, cvs up ate 'em. these shall do */ > -#define SXIE_INTR_ENABLE 0x010f > +#define SXIE_INTR_ENABLE 0x010f > #define SXIE_INTR_DISABLE 0x0000 > #define SXIE_INTR_CLEAR 0x0000 > > @@ -106,7 +106,7 @@ > > #define SXIE_RX_ENABLE 0x0004 > #define SXIE_TX_ENABLE 0x0003 > -#define SXIE_RXTX_ENABLE 0x0007 > +#define SXIE_RXTX_ENABLE 0x0007 > > #define SXIE_RXDRQM 0x0002 > #define SXIE_RXTM 0x0004 > @@ -250,7 +250,7 @@ sxie_attach(struct device *parent, struc > ifp->if_watchdog = sxie_watchdog; > ifp->if_capabilities = IFCAP_VLAN_MTU; /* XXX status check in recv? */ > > - IFQ_SET_MAXLEN(&ifp->if_snd, 1); > + IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); > > /* Initialize MII/media info. */ > mii = &sc->sc_mii; > @@ -440,16 +440,10 @@ sxie_intr(void *arg) > > if (pending & (SXIE_TX_FIFO0 | SXIE_TX_FIFO1)) { > ifq_clr_oactive(&ifp->if_snd); > - sc->txf_inuse &= ~pending; > - if (sc->txf_inuse == 0) > - ifp->if_timer = 0; > - else > - ifp->if_timer = 5; > + ifq_restart(&ifp->if_snd); > + ifp->if_timer = 0; > } > > - if (ifp->if_flags & IFF_RUNNING && !IFQ_IS_EMPTY(&ifp->if_snd)) > - sxie_start(ifp); > - > SXISET4(sc, SXIE_INTCR, SXIE_INTR_ENABLE); > > return 1; > @@ -468,42 +462,36 @@ sxie_start(struct ifnet *ifp) > uint32_t fifo; > uint32_t txbuf[SXIE_MAX_PKT_SIZE / sizeof(uint32_t)]; /* XXX !!! */ > > - if (sc->txf_inuse == (SXIE_TX_FIFO0 | SXIE_TX_FIFO1)) > - ifq_set_oactive(&ifp->if_snd); > + if (ifq_is_oactive(&ifp->if_snd)) > + { > + printf("sxie: start called while in use\n"); > + return; > + } > > - if (!(ifp->if_flags & IFF_RUNNING) || ifq_is_oactive(&ifp->if_snd)) > + if (!ISSET(ifp->if_flags, IFF_RUNNING)) > + { > + printf("sxie: start called when not running\n"); > return; > + } > > td = (uint8_t *)&txbuf[0]; > m = NULL; > head = NULL; > -trynext: > - m = ifq_deq_begin(&ifp->if_snd); > + > + m = ifq_dequeue(&ifp->if_snd); > if (m == NULL) > return; > > if (m->m_pkthdr.len > SXIE_MAX_PKT_SIZE) { > - ifq_deq_commit(&ifp->if_snd, m); > printf("sxie_start: packet too big\n"); > - m_freem(m); > - return; > + ifp->if_snd.ifq_errors++; > + goto end; > } > > - if (sc->txf_inuse == (SXIE_TX_FIFO0 | SXIE_TX_FIFO1)) { > - ifq_deq_rollback(&ifp->if_snd, m); > - printf("sxie_start: tx fifos in use.\n"); > - ifq_set_oactive(&ifp->if_snd); > - return; > - } > > - /* select fifo */ > - if (sc->txf_inuse & SXIE_TX_FIFO0) { > - sc->txf_inuse |= SXIE_TX_FIFO1; > - fifo = 1; > - } else { > - sc->txf_inuse |= SXIE_TX_FIFO0; > - fifo = 0; > - } > + ifq_set_oactive(&ifp->if_snd); > + > + fifo = 0; > SXIWRITE4(sc, SXIE_TXINS, fifo); > > /* set packet length */ > @@ -518,15 +506,14 @@ trynext: > /* transmit to PHY from fifo */ > SXISET4(sc, SXIE_TXCR0 + (fifo * 4), 1); > ifp->if_timer = 5; > - ifq_deq_commit(&ifp->if_snd, m); > > #if NBPFILTER > 0 > if (ifp->if_bpf) > bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_OUT); > #endif > +end: > m_freem(m); > - > - goto trynext; > + return; > } > > void