>-------- 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: [email protected]
>To: Eduard Nicodei <[email protected]>
>[email protected]
>
>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
>>[email protected]:/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
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