Subversion Repositories Kolibri OS

Rev

Rev 2387 | 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
 
2387 hidnplayr 20
        API_VERSION             equ 0x01000100
21
        DRIVER_VERSION          equ 5
1159 hidnplayr 22
 
2387 hidnplayr 23
        MAX_DEVICES             equ 16
1519 hidnplayr 24
 
2387 hidnplayr 25
        RBLEN                   equ 3 ; Receive buffer size: 0==8K 1==16k 2==32k 3==64k
1556 hidnplayr 26
 
2387 hidnplayr 27
        DEBUG                   equ 1
28
        __DEBUG__               equ 1
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
 
2387 hidnplayr 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
1159 hidnplayr 61
 
2387 hidnplayr 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
1159 hidnplayr 67
 
2387 hidnplayr 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
1159 hidnplayr 72
 
2387 hidnplayr 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
1159 hidnplayr 76
 
2387 hidnplayr 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)
1159 hidnplayr 79
 
2387 hidnplayr 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
1159 hidnplayr 91
 
2387 hidnplayr 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
1159 hidnplayr 98
 
2387 hidnplayr 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
1159 hidnplayr 103
 
2387 hidnplayr 104
        BIT_LWPTN               equ 2 ; see REG_CONFIG4
1159 hidnplayr 105
 
2387 hidnplayr 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
1159 hidnplayr 109
 
2387 hidnplayr 110
        BIT_ANE                 equ 12 ; auto negotiation enable
1159 hidnplayr 111
 
2387 hidnplayr 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
1159 hidnplayr 117
 
2387 hidnplayr 118
        BIT_IFG1                equ 25
119
        BIT_IFG0                equ 24
1159 hidnplayr 120
 
2387 hidnplayr 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
1159 hidnplayr 126
 
2387 hidnplayr 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\
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
 
2387 hidnplayr 137
        RX_BUFFER_SIZE          equ (8192 shl RBLEN);+16
138
        MAX_ETH_FRAME_SIZE      equ 1516 ; exactly 1514 wthout CRC
139
        NUM_TX_DESC             equ 4
1159 hidnplayr 140
 
2387 hidnplayr 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
1159 hidnplayr 146
 
2387 hidnplayr 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
1159 hidnplayr 158
 
2387 hidnplayr 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
1159 hidnplayr 167
 
2387 hidnplayr 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
1159 hidnplayr 178
 
2387 hidnplayr 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
1159 hidnplayr 186
 
2387 hidnplayr 187
        TSR_OWN                 equ 1 SHL 13
188
        TSR_TUN                 equ 1 SHL 14
189
        TSR_TOK                 equ 1 SHL 15
1159 hidnplayr 190
 
2387 hidnplayr 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
1159 hidnplayr 195
 
196
 
1519 hidnplayr 197
virtual at ebx
1159 hidnplayr 198
 
2387 hidnplayr 199
        device:
1519 hidnplayr 200
 
2387 hidnplayr 201
        ETH_DEVICE
1519 hidnplayr 202
 
2387 hidnplayr 203
        .rx_buffer      dd ?
204
        .tx_buffer      dd ?
1556 hidnplayr 205
 
2387 hidnplayr 206
        .rx_data_offset dd ?
207
        .io_addr        dd ?
1556 hidnplayr 208
 
2387 hidnplayr 209
        .curr_tx_desc   db ?
210
        .pci_bus        db ?
211
        .pci_dev        db ?
212
        .irq_line       db ?
213
        .hw_ver_id      db ?
1519 hidnplayr 214
 
2387 hidnplayr 215
        .TX_DESC        rd NUM_TX_DESC
1519 hidnplayr 216
 
2387 hidnplayr 217
        .size = $ - device
1519 hidnplayr 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
 
2387 hidnplayr 235
        cmp [state], 1
236
        jne .exit
1159 hidnplayr 237
 
238
  .entry:
239
 
2387 hidnplayr 240
        DEBUGF  2,"Loading rtl8139 driver\n"
241
        stdcall RegService, my_service, service_proc
242
        ret
1159 hidnplayr 243
 
244
  .fail:
245
  .exit:
2387 hidnplayr 246
        xor eax, eax
247
        ret
1159 hidnplayr 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
 
2387 hidnplayr 262
        mov     edx, [ioctl]
263
        mov     eax, [IOCTL.io_code]
1159 hidnplayr 264
 
265
;------------------------------------------------------
266
 
2387 hidnplayr 267
        cmp     eax, 0 ;SRV_GETVERSION
268
        jne     @F
1159 hidnplayr 269
 
2387 hidnplayr 270
        cmp     [IOCTL.out_size], 4
271
        jl      .fail
272
        mov     eax, [IOCTL.output]
273
        mov     [eax], dword API_VERSION
1159 hidnplayr 274
 
2387 hidnplayr 275
        xor     eax, eax
