1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3 ;; Copyright (C) KolibriOS team 2010-2015. All rights reserved. ;;
4 ;; Distributed under terms of the GNU General Public License ;;
6 ;; mii.inc - Media Independent Interface routines for KolibriOS ;;
8 ;; GNU GENERAL PUBLIC LICENSE ;;
9 ;; Version 2, June 1991 ;;
11 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
14 ; Generic MII registers.
16 MII_BMCR = 0x00 ; Basic mode control register
17 MII_BMSR = 0x01 ; Basic mode status register
18 MII_PHYSID1 = 0x02 ; PHYS ID 1
19 MII_PHYSID2 = 0x03 ; PHYS ID 2
21 ; Auto negotiation registers
22 MII_ADVERTISE = 0x04 ; Advertisement control reg
23 MII_LPA = 0x05 ; Link partner ability reg
24 MII_EXPANSION = 0x06 ; Expansion register
26 MII_CTRL1000 = 0x09 ; 1000BASE-T control
27 MII_STAT1000 = 0x0a ; 1000BASE-T status
28 MII_ESTATUS = 0x0f ; Extended Status
29 MII_DCOUNTER = 0x12 ; Disconnect counter
30 MII_FCSCOUNTER = 0x13 ; False carrier counter
31 MII_NWAYTEST = 0x14 ; N-way auto-neg test reg
32 MII_RERRCOUNTER = 0x15 ; Receive error counter
33 MII_SREVISION = 0x16 ; Silicon revision
34 MII_RESV1 = 0x17 ; Reserved...
35 MII_LBRERROR = 0x18 ; Lpback, rx, bypass error
36 MII_PHYADDR = 0x19 ; PHY address
37 MII_RESV2 = 0x1a ; Reserved...
38 MII_TPISTATUS = 0x1b ; TPI status for 10mbps
39 MII_NCONFIG = 0x1c ; Network interface config
41 ; Basic mode control register.
43 BMCR_RESV = 0x003f ; Unused...
44 BMCR_SPEED1000 = 0x0040 ; MSB of Speed (1000)
45 BMCR_CTST = 0x0080 ; Collision test
46 BMCR_FULLDPLX = 0x0100 ; Full duplex
47 BMCR_ANRESTART = 0x0200 ; Auto negotiation restart
48 BMCR_ISOLATE = 0x0400 ; Disconnect DP83840 from MII
49 BMCR_PDOWN = 0x0800 ; Powerdown the DP83840
50 BMCR_ANENABLE = 0x1000 ; Enable auto negotiation
51 BMCR_SPEED100 = 0x2000 ; Select 100Mbps
52 BMCR_LOOPBACK = 0x4000 ; TXD loopback bits
53 BMCR_RESET = 0x8000 ; Reset the DP83840
55 ; Basic mode status register.
57 BMSR_ERCAP = 0x0001 ; Ext-reg capability
58 BMSR_JCD = 0x0002 ; Jabber detected
59 BMSR_LSTATUS = 0x0004 ; Link status
60 BMSR_ANEGCAPABLE = 0x0008 ; Able to do auto-negotiation
61 BMSR_RFAULT = 0x0010 ; Remote fault detected
62 BMSR_ANEGCOMPLETE = 0x0020 ; Auto-negotiation complete
63 BMSR_RESV = 0x00c0 ; Unused...
64 BMSR_ESTATEN = 0x0100 ; Extended Status in R15
65 BMSR_100HALF2 = 0x0200 ; Can do 100BASE-T2 HDX
66 BMSR_100FULL2 = 0x0400 ; Can do 100BASE-T2 FDX
67 BMSR_10HALF = 0x0800 ; Can do 10mbps, half-duplex
68 BMSR_10FULL = 0x1000 ; Can do 10mbps, full-duplex
69 BMSR_100HALF = 0x2000 ; Can do 100mbps, half-duplex
70 BMSR_100FULL = 0x4000 ; Can do 100mbps, full-duplex
71 BMSR_100BASE4 = 0x8000 ; Can do 100mbps, 4k packets
73 ; Advertisement control register.
75 ADVERTISE_SLCT = 0x001f ; Selector bits
76 ADVERTISE_CSMA = 0x0001 ; Only selector supported
77 ADVERTISE_10HALF = 0x0020 ; Try for 10mbps half-duplex
78 ADVERTISE_1000XFULL = 0x0020 ; Try for 1000BASE-X full-duplex
79 ADVERTISE_10FULL = 0x0040 ; Try for 10mbps full-duplex
80 ADVERTISE_1000XHALF = 0x0040 ; Try for 1000BASE-X half-duplex
81 ADVERTISE_100HALF = 0x0080 ; Try for 100mbps half-duplex
82 ADVERTISE_1000XPAUSE = 0x0080 ; Try for 1000BASE-X pause
83 ADVERTISE_100FULL = 0x0100 ; Try for 100mbps full-duplex
84 ADVERTISE_1000XPSE_ASYM = 0x0100 ; Try for 1000BASE-X asym pause
85 ADVERTISE_100BASE4 = 0x0200 ; Try for 100mbps 4k packets
86 ADVERTISE_PAUSE_CAP = 0x0400 ; Try for pause
87 ADVERTISE_PAUSE_ASYM = 0x0800 ; Try for asymetric pause
88 ADVERTISE_RESV = 0x1000 ; Unused...
89 ADVERTISE_RFAULT = 0x2000 ; Say we can detect faults
90 ADVERTISE_LPACK = 0x4000 ; Ack link partners response
91 ADVERTISE_NPAGE = 0x8000 ; Next page bit
93 ADVERTISE_FULL = (ADVERTISE_100FULL or ADVERTISE_10FULL or ADVERTISE_CSMA)
94 ADVERTISE_ALL = (ADVERTISE_10HALF or ADVERTISE_10FULL or ADVERTISE_100HALF or ADVERTISE_100FULL)
96 ; Link partner ability register.
98 LPA_SLCT = 0x001f ; Same as advertise selector
99 LPA_10HALF = 0x0020 ; Can do 10mbps half-duplex
100 LPA_1000XFULL = 0x0020 ; Can do 1000BASE-X full-duplex
101 LPA_10FULL = 0x0040 ; Can do 10mbps full-duplex
102 LPA_1000XHALF = 0x0040 ; Can do 1000BASE-X half-duplex
103 LPA_100HALF = 0x0080 ; Can do 100mbps half-duplex
104 LPA_1000XPAUSE = 0x0080 ; Can do 1000BASE-X pause
105 LPA_100FULL = 0x0100 ; Can do 100mbps full-duplex
106 LPA_1000XPAUSE_ASYM = 0x0100 ; Can do 1000BASE-X pause asym
107 LPA_100BASE4 = 0x0200 ; Can do 100mbps 4k packets
108 LPA_PAUSE_CAP = 0x0400 ; Can pause
109 LPA_PAUSE_ASYM = 0x0800 ; Can pause asymetrically
110 LPA_RESV = 0x1000 ; Unused...
111 LPA_RFAULT = 0x2000 ; Link partner faulted
112 LPA_LPACK = 0x4000 ; Link partner acked us
113 LPA_NPAGE = 0x8000 ; Next page bit
115 LPA_DUPLEX = (LPA_10FULL or LPA_100FULL)
116 LPA_100 = (LPA_100FULL or LPA_100HALF or LPA_100BASE4)
118 ; Expansion register for auto-negotiation.
120 EXPANSION_NWAY = 0x0001 ; Can do N-way auto-nego
121 EXPANSION_LCWP = 0x0002 ; Got new RX page code word
122 EXPANSION_ENABLENPAGE = 0x0004 ; This enables npage words
123 EXPANSION_NPCAPABLE = 0x0008 ; Link partner supports npage
124 EXPANSION_MFAULTS = 0x0010 ; Multiple faults detected
125 EXPANSION_RESV = 0xffe0 ; Unused...
127 ESTATUS_1000_TFULL = 0x2000 ; Can do 1000BT Full
128 ESTATUS_1000_THALF = 0x1000 ; Can do 1000BT Half
130 ; N-way test register.
132 NWAYTEST_RESV1 = 0x00ff ; Unused...
133 NWAYTEST_LOOPBACK = 0x0100 ; Enable loopback for N-way
134 NWAYTEST_RESV2 = 0xfe00 ; Unused...
136 ; 1000BASE-T Control register
138 ADVERTISE_1000FULL = 0x0200 ; Advertise 1000BASE-T full duplex
139 ADVERTISE_1000HALF = 0x0100 ; Advertise 1000BASE-T half duplex
141 ; 1000BASE-T Status register
143 LPA_1000LOCALRXOK = 0x2000 ; Link partner local receiver status
144 LPA_1000REMRXOK = 0x1000 ; Link partner remote receiver status
145 LPA_1000FULL = 0x0800 ; Link partner 1000BASE-T full duplex
146 LPA_1000HALF = 0x0400 ; Link partner 1000BASE-T half duplex
160 DEBUGF 1, "mii_link_ok\n"
162 ; First do a dummy read to latch some MII phys
172 DEBUGF 1, "link status=0x%x\n", ax