Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1159 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
1514 hidnplayr 3
;; Copyright (C) KolibriOS team 2004-2010. All rights reserved.    ;;
1159 hidnplayr 4
;; Distributed under terms of the GNU General Public License       ;;
5
;;                                                                 ;;
1519 hidnplayr 6
;;  Realtek 8139 driver for KolibriOS                              ;;
1159 hidnplayr 7
;;                                                                 ;;
1519 hidnplayr 8
;;  based on RTL8139.asm driver for menuetos                       ;;
9
;;  and realtek8139.asm for SolarOS by Eugen Brasoveanu            ;;
10
;;                                                                 ;;
1159 hidnplayr 11
;;    Written by hidnplayr@kolibrios.org                           ;;
12
;;                                                                 ;;
13
;;          GNU GENERAL PUBLIC LICENSE                             ;;
14
;;             Version 2, June 1991                                ;;
15
;;                                                                 ;;
16
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
17
 
18
format MS COFF
19
 
20
	API_VERSION		equ 0x01000100
1519 hidnplayr 21
	DRIVER_VERSION		equ 5
1159 hidnplayr 22
 
1519 hidnplayr 23
	MAX_DEVICES		equ 16
24
 
1556 hidnplayr 25
	RBLEN			equ 3 ; Receive buffer size: 0==8K 1==16k 2==32k 3==64k
26
 
1159 hidnplayr 27
	DEBUG			equ 1
28
	__DEBUG__		equ 1
1472 hidnplayr 29
	__DEBUG_LEVEL__ 	equ 2
1159 hidnplayr 30
 
31
include 'proc32.inc'
32
include 'imports.inc'
33
include 'fdo.inc'
1472 hidnplayr 34
include 'netdrv.inc'
1159 hidnplayr 35
 
36
public START
37
public service_proc
38
public version
39
 
40
	REG_IDR0		equ 0x00
41
	REG_MAR0		equ 0x08 ; multicast filter register 0
42
	REG_MAR4		equ 0x0c ; multicast filter register 4
43
	REG_TSD0		equ 0x10 ; transmit status of descriptor
44
	REG_TSAD0		equ 0x20 ; transmit start address of descriptor
45
	REG_RBSTART		equ 0x30 ; RxBuffer start address
46
	REG_COMMAND		equ 0x37 ; command register
47
	REG_CAPR		equ 0x38 ; current address of packet read (word) R/W
48
	REG_IMR 		equ 0x3c ; interrupt mask register
49
	REG_ISR 		equ 0x3e ; interrupt status register
50
	REG_TXCONFIG		equ 0x40 ; transmit configuration register
51
	REG_RXCONFIG		equ 0x44 ; receive configuration register 0
52
	REG_MPC 		equ 0x4c ; missed packet counter
53
	REG_9346CR		equ 0x50 ; serial eeprom 93C46 command register
54
	REG_CONFIG1		equ 0x52 ; configuration register 1
55
	REG_MSR 		equ 0x58
56
	REG_CONFIG4		equ 0x5a ; configuration register 4
57
	REG_HLTCLK		equ 0x5b ; undocumented halt clock register
58
	REG_BMCR		equ 0x62 ; basic mode control register
59
	REG_ANAR		equ 0x66 ; auto negotiation advertisement register
60
	REG_9346CR_WE		equ 11b SHL 6
61
 
62
	BIT_RUNT		equ 4 ; total packet length < 64 bytes
63
	BIT_LONG		equ 3 ; total packet length > 4k
64
	BIT_CRC 		equ 2 ; crc error occured
65
	BIT_FAE 		equ 1 ; frame alignment error occured
66
	BIT_ROK 		equ 0 ; received packet is ok
67
 
68
	BIT_RST 		equ 4 ; reset bit
69
	BIT_RE			equ 3 ; receiver enabled
70
	BIT_TE			equ 2 ; transmitter enabled
71
	BUFE			equ 1 ; rx buffer is empty, no packet stored
72
 
73
	BIT_ISR_TOK		equ 2 ; transmit ok
74
	BIT_ISR_RER		equ 1 ; receive error interrupt
75
	BIT_ISR_ROK		equ 0 ; receive ok
76
 
77
	BIT_TX_MXDMA		equ 8 ; Max DMA burst size per Tx DMA burst
78
	BIT_TXRR		equ 4 ; Tx Retry count 16+(TXRR*16)
79
 
80
	BIT_RXFTH		equ 13 ; Rx fifo threshold
81
	BIT_RBLEN		equ 11 ; Ring buffer length indicator
82
	BIT_RX_MXDMA		equ 8 ; Max DMA burst size per Rx DMA burst
83
	BIT_NOWRAP		equ 7 ; transfered data wrapping
84
	BIT_9356SEL		equ 6 ; eeprom selector 9346/9356
85
	BIT_AER 		equ 5 ; accept error packets
86
	BIT_AR			equ 4 ; accept runt packets
87
	BIT_AB			equ 3 ; accept broadcast packets
88
	BIT_AM			equ 2 ; accept multicast packets
89
	BIT_APM 		equ 1 ; accept physical match packets
90
	BIT_AAP 		equ 0 ; accept all packets
91
 
92
	BIT_93C46_EEM1		equ 7 ; RTL8139 eeprom operating mode1
93
	BIT_93C46_EEM0		equ 6 ; RTL8139 eeprom operating mode0
94
	BIT_93C46_EECS		equ 3 ; chip select
95
	BIT_93C46_EESK		equ 2 ; serial data clock
96
	BIT_93C46_EEDI		equ 1 ; serial data input
97
	BIT_93C46_EEDO		equ 0 ; serial data output
98
 
99
	BIT_LWACT		equ 4 ; see REG_CONFIG1
100
	BIT_SLEEP		equ 1 ; sleep bit at older chips
101
	BIT_PWRDWN		equ 0 ; power down bit at older chips
102
	BIT_PMEn		equ 0 ; power management enabled
103
 
104
	BIT_LWPTN		equ 2 ; see REG_CONFIG4
105
 
106
	BIT_ERTXTH		equ 16 ; early TX threshold
107
	BIT_TOK 		equ 15 ; transmit ok
108
	BIT_OWN 		equ 13 ; tx DMA operation is completed
109
 