276
        ret
1159 hidnplayr 277
 
278
;------------------------------------------------------
279
  @@:
2387 hidnplayr 280
        cmp     eax, 1 ;SRV_HOOK
281
        jne     .fail
1159 hidnplayr 282
 
2387 hidnplayr 283
        cmp     [IOCTL.inp_size], 3               ; Data input must be at least 3 bytes
284
        jl      .fail
1159 hidnplayr 285
 
2387 hidnplayr 286
        mov     eax, [IOCTL.input]
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
1159 hidnplayr 289
 
290
; check if the device is already listed
291
 
2387 hidnplayr 292
        mov     esi, device_list
293
        mov     ecx, [devices]
294
        test    ecx, ecx
295
        jz      .firstdevice
1472 hidnplayr 296
 
2544 hidnplayr 297
        mov     ax , [eax+1]                            ; get the pci bus and device numbers
1159 hidnplayr 298
  .nextdevice:
2387 hidnplayr 299
        mov     ebx, [esi]
300
        cmp     ax , word [device.pci_bus]              ; compare with pci and device num in device list (notice the usage of word instead of byte)
301
        je      .find_devicenum                         ; Device is already loaded, let's find it's device number
302
        add     esi, 4
303
        loop    .nextdevice
1159 hidnplayr 304
 
1472 hidnplayr 305
 
1159 hidnplayr 306
; This device doesnt have its own eth_device structure yet, lets create one
307
  .firstdevice:
2387 hidnplayr 308
        cmp     [devices], MAX_DEVICES                  ; First check if the driver can handle one more card
309
        jge     .fail
1159 hidnplayr 310
 
2387 hidnplayr 311
        allocate_and_clear ebx, device.size, .fail      ; Allocate the buffer for device structure
1159 hidnplayr 312
 
313
; Fill in the direct call addresses into the struct
314
 
2387 hidnplayr 315
        mov     [device.reset], reset
316
        mov     [device.transmit], transmit
317
        mov     [device.get_MAC], read_mac
318
        mov     [device.set_MAC], write_mac
319
        mov     [device.unload], unload
320
        mov     [device.name], my_service
1159 hidnplayr 321
 
322
; save the pci bus and device numbers
323
 
2387 hidnplayr 324
        mov     eax, [IOCTL.input]
325
        mov     cl , [eax+1]
326
        mov     [device.pci_bus], cl
327
        mov     cl , [eax+2]
328
        mov     [device.pci_dev], cl
1159 hidnplayr 329
 
330
; Now, it's time to find the base io addres of the PCI device
331
 
2387 hidnplayr 332
        find_io [device.pci_bus], [device.pci_dev], [device.io_addr]
1159 hidnplayr 333
 
334
; We've found the io address, find IRQ now
335
 
2387 hidnplayr 336
        find_irq [device.pci_bus], [device.pci_dev], [device.irq_line]
1159 hidnplayr 337
 
2387 hidnplayr 338
        DEBUGF  2,"Hooking into device, dev:%x, bus:%x, irq:%x, addr:%x\n",\
339
        [device.pci_dev]:1,[device.pci_bus]:1,[device.irq_line]:1,[device.io_addr]:4
1159 hidnplayr 340
 
1556 hidnplayr 341
; Allocate the receive buffer
1159 hidnplayr 342
 
2387 hidnplayr 343
        stdcall CreateRingBuffer, dword (RX_BUFFER_SIZE), dword PG_SW
344
        test    eax, eax
345
        jz      .err
346
        mov     [device.rx_buffer], eax
1159 hidnplayr 347
 
348
; Ok, the eth_device structure is ready, let's probe the device
349
 
2387 hidnplayr 350
        call    probe                                                   ; this function will output in eax
351
        test    eax, eax
352
        jnz     .err                                                    ; If an error occured, exit
1159 hidnplayr 353
 
2387 hidnplayr 354
        mov     eax, [devices]                                          ; Add the device structure to our device list
355
        mov     [device_list+4*eax], ebx                                ; (IRQ handler uses this list to find device)
356
        inc     [devices]                                               ;
1159 hidnplayr 357
 
2387 hidnplayr 358
        mov     [device.type], NET_TYPE_ETH
359
        call    NetRegDev
1514 hidnplayr 360
 
2387 hidnplayr 361
        cmp     eax, -1
362
        je      .destroy
1159 hidnplayr 363
 
2387 hidnplayr 364
        ret
1159 hidnplayr 365
 
366
; If the device was already loaded, find the device number and return it in eax
367
 
368
  .find_devicenum:
2387 hidnplayr 369
        DEBUGF  2,"Trying to find device number of already registered device\n"
370
        call    NetPtrToNum                                             ; This kernel procedure converts a pointer to device struct in ebx
371
                                                                        ; into a device number in edi
372
        mov     eax, edi                                                ; Application wants it in eax instead
