aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/stmicro/stmmac/norm_desc.c
diff options
context:
space:
mode:
authorGiuseppe CAVALLARO <peppe.cavallaro@st.com>2013-03-26 00:43:06 -0400
committerDavid S. Miller <davem@davemloft.net>2013-03-26 12:53:36 -0400
commitc24602ef86649376e9d71ea808cd877e414d340b (patch)
tree3bf58e08f64c7a01b191eab5927886ccce77045c /drivers/net/ethernet/stmicro/stmmac/norm_desc.c
parent4a7d666a7202744af32d4da31fb52857b7d86850 (diff)
stmmac: support extend descriptors
This patch is to support the extend descriptors available in the chips newer than the 3.50. In case of the extend descriptors cannot be supported, at runtime, the driver will continue to work using the old style. In detail, this support extends the main descriptor structure adding new descriptors: 4, 5, 6, 7. The desc4 gives us extra information about the received ethernet payload when it is carrying PTP packets or TCP/UDP/ICMP over IP packets. The descriptors 6 and 7 are used for saving HW L/H timestamps (PTP). V2: this new version removes the Koption added in the first implementation because all the checks now to verify if the extended descriptors are actually supported happen at probe time. Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/stmicro/stmmac/norm_desc.c')
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/norm_desc.c45
1 files changed, 18 insertions, 27 deletions
diff --git a/drivers/net/ethernet/stmicro/stmmac/norm_desc.c b/drivers/net/ethernet/stmicro/stmmac/norm_desc.c
index 88df0b48e35b..47d509435ebb 100644
--- a/drivers/net/ethernet/stmicro/stmmac/norm_desc.c
+++ b/drivers/net/ethernet/stmicro/stmmac/norm_desc.c
@@ -122,37 +122,28 @@ static int ndesc_get_rx_status(void *data, struct stmmac_extra_stats *x,
122 return ret; 122 return ret;
123} 123}
124 124
125static void ndesc_init_rx_desc(struct dma_desc *p, unsigned int ring_size, 125static void ndesc_init_rx_desc(struct dma_desc *p, int disable_rx_ic, int mode,
126 int disable_rx_ic, int mode) 126 int end)
127{ 127{
128 int i; 128 p->des01.rx.own = 1;
129 for (i = 0; i < ring_size; i++) { 129 p->des01.rx.buffer1_size = BUF_SIZE_2KiB - 1;
130 p->des01.rx.own = 1; 130
131 p->des01.rx.buffer1_size = BUF_SIZE_2KiB - 1; 131 if (mode == STMMAC_CHAIN_MODE)
132 132 ndesc_rx_set_on_chain(p, end);
133 if (mode == STMMAC_CHAIN_MODE) 133 else
134 ndesc_rx_set_on_chain(p, (i == ring_size - 1)); 134 ndesc_rx_set_on_ring(p, end);
135 else 135
136 ndesc_rx_set_on_ring(p, (i == ring_size - 1)); 136 if (disable_rx_ic)
137 137 p->des01.rx.disable_ic = 1;
138 if (disable_rx_ic)
139 p->des01.rx.disable_ic = 1;
140 p++;
141 }
142} 138}
143 139
144static void ndesc_init_tx_desc(struct dma_desc *p, unsigned int ring_size, 140static void ndesc_init_tx_desc(struct dma_desc *p, int mode, int end)
145 int mode)
146{ 141{
147 int i; 142 p->des01.tx.own = 0;
148 for (i = 0; i < ring_size; i++) { 143 if (mode == STMMAC_CHAIN_MODE)
149 p->des01.tx.own = 0; 144 ndesc_tx_set_on_chain(p, end);
150 if (mode == STMMAC_CHAIN_MODE) 145 else
151 ndesc_tx_set_on_chain(p, (i == (ring_size - 1))); 146 ndesc_tx_set_on_ring(p, end);
152 else
153 ndesc_tx_set_on_ring(p, (i == (ring_size - 1)));
154 p++;
155 }
156} 147}
157 148
158static int ndesc_get_tx_owner(struct dma_desc *p) 149static int ndesc_get_tx_owner(struct dma_desc *p)