aboutsummaryrefslogtreecommitdiff
path: root/drivers/net/ethernet/moxa/moxart_ether.h
blob: bee608b547d172db72288b3a9f71c541f68c53ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
/* MOXA ART Ethernet (RTL8201CP) driver.
 *
 * Copyright (C) 2013 Jonas Jensen
 *
 * Jonas Jensen <jonas.jensen@gmail.com>
 *
 * Based on code from
 * Moxa Technology Co., Ltd. <www.moxa.com>
 *
 * This file is licensed under the terms of the GNU General Public
 * License version 2.  This program is licensed "as is" without any
 * warranty of any kind, whether express or implied.
 */

#ifndef _MOXART_ETHERNET_H
#define _MOXART_ETHERNET_H

#define TX_REG_OFFSET_DESC0	0
#define TX_REG_OFFSET_DESC1	4
#define TX_REG_OFFSET_DESC2	8
#define TX_REG_DESC_SIZE	16

#define RX_REG_OFFSET_DESC0	0
#define RX_REG_OFFSET_DESC1	4
#define RX_REG_OFFSET_DESC2	8
#define RX_REG_DESC_SIZE	16

#define TX_DESC0_PKT_LATE_COL	0x1		/* abort, late collision */
#define TX_DESC0_RX_PKT_EXS_COL	0x2		/* abort, >16 collisions */
#define TX_DESC0_DMA_OWN	0x80000000	/* owned by controller */
#define TX_DESC1_BUF_SIZE_MASK	0x7ff
#define TX_DESC1_LTS		0x8000000	/* last TX packet */
#define TX_DESC1_FTS		0x10000000	/* first TX packet */
#define TX_DESC1_FIFO_COMPLETE	0x20000000
#define TX_DESC1_INTR_COMPLETE	0x40000000
#define TX_DESC1_END		0x80000000
#define TX_DESC2_ADDRESS_PHYS	0
#define TX_DESC2_ADDRESS_VIRT	4

#define RX_DESC0_FRAME_LEN	0
#define RX_DESC0_FRAME_LEN_MASK	0x7FF
#define RX_DESC0_MULTICAST	0x10000
#define RX_DESC0_BROADCAST	0x20000
#define RX_DESC0_ERR		0x40000
#define RX_DESC0_CRC_ERR	0x80000
#define RX_DESC0_FTL		0x100000
#define RX_DESC0_RUNT		0x200000	/* packet less than 64 bytes */
#define RX_DESC0_ODD_NB		0x400000	/* receive odd nibbles */
#define RX_DESC0_LRS		0x10000000	/* last receive segment */
#define RX_DESC0_FRS		0x20000000	/* first receive segment */
#define RX_DESC0_DMA_OWN	0x80000000
#define RX_DESC1_BUF_SIZE_MASK	0x7FF
#define RX_DESC1_END		0x80000000
#define RX_DESC2_ADDRESS_PHYS	0
#define RX_DESC2_ADDRESS_VIRT	4

#define TX_DESC_NUM		64
#define TX_DESC_NUM_MASK	(TX_DESC_NUM - 1)
#define TX_NEXT(N)		(((N) + 1) & (TX_DESC_NUM_MASK))
#define TX_BUF_SIZE		1600
#define TX_BUF_SIZE_MAX		(TX_DESC1_BUF_SIZE_MASK + 1)
#define TX_WAKE_THRESHOLD	16

#define RX_DESC_NUM		64
#define RX_DESC_NUM_MASK	(RX_DESC_NUM - 1)
#define RX_NEXT(N)		(((N) + 1) & (RX_DESC_NUM_MASK))
#define RX_BUF_SIZE		1600
#define RX_BUF_SIZE_MAX		(RX_DESC1_BUF_SIZE_MASK + 1)

