Subversion Repositories Kolibri OS

Rev

Rev 2010 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2010 Rev 2434
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
2
;;                                                                 ;;
3
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved.    ;;
3
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved.    ;;
4
;; Distributed under terms of the GNU General Public License       ;;
4
;; Distributed under terms of the GNU General Public License       ;;
5
;;                                                                 ;;
5
;;                                                                 ;;
6
;;  ETHERNET.INC                                                   ;;
6
;;  ETHERNET.INC                                                   ;;
7
;;                                                                 ;;
7
;;                                                                 ;;
8
;;  Ethernet network layer for Menuet OS                           ;;
8
;;  Ethernet network layer for Menuet OS                           ;;
9
;;                                                                 ;;
9
;;                                                                 ;;
10
;;  This file contains the following:                              ;;
10
;;  This file contains the following:                              ;;
11
;;      PCI bus scanning for valid devices                         ;;
11
;;      PCI bus scanning for valid devices                         ;;
12
;;      Table of supported ethernet drivers                        ;;
12
;;      Table of supported ethernet drivers                        ;;
13
;;      Code to identify and activate a supported driver           ;;
13
;;      Code to identify and activate a supported driver           ;;
14
;;      ARP handler                                                ;;
14
;;      ARP handler                                                ;;
15
;;      Driver interface to the IP layer                           ;;
15
;;      Driver interface to the IP layer                           ;;
16
;;      Gateway support                                            ;;
16
;;      Gateway support                                            ;;
17
;;                                                                 ;;
17
;;                                                                 ;;
18
;;  Individual driver files are included here                      ;;
18
;;  Individual driver files are included here                      ;;
19
;;                                                                 ;;
19
;;                                                                 ;;
20
;;  The PCI bus scanning code was ported from the etherboot        ;;
20
;;  The PCI bus scanning code was ported from the etherboot        ;;
21
;;  5.0.6 project. The copyright statement for that code is        ;;
21
;;  5.0.6 project. The copyright statement for that code is        ;;
22
;;                                                                 ;;
22
;;                                                                 ;;
23
;;          GNU GENERAL PUBLIC LICENSE                             ;;
23
;;          GNU GENERAL PUBLIC LICENSE                             ;;
24
;;             Version 2, June 1991                                ;;
24
;;             Version 2, June 1991                                ;;
25
;;                                                                 ;;
25
;;                                                                 ;;
26
;;  remaining parts Copyright 2002 Mike Hibbett                    ;;
26
;;  remaining parts Copyright 2002 Mike Hibbett                    ;;
27
;;   mikeh@oceanfree.net                                           ;;
27
;;   mikeh@oceanfree.net                                           ;;
28
;;                                                                 ;;
28
;;                                                                 ;;
29
;;  See file COPYING for details                                   ;;
29
;;  See file COPYING for details                                   ;;
30
;;                                                                 ;;
30
;;                                                                 ;;
31
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
31
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32
 
32
 
33
$Revision: 2010 $
33
$Revision: 2434 $
34
 
34
 
35
 
35
 
36
;********************************************************************
36
;********************************************************************
37
;   Interface
37
;   Interface
38
;      ethernet_driver   called by stack_handler in stack.inc
38
;      ethernet_driver   called by stack_handler in stack.inc
39
;      eth_probe         called by app_stack_handler in stack.inc
39
;      eth_probe         called by app_stack_handler in stack.inc
40
;
40
;
41
;********************************************************************
41
;********************************************************************
42
 
42
 
43
ETHER_IP		    equ     0x0008	; Reversed from 0800 for intel
43
ETHER_IP                    equ     0x0008      ; Reversed from 0800 for intel
44
ETHER_ARP		    equ     0x0608	; Reversed from 0806 for intel
44
ETHER_ARP                   equ     0x0608      ; Reversed from 0806 for intel
45
ETHER_RARP		    equ     0x3580
45
ETHER_RARP                  equ     0x3580
46
 
46
 
47
struc ETH_FRAME
47
struc ETH_FRAME
48
{  .DstMAC	 dp   ?  ;destination MAC-address [6 bytes]
48
{  .DstMAC       dp   ?  ;destination MAC-address [6 bytes]
49
   .SrcMAC	 dp   ?  ;source MAC-address [6 bytes]
49
   .SrcMAC       dp   ?  ;source MAC-address [6 bytes]
50
   .Type	 dw   ?  ;type of the upper-layer protocol [2 bytes]
50
   .Type         dw   ?  ;type of the upper-layer protocol [2 bytes]
51
   .Data	 db   ?  ;data [46-1500 bytes]
51
   .Data         db   ?  ;data [46-1500 bytes]
52
 }
52
 }
