setup:
        iperf3 -s       #on lantiq
        ./run.sh testX  #on host

        everything_interrupts.log       #cat /proc/interrupts (you may change 
the SMP
affinity)
        running on experimental 1000Hz build, not much change in speed


As illustrated in vanilla.log, the default xrx200 ethernet driver seems
to be really slow in lantiq->host traffic (xDSL download). That seems to
be (at least) partially caused by making unnecessary linear skbs in the
network stack. These patches (and the ICU SMP ones) can increase the
lantiq->host UDP speed to an almost twice as big value and effectively
increase the speed of TCP in the both ways too.

The changes from "[RFC] [PATCH v2] lantiq: net: ethernet driver with
fragments" are:

I've had to increase the DMA descriptor count as there is now more than
one descriptors for one packet. With the original 64 there would be
frequent queue stops, which decreased the speed. With 128 now they are
not so much frequent (with 192 even less, almost nonexistant).

The main problem is in the TX housekeeping task, where the budgeted
cycle of descriptor and skb freeing cannot keep up with xmit function.
With a simple computation (I hope it is correct :-D ):

1Gbps / (1500*8 bits) = ~83k, the number of packets which needs to be
freed (it will be more descriptors)

one run cannot free more than budgeted packets (32), so the housekeeping
task would had to be called:

83k / 32 => one every 400 microseconds

That's probably nearly impossible. With 1000Hz system the tx
housekeeping seemed to be called once about every 3 miliseconds.

If the housekeeping gets called after longer time the ring buffer will
get actually stuck (it is transmitted, but not yet cleaned) and the
queue is stopped until next tx housekeeping is called.

I've hacked the housekeeping to ignore budget, so whole possible (=
completed and not owned by DMA) ring buffer is freed.

I've added dma_unmap_single for tx housekeeping and frags mapping fail
path. Interestingly the nonpresence in the original driver was OK for
the kernel.


Additionally I've changed TX DMA interrupts from an end-of-descriptor to
end-of-packet events.

The DMA patch tries to change some DMA settings, namely DMA_POLL. I
don't have a lantiq technical datasheet (it would be appreciated though
:-D), but I assume it is how often does the controller check RAM for
DMA_OWN flag. On 0x10 (instead of 0x4) it seems to slighty increase the
speed (it is probably using less RAM bus bandwidth). BTW it seems CPOLL
register is not dependent on channel settings, so it doesn't have to be
on for loop (as in patch). The burst size is set to 8 words (which match
32B alignment in the ethernet driver).

P.S. the xrx200 network speed on localhost is only up to 500Mbit/s.

Petr
--- a/drivers/net/ethernet/lantiq_xrx200.c	2019-01-30 02:20:35.780993746 +0100
+++ b/drivers/net/ethernet/lantiq_xrx200.c	2019-02-13 22:36:22.536640773 +0100
@@ -36,16 +36,13 @@
 #include "lantiq_pce.h"
 #include "lantiq_xrx200_sw.h"
 
+#include <linux/time.h>	//pc2005 time tests
+
 #define SW_POLLING
 #define SW_ROUTING
 
-#ifdef SW_ROUTING
-#define XRX200_MAX_DEV		2
-#else
-#define XRX200_MAX_DEV		1
-#endif
-
 #define XRX200_MAX_VLAN		64
+
 #define XRX200_PCE_ACTVLAN_IDX	0x01
 #define XRX200_PCE_VLANMAP_IDX	0x02
 
@@ -54,7 +51,7 @@
 
 #define XRX200_HEADROOM		4
 
-#define XRX200_TX_TIMEOUT	(10 * HZ)
+#define XRX200_TX_TIMEOUT	(30 * HZ)
 
 /* port type */
 #define XRX200_PORT_TYPE_PHY	1
@@ -62,6 +59,8 @@
 
 /* DMA */
 #define XRX200_DMA_DATA_LEN	0x600
+#define XRX200_DMA_TX_ALIGN	(32 - 1)
+
 #define XRX200_DMA_IRQ		INT_NUM_IM2_IRL0
 #define XRX200_DMA_RX		0
 #define XRX200_DMA_TX		1
@@ -69,6 +68,7 @@
 #define XRX200_DMA_IS_TX(x)	(x%2)
 #define XRX200_DMA_IS_RX(x)	(!XRX200_DMA_IS_TX(x))
 
+
 /* fetch / store dma */
 #define FDMA_PCTRL0		0x2A00
 #define FDMA_PCTRLx(x)		(FDMA_PCTRL0 + (x * 0x18))
@@ -203,50 +203,52 @@
 };
 
 struct xrx200_chan {
-	int idx;
-	int refcount;
-	int tx_free;
+	/* ring buffer tail pointer */
+	unsigned tx_free ____cacheline_aligned_in_smp;
 
-	struct net_device dummy_dev;
-	struct net_device *devs[XRX200_MAX_DEV];
 
-	struct tasklet_struct tasklet;
-	struct napi_struct napi;
-	struct ltq_dma_channel dma;
+	/* skb in use reference */
 	struct sk_buff *skb[LTQ_DESC_NUM];
 
-	spinlock_t lock;
-};
+	/* saved dma address for unmap */
+	dma_addr_t desc_addr[LTQ_DESC_NUM];
 
-struct xrx200_hw {
-	struct clk *clk;
-	struct mii_bus *mii_bus;
+	/* saved length for unmap */
+	size_t desc_size[LTQ_DESC_NUM];
 
-	struct xrx200_chan chan[XRX200_MAX_DMA];
-	u16 vlan_vid[XRX200_MAX_VLAN];
-	u16 vlan_port_map[XRX200_MAX_VLAN];
-
-	struct net_device *devs[XRX200_MAX_DEV];
-	int num_devs;
-
-	int port_map[XRX200_MAX_PORT];
-	unsigned short wan_map;
+	struct napi_struct napi;
+	struct ltq_dma_channel dma;
+	struct xrx200_priv *priv;
+	spinlock_t lock;
 
-	struct switch_dev swdev;
 };
 
 struct xrx200_priv {
 	struct net_device_stats stats;
-	int id;
+	struct xrx200_chan chan_tx;
+	struct xrx200_chan chan_rx;
+
+	struct clk *clk;
+
+	struct net_device *net_dev;
+	struct device *dev;
 
 	struct xrx200_port port[XRX200_MAX_PORT];
 	int num_port;
 	bool wan;
 	bool sw;
-	unsigned short port_map;
+	unsigned short d_port_map;
 	unsigned char mac[6];
 
-	struct xrx200_hw *hw;
+	struct mii_bus *mii_bus;
+
+	u16 vlan_vid[XRX200_MAX_VLAN];
+	u16 vlan_port_map[XRX200_MAX_VLAN];
+
+	int port_map[XRX200_MAX_PORT];
+	unsigned short wan_map;
+
+	struct switch_dev swdev;
 };
 
 static __iomem void *xrx200_switch_membase;
@@ -470,14 +472,14 @@
 }
 
 // swconfig interface
-static void xrx200_hw_init(struct xrx200_hw *hw);
+static void xrx200_hw_init(struct xrx200_priv *priv);
 
 // global
 static int xrx200sw_reset_switch(struct switch_dev *dev)
 {
-	struct xrx200_hw *hw = container_of(dev, struct xrx200_hw, swdev);
+	struct xrx200_priv *priv = container_of(dev, struct xrx200_priv, swdev);
 
-	xrx200_hw_init(hw);
+	xrx200_hw_init(priv);
 
 	return 0;
 }
@@ -523,7 +525,7 @@
 static int xrx200sw_set_vlan_vid(struct switch_dev *dev, const struct switch_attr *attr,
 				 struct switch_val *val)
 {
-	struct xrx200_hw *hw = container_of(dev, struct xrx200_hw, swdev);
+	struct xrx200_priv *priv = container_of(dev, struct xrx200_priv, swdev);
 	int i;
 	struct xrx200_pce_table_entry tev;
 	struct xrx200_pce_table_entry tem;
@@ -538,7 +540,7 @@
 			return -EINVAL;
 	}
 
-	hw->vlan_vid[val->port_vlan] = val->value.i;
+	priv->vlan_vid[val->port_vlan] = val->value.i;
 
 	tev.index = val->port_vlan;
 	xrx200_pce_table_entry_read(&tev);
@@ -571,7 +573,7 @@
 
 static int xrx200sw_set_vlan_ports(struct switch_dev *dev, struct switch_val *val)
 {
-	struct xrx200_hw *hw = container_of(dev, struct xrx200_hw, swdev);
+	struct xrx200_priv *priv = container_of(dev, struct xrx200_priv, swdev);
 	int i, portmap, tagmap, untagged;
 	struct xrx200_pce_table_entry tem;
 
@@ -624,7 +626,7 @@
 
 	ltq_switch_w32_mask(0, portmap, PCE_PMAP2);
 	ltq_switch_w32_mask(0, portmap, PCE_PMAP3);
-	hw->vlan_port_map[val->port_vlan] = portmap;
+	priv->vlan_port_map[val->port_vlan] = portmap;
 
 	xrx200sw_fixup_pvids();
 
@@ -722,8 +724,14 @@
 
 	link->duplex = xrx200sw_read_x(XRX200_MAC_PSTAT_FDUP, port);
 
-	link->rx_flow = !!(xrx200sw_read_x(XRX200_MAC_CTRL_0_FCON, port) && 0x0010);
-	link->tx_flow = !!(xrx200sw_read_x(XRX200_MAC_CTRL_0_FCON, port) && 0x0020);
+
+// TODO "&&" is bug
+//	link->rx_flow = !!(xrx200sw_read_x(XRX200_MAC_CTRL_0_FCON, port) && 0x0010);
+//	link->tx_flow = !!(xrx200sw_read_x(XRX200_MAC_CTRL_0_FCON, port) && 0x0020);
+	link->rx_flow = !!(xrx200sw_read_x(XRX200_MAC_CTRL_0_FCON, port) & 0x0010);
+	link->tx_flow = !!(xrx200sw_read_x(XRX200_MAC_CTRL_0_FCON, port) & 0x0020);
+
+
 	link->aneg = !(xrx200sw_read_x(XRX200_MAC_CTRL_0_FCON, port));
 
 	link->speed = SWITCH_PORT_SPEED_10;
@@ -834,19 +842,16 @@
 //	.get_port_stats = xrx200sw_get_port_stats, //TODO
 };
 
-static int xrx200sw_init(struct xrx200_hw *hw)
+static int xrx200sw_init(struct xrx200_priv *priv)
 {
-	int netdev_num;
 
-	for (netdev_num = 0; netdev_num < hw->num_devs; netdev_num++)
-	{
 		struct switch_dev *swdev;
-		struct net_device *dev = hw->devs[netdev_num];
-		struct xrx200_priv *priv = netdev_priv(dev);
-		if (!priv->sw)
-			continue;
+		if (!priv->sw) {
+			pr_info("!!!! no switch\n");
+			return -ENODEV;
+		}
 
-		swdev = &hw->swdev;
+		swdev = &priv->swdev;
 
 		swdev->name = "Lantiq XRX200 Switch";
 		swdev->vlans = XRX200_MAX_VLAN;
@@ -854,10 +859,26 @@
 		swdev->cpu_port = 6;
 		swdev->ops = &xrx200sw_ops;
 
-		register_switch(swdev, dev);
+		register_switch(swdev, priv->net_dev);
 		return 0; // enough switches
+}
+
+/* drop all the packets from the DMA ring */
+static void xrx200_flush_dma(struct xrx200_chan *ch)
+{
+	int i;
+
+	for (i = 0; i < LTQ_DESC_NUM; i++) {
+		struct ltq_dma_desc *desc = &ch->dma.desc_base[ch->dma.desc];
+
+		if ((desc->ctl & (LTQ_DMA_OWN | LTQ_DMA_C)) != LTQ_DMA_C)
+			break;
+
+		desc->ctl = LTQ_DMA_OWN | LTQ_DMA_RX_OFFSET(NET_IP_ALIGN) |
+			    XRX200_DMA_DATA_LEN;
+		ch->dma.desc++;
+		ch->dma.desc %= LTQ_DESC_NUM;
 	}
-	return 0;
 }
 
 static int xrx200_open(struct net_device *dev)
@@ -865,21 +886,30 @@
 	struct xrx200_priv *priv = netdev_priv(dev);
 	int i;
 
-	for (i = 0; i < XRX200_MAX_DMA; i++) {
-		if (!priv->hw->chan[i].dma.irq)
-			continue;
-		spin_lock_bh(&priv->hw->chan[i].lock);
-		if (!priv->hw->chan[i].refcount) {
-			if (XRX200_DMA_IS_RX(i))
-				napi_enable(&priv->hw->chan[i].napi);
-			ltq_dma_open(&priv->hw->chan[i].dma);
-		}
-		priv->hw->chan[i].refcount++;
-		spin_unlock_bh(&priv->hw->chan[i].lock);
-	}
+// TODO DMA chan allocation seems to be more complex in openwrt version
+
+	napi_enable(&priv->chan_tx.napi);
+	ltq_dma_open(&priv->chan_tx.dma);
+	ltq_dma_enable_irq(&priv->chan_tx.dma);
+
+	napi_enable(&priv->chan_rx.napi);
+	ltq_dma_open(&priv->chan_rx.dma);
+
+	/* The boot loader does not always deactivate the receiving of frames
+	 * on the ports and then some packets queue up in the PPE buffers.
+	 * They already passed the PMAC so they do not have the tags
+	 * configured here. Read the these packets here and drop them.
+	 * The HW should have written them into memory after 10us
+	 */
+	usleep_range(20, 40);
+	xrx200_flush_dma(&priv->chan_rx);
+
+	ltq_dma_enable_irq(&priv->chan_rx.dma);
+
 	for (i = 0; i < priv->num_port; i++)
 		if (priv->port[i].phydev)
 			phy_start(priv->port[i].phydev);
+
 	netif_wake_queue(dev);
 
 	return 0;
@@ -896,19 +926,11 @@
 		if (priv->port[i].phydev)
 			phy_stop(priv->port[i].phydev);
 
-	for (i = 0; i < XRX200_MAX_DMA; i++) {
-		if (!priv->hw->chan[i].dma.irq)
-			continue;
+	napi_disable(&priv->chan_rx.napi);
+	ltq_dma_close(&priv->chan_rx.dma);
 
-		priv->hw->chan[i].refcount--;
-		if (!priv->hw->chan[i].refcount) {
-			if (XRX200_DMA_IS_RX(i))
-				napi_disable(&priv->hw->chan[i].napi);
-			spin_lock_bh(&priv->hw->chan[i].lock);
-			ltq_dma_close(&priv->hw->chan[XRX200_DMA_RX].dma);
-			spin_unlock_bh(&priv->hw->chan[i].lock);
-		}
-	}
+	napi_disable(&priv->chan_tx.napi);
+	ltq_dma_close(&priv->chan_tx.dma);
 
 	return 0;
 }