110
	BIT_ANE 		equ 12 ; auto negotiation enable
111
 
112
	BIT_TXFD		equ 8 ; 100base-T full duplex
113
	BIT_TX			equ 7 ; 100base-T
114
	BIT_10FD		equ 6 ; 10base-T full duplex
115
	BIT_10			equ 5 ; 10base-T
116
	BIT_SELECTOR		equ 0 ; binary encoded selector CSMA/CD=00001
117
 
118
	BIT_IFG1		equ 25
119
	BIT_IFG0		equ 24
120
 
121
	TXRR			equ 8 ; total retries = 16+(TXRR*16)
122
	TX_MXDMA		equ 6 ; 0=16 1=32 2=64 3=128 4=256 5=512 6=1024 7=2048
123
	ERTXTH			equ 8 ; in unit of 32 bytes e.g:(8*32)=256
124
	RX_MXDMA		equ 7 ; 0=16 1=32 2=64 3=128 4=256 5=512 6=1024 7=unlimited
125
	RXFTH			equ 7 ; 0=16 1=32 2=64 3=128 4=256 5=512 6=1024 7=no threshold
126
 
127
	RX_CONFIG		equ (RBLEN shl BIT_RBLEN) or \
128
				    (RX_MXDMA shl BIT_RX_MXDMA) or \
129
				    (1 shl BIT_NOWRAP) or \
130
				    (RXFTH shl BIT_RXFTH) or\
1472 hidnplayr 131
				    (1 shl BIT_AB) or \ 		; Accept broadcast packets
132
				    (1 shl BIT_APM) or \		; Accept physical match packets
133
				    (1 shl BIT_AER) or \		; Accept error packets
134
				    (1 shl BIT_AR) or \ 		; Accept Runt packets (smaller then 64 bytes)
135
				    (1 shl BIT_AM)			; Accept multicast packets
1159 hidnplayr 136
 
1472 hidnplayr 137
	RX_BUFFER_SIZE		equ (8192 shl RBLEN);+16
1159 hidnplayr 138
	MAX_ETH_FRAME_SIZE	equ 1516 ; exactly 1514 wthout CRC
139
	NUM_TX_DESC		equ 4
140
 
141
	EE_93C46_REG_ETH_ID	equ 7 ; MAC offset
142
	EE_93C46_READ_CMD	equ (6 shl 6) ; 110b + 6bit address
143
	EE_93C56_READ_CMD	equ (6 shl 8) ; 110b + 8bit address
144
	EE_93C46_CMD_LENGTH	equ 9  ; start bit + cmd + 6bit address
145
	EE_93C56_CMD_LENGTH	equ 11 ; start bit + cmd + 8bit ddress
146
 
147
	VER_RTL8139		equ 1100000b
148
	VER_RTL8139A		equ 1110000b
149
	VER_RTL8139AG		equ 1110100b
150
	VER_RTL8139B		equ 1111000b
151
	VER_RTL8130		equ VER_RTL8139B
152
	VER_RTL8139C		equ 1110100b
153
	VER_RTL8100		equ 1111010b
154
	VER_RTL8100B		equ 1110101b
155
	VER_RTL8139D		equ VER_RTL8100B
156
	VER_RTL8139CP		equ 1110110b
157
	VER_RTL8101		equ 1110111b
158
 
159
	IDX_RTL8139		equ 0
160
	IDX_RTL8139A		equ 1
161
	IDX_RTL8139B		equ 2
162
	IDX_RTL8139C		equ 3
163
	IDX_RTL8100		equ 4
164
	IDX_RTL8139D		equ 5
165
	IDX_RTL8139D		equ 6
166
	IDX_RTL8101		equ 7
167
 
168
	ISR_SERR		equ 1 SHL 15
169
	ISR_TIMEOUT		equ 1 SHL 14
170
	ISR_LENCHG		equ 1 SHL 13
171
	ISR_FIFOOVW		equ 1 SHL 6
172
	ISR_PUN 		equ 1 SHL 5
173
	ISR_RXOVW		equ 1 SHL 4
174
	ISR_TER 		equ 1 SHL 3
175
	ISR_TOK 		equ 1 SHL 2
176
	ISR_RER 		equ 1 SHL 1
177
	ISR_ROK 		equ 1 SHL 0
178
 
179
	INTERRUPT_MASK		equ ISR_ROK or \
180
				    ISR_RXOVW or \
181
				    ISR_PUN or \
182
				    ISR_FIFOOVW or \
183
				    ISR_LENCHG or \
184
				    ISR_TOK or \
185
				    ISR_TER
186
 
187
	TSR_OWN 		equ 1 SHL 13
188
	TSR_TUN 		equ 1 SHL 14
189
	TSR_TOK 		equ 1 SHL 15
190
 
191
	TSR_CDH 		equ 1 SHL 28
192
	TSR_OWC 		equ 1 SHL 29
193
	TSR_TABT		equ 1 SHL 30
194
	TSR_CRS 		equ 1 SHL 31
195
 
196
 
1519 hidnplayr 197
virtual at ebx
1159 hidnplayr 198
 
1519 hidnplayr 199
	device:
200
 
201
	ETH_DEVICE
202
 
203
	.rx_buffer	dd ?
204
	.tx_buffer	dd ?
1556 hidnplayr 205
 
1519 hidnplayr 206
	.rx_data_offset dd ?
207
	.io_addr	dd ?
1556 hidnplayr 208
 
1519 hidnplayr 209
	.curr_tx_desc	db ?
210
	.pci_bus	db ?
211
	.pci_dev	db ?
212
	.irq_line	db ?
213
	.hw_ver_id	db ?
214
 
215
	.TX_DESC	rd NUM_TX_DESC
216
 
217
	.size = $ - device
218
 
219
end virtual
220
 
221
 
222
 
1159 hidnplayr 223
section '.flat' code readable align 16
224
 
225
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
226
;;                        ;;
227
;; proc START             ;;
228
;;                        ;;
229
;; (standard driver proc) ;;
230
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
231
 
232
align 4
233
proc START stdcall, state:dword
234
 
235
	cmp [state], 1
236
	jne .exit
237
 
238
  .entry:
239
 
1472 hidnplayr 240
	DEBUGF	2,"Loading rtl8139 driver\n"