53
 
53
 
54
virtual at Ether_buffer
54
virtual at Ether_buffer
55
  ETH_FRAME ETH_FRAME
55
  ETH_FRAME ETH_FRAME
56
end virtual
56
end virtual
57
 
57
 
58
 
58
 
59
; Some useful information on data structures
59
; Some useful information on data structures
60
 
60
 
61
;     Ethernet Packet - ARP Request example
61
;     Ethernet Packet - ARP Request example
62
;
62
;
63
;   0                   1                   2                   3
63
;   0                   1                   2                   3
64
;   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
64
;   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
65
;
65
;
66
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
66
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
67
;   |       Dest   H/W Address                                      |
67
;   |       Dest   H/W Address                                      |
68
;   |                    ( 14 byte header )                         |
68
;   |                    ( 14 byte header )                         |
69
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
69
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
70
;   |                               |     Source     H/W Address    |
70
;   |                               |     Source     H/W Address    |
71
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
71
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
72
;   |                                                               |
72
;   |                                                               |
73
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
73
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
74
;   |    Protocol - ARP 08  06      |
74
;   |    Protocol - ARP 08  06      |
75
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
75
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
76
 
76
 
77
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
77
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
78
;   |  H/W Type  00           01    |  Protocol Type   08 00        |
78
;   |  H/W Type  00           01    |  Protocol Type   08 00        |
79
;   |                   ( ARP Request packet )                      |
79
;   |                   ( ARP Request packet )                      |
80
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
80
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
81
;   | HLen    0x06  | PLen    0x04  |    OpCode        00   01      |
81
;   | HLen    0x06  | PLen    0x04  |    OpCode        00   01      |
82
;   |               ( 0001 for request, 0002 for reply )            |
82
;   |               ( 0001 for request, 0002 for reply )            |
83
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
83
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
84
;   | Source Hardware Address ( MAC Address )                       |
84
;   | Source Hardware Address ( MAC Address )                       |
85
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
85
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
86
;   |                               |  Source IP Address            |
86
;   |                               |  Source IP Address            |
87
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
87
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
88
;   |                               | Destination Hardware Address  |
88
;   |                               | Destination Hardware Address  |
89
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
89
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
90
;   |                                                               |
90
;   |                                                               |
91
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
91
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
92
;   | Destination IP Address                                        |
92
;   | Destination IP Address                                        |
93
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
93
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
94
 
94
 
95
; Include individual drivers source files at this point.
95
; Include individual drivers source files at this point.
96
; If you create a new driver, include it below.
96
; If you create a new driver, include it below.
97
 
97
 
98
include "drivers/rtl8029.inc"
98
include "drivers/rtl8029.inc"
99
include "drivers/i8255x.inc"
99
include "drivers/i8255x.inc"
100
include "drivers/rtl8139.inc"
100
include "drivers/rtl8139.inc"
101
include "drivers/3c59x.inc"
101
include "drivers/3c59x.inc"
102
include "drivers/sis900.inc"
102
include "drivers/sis900.inc"
103
include "drivers/pcnet32.inc"
103
include "drivers/pcnet32.inc"
104
include "drivers/rtl8169.inc"
104
include "drivers/rtl8169.inc"
105
include "drivers/forcedeth.inc"
105
include "drivers/forcedeth.inc"
106
include "drivers/r6040.inc"
106
include "drivers/r6040.inc"
107
 
107
 
108
; PCICards
108
; PCICards
109
; ========
109
; ========
110
; PCI vendor and hardware types for hardware supported by the above drivers
110
; PCI vendor and hardware types for hardware supported by the above drivers
111
; If you add a driver, ensure you update this datastructure, otherwise the
111
; If you add a driver, ensure you update this datastructure, otherwise the
112
; card will not be probed.
112
; card will not be probed.
113
; Each driver is defined by 4 double words. These are
113
; Each driver is defined by 4 double words. These are
114
;   PCIVendorDevice  probeFunction ResetFunction PollFunction transmitFunction
114
;   PCIVendorDevice  probeFunction ResetFunction PollFunction transmitFunction
115
; The last entry must be kept at all zeros, to indicate the end of the list
115
; The last entry must be kept at all zeros, to indicate the end of the list
116
; As a PCI driver may support more than one hardware implementation, there may
116
; As a PCI driver may support more than one hardware implementation, there may
117
; be several lines which refer to the same functions.
117
; be several lines which refer to the same functions.
118
; The first driver found on the PCI bus will be the one used.
118
; The first driver found on the PCI bus will be the one used.
119
 