373
        DEBUGF  2,"Kernel says: %u\n", eax
374
        ret
1159 hidnplayr 375
 
376
; If an error occured, remove all allocated data and exit (returning -1 in eax)
377
 
378
  .destroy:
2387 hidnplayr 379
        ; todo: reset device into virgin state
1159 hidnplayr 380
 
381
  .err:
2387 hidnplayr 382
        stdcall KernelFree, dword [device.rx_buffer]
383
        stdcall KernelFree, ebx
1159 hidnplayr 384
 
385
  .fail:
2387 hidnplayr 386
        or      eax, -1
387
        ret
1159 hidnplayr 388
 
389
;------------------------------------------------------
390
endp
391
 
392
 
393
;;/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\;;
394
;;                                                                        ;;
395
;;        Actual Hardware dependent code starts here                      ;;
396
;;                                                                        ;;
397
;;/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\;;
398
 
399
align 4
400
unload:
2387 hidnplayr 401
        ; TODO: (in this particular order)
402
        ;
403
        ; - Stop the device
404
        ; - Detach int handler
405
        ; - Remove device from local list (RTL8139_LIST)
406
        ; - call unregister function in kernel
407
        ; - Remove all allocated structures and buffers the card used
1159 hidnplayr 408
 
2387 hidnplayr 409
        or      eax,-1
1159 hidnplayr 410
 
411
ret
412
 
413
 
414
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
415
;;
416
;;  probe: enables the device (if it really is RTL8139)
417
;;
418
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
419
 
420
align 4
421
probe:
2387 hidnplayr 422
        DEBUGF  2,"Probing rtl8139 device: "
1159 hidnplayr 423
 
2387 hidnplayr 424
        make_bus_master [device.pci_bus], [device.pci_dev]
1159 hidnplayr 425
 
426
; get chip version
427
 
2387 hidnplayr 428
        set_io  0
429
        set_io  REG_TXCONFIG + 2
430
        in      ax , dx
431
        shr     ah , 2
432
        shr     ax , 6
433
        and     al , 01111111b
1514 hidnplayr 434
 
2387 hidnplayr 435
        mov     ecx, HW_VER_ARRAY_SIZE-1
1159 hidnplayr 436
  .chip_ver_loop:
2387 hidnplayr 437
        cmp     al , [hw_ver_array + ecx]
438
        je      .chip_ver_found
439
        dec     ecx
440
        jns     .chip_ver_loop
1514 hidnplayr 441
  .unknown:
2387 hidnplayr 442
        mov     ecx, 8
1159 hidnplayr 443
  .chip_ver_found:
2387 hidnplayr 444
        cmp     ecx, 8
445
        jg      .unknown
1514 hidnplayr 446
 
2387 hidnplayr 447
        mov     [device.hw_ver_id], cl
1159 hidnplayr 448
 
2387 hidnplayr 449
        mov     ecx, [crosslist + ecx*4]
450
        mov     [device.name], ecx
1178 hidnplayr 451
 
2387 hidnplayr 452
        DEBUGF  2,"Chip version: %s\n", ecx
1178 hidnplayr 453
 
1159 hidnplayr 454
; wake up the chip
455
 
2387 hidnplayr 456
        set_io  0
457
        set_io  REG_HLTCLK
458
        mov     al , 'R' ; run the clock
459
        out     dx , al
1159 hidnplayr 460
 
461
; unlock config and BMCR registers
462
 
2387 hidnplayr 463
        set_io  REG_9346CR
464
        mov     al , (1 shl BIT_93C46_EEM1) or (1 shl BIT_93C46_EEM0)
465
        out     dx , al
1159 hidnplayr 466
 
467
; enable power management
468
 
2387 hidnplayr 469
        set_io  REG_CONFIG1
470
        in      al , dx
471
        cmp     [device.hw_ver_id], IDX_RTL8139B
472
        jl      .old_chip
1159 hidnplayr 473
 
474
; set LWAKE pin to active high (default value).
475
; it is for Wake-On-LAN functionality of some motherboards.
476
; this signal is used to inform the motherboard to execute a wake-up process.
477
; only at newer chips.
478
 
2387 hidnplayr 479
        or      al , (1 shl BIT_PMEn)
480
        and     al , not (1 shl BIT_LWACT)
481
        out     dx , al
1472 hidnplayr 482
 
2387 hidnplayr 483
        set_io  REG_CONFIG4
484
        in      al , dx
485
        and     al , not (1 shl BIT_LWPTN)
486
        out     dx , al
1472 hidnplayr 487
 
2387 hidnplayr 488
        jmp     .finish_wake_up
1159 hidnplayr 489
  .old_chip:
490
 
491
; wake up older chips
492
 
2387 hidnplayr 493
        and     al , not ((1 shl BIT_SLEEP) or (1 shl BIT_PWRDWN))
