Subversion Repositories Kolibri OS

Rev

Rev 4470 | Rev 4519 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3545 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
4467 hidnplayr 3
;; Copyright (C) KolibriOS team 2004-2014. All rights reserved.    ;;
3545 hidnplayr 4
;; Distributed under terms of the GNU General Public License       ;;
5
;;                                                                 ;;
6
;;  i8254x driver for KolibriOS                                    ;;
7
;;                                                                 ;;
8
;;  based on i8254x.asm from baremetal os                          ;;
9
;;                                                                 ;;
10
;;    Written by hidnplayr (hidnplayr@gmail.com)                   ;;
11
;;                                                                 ;;
12
;;          GNU GENERAL PUBLIC LICENSE                             ;;
13
;;             Version 2, June 1991                                ;;
14
;;                                                                 ;;
15
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
16
 
17
        ; TODO: make better use of the available descriptors
18
 
19
format MS COFF
20
 
21
        API_VERSION             = 0x01000100
22
        DRIVER_VERSION          = 5
23
 
24
        MAX_DEVICES             = 16
25
 
26
        DEBUG                   = 1
27
        __DEBUG__               = 1
3855 hidnplayr 28
        __DEBUG_LEVEL__         = 2             ; 1 = verbose, 2 = errors only
3545 hidnplayr 29
 
4512 hidnplayr 30
        MAX_PKT_SIZE            = 4096          ; Maximum packet size
3545 hidnplayr 31
 
4512 hidnplayr 32
        RX_RING_SIZE            = 8             ; Must be a multiple of 8
33
 
4467 hidnplayr 34
include '../struct.inc'
35
include '../macros.inc'
3545 hidnplayr 36
include '../proc32.inc'
37
include '../imports.inc'
38
include '../fdo.inc'
39
include '../netdrv.inc'
40
 
41
public START
42
public service_proc
43
public version
44
 
45
 
46
 
47
; Register list
48
REG_CTRL                = 0x0000 ; Control Register
49
REG_STATUS              = 0x0008 ; Device Status Register
50
REG_CTRLEXT             = 0x0018 ; Extended Control Register
51
REG_MDIC                = 0x0020 ; MDI Control Register
52
REG_FCAL                = 0x0028 ; Flow Control Address Low
53
REG_FCAH                = 0x002C ; Flow Control Address High
54
REG_FCT                 = 0x0030 ; Flow Control Type
55
REG_VET                 = 0x0038 ; VLAN Ether Type
56
REG_ICR                 = 0x00C0 ; Interrupt Cause Read
57
REG_ITR                 = 0x00C4 ; Interrupt Throttling Register
58
REG_ICS                 = 0x00C8 ; Interrupt Cause Set Register
59
REG_IMS                 = 0x00D0 ; Interrupt Mask Set/Read Register
60
REG_IMC                 = 0x00D8 ; Interrupt Mask Clear Register
61
REG_RCTL                = 0x0100 ; Receive Control Register
62
REG_FCTTV               = 0x0170 ; Flow Control Transmit Timer Value
63
REG_TXCW                = 0x0178 ; Transmit Configuration Word
64
REG_RXCW                = 0x0180 ; Receive Configuration Word
65
REG_TCTL                = 0x0400 ; Transmit Control Register
66
REG_TIPG                = 0x0410 ; Transmit Inter Packet Gap
67
 
68
REG_LEDCTL              = 0x0E00 ; LED Control
69
REG_PBA                 = 0x1000 ; Packet Buffer Allocation
70
 
71
REG_RDBAL               = 0x2800 ; RX Descriptor Base Address Low
72
REG_RDBAH               = 0x2804 ; RX Descriptor Base Address High
73
REG_RDLEN               = 0x2808 ; RX Descriptor Length
74
REG_RDH                 = 0x2810 ; RX Descriptor Head
75
REG_RDT                 = 0x2818 ; RX Descriptor Tail
76
REG_RDTR                = 0x2820 ; RX Delay Timer Register
77
REG_RXDCTL              = 0x3828 ; RX Descriptor Control
78
REG_RADV                = 0x282C ; RX Int. Absolute Delay Timer
79
REG_RSRPD               = 0x2C00 ; RX Small Packet Detect Interrupt
80
 
81
REG_TXDMAC              = 0x3000 ; TX DMA Control
82
REG_TDBAL               = 0x3800 ; TX Descriptor Base Address Low
83
REG_TDBAH               = 0x3804 ; TX Descriptor Base Address High
84
REG_TDLEN               = 0x3808 ; TX Descriptor Length
85
REG_TDH                 = 0x3810 ; TX Descriptor Head
86
REG_TDT                 = 0x3818 ; TX Descriptor Tail
87
REG_TIDV                = 0x3820 ; TX Interrupt Delay Value
88
REG_TXDCTL              = 0x3828 ; TX Descriptor Control
89
REG_TADV                = 0x382C ; TX Absolute Interrupt Delay Value
90
REG_TSPMT               = 0x3830 ; TCP Segmentation Pad & Min Threshold
91
 
92
REG_RXCSUM              = 0x5000 ; RX Checksum Control
93
 