1159 hidnplayr 241
	stdcall RegService, my_service, service_proc
242
	ret
243
 
244
  .fail:
245
  .exit:
246
	xor eax, eax
247
	ret
248
 
249
endp
250
 
251
 
252
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
253
;;                        ;;
254
;; proc SERVICE_PROC      ;;
255
;;                        ;;
256
;; (standard driver proc) ;;
257
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
258
 
259
align 4
260
proc service_proc stdcall, ioctl:dword
261
 
262
	mov	edx, [ioctl]
1472 hidnplayr 263
	mov	eax, [IOCTL.io_code]
1159 hidnplayr 264
 
265
;------------------------------------------------------
266
 
267
	cmp	eax, 0 ;SRV_GETVERSION
268
	jne	@F
269
 
1472 hidnplayr 270
	cmp	[IOCTL.out_size], 4
1159 hidnplayr 271
	jl	.fail
1472 hidnplayr 272
	mov	eax, [IOCTL.output]
1159 hidnplayr 273
	mov	[eax], dword API_VERSION
274
 
275
	xor	eax, eax
276
	ret
277
 
278
;------------------------------------------------------
279
  @@:
280
	cmp	eax, 1 ;SRV_HOOK
281
	jne	.fail
282
 
1472 hidnplayr 283
	cmp	[IOCTL.inp_size], 3		  ; Data input must be at least 3 bytes
1159 hidnplayr 284
	jl	.fail
285
 
1472 hidnplayr 286
	mov	eax, [IOCTL.input]
1159 hidnplayr 287
	cmp	byte [eax], 1				; 1 means device number and bus number (pci) are given
288
	jne	.fail					; other types arent supported for this card yet
289
 
290
; check if the device is already listed
291
 
1519 hidnplayr 292
	mov	esi, device_list
293
	mov	ecx, [devices]
1159 hidnplayr 294
	test	ecx, ecx
295
	jz	.firstdevice
1472 hidnplayr 296
 
297
;        mov     eax, [IOCTL.input]                      ; get the pci bus and device numbers
298
	mov	ax , [eax+1]				;
1159 hidnplayr 299
  .nextdevice:
1472 hidnplayr 300
	mov	ebx, [esi]
301
	cmp	ax , word [device.pci_bus]		; compare with pci and device num in device list (notice the usage of word instead of byte)
1159 hidnplayr 302
	je	.find_devicenum 			; Device is already loaded, let's find it's device number
1472 hidnplayr 303
	add	esi, 4
1159 hidnplayr 304
	loop	.nextdevice
305
 
1472 hidnplayr 306
 
1159 hidnplayr 307
; This device doesnt have its own eth_device structure yet, lets create one
308
  .firstdevice:
1519 hidnplayr 309
	cmp	[devices], MAX_DEVICES			; First check if the driver can handle one more card
1159 hidnplayr 310
	jge	.fail
311
 
1541 hidnplayr 312
	allocate_and_clear ebx, device.size, .fail	; Allocate the buffer for device structure
1159 hidnplayr 313
 
314
; Fill in the direct call addresses into the struct
315
 
1486 hidnplayr 316
	mov	[device.reset], reset
317
	mov	[device.transmit], transmit
318
	mov	[device.get_MAC], read_mac
319
	mov	[device.set_MAC], write_mac
320
	mov	[device.unload], unload
321
	mov	[device.name], my_service
1159 hidnplayr 322
 
323
; save the pci bus and device numbers
324
 
1472 hidnplayr 325
	mov	eax, [IOCTL.input]
1159 hidnplayr 326
	mov	cl , [eax+1]
1472 hidnplayr 327
	mov	[device.pci_bus], cl
1159 hidnplayr 328
	mov	cl , [eax+2]
1472 hidnplayr 329
	mov	[device.pci_dev], cl
1159 hidnplayr 330
 
331
; Now, it's time to find the base io addres of the PCI device
332
 
1472 hidnplayr 333
	find_io [device.pci_bus], [device.pci_dev], [device.io_addr]
1159 hidnplayr 334
 
335
; We've found the io address, find IRQ now
336
 
1492 hidnplayr 337
	find_irq [device.pci_bus], [device.pci_dev], [device.irq_line]
1159 hidnplayr 338
 
1472 hidnplayr 339
	DEBUGF	2,"Hooking into device, dev:%x, bus:%x, irq:%x, addr:%x\n",\
340
	[device.pci_dev]:1,[device.pci_bus]:1,[device.irq_line]:1,[device.io_addr]:4
1159 hidnplayr 341
 
1556 hidnplayr 342
; Allocate the receive buffer
1159 hidnplayr 343
 
1556 hidnplayr 344
	stdcall CreateRingBuffer, dword (RX_BUFFER_SIZE), dword PG_SW
345
	test	eax, eax
346
	jz	.err
347
	mov	[device.rx_buffer], eax
1159 hidnplayr 348
 
349
; Ok, the eth_device structure is ready, let's probe the device
350
 
351
	call	probe							; this function will output in eax
352
	test	eax, eax
353
	jnz	.err							; If an error occured, exit
354
 
1519 hidnplayr 355
	mov	eax, [devices]						; Add the device structure to our device list
356
	mov	[device_list+4*eax], ebx				; (IRQ handler uses this list to find device)
357
	inc	[devices]						;
1159 hidnplayr 358
 
1514 hidnplayr 359
	mov	[device.type], NET_TYPE_ETH
360
	call	NetRegDev
361
 
1159 hidnplayr 362
	cmp	eax, -1
363
	je	.destroy
364
 
365
	ret
366
 
367
; If the device was already loaded, find the device number and return it in eax
368
 
369
  .find_devicenum:
1472 hidnplayr 370
	DEBUGF	2,"Trying to find device number of already registered device\n"
1514 hidnplayr 371
	call	NetPtrToNum						; This kernel procedure converts a pointer to device struct in ebx
1159 hidnplayr 372
									; into a device number in edi
373
	mov	eax, edi						; Application wants it in eax instead
1472 hidnplayr 374
	DEBUGF	2,"Kernel says: %u\n", eax
1159 hidnplayr 375
	ret
376
 
377
; If an error occured, remove all allocated data and exit (returning -1 in eax)
378
 
379
  .destroy:
380
	; todo: reset device into virgin state
381
 