119
 
120
PCICARDS_ENTRY_SIZE	    equ     24	  ; Size of each PCICARDS entry
120
PCICARDS_ENTRY_SIZE         equ     24    ; Size of each PCICARDS entry
121
 
121
 
122
iglobal
122
iglobal
123
PCICards:
123
PCICards:
124
dd  0x12098086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0
124
dd  0x12098086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0
125
dd  0x10298086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0
125
dd  0x10298086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0
126
dd  0x12298086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0
126
dd  0x12298086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0
127
dd  0x10308086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0
127
dd  0x10308086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0
128
dd  0x24498086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0
128
dd  0x24498086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0
-
 
129
dd  0x10688086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0
129
 
130
 
130
dd  0x802910ec, rtl8029_probe, rtl8029_reset, rtl8029_poll, rtl8029_transmit, 0
131
dd  0x802910ec, rtl8029_probe, rtl8029_reset, rtl8029_poll, rtl8029_transmit, 0
131
 
132
 
132
;dd  0x813910ec, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
133
dd  0x813910ec, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
133
;dd  0x813810ec, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
134
dd  0x813810ec, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
134
;dd  0x12111113, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
135
dd  0x12111113, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
135
;dd  0x13601500, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
136
dd  0x13601500, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
136
;dd  0x13604033, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
137
dd  0x13604033, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
137
;dd  0x13001186, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
138
dd  0x13001186, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
138
;dd  0x13401186, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
139
dd  0x13401186, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
139
;dd  0xab0613d1, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
140
dd  0xab0613d1, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
140
;dd  0xa1171259, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
141
dd  0xa1171259, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
141
;dd  0xa11e1259, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
142
dd  0xa11e1259, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
142
;dd  0xab0614ea, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
143
dd  0xab0614ea, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
143
;dd  0xab0714ea, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
144
dd  0xab0714ea, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
144
;dd  0x123411db, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
145
dd  0x123411db, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
145
;dd  0x91301432, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
146
dd  0x91301432, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
146
;dd  0x101202ac, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
147
dd  0x101202ac, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
147
;dd  0x0106018a, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
148
dd  0x0106018a, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
148
;dd  0x1211126c, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
149
dd  0x1211126c, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
149
;dd  0x81391743, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
150
dd  0x81391743, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
150
;dd  0x8139021b, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
151
dd  0x8139021b, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
151
 
152
 
152
dd  0x816810ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
153
dd  0x816810ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
153
dd  0x816910ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
154
dd  0x816910ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
154
dd  0x011616ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
155
dd  0x011616ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
155
dd  0x43001186, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
156
dd  0x43001186, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
156
dd  0x816710ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
157
dd  0x816710ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
157
 
158
 
158
dd  0x590010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
159
dd  0x590010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
159
dd  0x592010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
160
dd  0x592010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
160
dd  0x597010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
161
dd  0x597010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
161
dd  0x595010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
162
dd  0x595010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
162
dd  0x595110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
163
dd  0x595110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
163
dd  0x595210b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
164
dd  0x595210b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
164
dd  0x900010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
165
dd  0x900010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
165
dd  0x900110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
166
dd  0x900110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
166
dd  0x900410b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
167
dd  0x900410b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
167
dd  0x900510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
168
dd  0x900510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
168
dd  0x900610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
169
dd  0x900610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
169
dd  0x900A10b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
170
dd  0x900A10b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
170
dd  0x905010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
171
dd  0x905010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
171
dd  0x905110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
172
dd  0x905110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
172
dd  0x905510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
173
dd  0x905510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
173
dd  0x905810b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
174
dd  0x905810b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
174
dd  0x905A10b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
175
dd  0x905A10b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
175
dd  0x920010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
176
dd  0x920010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
176
dd  0x980010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
177
dd  0x980010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
177
dd  0x980510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
178
dd  0x980510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
178
dd  0x764610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
179
dd  0x764610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
179
dd  0x505510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
180
dd  0x505510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
180
dd  0x605510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
181
dd  0x605510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
181
dd  0x605610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
182
dd  0x605610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
182
dd  0x5b5710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
183
dd  0x5b5710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
183
dd  0x505710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
184
dd  0x505710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
184
dd  0x515710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
185
dd  0x515710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
185
dd  0x525710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
186
dd  0x525710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
186
dd  0x656010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
187
dd  0x656010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
187
dd  0x656210b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
188
dd  0x656210b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
188
dd  0x656410b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
189
dd  0x656410b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
189
dd  0x450010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
190
dd  0x450010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
190
 