494
        out     dx , al
1159 hidnplayr 495
  .finish_wake_up:
496
 
497
; lock config and BMCR registers
498
 
2387 hidnplayr 499
        xor     al , al
500
        set_io  0
501
        set_io  REG_9346CR
502
        out     dx , al
503
        DEBUGF  2,"done!\n"
1159 hidnplayr 504
 
505
 
506
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
507
;;
508
;;   reset: Set up all registers and descriptors, clear some values
509
;;
510
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
511
 
512
reset:
2387 hidnplayr 513
        DEBUGF  2,"Resetting rtl8139: "
1159 hidnplayr 514
 
515
; attach int handler
516
 
2387 hidnplayr 517
        movzx   eax, [device.irq_line]
518
        DEBUGF  1,"Attaching int handler to irq %x, ",eax:1
519
        stdcall AttachIntHandler, eax, int_handler, dword 0
520
        test    eax, eax
521
        jnz     @f
522
        DEBUGF  1,"\nCould not attach int handler!\n"
1159 hidnplayr 523
;        or      eax, -1
524
;        ret
1519 hidnplayr 525
       @@:
1159 hidnplayr 526
 
527
; reset chip
528
 
2387 hidnplayr 529
        DEBUGF  1,"Resetting chip\n"
530
        set_io  0
531
        set_io  REG_COMMAND
532
        mov     al , 1 shl BIT_RST
533
        out     dx , al
534
        mov     cx , 1000               ; wait no longer for the reset
1159 hidnplayr 535
  .wait_for_reset:
2387 hidnplayr 536
        in      al , dx
537
        test    al , 1 shl BIT_RST
538
        jz      .reset_completed        ; RST remains 1 during reset
539
        dec     cx
540
        jns     .wait_for_reset
1159 hidnplayr 541
  .reset_completed:
542
 
543
; unlock config and BMCR registers
544
 
2387 hidnplayr 545
        set_io  REG_9346CR
546
        mov     al , (1 shl BIT_93C46_EEM1) or (1 shl BIT_93C46_EEM0)
547
        out     dx , al
1159 hidnplayr 548
 
549
; initialize multicast registers (no filtering)
550
 
2387 hidnplayr 551
        mov     eax, 0xffffffff
552
        set_io  REG_MAR0
553
        out     dx , eax
554
        set_io  REG_MAR4
555
        out     dx , eax
1159 hidnplayr 556
 
557
; enable Rx/Tx
558
 
2387 hidnplayr 559
        mov     al , (1 shl BIT_RE) or (1 shl BIT_TE)
560
        set_io  REG_COMMAND
561
        out     dx , al
1159 hidnplayr 562
 
1556 hidnplayr 563
; Rxbuffer size, unlimited dma burst, no wrapping, no rx threshold
1159 hidnplayr 564
; accept broadcast packets, accept physical match packets
565
 
2387 hidnplayr 566
        mov     ax , RX_CONFIG
567
        set_io  REG_RXCONFIG
568
        out     dx , ax
1159 hidnplayr 569
 
1472 hidnplayr 570
 
1159 hidnplayr 571
; 1024 bytes DMA burst, total retries = 16 + 8 * 16 = 144
572
 
2387 hidnplayr 573
        mov     eax , (TX_MXDMA shl BIT_TX_MXDMA) or (TXRR shl BIT_TXRR) or BIT_IFG1 or BIT_IFG0
574
        set_io  REG_TXCONFIG
575
        out     dx , eax
1159 hidnplayr 576
 
577
; enable auto negotiation
578
 
2387 hidnplayr 579
        set_io  REG_BMCR
580
        in      ax , dx
581
        or      ax , (1 shl BIT_ANE)
582
        out     dx , ax
1159 hidnplayr 583
 
584
; set auto negotiation advertisement
585
 
2387 hidnplayr 586
        set_io  REG_ANAR
587
        in      ax , dx
588
        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)
589
        out     dx , ax
1159 hidnplayr 590
 
591
; lock config and BMCR registers
592
 
2387 hidnplayr 593
        xor     eax, eax
594
        set_io  REG_9346CR
595
        out     dx , al
1159 hidnplayr 596
 
597
; init RX/TX pointers
598
 
2387 hidnplayr 599
        mov     [device.rx_data_offset], eax
600
        mov     [device.curr_tx_desc], al
1159 hidnplayr 601
 
1556 hidnplayr 602
;        set_io  REG_CAPR
603
;        out     dx , ax
604
 
1171 hidnplayr 605
; clear packet/byte counters
606
 
2387 hidnplayr 607
        lea     edi, [device.bytes_tx]
608
        mov     ecx, 6
609
        rep     stosd
1171 hidnplayr 610
 
1159 hidnplayr 611
; clear missing packet counter
612
 
2387 hidnplayr 613
        set_io  REG_MPC