382
  .err:
1472 hidnplayr 383
	stdcall KernelFree, dword [device.rx_buffer]
1159 hidnplayr 384
	stdcall KernelFree, ebx
385
 
386
  .fail:
387
	or	eax, -1
388
	ret
389
 
390
;------------------------------------------------------
391
endp
392
 
393
 
394
;;/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\;;
395
;;                                                                        ;;
396
;;        Actual Hardware dependent code starts here                      ;;
397
;;                                                                        ;;
398
;;/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\;;
399
 
400
align 4
401
unload:
402
	; TODO: (in this particular order)
403
	;
404
	; - Stop the device
405
	; - Detach int handler
406
	; - Remove device from local list (RTL8139_LIST)
407
	; - call unregister function in kernel
408
	; - Remove all allocated structures and buffers the card used
409
 
410
	or	eax,-1
411
 
412
ret
413
 
414
 
415
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
416
;;
417
;;  probe: enables the device (if it really is RTL8139)
418
;;
419
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
420
 
421
align 4
422
probe:
423
	DEBUGF	2,"Probing rtl8139 device: "
424
 
1472 hidnplayr 425
	make_bus_master [device.pci_bus], [device.pci_dev]
1159 hidnplayr 426
 
427
; get chip version
428
 
1472 hidnplayr 429
	set_io	0
430
	set_io	REG_TXCONFIG + 2
1159 hidnplayr 431
	in	ax , dx
432
	shr	ah , 2
433
	shr	ax , 6
434
	and	al , 01111111b
1514 hidnplayr 435
 
1159 hidnplayr 436
	mov	ecx, HW_VER_ARRAY_SIZE-1
437
  .chip_ver_loop:
1514 hidnplayr 438
	cmp	al , [hw_ver_array + ecx]
1159 hidnplayr 439
	je	.chip_ver_found
440
	dec	ecx
441
	jns	.chip_ver_loop
1514 hidnplayr 442
  .unknown:
443
	mov	ecx, 8
1159 hidnplayr 444
  .chip_ver_found:
1514 hidnplayr 445
	cmp	ecx, 8
446
	jg	.unknown
447
 
1472 hidnplayr 448
	mov	[device.hw_ver_id], cl
1159 hidnplayr 449
 
1514 hidnplayr 450
	mov	ecx, [crosslist + ecx*4]
1472 hidnplayr 451
	mov	[device.name], ecx
1178 hidnplayr 452
 
1514 hidnplayr 453
	DEBUGF	2,"Chip version: %s\n", ecx
1178 hidnplayr 454
 
1159 hidnplayr 455
; wake up the chip
456
 
1472 hidnplayr 457
	set_io	0
458
	set_io	REG_HLTCLK
1159 hidnplayr 459
	mov	al , 'R' ; run the clock
460
	out	dx , al
461
 
462
; unlock config and BMCR registers
463
 
1472 hidnplayr 464
	set_io	REG_9346CR
1159 hidnplayr 465
	mov	al , (1 shl BIT_93C46_EEM1) or (1 shl BIT_93C46_EEM0)
466
	out	dx , al
467
 
468
; enable power management
469
 
1472 hidnplayr 470
	set_io	REG_CONFIG1
1159 hidnplayr 471
	in	al , dx
1472 hidnplayr 472
	cmp	[device.hw_ver_id], IDX_RTL8139B
1159 hidnplayr 473
	jl	.old_chip
474
 
475
; set LWAKE pin to active high (default value).
476
; it is for Wake-On-LAN functionality of some motherboards.
477
; this signal is used to inform the motherboard to execute a wake-up process.
478
; only at newer chips.
479
 
480
	or	al , (1 shl BIT_PMEn)
481
	and	al , not (1 shl BIT_LWACT)
482
	out	dx , al
1472 hidnplayr 483
 
484
	set_io	REG_CONFIG4
1159 hidnplayr 485
	in	al , dx
486
	and	al , not (1 shl BIT_LWPTN)
487
	out	dx , al
1472 hidnplayr 488
 
1159 hidnplayr 489
	jmp	.finish_wake_up
490
  .old_chip:
491
 
492
; wake up older chips
493
 
494
	and	al , not ((1 shl BIT_SLEEP) or (1 shl BIT_PWRDWN))
495
	out	dx , al
496
  .finish_wake_up:
497
 
498
; lock config and BMCR registers
499
 
500
	xor	al , al
1472 hidnplayr 501
	set_io	0
502
	set_io	REG_9346CR
1159 hidnplayr 503
	out	dx , al
504
	DEBUGF	2,"done!\n"
505
 
506
 
507
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
508
;;
509
;;   reset: Set up all registers and descriptors, clear some values
510
;;
511
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
512
 
513
reset:
514
	DEBUGF	2,"Resetting rtl8139: "
515
 
516
; attach int handler
517
 
1472 hidnplayr 518
	movzx	eax, [device.irq_line]
1159 hidnplayr 519
	DEBUGF	1,"Attaching int handler to irq %x, ",eax:1
520
	stdcall AttachIntHandler, eax, int_handler, dword 0
521
	test	eax, eax
522
	jnz	@f
523
	DEBUGF	1,"\nCould not attach int handler!\n"
524
;        or      eax, -1
525
;        ret
1519 hidnplayr 526
       @@:
1159 hidnplayr 527
 
528
; reset chip
529
 
530
	DEBUGF	1,"Resetting chip\n"
1472 hidnplayr 531
	set_io	0
532
	set_io	REG_COMMAND
1159 hidnplayr 533
	mov	al , 1 shl BIT_RST
534
	out	dx , al
535
	mov	cx , 1000		; wait no longer for the reset
536
  .wait_for_reset:
537
	in	al , dx
538
	test	al , 1 shl BIT_RST
539
	jz	.reset_completed	; RST remains 1 during reset
540
	dec	cx
541
	jns	.wait_for_reset
542
  .reset_completed:
543
 
544
; unlock config and BMCR registers
545
 
1472 hidnplayr 546
	set_io	REG_9346CR
1159 hidnplayr 547
	mov	al , (1 shl BIT_93C46_EEM1) or (1 shl BIT_93C46_EEM0)
548
	out	dx , al
549
 
550
; initialize multicast registers (no filtering)
551
 