191
 
191
dd  0x09001039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0
192
dd  0x09001039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0
192
dd  0x70161039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0
193
dd  0x70161039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0
193
 
194
 
194
dd  0x20001022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0
195
dd  0x20001022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0
195
dd  0x26251022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0
196
dd  0x26251022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0
196
dd  0x20011022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0
197
dd  0x20011022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0
197
 
198
 
198
dd  0x006610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; nVidia Corporation nForce2 Ethernet Controller
199
dd  0x006610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; nVidia Corporation nForce2 Ethernet Controller
199
dd  0x01c310de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
200
dd  0x01c310de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
200
dd  0x00D610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
201
dd  0x00D610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
201
dd  0x008610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
202
dd  0x008610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
202
dd  0x008c10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
203
dd  0x008c10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
203
dd  0x00e610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
204
dd  0x00e610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
204
dd  0x00df10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
205
dd  0x00df10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
205
dd  0x005610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
206
dd  0x005610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
206
dd  0x005710de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
207
dd  0x005710de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
207
dd  0x003710de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
208
dd  0x003710de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
208
dd  0x003810de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
209
dd  0x003810de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
209
dd  0x026810de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
210
dd  0x026810de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
210
dd  0x026910de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
211
dd  0x026910de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
211
dd  0x037210de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
212
dd  0x037210de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
212
dd  0x037310de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
213
dd  0x037310de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
213
dd  0x03e510de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
214
dd  0x03e510de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
214
dd  0x03e610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
215
dd  0x03e610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
215
dd  0x03ee10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
216
dd  0x03ee10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
216
dd  0x03ef10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
217
dd  0x03ef10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
217
dd  0x045010de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
218
dd  0x045010de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
218
dd  0x045110de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
219
dd  0x045110de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
219
dd  0x045210de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
220
dd  0x045210de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
220
dd  0x045310de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
221
dd  0x045310de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
221
dd  0x054c10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
222
dd  0x054c10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
222
dd  0x054d10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
223
dd  0x054d10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
223
dd  0x054e10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
224
dd  0x054e10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
224
dd  0x054f10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
225
dd  0x054f10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
225
dd  0x07dc10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
226
dd  0x07dc10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
226
dd  0x07dd10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
227
dd  0x07dd10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
227
dd  0x07de10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
228
dd  0x07de10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
228
dd  0x07df10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
229
dd  0x07df10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
229
dd  0x076010de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; MCP77 Ethernet Controller
230
dd  0x076010de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; MCP77 Ethernet Controller
230
dd  0x076110de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
231
dd  0x076110de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
231
dd  0x076210de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
232
dd  0x076210de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
232
dd  0x076310de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
233
dd  0x076310de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
233
dd  0x0ab010de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
234
dd  0x0ab010de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
234
dd  0x0ab110de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
235
dd  0x0ab110de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
235
dd  0x0ab210de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
236
dd  0x0ab210de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
236
dd  0x0ab310de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
237
dd  0x0ab310de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
237
dd  0x0d7d10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
238
dd  0x0d7d10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
238
 
239
 
239
dd  0x604017F3, r6040_probe, r6040_reset, r6040_poll, r6040_transmit, 0
240
dd  0x604017F3, r6040_probe, r6040_reset, r6040_poll, r6040_transmit, 0
240
 
241
 
241
rb PCICARDS_ENTRY_SIZE	; end of list marker, do not remove
242
rb PCICARDS_ENTRY_SIZE  ; end of list marker, do not remove
242
endg
243
endg
243
 
244
 
244
uglobal
245
uglobal
245
;Net-stack's interface's settings
246
;Net-stack's interface's settings
-
 
247
  node_addr:
246
  node_addr:	      db  0,0,0,0,0,0
248
                      db  0,0,0,0,0,0
-
 
249
  gateway_ip:
247
  gateway_ip:	      dd  0
250
                      dd  0
-
 
251
  dns_ip:
248
  dns_ip:	      dd  0
252
                      dd  0
249
 
253
 
250
  eth_rx_data_len:    dw  0
254
  eth_rx_data_len:
-
 
255
                      dw  0
-
 
256
  eth_status:
251
  eth_status:	      dd  0
257
                      dd  0
-
 
258
  io_addr:
252
  io_addr:	      dd  0
259
                      dd  0
-
 
260
  hdrtype:
253
  hdrtype:	      db  0
261
                      db  0
254
  vendor_device:      dd  0