614
        out     dx , eax
1159 hidnplayr 615
 
1472 hidnplayr 616
; set RxBuffer address, init RX buffer offset
1159 hidnplayr 617
 
2387 hidnplayr 618
        mov     eax, [device.rx_buffer]
619
        mov     dword[eax], 0
620
        DEBUGF  2,"RX buffer:%x\n", eax
621
        GetRealAddr
622
        DEBUGF  2,"RX buffer:%X\n", eax
623
        set_io  REG_RBSTART
624
        out     dx , eax
1159 hidnplayr 625
 
1541 hidnplayr 626
; Read MAC address
627
 
2387 hidnplayr 628
        call    read_mac
1541 hidnplayr 629
 
1159 hidnplayr 630
; enable interrupts
631
 
2387 hidnplayr 632
        set_io  0
633
        set_io  REG_IMR
634
        mov     eax, INTERRUPT_MASK
635
        out     dx , ax
1159 hidnplayr 636
 
1519 hidnplayr 637
; Set the mtu, kernel will be able to send now
2387 hidnplayr 638
        mov     [device.mtu], 1514
1519 hidnplayr 639
 
1159 hidnplayr 640
; Indicate that we have successfully reset the card
641
 
2387 hidnplayr 642
        DEBUGF  2,"Done!\n"
643
        xor     eax, eax
1159 hidnplayr 644
 
2387 hidnplayr 645
        ret
1159 hidnplayr 646
 
647
 
648
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
649
;;                                         ;;
650
;; Transmit                                ;;
651
;;                                         ;;
1254 hidnplayr 652
;; In: buffer pointer in [esp+4]           ;;
653
;;     size of buffer in [esp+8]           ;;
1159 hidnplayr 654
;;     pointer to device structure in ebx  ;;
655
;;                                         ;;
656
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
657
align 4
658
transmit:
2387 hidnplayr 659
        DEBUGF  1,"\nTransmitting packet, buffer:%x, size:%u\n",[esp+4],[esp+8]
660
        mov     eax, [esp+4]
661
        DEBUGF  1,"To: %x-%x-%x-%x-%x-%x From: %x-%x-%x-%x-%x-%x Type:%x%x\n",\
662
        [eax+00]:2,[eax+01]:2,[eax+02]:2,[eax+03]:2,[eax+04]:2,[eax+05]:2,\
663
        [eax+06]:2,[eax+07]:2,[eax+08]:2,[eax+09]:2,[eax+10]:2,[eax+11]:2,\
664
        [eax+13]:2,[eax+12]:2
1159 hidnplayr 665
 
2387 hidnplayr 666
        cmp     dword [esp+8], MAX_ETH_FRAME_SIZE
667
        jg      .fail
668
        cmp     dword [esp+8], 60
669
        jl      .fail
1159 hidnplayr 670
 
1556 hidnplayr 671
; check if we own the current discriptor
2387 hidnplayr 672
        set_io  0
673
        set_io  REG_TSD0
674
        movzx   ecx, [device.curr_tx_desc]
675
        shl     ecx, 2
676
        add     edx, ecx
677
        in      eax, dx
678
        test    eax, (1 shl BIT_OWN)
679
        jz      .wait_to_send
1159 hidnplayr 680
 
1519 hidnplayr 681
  .send_packet:
1556 hidnplayr 682
; get next descriptor
2387 hidnplayr 683
        inc     [device.curr_tx_desc]
684
        and     [device.curr_tx_desc], NUM_TX_DESC-1
1556 hidnplayr 685
 
686
; Update stats
2387 hidnplayr 687
        inc     [device.packets_tx]
688
        mov     eax, [esp+8]
689
        add     dword [device.bytes_tx], eax
690
        adc     dword [device.bytes_tx + 4], 0
1556 hidnplayr 691
 
1519 hidnplayr 692
; Set the buffer address
2387 hidnplayr 693
        set_io  REG_TSAD0
694
        mov     eax, [esp+4]
695
        mov     [device.TX_DESC+ecx], eax
696
        GetRealAddr
697
        out     dx, eax
1159 hidnplayr 698
 
1519 hidnplayr 699
; And the size of the buffer
2387 hidnplayr 700
        set_io  REG_TSD0
701
        mov     eax, [esp+8]
702
        or      eax, (ERTXTH shl BIT_ERTXTH)    ; Early threshold
703
        out     dx, eax
1159 hidnplayr 704
 
2387 hidnplayr 705
        DEBUGF  1,"Packet Sent!\n"
706
        xor     eax, eax
707
        ret     8
1159 hidnplayr 708
 
1519 hidnplayr 709
  .wait_to_send:
2387 hidnplayr 710
        DEBUGF  1,"Waiting for timeout\n"
1159 hidnplayr 711
 
2387 hidnplayr 712
        push    edx
713
        mov     esi, 300
714
        stdcall Sleep
