On 2015-06-02 15:06, michael lee wrote:
> use pktgen to verify on rt3662. can improve transmit rate.
> pkt_size 1500
> burst 1 : 807Mb/sec
> burst 8 : 984Mb/sec
> 
> pkt_size 60
> burst 1 : 57Mb/sec
> burst 8 : 236Mb/sec
> 
> Signed-off-by: michael lee <igv...@gmail.com>
> ---
>  .../drivers/net/ethernet/ralink/ralink_soc_eth.c   | 51 
> +++++++++++++---------
>  .../drivers/net/ethernet/ralink/ralink_soc_eth.h   |  2 +
>  2 files changed, 33 insertions(+), 20 deletions(-)
> 
> diff --git 
> a/target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_soc_eth.c 
> b/target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_soc_eth.c
> index b2304bb..4b39825 100644
> --- a/target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_soc_eth.c
> +++ b/target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_soc_eth.c
> @@ -337,6 +337,8 @@ static int fe_alloc_tx(struct fe_priv *priv)
>       struct fe_tx_ring *ring = &priv->tx_ring;
>  
>       ring->tx_free_idx = 0;
> +     ring->tx_next_idx = 0;
> +     ring->tx_thresh = max((unsigned long)ring->tx_ring_size >> 2, 
> MAX_SKB_FRAGS);
>  
>       ring->tx_buf = kcalloc(ring->tx_ring_size, sizeof(*ring->tx_buf),
>                       GFP_KERNEL);
> @@ -525,8 +527,16 @@ static int fe_vlan_rx_kill_vid(struct net_device *dev,
>       return 0;
>  }
>  
> +static inline u32 fe_empty_txd(struct fe_tx_ring *ring)
> +{
> +     barrier();
What is this barrier for?

> +     return (u32)(ring->tx_ring_size -
> +                     ((ring->tx_next_idx - ring->tx_free_idx) &
> +                      (ring->tx_ring_size - 1)));
> +}
> +
>  static int fe_tx_map_dma(struct sk_buff *skb, struct net_device *dev,
> -             int idx, int tx_num, struct fe_tx_ring *ring)
> +             int tx_num, struct fe_tx_ring *ring)
>  {
>       struct fe_priv *priv = netdev_priv(dev);
>       struct skb_frag_struct *frag;
> @@ -649,14 +659,22 @@ static int fe_tx_map_dma(struct sk_buff *skb, struct 
> net_device *dev,
>       netdev_sent_queue(dev, skb->len);
>       skb_tx_timestamp(skb);
>  
> -     j = NEXT_TX_DESP_IDX(j);
> +     ring->tx_next_idx = NEXT_TX_DESP_IDX(j);
>       wmb();
> -     fe_reg_w32(j, FE_REG_TX_CTX_IDX0);
> +     if (unlikely(fe_empty_txd(ring) <= ring->tx_thresh)) {
> +             netif_stop_queue(dev);
> +             smp_mb();
> +             if (unlikely(fe_empty_txd(ring) > ring->tx_thresh))
> +                     netif_wake_queue(dev);
Why do that queue wake check here, when it's already being done during
tx cleanup.

> +     }
> +
> +     if (netif_xmit_stopped(netdev_get_tx_queue(dev, 0)) || !skb->xmit_more)
> +             fe_reg_w32(ring->tx_next_idx, FE_REG_TX_CTX_IDX0);
>  
>       return 0;
>  
>  err_dma:
> -     j = idx;
> +     j = ring->tx_next_idx;
>       for (i = 0; i < tx_num; i++) {
>               ptxd = &ring->tx_dma[j];
>               tx_buf = &ring->tx_buf[j];

- Felix
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to