262
  vendor_device:
-
 
263
                      dd  0
-
 
264
  pci_data:
255
  pci_data:	      dd  0
265
                      dd  0
-
 
266
  pci_dev:
256
  pci_dev:	      dd  0
267
                      dd  0
-
 
268
  pci_bus:
257
  pci_bus:	      dd  0
269
                      dd  0
258
 
270
 
-
 
271
  ; These will hold pointers to the selected driver functions
259
  ; These will hold pointers to the selected driver functions
272
  drvr_probe:
-
 
273
                      dd  0
260
  drvr_probe:	      dd  0
274
  drvr_reset:
-
 
275
                      dd  0
261
  drvr_reset:	      dd  0
276
  drvr_poll:
262
  drvr_poll:	      dd  0
277
                      dd  0
-
 
278
  drvr_transmit:
-
 
279
                      dd  0
263
  drvr_transmit:      dd  0
280
  drvr_cable:
264
  drvr_cable:	      dd  0
281
                      dd  0
265
 
282
 
266
endg
283
endg
267
 
284
 
268
iglobal
285
iglobal
-
 
286
  broadcast_add:
269
  broadcast_add:      db  0xff,0xff,0xff,0xff,0xff,0xff
287
                      db  0xff,0xff,0xff,0xff,0xff,0xff
-
 
288
  subnet_mask:
270
  subnet_mask:	      dd  0x00ffffff   ; 255.255.255.0
289
                      dd  0x00ffffff   ; 255.255.255.0
271
endg
290
endg
272
 
291
 
273
include "arp.inc"    ;arp-protocol functions
292
include "arp.inc"    ;arp-protocol functions
274
include "pci.inc"    ;PCI bus access functions
293
include "pci.inc"    ;PCI bus access functions
275
 
294
 
276
 
295
 
277
;***************************************************************************
296
;***************************************************************************
278
;   Function
297
;   Function
279
;      eth_tx
298
;      eth_tx
280
;
299
;
281
;   Description
300
;   Description
282
;      Looks at the NET1OUT_QUEUE for data to send.
301
;      Looks at the NET1OUT_QUEUE for data to send.
283
;      Stores that destination IP in a location used by the tx routine
302
;      Stores that destination IP in a location used by the tx routine
284
;      Looks up the MAC address in the ARP table; stores that where
303
;      Looks up the MAC address in the ARP table; stores that where
285
;      the tx routine can get it
304
;      the tx routine can get it
286
;      Get the length of the data. Store that where the tx routine wants it
305
;      Get the length of the data. Store that where the tx routine wants it
287
;      Call tx
306
;      Call tx
288
;      Places buffer on empty queue when the tx routine finished
307
;      Places buffer on empty queue when the tx routine finished
289
;
308
;
290
;***************************************************************************
309
;***************************************************************************
291
proc eth_tx stdcall uses ebx esi edi
310
proc eth_tx stdcall uses ebx esi edi
292
local MACAddress  dp  ?  ;allocate 6 bytes in the stack
311
local MACAddress  dp  ?  ;allocate 6 bytes in the stack
293
 
312
 
294
    ; Look for a buffer to tx
313
    ; Look for a buffer to tx
295
    mov     eax, NET1OUT_QUEUE
314
        mov     eax, NET1OUT_QUEUE
296
    call    dequeue
315
        call    dequeue
297
    cmp     ax, NO_BUFFER
316
        cmp     ax, NO_BUFFER
298
    je	    .exit	     ; Exit if no buffer available
317
        je      .exit        ; Exit if no buffer available
299
 
318
 
300
    push    eax  ;save buffer number
319
        push    eax;save buffer number
301
 
320
 
302
    ; convert buffer pointer eax to the absolute address
321
    ; convert buffer pointer eax to the absolute address
303
    imul    eax, IPBUFFSIZE
322
        imul    eax, IPBUFFSIZE
304
    add     eax, IPbuffs
323
        add     eax, IPbuffs
305
 
324
 
306
    ; Extract the destination IP
325
    ; Extract the destination IP
307
    ; find the destination IP in the ARP table, get MAC
326
    ; find the destination IP in the ARP table, get MAC
308
    ; store this MAC in 'MACAddress'
327
    ; store this MAC in 'MACAddress'
309
    mov     ebx, eax		   ; Save buffer address
328
        mov     ebx, eax           ; Save buffer address
310
    mov     edx, [ebx + 16]	   ; get destination address
329
        mov     edx, [ebx + 16]    ; get destination address
311
 
330
 
312
    ; If the destination address is 255.255.255.255,
