bcm63xx: add support for linux 3.8
[openwrt.git] / target / linux / brcm63xx / patches-3.8 / 423-bcm63xx_enet-fix-lockup-on-BCM6328.patch
1 From 382a0b0dc4cbd0e0fbfd6c2d132e972c3d1245b0 Mon Sep 17 00:00:00 2001
2 From: Jonas Gorski <jonas.gorski@gmail.com>
3 Date: Sun, 13 Nov 2011 14:59:37 +0100
4 Subject: [PATCH 39/84] bcm63xx_enet: fix lockup on BCM6328
5
6 BCM6328 locks up on a maxburst size of 16, reduce it to 8 for BCM6328 and
7 BCM6368.
8
9 Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
10 ---
11  drivers/net/ethernet/broadcom/bcm63xx_enet.c |   13 +++++++------
12  drivers/net/ethernet/broadcom/bcm63xx_enet.h |    4 ++++
13  2 files changed, 11 insertions(+), 6 deletions(-)
14
15 --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c
16 +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c
17 @@ -261,7 +261,6 @@ static int bcm_enet_refill_rx(struct net
18                         if (!skb)
19                                 break;
20                         priv->rx_skb[desc_idx] = skb;
21 -
22                         p = dma_map_single(&priv->pdev->dev, skb->data,
23                                            priv->rx_skb_size,
24                                            DMA_FROM_DEVICE);
25 @@ -995,9 +994,9 @@ static int bcm_enet_open(struct net_devi
26         enet_writel(priv, priv->hw_mtu, ENET_TXMAXLEN_REG);
27  
28         /* set dma maximum burst len */
29 -       enet_dmac_writel(priv, BCMENET_DMA_MAXBURST,
30 +       enet_dmac_writel(priv, priv->dma_maxburst,
31                          ENETDMAC_MAXBURST_REG(priv->rx_chan));
32 -       enet_dmac_writel(priv, BCMENET_DMA_MAXBURST,
33 +       enet_dmac_writel(priv, priv->dma_maxburst,
34                          ENETDMAC_MAXBURST_REG(priv->tx_chan));
35  
36         /* set correct transmit fifo watermark */
37 @@ -1593,7 +1592,7 @@ static int compute_hw_mtu(struct bcm_ene
38          * it's appended
39          */
40         priv->rx_skb_size = ALIGN(actual_mtu + ETH_FCS_LEN,
41 -                                 BCMENET_DMA_MAXBURST * 4);
42 +                                 priv->dma_maxburst * 4);
43         return 0;
44  }
45  
46 @@ -1701,6 +1700,7 @@ static int bcm_enet_probe(struct platfor
47         priv = netdev_priv(dev);
48  
49         priv->enet_is_sw = false;
50 +       priv->dma_maxburst = BCMENET_DMA_MAXBURST;
51  
52         ret = compute_hw_mtu(priv, dev->mtu);
53         if (ret)
54 @@ -2282,9 +2282,9 @@ static int bcm_enetsw_open(struct net_de
55         enet_dmas_writel(priv, 0, ENETDMAS_SRAM4_REG(priv->tx_chan));
56  
57         /* set dma maximum burst len */
58 -       enet_dmac_writel(priv, BCMENET_DMA_MAXBURST,
59 +       enet_dmac_writel(priv, priv->dma_maxburst,
60                          ENETDMAC_MAXBURST_REG(priv->rx_chan));
61 -       enet_dmac_writel(priv, BCMENET_DMA_MAXBURST,
62 +       enet_dmac_writel(priv, priv->dma_maxburst,
63                          ENETDMAC_MAXBURST_REG(priv->tx_chan));
64  
65         /* set flow control low/high threshold to 1/3 / 2/3 */
66 @@ -2749,6 +2749,7 @@ static int bcm_enetsw_probe(struct platf
67         priv->irq_tx = irq_tx;
68         priv->rx_ring_size = BCMENET_DEF_RX_DESC;
69         priv->tx_ring_size = BCMENET_DEF_TX_DESC;
70 +       priv->dma_maxburst = BCMENETSW_DMA_MAXBURST;
71  
72         pd = pdev->dev.platform_data;
73         if (pd) {
74 --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.h
75 +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.h
76 @@ -18,6 +18,7 @@
77  
78  /* maximum burst len for dma (4 bytes unit) */
79  #define BCMENET_DMA_MAXBURST   16
80 +#define BCMENETSW_DMA_MAXBURST 8
81  
82  /* tx transmit threshold (4 bytes unit), fifo is 256 bytes, the value
83   * must be low enough so that a DMA transfer of above burst length can
84 @@ -252,6 +253,9 @@ struct bcm_enet_priv {
85         /* number of dma desc in tx ring */
86         int tx_ring_size;
87  
88 +       /* maximum dma burst size */
89 +       int dma_maxburst;
90 +
91         /* cpu view of rx dma ring */
92         struct bcm_enet_desc *tx_desc_cpu;
93