552
	mov	eax, 0xffffffff
1472 hidnplayr 553
	set_io	REG_MAR0
1159 hidnplayr 554
	out	dx , eax
1472 hidnplayr 555
	set_io	REG_MAR4
1159 hidnplayr 556
	out	dx , eax
557
 
558
; enable Rx/Tx
559
 
560
	mov	al , (1 shl BIT_RE) or (1 shl BIT_TE)
1472 hidnplayr 561
	set_io	REG_COMMAND
1159 hidnplayr 562
	out	dx , al
563
 
1556 hidnplayr 564
; Rxbuffer size, unlimited dma burst, no wrapping, no rx threshold
1159 hidnplayr 565
; accept broadcast packets, accept physical match packets
566
 
567
	mov	ax , RX_CONFIG
1472 hidnplayr 568
	set_io	REG_RXCONFIG
1159 hidnplayr 569
	out	dx , ax
570
 
1472 hidnplayr 571
 
1159 hidnplayr 572
; 1024 bytes DMA burst, total retries = 16 + 8 * 16 = 144
573
 
574
	mov	eax , (TX_MXDMA shl BIT_TX_MXDMA) or (TXRR shl BIT_TXRR) or BIT_IFG1 or BIT_IFG0
1472 hidnplayr 575
	set_io	REG_TXCONFIG
1159 hidnplayr 576
	out	dx , eax
577
 
578
; enable auto negotiation
579
 
1472 hidnplayr 580
	set_io	REG_BMCR
1159 hidnplayr 581
	in	ax , dx
582
	or	ax , (1 shl BIT_ANE)
583
	out	dx , ax
584
 
585
; set auto negotiation advertisement
586
 
1472 hidnplayr 587
	set_io	REG_ANAR
1159 hidnplayr 588
	in	ax , dx
589
	or	ax , (1 shl BIT_SELECTOR) or (1 shl BIT_10) or (1 shl BIT_10FD) or (1 shl BIT_TX) or (1 shl BIT_TXFD)
590
	out	dx , ax
591
 
592
; lock config and BMCR registers
593
 
594
	xor	eax, eax
1472 hidnplayr 595
	set_io	REG_9346CR
1159 hidnplayr 596
	out	dx , al
597
 
598
; init RX/TX pointers
599
 
1472 hidnplayr 600
	mov	[device.rx_data_offset], eax
601
	mov	[device.curr_tx_desc], al
1159 hidnplayr 602
 
1556 hidnplayr 603
;        set_io  REG_CAPR
604
;        out     dx , ax
605
 
1171 hidnplayr 606
; clear packet/byte counters
607
 
1472 hidnplayr 608
	lea	edi, [device.bytes_tx]
1171 hidnplayr 609
	mov	ecx, 6
610
	rep	stosd
611
 
1159 hidnplayr 612
; clear missing packet counter
613
 
1472 hidnplayr 614
	set_io	REG_MPC
1159 hidnplayr 615
	out	dx , eax
616
 
1472 hidnplayr 617
; set RxBuffer address, init RX buffer offset
1159 hidnplayr 618
 
1472 hidnplayr 619
	mov	eax, [device.rx_buffer]
1556 hidnplayr 620
	mov	dword[eax], 0
621
	DEBUGF	2,"RX buffer:%x\n", eax
622
	GetRealAddr
623
	DEBUGF	2,"RX buffer:%X\n", eax
1472 hidnplayr 624
	set_io	REG_RBSTART
1159 hidnplayr 625
	out	dx , eax
626
 
1541 hidnplayr 627
; Read MAC address
628
 
629
	call	read_mac
630
 
1159 hidnplayr 631
; enable interrupts
632
 
1541 hidnplayr 633
	set_io	0
634
	set_io	REG_IMR
1159 hidnplayr 635
	mov	eax, INTERRUPT_MASK
636
	out	dx , ax
637
 
1519 hidnplayr 638
; Set the mtu, kernel will be able to send now
639
	mov	[device.mtu], 1514
640
 
1159 hidnplayr 641
; Indicate that we have successfully reset the card
642
 
643
	DEBUGF	2,"Done!\n"
644
	xor	eax, eax
645
 
646
	ret
647
 
648
 
649
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
650
;;                                         ;;
651
;; Transmit                                ;;
652
;;                                         ;;
1254 hidnplayr 653
;; In: buffer pointer in [esp+4]           ;;
654
;;     size of buffer in [esp+8]           ;;
1159 hidnplayr 655
;;     pointer to device structure in ebx  ;;
656
;;                                         ;;
657
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
658
align 4
659
transmit:
1556 hidnplayr 660
	DEBUGF	1,"\nTransmitting packet, buffer:%x, size:%u\n",[esp+4],[esp+8]
1254 hidnplayr 661
	mov	eax, [esp+4]
1159 hidnplayr 662
	DEBUGF	1,"To: %x-%x-%x-%x-%x-%x From: %x-%x-%x-%x-%x-%x Type:%x%x\n",\
663
	[eax+00]:2,[eax+01]:2,[eax+02]:2,[eax+03]:2,[eax+04]:2,[eax+05]:2,\
664
	[eax+06]:2,[eax+07]:2,[eax+08]:2,[eax+09]:2,[eax+10]:2,[eax+11]:2,\
665
	[eax+13]:2,[eax+12]:2
666
 
1254 hidnplayr 667
	cmp	dword [esp+8], MAX_ETH_FRAME_SIZE
1519 hidnplayr 668
	jg	.fail
1254 hidnplayr 669
	cmp	dword [esp+8], 60
1519 hidnplayr 670
	jl	.fail
1159 hidnplayr 671
 
1556 hidnplayr 672
; check if we own the current discriptor
1519 hidnplayr 673
	set_io	0
1556 hidnplayr 674
	set_io	REG_TSD0
1472 hidnplayr 675
	movzx	ecx, [device.curr_tx_desc]
1519 hidnplayr 676
	shl	ecx, 2
1556 hidnplayr 677
	add	edx, ecx
678
	in	eax, dx
679
	test	eax, (1 shl BIT_OWN)
1519 hidnplayr 680
	jz	.wait_to_send
1159 hidnplayr 681
 
1519 hidnplayr 682
  .send_packet:
1556 hidnplayr 683
; get next descriptor
684
	inc	[device.curr_tx_desc]
