stmmac: re-work the internal GMAC DMA platf parameters
[deliverable/linux.git] / drivers / net / ethernet / stmicro / stmmac / dwmac100_dma.c
CommitLineData
47dd7a54
GC
1/*******************************************************************************
2 This is the driver for the MAC 10/100 on-chip Ethernet controller
3 currently tested on all the ST boards based on STb7109 and stx7200 SoCs.
4
5 DWC Ether MAC 10/100 Universal version 4.0 has been used for developing
6 this code.
7
56b106ae 8 This contains the functions to handle the dma.
3c32be63 9
47dd7a54
GC
10 Copyright (C) 2007-2009 STMicroelectronics Ltd
11
12 This program is free software; you can redistribute it and/or modify it
13 under the terms and conditions of the GNU General Public License,
14 version 2, as published by the Free Software Foundation.
15
16 This program is distributed in the hope it will be useful, but WITHOUT
17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
19 more details.
20
21 You should have received a copy of the GNU General Public License along with
22 this program; if not, write to the Free Software Foundation, Inc.,
23 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
24
25 The full GNU General Public License is included in this distribution in
26 the file called "COPYING".
27
28 Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
29*******************************************************************************/
30
b7f080cf 31#include <asm/io.h>
7e848ae1 32#include "dwmac100.h"
aec7ff27 33#include "dwmac_dma.h"
47dd7a54 34
8327eb65
DS
35static int dwmac100_dma_init(void __iomem *ioaddr, int pbl, int fb,
36 int burst_len, u32 dma_tx, u32 dma_rx)
47dd7a54
GC
37{
38 u32 value = readl(ioaddr + DMA_BUS_MODE);
c629882a
GC
39 int limit;
40
47dd7a54
GC
41 /* DMA SW reset */
42 value |= DMA_BUS_MODE_SFT_RESET;
43 writel(value, ioaddr + DMA_BUS_MODE);
bbc17546 44 limit = 10;
c629882a
GC
45 while (limit--) {
46 if (!(readl(ioaddr + DMA_BUS_MODE) & DMA_BUS_MODE_SFT_RESET))
47 break;
bbc17546 48 mdelay(10);
c629882a
GC
49 }
50 if (limit < 0)
51 return -EBUSY;
47dd7a54
GC
52
53 /* Enable Application Access by writing to DMA CSR0 */
54 writel(DMA_BUS_MODE_DEFAULT | (pbl << DMA_BUS_MODE_PBL_SHIFT),
8327eb65 55 ioaddr + DMA_BUS_MODE);
47dd7a54
GC
56
57 /* Mask interrupts by writing to CSR7 */
58 writel(DMA_INTR_DEFAULT_MASK, ioaddr + DMA_INTR_ENA);
59
60 /* The base address of the RX/TX descriptor lists must be written into
61 * DMA CSR3 and CSR4, respectively. */
62 writel(dma_tx, ioaddr + DMA_TX_BASE_ADDR);
63 writel(dma_rx, ioaddr + DMA_RCV_BASE_ADDR);
64
65 return 0;
66}
67
68/* Store and Forward capability is not used at all..
69 * The transmit threshold can be programmed by
70 * setting the TTC bits in the DMA control register.*/
ad01b7d4 71static void dwmac100_dma_operation_mode(void __iomem *ioaddr, int txmode,
3c32be63 72 int rxmode)
47dd7a54
GC
73{
74 u32 csr6 = readl(ioaddr + DMA_CONTROL);
75
76 if (txmode <= 32)
77 csr6 |= DMA_CONTROL_TTC_32;
78 else if (txmode <= 64)
79 csr6 |= DMA_CONTROL_TTC_64;
80 else
81 csr6 |= DMA_CONTROL_TTC_128;
82
83 writel(csr6, ioaddr + DMA_CONTROL);
47dd7a54
GC
84}
85
ad01b7d4 86static void dwmac100_dump_dma_regs(void __iomem *ioaddr)
47dd7a54
GC
87{
88 int i;
89
56b106ae 90 CHIP_DBG(KERN_DEBUG "DWMAC 100 DMA CSR\n");
47dd7a54
GC
91 for (i = 0; i < 9; i++)
92 pr_debug("\t CSR%d (offset 0x%x): 0x%08x\n", i,
93 (DMA_BUS_MODE + i * 4),
94 readl(ioaddr + DMA_BUS_MODE + i * 4));
56b106ae 95 CHIP_DBG(KERN_DEBUG "\t CSR20 (offset 0x%x): 0x%08x\n",
47dd7a54 96 DMA_CUR_TX_BUF_ADDR, readl(ioaddr + DMA_CUR_TX_BUF_ADDR));
56b106ae 97 CHIP_DBG(KERN_DEBUG "\t CSR21 (offset 0x%x): 0x%08x\n",
47dd7a54 98 DMA_CUR_RX_BUF_ADDR, readl(ioaddr + DMA_CUR_RX_BUF_ADDR));
47dd7a54
GC
99}
100
101/* DMA controller has two counters to track the number of
7e848ae1 102 * the receive missed frames. */
3c32be63 103static void dwmac100_dma_diagnostic_fr(void *data, struct stmmac_extra_stats *x,
ad01b7d4 104 void __iomem *ioaddr)
47dd7a54
GC
105{
106 struct net_device_stats *stats = (struct net_device_stats *)data;
107 u32 csr8 = readl(ioaddr + DMA_MISSED_FRAME_CTR);
108
109 if (unlikely(csr8)) {
110 if (csr8 & DMA_MISSED_FRAME_OVE) {
111 stats->rx_over_errors += 0x800;
112 x->rx_overflow_cntr += 0x800;
113 } else {
114 unsigned int ove_cntr;
115 ove_cntr = ((csr8 & DMA_MISSED_FRAME_OVE_CNTR) >> 17);
116 stats->rx_over_errors += ove_cntr;
117 x->rx_overflow_cntr += ove_cntr;
118 }
119
120 if (csr8 & DMA_MISSED_FRAME_OVE_M) {
121 stats->rx_missed_errors += 0xffff;
122 x->rx_missed_cntr += 0xffff;
123 } else {
124 unsigned int miss_f = (csr8 & DMA_MISSED_FRAME_M_CNTR);
125 stats->rx_missed_errors += miss_f;
126 x->rx_missed_cntr += miss_f;
127 }
128 }
47dd7a54
GC
129}
130
cadb7924 131const struct stmmac_dma_ops dwmac100_dma_ops = {
7e848ae1
GC
132 .init = dwmac100_dma_init,
133 .dump_regs = dwmac100_dump_dma_regs,
134 .dma_mode = dwmac100_dma_operation_mode,
135 .dma_diagnostic_fr = dwmac100_dma_diagnostic_fr,
aec7ff27
GC
136 .enable_dma_transmission = dwmac_enable_dma_transmission,
137 .enable_dma_irq = dwmac_enable_dma_irq,
138 .disable_dma_irq = dwmac_disable_dma_irq,
139 .start_tx = dwmac_dma_start_tx,
140 .stop_tx = dwmac_dma_stop_tx,
141 .start_rx = dwmac_dma_start_rx,
142 .stop_rx = dwmac_dma_stop_rx,
143 .dma_interrupt = dwmac_dma_interrupt,
db98a0b0 144};
This page took 0.250363 seconds and 5 git commands to generate.