Changeset 37085


Ignore:
Timestamp:
2013-06-29T18:33:28+02:00 (5 years ago)
Author:
blogic
Message:

lantiq: make xrx200 network driver use a tasklet for rx housekeeping

Signed-off-by: John Crispin <blogic@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/lantiq/patches-3.8/0025-NET-MIPS-lantiq-adds-xrx200-net.patch

    r36573 r37085  
    1313 create mode 100644 drivers/net/ethernet/lantiq_xrx200.c 
    1414 
    15 --- a/drivers/net/ethernet/Kconfig 
    16 +++ b/drivers/net/ethernet/Kconfig 
    17 @@ -83,7 +83,13 @@ config LANTIQ_ETOP 
     15Index: linux-3.8.13/drivers/net/ethernet/Kconfig 
     16=================================================================== 
     17--- linux-3.8.13.orig/drivers/net/ethernet/Kconfig      2013-05-11 22:57:46.000000000 +0200 
     18+++ linux-3.8.13/drivers/net/ethernet/Kconfig   2013-06-28 17:46:34.521054618 +0200 
     19@@ -83,7 +83,13 @@ 
    1820        tristate "Lantiq SoC ETOP driver" 
    1921        depends on SOC_TYPE_XWAY 
     
    3032 source "drivers/net/ethernet/marvell/Kconfig" 
    3133 source "drivers/net/ethernet/mellanox/Kconfig" 
    32 --- a/drivers/net/ethernet/Makefile 
    33 +++ b/drivers/net/ethernet/Makefile 
    34 @@ -36,6 +36,7 @@ obj-$(CONFIG_IP1000) += icplus/ 
     34Index: linux-3.8.13/drivers/net/ethernet/Makefile 
     35=================================================================== 
     36--- linux-3.8.13.orig/drivers/net/ethernet/Makefile     2013-05-11 22:57:46.000000000 +0200 
     37+++ linux-3.8.13/drivers/net/ethernet/Makefile  2013-06-28 17:46:34.521054618 +0200 
     38@@ -36,6 +36,7 @@ 
    3539 obj-$(CONFIG_JME) += jme.o 
    3640 obj-$(CONFIG_KORINA) += korina.o 
     
    4044 obj-$(CONFIG_NET_VENDOR_MELLANOX) += mellanox/ 
    4145 obj-$(CONFIG_NET_VENDOR_MICREL) += micrel/ 
    42 --- /dev/null 
    43 +++ b/drivers/net/ethernet/lantiq_pce.h 
     46Index: linux-3.8.13/drivers/net/ethernet/lantiq_pce.h 
     47=================================================================== 
     48--- /dev/null   1970-01-01 00:00:00.000000000 +0000 
     49+++ linux-3.8.13/drivers/net/ethernet/lantiq_pce.h      2013-06-28 17:46:34.525054619 +0200 
    4450@@ -0,0 +1,163 @@ 
    4551+/* 
     
    206212+       MC_ENTRY(0x0000, 0x0000, 39, OUT_NONE,   0, INSTR,   FLAG_END,   0), 
    207213+}; 
    208 --- /dev/null 
    209 +++ b/drivers/net/ethernet/lantiq_xrx200.c 
     214Index: linux-3.8.13/drivers/net/ethernet/lantiq_xrx200.c 
     215=================================================================== 
     216--- /dev/null   1970-01-01 00:00:00.000000000 +0000 
     217+++ linux-3.8.13/drivers/net/ethernet/lantiq_xrx200.c   2013-06-29 18:09:53.932157475 +0200 
    210218@@ -0,0 +1,1203 @@ 
    211219+/* 
     
    274282+#define XRX200_DMA_RX          0 
    275283+#define XRX200_DMA_TX          1 
     284+#define XRX200_DMA_IS_TX(x)    (x%2) 
     285+#define XRX200_DMA_IS_RX(x)    (!XRX200_DMA_IS_TX(x)) 
    276286+ 
    277287+/* fetch / store dma */ 
     
    415425+       struct net_device *devs[XRX200_MAX_DEV]; 
    416426+ 
     427+       struct tasklet_struct tasklet; 
    417428+       struct napi_struct napi; 
    418429+       struct ltq_dma_channel dma; 
     
    484495+               spin_lock_irqsave(&priv->hw->lock, flags); 
    485496+               if (!priv->hw->chan[i].refcount) { 
    486 +                       napi_enable(&priv->hw->chan[i].napi); 
     497+                       if (XRX200_DMA_IS_RX(i)) 
     498+                               napi_enable(&priv->hw->chan[i].napi); 
    487499+                       ltq_dma_open(&priv->hw->chan[i].dma); 
    488500+               } 
     
    516528+               priv->hw->chan[i].refcount--; 
    517529+               if (!priv->hw->chan[i].refcount) { 
    518 +                       napi_disable(&priv->hw->chan[i].napi); 
     530+                       if (XRX200_DMA_IS_RX(i)) 
     531+                               napi_disable(&priv->hw->chan[i].napi); 
    519532+                       ltq_dma_close(&priv->hw->chan[XRX200_DMA_RX].dma); 
    520533+               } 
     
    603616+       } 
    604617+       if (complete || !rx) { 
    605 +                       napi_complete(&ch->napi); 
     618+               napi_complete(&ch->napi); 
    606619+               spin_lock_irqsave(&priv->hw->lock, flags); 
    607620+               ltq_dma_ack_irq(&ch->dma); 
     
    611624+} 
    612625+ 
    613 +static int xrx200_poll_tx(struct napi_struct *napi, int budget) 
    614 +{ 
    615 +       struct xrx200_chan *ch = 
    616 +               container_of(napi, struct xrx200_chan, napi); 
    617 +       struct xrx200_priv *priv = netdev_priv(ch->devs[0]); 
     626+static void xrx200_tx_housekeeping(unsigned long ptr) 
     627+{ 
     628+       struct xrx200_hw *hw = (struct xrx200_hw *) ptr; 
     629+       struct xrx200_chan *ch = &hw->chan[XRX200_DMA_TX]; 
    618630+       unsigned long flags; 
    619631+       int i; 
    620632+ 
    621 +       spin_lock_irqsave(&priv->hw->lock, flags); 
    622 +       while ((ch->dma.desc_base[ch->tx_free].ctl & 
    623 +                       (LTQ_DMA_OWN | LTQ_DMA_C)) == LTQ_DMA_C) { 
     633+       spin_lock_irqsave(&hw->lock, flags); 
     634+       while ((ch->dma.desc_base[ch->tx_free].ctl & (LTQ_DMA_OWN | LTQ_DMA_C)) == LTQ_DMA_C) { 
    624635+               dev_kfree_skb_any(ch->skb[ch->tx_free]); 
    625636+               ch->skb[ch->tx_free] = NULL; 
     
    629640+               ch->tx_free %= LTQ_DESC_NUM; 
    630641+       } 
    631 +       spin_unlock_irqrestore(&priv->hw->lock, flags); 
     642+       spin_unlock_irqrestore(&hw->lock, flags); 
    632643+ 
    633644+       for (i = 0; i < XRX200_MAX_DEV && ch->devs[i]; i++) { 
     
    637648+                       netif_tx_start_queue(txq); 
    638649+       } 
    639 +       napi_complete(&ch->napi); 
    640 +       spin_lock_irqsave(&priv->hw->lock, flags); 
     650+ 
     651+       spin_lock_irqsave(&hw->lock, flags); 
    641652+       ltq_dma_ack_irq(&ch->dma); 
    642 +       spin_unlock_irqrestore(&priv->hw->lock, flags); 
    643 + 
    644 +       return 1; 
     653+       spin_unlock_irqrestore(&hw->lock, flags); 
    645654+} 
    646655+ 
     
    734743+       int ch = irq - XRX200_DMA_IRQ; 
    735744+ 
    736 +       napi_schedule(&hw->chan[ch].napi); 
     745+       if (ch % 2) 
     746+               tasklet_schedule(&hw->chan[ch].tasklet); 
     747+       else 
     748+               napi_schedule(&hw->chan[ch].napi); 
    737749+ 
    738750+       return IRQ_HANDLED; 
     
    11741186+static int xrx200_of_mdio(struct xrx200_hw *hw, struct device_node *np) 
    11751187+{ 
    1176 +       int i; 
    11771188+       hw->mii_bus = mdiobus_alloc(); 
    11781189+       if (!hw->mii_bus) 
     
    13201331+       xrx200_dma_init(&xrx200_hw); 
    13211332+       xrx200_hw_init(&xrx200_hw); 
     1333+       tasklet_init(&xrx200_hw.chan[XRX200_DMA_TX].tasklet, xrx200_tx_housekeeping, (u32) &xrx200_hw); 
    13221334+ 
    13231335+       /* bring up the mdio bus */ 
     
    13551367+       /* setup NAPI */ 
    13561368+       init_dummy_netdev(&xrx200_hw.chan[XRX200_DMA_RX].dummy_dev); 
    1357 +       init_dummy_netdev(&xrx200_hw.chan[XRX200_DMA_TX].dummy_dev); 
    13581369+       netif_napi_add(&xrx200_hw.chan[XRX200_DMA_RX].dummy_dev, 
    13591370+                       &xrx200_hw.chan[XRX200_DMA_RX].napi, xrx200_poll_rx, 32); 
    1360 +       netif_napi_add(&xrx200_hw.chan[XRX200_DMA_TX].dummy_dev, 
    1361 +                       &xrx200_hw.chan[XRX200_DMA_TX].napi, xrx200_poll_tx, 8); 
    13621371+ 
    13631372+       platform_set_drvdata(pdev, &xrx200_hw); 
     
    13791388+       netif_stop_queue(dev); 
    13801389+       netif_napi_del(&xrx200_hw.chan[XRX200_DMA_RX].napi); 
    1381 +       netif_napi_del(&xrx200_hw.chan[XRX200_DMA_TX].napi); 
    13821390+ 
    13831391+       /* shut down hardware */ 
Note: See TracChangeset for help on using the changeset viewer.