331
    ; If the destination address is 255.255.255.255,
313
    ; set the MACAddress to all ones ( broadcast )
332
    ; set the MACAddress to all ones ( broadcast )
314
    cld
333
        cld
315
    mov     esi, broadcast_add
334
        mov     esi, broadcast_add
316
    lea     edi, [MACAddress]
335
        lea     edi, [MACAddress]
317
    movsd
336
        movsd
318
    movsw
337
        movsw
319
    cmp     edx, 0xffffffff
338
        cmp     edx, 0xffffffff
320
    je	    .send		 ; If it is broadcast, just send
339
        je      .send            ; If it is broadcast, just send
321
 
340
 
322
    lea     eax, [MACAddress]	 ;cause this is local variable
341
        lea     eax, [MACAddress];cause this is local variable
323
    stdcall arp_table_manager, ARP_TABLE_IP_TO_MAC, edx, eax ;opcode,IP,MAC_ptr - Get the MAC address.
342
        stdcall arp_table_manager, ARP_TABLE_IP_TO_MAC, edx, eax;opcode,IP,MAC_ptr - Get the MAC address.
324
 
343
 
325
    cmp     eax, ARP_VALID_MAPPING
344
        cmp     eax, ARP_VALID_MAPPING
326
    je	    .send
345
        je      .send
327
 
346
 
328
    ; No valid entry. Has the request been sent, but timed out?
347
    ; No valid entry. Has the request been sent, but timed out?
329
    cmp     eax, ARP_RESPONSE_TIMEOUT
348
        cmp     eax, ARP_RESPONSE_TIMEOUT
330
    je	    .freebuf
349
        je      .freebuf
331
 
350
 
332
  .wait_response:		    ;we wait arp-response
351
  .wait_response:                   ;we wait arp-response
333
				    ; Re-queue the packet, and exit
352
                                    ; Re-queue the packet, and exit
334
    pop     ebx
353
        pop     ebx
335
    mov     eax, NET1OUT_QUEUE
354
        mov     eax, NET1OUT_QUEUE
336
    call    queue			 ; Get the buffer back
355
        call    queue                    ; Get the buffer back
337
    jmp     .exit
356
        jmp     .exit
338
 
357
 
339
  .send:    ;if ARP_VALID_MAPPING then send the packet
358
  .send:    ;if ARP_VALID_MAPPING then send the packet
340
    lea     edi, [MACAddress]	  ; Pointer to 48 bit destination address
359
        lea     edi, [MACAddress] ; Pointer to 48 bit destination address
341
    movzx   ecx, word[ebx+2]	  ; Size of IP packet to send
360
        movzx   ecx, word[ebx+2]  ; Size of IP packet to send
342
    xchg    ch, cl		  ; because mirror byte-order
361
        xchg    ch, cl            ; because mirror byte-order
343
    mov     esi, ebx		  ; Pointer to packet data
362
        mov     esi, ebx          ; Pointer to packet data
344
    mov     bx, ETHER_IP	  ; Type of packet
363
        mov     bx, ETHER_IP      ; Type of packet
345
    push    ebp
364
        push    ebp
346
    call    dword [drvr_transmit] ; Call the drivers transmit function
365
        call    dword [drvr_transmit]; Call the drivers transmit function
347
    pop     ebp
366
        pop     ebp
348
 
367
 
349
    ; OK, we have sent a packet, so increment the count
368
    ; OK, we have sent a packet, so increment the count
350
    inc     dword [ip_tx_count]
369
        inc     dword [ip_tx_count]
351
 
370
 
352
    ; And finally, return the buffer to the free queue
371
    ; And finally, return the buffer to the free queue
353
  .freebuf:
372
  .freebuf:
354
    pop     eax
373
        pop     eax
355
    call    freeBuff
374
        call    freeBuff
356
 
375
 
357
  .exit:
376
  .exit:
358
    ret
377
        ret
359
endp
378
endp
360
 
379
 
