b0f55e0866d9a7466458a31941575e5896c9ae08
[openwrt/svn-archive/archive.git] / target / linux / brcm63xx / patches-3.3 / 416-bcm63xx_enet-fix-lockup-on-BCM6328.patch
1 From 37d151859e09d09a950ad3ae615db1903bcc59d3 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 43/79] 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 | 14 ++++++++------
12 drivers/net/ethernet/broadcom/bcm63xx_enet.h | 4 ++++
13 2 files changed, 12 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 @@ -1700,6 +1699,8 @@ static int __devinit bcm_enet_probe(stru
47 return -ENOMEM;
48 priv = netdev_priv(dev);
49
50 + priv->dma_maxburst = bcm_enet_is_sw(priv) ?
51 + BCMENETSW_DMA_MAXBURST : BCMENET_DMA_MAXBURST;
52 ret = compute_hw_mtu(priv, dev->mtu);
53 if (ret)
54 goto out;
55 @@ -2263,9 +2264,9 @@ static int bcm_enetsw_open(struct net_de
56 enet_dmas_writel(priv, 0, ENETDMAS_SRAM4_REG(priv->tx_chan));
57
58 /* set dma maximum burst len */
59 - enet_dmac_writel(priv, BCMENET_DMA_MAXBURST,
60 + enet_dmac_writel(priv, priv->dma_maxburst,
61 ENETDMAC_MAXBURST_REG(priv->rx_chan));
62 - enet_dmac_writel(priv, BCMENET_DMA_MAXBURST,
63 + enet_dmac_writel(priv, priv->dma_maxburst,
64 ENETDMAC_MAXBURST_REG(priv->tx_chan));
65
66 /* set flow control low/high threshold to 1/3 / 2/3 */
67 @@ -2727,6 +2728,7 @@ static int __devinit bcm_enetsw_probe(st
68 priv->irq_tx = irq_tx;
69 priv->rx_ring_size = BCMENET_DEF_RX_DESC;
70 priv->tx_ring_size = BCMENET_DEF_TX_DESC;
71 + priv->dma_maxburst = BCMENETSW_DMA_MAXBURST;
72
73 pd = pdev->dev.platform_data;
74 if (pd) {
75 --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.h
76 +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.h
77 @@ -17,6 +17,7 @@
78
79 /* maximum burst len for dma (4 bytes unit) */
80 #define BCMENET_DMA_MAXBURST 16
81 +#define BCMENETSW_DMA_MAXBURST 8
82
83 /* tx transmit threshold (4 bytes unit), fifo is 256 bytes, the value
84 * must be low enough so that a DMA transfer of above burst length can
85 @@ -280,6 +281,9 @@ struct bcm_enet_priv {
86 /* number of dma desc in tx ring */
87 int tx_ring_size;
88
89 + /* maximum dma burst size */
90 + int dma_maxburst;
91 +
92 /* cpu view of rx dma ring */
93 struct bcm_enet_desc *tx_desc_cpu;
94