@@ -916,12 +938,15 @@
 static int xrx200_alloc_skb(struct xrx200_chan *ch)
 {
 #define DMA_PAD	(NET_IP_ALIGN + NET_SKB_PAD)
-	ch->skb[ch->dma.desc] = dev_alloc_skb(XRX200_DMA_DATA_LEN + DMA_PAD);
+	ch->skb[ch->dma.desc] = netdev_alloc_skb(ch->priv->net_dev, XRX200_DMA_DATA_LEN + DMA_PAD);
 	if (!ch->skb[ch->dma.desc])
 		goto skip;
 
 	skb_reserve(ch->skb[ch->dma.desc], NET_SKB_PAD);
-	ch->dma.desc_base[ch->dma.desc].addr = dma_map_single(NULL,
+
+	dma_unmap_single(ch->priv->dev, ch->dma.desc_base[ch->dma.desc].addr, XRX200_DMA_DATA_LEN, DMA_FROM_DEVICE);
+
+	ch->dma.desc_base[ch->dma.desc].addr = dma_map_single(ch->priv->dev,
 		ch->skb[ch->dma.desc]->data, XRX200_DMA_DATA_LEN,
 			DMA_FROM_DEVICE);
 	ch->dma.desc_base[ch->dma.desc].addr =
@@ -938,8 +963,8 @@
 
 static void xrx200_hw_receive(struct xrx200_chan *ch, int id)
 {
-	struct net_device *dev = ch->devs[id];
-	struct xrx200_priv *priv = netdev_priv(dev);
+	struct xrx200_priv *priv = ch->priv;
+	struct net_device *dev = priv->net_dev;
 	struct ltq_dma_desc *desc = &ch->dma.desc_base[ch->dma.desc];
 	struct sk_buff *skb = ch->skb[ch->dma.desc];
 	int len = (desc->ctl & LTQ_DMA_SIZE_MASK);
@@ -960,128 +985,180 @@
 #ifdef SW_ROUTING
 	skb_pull(skb, 8);
 #endif
+
 	skb->dev = dev;
 	skb->protocol = eth_type_trans(skb, dev);
 	netif_receive_skb(skb);
-	priv->stats.rx_packets++;
-	priv->stats.rx_bytes+=len;
+	dev->stats.rx_packets++;
+	dev->stats.rx_bytes+=len;
 }
 
 static int xrx200_poll_rx(struct napi_struct *napi, int budget)
 {
 	struct xrx200_chan *ch = container_of(napi,
 				struct xrx200_chan, napi);
-	struct xrx200_priv *priv = netdev_priv(ch->devs[0]);
+	struct xrx200_priv *priv = ch->priv;
 	int rx = 0;
-	int complete = 0;
 
-	while ((rx < budget) && !complete) {
+	while (rx < budget) {
 		struct ltq_dma_desc *desc = &ch->dma.desc_base[ch->dma.desc];
 		if ((desc->ctl & (LTQ_DMA_OWN | LTQ_DMA_C)) == LTQ_DMA_C) {
 #ifdef SW_ROUTING
 			struct sk_buff *skb = ch->skb[ch->dma.desc];
 			u8 *special_tag = (u8*)skb->data;
 			int port = (special_tag[7] >> SPPID_SHIFT) & SPPID_MASK;
-			xrx200_hw_receive(ch, priv->hw->port_map[port]);
+			xrx200_hw_receive(ch, priv->port_map[port]);
 #else
 			xrx200_hw_receive(ch, 0);
 #endif
 			rx++;
 		} else {
-			complete = 1;
+			break;
 		}
 	}
 
-	if (complete || !rx) {
-		napi_complete(&ch->napi);
-		ltq_dma_enable_irq(&ch->dma);
+	if (rx < budget) {
+		if (napi_complete_done(&ch->napi, rx)) {
+//can an unacked irq event wait here now?
+			ltq_dma_enable_irq(&ch->dma);
+		}
 	}
 
 	return rx;
 }
 
-static void xrx200_tx_housekeeping(unsigned long ptr)
+
+static struct net_device_stats *xrx200_get_stats (struct net_device *dev)
 {
-	struct xrx200_chan *ch = (struct xrx200_chan *) ptr;
+	struct xrx200_priv *priv = netdev_priv(dev);
+
+	return &priv->stats;
+}
+
+#define TX_BUFFS_AVAIL(tail, head)		\
+	((tail <= head) ?			\
+	  tail + (LTQ_DESC_NUM - 1) - head :	\
+	  tail - head - 1)
+
+static int xrx200_tx_housekeeping(struct napi_struct *napi, int budget)
+{
+	struct xrx200_chan *ch = container_of(napi,
+				struct xrx200_chan, napi);
+	struct net_device *net_dev = ch->priv->net_dev;
 	int pkts = 0;
-	int i;
+	unsigned long bytes = 0;
+	unsigned long flags;
 
-	spin_lock_bh(&ch->lock);
-	ltq_dma_ack_irq(&ch->dma);
-	while ((ch->dma.desc_base[ch->tx_free].ctl & (LTQ_DMA_OWN | LTQ_DMA_C)) == LTQ_DMA_C) {
-		struct sk_buff *skb = ch->skb[ch->tx_free];
+	spin_lock_irqsave(&ch->lock, flags);
 
-		pkts++;
-		ch->skb[ch->tx_free] = NULL;
-		dev_kfree_skb(skb);
-		memset(&ch->dma.desc_base[ch->tx_free], 0,
-			sizeof(struct ltq_dma_desc));
-		ch->tx_free++;
-		ch->tx_free %= LTQ_DESC_NUM;
+	while (1) {
+		struct ltq_dma_desc *desc = &ch->dma.desc_base[ch->tx_free];
+
+		if ((desc->ctl & (LTQ_DMA_OWN | LTQ_DMA_C)) == LTQ_DMA_C) {
+			struct sk_buff *skb = ch->skb[ch->tx_free];
+
+			bytes += ch->desc_size[ch->tx_free];
+			ch->skb[ch->tx_free] = NULL;
+
+			dma_unmap_single(ch->priv->dev, ch->desc_addr[ch->tx_free],
+				 ch->desc_size[ch->tx_free], DMA_TO_DEVICE);
+
+			/* Consume skb only at last fragment */
+			if (desc->ctl & LTQ_DMA_EOP) {
+				dev_consume_skb_irq(skb);
+				pkts++;
+			}
+
+			memset(desc, 0, sizeof(struct ltq_dma_desc));
+			ch->tx_free = (ch->tx_free + 1) % LTQ_DESC_NUM;
+		} else {
+			break;
+		}
 	}
-	ltq_dma_enable_irq(&ch->dma);
-	spin_unlock_bh(&ch->lock);
 
-	if (!pkts)
-		return;
+	spin_unlock_irqrestore(&ch->lock, flags);
 
-	for (i = 0; i < XRX200_MAX_DEV && ch->devs[i]; i++)
-		netif_wake_queue(ch->devs[i]);
-}
+	net_dev->stats.tx_packets += pkts;
+	net_dev->stats.tx_bytes += bytes;
 
-static struct net_device_stats *xrx200_get_stats (struct net_device *dev)
-{
-	struct xrx200_priv *priv = netdev_priv(dev);
+	// HACK, free all descriptors, even over budget (else there will be queue stalls, slow CPU)
+	pkts = pkts ? (budget - 1) : 0;
 
-	return &priv->stats;
+	if (pkts < budget) {
+		if (napi_complete_done(&ch->napi, pkts)) {
+			ltq_dma_enable_irq(&ch->dma);
+		}
+	}
+
+	if (netif_queue_stopped(net_dev)) {
+		if (unlikely(TX_BUFFS_AVAIL(ch->tx_free, ch->dma.desc) > (MAX_SKB_FRAGS + 1))) {
+			netif_wake_queue(net_dev);
+		}
+	}
+
+	return pkts;
 }
 
 static void xrx200_tx_timeout(struct net_device *dev)
 {
 	struct xrx200_priv *priv = netdev_priv(dev);
 
-	printk(KERN_ERR "%s: transmit timed out, disable the dma channel irq\n", dev->name);
+	pr_err("%s: transmit timed out!\n", dev->name);
 
 	priv->stats.tx_errors++;
-	netif_wake_queue(dev);
+
+	ltq_dma_enable_irq(&priv->chan_tx.dma);  //TODO necessary?
+
+	if (netif_queue_stopped(dev)) {
+		netif_wake_queue(dev);
+	} else {
+		pr_warn("%s: high transmit load\n", dev->name);
+	}
 }
 
-static int xrx200_start_xmit(struct sk_buff *skb, struct net_device *dev)
+static void xrx200_unwind_mapped_tx_skb(struct xrx200_chan *ch, int tail, int head) {
+
+	for (; tail != head; tail = (tail + 1) % LTQ_DESC_NUM) {
+		dma_unmap_single(ch->priv->dev, ch->desc_addr[tail],
+				 ch->desc_size[tail], DMA_TO_DEVICE);
+	}
+}
+
+static netdev_tx_t xrx200_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	struct xrx200_priv *priv = netdev_priv(dev);
-	struct xrx200_chan *ch;
+	struct xrx200_chan *ch = &priv->chan_tx;
+
 	struct ltq_dma_desc *desc;
-	u32 byte_offset;
 	int ret = NETDEV_TX_OK;
 	int len;
+	int i;
+	unsigned long flags;
+	dma_addr_t mapping;
 #ifdef SW_ROUTING
 	u32 special_tag = (SPID_CPU_PORT << SPID_SHIFT) | DPID_ENABLE;
 #endif
-	if(priv->id)
-		ch = &priv->hw->chan[XRX200_DMA_TX_2];
-	else
-		ch = &priv->hw->chan[XRX200_DMA_TX];
-
-	desc = &ch->dma.desc_base[ch->dma.desc];
 
-	skb->dev = dev;
-	len = skb->len < ETH_ZLEN ? ETH_ZLEN : skb->len;
+	if (skb_put_padto(skb, ETH_ZLEN)) {
+		dev->stats.tx_dropped++;
+		return NETDEV_TX_OK;
+	}
 
 #ifdef SW_ROUTING
 	if (is_multicast_ether_addr(eth_hdr(skb)->h_dest)) {
-		u16 port_map = priv->port_map;
+		u16 port_map = priv->d_port_map;
 
 		if (priv->sw && skb->protocol == htons(ETH_P_8021Q)) {
 			u16 vid;
 			int i;
 
-			port_map = 0;
+ 			port_map = 0;
 			if (!__vlan_get_tag(skb, &vid)) {
 				for (i = 0; i < XRX200_MAX_VLAN; i++) {
-					if (priv->hw->vlan_vid[i] != vid)
-						continue;
-					port_map = priv->hw->vlan_port_map[i];
-					break;
+					if (priv->vlan_vid[i] == vid) {
+						port_map = priv->vlan_port_map[i];
+						break;
+					}
 				}
 			}
 		}
@@ -1089,108 +1166,195 @@
 		special_tag |= (port_map << PORT_MAP_SHIFT) |
 			       PORT_MAP_SEL | PORT_MAP_EN;
 	}
+
 	if(priv->wan)
 		special_tag |= (1 << DPID_SHIFT);
+
 	if(skb_headroom(skb) < 4) {
 		struct sk_buff *tmp = skb_realloc_headroom(skb, 4);
 		dev_kfree_skb_any(skb);
 		skb = tmp;
 	}
+
 	skb_push(skb, 4);
 	memcpy(skb->data, &special_tag, sizeof(u32));
-	len += 4;
 #endif
 
-	/* dma needs to start on a 16 byte aligned address */
-	byte_offset = CPHYSADDR(skb->data) % 16;
-
-	spin_lock_bh(&ch->lock);
+//	if (TX_BUFFS_AVAIL(ch->tx_free, ch->dma.desc) <= (skb_shinfo(skb)->nr_frags + 1)) {
+	if (TX_BUFFS_AVAIL(ch->tx_free, ch->dma.desc) <= (MAX_SKB_FRAGS + 1)) {
+		netif_stop_queue(dev);
+		netdev_err(dev, "not enough TX ring space\n");
+		return NETDEV_TX_BUSY;
+	}
+#if 0
+	desc = &ch->dma.desc_base[ch->dma.desc];
 	if ((desc->ctl & (LTQ_DMA_OWN | LTQ_DMA_C)) || ch->skb[ch->dma.desc]) {
-		netdev_err(dev, "tx ring full\n");
 		netif_stop_queue(dev);
-		ret = NETDEV_TX_BUSY;
-		goto out;
+		netdev_err(dev, "tx ring full before send\n");
+		return NETDEV_TX_BUSY;
 	}
+#endif
+	spin_lock_irqsave(&ch->lock, flags);
 
+	/* Send first fragment */
 	ch->skb[ch->dma.desc] = skb;
+	desc = &ch->dma.desc_base[ch->dma.desc];
+
+	if (skb_shinfo(skb)->nr_frags == 0) {
+		len = skb->len;
+	} else {
+		len = skb_headlen(skb);
+	}
+
+	mapping = dma_map_single(priv->dev, skb->data, len, DMA_TO_DEVICE);
+	if (unlikely(dma_mapping_error(priv->dev, mapping))) {
+		dev_kfree_skb(skb);
+		netdev_err(dev, "DMA mapping failed\n");
+		dev->stats.tx_dropped++;
+		dev->stats.tx_errors++;
+		ret = NETDEV_TX_OK;
+		goto out;
+	}
+
+	ch->desc_addr[ch->dma.desc] = mapping;
+	ch->desc_size[ch->dma.desc] = len;
+
+	desc->addr = (mapping & 0x1fffffe0) | (1<<31);
+
+	/* Don't set LTQ_DMA_OWN before filling all fragments descriptors */
+	desc->ctl = LTQ_DMA_SOP | LTQ_DMA_TX_OFFSET(mapping & XRX200_DMA_TX_ALIGN)
+			| (len & LTQ_DMA_SIZE_MASK);
+
+	if (!skb_shinfo(skb)->nr_frags)
+		desc->ctl |= LTQ_DMA_EOP;
+
+	/* Send rest of fragments */
+	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
+
+		//TODO saving info for fragments
+		ch->skb[(ch->dma.desc + i + 1) % LTQ_DESC_NUM ] = skb;
+		desc = &ch->dma.desc_base[(ch->dma.desc + i + 1) % LTQ_DESC_NUM];
+
+		len = skb_frag_size(&skb_shinfo(skb)->frags[i]);
+
+		mapping = dma_map_single(priv->dev, skb_frag_address(& skb_shinfo(skb)->frags[i]), len, DMA_TO_DEVICE);
+		if (unlikely(dma_mapping_error(priv->dev, mapping))) {
 
-	netif_trans_update(dev);
+			xrx200_unwind_mapped_tx_skb(ch, ch->dma.desc, ch->dma.desc + i + 1);
+
+			netdev_err(dev, "DMA mapping for fragment failed\n");
+			dev_kfree_skb(skb);
+			dev->stats.tx_dropped++;
+			dev->stats.tx_errors++;
+			ret = NETDEV_TX_OK;
+			goto out;
+		}
+
+		ch->desc_addr[ch->dma.desc + i + 1] = mapping;
+		ch->desc_size[ch->dma.desc + i + 1] = len;
+
+		desc->addr = (mapping & 0x1fffffe0) | (1<<31);
+
+		desc->ctl = LTQ_DMA_OWN |
+			LTQ_DMA_TX_OFFSET(mapping & XRX200_DMA_TX_ALIGN) | (len & LTQ_DMA_SIZE_MASK);
+
+		if (i == (skb_shinfo(skb)->nr_frags - 1))
+			desc->ctl |= LTQ_DMA_EOP;
+	}
+
+	desc = &ch->dma.desc_base[ch->dma.desc];
+
+	/* Increment TX ring index */
+	ch->dma.desc = (ch->dma.desc + skb_shinfo(skb)->nr_frags + 1) % LTQ_DESC_NUM;
 
-	desc->addr = ((unsigned int) dma_map_single(NULL, skb->data, len,
-						DMA_TO_DEVICE)) - byte_offset;
 	wmb();
-	desc->ctl = LTQ_DMA_OWN | LTQ_DMA_SOP | LTQ_DMA_EOP |
-		LTQ_DMA_TX_OFFSET(byte_offset) | (len & LTQ_DMA_SIZE_MASK);
-	ch->dma.desc++;
-	ch->dma.desc %= LTQ_DESC_NUM;
-	if (ch->dma.desc == ch->tx_free)
-		netif_stop_queue(dev);
 
+	/* Start TX DMA */
+	desc->ctl |= LTQ_DMA_OWN;
 
-	priv->stats.tx_packets++;
-	priv->stats.tx_bytes+=len;
+	if (unlikely(TX_BUFFS_AVAIL(ch->tx_free, ch->dma.desc) <= (MAX_SKB_FRAGS + 1))) {
+		netif_stop_queue(dev);
+	}
+
+	skb_tx_timestamp(skb);
 
 out:
-	spin_unlock_bh(&ch->lock);
+	spin_unlock_irqrestore(&ch->lock, flags);
 
 	return ret;
 }
 
-static irqreturn_t xrx200_dma_irq(int irq, void *priv)
+static irqreturn_t xrx200_dma_irq(int irq, void *ptr)
 {
-	struct xrx200_hw *hw = priv;
-	int chnr = irq - XRX200_DMA_IRQ;
-	struct xrx200_chan *ch = &hw->chan[chnr];
+	struct xrx200_chan *ch = ptr;
 
 	ltq_dma_disable_irq(&ch->dma);
 	ltq_dma_ack_irq(&ch->dma);
-
-	if (chnr % 2)
-		tasklet_schedule(&ch->tasklet);
-	else
-		napi_schedule(&ch->napi);
+	napi_schedule(&ch->napi);
 
 	return IRQ_HANDLED;
 }
 
-static int xrx200_dma_init(struct xrx200_hw *hw)
+static int xrx200_dma_init(struct xrx200_priv *priv)
 {
-	int i, err = 0;
+	int i;
+	struct xrx200_chan *ch_rx = &priv->chan_rx;
+	struct xrx200_chan *ch_tx = &priv->chan_tx;
+	int ret;
 
 	ltq_dma_init_port(DMA_PORT_ETOP);
 
-	for (i = 0; i < 8 && !err; i++) {
-		int irq = XRX200_DMA_IRQ + i;
-		struct xrx200_chan *ch = &hw->chan[i];
-
-		spin_lock_init(&ch->lock);
-
-		ch->idx = ch->dma.nr = i;
-
-		if (i == XRX200_DMA_TX) {
-			ltq_dma_alloc_tx(&ch->dma);
-			err = request_irq(irq, xrx200_dma_irq, 0, "vrx200_tx", hw);
-		} else if (i == XRX200_DMA_TX_2) {
-			ltq_dma_alloc_tx(&ch->dma);
-			err = request_irq(irq, xrx200_dma_irq, 0, "vrx200_tx_2", hw);
-		} else if (i == XRX200_DMA_RX) {
-			ltq_dma_alloc_rx(&ch->dma);
-			for (ch->dma.desc = 0; ch->dma.desc < LTQ_DESC_NUM;
-					ch->dma.desc++)
-				if (xrx200_alloc_skb(ch))
-					err = -ENOMEM;
-			ch->dma.desc = 0;
-			err = request_irq(irq, xrx200_dma_irq, 0, "vrx200_rx", hw);
-		} else
-			continue;
+	ch_rx->dma.nr = XRX200_DMA_RX;
+	ch_rx->priv = priv;
 
-		if (!err)
-			ch->dma.irq = irq;
-		else
-			pr_err("net-xrx200: failed to request irq %d\n", irq);
+	ltq_dma_alloc_rx(&ch_rx->dma);
+	for (ch_rx->dma.desc = 0; ch_rx->dma.desc < LTQ_DESC_NUM;
+	     ch_rx->dma.desc++) {
+		ret = xrx200_alloc_skb(ch_rx);
+		if (ret)
+			goto rx_free;
 	}
+	ch_rx->dma.desc = 0;
 
-	return err;
+	spin_lock_init(&ch_rx->lock);
+	spin_lock_init(&ch_tx->lock);
+
+
+	ret = devm_request_irq(priv->dev, ch_rx->dma.irq, xrx200_dma_irq, 0,
+			       "vrx200_rx", &priv->chan_rx);
+	if (ret) {
+		dev_err(priv->dev, "failed to request RX irq %d\n",
+			ch_rx->dma.irq);
+		goto rx_ring_free;
+	}
+
+	ch_tx->dma.nr = XRX200_DMA_TX;
+	ch_tx->priv = priv;
+
+	ltq_dma_alloc_tx(&ch_tx->dma);
+	ret = devm_request_irq(priv->dev, ch_tx->dma.irq, xrx200_dma_irq, 0,
+			       "vrx200_tx", &priv->chan_tx);
+	if (ret) {
+		dev_err(priv->dev, "failed to request TX irq %d\n",
+			ch_tx->dma.irq);
+		goto tx_free;
+	}
+
+	return ret;
+
+tx_free:
+	ltq_dma_free(&ch_tx->dma);
+
+rx_ring_free:
+	/* free the allocated RX ring */
+	for (i = 0; i < LTQ_DESC_NUM; i++) {
+		if (priv->chan_rx.skb[i])
+			dev_kfree_skb_any(priv->chan_rx.skb[i]);
+	}
+
+rx_free:
+	ltq_dma_free(&ch_rx->dma);
+	return ret;
 }
 
 #ifdef SW_POLLING
@@ -1328,11 +1492,12 @@
 {
 	struct net_device *netdev = phydev->attached_dev;
 
-	if (do_carrier)
+	if (do_carrier) {
 		if (up)
 			netif_carrier_on(netdev);
 		else if (!xrx200_phy_has_link(netdev))
 			netif_carrier_off(netdev);
+	}
 
 	phydev->adjust_link(netdev);
 }
@@ -1343,7 +1508,7 @@
 	struct phy_device *phydev = NULL;
 	unsigned val;
 
-	phydev = mdiobus_get_phy(priv->hw->mii_bus, port->phy_addr);
+	phydev = mdiobus_get_phy(priv->mii_bus, port->phy_addr);
 
 	if (!phydev) {
 		netdev_err(dev, "no PHY found\n");
@@ -1376,10 +1541,10 @@
 #ifdef SW_POLLING
 	phy_read_status(phydev);
 
-	val = xrx200_mdio_rd(priv->hw->mii_bus, MDIO_DEVAD_NONE, MII_CTRL1000);
+	val = xrx200_mdio_rd(priv->mii_bus, MDIO_DEVAD_NONE, MII_CTRL1000);
 	val |= ADVERTIZE_MPD;
-	xrx200_mdio_wr(priv->hw->mii_bus, MDIO_DEVAD_NONE, MII_CTRL1000, val);
-	xrx200_mdio_wr(priv->hw->mii_bus, 0, 0, 0x1040);
+	xrx200_mdio_wr(priv->mii_bus, MDIO_DEVAD_NONE, MII_CTRL1000, val);
+	xrx200_mdio_wr(priv->mii_bus, 0, 0, 0x1040);
 
 	phy_start_aneg(phydev);
 #endif
@@ -1522,12 +1687,12 @@
 	ltq_switch_w32_mask(0, BIT(3), PCE_GCTRL_REG(0));
 }
 
-static void xrx200_hw_init(struct xrx200_hw *hw)
+static void xrx200_hw_init(struct xrx200_priv *priv)
 {
 	int i;
 
 	/* enable clock gate */
-	clk_enable(hw->clk);
+	clk_enable(priv->clk);
 
 	ltq_switch_w32(1, 0);
 	mdelay(100);
@@ -1595,49 +1760,45 @@
 	xrx200sw_write_x(1, XRX200_BM_QUEUE_GCTRL_GL_MOD, 0);
 
 	for (i = 0; i < XRX200_MAX_VLAN; i++)
-		hw->vlan_vid[i] = i;
+		priv->vlan_vid[i] = i;
 }
 
-static void xrx200_hw_cleanup(struct xrx200_hw *hw)
+static void xrx200_hw_cleanup(struct xrx200_priv *priv)
 {
 	int i;
 
 	/* disable the switch */
 	ltq_mdio_w32_mask(MDIO_GLOB_ENABLE, 0, MDIO_GLOB);
 
-	/* free the channels and IRQs */
-	for (i = 0; i < 2; i++) {
-		ltq_dma_free(&hw->chan[i].dma);
-		if (hw->chan[i].dma.irq)
-			free_irq(hw->chan[i].dma.irq, hw);
-	}
+	ltq_dma_free(&priv->chan_tx.dma);
+	ltq_dma_free(&priv->chan_rx.dma);
 
 	/* free the allocated RX ring */
 	for (i = 0; i < LTQ_DESC_NUM; i++)
-		dev_kfree_skb_any(hw->chan[XRX200_DMA_RX].skb[i]);
+		dev_kfree_skb_any(priv->chan_rx.skb[i]);
 
 	/* clear the mdio bus */
-	mdiobus_unregister(hw->mii_bus);
-	mdiobus_free(hw->mii_bus);
+	mdiobus_unregister(priv->mii_bus);
+	mdiobus_free(priv->mii_bus);
 
 	/* release the clock */
-	clk_disable(hw->clk);
-	clk_put(hw->clk);
+	clk_disable(priv->clk);
+	clk_put(priv->clk);
 }
 
-static int xrx200_of_mdio(struct xrx200_hw *hw, struct device_node *np)
+static int xrx200_of_mdio(struct xrx200_priv *priv, struct device_node *np)
 {
-	hw->mii_bus = mdiobus_alloc();
-	if (!hw->mii_bus)
+	priv->mii_bus = mdiobus_alloc();
+	if (!priv->mii_bus)
 		return -ENOMEM;
 
-	hw->mii_bus->read = xrx200_mdio_rd;
-	hw->mii_bus->write = xrx200_mdio_wr;
-	hw->mii_bus->name = "lantiq,xrx200-mdio";
-	snprintf(hw->mii_bus->id, MII_BUS_ID_SIZE, "%x", 0);
+	priv->mii_bus->read = xrx200_mdio_rd;
+	priv->mii_bus->write = xrx200_mdio_wr;
+	priv->mii_bus->name = "lantiq,xrx200-mdio";
+	snprintf(priv->mii_bus->id, MII_BUS_ID_SIZE, "%x", 0);
 
-	if (of_mdiobus_register(hw->mii_bus, np)) {
-		mdiobus_free(hw->mii_bus);
+	if (of_mdiobus_register(priv->mii_bus, np)) {
+		mdiobus_free(priv->mii_bus);
 		return -ENXIO;
 	}
 
@@ -1655,6 +1816,7 @@
 	memset(p, 0, sizeof(struct xrx200_port));
 	p->phy_node = of_parse_phandle(port, "phy-handle", 0);
 	addr = of_get_property(p->phy_node, "reg", NULL);
+
 	if (!addr)
 		return;
 
@@ -1665,6 +1827,7 @@
 		p->flags = XRX200_PORT_TYPE_MAC;
 	else
 		p->flags = XRX200_PORT_TYPE_PHY;
+
 	priv->num_port++;
 
 	p->gpio = of_get_gpio_flags(port, 0, &p->gpio_flags);
@@ -1677,12 +1840,12 @@
 		}
 	/* is this port a wan port ? */
 	if (priv->wan)
-		priv->hw->wan_map |= BIT(p->num);
+		priv->wan_map |= BIT(p->num);
 
-	priv->port_map |= BIT(p->num);
+	priv->d_port_map |= BIT(p->num);
 
 	/* store the port id in the hw struct so we can map ports -> devices */
-	priv->hw->port_map[p->num] = priv->hw->num_devs;
+	priv->port_map[p->num] = 0;
 }
 
 static const struct net_device_ops xrx200_netdev_ops = {
@@ -1696,29 +1859,18 @@
 	.ndo_tx_timeout		= xrx200_tx_timeout,
 };
 
-static void xrx200_of_iface(struct xrx200_hw *hw, struct device_node *iface, struct device *dev)
+static void xrx200_of_iface(struct xrx200_priv *priv, struct device_node *iface, struct device *dev)
 {
-	struct xrx200_priv *priv;
 	struct device_node *port;
 	const __be32 *wan;
 	const u8 *mac;
 
-	/* alloc the network device */
-	hw->devs[hw->num_devs] = alloc_etherdev(sizeof(struct xrx200_priv));
-	if (!hw->devs[hw->num_devs])
-		return;
-
 	/* setup the network device */
-	strcpy(hw->devs[hw->num_devs]->name, "eth%d");
-	hw->devs[hw->num_devs]->netdev_ops = &xrx200_netdev_ops;
-	hw->devs[hw->num_devs]->watchdog_timeo = XRX200_TX_TIMEOUT;
-	hw->devs[hw->num_devs]->needed_headroom = XRX200_HEADROOM;
-	SET_NETDEV_DEV(hw->devs[hw->num_devs], dev);
-
-	/* setup our private data */
-	priv = netdev_priv(hw->devs[hw->num_devs]);
-	priv->hw = hw;
-	priv->id = hw->num_devs;
+	strcpy(priv->net_dev->name, "eth%d");
+	priv->net_dev->netdev_ops = &xrx200_netdev_ops;
+	priv->net_dev->watchdog_timeo = XRX200_TX_TIMEOUT;
+	priv->net_dev->needed_headroom = XRX200_HEADROOM;
+	SET_NETDEV_DEV(priv->net_dev, dev);
 
 	mac = of_get_mac_address(iface);
 	if (mac)
@@ -1738,20 +1890,34 @@
 		if (of_device_is_compatible(port, "lantiq,xrx200-pdi-port"))
 			xrx200_of_port(priv, port);
 
-	/* register the actual device */
-	if (!register_netdev(hw->devs[hw->num_devs]))
-		hw->num_devs++;
 }
 
-static struct xrx200_hw xrx200_hw;
-
 static int xrx200_probe(struct platform_device *pdev)
 {
+	struct device *dev = &pdev->dev;
 	struct resource *res[4];
 	struct device_node *mdio_np, *iface_np, *phy_np;
 	struct of_phandle_iterator it;
 	int err;
 	int i;
+	struct xrx200_priv *priv;
+	struct net_device *net_dev;
+
+
+	/* alloc the network device */
+// TODO add multiqueue? devm_alloc_etherdev_mqs
+	net_dev = devm_alloc_etherdev(dev, sizeof(struct xrx200_priv));
+	if (!net_dev)
+		return -ENOMEM;
+
+	priv = netdev_priv(net_dev);
+	priv->net_dev = net_dev;
+	priv->dev = dev;
+
+	net_dev->netdev_ops = &xrx200_netdev_ops;
+	SET_NETDEV_DEV(net_dev, dev);
+	net_dev->min_mtu = ETH_ZLEN;
+	net_dev->max_mtu = XRX200_DMA_DATA_LEN;
 
 	/* load the memory ranges */
 	for (i = 0; i < 4; i++) {
@@ -1775,91 +1941,100 @@
 		phy_np = it.node;
 		if (phy_np) {
 			struct platform_device *phy = of_find_device_by_node(phy_np);
-	
+
 			of_node_put(phy_np);
 			if (!platform_get_drvdata(phy))
 				return -EPROBE_DEFER;
 		}
 	}
 
+	priv->chan_rx.dma.irq = XRX200_DMA_IRQ + XRX200_DMA_RX;
+	priv->chan_tx.dma.irq = XRX200_DMA_IRQ + XRX200_DMA_TX;
+	priv->chan_rx.priv = priv;
+	priv->chan_tx.priv = priv;
+
 	/* get the clock */
-	xrx200_hw.clk = clk_get(&pdev->dev, NULL);
-	if (IS_ERR(xrx200_hw.clk)) {
+	priv->clk = clk_get(&pdev->dev, NULL);
+	if (IS_ERR(priv->clk)) {
 		dev_err(&pdev->dev, "failed to get clock\n");
-		return PTR_ERR(xrx200_hw.clk);
+		return PTR_ERR(priv->clk);
 	}
 
 	/* bring up the dma engine and IP core */
-	xrx200_dma_init(&xrx200_hw);
-	xrx200_hw_init(&xrx200_hw);
-	tasklet_init(&xrx200_hw.chan[XRX200_DMA_TX].tasklet, xrx200_tx_housekeeping, (u32) &xrx200_hw.chan[XRX200_DMA_TX]);
-	tasklet_init(&xrx200_hw.chan[XRX200_DMA_TX_2].tasklet, xrx200_tx_housekeeping, (u32) &xrx200_hw.chan[XRX200_DMA_TX_2]);
+	err = xrx200_dma_init(priv);
+	if (err)
+		return err;
+
+	/* enable clock gate */
+	err = clk_prepare_enable(priv->clk);
+	if (err)
+		goto err_uninit_dma;
+
+	xrx200_hw_init(priv);
 
 	/* bring up the mdio bus */
 	mdio_np = of_find_compatible_node(pdev->dev.of_node, NULL,
 				"lantiq,xrx200-mdio");
 	if (mdio_np)
-		if (xrx200_of_mdio(&xrx200_hw, mdio_np))
+		if (xrx200_of_mdio(priv, mdio_np))
 			dev_err(&pdev->dev, "mdio probe failed\n");
 
 	/* load the interfaces */
 	for_each_child_of_node(pdev->dev.of_node, iface_np)
-		if (of_device_is_compatible(iface_np, "lantiq,xrx200-pdi")) {
-			if (xrx200_hw.num_devs < XRX200_MAX_DEV)
-				xrx200_of_iface(&xrx200_hw, iface_np, &pdev->dev);
-			else
-				dev_err(&pdev->dev,
-					"only %d interfaces allowed\n",
-					XRX200_MAX_DEV);
-		}
-
-	if (!xrx200_hw.num_devs) {
-		xrx200_hw_cleanup(&xrx200_hw);
-		dev_err(&pdev->dev, "failed to load interfaces\n");
-		return -ENOENT;
-	}
+			if (of_device_is_compatible(iface_np, "lantiq,xrx200-pdi")) {
+				xrx200_of_iface(priv, iface_np, &pdev->dev);
+				break;	//hack
+			}
 
-	xrx200sw_init(&xrx200_hw);
+	xrx200sw_init(priv);
 
 	/* set wan port mask */
-	ltq_pmac_w32(xrx200_hw.wan_map, PMAC_EWAN);
-
-	for (i = 0; i < xrx200_hw.num_devs; i++) {
-		xrx200_hw.chan[XRX200_DMA_RX].devs[i] = xrx200_hw.devs[i];
-		xrx200_hw.chan[XRX200_DMA_TX].devs[i] = xrx200_hw.devs[i];
-		xrx200_hw.chan[XRX200_DMA_TX_2].devs[i] = xrx200_hw.devs[i];
-	}
+	ltq_pmac_w32(priv->wan_map, PMAC_EWAN);
 
 	/* setup NAPI */
-	init_dummy_netdev(&xrx200_hw.chan[XRX200_DMA_RX].dummy_dev);
-	netif_napi_add(&xrx200_hw.chan[XRX200_DMA_RX].dummy_dev,
-			&xrx200_hw.chan[XRX200_DMA_RX].napi, xrx200_poll_rx, 32);
+	netif_napi_add(net_dev, &priv->chan_rx.napi, xrx200_poll_rx, 32);	//32
+	netif_tx_napi_add(net_dev, &priv->chan_tx.napi, xrx200_tx_housekeeping, 32);
 
-	platform_set_drvdata(pdev, &xrx200_hw);
+	net_dev->features |= NETIF_F_SG ;
+	net_dev->hw_features |= NETIF_F_SG;
+	net_dev->vlan_features |= NETIF_F_SG;
+
+	platform_set_drvdata(pdev, priv);
+
+	err = register_netdev(net_dev);
+	if (err)
+		goto err_unprepare_clk;
 
 	return 0;
+
+err_unprepare_clk:
+	clk_disable_unprepare(priv->clk);
+
+err_uninit_dma:
+	xrx200_hw_cleanup(priv);
+
+	return err;
 }
 
 static int xrx200_remove(struct platform_device *pdev)
 {
-	struct net_device *dev = platform_get_drvdata(pdev);
-	struct xrx200_priv *priv;
 
-	if (!dev)
-		return 0;
-
-	priv = netdev_priv(dev);
+	struct xrx200_priv *priv = platform_get_drvdata(pdev);
+	struct net_device *net_dev = priv->net_dev;
 
 	/* free stack related instances */
-	netif_stop_queue(dev);
-	netif_napi_del(&xrx200_hw.chan[XRX200_DMA_RX].napi);
-
-	/* shut down hardware */
-	xrx200_hw_cleanup(&xrx200_hw);
+	netif_stop_queue(net_dev);
+	netif_napi_del(&priv->chan_tx.napi);
+	netif_napi_del(&priv->chan_rx.napi);
 
 	/* remove the actual device */
-	unregister_netdev(dev);
-	free_netdev(dev);
+	unregister_netdev(net_dev);
+
+	/* release the clock */
+	clk_disable_unprepare(priv->clk);
+
+	/* shut down hardware */
+	xrx200_hw_cleanup(priv);
 
 	return 0;
 }
--- a/arch/mips/lantiq/xway/dma.c	2019-01-26 09:37:07.000000000 +0100
+++ b/arch/mips/lantiq/xway/dma.c	2019-02-12 09:02:03.995200621 +0100
@@ -49,7 +49,10 @@
 #define DMA_IRQ_ACK		0x7e		/* IRQ status register */
 #define DMA_POLL		BIT(31)		/* turn on channel polling */
 #define DMA_CLK_DIV4		BIT(6)		/* polling clock divider */
-#define DMA_2W_BURST		BIT(1)		/* 2 word burst length */
+#define DMA_1W_BURST		0x0		/* 1 word burst length/no burst */
+#define DMA_2W_BURST		0x1		/* 2 word burst length */
+#define DMA_4W_BURST		0x2		/* 4 word burst length */
+#define DMA_8W_BURST		0x3		/* 8 word burst length */
 #define DMA_MAX_CHANNEL		20		/* the soc has 20 channels */
 #define DMA_ETOP_ENDIANNESS	(0xf << 8) /* endianness swap etop channels */
 #define DMA_WEIGHT	(BIT(17) | BIT(16))	/* default channel wheight */
@@ -138,7 +141,7 @@
 	spin_lock_irqsave(&ltq_dma_lock, flags);
 	ltq_dma_w32(ch->nr, LTQ_DMA_CS);
 	ltq_dma_w32(ch->phys, LTQ_DMA_CDBA);
-	ltq_dma_w32(LTQ_DESC_NUM, LTQ_DMA_CDLEN);
+	ltq_dma_w32(LTQ_DESC_NUM, LTQ_DMA_CDLEN);	//0xff mask
 	ltq_dma_w32_mask(DMA_CHAN_ON, 0, LTQ_DMA_CCTRL);
 	wmb();
 	ltq_dma_w32_mask(0, DMA_CHAN_RST, LTQ_DMA_CCTRL);
@@ -155,7 +158,13 @@
 	ltq_dma_alloc(ch);
 
 	spin_lock_irqsave(&ltq_dma_lock, flags);
-	ltq_dma_w32(DMA_DESCPT, LTQ_DMA_CIE);
+
+//DMA_DESCPT BIT(3) //end of descriptor
+//BIT(1)	//end of packet
+//	ltq_dma_w32(DMA_DESCPT, LTQ_DMA_CIE);
+	ltq_dma_w32(BIT(1), LTQ_DMA_CIE);
+	
+	
 	ltq_dma_w32_mask(0, 1 << ch->nr, LTQ_DMA_IRNEN);
 	ltq_dma_w32(DMA_WEIGHT | DMA_TX, LTQ_DMA_CCTRL);
 	spin_unlock_irqrestore(&ltq_dma_lock, flags);
@@ -194,6 +203,12 @@
 	ltq_dma_w32(p, LTQ_DMA_PS);
 	switch (p) {
 	case DMA_PORT_ETOP:
+
+		/* 8 words burst, data must be aligned on 4*N bytes or freeze */
+//TODO? different bursts for TX and RX (RX is fine at 1G eth)		
+		ltq_dma_w32_mask(0x3c, (DMA_8W_BURST << 4) | (DMA_8W_BURST << 2),
+			LTQ_DMA_PCTRL);
+
 		/*
 		 * Tell the DMA engine to swap the endianness of data frames and
 		 * drop packets if the channel arbitration fails.
@@ -241,10 +256,18 @@
 	for (i = 0; i < DMA_MAX_CHANNEL; i++) {
 		ltq_dma_w32(i, LTQ_DMA_CS);
 		ltq_dma_w32(DMA_CHAN_RST, LTQ_DMA_CCTRL);
-		ltq_dma_w32(DMA_POLL | DMA_CLK_DIV4, LTQ_DMA_CPOLL);
 		ltq_dma_w32_mask(DMA_CHAN_ON, 0, LTQ_DMA_CCTRL);
 	}
 
+//TODO 0x100 << 4 fastest TX without fragments
+// 0x100 for fragments timeouts, 0x10 only under really _heavy_ load
+//TODO not dependent on channel select (LTQ_DMA_CS), why it was in for cycle
+	ltq_dma_w32(DMA_POLL | (0x10 << 4), LTQ_DMA_CPOLL);
+
+//TODO packet arbitration ???, test different values
+//0x3ff << 16 multiple burst count, 1<<30 multiple burst arbitration, 1<<31 packet arbitration, 1<<0 reset (!)
+//	ltq_dma_w32((1 << 31) | 0x40000, LTQ_DMA_CTRL);
+
 	id = ltq_dma_r32(LTQ_DMA_ID);
 	dev_info(&pdev->dev,
 		"Init done - hw rev: %X, ports: %d, channels: %d\n",
           CPU0       CPU1       
  7:    1451904    1447178      MIPS   7  timer
  8:       1470       1583      MIPS   0  IPI call
  9:      13209      23532      MIPS   1  IPI resched
 22:      14753          1       icu  22  spi_rx
 23:       2487          1       icu  23  spi_tx
 24:          0          0       icu  24  spi_err
 62:          0          0       icu  62  1e101000.usb, dwc2_hsotg:usb1
 63:      54612          0       icu  63  mei_cpe
 72:      72429          0       icu  72  vrx200_rx
 73:          0     525338       icu  73  vrx200_tx
 91:          0          0       icu  91  1e106000.usb, dwc2_hsotg:usb2
112:        640          0       icu 112  asc_tx
113:          0        105       icu 113  asc_rx
114:          0          0       icu 114  asc_err
126:          0          0       icu 126  gptu
127:          0          0       icu 127  gptu
128:          0          0       icu 128  gptu
129:          0          0       icu 129  gptu
130:          0          0       icu 130  gptu
131:          0          0       icu 131  gptu
161:          0          0       icu 161  ifx_pcie_rc0
ERR:          1
+ : ':::::::[' configuration final_single_queue_everything ']:::::::' :
+ iperf3 -c 10.0.0.80
Connecting to host 10.0.0.80, port 5201
[  4] local 10.0.0.1 port 48266 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  34.1 MBytes   286 Mbits/sec    0    214 KBytes       
[  4]   1.00-2.00   sec  35.6 MBytes   299 Mbits/sec    2    214 KBytes       
[  4]   2.00-3.00   sec  37.0 MBytes   310 Mbits/sec    0    215 KBytes       
[  4]   3.00-4.00   sec  35.9 MBytes   301 Mbits/sec    3    204 KBytes       
[  4]   4.00-5.00   sec  34.7 MBytes   291 Mbits/sec    2    170 KBytes       
[  4]   5.00-6.00   sec  35.5 MBytes   298 Mbits/sec    2    214 KBytes       
[  4]   6.00-7.00   sec  34.4 MBytes   288 Mbits/sec    9    127 KBytes       
[  4]   7.00-8.00   sec  32.9 MBytes   276 Mbits/sec    6    160 KBytes       
[  4]   8.00-9.00   sec  33.8 MBytes   284 Mbits/sec    0    215 KBytes       
[  4]   9.00-10.00  sec  34.0 MBytes   285 Mbits/sec    5    214 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec   348 MBytes   292 Mbits/sec   29             sender
[  4]   0.00-10.00  sec   347 MBytes   291 Mbits/sec                  receiver

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -R
Connecting to host 10.0.0.80, port 5201
Reverse mode, remote host 10.0.0.80 is sending
[  4] local 10.0.0.1 port 48272 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-1.00   sec  27.8 MBytes   233 Mbits/sec                  
[  4]   1.00-2.00   sec  28.1 MBytes   236 Mbits/sec                  
[  4]   2.00-3.00   sec  27.9 MBytes   234 Mbits/sec                  
[  4]   3.00-4.00   sec  28.0 MBytes   235 Mbits/sec                  
[  4]   4.00-5.00   sec  28.1 MBytes   236 Mbits/sec                  
[  4]   5.00-6.00   sec  28.0 MBytes   235 Mbits/sec                  
[  4]   6.00-7.00   sec  28.1 MBytes   236 Mbits/sec                  
[  4]   7.00-8.00   sec  27.9 MBytes   234 Mbits/sec                  
[  4]   8.00-9.00   sec  28.0 MBytes   235 Mbits/sec                  
[  4]   9.00-10.00  sec  28.1 MBytes   235 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec   281 MBytes   236 Mbits/sec    0             sender
[  4]   0.00-10.00  sec   281 MBytes   236 Mbits/sec                  receiver

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -u -b 150M
Connecting to host 10.0.0.80, port 5201
[  4] local 10.0.0.1 port 44387 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth       Total Datagrams
[  4]   0.00-1.00   sec  16.5 MBytes   138 Mbits/sec  2111  
[  4]   1.00-2.00   sec  17.9 MBytes   151 Mbits/sec  2297  
[  4]   2.00-3.00   sec  17.8 MBytes   149 Mbits/sec  2281  
[  4]   3.00-4.00   sec  17.8 MBytes   149 Mbits/sec  2272  
[  4]   4.00-5.00   sec  17.9 MBytes   150 Mbits/sec  2296  
[  4]   5.00-6.00   sec  17.9 MBytes   150 Mbits/sec  2286  
[  4]   6.00-7.00   sec  17.9 MBytes   150 Mbits/sec  2286  
[  4]   7.00-8.00   sec  18.0 MBytes   151 Mbits/sec  2299  
[  4]   8.00-9.00   sec  17.9 MBytes   150 Mbits/sec  2285  
[  4]   9.00-10.00  sec  18.1 MBytes   152 Mbits/sec  2313  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-10.00  sec   178 MBytes   149 Mbits/sec  22.169 ms  836/1047 (80%)  
[  4] Sent 1047 datagrams

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -u -b 150M -R
Connecting to host 10.0.0.80, port 5201
Reverse mode, remote host 10.0.0.80 is sending
[  4] local 10.0.0.1 port 58068 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-1.00   sec  17.9 MBytes   150 Mbits/sec  0.069 ms  0/2288 (0%)  
[  4]   1.00-2.00   sec  17.9 MBytes   150 Mbits/sec  0.049 ms  0/2288 (0%)  
[  4]   2.00-3.00   sec  17.9 MBytes   150 Mbits/sec  0.061 ms  0/2289 (0%)  
[  4]   3.00-4.00   sec  17.9 MBytes   150 Mbits/sec  0.067 ms  0/2290 (0%)  
[  4]   4.00-5.00   sec  17.9 MBytes   150 Mbits/sec  0.060 ms  0/2288 (0%)  
[  4]   5.00-6.00   sec  17.9 MBytes   150 Mbits/sec  0.063 ms  0/2289 (0%)  
[  4]   6.00-7.00   sec  17.9 MBytes   150 Mbits/sec  0.059 ms  0/2289 (0%)  
[  4]   7.00-8.00   sec  17.9 MBytes   150 Mbits/sec  0.059 ms  0/2288 (0%)  
[  4]   8.00-9.00   sec  17.9 MBytes   150 Mbits/sec  0.065 ms  0/2289 (0%)  
[  4]   9.00-10.00  sec  17.9 MBytes   150 Mbits/sec  0.087 ms  0/2288 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-10.00  sec   179 MBytes   150 Mbits/sec  0.082 ms  0/22888 (0%)  
[  4] Sent 22888 datagrams

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -u -b 500M
Connecting to host 10.0.0.80, port 5201
[  4] local 10.0.0.1 port 47429 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth       Total Datagrams
[  4]   0.00-1.00   sec  55.8 MBytes   468 Mbits/sec  7141  
[  4]   1.00-2.00   sec  59.3 MBytes   497 Mbits/sec  7585  
[  4]   2.00-3.00   sec  60.1 MBytes   504 Mbits/sec  7689  
[  4]   3.00-4.00   sec  59.0 MBytes   495 Mbits/sec  7552  
[  4]   4.00-5.00   sec  60.0 MBytes   504 Mbits/sec  7683  
[  4]   5.00-6.00   sec  58.6 MBytes   492 Mbits/sec  7504  
[  4]   6.00-7.00   sec  62.7 MBytes   526 Mbits/sec  8020  
[  4]   7.00-8.00   sec  60.6 MBytes   508 Mbits/sec  7753  
[  4]   8.00-9.00   sec  59.9 MBytes   503 Mbits/sec  7672  
[  4]   9.00-10.00  sec  59.6 MBytes   500 Mbits/sec  7625  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-10.00  sec   596 MBytes   500 Mbits/sec  326.537 ms  64686/64855 (1e+02%)  
[  4] Sent 64855 datagrams

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -u -b 500M -R
Connecting to host 10.0.0.80, port 5201
Reverse mode, remote host 10.0.0.80 is sending
[  4] local 10.0.0.1 port 51567 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-1.00   sec  26.0 MBytes   218 Mbits/sec  0.060 ms  0/3327 (0%)  
[  4]   1.00-2.00   sec  26.1 MBytes   219 Mbits/sec  0.038 ms  0/3336 (0%)  
[  4]   2.00-3.00   sec  26.3 MBytes   221 Mbits/sec  0.059 ms  0/3366 (0%)  
[  4]   3.00-4.00   sec  26.2 MBytes   220 Mbits/sec  0.054 ms  0/3353 (0%)  
[  4]   4.00-5.00   sec  26.2 MBytes   220 Mbits/sec  0.074 ms  0/3357 (0%)  
[  4]   5.00-6.00   sec  26.2 MBytes   220 Mbits/sec  0.052 ms  0/3355 (0%)  
[  4]   6.00-7.00   sec  26.2 MBytes   220 Mbits/sec  0.051 ms  0/3354 (0%)  
[  4]   7.00-8.00   sec  26.2 MBytes   220 Mbits/sec  0.053 ms  0/3359 (0%)  
[  4]   8.00-9.00   sec  26.2 MBytes   220 Mbits/sec  0.038 ms  0/3356 (0%)  
[  4]   9.00-10.00  sec  26.1 MBytes   219 Mbits/sec  0.056 ms  0/3347 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-10.00  sec   262 MBytes   220 Mbits/sec  0.064 ms  0/33511 (0%)  
[  4] Sent 33511 datagrams

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -u -b 1000M
Connecting to host 10.0.0.80, port 5201
[  4] local 10.0.0.1 port 48563 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth       Total Datagrams
[  4]   0.00-1.00   sec   105 MBytes   884 Mbits/sec  13482  
[  4]   1.00-2.00   sec   105 MBytes   879 Mbits/sec  13413  
[  4]   2.00-3.00   sec   103 MBytes   862 Mbits/sec  13148  
[  4]   3.00-4.00   sec   104 MBytes   872 Mbits/sec  13309  
[  4]   4.00-5.00   sec   103 MBytes   862 Mbits/sec  13154  
[  4]   5.00-6.00   sec   104 MBytes   872 Mbits/sec  13300  
[  4]   6.00-7.00   sec   104 MBytes   871 Mbits/sec  13285  
[  4]   7.00-8.00   sec   104 MBytes   873 Mbits/sec  13322  
[  4]   8.00-9.00   sec   105 MBytes   877 Mbits/sec  13389  
[  4]   9.00-10.00  sec   104 MBytes   875 Mbits/sec  13349  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-10.00  sec  1.02 GBytes   873 Mbits/sec  23058.560 ms  131667/131770 (1e+02%)  
[  4] Sent 131770 datagrams

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -u -b 1000M -R
Connecting to host 10.0.0.80, port 5201
Reverse mode, remote host 10.0.0.80 is sending
[  4] local 10.0.0.1 port 50599 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-1.00   sec  26.2 MBytes   220 Mbits/sec  0.081 ms  0/3352 (0%)  
[  4]   1.00-2.00   sec  26.2 MBytes   220 Mbits/sec  0.041 ms  0/3358 (0%)  
[  4]   2.00-3.00   sec  26.3 MBytes   220 Mbits/sec  0.082 ms  0/3362 (0%)  
[  4]   3.00-4.00   sec  26.1 MBytes   219 Mbits/sec  0.070 ms  0/3341 (0%)  
[  4]   4.00-5.00   sec  26.1 MBytes   219 Mbits/sec  0.066 ms  0/3340 (0%)  
[  4]   5.00-6.00   sec  26.1 MBytes   219 Mbits/sec  0.089 ms  0/3336 (0%)  
[  4]   6.00-7.00   sec  26.2 MBytes   220 Mbits/sec  0.042 ms  0/3352 (0%)  
[  4]   7.00-8.00   sec  26.2 MBytes   220 Mbits/sec  0.062 ms  0/3360 (0%)  
[  4]   8.00-9.00   sec  26.2 MBytes   220 Mbits/sec  0.071 ms  0/3358 (0%)  
[  4]   9.00-10.00  sec  26.2 MBytes   220 Mbits/sec  0.060 ms  0/3356 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-10.00  sec   262 MBytes   220 Mbits/sec  0.062 ms  0/33516 (0%)  
[  4] Sent 33516 datagrams

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -P3
Connecting to host 10.0.0.80, port 5201
[  4] local 10.0.0.1 port 48312 connected to 10.0.0.80 port 5201
[  6] local 10.0.0.1 port 48314 connected to 10.0.0.80 port 5201
[  9] local 10.0.0.1 port 48316 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  9.57 MBytes  80.2 Mbits/sec   30   17.0 KBytes       
[  6]   0.00-1.00   sec  14.8 MBytes   124 Mbits/sec   16   11.3 KBytes       
[  9]   0.00-1.00   sec  8.64 MBytes  72.4 Mbits/sec   73   69.3 KBytes       
[SUM]   0.00-1.00   sec  33.0 MBytes   277 Mbits/sec  119             
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   1.00-2.00   sec  7.33 MBytes  61.5 Mbits/sec   52   17.0 KBytes       
[  6]   1.00-2.00   sec  15.8 MBytes   133 Mbits/sec   31    122 KBytes       
[  9]   1.00-2.00   sec  10.0 MBytes  83.9 Mbits/sec   45   39.6 KBytes       
[SUM]   1.00-2.00   sec  33.2 MBytes   278 Mbits/sec  128             
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   2.00-3.00   sec  5.72 MBytes  48.0 Mbits/sec   48   14.1 KBytes       
[  6]   2.00-3.00   sec  20.3 MBytes   171 Mbits/sec   48   67.9 KBytes       
[  9]   2.00-3.00   sec  7.02 MBytes  58.9 Mbits/sec   41   32.5 KBytes       
[SUM]   2.00-3.00   sec  33.1 MBytes   277 Mbits/sec  137             
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   3.00-4.00   sec  6.90 MBytes  57.9 Mbits/sec   62   25.5 KBytes       
[  6]   3.00-4.00   sec  17.3 MBytes   145 Mbits/sec   28   66.5 KBytes       
[  9]   3.00-4.00   sec  8.45 MBytes  70.9 Mbits/sec   44   31.1 KBytes       
[SUM]   3.00-4.00   sec  32.6 MBytes   274 Mbits/sec  134             
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   4.00-5.00   sec  5.59 MBytes  46.9 Mbits/sec   48   60.8 KBytes       
[  6]   4.00-5.00   sec  15.8 MBytes   133 Mbits/sec   28   86.3 KBytes       
[  9]   4.00-5.00   sec  11.1 MBytes  93.3 Mbits/sec   60   72.1 KBytes       
[SUM]   4.00-5.00   sec  32.6 MBytes   273 Mbits/sec  136             
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   5.00-6.00   sec  8.20 MBytes  68.8 Mbits/sec   75   26.9 KBytes       
[  6]   5.00-6.00   sec  18.3 MBytes   154 Mbits/sec   16   67.9 KBytes       
[  9]   5.00-6.00   sec  5.47 MBytes  45.9 Mbits/sec   54   32.5 KBytes       
[SUM]   5.00-6.00   sec  32.0 MBytes   269 Mbits/sec  145             
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   6.00-7.00   sec  9.69 MBytes  81.3 Mbits/sec   61   24.0 KBytes       
[  6]   6.00-7.00   sec  17.3 MBytes   145 Mbits/sec   17    103 KBytes       
[  9]   6.00-7.00   sec  4.72 MBytes  39.6 Mbits/sec   48   39.6 KBytes       
[SUM]   6.00-7.00   sec  31.7 MBytes   266 Mbits/sec  126             
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   7.00-8.00   sec  6.28 MBytes  52.6 Mbits/sec   60   74.9 KBytes       
[  6]   7.00-8.00   sec  11.1 MBytes  93.3 Mbits/sec   42   49.5 KBytes       
[  9]   7.00-8.00   sec  15.6 MBytes   131 Mbits/sec   32   67.9 KBytes       
[SUM]   7.00-8.00   sec  33.0 MBytes   277 Mbits/sec  134             
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   8.00-9.00   sec  9.69 MBytes  81.3 Mbits/sec   49   39.6 KBytes       
[  6]   8.00-9.00   sec  3.42 MBytes  28.7 Mbits/sec   55   28.3 KBytes       
[  9]   8.00-9.00   sec  18.8 MBytes   157 Mbits/sec   16    123 KBytes       
[SUM]   8.00-9.00   sec  31.9 MBytes   267 Mbits/sec  120             
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   9.00-10.00  sec  6.46 MBytes  54.2 Mbits/sec   66   59.4 KBytes       
[  6]   9.00-10.00  sec  14.7 MBytes   124 Mbits/sec   11    161 KBytes       
[  9]   9.00-10.00  sec  11.7 MBytes  98.0 Mbits/sec   37   21.2 KBytes       
[SUM]   9.00-10.00  sec  32.9 MBytes   276 Mbits/sec  114             
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  75.4 MBytes  63.3 Mbits/sec  551             sender
[  4]   0.00-10.00  sec  74.8 MBytes  62.8 Mbits/sec                  receiver
[  6]   0.00-10.00  sec   149 MBytes   125 Mbits/sec  292             sender
[  6]   0.00-10.00  sec   148 MBytes   124 Mbits/sec                  receiver
[  9]   0.00-10.00  sec   101 MBytes  85.1 Mbits/sec  450             sender
[  9]   0.00-10.00  sec   101 MBytes  84.4 Mbits/sec                  receiver
[SUM]   0.00-10.00  sec   326 MBytes   273 Mbits/sec  1293             sender
[SUM]   0.00-10.00  sec   323 MBytes   271 Mbits/sec                  receiver

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -P3 -R
Connecting to host 10.0.0.80, port 5201
Reverse mode, remote host 10.0.0.80 is sending
[  4] local 10.0.0.1 port 48320 connected to 10.0.0.80 port 5201
[  6] local 10.0.0.1 port 48322 connected to 10.0.0.80 port 5201
[  9] local 10.0.0.1 port 48324 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-1.00   sec  9.25 MBytes  77.6 Mbits/sec                  
[  6]   0.00-1.00   sec  9.25 MBytes  77.6 Mbits/sec                  
[  9]   0.00-1.00   sec  8.00 MBytes  67.1 Mbits/sec                  
[SUM]   0.00-1.00   sec  26.5 MBytes   222 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   1.00-2.00   sec  9.25 MBytes  77.6 Mbits/sec                  
[  6]   1.00-2.00   sec  9.19 MBytes  77.1 Mbits/sec                  
[  9]   1.00-2.00   sec  9.12 MBytes  76.5 Mbits/sec                  
[SUM]   1.00-2.00   sec  27.6 MBytes   231 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   2.00-3.00   sec  9.10 MBytes  76.4 Mbits/sec                  
[  6]   2.00-3.00   sec  9.06 MBytes  76.0 Mbits/sec                  
[  9]   2.00-3.00   sec  9.12 MBytes  76.6 Mbits/sec                  
[SUM]   2.00-3.00   sec  27.3 MBytes   229 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   3.00-4.00   sec  9.15 MBytes  76.7 Mbits/sec                  
[  6]   3.00-4.00   sec  9.25 MBytes  77.6 Mbits/sec                  
[  9]   3.00-4.00   sec  9.21 MBytes  77.2 Mbits/sec                  
[SUM]   3.00-4.00   sec  27.6 MBytes   232 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   4.00-5.00   sec  9.12 MBytes  76.5 Mbits/sec                  
[  6]   4.00-5.00   sec  9.12 MBytes  76.6 Mbits/sec                  
[  9]   4.00-5.00   sec  9.04 MBytes  75.9 Mbits/sec                  
[SUM]   4.00-5.00   sec  27.3 MBytes   229 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   5.00-6.00   sec  9.12 MBytes  76.5 Mbits/sec                  
[  6]   5.00-6.00   sec  9.12 MBytes  76.5 Mbits/sec                  
[  9]   5.00-6.00   sec  9.19 MBytes  77.1 Mbits/sec                  
[SUM]   5.00-6.00   sec  27.4 MBytes   230 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   6.00-7.00   sec  9.25 MBytes  77.6 Mbits/sec                  
[  6]   6.00-7.00   sec  9.12 MBytes  76.5 Mbits/sec                  
[  9]   6.00-7.00   sec  9.19 MBytes  77.1 Mbits/sec                  
[SUM]   6.00-7.00   sec  27.6 MBytes   231 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   7.00-8.00   sec  9.00 MBytes  75.5 Mbits/sec                  
[  6]   7.00-8.00   sec  9.12 MBytes  76.5 Mbits/sec                  
[  9]   7.00-8.00   sec  9.06 MBytes  76.0 Mbits/sec                  
[SUM]   7.00-8.00   sec  27.2 MBytes   228 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   8.00-9.00   sec  9.12 MBytes  76.5 Mbits/sec                  
[  6]   8.00-9.00   sec  9.12 MBytes  76.5 Mbits/sec                  
[  9]   8.00-9.00   sec  9.19 MBytes  77.1 Mbits/sec                  
[SUM]   8.00-9.00   sec  27.4 MBytes   230 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   9.00-10.00  sec  9.14 MBytes  76.7 Mbits/sec                  
[  6]   9.00-10.00  sec  9.12 MBytes  76.6 Mbits/sec                  
[  9]   9.00-10.00  sec  9.12 MBytes  76.6 Mbits/sec                  
[SUM]   9.00-10.00  sec  27.4 MBytes   230 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  92.5 MBytes  77.6 Mbits/sec    0             sender
[  4]   0.00-10.00  sec  92.5 MBytes  77.6 Mbits/sec                  receiver
[  6]   0.00-10.00  sec  92.4 MBytes  77.5 Mbits/sec    0             sender
[  6]   0.00-10.00  sec  92.4 MBytes  77.5 Mbits/sec                  receiver
[  9]   0.00-10.00  sec  91.2 MBytes  76.5 Mbits/sec    0             sender
[  9]   0.00-10.00  sec  91.2 MBytes  76.5 Mbits/sec                  receiver
[SUM]   0.00-10.00  sec   276 MBytes   232 Mbits/sec    0             sender
[SUM]   0.00-10.00  sec   276 MBytes   232 Mbits/sec                  receiver

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -P3 -u -b 800M
Connecting to host 10.0.0.80, port 5201
[  4] local 10.0.0.1 port 58529 connected to 10.0.0.80 port 5201
[  6] local 10.0.0.1 port 48003 connected to 10.0.0.80 port 5201
[  9] local 10.0.0.1 port 37996 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth       Total Datagrams
[  4]   0.00-1.00   sec  36.9 MBytes   310 Mbits/sec  4726  
[  6]   0.00-1.00   sec  36.9 MBytes   310 Mbits/sec  4726  
[  9]   0.00-1.00   sec  36.9 MBytes   310 Mbits/sec  4726  
[SUM]   0.00-1.00   sec   111 MBytes   929 Mbits/sec  14178  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   1.00-2.00   sec  37.5 MBytes   315 Mbits/sec  4802  
[  6]   1.00-2.00   sec  37.5 MBytes   315 Mbits/sec  4802  
[  9]   1.00-2.00   sec  37.5 MBytes   315 Mbits/sec  4802  
[SUM]   1.00-2.00   sec   113 MBytes   944 Mbits/sec  14406  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   2.00-3.00   sec  37.5 MBytes   314 Mbits/sec  4798  
[  6]   2.00-3.00   sec  37.5 MBytes   314 Mbits/sec  4798  
[  9]   2.00-3.00   sec  37.5 MBytes   314 Mbits/sec  4798  
[SUM]   2.00-3.00   sec   112 MBytes   943 Mbits/sec  14394  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   3.00-4.00   sec  37.6 MBytes   316 Mbits/sec  4816  
[  6]   3.00-4.00   sec  37.6 MBytes   316 Mbits/sec  4816  
[  9]   3.00-4.00   sec  37.6 MBytes   316 Mbits/sec  4816  
[SUM]   3.00-4.00   sec   113 MBytes   947 Mbits/sec  14448  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   4.00-5.00   sec  37.6 MBytes   316 Mbits/sec  4817  
[  6]   4.00-5.00   sec  37.6 MBytes   316 Mbits/sec  4817  
[  9]   4.00-5.00   sec  37.6 MBytes   316 Mbits/sec  4817  
[SUM]   4.00-5.00   sec   113 MBytes   947 Mbits/sec  14451  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   5.00-6.00   sec  37.6 MBytes   316 Mbits/sec  4816  
[  6]   5.00-6.00   sec  37.6 MBytes   316 Mbits/sec  4816  
[  9]   5.00-6.00   sec  37.6 MBytes   316 Mbits/sec  4816  
[SUM]   5.00-6.00   sec   113 MBytes   947 Mbits/sec  14448  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   6.00-7.00   sec  37.6 MBytes   316 Mbits/sec  4816  
[  6]   6.00-7.00   sec  37.6 MBytes   316 Mbits/sec  4816  
[  9]   6.00-7.00   sec  37.6 MBytes   316 Mbits/sec  4816  
[SUM]   6.00-7.00   sec   113 MBytes   947 Mbits/sec  14448  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   7.00-8.00   sec  37.6 MBytes   315 Mbits/sec  4809  
[  6]   7.00-8.00   sec  37.6 MBytes   315 Mbits/sec  4809  
[  9]   7.00-8.00   sec  37.6 MBytes   315 Mbits/sec  4809  
[SUM]   7.00-8.00   sec   113 MBytes   946 Mbits/sec  14427  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   8.00-9.00   sec  37.1 MBytes   311 Mbits/sec  4748  
[  6]   8.00-9.00   sec  37.1 MBytes   311 Mbits/sec  4748  
[  9]   8.00-9.00   sec  37.1 MBytes   311 Mbits/sec  4748  
[SUM]   8.00-9.00   sec   111 MBytes   933 Mbits/sec  14244  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   9.00-10.00  sec  37.8 MBytes   317 Mbits/sec  4833  
[  6]   9.00-10.00  sec  37.8 MBytes   317 Mbits/sec  4833  
[  9]   9.00-10.00  sec  37.8 MBytes   317 Mbits/sec  4833  
[SUM]   9.00-10.00  sec   113 MBytes   950 Mbits/sec  14499  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-10.00  sec   375 MBytes   314 Mbits/sec  619852.537 ms  43828/43880 (1e+02%)  
[  4] Sent 43880 datagrams
[  6]   0.00-10.00  sec   375 MBytes   314 Mbits/sec  1181885.514 ms  43899/43941 (1e+02%)  
[  6] Sent 43941 datagrams
[  9]   0.00-10.00  sec   375 MBytes   314 Mbits/sec  802422.739 ms  43889/43937 (1e+02%)  
[  9] Sent 43937 datagrams
[SUM]   0.00-10.00  sec  1.10 GBytes   943 Mbits/sec  868053.597 ms  131616/131758 (1e+02%)  

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -P3 -R -u -b 800M
Connecting to host 10.0.0.80, port 5201
Reverse mode, remote host 10.0.0.80 is sending
[  4] local 10.0.0.1 port 57931 connected to 10.0.0.80 port 5201
[  6] local 10.0.0.1 port 54966 connected to 10.0.0.80 port 5201
[  9] local 10.0.0.1 port 43968 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-1.00   sec  9.13 MBytes  76.6 Mbits/sec  0.062 ms  0/1169 (0%)  
[  6]   0.00-1.00   sec  9.13 MBytes  76.6 Mbits/sec  0.045 ms  0/1169 (0%)  
[  9]   0.00-1.00   sec  9.12 MBytes  76.5 Mbits/sec  0.037 ms  0/1168 (0%)  
[SUM]   0.00-1.00   sec  27.4 MBytes   230 Mbits/sec  0.048 ms  0/3506 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   1.00-2.00   sec  9.12 MBytes  76.5 Mbits/sec  0.042 ms  0/1168 (0%)  
[  6]   1.00-2.00   sec  9.12 MBytes  76.5 Mbits/sec  0.076 ms  0/1168 (0%)  
[  9]   1.00-2.00   sec  9.12 MBytes  76.5 Mbits/sec  0.040 ms  0/1168 (0%)  
[SUM]   1.00-2.00   sec  27.4 MBytes   230 Mbits/sec  0.053 ms  0/3504 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   2.00-3.00   sec  9.08 MBytes  76.2 Mbits/sec  0.144 ms  0/1162 (0%)  
[  6]   2.00-3.00   sec  9.08 MBytes  76.2 Mbits/sec  0.128 ms  0/1162 (0%)  
[  9]   2.00-3.00   sec  9.07 MBytes  76.1 Mbits/sec  0.174 ms  0/1161 (0%)  
[SUM]   2.00-3.00   sec  27.2 MBytes   228 Mbits/sec  0.149 ms  0/3485 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   3.00-4.00   sec  9.07 MBytes  76.1 Mbits/sec  0.094 ms  0/1161 (0%)  
[  6]   3.00-4.00   sec  9.07 MBytes  76.1 Mbits/sec  0.171 ms  0/1161 (0%)  
[  9]   3.00-4.00   sec  9.08 MBytes  76.2 Mbits/sec  0.138 ms  0/1162 (0%)  
[SUM]   3.00-4.00   sec  27.2 MBytes   228 Mbits/sec  0.134 ms  0/3484 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   4.00-5.00   sec  9.12 MBytes  76.5 Mbits/sec  0.098 ms  0/1168 (0%)  
[  6]   4.00-5.00   sec  9.12 MBytes  76.5 Mbits/sec  0.052 ms  0/1167 (0%)  
[  9]   4.00-5.00   sec  9.12 MBytes  76.5 Mbits/sec  0.114 ms  0/1167 (0%)  
[SUM]   4.00-5.00   sec  27.4 MBytes   229 Mbits/sec  0.088 ms  0/3502 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   5.00-6.00   sec  9.10 MBytes  76.4 Mbits/sec  0.189 ms  0/1165 (0%)  
[  6]   5.00-6.00   sec  9.11 MBytes  76.4 Mbits/sec  0.172 ms  0/1166 (0%)  
[  9]   5.00-6.00   sec  9.10 MBytes  76.4 Mbits/sec  0.121 ms  0/1165 (0%)  
[SUM]   5.00-6.00   sec  27.3 MBytes   229 Mbits/sec  0.161 ms  0/3496 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   6.00-7.00   sec  9.08 MBytes  76.2 Mbits/sec  0.173 ms  0/1162 (0%)  
[  6]   6.00-7.00   sec  9.08 MBytes  76.2 Mbits/sec  0.143 ms  0/1162 (0%)  
[  9]   6.00-7.00   sec  9.08 MBytes  76.2 Mbits/sec  0.106 ms  0/1162 (0%)  
[SUM]   6.00-7.00   sec  27.2 MBytes   228 Mbits/sec  0.141 ms  0/3486 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   7.00-8.00   sec  9.09 MBytes  76.2 Mbits/sec  0.030 ms  0/1163 (0%)  
[  6]   7.00-8.00   sec  9.09 MBytes  76.2 Mbits/sec  0.061 ms  0/1163 (0%)  
[  9]   7.00-8.00   sec  9.09 MBytes  76.2 Mbits/sec  0.043 ms  0/1163 (0%)  
[SUM]   7.00-8.00   sec  27.3 MBytes   229 Mbits/sec  0.045 ms  0/3489 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   8.00-9.00   sec  9.09 MBytes  76.3 Mbits/sec  0.126 ms  0/1164 (0%)  
[  6]   8.00-9.00   sec  9.09 MBytes  76.3 Mbits/sec  0.191 ms  0/1164 (0%)  
[  9]   8.00-9.00   sec  9.09 MBytes  76.3 Mbits/sec  0.156 ms  0/1164 (0%)  
[SUM]   8.00-9.00   sec  27.3 MBytes   229 Mbits/sec  0.157 ms  0/3492 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   9.00-10.00  sec  9.10 MBytes  76.3 Mbits/sec  0.082 ms  0/1165 (0%)  
[  6]   9.00-10.00  sec  9.09 MBytes  76.3 Mbits/sec  0.174 ms  0/1164 (0%)  
[  9]   9.00-10.00  sec  9.10 MBytes  76.3 Mbits/sec  0.132 ms  0/1165 (0%)  
[SUM]   9.00-10.00  sec  27.3 MBytes   229 Mbits/sec  0.129 ms  0/3494 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-10.00  sec  91.0 MBytes  76.3 Mbits/sec  0.082 ms  0/11647 (0%)  
[  4] Sent 11647 datagrams
[  6]   0.00-10.00  sec  91.0 MBytes  76.3 Mbits/sec  0.165 ms  0/11647 (0%)  
[  6] Sent 11647 datagrams
[  9]   0.00-10.00  sec  91.0 MBytes  76.3 Mbits/sec  0.131 ms  0/11646 (0%)  
[  9] Sent 11646 datagrams
[SUM]   0.00-10.00  sec   273 MBytes   229 Mbits/sec  0.126 ms  0/34940 (0%)  

iperf Done.
+ : ':::::::[' configuration vanilla ']:::::::' :
+ iperf3 -c 10.0.0.80
Connecting to host 10.0.0.80, port 5201
[  4] local 10.0.0.1 port 51814 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  21.2 MBytes   178 Mbits/sec   27   72.1 KBytes       
[  4]   1.00-2.00   sec  20.6 MBytes   173 Mbits/sec   29   70.7 KBytes       
[  4]   2.00-3.00   sec  20.8 MBytes   174 Mbits/sec   35   60.8 KBytes       
[  4]   3.00-4.00   sec  20.8 MBytes   174 Mbits/sec   29   73.5 KBytes       
[  4]   4.00-5.00   sec  20.8 MBytes   174 Mbits/sec   32   70.7 KBytes       
[  4]   5.00-6.00   sec  20.7 MBytes   174 Mbits/sec   35   69.3 KBytes       
[  4]   6.00-7.00   sec  20.8 MBytes   174 Mbits/sec   36   60.8 KBytes       
[  4]   7.00-8.00   sec  20.8 MBytes   175 Mbits/sec   29   59.4 KBytes       
[  4]   8.00-9.00   sec  20.8 MBytes   175 Mbits/sec   41   46.7 KBytes       
[  4]   9.00-10.00  sec  20.8 MBytes   175 Mbits/sec   28   50.9 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec   208 MBytes   174 Mbits/sec  321             sender
[  4]   0.00-10.00  sec   208 MBytes   174 Mbits/sec                  receiver

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -R
Connecting to host 10.0.0.80, port 5201
Reverse mode, remote host 10.0.0.80 is sending
[  4] local 10.0.0.1 port 51862 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-1.00   sec  9.63 MBytes  80.7 Mbits/sec                  
[  4]   1.00-2.00   sec  9.65 MBytes  81.0 Mbits/sec                  
[  4]   2.00-3.00   sec  9.52 MBytes  79.9 Mbits/sec                  
[  4]   3.00-4.00   sec  9.69 MBytes  81.3 Mbits/sec                  
[  4]   4.00-5.00   sec  9.68 MBytes  81.2 Mbits/sec                  
[  4]   5.00-6.00   sec  9.66 MBytes  81.0 Mbits/sec                  
[  4]   6.00-7.00   sec  9.68 MBytes  81.2 Mbits/sec                  
[  4]   7.00-8.00   sec  9.70 MBytes  81.4 Mbits/sec                  
[  4]   8.00-9.00   sec  9.69 MBytes  81.3 Mbits/sec                  
[  4]   9.00-10.00  sec  9.79 MBytes  82.1 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  97.0 MBytes  81.4 Mbits/sec    0             sender
[  4]   0.00-10.00  sec  97.0 MBytes  81.4 Mbits/sec                  receiver

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -u -b 150M
Connecting to host 10.0.0.80, port 5201
[  4] local 10.0.0.1 port 51957 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth       Total Datagrams
[  4]   0.00-1.00   sec  16.4 MBytes   138 Mbits/sec  2101  
[  4]   1.00-2.00   sec  17.9 MBytes   150 Mbits/sec  2288  
[  4]   2.00-3.00   sec  17.9 MBytes   150 Mbits/sec  2285  
[  4]   3.00-4.00   sec  17.9 MBytes   150 Mbits/sec  2292  
[  4]   4.00-5.00   sec  17.9 MBytes   150 Mbits/sec  2287  
[  4]   5.00-6.00   sec  17.9 MBytes   150 Mbits/sec  2291  
[  4]   6.00-7.00   sec  17.9 MBytes   150 Mbits/sec  2288  
[  4]   7.00-8.00   sec  17.9 MBytes   150 Mbits/sec  2291  
[  4]   8.00-9.00   sec  17.8 MBytes   150 Mbits/sec  2282  
[  4]   9.00-10.00  sec  17.9 MBytes   150 Mbits/sec  2292  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total 
Datagrams
[  4]   0.00-10.00  sec   177 MBytes   149 Mbits/sec  136434.385 ms  1349/1417 
(95%)  
[  4] Sent 1417 datagrams

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -u -b 150M -R
Connecting to host 10.0.0.80, port 5201
Reverse mode, remote host 10.0.0.80 is sending
[  4] local 10.0.0.1 port 46317 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total 
Datagrams
[  4]   0.00-1.00   sec  14.7 MBytes   124 Mbits/sec  0.077 ms  0/1885 (0%)  
[  4]   1.00-2.00   sec  15.2 MBytes   127 Mbits/sec  0.072 ms  0/1942 (0%)  
[  4]   2.00-3.00   sec  15.0 MBytes   126 Mbits/sec  0.074 ms  0/1924 (0%)  
[  4]   3.00-4.00   sec  14.3 MBytes   120 Mbits/sec  0.080 ms  0/1825 (0%)  
[  4]   4.00-5.00   sec  14.4 MBytes   120 Mbits/sec  0.079 ms  0/1837 (0%)  
[  4]   5.00-6.00   sec  14.8 MBytes   124 Mbits/sec  0.065 ms  0/1888 (0%)  
[  4]   6.00-7.00   sec  15.3 MBytes   128 Mbits/sec  0.076 ms  0/1956 (0%)  
[  4]   7.00-8.00   sec  15.2 MBytes   128 Mbits/sec  0.095 ms  0/1948 (0%)  
[  4]   8.00-9.00   sec  15.1 MBytes   127 Mbits/sec  0.092 ms  0/1932 (0%)  
[  4]   9.00-10.00  sec  15.1 MBytes   127 Mbits/sec  0.095 ms  0/1938 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total 
Datagrams
[  4]   0.00-10.00  sec   149 MBytes   125 Mbits/sec  0.085 ms  0/19082 (0%)  
[  4] Sent 19082 datagrams

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -u -b 500M
Connecting to host 10.0.0.80, port 5201
[  4] local 10.0.0.1 port 48172 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth       Total Datagrams
[  4]   0.00-1.00   sec  58.5 MBytes   491 Mbits/sec  7494  
[  4]   1.00-2.00   sec  60.6 MBytes   508 Mbits/sec  7756  
[  4]   2.00-3.00   sec  58.7 MBytes   492 Mbits/sec  7508  
[  4]   3.00-4.00   sec  60.2 MBytes   505 Mbits/sec  7710  
[  4]   4.00-5.00   sec  59.0 MBytes   495 Mbits/sec  7556  
[  4]   5.00-6.00   sec  60.5 MBytes   508 Mbits/sec  7744  
[  4]   6.00-7.00   sec  58.7 MBytes   492 Mbits/sec  7508  
[  4]   7.00-8.00   sec  59.1 MBytes   496 Mbits/sec  7565  
[  4]   8.00-9.00   sec  60.4 MBytes   507 Mbits/sec  7730  
[  4]   9.00-10.00  sec  59.9 MBytes   502 Mbits/sec  7664  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total 
Datagrams
[  4]   0.00-10.00  sec   596 MBytes   500 Mbits/sec  2051749.337 ms  
64268/64294 (1e+02%)  
[  4] Sent 64294 datagrams

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -u -b 500M -R
Connecting to host 10.0.0.80, port 5201
Reverse mode, remote host 10.0.0.80 is sending
[  4] local 10.0.0.1 port 35361 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total 
Datagrams
[  4]   0.00-1.00   sec  14.3 MBytes   120 Mbits/sec  0.097 ms  0/1830 (0%)  
[  4]   1.00-2.00   sec  14.3 MBytes   120 Mbits/sec  0.101 ms  0/1830 (0%)  
[  4]   2.00-3.00   sec  14.3 MBytes   120 Mbits/sec  0.072 ms  0/1827 (0%)  
[  4]   3.00-4.00   sec  14.2 MBytes   119 Mbits/sec  0.081 ms  0/1819 (0%)  
[  4]   4.00-5.00   sec  14.3 MBytes   120 Mbits/sec  0.070 ms  0/1834 (0%)  
[  4]   5.00-6.00   sec  14.3 MBytes   120 Mbits/sec  0.085 ms  0/1833 (0%)  
[  4]   6.00-7.00   sec  14.3 MBytes   120 Mbits/sec  0.082 ms  0/1835 (0%)  
[  4]   7.00-8.00   sec  14.3 MBytes   120 Mbits/sec  0.109 ms  0/1836 (0%)  
[  4]   8.00-9.00   sec  14.2 MBytes   119 Mbits/sec  0.080 ms  0/1822 (0%)  
[  4]   9.00-10.00  sec  14.3 MBytes   120 Mbits/sec  0.090 ms  0/1825 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total 
Datagrams
[  4]   0.00-10.00  sec   143 MBytes   120 Mbits/sec  0.104 ms  0/18298 (0%)  
[  4] Sent 18298 datagrams

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -u -b 1000M
Connecting to host 10.0.0.80, port 5201
[  4] local 10.0.0.1 port 53231 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth       Total Datagrams
[  4]   0.00-1.00   sec   107 MBytes   902 Mbits/sec  13759  
[  4]   1.00-2.00   sec   107 MBytes   896 Mbits/sec  13675  
[  4]   2.00-3.00   sec   107 MBytes   901 Mbits/sec  13753  
[  4]   3.00-4.00   sec   107 MBytes   898 Mbits/sec  13700  
[  4]   4.00-5.00   sec   107 MBytes   902 Mbits/sec  13759  
[  4]   5.00-6.00   sec   108 MBytes   902 Mbits/sec  13762  
[  4]   6.00-7.00   sec   107 MBytes   899 Mbits/sec  13719  
[  4]   7.00-8.00   sec   108 MBytes   902 Mbits/sec  13760  
[  4]   8.00-9.00   sec   107 MBytes   901 Mbits/sec  13753  
[  4]   9.00-10.00  sec   107 MBytes   902 Mbits/sec  13756  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total 
Datagrams
[  4]   0.00-10.00  sec  1.05 GBytes   900 Mbits/sec  5762140.265 ms  210/220 
(95%)  
[  4] Sent 220 datagrams

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -u -b 1000M -R
Connecting to host 10.0.0.80, port 5201
Reverse mode, remote host 10.0.0.80 is sending
[  4] local 10.0.0.1 port 34296 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total 
Datagrams
[  4]   0.00-1.00   sec  14.3 MBytes   120 Mbits/sec  0.084 ms  0/1835 (0%)  
[  4]   1.00-2.00   sec  14.3 MBytes   120 Mbits/sec  0.075 ms  0/1835 (0%)  
[  4]   2.00-3.00   sec  14.5 MBytes   122 Mbits/sec  0.062 ms  0/1858 (0%)  
[  4]   3.00-4.00   sec  15.1 MBytes   127 Mbits/sec  0.060 ms  0/1935 (0%)  
[  4]   4.00-5.00   sec  15.3 MBytes   128 Mbits/sec  0.076 ms  0/1958 (0%)  
[  4]   5.00-6.00   sec  14.5 MBytes   122 Mbits/sec  0.078 ms  0/1861 (0%)  
[  4]   6.00-7.00   sec  14.4 MBytes   120 Mbits/sec  0.100 ms  0/1837 (0%)  
[  4]   7.00-8.00   sec  14.3 MBytes   120 Mbits/sec  0.098 ms  0/1835 (0%)  
[  4]   8.00-9.00   sec  14.2 MBytes   119 Mbits/sec  0.085 ms  0/1821 (0%)  
[  4]   9.00-10.00  sec  14.3 MBytes   120 Mbits/sec  0.110 ms  0/1825 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total 
Datagrams
[  4]   0.00-10.00  sec   145 MBytes   122 Mbits/sec  0.101 ms  0/18606 (0%)  
[  4] Sent 18606 datagrams

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -P3
Connecting to host 10.0.0.80, port 5201
[  4] local 10.0.0.1 port 52130 connected to 10.0.0.80 port 5201
[  6] local 10.0.0.1 port 52132 connected to 10.0.0.80 port 5201
[  9] local 10.0.0.1 port 52134 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  7.47 MBytes  62.6 Mbits/sec   73   17.0 KBytes       
[  6]   0.00-1.00   sec  7.21 MBytes  60.5 Mbits/sec   78   19.8 KBytes       
[  9]   0.00-1.00   sec  7.14 MBytes  59.9 Mbits/sec   76   31.1 KBytes       
[SUM]   0.00-1.00   sec  21.8 MBytes   183 Mbits/sec  227             
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   1.00-2.00   sec  7.95 MBytes  66.7 Mbits/sec   61   12.7 KBytes       
[  6]   1.00-2.00   sec  5.84 MBytes  49.0 Mbits/sec   99   35.4 KBytes       
[  9]   1.00-2.00   sec  7.08 MBytes  59.4 Mbits/sec   78   32.5 KBytes       
[SUM]   1.00-2.00   sec  20.9 MBytes   175 Mbits/sec  238             
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   2.00-3.00   sec  6.09 MBytes  51.1 Mbits/sec   73   31.1 KBytes       
[  6]   2.00-3.00   sec  8.95 MBytes  75.1 Mbits/sec   64   22.6 KBytes       
[  9]   2.00-3.00   sec  6.09 MBytes  51.1 Mbits/sec   81   18.4 KBytes       
[SUM]   2.00-3.00   sec  21.1 MBytes   177 Mbits/sec  218             
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   3.00-4.00   sec  6.71 MBytes  56.3 Mbits/sec   80   11.3 KBytes       
[  6]   3.00-4.00   sec  8.26 MBytes  69.3 Mbits/sec   76   17.0 KBytes       
[  9]   3.00-4.00   sec  6.28 MBytes  52.7 Mbits/sec   77   42.4 KBytes       
[SUM]   3.00-4.00   sec  21.3 MBytes   178 Mbits/sec  233             
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   4.00-5.00   sec  6.59 MBytes  55.3 Mbits/sec   94   12.7 KBytes       
[  6]   4.00-5.00   sec  7.58 MBytes  63.6 Mbits/sec   63   28.3 KBytes       
[  9]   4.00-5.00   sec  6.84 MBytes  57.3 Mbits/sec   62   11.3 KBytes       
[SUM]   4.00-5.00   sec  21.0 MBytes   176 Mbits/sec  219             
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   5.00-6.00   sec  8.76 MBytes  73.5 Mbits/sec   57   22.6 KBytes       
[  6]   5.00-6.00   sec  6.28 MBytes  52.6 Mbits/sec   80   38.2 KBytes       
[  9]   5.00-6.00   sec  6.28 MBytes  52.6 Mbits/sec   90   7.07 KBytes       
[SUM]   5.00-6.00   sec  21.3 MBytes   179 Mbits/sec  227             
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   6.00-7.00   sec  7.33 MBytes  61.5 Mbits/sec   72   18.4 KBytes       
[  6]   6.00-7.00   sec  7.02 MBytes  58.9 Mbits/sec   66   35.4 KBytes       
[  9]   6.00-7.00   sec  6.77 MBytes  56.8 Mbits/sec   67   17.0 KBytes       
[SUM]   6.00-7.00   sec  21.1 MBytes   177 Mbits/sec  205             
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   7.00-8.00   sec  8.45 MBytes  70.9 Mbits/sec   72   25.5 KBytes       
[  6]   7.00-8.00   sec  6.71 MBytes  56.3 Mbits/sec   82   35.4 KBytes       
[  9]   7.00-8.00   sec  5.90 MBytes  49.5 Mbits/sec   74   17.0 KBytes       
[SUM]   7.00-8.00   sec  21.1 MBytes   177 Mbits/sec  228             
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   8.00-9.00   sec  6.46 MBytes  54.2 Mbits/sec   77   36.8 KBytes       
[  6]   8.00-9.00   sec  6.90 MBytes  57.9 Mbits/sec   78   11.3 KBytes       
[  9]   8.00-9.00   sec  7.89 MBytes  66.2 Mbits/sec   68   11.3 KBytes       
[SUM]   8.00-9.00   sec  21.3 MBytes   178 Mbits/sec  223             
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   9.00-10.00  sec  6.59 MBytes  55.3 Mbits/sec   79   38.2 KBytes       
[  6]   9.00-10.00  sec  8.76 MBytes  73.5 Mbits/sec   58   24.0 KBytes       
[  9]   9.00-10.00  sec  5.72 MBytes  48.0 Mbits/sec   77   7.07 KBytes       
[SUM]   9.00-10.00  sec  21.1 MBytes   177 Mbits/sec  214             
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  72.4 MBytes  60.7 Mbits/sec  738             sender
[  4]   0.00-10.00  sec  72.0 MBytes  60.4 Mbits/sec                  receiver
[  6]   0.00-10.00  sec  73.5 MBytes  61.7 Mbits/sec  744             sender
[  6]   0.00-10.00  sec  73.2 MBytes  61.4 Mbits/sec                  receiver
[  9]   0.00-10.00  sec  66.0 MBytes  55.4 Mbits/sec  750             sender
[  9]   0.00-10.00  sec  65.6 MBytes  55.1 Mbits/sec                  receiver
[SUM]   0.00-10.00  sec   212 MBytes   178 Mbits/sec  2232             sender
[SUM]   0.00-10.00  sec   211 MBytes   177 Mbits/sec                  receiver

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -P3 -R
Connecting to host 10.0.0.80, port 5201
Reverse mode, remote host 10.0.0.80 is sending
[  4] local 10.0.0.1 port 52178 connected to 10.0.0.80 port 5201
[  6] local 10.0.0.1 port 52180 connected to 10.0.0.80 port 5201
[  9] local 10.0.0.1 port 52182 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-1.00   sec  4.03 MBytes  33.8 Mbits/sec                  
[  6]   0.00-1.00   sec  2.81 MBytes  23.6 Mbits/sec                  
[  9]   0.00-1.00   sec  2.79 MBytes  23.4 Mbits/sec                  
[SUM]   0.00-1.00   sec  9.63 MBytes  80.8 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   1.00-2.00   sec  3.25 MBytes  27.3 Mbits/sec                  
[  6]   1.00-2.00   sec  3.25 MBytes  27.3 Mbits/sec                  
[  9]   1.00-2.00   sec  3.22 MBytes  27.0 Mbits/sec                  
[SUM]   1.00-2.00   sec  9.72 MBytes  81.5 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   2.00-3.00   sec  3.25 MBytes  27.3 Mbits/sec                  
[  6]   2.00-3.00   sec  3.25 MBytes  27.3 Mbits/sec                  
[  9]   2.00-3.00   sec  3.30 MBytes  27.6 Mbits/sec                  
[SUM]   2.00-3.00   sec  9.80 MBytes  82.2 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   3.00-4.00   sec  3.25 MBytes  27.3 Mbits/sec                  
[  6]   3.00-4.00   sec  3.12 MBytes  26.2 Mbits/sec                  
[  9]   3.00-4.00   sec  3.19 MBytes  26.8 Mbits/sec                  
[SUM]   3.00-4.00   sec  9.57 MBytes  80.2 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   4.00-5.00   sec  2.22 MBytes  18.6 Mbits/sec                  
[  6]   4.00-5.00   sec  2.38 MBytes  19.9 Mbits/sec                  
[  9]   4.00-5.00   sec  2.28 MBytes  19.2 Mbits/sec                  
[SUM]   4.00-5.00   sec  6.88 MBytes  57.7 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   5.00-6.00   sec  3.30 MBytes  27.7 Mbits/sec                  
[  6]   5.00-6.00   sec  3.37 MBytes  28.3 Mbits/sec                  
[  9]   5.00-6.00   sec  3.18 MBytes  26.7 Mbits/sec                  
[SUM]   5.00-6.00   sec  9.85 MBytes  82.6 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   6.00-7.00   sec  2.99 MBytes  25.1 Mbits/sec                  
[  6]   6.00-7.00   sec  2.88 MBytes  24.1 Mbits/sec                  
[  9]   6.00-7.00   sec  3.00 MBytes  25.2 Mbits/sec                  
[SUM]   6.00-7.00   sec  8.87 MBytes  74.4 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   7.00-8.00   sec  3.14 MBytes  26.3 Mbits/sec                  
[  6]   7.00-8.00   sec  3.25 MBytes  27.3 Mbits/sec                  
[  9]   7.00-8.00   sec  3.25 MBytes  27.3 Mbits/sec                  
[SUM]   7.00-8.00   sec  9.64 MBytes  80.9 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   8.00-9.00   sec  3.25 MBytes  27.2 Mbits/sec                  
[  6]   8.00-9.00   sec  3.25 MBytes  27.3 Mbits/sec                  
[  9]   8.00-9.00   sec  3.16 MBytes  26.5 Mbits/sec                  
[SUM]   8.00-9.00   sec  9.65 MBytes  81.0 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   9.00-10.00  sec  3.25 MBytes  27.3 Mbits/sec                  
[  6]   9.00-10.00  sec  3.21 MBytes  26.9 Mbits/sec                  
[  9]   9.00-10.00  sec  3.22 MBytes  27.0 Mbits/sec                  
[SUM]   9.00-10.00  sec  9.68 MBytes  81.2 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  32.2 MBytes  27.0 Mbits/sec    0             sender
[  4]   0.00-10.00  sec  32.2 MBytes  27.0 Mbits/sec                  receiver
[  6]   0.00-10.00  sec  31.1 MBytes  26.1 Mbits/sec    0             sender
[  6]   0.00-10.00  sec  31.1 MBytes  26.1 Mbits/sec                  receiver
[  9]   0.00-10.00  sec  30.9 MBytes  25.9 Mbits/sec    0             sender
[  9]   0.00-10.00  sec  30.9 MBytes  25.9 Mbits/sec                  receiver
[SUM]   0.00-10.00  sec  94.2 MBytes  79.0 Mbits/sec    0             sender
[SUM]   0.00-10.00  sec  94.2 MBytes  79.0 Mbits/sec                  receiver

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -P3 -u -b 800M
Connecting to host 10.0.0.80, port 5201
[  4] local 10.0.0.1 port 36791 connected to 10.0.0.80 port 5201
[  6] local 10.0.0.1 port 51969 connected to 10.0.0.80 port 5201
[  9] local 10.0.0.1 port 39473 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth       Total Datagrams
[  4]   0.00-1.00   sec  38.1 MBytes   319 Mbits/sec  4871  
[  6]   0.00-1.00   sec  38.1 MBytes   319 Mbits/sec  4871  
[  9]   0.00-1.00   sec  38.1 MBytes   319 Mbits/sec  4871  
[SUM]   0.00-1.00   sec   114 MBytes   958 Mbits/sec  14613  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   1.00-2.00   sec  38.1 MBytes   319 Mbits/sec  4873  
[  6]   1.00-2.00   sec  38.1 MBytes   319 Mbits/sec  4873  
[  9]   1.00-2.00   sec  38.1 MBytes   319 Mbits/sec  4873  
[SUM]   1.00-2.00   sec   114 MBytes   958 Mbits/sec  14619  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   2.00-3.00   sec  38.1 MBytes   319 Mbits/sec  4875  
[  6]   2.00-3.00   sec  38.1 MBytes   319 Mbits/sec  4875  
[  9]   2.00-3.00   sec  38.1 MBytes   319 Mbits/sec  4875  
[SUM]   2.00-3.00   sec   114 MBytes   958 Mbits/sec  14625  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   3.00-4.00   sec  38.1 MBytes   319 Mbits/sec  4874  
[  6]   3.00-4.00   sec  38.1 MBytes   319 Mbits/sec  4874  
[  9]   3.00-4.00   sec  38.1 MBytes   319 Mbits/sec  4874  
[SUM]   3.00-4.00   sec   114 MBytes   958 Mbits/sec  14622  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   4.00-5.00   sec  38.0 MBytes   319 Mbits/sec  4864  
[  6]   4.00-5.00   sec  38.0 MBytes   319 Mbits/sec  4864  
[  9]   4.00-5.00   sec  38.0 MBytes   319 Mbits/sec  4864  
[SUM]   4.00-5.00   sec   114 MBytes   956 Mbits/sec  14592  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   5.00-6.00   sec  38.1 MBytes   319 Mbits/sec  4875  
[  6]   5.00-6.00   sec  38.1 MBytes   319 Mbits/sec  4875  
[  9]   5.00-6.00   sec  38.1 MBytes   319 Mbits/sec  4875  
[SUM]   5.00-6.00   sec   114 MBytes   958 Mbits/sec  14625  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   6.00-7.00   sec  38.1 MBytes   319 Mbits/sec  4873  
[  6]   6.00-7.00   sec  38.1 MBytes   319 Mbits/sec  4873  
[  9]   6.00-7.00   sec  38.1 MBytes   319 Mbits/sec  4873  
[SUM]   6.00-7.00   sec   114 MBytes   958 Mbits/sec  14619  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   7.00-8.00   sec  38.1 MBytes   319 Mbits/sec  4876  
[  6]   7.00-8.00   sec  38.1 MBytes   319 Mbits/sec  4876  
[  9]   7.00-8.00   sec  38.1 MBytes   319 Mbits/sec  4876  
[SUM]   7.00-8.00   sec   114 MBytes   958 Mbits/sec  14628  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   8.00-9.00   sec  38.1 MBytes   319 Mbits/sec  4874  
[  6]   8.00-9.00   sec  38.1 MBytes   319 Mbits/sec  4874  
[  9]   8.00-9.00   sec  38.1 MBytes   319 Mbits/sec  4874  
[SUM]   8.00-9.00   sec   114 MBytes   958 Mbits/sec  14622  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   9.00-10.00  sec  37.9 MBytes   318 Mbits/sec  4856  
[  6]   9.00-10.00  sec  37.9 MBytes   318 Mbits/sec  4856  
[  9]   9.00-10.00  sec  37.9 MBytes   318 Mbits/sec  4856  
[SUM]   9.00-10.00  sec   114 MBytes   955 Mbits/sec  14568  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total 
Datagrams
[  4]   0.00-10.00  sec   381 MBytes   319 Mbits/sec  9052841.391 ms  0/3 (0%)  
[  4] Sent 3 datagrams
[  6]   0.00-10.00  sec   381 MBytes   319 Mbits/sec  9052841.281 ms  0/3 (0%)  
[  6] Sent 3 datagrams
[  9]   0.00-10.00  sec   381 MBytes   319 Mbits/sec  9052841.181 ms  0/3 (0%)  
[  9] Sent 3 datagrams
[SUM]   0.00-10.00  sec  1.11 GBytes   958 Mbits/sec  9052841.285 ms  0/9 (0%)  

iperf Done.
+ sleep 10
+ iperf3 -c 10.0.0.80 -P3 -R -u -b 800M
Connecting to host 10.0.0.80, port 5201
Reverse mode, remote host 10.0.0.80 is sending
[  4] local 10.0.0.1 port 43263 connected to 10.0.0.80 port 5201
[  6] local 10.0.0.1 port 49331 connected to 10.0.0.80 port 5201
[  9] local 10.0.0.1 port 60542 connected to 10.0.0.80 port 5201
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total 
Datagrams
[  4]   0.00-1.00   sec  4.92 MBytes  41.3 Mbits/sec  0.156 ms  0/630 (0%)  
[  6]   0.00-1.00   sec  4.92 MBytes  41.3 Mbits/sec  0.170 ms  0/630 (0%)  
[  9]   0.00-1.00   sec  4.91 MBytes  41.2 Mbits/sec  0.237 ms  0/629 (0%)  
[SUM]   0.00-1.00   sec  14.8 MBytes   124 Mbits/sec  0.188 ms  0/1889 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   1.00-2.00   sec  4.92 MBytes  41.3 Mbits/sec  0.173 ms  0/630 (0%)  
[  6]   1.00-2.00   sec  4.91 MBytes  41.2 Mbits/sec  0.191 ms  0/629 (0%)  
[  9]   1.00-2.00   sec  4.91 MBytes  41.2 Mbits/sec  0.192 ms  0/629 (0%)  
[SUM]   1.00-2.00   sec  14.8 MBytes   124 Mbits/sec  0.185 ms  0/1888 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   2.00-3.00   sec  4.96 MBytes  41.6 Mbits/sec  0.246 ms  0/635 (0%)  
[  6]   2.00-3.00   sec  4.97 MBytes  41.7 Mbits/sec  0.167 ms  0/636 (0%)  
[  9]   2.00-3.00   sec  4.95 MBytes  41.5 Mbits/sec  0.232 ms  0/634 (0%)  
[SUM]   2.00-3.00   sec  14.9 MBytes   125 Mbits/sec  0.215 ms  0/1905 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   3.00-4.00   sec  4.97 MBytes  41.7 Mbits/sec  0.189 ms  0/636 (0%)  
[  6]   3.00-4.00   sec  4.96 MBytes  41.6 Mbits/sec  0.121 ms  0/635 (0%)  
[  9]   3.00-4.00   sec  4.97 MBytes  41.7 Mbits/sec  0.195 ms  0/636 (0%)  
[SUM]   3.00-4.00   sec  14.9 MBytes   125 Mbits/sec  0.168 ms  0/1907 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   4.00-5.00   sec  4.97 MBytes  41.7 Mbits/sec  0.180 ms  0/636 (0%)  
[  6]   4.00-5.00   sec  4.97 MBytes  41.7 Mbits/sec  0.185 ms  0/636 (0%)  
[  9]   4.00-5.00   sec  4.96 MBytes  41.6 Mbits/sec  0.132 ms  0/635 (0%)  
[SUM]   4.00-5.00   sec  14.9 MBytes   125 Mbits/sec  0.166 ms  0/1907 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   5.00-6.00   sec  4.97 MBytes  41.7 Mbits/sec  0.178 ms  0/636 (0%)  
[  6]   5.00-6.00   sec  4.97 MBytes  41.7 Mbits/sec  0.209 ms  0/636 (0%)  
[  9]   5.00-6.00   sec  4.97 MBytes  41.7 Mbits/sec  0.167 ms  0/636 (0%)  
[SUM]   5.00-6.00   sec  14.9 MBytes   125 Mbits/sec  0.185 ms  0/1908 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   6.00-7.00   sec  4.91 MBytes  41.2 Mbits/sec  0.141 ms  0/628 (0%)  
[  6]   6.00-7.00   sec  4.91 MBytes  41.2 Mbits/sec  0.211 ms  0/628 (0%)  
[  9]   6.00-7.00   sec  4.91 MBytes  41.2 Mbits/sec  0.152 ms  0/629 (0%)  
[SUM]   6.00-7.00   sec  14.7 MBytes   124 Mbits/sec  0.168 ms  0/1885 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   7.00-8.00   sec  4.92 MBytes  41.3 Mbits/sec  0.290 ms  0/630 (0%)  
[  6]   7.00-8.00   sec  4.91 MBytes  41.2 Mbits/sec  0.167 ms  0/629 (0%)  
[  9]   7.00-8.00   sec  4.91 MBytes  41.2 Mbits/sec  0.367 ms  0/629 (0%)  
[SUM]   7.00-8.00   sec  14.8 MBytes   124 Mbits/sec  0.275 ms  0/1888 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   8.00-9.00   sec  4.93 MBytes  41.4 Mbits/sec  0.147 ms  0/631 (0%)  
[  6]   8.00-9.00   sec  4.91 MBytes  41.2 Mbits/sec  0.170 ms  0/628 (0%)  
[  9]   8.00-9.00   sec  4.91 MBytes  41.2 Mbits/sec  0.137 ms  0/628 (0%)  
[SUM]   8.00-9.00   sec  14.7 MBytes   124 Mbits/sec  0.151 ms  0/1887 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  4]   9.00-10.00  sec  4.97 MBytes  41.7 Mbits/sec  0.215 ms  0/636 (0%)  
[  6]   9.00-10.00  sec  4.98 MBytes  41.7 Mbits/sec  0.150 ms  0/637 (0%)  
[  9]   9.00-10.00  sec  4.96 MBytes  41.6 Mbits/sec  0.272 ms  0/635 (0%)  
[SUM]   9.00-10.00  sec  14.9 MBytes   125 Mbits/sec  0.212 ms  0/1908 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total 
Datagrams
[  4]   0.00-10.00  sec  49.5 MBytes  41.5 Mbits/sec  0.227 ms  0/6335 (0%)  
[  4] Sent 6335 datagrams
[  6]   0.00-10.00  sec  49.5 MBytes  41.5 Mbits/sec  0.183 ms  0/6331 (0%)  
[  6] Sent 6331 datagrams
[  9]   0.00-10.00  sec  49.4 MBytes  41.5 Mbits/sec  0.261 ms  0/6327 (0%)  
[  9] Sent 6327 datagrams
[SUM]   0.00-10.00  sec   148 MBytes   124 Mbits/sec  0.224 ms  0/18993 (0%)  

iperf Done.

Attachment: run.sh
Description: application/shellscript

diff -aurN a/arch/mips/include/asm/mach-lantiq/xway/xway_dma.h b/arch/mips/include/asm/mach-lantiq/xway/xway_dma.h
--- a/arch/mips/include/asm/mach-lantiq/xway/xway_dma.h	2019-01-26 09:37:07.000000000 +0100
+++ b/arch/mips/include/asm/mach-lantiq/xway/xway_dma.h	2019-02-13 23:17:07.560073774 +0100
@@ -19,7 +19,7 @@
 #define LTQ_DMA_H__
 
 #define LTQ_DESC_SIZE		0x08	/* each descriptor is 64bit */
-#define LTQ_DESC_NUM		0x40	/* 64 descriptors / channel */
+#define LTQ_DESC_NUM		0x80	/* 128 descriptors / channel */
 
 #define LTQ_DMA_OWN		BIT(31) /* owner bit */
 #define LTQ_DMA_C		BIT(30) /* complete bit */
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to