| 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 __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 | |