685
	and	[device.curr_tx_desc], NUM_TX_DESC-1
686
 
687
; Update stats
688
	inc	[device.packets_tx]
689
	mov	eax, [esp+8]
690
	add	dword [device.bytes_tx], eax
691
	adc	dword [device.bytes_tx + 4], 0
692
 
1519 hidnplayr 693
; Set the buffer address
1556 hidnplayr 694
	set_io	REG_TSAD0
1519 hidnplayr 695
	mov	eax, [esp+4]
696
	mov	[device.TX_DESC+ecx], eax
697
	GetRealAddr
698
	out	dx, eax
1159 hidnplayr 699
 
1519 hidnplayr 700
; And the size of the buffer
1556 hidnplayr 701
	set_io	REG_TSD0
1519 hidnplayr 702
	mov	eax, [esp+8]
1556 hidnplayr 703
	or	eax, (ERTXTH shl BIT_ERTXTH)	; Early threshold
704
	out	dx, eax
1159 hidnplayr 705
 
1556 hidnplayr 706
	DEBUGF	1,"Packet Sent!\n"
1519 hidnplayr 707
	xor	eax, eax
708
	ret	8
1159 hidnplayr 709
 
1519 hidnplayr 710
  .wait_to_send:
711
	DEBUGF	1,"Waiting for timeout\n"
1159 hidnplayr 712
 
1556 hidnplayr 713
	push	edx
714
	mov	esi, 300
1519 hidnplayr 715
	stdcall Sleep
1556 hidnplayr 716
	pop	edx
1159 hidnplayr 717
 
1519 hidnplayr 718
	in	ax, dx
719
	test	ax, (1 shl BIT_OWN)
720
	jnz	.send_packet
1159 hidnplayr 721
 
1519 hidnplayr 722
	pusha
723
	call	reset				 ; if chip hung, reset it
724
	popa
725
 
726
	jmp	.send_packet
727
 
728
  .fail:
729
	DEBUGF	1,"failed!\n"
1541 hidnplayr 730
	stdcall KernelFree, [esp+4]
1519 hidnplayr 731
	ret	8
732
 
733
 
734
 
735
 
736
 
1159 hidnplayr 737
;;;;;;;;;;;;;;;;;;;;;;;
738
;;                   ;;
739
;; Interrupt handler ;;
740
;;                   ;;
741
;;;;;;;;;;;;;;;;;;;;;;;
742
align 4
743
int_handler:
744
 
1556 hidnplayr 745
	DEBUGF	1,"\nIRQ %x\n", eax:2			; no, you cant replace 'eax:2' with 'al', this must be a bug in FDO
1159 hidnplayr 746
 
747
; find pointer of device wich made IRQ occur
748
 
1519 hidnplayr 749
	mov	esi, device_list
750
	mov	ecx, [devices]
1486 hidnplayr 751
	test	ecx, ecx
752
	jz	.fail
1159 hidnplayr 753
.nextdevice:
754
	mov	ebx, dword [esi]
755
 
1472 hidnplayr 756
	set_io	0
757
	set_io	REG_ISR
1159 hidnplayr 758
	in	ax , dx
759
	out	dx , ax 			    ; send it back to ACK
760
 
761
	add	esi, 4
762
 
763
	test	ax , ax
764
	jnz	.got_it
765
 
1486 hidnplayr 766
	dec	ecx
767
	jnz	.nextdevice
1159 hidnplayr 768
 
769
	ret					    ; If no device was found, abort (The irq was probably for a device, not registered to this driver)
770
 
771
  .got_it:
772
 
773
; looks like we've found it!
774
 
775
; Lets found out why the irq occured then..
776
 
777
;----------------------------------------------------
778
; Received packet ok?
779
	test	ax, ISR_ROK
780
	jz	@f
781
	push	ax
782
 
783
  .receive:
1472 hidnplayr 784
	set_io	0
785
	set_io	REG_COMMAND
786
	in	al , dx
1159 hidnplayr 787
	test	al , BUFE			    ; test if RX buffer is empty
788
	jnz	.finish 			    ;
789
 
1472 hidnplayr 790
	DEBUGF	1,"RX: "
1159 hidnplayr 791
 
1472 hidnplayr 792
	mov	eax, [device.rx_buffer]
793
	add	eax, [device.rx_data_offset]
1159 hidnplayr 794
	test	byte [eax], (1 shl BIT_ROK)	    ; check if packet is ok
795
	jz	.reset_rx
1472 hidnplayr 796
 
797
; packet is ok, copy it
1159 hidnplayr 798
	movzx	ecx, word [eax+2]		    ; packet length
1472 hidnplayr 799
 
1556 hidnplayr 800
	sub	ecx, 4				    ; don't copy CRC
801
 
1472 hidnplayr 802
; Update stats
803
	add	dword [device.bytes_rx], ecx
804
	adc	dword [device.bytes_rx + 4], 0
805
	inc	dword [device.packets_rx]
806
 
1159 hidnplayr 807
	DEBUGF	1,"Received %u bytes\n", ecx
808
 
809
	push	ebx eax ecx
810
	stdcall KernelAlloc, ecx		    ; Allocate a buffer to put packet into
811
	pop	ecx
812
	test	eax, eax			    ; Test if we allocated succesfully
1472 hidnplayr 813
	jz	.abort
1159 hidnplayr 814
 
1472 hidnplayr 815
	mov	edi, eax			    ; Where we will copy too
816
 
817
	mov	esi, [esp]			    ; The buffer we will copy from
1159 hidnplayr 818
	add	esi, 4				    ; Dont copy CRC
819
 
820
	push	dword .abort			    ; Kernel will return to this address after EthReceiver
821
	push	ecx edi 			    ; Save buffer pointer and size, to pass to kernel
822
 
1472 hidnplayr 823
  .copy:
824
	shr	ecx, 1
825
	jnc	.nb
826
	movsb
827
  .nb:
828
	shr	ecx, 1
829
	jnc	.nw
830
	movsw
831
  .nw:
832
	jz	.nd
833
	rep	movsd
834
  .nd:
1159 hidnplayr 835
 
836
	jmp	EthReceiver			    ; Send it to kernel
837
 
838
  .abort:
839
	pop	eax ebx
