2
0

0710-v5.16-net-lantiq-configure-the-burst-length-in-ethernet-dr.patch 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. From 14d4e308e0aa0b78dc7a059716861a4380de3535 Mon Sep 17 00:00:00 2001
  2. From: Aleksander Jan Bajkowski <[email protected]>
  3. Date: Tue, 14 Sep 2021 23:21:02 +0200
  4. Subject: [PATCH 5/5] net: lantiq: configure the burst length in ethernet
  5. drivers
  6. Configure the burst length in Ethernet drivers. This improves
  7. Ethernet performance by 58%. According to the vendor BSP,
  8. 8W burst length is supported by ar9 and newer SoCs.
  9. The NAT benchmark results on xRX200 (Down/Up):
  10. * 2W: 330 Mb/s
  11. * 4W: 432 Mb/s 372 Mb/s
  12. * 8W: 520 Mb/s 389 Mb/s
  13. Tested on xRX200 and xRX330.
  14. Signed-off-by: Aleksander Jan Bajkowski <[email protected]>
  15. Signed-off-by: David S. Miller <[email protected]>
  16. ---
  17. drivers/net/ethernet/lantiq_etop.c | 21 ++++++++++++++++++---
  18. drivers/net/ethernet/lantiq_xrx200.c | 21 ++++++++++++++++++---
  19. 2 files changed, 36 insertions(+), 6 deletions(-)
  20. --- a/drivers/net/ethernet/lantiq_etop.c
  21. +++ b/drivers/net/ethernet/lantiq_etop.c
  22. @@ -148,6 +148,9 @@ struct ltq_etop_priv {
  23. struct ltq_etop_chan txch;
  24. struct ltq_etop_chan rxch;
  25. + int tx_burst_len;
  26. + int rx_burst_len;
  27. +
  28. int tx_irq;
  29. int rx_irq;
  30. @@ -399,7 +402,7 @@ ltq_etop_dma_init(struct net_device *dev
  31. int rx = priv->rx_irq - LTQ_DMA_ETOP;
  32. int err;
  33. - ltq_dma_init_port(DMA_PORT_ETOP);
  34. + ltq_dma_init_port(DMA_PORT_ETOP, priv->tx_burst_len, rx_burst_len);
  35. priv->txch.dma.nr = tx;
  36. priv->txch.dma.dev = &priv->pdev->dev;
  37. @@ -676,8 +679,8 @@ ltq_etop_tx(struct sk_buff *skb, struct
  38. return NETDEV_TX_BUSY;
  39. }
  40. - /* dma needs to start on a 16 byte aligned address */
  41. - byte_offset = CPHYSADDR(skb->data) % 16;
  42. + /* dma needs to start on a burst length value aligned address */
  43. + byte_offset = CPHYSADDR(skb->data) % (priv->tx_burst_len * 4);
  44. priv->txch.skb[priv->txch.dma.desc] = skb;
  45. netif_trans_update(dev);
  46. @@ -925,6 +928,18 @@ static int ltq_etop_probe(struct platfor
  47. spin_lock_init(&priv->lock);
  48. SET_NETDEV_DEV(dev, &pdev->dev);
  49. + err = device_property_read_u32(&pdev->dev, "lantiq,tx-burst-length", &priv->tx_burst_len);
  50. + if (err < 0) {
  51. + dev_err(&pdev->dev, "unable to read tx-burst-length property\n");
  52. + return err;
  53. + }
  54. +
  55. + err = device_property_read_u32(&pdev->dev, "lantiq,rx-burst-length", &priv->rx_burst_len);
  56. + if (err < 0) {
  57. + dev_err(&pdev->dev, "unable to read rx-burst-length property\n");
  58. + return err;
  59. + }
  60. +
  61. netif_napi_add(dev, &priv->txch.napi, ltq_etop_poll_tx, 8);
  62. netif_napi_add(dev, &priv->rxch.napi, ltq_etop_poll_rx, 32);
  63. priv->txch.netdev = dev;
  64. --- a/drivers/net/ethernet/lantiq_xrx200.c
  65. +++ b/drivers/net/ethernet/lantiq_xrx200.c
  66. @@ -81,6 +81,9 @@ struct xrx200_priv {
  67. struct net_device *net_dev;
  68. struct device *dev;
  69. + int tx_burst_len;
  70. + int rx_burst_len;
  71. +
  72. __iomem void *pmac_reg;
  73. };
  74. @@ -363,8 +366,8 @@ static netdev_tx_t xrx200_start_xmit(str
  75. if (unlikely(dma_mapping_error(priv->dev, mapping)))
  76. goto err_drop;
  77. - /* dma needs to start on a 16 byte aligned address */
  78. - byte_offset = mapping % 16;
  79. + /* dma needs to start on a burst length value aligned address */
  80. + byte_offset = mapping % (priv->tx_burst_len * 4);
  81. desc->addr = mapping - byte_offset;
  82. /* Make sure the address is written before we give it to HW */
  83. @@ -465,7 +468,7 @@ static int xrx200_dma_init(struct xrx200
  84. int ret = 0;
  85. int i;
  86. - ltq_dma_init_port(DMA_PORT_ETOP);
  87. + ltq_dma_init_port(DMA_PORT_ETOP, priv->tx_burst_len, rx_burst_len);
  88. ch_rx->dma.nr = XRX200_DMA_RX;
  89. ch_rx->dma.dev = priv->dev;
  90. @@ -584,6 +587,18 @@ static int xrx200_probe(struct platform_
  91. if (err)
  92. eth_hw_addr_random(net_dev);
  93. + err = device_property_read_u32(dev, "lantiq,tx-burst-length", &priv->tx_burst_len);
  94. + if (err < 0) {
  95. + dev_err(dev, "unable to read tx-burst-length property\n");
  96. + return err;
  97. + }
  98. +
  99. + err = device_property_read_u32(dev, "lantiq,rx-burst-length", &priv->rx_burst_len);
  100. + if (err < 0) {
  101. + dev_err(dev, "unable to read rx-burst-length property\n");
  102. + return err;
  103. + }
  104. +
  105. /* bring up the dma engine and IP core */
  106. err = xrx200_dma_init(priv);
  107. if (err)