715
        pop     edx
1159 hidnplayr 716
 
2387 hidnplayr 717
        in      ax, dx
718
        test    ax, (1 shl BIT_OWN)
719
        jnz     .send_packet
1159 hidnplayr 720
 
2387 hidnplayr 721
        pusha
722
        call    reset                            ; if chip hung, reset it
723
        popa
1519 hidnplayr 724
 
2387 hidnplayr 725
        jmp     .send_packet
1519 hidnplayr 726
 
727
  .fail:
2387 hidnplayr 728
        DEBUGF  1,"failed!\n"
729
        stdcall KernelFree, [esp+4]
730
        or      eax, -1
731
        ret     8
1519 hidnplayr 732
 
733
 
734
 
735
 
736
 
1159 hidnplayr 737
;;;;;;;;;;;;;;;;;;;;;;;
738
;;                   ;;
739
;; Interrupt handler ;;
740
;;                   ;;
741
;;;;;;;;;;;;;;;;;;;;;;;
742
align 4
743
int_handler:
744
 
2387 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
 
2387 hidnplayr 749
        mov     esi, device_list
750
        mov     ecx, [devices]
751
        test    ecx, ecx
752
        jz      .fail
1159 hidnplayr 753
.nextdevice:
2387 hidnplayr 754
        mov     ebx, dword [esi]
1159 hidnplayr 755
 
2387 hidnplayr 756
        set_io  0
757
        set_io  REG_ISR
758
        in      ax , dx
759
        out     dx , ax                             ; send it back to ACK
1159 hidnplayr 760
 
2387 hidnplayr 761
        add     esi, 4
1159 hidnplayr 762
 
2387 hidnplayr 763
        test    ax , ax
764
        jnz     .got_it
1159 hidnplayr 765
 
2387 hidnplayr 766
        dec     ecx
767
        jnz     .nextdevice
1159 hidnplayr 768
 
2387 hidnplayr 769
        ret                                         ; If no device was found, abort (The irq was probably for a device, not registered to this driver)
1159 hidnplayr 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?
2387 hidnplayr 779
        test    ax, ISR_ROK
780
        jz      @f
781
        push    ax
1159 hidnplayr 782
 
783
  .receive:
2387 hidnplayr 784
        set_io  0
785
        set_io  REG_COMMAND
786
        in      al , dx
787
        test    al , BUFE                           ; test if RX buffer is empty
788
        jnz     .finish                             ;
1159 hidnplayr 789
 
2387 hidnplayr 790
        DEBUGF  1,"RX: "
1159 hidnplayr 791
 
2387 hidnplayr 792
        mov     eax, [device.rx_buffer]
793
        add     eax, [device.rx_data_offset]
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
2387 hidnplayr 798
        movzx   ecx, word [eax+2]                   ; packet length
1472 hidnplayr 799
 
2387 hidnplayr 800
        sub     ecx, 4                              ; don't copy CRC
1556 hidnplayr 801
 
1472 hidnplayr 802
; Update stats
2387 hidnplayr 803
        add     dword [device.bytes_rx], ecx
804
        adc     dword [device.bytes_rx + 4], 0
805
        inc     dword [device.packets_rx]
1472 hidnplayr 806
 
2387 hidnplayr 807
        DEBUGF  1,"Received %u bytes\n", ecx
1159 hidnplayr 808
 
2387 hidnplayr 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
813
        jz      .abort
1159 hidnplayr 814
 
2387 hidnplayr 815
        mov     edi, eax                            ; Where we will copy too
1472 hidnplayr 816
 
2387 hidnplayr 817
        mov     esi, [esp]                          ; The buffer we will copy from
818
        add     esi, 4                              ; Dont copy CRC
1159 hidnplayr 819
 
2387 hidnplayr 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
1159 hidnplayr 822
 
1472 hidnplayr 823
  .copy:
2387 hidnplayr 824
        shr     ecx, 1
825
        jnc     .nb
826
        movsb
1472 hidnplayr 827
  .nb:
2387 hidnplayr 828
        shr     ecx, 1
829
        jnc     .nw
830
        movsw
1472 hidnplayr 831
  .nw:
2387 hidnplayr 832
        jz      .nd
833
        rep     movsd
1472 hidnplayr 834
  .nd:
1159 hidnplayr 835
 
2387 hidnplayr 836
        jmp     EthReceiver                         ; Send it to kernel
1159 hidnplayr 837
 
838
  .abort:
2387 hidnplayr 839
        pop     eax ebx
840
                                                    ; update eth_data_start_offset
841
        movzx   eax, word [eax+2]                   ; packet length
842
        add     eax, [device.rx_data_offset]
843
        add     eax, 4+3                            ; packet header is 4 bytes long + dword alignment
844
        and     eax, not 3                          ; dword alignment
1472 hidnplayr 845
 