#define REG_INTERRUPT_STATUS	0
#define REG_INTERRUPT_MASK	4
#define REG_MAC_MS_ADDRESS	8
#define REG_MAC_LS_ADDRESS	12
#define REG_MCAST_HASH_TABLE0	16
#define REG_MCAST_HASH_TABLE1	20
#define REG_TX_POLL_DEMAND	24
#define REG_RX_POLL_DEMAND	28
#define REG_TXR_BASE_ADDRESS	32
#define REG_RXR_BASE_ADDRESS	36
#define REG_INT_TIMER_CTRL	40
#define REG_APOLL_TIMER_CTRL	44
#define REG_DMA_BLEN_CTRL	48
#define REG_RESERVED1		52
#define REG_MAC_CTRL		136
#define REG_MAC_STATUS		140
#define REG_PHY_CTRL		144
#define REG_PHY_WRITE_DATA	148
#define REG_FLOW_CTRL		152
#define REG_BACK_PRESSURE	156
#define REG_RESERVED2		160
#define REG_TEST_SEED		196
#define REG_DMA_FIFO_STATE	200
#define REG_TEST_MODE		204
#define REG_RESERVED3		208
#define REG_TX_COL_COUNTER	212
#define REG_RPF_AEP_COUNTER	216
#define REG_XM_PG_COUNTER	220
#define REG_RUNT_TLC_COUNTER	224
#define REG_CRC_FTL_COUNTER	228
#define REG_RLC_RCC_COUNTER	232
#define REG_BROC_COUNTER	236
#define REG_MULCA_COUNTER	240
#define REG_RP_COUNTER		244
#define REG_XP_COUNTER		248

#define REG_PHY_CTRL_OFFSET	0x0
#define REG_PHY_STATUS		0x1
#define REG_PHY_ID1		0x2
#define REG_PHY_ID2		0x3
#define REG_PHY_ANA		0x4
#define REG_PHY_ANLPAR		0x5
#define REG_PHY_ANE		0x6
#define REG_PHY_ECTRL1		0x10
#define REG_PHY_QPDS		0x11
#define REG_PHY_10BOP		0x12
#define REG_PHY_ECTRL2		0x13
#define REG_PHY_FTMAC100_WRITE	0x8000000
#define REG_PHY_FTMAC100_READ	0x4000000

/* REG_INTERRUPT_STATUS */
#define RPKT_FINISH		BIT(0)	/* DMA data received */
#define NORXBUF			BIT(1)	/* receive buffer unavailable */
#define XPKT_FINISH		BIT(2)	/* DMA moved data to TX FIFO */
#define NOTXBUF			BIT(3)	/* transmit buffer unavailable */
#define XPKT_OK_INT_STS		BIT(4)	/* transmit to ethernet success */
#define XPKT_LOST_INT_STS	BIT(5)	/* transmit ethernet lost (collision) */
#define RPKT_SAV		BIT(6)	/* FIFO receive success */
#define RPKT_LOST_INT_STS	BIT(7)	/* FIFO full, receive failed */
#define AHB_ERR			BIT(8)	/* AHB error */
#define PHYSTS_CHG		BIT(9)	/* PHY link status change */

/* REG_INTERRUPT_MASK */
#define RPKT_FINISH_M		BIT(0)
#define NORXBUF_M		BIT(1)
#define XPKT_FINISH_M		BIT(2)
#define NOTXBUF_M		BIT(3)
#define XPKT_OK_M		BIT(4)
#define XPKT_LOST_M		BIT(5)
#define RPKT_SAV_M		BIT(6)
#define RPKT_LOST_M		BIT(7)
#define AHB_ERR_M		BIT(8)
#define PHYSTS_CHG_M		BIT(9)

/* REG_MAC_MS_ADDRESS */
#define MAC_MADR_MASK		0xffff	/* 2 MSB MAC address */

/* REG_INT_TIMER_CTRL */
#define TXINT_TIME_SEL		BIT(15)	/* TX cycle time period */
#define TXINT_THR_MASK		0x7000
#define TXINT_CNT_MASK		0xf00
#define RXINT_TIME_SEL		BIT(7)	/* RX cycle time period */
#define RXINT_THR_MASK		0x70
#define RXINT_CNT_MASK		0xF

/* REG_APOLL_TIMER_CTRL */
#define TXPOLL_TIME_SEL		BIT(12)	/* TX poll time period */
#define TXPOLL_CNT_MASK		0xf00
#define TXPOLL_CNT_SHIFT_BIT	8
#define RXPOLL_TIME_SEL		BIT(4)	/* RX poll time period */
#define RXPOLL_CNT_MASK		0xF
#define RXPOLL_CNT_SHIFT_BIT	0

/* REG_DMA_BLEN_CTRL */
#define RX_THR_EN		BIT(9)	/* RX FIFO threshold arbitration */
#define RXFIFO_HTHR_MASK	0x1c0
#define RXFIFO_LTHR_MASK	0x38
#define INCR16_EN		BIT(2)	/* AHB bus INCR16 burst command */
#define INCR8_EN		BIT(1)	/* AHB bus INCR8 burst command */
#define INCR4_EN		BIT(0)	/* AHB bus INCR4 burst command */

/* REG_MAC_CTRL */
#define RX_BROADPKT		BIT(17)	/* receive broadcast packets */
#define RX_MULTIPKT		BIT(16)	/* receive all multicast packets */
#define FULLDUP			BIT(15)	/* full duplex */
#define CRC_APD			BIT(14)	/* append CRC to transmitted packet */
#define RCV_ALL			BIT(12)	/* ignore incoming packet destination */
#define RX_FTL			BIT(11)	/* accept packets larger than 1518 B */
#define RX_RUNT			BIT(10)	/* accept packets smaller than 64 B */
#define HT_MULTI_EN		BIT(9)	/* accept on hash and mcast pass */
#define RCV_EN			BIT(8)	/* receiver enable */
#define ENRX_IN_HALFTX		BIT(6)	/* enable receive in half duplex mode */
#define XMT_EN			BIT(5)	/* transmit enable */
#define CRC_DIS			BIT(4)	/* disable CRC check when receiving */
#define LOOP_EN			BIT(3)	/* internal loop-back */
#define SW_RST			BIT(2)	/* software reset, last 64 AHB clocks */
#define RDMA_EN			BIT(1)	/* enable receive DMA chan */
#define XDMA_EN			BIT(0)	/* enable transmit DMA chan */

/* REG_MAC_STATUS */
#define COL_EXCEED		BIT(11)	/* more than 16 collisions */
#define LATE_COL		BIT(10)	/* transmit late collision detected */
#define XPKT_LOST		BIT(9)	/* transmit to ethernet lost */
#define XPKT_OK			BIT(8)	/* transmit to ethernet success */
#define RUNT_MAC_STS		BIT(7)	/* receive runt detected */
#define FTL_MAC_STS		BIT(6)	/* receive frame too long detected */
#define CRC_ERR_MAC_STS		BIT(5)
#define RPKT_LOST		BIT(4)	/* RX FIFO full, receive failed */
#define RPKT_SAVE		BIT(3)	/* RX FIFO receive success */
#define COL			BIT(2)	/* collision, incoming packet dropped */
#define MCPU_BROADCAST		BIT(1)
#define MCPU_MULTICAST		BIT(0)

/* REG_PHY_CTRL */
#define MIIWR			BIT(27)	/* init write sequence (auto cleared)*/
#define MIIRD			BIT(26)
#define REGAD_MASK		0x3e00000
#define PHYAD_MASK		0x1f0000
#define MIIRDATA_MASK		0xffff

/* REG_PHY_WRITE_DATA */
#define MIIWDATA_MASK		0xffff

/* REG_FLOW_CTRL */
#define PAUSE_TIME_MASK		0xffff0000
#define FC_HIGH_MASK		0xf000
#define FC_LOW_MASK		0xf00
#define RX_PAUSE		BIT(4)	/* receive pause frame */
#define TX_PAUSED		BIT(3)	/* transmit pause due to receive */
#define FCTHR_EN		BIT(2)	/* enable threshold mode. */
#define TX_PAUSE		BIT(1)	/* transmit pause frame */
#define FC_EN			BIT(0)	/* flow control mode enable */

/* REG_BACK_PRESSURE */
#define BACKP_LOW_MASK		0xf00
#define BACKP_JAM_LEN_MASK	0xf0
#define BACKP_MODE		BIT(1)	/* address mode */
#define BACKP_ENABLE		BIT(0)

/* REG_TEST_SEED */
#define TEST_SEED_MASK		0x3fff

/* REG_DMA_FIFO_STATE */
#define TX_DMA_REQUEST		BIT(31)
#define RX_DMA_REQUEST		BIT(30)
#define TX_DMA_GRANT		BIT(29)
#define RX_DMA_GRANT		BIT(28)
#define TX_FIFO_EMPTY		BIT(27)
#define RX_FIFO_EMPTY		BIT(26)
#define TX_DMA2_SM_MASK		0x7000
#define TX_DMA1_SM_MASK		0xf00
#define RX_DMA2_SM_MASK		0x70
#define RX_DMA1_SM_MASK		0xF

/* REG_TEST_MODE */
#define SINGLE_PKT		BIT(26)	/* single packet mode */
#define PTIMER_TEST		BIT(25)	/* automatic polling timer test mode */
#define ITIMER_TEST		BIT(24)	/* interrupt timer test mode */
#define TEST_SEED_SELECT	BIT(22)
#define SEED_SELECT		BIT(21)
#define TEST_MODE		BIT(20)
#define TEST_TIME_MASK		0xffc00
#define TEST_EXCEL_MASK		0x3e0

/* REG_TX_COL_COUNTER */
#define TX_MCOL_MASK		0xffff0000
#define TX_MCOL_SHIFT_BIT	16
#define TX_SCOL_MASK		0xffff
#define TX_SCOL_SHIFT_BIT	0

/* REG_RPF_AEP_COUNTER */
#define RPF_MASK		0xffff0000
#define RPF_SHIFT_BIT		16
#define AEP_MASK		0xffff
#define AEP_SHIFT_BIT		0

/* REG_XM_PG_COUNTER */
#define XM_MASK			0xffff0000
#define XM_SHIFT_BIT		16
#define PG_MASK			0xffff
#define PG_SHIFT_BIT		0

/* REG_RUNT_TLC_COUNTER */
#define RUNT_CNT_MASK		0xffff0000
#define RUNT_CNT_SHIFT_BIT	16
#define TLCC_MASK		0xffff
#define TLCC_SHIFT_BIT		0

/* REG_CRC_FTL_COUNTER */
#define CRCER_CNT_MASK		0xffff0000
#define CRCER_CNT_SHIFT_BIT	16
#define FTL_CNT_MASK		0xffff
#define FTL_CNT_SHIFT_BIT	0

/* REG_RLC_RCC_COUNTER */
#define RLC_MASK		0xffff0000
#define RLC_SHIFT_BIT		16
#define RCC_MASK		0xffff
#define RCC_SHIFT_BIT		0

/* REG_PHY_STATUS */
#define AN_COMPLETE		0x20
#define LINK_STATUS		0x4

struct moxart_mac_priv_t {
	void __iomem *base;
	unsigned int reg_maccr;
	unsigned int reg_imr;
	struct napi_struct napi;
	struct net_device *ndev;

	dma_addr_t rx_base;
	dma_addr_t rx_mapping[RX_DESC_NUM];
	void *rx_desc_base;
	unsigned char *rx_buf_base;
	unsigned char *rx_buf[RX_DESC_NUM];
	unsigned int rx_head;
	unsigned int rx_buf_size;

	dma_addr_t tx_base;
	dma_addr_t tx_mapping[TX_DESC_NUM];
	void *tx_desc_base;
	unsigned char *tx_buf_base;
	unsigned char *tx_buf[RX_DESC_NUM];
	unsigned int tx_head;
	unsigned int tx_buf_size;

	spinlock_t txlock;
	unsigned int tx_len[TX_DESC_NUM];
	struct sk_buff *tx_skb[TX_DESC_NUM];
	unsigned int tx_tail;
};

#if TX_BUF_SIZE >= TX_BUF_SIZE_MAX
#error MOXA ART Ethernet device driver TX buffer is too large!
#endif
#if RX_BUF_SIZE >= RX_BUF_SIZE_MAX
#error MOXA ART Ethernet device driver RX buffer is too large!
#endif

#endif