840
						    ; update eth_data_start_offset
841
	movzx	eax, word [eax+2]		    ; packet length
1472 hidnplayr 842
	add	eax, [device.rx_data_offset]
1159 hidnplayr 843
	add	eax, 4+3			    ; packet header is 4 bytes long + dword alignment
844
	and	eax, not 3			    ; dword alignment
1472 hidnplayr 845
 
1159 hidnplayr 846
	cmp	eax, RX_BUFFER_SIZE
847
	jl	.no_wrap
1472 hidnplayr 848
	DEBUGF	2,"Wrapping"
1159 hidnplayr 849
	sub	eax, RX_BUFFER_SIZE
850
  .no_wrap:
1472 hidnplayr 851
	mov	[device.rx_data_offset], eax
1556 hidnplayr 852
	DEBUGF	1,"New RX ptr: %d\n", eax
1159 hidnplayr 853
 
1472 hidnplayr 854
	set_io	0
855
	set_io	REG_CAPR			    ; update 'Current Address of Packet Read register'
1159 hidnplayr 856
	sub	eax, 0x10			    ; value 0x10 is a constant for CAPR
857
	out	dx , ax
858
 
859
	jmp	.receive			    ; check for multiple packets
860
 
861
  .reset_rx:
862
	test	byte [eax], (1 shl BIT_CRC)
863
	jz	.no_crc_error
864
	DEBUGF	2,"\nCRC error!\n"
865
 
866
  .no_crc_error:
867
	test	byte [eax], (1 shl BIT_FAE)
868
	jz	.no_fae_error
869
	DEBUGF	1,"\nFrame alignment error!\n"
870
 
871
  .no_fae_error:
872
	DEBUGF	1,"Reset RX\n"
873
	in	al , dx 			    ; read command register
874
	push	ax
875
 
876
	and	al , not (1 shl BIT_RE) 	    ; Clear the RE bit
877
	out	dx , al
878
 
879
	pop	ax
880
	out	dx , al 			    ; write original command back
881
 
882
	add	edx, REG_RXCONFIG - REG_COMMAND     ; Restore RX configuration
883
	mov	ax , RX_CONFIG
884
	out	dx , ax
885
 
886
  .finish:
887
	pop	ax
888
 
889
;----------------------------------------------------
1556 hidnplayr 890
; Transmit ok / Transmit error
1159 hidnplayr 891
  @@:
1556 hidnplayr 892
	test	ax, ISR_TOK + ISR_TER
1159 hidnplayr 893
	jz	@f
894
 
1556 hidnplayr 895
	push	ax
896
	xor	ecx, ecx
897
  .txdesloop:
898
	set_io	0
899
	set_io	REG_TSD0
900
	add	edx, ecx
901
	in	eax, dx
1541 hidnplayr 902
 
1556 hidnplayr 903
	test	eax, TSR_OWN			; DMA operation completed
904
	jz	.notthisone
905
 
906
	cmp	[device.TX_DESC+ecx], 0
907
	je	.notthisone
908
 
1519 hidnplayr 909
;  .notxd:
910
;        test    eax, TSR_TUN
911
;        jz      .nobun
912
;        DEBUGF  2, "TX: FIFO Buffer underrun!\n"
913
;
914
;  .nobun:
915
;        test    eax, TSR_OWC
916
;        jz      .noowc
917
;        DEBUGF  2, "TX: OWC!\n"
918
;
919
;  .noowc:
920
;        test    eax, TSR_TABT
921
;        jz      .notabt
922
;        DEBUGF  2, "TX: TABT!\n"
923
;
924
;  .notabt:
925
;        test    eax, TSR_CRS
926
;        jz      .nocsl
927
;        DEBUGF  2, "TX: Carrier Sense Lost!\n"
928
;
929
;  .nocsl:
930
 
931
	DEBUGF	1,"TX OK: free buffer %x\n", [device.TX_DESC+ecx]:8
1556 hidnplayr 932
	push	ecx ebx
1519 hidnplayr 933
	stdcall KernelFree, [device.TX_DESC+ecx]
1556 hidnplayr 934
	pop	ebx ecx
935
	mov	[device.TX_DESC+ecx], 0
936
 
1519 hidnplayr 937
  .notthisone:
1556 hidnplayr 938
	add	ecx, 4
939
	cmp	ecx, 16
940
	jl	.txdesloop
1159 hidnplayr 941
	pop	ax
942
 
943
;----------------------------------------------------
944
; Rx buffer overflow ?
945
  @@:
946
	test	ax, ISR_RXOVW
947
	jz	@f
948
 
949
	push	ax
1472 hidnplayr 950
	DEBUGF	2,"RX-buffer overflow!\n"
1159 hidnplayr 951
 
1519 hidnplayr 952
	set_io	0
953
	set_io	REG_ISR
1159 hidnplayr 954
	mov	ax , ISR_FIFOOVW or ISR_RXOVW
955
	out	dx , ax
956
	pop	ax
957
 
958
;----------------------------------------------------
1519 hidnplayr 959
; Packet underrun?
1159 hidnplayr 960
  @@:
961
	test	ax, ISR_PUN
962
	jz	@f
963
 
1472 hidnplayr 964
	DEBUGF	2,"Packet underrun!\n"
1159 hidnplayr 965
 
966
;----------------------------------------------------
967
; Receive FIFO overflow ?
968
  @@:
969
	test	ax, ISR_FIFOOVW
970
	jz	@f
971
 
972
	push	ax
1519 hidnplayr 973
	DEBUGF	2,"RX fifo overflow!\n"
1159 hidnplayr 974
 
1519 hidnplayr 975
	set_io	0
976
	set_io	REG_ISR
1159 hidnplayr 977
	mov	ax , ISR_FIFOOVW or ISR_RXOVW
978
	out	dx , ax
979
	pop	ax
980
 
981
;----------------------------------------------------
982
; Something about Cable changed ?
983
  @@:
984
	test	ax, ISR_LENCHG
985
	jz	.fail
986
 
987
	DEBUGF	2,"Cable changed!\n"
988
	call	cable
989
 
990
  .fail:
991
	ret
992
 
993
 
994
 
995
 