2387 hidnplayr 846
        cmp     eax, RX_BUFFER_SIZE
847
        jl      .no_wrap
848
        DEBUGF  2,"Wrapping"
849
        sub     eax, RX_BUFFER_SIZE
1159 hidnplayr 850
  .no_wrap:
2387 hidnplayr 851
        mov     [device.rx_data_offset], eax
852
        DEBUGF  1,"New RX ptr: %d\n", eax
1159 hidnplayr 853
 
2387 hidnplayr 854
        set_io  0
855
        set_io  REG_CAPR                            ; update 'Current Address of Packet Read register'
856
        sub     eax, 0x10                           ; value 0x10 is a constant for CAPR
857
        out     dx , ax
1159 hidnplayr 858
 
2387 hidnplayr 859
        jmp     .receive                            ; check for multiple packets
1159 hidnplayr 860
 
861
  .reset_rx:
2387 hidnplayr 862
        test    byte [eax], (1 shl BIT_CRC)
863
        jz      .no_crc_error
864
        DEBUGF  2,"\nCRC error!\n"
1159 hidnplayr 865
 
866
  .no_crc_error:
2387 hidnplayr 867
        test    byte [eax], (1 shl BIT_FAE)
868
        jz      .no_fae_error
869
        DEBUGF  1,"\nFrame alignment error!\n"
1159 hidnplayr 870
 
871
  .no_fae_error:
2387 hidnplayr 872
        DEBUGF  1,"Reset RX\n"
873
        in      al , dx                             ; read command register
874
        push    ax
1159 hidnplayr 875
 
2387 hidnplayr 876
        and     al , not (1 shl BIT_RE)             ; Clear the RE bit
877
        out     dx , al
1159 hidnplayr 878
 
2387 hidnplayr 879
        pop     ax
880
        out     dx , al                             ; write original command back
1159 hidnplayr 881
 
2387 hidnplayr 882
        add     edx, REG_RXCONFIG - REG_COMMAND     ; Restore RX configuration
883
        mov     ax , RX_CONFIG
884
        out     dx , ax
1159 hidnplayr 885
 
886
  .finish:
2387 hidnplayr 887
        pop     ax
1159 hidnplayr 888
 
889
;----------------------------------------------------
1556 hidnplayr 890
; Transmit ok / Transmit error
1159 hidnplayr 891
  @@:
2387 hidnplayr 892
        test    ax, ISR_TOK + ISR_TER
893
        jz      @f
1159 hidnplayr 894
 
2387 hidnplayr 895
        push    ax
896
        xor     ecx, ecx
1556 hidnplayr 897
  .txdesloop:
2387 hidnplayr 898
        set_io  0
899
        set_io  REG_TSD0
900
        add     edx, ecx
901
        in      eax, dx
1541 hidnplayr 902
 
2387 hidnplayr 903
        test    eax, TSR_OWN                    ; DMA operation completed
904
        jz      .notthisone
1556 hidnplayr 905
 
2387 hidnplayr 906
        cmp     [device.TX_DESC+ecx], 0
907
        je      .notthisone
1556 hidnplayr 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
 
2387 hidnplayr 931
        DEBUGF  1,"TX OK: free buffer %x\n", [device.TX_DESC+ecx]:8
932
        push    ecx ebx
933
        stdcall KernelFree, [device.TX_DESC+ecx]
934
        pop     ebx ecx
935
        mov     [device.TX_DESC+ecx], 0
1556 hidnplayr 936
 
1519 hidnplayr 937
  .notthisone:
2387 hidnplayr 938
        add     ecx, 4
939
        cmp     ecx, 16
940
        jl      .txdesloop
941
        pop     ax
1159 hidnplayr 942
 
943
;----------------------------------------------------
944
; Rx buffer overflow ?
945
  @@:
2387 hidnplayr 946
        test    ax, ISR_RXOVW
947
        jz      @f
1159 hidnplayr 948
 
2387 hidnplayr 949
        push    ax
950
        DEBUGF  2,"RX-buffer overflow!\n"
1159 hidnplayr 951
 
2387 hidnplayr 952
        set_io  0
953
        set_io  REG_ISR
954
        mov     ax , ISR_FIFOOVW or ISR_RXOVW
955
        out     dx , ax
956
        pop     ax
1159 hidnplayr 957
 
958
;----------------------------------------------------
1519 hidnplayr 959
; Packet underrun?
1159 hidnplayr 960
  @@:
2387 hidnplayr 961
        test    ax, ISR_PUN
962
        jz      @f
1159 hidnplayr 963
 
2387 hidnplayr 964
        DEBUGF  2,"Packet underrun!\n"
1159 hidnplayr 965
 
966
;----------------------------------------------------
967
; Receive FIFO overflow ?
968
  @@:
2387 hidnplayr 969
        test    ax, ISR_FIFOOVW
970
        jz      @f