361
;***************************************************************************
380
;***************************************************************************
362
;   Function
381
;   Function
363
;      ether_IP_handler
382
;      ether_IP_handler
364
;
383
;
365
;   Description
384
;   Description
366
;      Called when an IP ethernet packet is received on the ethernet
385
;      Called when an IP ethernet packet is received on the ethernet
367
;      Header + Data is in Ether_buffer[]
386
;      Header + Data is in Ether_buffer[]
368
;      We just need to get a buffer from the 'free' queue, and
387
;      We just need to get a buffer from the 'free' queue, and
369
;      store the packet in it, then insert the packet number into the
388
;      store the packet in it, then insert the packet number into the
370
;      IPRX queue.
389
;      IPRX queue.
371
;      If no queue entry is available, the packet is silently discarded
390
;      If no queue entry is available, the packet is silently discarded
372
;      All registers may be destroyed
391
;      All registers may be destroyed
373
;
392
;
374
;***************************************************************************
393
;***************************************************************************
375
;uglobal
394
;uglobal
376
;  ether_IP_handler_cnt dd ?
395
;  ether_IP_handler_cnt dd ?
377
;endg
396
;endg
378
ether_IP_handler:
397
ether_IP_handler:
379
    mov     eax, EMPTY_QUEUE
398
        mov     eax, EMPTY_QUEUE
380
    call    dequeue
399
        call    dequeue
381
    cmp     ax, NO_BUFFER
400
        cmp     ax, NO_BUFFER
382
    je	    eiph00x
401
        je      eiph00x
383
 
402
 
384
    ; convert buffer pointer eax to the absolute address
403
    ; convert buffer pointer eax to the absolute address
385
    push    eax
404
        push    eax
386
    mov     ecx, IPBUFFSIZE
405
        mov     ecx, IPBUFFSIZE
387
    mul     ecx
406
        mul     ecx
388
    add     eax, IPbuffs
407
        add     eax, IPbuffs
389
 
408
 
390
    mov     edi, eax
409
        mov     edi, eax
391
 
410
 
392
    ; get a pointer to the start of the DATA
411
    ; get a pointer to the start of the DATA
393
    mov     esi, ETH_FRAME.Data
412
        mov     esi, ETH_FRAME.Data
394
 
413
 
395
    ; Now store it all away
414
    ; Now store it all away
396
    mov     ecx, IPBUFFSIZE / 4     ; Copy all of the available
415
        mov     ecx, IPBUFFSIZE / 4 ; Copy all of the available
397
			      ; data across - worse case
416
                              ; data across - worse case
398
    cld
417
        cld
399
    rep     movsd
418
        rep movsd
400
 
419
 
401
;        inc     [ether_IP_handler_cnt]
420
;        inc     [ether_IP_handler_cnt]
402
;        DEBUGF  1, "K : ether_IP_handler (%u)\n", [ether_IP_handler_cnt]
421
;        DEBUGF  1, "K : ether_IP_handler (%u)\n", [ether_IP_handler_cnt]
403
 
422
 
404
    ; And finally, place the buffer in the IPRX queue
423
    ; And finally, place the buffer in the IPRX queue
405
    pop     ebx
424
        pop     ebx
406
    mov     eax, IPIN_QUEUE
425
        mov     eax, IPIN_QUEUE
407
    call    queue
426
        call    queue
408
 
427
 
409
eiph00x:
428
eiph00x:
410
    ret
429
        ret
411
 
430
 
412
;***************************************************************************
431
;***************************************************************************
413
;   Function
432
;   Function
414
;      eth_probe
433
;      eth_probe
415
;   Description
434
;   Description
416
;      Searches for an ethernet card. If found, the card is enabled and
435
;      Searches for an ethernet card. If found, the card is enabled and
417
;      the ethernet -> IP link established
436
;      the ethernet -> IP link established
418
;
437
;
419
;      This function scans the PCI bus looking for a supported device.
438
;      This function scans the PCI bus looking for a supported device.
420
;      ISA bus is currently not supported.
439
;      ISA bus is currently not supported.
421
;
440
;
422
;        eax is 0 if no hardware found
441
;        eax is 0 if no hardware found
423
;***************************************************************************
442
;***************************************************************************
424
eth_probe:
443
eth_probe:
425
    ; Find a card on the PCI bus, and get it's address
444
    ; Find a card on the PCI bus, and get it's address
426
    call    scan_bus			; Find the ethernet cards PIC address
445
        call    scan_bus                ; Find the ethernet cards PIC address
427
    xor     eax, eax
446
        xor     eax, eax
428
    cmp     [io_addr], eax
447
        cmp     [io_addr], eax
429
    je	    ep_00x			; Return 0 in eax if no cards found
448
        je      ep_00x                  ; Return 0 in eax if no cards found
430
 
449
 
431
    call    dword [drvr_probe]		; Call the drivers probe function
450
        call    dword [drvr_probe]      ; Call the drivers probe function
432
 
451
 
433
    mov     eax, [io_addr]		; return a non zero value
452
        mov     eax, [io_addr]          ; return a non zero value
434
 
453
 
435
ep_00x:
454
ep_00x:
436
    ret