996
;;;;;;;;;;;;;;;;;;;;;;;;;
997
;;                     ;;
998
;; Update Cable status ;;
999
;;                     ;;
1000
;;;;;;;;;;;;;;;;;;;;;;;;;
1001
 
1002
align 4
1003
cable:
1004
	DEBUGF	1,"Checking Cable status: "
1005
 
1472 hidnplayr 1006
	mov	edx, dword [device.io_addr]
1159 hidnplayr 1007
	add	edx, REG_MSR
1008
	in	al , dx
1009
 
1010
;        test    al , 1 SHL 2     ; 0 = link ok 1 = link fail
1011
;        jnz     .notconnected
1012
 
1013
;        test    al , 1 SHL 3     ; 0 = 100 Mbps 1 = 10 Mbps
1014
;        jnz     .10mbps
1015
 
1016
	shr	al, 2
1017
	and	al, 3
1018
 
1472 hidnplayr 1019
	mov	byte [device.mode+3], al
1159 hidnplayr 1020
	DEBUGF	1,"Done!\n"
1021
ret
1022
 
1023
 
1024
 
1025
;;;;;;;;;;;;;;;;;;;;;;;
1026
;;                   ;;
1027
;; Write MAC address ;;
1028
;;                   ;;
1029
;;;;;;;;;;;;;;;;;;;;;;;
1030
 
1031
align 4
1032
write_mac:	; in: mac pushed onto stack (as 3 words)
1033
 
1472 hidnplayr 1034
	DEBUGF	2,"Writing MAC: "
1159 hidnplayr 1035
 
1036
; disable all in command registers
1037
 
1472 hidnplayr 1038
	set_io	0
1039
	set_io	REG_9346CR
1159 hidnplayr 1040
	xor	eax, eax
1041
	out	dx , al
1042
 
1472 hidnplayr 1043
	set_io	REG_IMR
1159 hidnplayr 1044
	xor	eax, eax
1045
	out	dx , ax
1046
 
1472 hidnplayr 1047
	set_io	REG_ISR
1159 hidnplayr 1048
	mov	eax, -1
1049
	out	dx , ax
1050
 
1051
; enable writing
1052
 
1472 hidnplayr 1053
	set_io	REG_9346CR
1159 hidnplayr 1054
	mov	eax, REG_9346CR_WE
1055
	out	dx , al
1056
 
1057
 ; write the mac ...
1058
 
1472 hidnplayr 1059
	set_io	REG_IDR0
1159 hidnplayr 1060
	pop	eax
1061
	out	dx , eax
1062
 
1472 hidnplayr 1063
	set_io	REG_IDR0+4
1159 hidnplayr 1064
	xor	eax, eax
1065
	pop	ax
1066
	out	dx , eax
1067
 
1068
; disable writing
1069
 
1472 hidnplayr 1070
	set_io	REG_9346CR
1159 hidnplayr 1071
	xor	eax, eax
1072
	out	dx , al
1073
 
1472 hidnplayr 1074
	DEBUGF	2,"ok!\n"
1159 hidnplayr 1075
 
1076
; Notice this procedure does not ret, but continues to read_mac instead.
1077
 
1078
 
1079
;;;;;;;;;;;;;;;;;;;;;;
1080
;;                  ;;
1081
;; Read MAC address ;;
1082
;;                  ;;
1083
;;;;;;;;;;;;;;;;;;;;;;
1084
 
1085
read_mac:
1472 hidnplayr 1086
	DEBUGF	2,"Reading MAC: "
1159 hidnplayr 1087
 
1472 hidnplayr 1088
	set_io	0
1089
	lea	edi, [device.mac]
1177 clevermous 1090
	in	eax, dx
1159 hidnplayr 1091
	stosd
1177 clevermous 1092
	add	edx, 4
1173 clevermous 1093
	in	ax, dx
1159 hidnplayr 1094
	stosw
1095
 
1472 hidnplayr 1096
	DEBUGF	2,"%x-%x-%x-%x-%x-%x\n",[edi-6]:2,[edi-5]:2,[edi-4]:2,[edi-3]:2,[edi-2]:2,[edi-1]:2
1173 clevermous 1097
 
1159 hidnplayr 1098
	ret
1099
 
1100
 
1101
; End of code
1102
 
1519 hidnplayr 1103
section '.data' data readable writable align 16 ; place all uninitialized data place here
1159 hidnplayr 1104
align 4 					; Place all initialised data here
1105
 
1519 hidnplayr 1106
devices 	dd 0
1107
version 	dd (DRIVER_VERSION shl 16) or (API_VERSION and 0xFFFF)
1108
my_service	db 'RTL8139',0			  ; max 16 chars include zero
1159 hidnplayr 1109
 
1519 hidnplayr 1110
device_1	db 'Realtek 8139',0
1111
device_2	db 'Realtek 8139A',0
1112
device_3	db 'Realtek 8139B',0
1113
device_4	db 'Realtek 8139C',0
1114
device_5	db 'Realtek 8100',0
1115
device_6	db 'Realtek 8139D',0
1116
device_7	db 'Realtek 8139CP',0
1117
device_8	db 'Realtek 8101',0
1118
device_unknown	db 'Unknown RTL8139 clone', 0
1178 hidnplayr 1119
 
1519 hidnplayr 1120
crosslist:
1121
	dd device_1
1122
	dd device_2
1123
	dd device_3
1124
	dd device_4
1125
	dd device_5
1126
	dd device_6
1127
	dd device_7
1128
	dd device_8
1129
	dd device_unknown
1178 hidnplayr 1130
 
1519 hidnplayr 1131
hw_ver_array:			 ; This array is used by the probe routine to find out wich version of the RTL8139 we are working with
1132
	db VER_RTL8139
1133
	db VER_RTL8139A
1134
	db VER_RTL8139B
1135
	db VER_RTL8139C
1136
	db VER_RTL8100
1137
	db VER_RTL8139D
1138
	db VER_RTL8139CP
1139
	db VER_RTL8101
1140
	db 0
1159 hidnplayr 1141
 
1142
HW_VER_ARRAY_SIZE = $-hw_ver_array
1143
 
1144
include_debug_strings				; All data wich FDO uses will be included here
1145
 
1519 hidnplayr 1146
device_list	rd MAX_DEVICES			 ; This list contains all pointers to device structures the driver is handling
1159 hidnplayr 1147