1159 hidnplayr 971
 
2387 hidnplayr 972
        push    ax
973
        DEBUGF  2,"RX fifo overflow!\n"
1159 hidnplayr 974
 
2387 hidnplayr 975
        set_io  0
976
        set_io  REG_ISR
977
        mov     ax , ISR_FIFOOVW or ISR_RXOVW
978
        out     dx , ax
979
        pop     ax
1159 hidnplayr 980
 
981
;----------------------------------------------------
982
; Something about Cable changed ?
983
  @@:
2387 hidnplayr 984
        test    ax, ISR_LENCHG
985
        jz      .fail
1159 hidnplayr 986
 
2387 hidnplayr 987
        DEBUGF  2,"Cable changed!\n"
988
        call    cable
1159 hidnplayr 989
 
990
  .fail:
2387 hidnplayr 991
        ret
1159 hidnplayr 992
 
993
 
994
 
995
 
996
;;;;;;;;;;;;;;;;;;;;;;;;;
997
;;                     ;;
998
;; Update Cable status ;;
999
;;                     ;;
1000
;;;;;;;;;;;;;;;;;;;;;;;;;
1001
 
1002
align 4
1003
cable:
2387 hidnplayr 1004
        DEBUGF  1,"Checking Cable status: "
1159 hidnplayr 1005
 
2387 hidnplayr 1006
        mov     edx, dword [device.io_addr]
1007
        add     edx, REG_MSR
1008
        in      al , dx
1159 hidnplayr 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
 
2387 hidnplayr 1016
        shr     al, 2
1017
        and     al, 3
1159 hidnplayr 1018
 
2387 hidnplayr 1019
        mov     byte [device.mode+3], al
1020
        DEBUGF  1,"Done!\n"
1159 hidnplayr 1021
ret
1022
 
1023
 
1024
 
1025
;;;;;;;;;;;;;;;;;;;;;;;
1026
;;                   ;;
1027
;; Write MAC address ;;
1028
;;                   ;;
1029
;;;;;;;;;;;;;;;;;;;;;;;
1030
 
1031
align 4
2387 hidnplayr 1032
write_mac:      ; in: mac pushed onto stack (as 3 words)
1159 hidnplayr 1033
 
2387 hidnplayr 1034
        DEBUGF  2,"Writing MAC: "
1159 hidnplayr 1035
 
1036
; disable all in command registers
1037
 
2387 hidnplayr 1038
        set_io  0
1039
        set_io  REG_9346CR
1040
        xor     eax, eax
1041
        out     dx , al
1159 hidnplayr 1042
 
2387 hidnplayr 1043
        set_io  REG_IMR
1044
        xor     eax, eax
1045
        out     dx , ax
1159 hidnplayr 1046
 
2387 hidnplayr 1047
        set_io  REG_ISR
1048
        mov     eax, -1
1049
        out     dx , ax
1159 hidnplayr 1050
 
1051
; enable writing
1052
 
2387 hidnplayr 1053
        set_io  REG_9346CR
1054
        mov     eax, REG_9346CR_WE
1055
        out     dx , al
1159 hidnplayr 1056
 
1057
 ; write the mac ...
1058
 
2387 hidnplayr 1059
        set_io  REG_IDR0
1060
        pop     eax
1061
        out     dx , eax
1159 hidnplayr 1062
 
2387 hidnplayr 1063
        set_io  REG_IDR0+4
1064
        xor     eax, eax
1065
        pop     ax
1066
        out     dx , eax
1159 hidnplayr 1067
 
1068
; disable writing
1069
 
2387 hidnplayr 1070
        set_io  REG_9346CR
1071
        xor     eax, eax
1072
        out     dx , al
1159 hidnplayr 1073
 
2387 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:
2387 hidnplayr 1086
        DEBUGF  2,"Reading MAC: "
1159 hidnplayr 1087
 
2387 hidnplayr 1088
        set_io  0
1089
        lea     edi, [device.mac]
1090
        in      eax, dx
1091
        stosd
1092
        add     edx, 4
1093
        in      ax, dx
1094
        stosw
1159 hidnplayr 1095
 
2387 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
 
2387 hidnplayr 1098
        ret
1159 hidnplayr 1099
 
1100
 
1101
; End of code
1102
 
1519 hidnplayr 1103
section '.data' data readable writable align 16 ; place all uninitialized data place here
2387 hidnplayr 1104
align 4                                         ; Place all initialised data here
1159 hidnplayr 1105
 
2387 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
 
2387 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:
2387 hidnplayr 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
 
2387 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
 
2387 hidnplayr 1144
include_debug_strings                           ; All data wich FDO uses will be included here
1159 hidnplayr 1145
 
2387 hidnplayr 1146
device_list     rd MAX_DEVICES                   ; This list contains all pointers to device structures the driver is handling
1159 hidnplayr 1147