I had to revert this commit in order to get RT5350 working again. Any ideas why this change impacts Ethernet on the RT5350?
commit b4fc4053d63294afbf77d1985b44a778d03af6c4 Author: blogic <blogic@3c298f89-4303-0410-b956-a3cf2f4a3e73> Date: Mon Dec 9 17:29:29 2013 +0000 ralink: add TSO Signed-off-by: John Crispin <blo...@openwrt.org> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@39019 3c298f89-4303-0410-b956-a3cf2f4a3e73 -- Jon Smirl jonsm...@gmail.com
--- a/drivers/net/ethernet/ralink/ralink_soc_eth.c +++ b/drivers/net/ethernet/ralink/ralink_soc_eth.c @@ -37,9 +37,8 @@ #include "esw_rt3052.h" #include "mdio.h" -#define TX_TIMEOUT (2 * HZ) +#define TX_TIMEOUT (20 * HZ / 100) #define MAX_RX_LENGTH 1536 -#define DMA_DUMMY_DESC 0xffffffff static const u32 fe_reg_table_default[FE_REG_COUNT] = { [FE_REG_PDMA_GLO_CFG] = FE_PDMA_GLO_CFG, @@ -240,41 +239,12 @@ static void fe_free_dma(struct fe_priv * netdev_reset_queue(priv->netdev); } -static void fe_start_tso(struct sk_buff *skb, struct net_device *dev, unsigned int nr_frags, int idx) -{ - struct fe_priv *priv = netdev_priv(dev); - struct skb_frag_struct *frag; - int i; - - for (i = 0; i < nr_frags; i++) { - dma_addr_t mapped_addr; - - frag = &skb_shinfo(skb)->frags[i]; - mapped_addr = skb_frag_dma_map(&dev->dev, frag, 0, skb_frag_size(frag), DMA_TO_DEVICE); - if (i % 2) { - idx = (idx + 1) % NUM_DMA_DESC; - priv->tx_dma[idx].txd1 = mapped_addr; - if (i == nr_frags - 1) - priv->tx_dma[idx].txd2 = TX_DMA_LSO | TX_DMA_PLEN0(frag->size); - else - priv->tx_dma[idx].txd2 = TX_DMA_PLEN0(frag->size); - } else { - priv->tx_dma[idx].txd3 = mapped_addr; - if (i == nr_frags - 1) - priv->tx_dma[idx].txd2 |= TX_DMA_LS1 | TX_DMA_PLEN1(frag->size); - else - priv->tx_dma[idx].txd2 |= TX_DMA_PLEN1(frag->size); - } - } -} - static int fe_start_xmit(struct sk_buff *skb, struct net_device *dev) { - unsigned int nr_frags = skb_shinfo(skb)->nr_frags; struct fe_priv *priv = netdev_priv(dev); dma_addr_t mapped_addr; - u32 tx_next, tx, tx_num = 1; - int i; + u32 tx_next; + u32 tx; if (priv->soc->min_pkt_len) { if (skb->len < priv->soc->min_pkt_len) { @@ -295,9 +265,8 @@ static int fe_start_xmit(struct sk_buff spin_lock(&priv->page_lock); tx = fe_reg_r32(FE_REG_TX_CTX_IDX0); - if (priv->soc->tso && nr_frags) - tx_num += nr_frags >> 1; - tx_next = (tx + tx_num) % NUM_DMA_DESC; + tx_next = (tx + 1) % NUM_DMA_DESC; + if ((priv->tx_skb[tx]) || (priv->tx_skb[tx_next]) || !(priv->tx_dma[tx].txd2 & TX_DMA_DONE) || !(priv->tx_dma[tx_next].txd2 & TX_DMA_DONE)) @@ -309,15 +278,7 @@ static int fe_start_xmit(struct sk_buff return NETDEV_TX_OK; } - if (priv->soc->tso) { - int t = tx_num; - - priv->tx_skb[(tx + t - 1) % NUM_DMA_DESC] = skb; - while (--t) - priv->tx_skb[(tx + t - 1) % NUM_DMA_DESC] = (struct sk_buff *) DMA_DUMMY_DESC; - } else { - priv->tx_skb[tx] = skb; - } + priv->tx_skb[tx] = skb; priv->tx_dma[tx].txd1 = (unsigned int) mapped_addr; wmb(); @@ -332,36 +293,9 @@ static int fe_start_xmit(struct sk_buff else priv->tx_dma[tx].txd4 &= ~TX_DMA_CHKSUM; - if (priv->soc->tso) - fe_start_tso(skb, dev, nr_frags, tx); - - if (skb_shinfo(skb)->gso_segs > 1) { - struct iphdr *iph = NULL; - struct tcphdr *th = NULL; - struct ipv6hdr *ip6h = NULL; - - ip6h = (struct ipv6hdr *) skb_network_header(skb); - iph = (struct iphdr *) skb_network_header(skb); - if ((iph->version == 4) && (iph->protocol == IPPROTO_TCP)) { - th = (struct tcphdr *)skb_transport_header(skb); - priv->tx_dma[tx].txd4 |= BIT(28); - th->check = htons(skb_shinfo(skb)->gso_size); - dma_cache_sync(NULL, th, sizeof(struct tcphdr), DMA_TO_DEVICE); - } else if ((ip6h->version == 6) && (ip6h->nexthdr == NEXTHDR_TCP)) { - th = (struct tcphdr *)skb_transport_header(skb); - priv->tx_dma[tx].txd4 |= BIT(28); - th->check = htons(skb_shinfo(skb)->gso_size); - dma_cache_sync(NULL, th, sizeof(struct tcphdr), DMA_TO_DEVICE); - } - } - - for (i = 0; i < tx_num; i++) - dma_cache_sync(NULL, &priv->tx_dma[tx + i], sizeof(struct fe_tx_dma), DMA_TO_DEVICE); - dev->stats.tx_packets++; dev->stats.tx_bytes += skb->len; - wmb(); fe_reg_w32(tx_next, FE_REG_TX_CTX_IDX0); netdev_sent_queue(dev, skb->len); @@ -459,11 +393,10 @@ static void fe_tx_housekeeping(unsigned if (!(txd->txd2 & TX_DMA_DONE) || !(priv->tx_skb[priv->tx_free_idx])) break; - if (priv->tx_skb[priv->tx_free_idx] != (struct sk_buff *) DMA_DUMMY_DESC) { - bytes_compl += priv->tx_skb[priv->tx_free_idx]->len; - dev_kfree_skb_irq(priv->tx_skb[priv->tx_free_idx]); - } + bytes_compl += priv->tx_skb[priv->tx_free_idx]->len; pkts_compl++; + + dev_kfree_skb_irq(priv->tx_skb[priv->tx_free_idx]); priv->tx_skb[priv->tx_free_idx] = NULL; priv->tx_free_idx++; if (priv->tx_free_idx >= NUM_DMA_DESC) @@ -712,9 +645,6 @@ static int fe_probe(struct platform_devi match = of_match_device(of_fe_match, &pdev->dev); soc = (struct fe_soc_data *) match->data; - - if (soc->init_data) - soc->init_data(soc); if (soc->reg_table) fe_reg_table = soc->reg_table; @@ -737,13 +667,6 @@ static int fe_probe(struct platform_devi if (fe_reg_table[FE_REG_FE_DMA_VID_BASE]) netdev->features |= NETIF_F_HW_VLAN_CTAG_TX; - if (soc->tso) { - dev_info(&pdev->dev, "Enabling TSO\n"); - netdev->features |= NETIF_F_SG | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_IPV6_CSUM; - } - - netdev->hw_features = netdev->vlan_features = netdev->features; - netdev->irq = platform_get_irq(pdev, 0); if (netdev->irq < 0) { dev_err(&pdev->dev, "no IRQ resource found\n"); --- a/drivers/net/ethernet/ralink/ralink_soc_eth.h +++ b/drivers/net/ethernet/ralink/ralink_soc_eth.h @@ -279,8 +279,6 @@ struct fe_rx_dma { #define TX_DMA_PLEN0_MASK ((0x3fff) << 16) #define TX_DMA_PLEN0(_x) (((_x) & 0x3fff) << 16) -#define TX_DMA_PLEN1(_x) ((_x) & 0x3fff) -#define TX_DMA_LS1 BIT(14) #define TX_DMA_LSO BIT(30) #define TX_DMA_DONE BIT(31) #define TX_DMA_QN(_x) ((_x) << 16) @@ -319,7 +317,6 @@ struct fe_soc_data unsigned char mac[6]; const u32 *reg_table; - void (*init_data)(struct fe_soc_data *data); void (*reset_fe)(void); void (*set_mac)(struct fe_priv *priv, unsigned char *mac); void (*fwd_config)(struct fe_priv *priv); @@ -341,7 +338,6 @@ struct fe_soc_data u32 rx_dly_int; u32 tx_dly_int; u32 checksum_bit; - u32 tso; int min_pkt_len; }; --- a/drivers/net/ethernet/ralink/soc_mt7620.c +++ b/drivers/net/ethernet/ralink/soc_mt7620.c @@ -21,7 +21,6 @@ #include <asm/mach-ralink/ralink_regs.h> -#include <mt7620.h> #include "ralink_soc_eth.h" #include "gsw_mt7620a.h" @@ -79,20 +78,10 @@ static void mt7620_fwd_config(struct fe_ static void mt7620_tx_dma(struct fe_priv *priv, int idx, struct sk_buff *skb) { - unsigned int nr_frags = 0; - unsigned int len = 0; - - if (skb) { - nr_frags = skb_shinfo(skb)->nr_frags; - len = skb->len - skb->data_len; - } - - if (!skb) - priv->tx_dma[idx].txd2 = TX_DMA_LSO | TX_DMA_DONE; - else if (!nr_frags) - priv->tx_dma[idx].txd2 = TX_DMA_LSO | TX_DMA_PLEN0(len); + if (skb) + priv->tx_dma[idx].txd2 = TX_DMA_LSO | TX_DMA_PLEN0(skb->len); else - priv->tx_dma[idx].txd2 = TX_DMA_PLEN0(len); + priv->tx_dma[idx].txd2 = TX_DMA_LSO | TX_DMA_DONE; if(skb && vlan_tx_tag_present(skb)) priv->tx_dma[idx].txd4 = 0x80 | (vlan_tx_tag_get(skb) >> 13) << 4 | (vlan_tx_tag_get(skb) & 0xF); @@ -132,15 +121,8 @@ mt7620_get_skb_header(struct sk_buff *sk } #endif -static void mt7620_init_data(struct fe_soc_data *data) -{ - if (mt7620_get_eco() >= 5) - data->tso = 1; -} - static struct fe_soc_data mt7620_data = { .mac = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 }, - .init_data = mt7620_init_data, .reset_fe = mt7620_fe_reset, .set_mac = mt7620_set_mac, .fwd_config = mt7620_fwd_config,
_______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel