blob: 8203b109cf0dfbee6a0db8f56c2f21a49d4e1c93 [file] [log] [blame]
Robert Mustacchi67164312016-04-11 14:20:14 -07001/*
2 * Macro definitions for Davicom DM9601 USB to fast ethernet controler
3 * based on Davicom DM9601E data sheet
4 * This file is public domain. Coded by M.Murayama (KHF04453@nifty.com)
5 */
6
7#ifndef __DM9601_H__
8#define __DM9601_H__
9
10/*
11 * offset of registers
12 */
13#define NCR 0x00U /* network control register */
14#define NSR 0x01U /* network status register */
15#define TCR 0x02U /* tx control register */
16#define TSR1 0x03U /* tx status register 1 */
17#define TSR2 0x04U /* tx status register 2 */
18#define RCR 0x05U /* rx control register */
19#define RSR 0x06U /* rx status register */
20#define ROCR 0x07U /* rx overflow counter register */
21#define BPTR 0x08U /* back pressure threshold regster */
22#define FCTR 0x09U /* flow control threshold regster */
23#define FCR 0x0aU /* flow control threshold regster */
24#define EPCR 0x0bU /* eeprom & phy control register */
25#define EPAR 0x0cU /* eeprom & phy address register */
26#define EPDR 0x0dU /* eeprom & phy data register (2byte) */
27#define WCR 0x0fU /* wake up control register */
28#define PAR 0x10U /* physical address register (6byte) */
29#define MAR 0x16U /* multicast address register (8byte) */
30#define GPCR 0x1eU /* general purpose control register */
31#define GPR 0x1fU /* general purpose register */
32#define VID 0x28U /* vendor ID (2byte) */
33#define PID 0x2aU /* product ID (2byte) */
34#define CHIPR 0x2cU /* chip revision */
35#define USBDA 0xf0U /* usb device address register */
36#define RXC 0xf1U /* received packet counter register */
37#define TUSC 0xf2U /* tx packet counter/usb status register */
38#define USBC 0xf4U /* usb control register */
39
40/*
41 * register definitions
42 */
43/* network control register */
44#define NCR_EXT_PHY 0x80U /* 1: select external phy */
45#define NCR_WAKEEN 0x40U /* 1: wake up event enable */
46#define NCR_FCOL 0x10U /* force collision mode for test */
47#define NCR_FDX 0x08U /* 1: full duplex mode (for external phy) */
48#define NCR_LBK 0x06U
49#define NCR_LBK_SHIFT 1
50#define NCR_LBK_NORMAL (0U << NCR_LBK_SHIFT)
51#define NCR_LBK_MAC (1U << NCR_LBK_SHIFT)
52#define NCR_LBK_PHY_D (2U << NCR_LBK_SHIFT)
53#define NCR_LBK_PHY_A (3U << NCR_LBK_SHIFT)
54#define NCR_RST 0x01U /* 1: reset, auto clear */
55
56#define NCR_BITS \
57 "\020" \
58 "\010EXT_PHY" \
59 "\007WAKEEN" \
60 "\005FCOL" \
61 "\004FDX" \
62 "\001RST"
63
64/* network status register */
65#define NSR_SPEED 0x80U /* 1:10M 0:100M */
66#define NSR_LINKST 0x40U /* 1:ok 0:fail */
67#define NSR_WAKEST 0x20U /* 1:enabled */
68#define NSR_TXFULL 0x10U /* 1:tx fifo full */
69#define NSR_TX2END 0x08U /* tx packet2 complete status */
70#define NSR_TX1END 0x04U /* tx packet1 complete status */
71#define NSR_RXOV 0x02U /* rx fifo overflow */
72#define NSR_RXRDY 0x01U /* rx packet ready */
73
74#define NSR_BITS \
75 "\020" \
76 "\010SPEED_10" \
77 "\007LINKST_UP" \
78 "\006WAKEST" \
79 "\005TXFULL" \
80 "\004TX2END" \
81 "\003TX1END" \
82 "\002RXOV" \
83 "\001RXRDY"
84
85/* tx control register */
86#define TCR_TJDIS 0x40U /* tx jitter control */
87#define TCR_EXCEDM 0x20U /* excessive collision mode */
88#define TCR_PAD_DIS2 0x10U /* PAD appends disable for pkt2 */
89#define TCR_CRC_DIS2 0x08U /* CRC appends disable for pkt2 */
90#define TCR_PAD_DIS1 0x04U /* PAD appends disable for pkt1 */
91#define TCR_CRC_DIS1 0x02U /* CRC appends disable for pkt1 */
92
93#define TCR_BITS \
94 "\020" \
95 "\007TJDIS" \
96 "\006EXCEDM" \
97 "\005PAD_DIS2" \
98 "\004CRC_DIS2" \
99 "\003PAD_DIS1" \
100 "\002CRC_DIS1"
101
102/* tx status register (ro) */
103#define TSR_TJTO 0x80U /* tx jabber time out */
104#define TSR_LC 0x40U /* loss of carrier */
105#define TSR_NC 0x20U /* no carrier */
106#define TSR_LATEC 0x10U /* late collision */
107#define TSR_COL 0x08U /* late collision */
108#define TSR_EL 0x04U /* excessive collision */
109
110#define TSR_BITS \
111 "\020" \
112 "\010TJTO" \
113 "\007LC" \
114 "\006NC" \
115 "\005LATEC" \
116 "\004COL" \
117 "\003EL"
118
119/* rx control register */
120#define RCR_WTDIS 0x40U /* watch dog timer disable */
121#define RCR_DIS_LONG 0x20U /* discard longer packets than 1522 */
122#define RCR_DIS_CRC 0x10U /* discard crc error packets */
123#define RCR_ALL 0x08U /* pass all multicast */
124#define RCR_RUNT 0x04U /* pass runt packets */
125#define RCR_PRMSC 0x02U /* promiscuous mode */
126#define RCR_RXEN 0x01U /* rx enable */
127
128#define RCR_BITS \
129 "\020" \
130 "\007WTDIS" \
131 "\006DIS_LONG" \
132 "\005DIS_CRC" \
133 "\004ALL" \
134 "\003RUNT" \
135 "\002PRMSC" \
136 "\001RXEN"
137
138/* rx status register */
139#define RSR_RF 0x80U /* runt frame */
140#define RSR_MF 0x40U /* multicast frame */
141#define RSR_LCS 0x20U /* late collision seen */
142#define RSR_RWTO 0x10U /* receive watchdog timeout */
143#define RSR_PLE 0x08U /* physical layer error */
144#define RSR_AE 0x04U /* alignment error */
145#define RSR_CE 0x02U /* crc error */
146#define RSR_FOE 0x01U /* fifo overflow error */
147
148#define RSR_BITS \
149 "\020" \
150 "\010RF" \
151 "\007MF" \
152 "\006LCS" \
153 "\005RWTO" \
154 "\004PLE" \
155 "\003AE" \
156 "\002CE" \
157 "\001FOE"
158
159/* receive overflow counter register */
160#define ROCR_RXFU 0x80U /* receive overflow counter overflow */
161#define ROCR_ROC 0x7fU /* receive overflow counter */
162
163#define ROCR_BITS \
164 "\020" \
165 "\010RXFU"
166
167/* back pressure threshold register */
168#define BPTR_BPHW 0xf0U /* high water overflow threshold */
169#define BPTR_BPHW_SHIFT 4
170#define BPTR_BPHW_UNIT 1024U
171#define BPTR_BPHW_DEFAULT (3 << BPTR_BPHW_SHIFT) /* 3k */
172#define BPTR_JPT 0x0fU /* jam pattern time */
173#define BPTR_JPT_SHIFT 0
174#define BPTR_JPT_5us (0U << BPTR_JPT_SHIFT)
175#define BPTR_JPT_10us (1U << BPTR_JPT_SHIFT)
176#define BPTR_JPT_15us (2U << BPTR_JPT_SHIFT)
177#define BPTR_JPT_25us (3U << BPTR_JPT_SHIFT)
178#define BPTR_JPT_50us (4U << BPTR_JPT_SHIFT)
179#define BPTR_JPT_100us (5U << BPTR_JPT_SHIFT)
180#define BPTR_JPT_150us (6U << BPTR_JPT_SHIFT)
181#define BPTR_JPT_200us (7U << BPTR_JPT_SHIFT)
182#define BPTR_JPT_250us (8U << BPTR_JPT_SHIFT)
183#define BPTR_JPT_300us (9U << BPTR_JPT_SHIFT)
184#define BPTR_JPT_350us (10U << BPTR_JPT_SHIFT)
185#define BPTR_JPT_400us (11U << BPTR_JPT_SHIFT)
186#define BPTR_JPT_450us (12U << BPTR_JPT_SHIFT)
187#define BPTR_JPT_500us (13U << BPTR_JPT_SHIFT)
188#define BPTR_JPT_550us (14U << BPTR_JPT_SHIFT)
189#define BPTR_JPT_600us (15U << BPTR_JPT_SHIFT)
190
191/* flow control threshold register */
192#define FCTR_HWOT 0xf0U /* rx fifo high water overflow threshold */
193#define FCTR_HWOT_SHIFT 4
194#define FCTR_HWOT_UNIT 1024U
195#define FCTR_LWOT 0x0fU /* rx fifo low water overflow threshold */
196#define FCTR_LWOT_SHIFT 0
197#define FCTR_LWOT_UNIT 1024U
198
199/* rx/tx flow control register */
200#define FCR_TXPO 0x80U /* tx pause packet */
201#define FCR_TXPF 0x40U /* tx pause packet */
202#define FCR_TXPEN 0x20U /* tx pause packet */
203#define FCR_BKPA 0x10U /* back pressure mode */
204#define FCR_BKPM 0x08U /* back pressure mode */
205#define FCR_BKPS 0x04U /* rx pause packet current status (r/c) */
206#define FCR_RXPCS 0x02U /* rx pause packet current status (ro) */
207#define FCR_FLCE 0x01U /* flow control enbale */
208
209#define FCR_BITS \
210 "\020" \
211 "\000TXPO" \
212 "\000TXPF" \
213 "\000TXPEN" \
214 "\000BKPA" \
215 "\000BKPM" \
216 "\000BKPS" \
217 "\000RXPCS" \
218 "\000FLCE"
219
220/* EEPROM & PHY control register (0x0b) */
221#define EPCR_REEP 0x20U /* reload eeprom */
222#define EPCR_WEP 0x10U /* write eeprom enable */
223#define EPCR_EPOS 0x08U /* select device, 0:eeprom, 1:phy */
224#define EPCR_ERPRR 0x04U /* read command */
225#define EPCR_ERPRW 0x02U /* write command */
226#define EPCR_ERRE 0x01U /* eeprom/phy access in progress (ro) */
227
228#define EPCR_BITS \
229 "\020" \
230 "\005REEP" \
231 "\004WEP" \
232 "\003EPOS" \
233 "\002ERPRR" \
234 "\001ERPRW" \
235 "\000ERRE"
236
237/* EEPROM & PHY access register (0x0c) */
238#define EPAR_PHYADR 0xc0U /* phy address, internal phy(1) or external */
239#define EPAR_PHYADR_SHIFT 6
240#define EPAR_EROA 0x3fU /* eeprom word addr or phy register addr */
241#define EPAR_EROA_SHIFT 0
242
243/* EEPROM & PHY data register (0x0d(low)-0x0e(hi)) */
244
245/* wake up control register (0x0f) */
246#define WCR_LINKEN 0x20U /* enable link status event */
247#define WCR_SAMPLEEN 0x10U /* enable sample frame event */
248#define WCR_MAGICEN 0x08U /* enable magic pkt event */
249#define WCR_LINKST 0x04U /* link status change occur ro */
250#define WCR_SAMPLEST 0x02U /* sample frame rx occur ro */
251#define WCR_MAGICST 0x01U /* magic pkt rx occur ro */
252
253#define WCR_BITS \
254 "\020" \
255 "\000LINKEN" \
256 "\000SAMPLEEN" \
257 "\000MAGICEN" \
258 "\000LINKST" \
259 "\000SAMPLEST" \
260 "\000MAGICST"
261
262/* physical address register (0x10-0x15) */
263/* multicast address register (0x16-0x1c) */
264/* general purpose control register (0x1e) */
265#define GPCR_GEPCTRL 0x7f
266#define GPCR_OUT(n) (1U << (n))
267
268#define GPCR_BITS \
269 "\020" \
270 "\006OUT5" \
271 "\005OUT4" \
272 "\004OUT3" \
273 "\003OUT2" \
274 "\002OUT1" \
275 "\001OUT0"
276
277/* general purpose register (0x1f) */
278#define GPR_GEPIO5 0x20U
279#define GPR_GEPIO4 0x10U
280#define GPR_GEPIO3 0x08U
281#define GPR_GEPIO2 0x04U
282#define GPR_GEPIO1 0x02U
283#define GPR_GEPIO0 0x01U
284
285#define GPR_BITS \
286 "\020" \
287 "\006GEPIO5" \
288 "\005GEPIO4" \
289 "\004GEPIO3" \
290 "\003GEPIO2" \
291 "\002GEPIO1" \
292 "\001GEPIO0"
293
294/* vendor id register (0x28-0x29) */
295/* product id register (0x2a-0x2b) */
296/* chip revision register (0x2c) */
297
298/* usb device address register (0xf0) */
299#define USBDA_USBFA 0x3fU /* usb device address */
300#define USBDA_USBFA_SHIFT 0
301
302/* receive packet counter register (0xf1) */
303
304/* transmitpacket counter/usb status register (0xf2) */
305#define TUSR_RXFAULT 0x80U /* indicate rx has unexpected condition */
306#define TUSR_SUSFLAG 0x40U /* indicate device has suspended condition */
307#define TUSR_EP1RDY 0x20U /* ready for read from ep1 pipe */
308#define TUSR_SRAM 0x18U /* sram size 0:32K, 1:48K, 2:16K, 3:64K */
309#define TUSR_SRAM_SHIFT 3
310#define TUSR_SRAM_32K (0U << TUSR_SRAM_SHIFT)
311#define TUSR_SRAM_48K (1U << TUSR_SRAM_SHIFT)
312#define TUSR_SRAM_16K (2U << TUSR_SRAM_SHIFT)
313#define TUSR_SRAM_64K (3U << TUSR_SRAM_SHIFT)
314#define TUSR_TXC2 0x04U /* two or more packets in tx buffer */
315#define TUSR_TXC1 0x02U /* one packet in tx buffer */
316#define TUSR_TXC0 0x01U /* no packet in tx buffer */
317
318#define TUSR_BITS \
319 "\020" \
320 "\010RXFAULT" \
321 "\007SUSFLAG" \
322 "\006EP1RDY" \
323 "\003TXC2" \
324 "\002TXC1" \
325 "\001TXC0"
326
327/* usb control register (0xf4) */
328#define USBC_EP3ACK 0x20U /* ep3 will alway return 8byte data if NAK=0 */
329#define USBC_EP3NACK 0x10U /* ep3 will alway return NAK */
330#define USBC_MEMTST 0x01U
331
332/* bulk message format */
333#define TX_HEADER_SIZE 2
334#define RX_HEADER_SIZE 3
335
336/* interrupt msg format */
337struct intr_msg {
338 uint8_t im_nsr;
339 uint8_t im_tsr1;
340 uint8_t im_tsr2;
341 uint8_t im_rsr;
342 uint8_t im_rocr;
343 uint8_t im_rxc;
344 uint8_t im_txc;
345 uint8_t im_gpr;
346};
347#endif /* __DM9601_H__ */