94
; Register list for i8254x
95
I82542_REG_RDTR         = 0x0108 ; RX Delay Timer Register
96
I82542_REG_RDBAL        = 0x0110 ; RX Descriptor Base Address Low
97
I82542_REG_RDBAH        = 0x0114 ; RX Descriptor Base Address High
98
I82542_REG_RDLEN        = 0x0118 ; RX Descriptor Length
99
I82542_REG_RDH          = 0x0120 ; RDH for i82542
100
I82542_REG_RDT          = 0x0128 ; RDT for i82542
101
I82542_REG_TDBAL        = 0x0420 ; TX Descriptor Base Address Low
102
I82542_REG_TDBAH        = 0x0424 ; TX Descriptor Base Address Low
103
I82542_REG_TDLEN        = 0x0428 ; TX Descriptor Length
104
I82542_REG_TDH          = 0x0430 ; TDH for i82542
105
I82542_REG_TDT          = 0x0438 ; TDT for i82542
106
 
107
; CTRL - Control Register (0x0000)
108
CTRL_FD                 = 0x00000001 ; Full Duplex
109
CTRL_LRST               = 0x00000008 ; Link Reset
110
CTRL_ASDE               = 0x00000020 ; Auto-speed detection
111
CTRL_SLU                = 0x00000040 ; Set Link Up
112
CTRL_ILOS               = 0x00000080 ; Invert Loss of Signal
113
CTRL_SPEED_MASK         = 0x00000300 ; Speed selection
114
CTRL_SPEED_SHIFT        = 8
115
CTRL_FRCSPD             = 0x00000800 ; Force Speed
116
CTRL_FRCDPLX            = 0x00001000 ; Force Duplex
117
CTRL_SDP0_DATA          = 0x00040000 ; SDP0 data
118
CTRL_SDP1_DATA          = 0x00080000 ; SDP1 data
119
CTRL_SDP0_IODIR         = 0x00400000 ; SDP0 direction
120
CTRL_SDP1_IODIR         = 0x00800000 ; SDP1 direction
121
CTRL_RST                = 0x04000000 ; Device Reset
122
CTRL_RFCE               = 0x08000000 ; RX Flow Ctrl Enable
123
CTRL_TFCE               = 0x10000000 ; TX Flow Ctrl Enable
124
CTRL_VME                = 0x40000000 ; VLAN Mode Enable
125
CTRL_PHY_RST            = 0x80000000 ; PHY reset
126
 
127
; STATUS - Device Status Register (0x0008)
128
STATUS_FD               = 0x00000001 ; Full Duplex
129
STATUS_LU               = 0x00000002 ; Link Up
130
STATUS_TXOFF            = 0x00000010 ; Transmit paused
131
STATUS_TBIMODE          = 0x00000020 ; TBI Mode
132
STATUS_SPEED_MASK       = 0x000000C0 ; Link Speed setting
133
STATUS_SPEED_SHIFT      = 6
134
STATUS_ASDV_MASK        = 0x00000300 ; Auto Speed Detection
135
STATUS_ASDV_SHIFT       = 8
136
STATUS_PCI66            = 0x00000800 ; PCI bus speed
137
STATUS_BUS64            = 0x00001000 ; PCI bus width
138
STATUS_PCIX_MODE        = 0x00002000 ; PCI-X mode
139
STATUS_PCIXSPD_MASK     = 0x0000C000 ; PCI-X speed
140
STATUS_PCIXSPD_SHIFT    = 14
141
 
142
; CTRL_EXT - Extended Device Control Register (0x0018)
143
CTRLEXT_PHY_INT         = 0x00000020 ; PHY interrupt
144
CTRLEXT_SDP6_DATA       = 0x00000040 ; SDP6 data
145
CTRLEXT_SDP7_DATA       = 0x00000080 ; SDP7 data
146
CTRLEXT_SDP6_IODIR      = 0x00000400 ; SDP6 direction
147
CTRLEXT_SDP7_IODIR      = 0x00000800 ; SDP7 direction
148
CTRLEXT_ASDCHK          = 0x00001000 ; Auto-Speed Detect Chk
149
CTRLEXT_EE_RST          = 0x00002000 ; EEPROM reset
150
CTRLEXT_SPD_BYPS        = 0x00008000 ; Speed Select Bypass
151
CTRLEXT_RO_DIS          = 0x00020000 ; Relaxed Ordering Dis.
152
CTRLEXT_LNKMOD_MASK     = 0x00C00000 ; Link Mode
153
CTRLEXT_LNKMOD_SHIFT    = 22
154
 
155
; MDIC - MDI Control Register (0x0020)
156
MDIC_DATA_MASK          = 0x0000FFFF ; Data
157
MDIC_REG_MASK           = 0x001F0000 ; PHY Register
158
MDIC_REG_SHIFT          = 16
159
MDIC_PHY_MASK           = 0x03E00000 ; PHY Address
160
MDIC_PHY_SHIFT          = 21
161
MDIC_OP_MASK            = 0x0C000000 ; Opcode
162
MDIC_OP_SHIFT           = 26
163
MDIC_R                  = 0x10000000 ; Ready
164
MDIC_I                  = 0x20000000 ; Interrupt Enable
165
MDIC_E                  = 0x40000000 ; Error
166
 
