Root/target/linux/brcm63xx/patches-3.6/423-bcm63xx_enet-fix-lockup-on-BCM6328.patch

1From 382a0b0dc4cbd0e0fbfd6c2d132e972c3d1245b0 Mon Sep 17 00:00:00 2001
2From: Jonas Gorski <jonas.gorski@gmail.com>
3Date: Sun, 13 Nov 2011 14:59:37 +0100
4Subject: [PATCH 39/84] bcm63xx_enet: fix lockup on BCM6328
5
6BCM6328 locks up on a maxburst size of 16, reduce it to 8 for BCM6328 and
7BCM6368.
8
9Signed-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 __devinit bcm_enet_probe(stru
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 __devinit bcm_enetsw_probe(st
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@@ -17,6 +17,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@@ -280,6 +281,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 
94

Archive Download this file



interactive