455
        ret
437
 
456
 
438
;***************************************************************************
457
;***************************************************************************
439
;   Function
458
;   Function
440
;      ethernet_driver
459
;      ethernet_driver
441
;
460
;
442
;   Description
461
;   Description
443
;       The ethernet RX and TX handler
462
;       The ethernet RX and TX handler
444
;       This is a kernel function, called by stack_handler
463
;       This is a kernel function, called by stack_handler
445
;
464
;
446
;***************************************************************************
465
;***************************************************************************
447
ethernet_driver:
466
ethernet_driver:
448
    ; Do nothing if the driver is inactive
467
    ; Do nothing if the driver is inactive
449
    cmp     [ethernet_active], byte 0
468
        cmp     [ethernet_active], byte 0
450
    je	    eth_exit
469
        je      eth_exit
451
 
470
 
452
    call    eth_rx
471
        call    eth_rx
453
    call    eth_tx
472
        call    eth_tx
454
 
473
 
455
eth_exit:
474
eth_exit:
456
    ret
475
        ret
457
 
476
 
458
;***************************************************************************
477
;***************************************************************************
459
;   Function
478
;   Function
460
;      eth_rx
479
;      eth_rx
461
;
480
;
462
;   Description
481
;   Description
463
;      Polls the ethernet card for received data. Extracts if present
482
;      Polls the ethernet card for received data. Extracts if present
464
;       Depending on the Protocol within the packet:
483
;       Depending on the Protocol within the packet:
465
;         ARP : Pass to ARP_handler. This may result in an ARP reply
484
;         ARP : Pass to ARP_handler. This may result in an ARP reply
466
;               being tx'ed
485
;               being tx'ed
467
;         IP  : Store in an IP buffer
486
;         IP  : Store in an IP buffer
468
;
487
;
469
;***************************************************************************
488
;***************************************************************************
470
eth_rx:
489
eth_rx:
471
    xor     ax, ax
490
        xor     ax, ax
472
    mov     [eth_rx_data_len], ax
491
        mov     [eth_rx_data_len], ax
473
    call    dword [drvr_poll]	    ; Call the drivers poll function
492
        call    dword [drvr_poll]   ; Call the drivers poll function
474
 
493
 
475
    mov     ax, [eth_rx_data_len]
494
        mov     ax, [eth_rx_data_len]
476
    cmp     ax, 0
495
        cmp     ax, 0
477
    je	    .exit
496
        je      .exit
478
 
497
 
479
 
498
 
480
    ; Check the protocol. Call appropriate handler
499
    ; Check the protocol. Call appropriate handler
481
 
500
 
482
    mov     ax, [ETH_FRAME.Type]    ; The address of the protocol word
501
        mov     ax, [ETH_FRAME.Type]; The address of the protocol word
483
 
502
 
484
    cmp     ax, ETHER_IP
503
        cmp     ax, ETHER_IP
485
    je	    .is_ip		     ; It's IP
504
        je      .is_ip               ; It's IP
486
 
505
 
487
    cmp     ax, ETHER_ARP
506
        cmp     ax, ETHER_ARP
488
    je	    .is_arp		     ; It is ARP
507
        je      .is_arp              ; It is ARP
489
 
508
 
490
    DEBUGF  1,"K : eth_rx - dumped (%u)\n", ax
509
    DEBUGF  1,"K : eth_rx - dumped (%u)\n", ax
491
    inc     [dumped_rx_count]
510
        inc     [dumped_rx_count]
492
    jmp     .exit		; If not IP or ARP, ignore
511
        jmp     .exit           ; If not IP or ARP, ignore
493
 
512
 
494
  .is_ip:
513
  .is_ip:
495
;    DEBUGF  1,"K : eth_rx - IP packet\n"
514
;    DEBUGF  1,"K : eth_rx - IP packet\n"
496
    inc     dword [ip_rx_count]
515
        inc     dword [ip_rx_count]
497
    call    ether_IP_handler
516
        call    ether_IP_handler
498
    jmp     .exit
517
        jmp     .exit
499
 
518
 
500
  .is_arp:
519
  .is_arp:
501
;    DEBUGF  1,"K : eth_rx - ARP packet\n"
520
;    DEBUGF  1,"K : eth_rx - ARP packet\n"
502
    ; At this point, the packet is still in the Ether_buffer
521
    ; At this point, the packet is still in the Ether_buffer
503
    call    arp_handler
522
        call    arp_handler
504
 
523
 
505
  .exit:
524
  .exit:
506
    ret
525
        ret