ramips: switch to linux 4.14
[openwrt/openwrt.git] / target / linux / ramips / files-4.9 / drivers / net / ethernet / mtk / mtk_eth_soc.c
index 3e8768f63ac58ad7f174a75bc992da939486ecc7..d53f6c024edef9180b3db26279f2ec11d93f33be 100644 (file)
@@ -216,7 +216,7 @@ static void fe_clean_rx(struct fe_priv *priv)
                                                         ring->rx_dma[i].rxd1,
                                                         ring->rx_buf_size,
                                                         DMA_FROM_DEVICE);
-                               put_page(virt_to_head_page(ring->rx_data[i]));
+                               skb_free_frag(ring->rx_data[i]);
                        }
 
                kfree(ring->rx_data);
@@ -834,7 +834,7 @@ static int fe_poll_rx(struct napi_struct *napi, int budget,
                        break;
 
                /* alloc new buffer */
-               new_data = netdev_alloc_frag(ring->frag_size);
+               new_data = napi_alloc_frag(ring->frag_size);
                if (unlikely(!new_data)) {
                        stats->rx_dropped++;
                        goto release_desc;
@@ -844,14 +844,14 @@ static int fe_poll_rx(struct napi_struct *napi, int budget,
                                          ring->rx_buf_size,
                                          DMA_FROM_DEVICE);
                if (unlikely(dma_mapping_error(&netdev->dev, dma_addr))) {
-                       put_page(virt_to_head_page(new_data));
+                       skb_free_frag(new_data);
                        goto release_desc;
                }
 
                /* receive data */
                skb = build_skb(data, ring->frag_size);
                if (unlikely(!skb)) {
-                       put_page(virt_to_head_page(new_data));
+                       skb_free_frag(new_data);
                        goto release_desc;
                }
                skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN);
@@ -1003,7 +1003,7 @@ static int fe_poll(struct napi_struct *napi, int budget)
                        goto poll_again;
                }
 
-               napi_complete(napi);
+               napi_complete_done(napi, rx_done);
                fe_int_enable(tx_intr | rx_intr);
        } else {
                rx_done = budget;
@@ -1350,6 +1350,10 @@ static int fe_change_mtu(struct net_device *dev, int new_mtu)
        if (!(priv->flags & FE_FLAG_JUMBO_FRAME))
                return eth_change_mtu(dev, new_mtu);
 
+       if (IS_ENABLED(CONFIG_SOC_MT7621))
+               if (new_mtu > 2048)
+                       return -EINVAL;
+
        frag_size = fe_max_frag_size(new_mtu);
        if (new_mtu < 68 || frag_size > PAGE_SIZE)
                return -EINVAL;
@@ -1373,15 +1377,17 @@ static int fe_change_mtu(struct net_device *dev, int new_mtu)
                return 0;
 
        fe_stop(dev);
-       fwd_cfg = fe_r32(FE_GDMA1_FWD_CFG);
-       if (new_mtu <= ETH_DATA_LEN) {
-               fwd_cfg &= ~FE_GDM1_JMB_EN;
-       } else {
-               fwd_cfg &= ~(FE_GDM1_JMB_LEN_MASK << FE_GDM1_JMB_LEN_SHIFT);
-               fwd_cfg |= (DIV_ROUND_UP(frag_size, 1024) <<
-                               FE_GDM1_JMB_LEN_SHIFT) | FE_GDM1_JMB_EN;
+       if (!IS_ENABLED(CONFIG_SOC_MT7621)) {
+               fwd_cfg = fe_r32(FE_GDMA1_FWD_CFG);
+               if (new_mtu <= ETH_DATA_LEN) {
+                       fwd_cfg &= ~FE_GDM1_JMB_EN;
+               } else {
+                       fwd_cfg &= ~(FE_GDM1_JMB_LEN_MASK << FE_GDM1_JMB_LEN_SHIFT);
+                       fwd_cfg |= (DIV_ROUND_UP(frag_size, 1024) <<
+                       FE_GDM1_JMB_LEN_SHIFT) | FE_GDM1_JMB_EN;
+               }
+               fe_w32(fwd_cfg, FE_GDMA1_FWD_CFG);
        }
-       fe_w32(fwd_cfg, FE_GDMA1_FWD_CFG);
 
        return fe_open(dev);
 }
@@ -1530,7 +1536,7 @@ static int fe_probe(struct platform_device *pdev)
        priv->rx_ring.rx_ring_size = NUM_DMA_DESC;
        INIT_WORK(&priv->pending_work, fe_pending_work);
 
-       napi_weight = 32;
+       napi_weight = 16;
        if (priv->flags & FE_FLAG_NAPI_WEIGHT) {
                napi_weight *= 4;
                priv->tx_ring.tx_ring_size *= 4;