Subversion Repositories Kolibri OS

Rev

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

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