167
; ICR - Interrupt Cause Read (0x00c0)
168
ICR_TXDW                = 0x00000001 ; TX Desc Written back
169
ICR_TXQE                = 0x00000002 ; TX Queue Empty
170
ICR_LSC                 = 0x00000004 ; Link Status Change
171
ICR_RXSEQ               = 0x00000008 ; RX Sence Error
172
ICR_RXDMT0              = 0x00000010 ; RX Desc min threshold reached
173
ICR_RXO                 = 0x00000040 ; RX Overrun
174
ICR_RXT0                = 0x00000080 ; RX Timer Interrupt
175
ICR_MDAC                = 0x00000200 ; MDIO Access Complete
176
ICR_RXCFG               = 0x00000400
177
ICR_PHY_INT             = 0x00001000 ; PHY Interrupt
178
ICR_GPI_SDP6            = 0x00002000 ; GPI on SDP6
179
ICR_GPI_SDP7            = 0x00004000 ; GPI on SDP7
180
ICR_TXD_LOW             = 0x00008000 ; TX Desc low threshold hit
181
ICR_SRPD                = 0x00010000 ; Small RX packet detected
182
 
183
; RCTL - Receive Control Register (0x0100)
184
RCTL_EN                 = 0x00000002 ; Receiver Enable
185
RCTL_SBP                = 0x00000004 ; Store Bad Packets
186
RCTL_UPE                = 0x00000008 ; Unicast Promiscuous Enabled
187
RCTL_MPE                = 0x00000010 ; Xcast Promiscuous Enabled
188
RCTL_LPE                = 0x00000020 ; Long Packet Reception Enable
189
RCTL_LBM_MASK           = 0x000000C0 ; Loopback Mode
190
RCTL_LBM_SHIFT          = 6
191
RCTL_RDMTS_MASK         = 0x00000300 ; RX Desc Min Threshold Size
192
RCTL_RDMTS_SHIFT        = 8
193
RCTL_MO_MASK            = 0x00003000 ; Multicast Offset
194
RCTL_MO_SHIFT           = 12
195
RCTL_BAM                = 0x00008000 ; Broadcast Accept Mode
196
RCTL_BSIZE_MASK         = 0x00030000 ; RX Buffer Size
197
RCTL_BSIZE_SHIFT        = 16
198
RCTL_VFE                = 0x00040000 ; VLAN Filter Enable
199
RCTL_CFIEN              = 0x00080000 ; CFI Enable
200
RCTL_CFI                = 0x00100000 ; Canonical Form Indicator Bit
201
RCTL_DPF                = 0x00400000 ; Discard Pause Frames
202
RCTL_PMCF               = 0x00800000 ; Pass MAC Control Frames
203
RCTL_BSEX               = 0x02000000 ; Buffer Size Extension
204
RCTL_SECRC              = 0x04000000 ; Strip Ethernet CRC
205
 
206
; TCTL - Transmit Control Register (0x0400)
207
TCTL_EN                 = 0x00000002 ; Transmit Enable
208
TCTL_PSP                = 0x00000008 ; Pad short packets
209
TCTL_SWXOFF             = 0x00400000 ; Software XOFF Transmission
210
 
211
; PBA - Packet Buffer Allocation (0x1000)
212
PBA_RXA_MASK            = 0x0000FFFF ; RX Packet Buffer
213
PBA_RXA_SHIFT           = 0
214
PBA_TXA_MASK            = 0xFFFF0000 ; TX Packet Buffer
215
PBA_TXA_SHIFT           = 16
216
 
217
; Flow Control Type
218
FCT_TYPE_DEFAULT        = 0x8808
219
 
220
; === TX Descriptor fields ===
221
 
222
; TX Packet Length (word 2)
223
TXDESC_LEN_MASK         = 0x0000ffff
224
 
225
; TX Descriptor CMD field (word 2)
226
TXDESC_IDE              = 0x80000000 ; Interrupt Delay Enable
227
TXDESC_VLE              = 0x40000000 ; VLAN Packet Enable
228
TXDESC_DEXT             = 0x20000000 ; Extension
229
TXDESC_RPS              = 0x10000000 ; Report Packet Sent
230
TXDESC_RS               = 0x08000000 ; Report Status
231
TXDESC_IC               = 0x04000000 ; Insert Checksum
232
TXDESC_IFCS             = 0x02000000 ; Insert FCS
233
TXDESC_EOP              = 0x01000000 ; End Of Packet
234
 
235
; TX Descriptor STA field (word 3)
236
TXDESC_TU               = 0x00000008 ; Transmit Underrun
237
TXDESC_LC               = 0x00000004 ; Late Collision
238
TXDESC_EC               = 0x00000002 ; Excess Collisions
239
TXDESC_DD               = 0x00000001 ; Descriptor Done
240
 
241
; === RX Descriptor fields ===
242
 
243
; RX Packet Length (word 2)
244
RXDESC_LEN_MASK         = 0x0000ffff