Subversion Repositories Kolibri OS

Rev

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

Rev 739 Rev 866
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: 866 $
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
156
 
157
 
157
dd  0x590010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
158
dd  0x590010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
158
dd  0x592010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
159
dd  0x592010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
159
dd  0x597010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
160
dd  0x597010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
160
dd  0x595010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
161
dd  0x595010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
161
dd  0x595110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
162
dd  0x595110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
162
dd  0x595210b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
163
dd  0x595210b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
163
dd  0x900010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
164
dd  0x900010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
164
dd  0x900110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
165
dd  0x900110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
165
dd  0x900410b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
166
dd  0x900410b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
166
dd  0x900510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
167
dd  0x900510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
167
dd  0x900610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
168
dd  0x900610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
168
dd  0x900A10b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
169
dd  0x900A10b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
169
dd  0x905010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
170
dd  0x905010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
170
dd  0x905110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
171
dd  0x905110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
171
dd  0x905510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
172
dd  0x905510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
172
dd  0x905810b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
173
dd  0x905810b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
173
dd  0x905A10b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
174
dd  0x905A10b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
174
dd  0x920010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
175
dd  0x920010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
175
dd  0x980010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
176
dd  0x980010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
176
dd  0x980510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
177
dd  0x980510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
177
dd  0x764610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
178
dd  0x764610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
178
dd  0x505510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
179
dd  0x505510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
179
dd  0x605510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
180
dd  0x605510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
180
dd  0x605610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
181
dd  0x605610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
181
dd  0x5b5710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
182
dd  0x5b5710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
182
dd  0x505710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
183
dd  0x505710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
183
dd  0x515710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
184
dd  0x515710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
184
dd  0x525710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
185
dd  0x525710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
185
dd  0x656010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
186
dd  0x656010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
186
dd  0x656210b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
187
dd  0x656210b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
187
dd  0x656410b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
188
dd  0x656410b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
188
dd  0x450010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
189
dd  0x450010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
189
 
190
 
190
dd  0x09001039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0
191
dd  0x09001039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0
191
 
192
 
192
dd  0x20001022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0
193
dd  0x20001022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0
193
dd  0x26251022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0
194
dd  0x26251022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0
194
dd  0x20011022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0
195
dd  0x20011022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0
195
 
196
 
196
;dd  0x08031516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable
197
;dd  0x08031516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable
197
 
198
 
198
; following cards are untested
199
; following cards are untested
199
dd  0x70161039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0
200
dd  0x70161039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0
200
;dd  0x08001516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable
201
;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
202
;dd  0x08911516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable
-
 
203
 
-
 
204
dd 0x006610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, 0 ; nVidia Corporation nForce2 Ethernet Controller
202
 
205
 
203
rb PCICARDS_ENTRY_SIZE	; end of list marker, do not remove
206
rb PCICARDS_ENTRY_SIZE	; end of list marker, do not remove
204
endg
207
endg
205
 
208
 
206
uglobal
209
uglobal
207
;Net-stack's interface's settings
210
;Net-stack's interface's settings
208
  node_addr:	      db  0,0,0,0,0,0
211
  node_addr:	      db  0,0,0,0,0,0
209
  gateway_ip:	      dd  0
212
  gateway_ip:	      dd  0
210
  dns_ip:	      dd  0
213
  dns_ip:	      dd  0
211
 
214
 
212
  eth_rx_data_len:    dw  0
215
  eth_rx_data_len:    dw  0
213
  eth_status:	      dd  0
216
  eth_status:	      dd  0
214
  io_addr:	      dd  0
217
  io_addr:	      dd  0
215
  hdrtype:	      db  0
218
  hdrtype:	      db  0
216
  vendor_device:      dd  0
219
  vendor_device:      dd  0
217
  pci_data:	      dd  0
220
  pci_data:	      dd  0
218
  pci_dev:	      dd  0
221
  pci_dev:	      dd  0
219
  pci_bus:	      dd  0
222
  pci_bus:	      dd  0
220
 
223
 
221
  ; These will hold pointers to the selected driver functions
224
  ; These will hold pointers to the selected driver functions
222
  drvr_probe:	      dd  0
225
  drvr_probe:	      dd  0
223
  drvr_reset:	      dd  0
226
  drvr_reset:	      dd  0
224
  drvr_poll:	      dd  0
227
  drvr_poll:	      dd  0
225
  drvr_transmit:      dd  0
228
  drvr_transmit:      dd  0
226
  drvr_cable:	      dd  0
229
  drvr_cable:	      dd  0
227
 
230
 
228
endg
231
endg
229
 
232
 
230
iglobal
233
iglobal
231
  broadcast_add:      db  0xff,0xff,0xff,0xff,0xff,0xff
234
  broadcast_add:      db  0xff,0xff,0xff,0xff,0xff,0xff
232
  subnet_mask:	      dd  0x00ffffff   ; 255.255.255.0
235
  subnet_mask:	      dd  0x00ffffff   ; 255.255.255.0
233
endg
236
endg
234
 
237
 
235
include "arp.inc"    ;arp-protocol functions
238
include "arp.inc"    ;arp-protocol functions
236
include "pci.inc"    ;PCI bus access functions
239
include "pci.inc"    ;PCI bus access functions
237
 
240
 
238
 
241
 
239
;***************************************************************************
242
;***************************************************************************
240
;   Function
243
;   Function
241
;      eth_tx
244
;      eth_tx
242
;
245
;
243
;   Description
246
;   Description
244
;      Looks at the NET1OUT_QUEUE for data to send.
247
;      Looks at the NET1OUT_QUEUE for data to send.
245
;      Stores that destination IP in a location used by the tx routine
248
;      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
249
;      Looks up the MAC address in the ARP table; stores that where
247
;      the tx routine can get it
250
;      the tx routine can get it
248
;      Get the length of the data. Store that where the tx routine wants it
251
;      Get the length of the data. Store that where the tx routine wants it
249
;      Call tx
252
;      Call tx
250
;      Places buffer on empty queue when the tx routine finished
253
;      Places buffer on empty queue when the tx routine finished
251
;
254
;
252
;***************************************************************************
255
;***************************************************************************
253
proc eth_tx stdcall uses ebx esi edi
256
proc eth_tx stdcall uses ebx esi edi
254
local MACAddress  dp  ?  ;allocate 6 bytes in the stack
257
local MACAddress  dp  ?  ;allocate 6 bytes in the stack
255
 
258
 
256
    ; Look for a buffer to tx
259
    ; Look for a buffer to tx
257
    mov     eax, NET1OUT_QUEUE
260
    mov     eax, NET1OUT_QUEUE
258
    call    dequeue
261
    call    dequeue
259
    cmp     ax, NO_BUFFER
262
    cmp     ax, NO_BUFFER
260
    je	    .exit	     ; Exit if no buffer available
263
    je	    .exit	     ; Exit if no buffer available
261
 
264
 
262
    push    eax  ;save buffer number
265
    push    eax  ;save buffer number
263
 
266
 
264
    ; convert buffer pointer eax to the absolute address
267
    ; convert buffer pointer eax to the absolute address
265
    imul    eax, IPBUFFSIZE
268
    imul    eax, IPBUFFSIZE
266
    add     eax, IPbuffs
269
    add     eax, IPbuffs
267
 
270
 
268
    ; Extract the destination IP
271
    ; Extract the destination IP
269
    ; find the destination IP in the ARP table, get MAC
272
    ; find the destination IP in the ARP table, get MAC
270
    ; store this MAC in 'MACAddress'
273
    ; store this MAC in 'MACAddress'
271
    mov     ebx, eax		   ; Save buffer address
274
    mov     ebx, eax		   ; Save buffer address
272
    mov     edx, [ebx + 16]	   ; get destination address
275
    mov     edx, [ebx + 16]	   ; get destination address
273
 
276
 
274
    ; If the destination address is 255.255.255.255,
277
    ; If the destination address is 255.255.255.255,
275
    ; set the MACAddress to all ones ( broadcast )
278
    ; set the MACAddress to all ones ( broadcast )
276
    cld
279
    cld
277
    mov     esi, broadcast_add
280
    mov     esi, broadcast_add
278
    lea     edi, [MACAddress]
281
    lea     edi, [MACAddress]
279
    movsd
282
    movsd
280
    movsw
283
    movsw
281
    cmp     edx, 0xffffffff
284
    cmp     edx, 0xffffffff
282
    je	    .send		 ; If it is broadcast, just send
285
    je	    .send		 ; If it is broadcast, just send
283
 
286
 
284
    lea     eax, [MACAddress]	 ;cause this is local variable
287
    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.
288
    stdcall arp_table_manager, ARP_TABLE_IP_TO_MAC, edx, eax ;opcode,IP,MAC_ptr - Get the MAC address.
286
 
289
 
287
    cmp     eax, ARP_VALID_MAPPING
290
    cmp     eax, ARP_VALID_MAPPING
288
    je	    .send
291
    je	    .send
289
 
292
 
290
    ; No valid entry. Has the request been sent, but timed out?
293
    ; No valid entry. Has the request been sent, but timed out?
291
    cmp     eax, ARP_RESPONSE_TIMEOUT
294
    cmp     eax, ARP_RESPONSE_TIMEOUT
292
    je	    .freebuf
295
    je	    .freebuf
293
 
296
 
294
  .wait_response:		    ;we wait arp-response
297
  .wait_response:		    ;we wait arp-response
295
				    ; Re-queue the packet, and exit
298
				    ; Re-queue the packet, and exit
296
    pop     ebx
299
    pop     ebx
297
    mov     eax, NET1OUT_QUEUE
300
    mov     eax, NET1OUT_QUEUE
298
    call    queue			 ; Get the buffer back
301
    call    queue			 ; Get the buffer back
299
    jmp     .exit
302
    jmp     .exit
300
 
303
 
301
  .send:    ;if ARP_VALID_MAPPING then send the packet
304
  .send:    ;if ARP_VALID_MAPPING then send the packet
302
    lea     edi, [MACAddress]	  ; Pointer to 48 bit destination address
305
    lea     edi, [MACAddress]	  ; Pointer to 48 bit destination address
303
    movzx   ecx, word[ebx+2]	  ; Size of IP packet to send
306
    movzx   ecx, word[ebx+2]	  ; Size of IP packet to send
304
    xchg    ch, cl		  ; because mirror byte-order
307
    xchg    ch, cl		  ; because mirror byte-order
305
    mov     esi, ebx		  ; Pointer to packet data
308
    mov     esi, ebx		  ; Pointer to packet data
306
    mov     bx, ETHER_IP	  ; Type of packet
309
    mov     bx, ETHER_IP	  ; Type of packet
307
    push    ebp
310
    push    ebp
308
    call    dword [drvr_transmit] ; Call the drivers transmit function
311
    call    dword [drvr_transmit] ; Call the drivers transmit function
309
    pop     ebp
312
    pop     ebp
310
 
313
 
311
    ; OK, we have sent a packet, so increment the count
314
    ; OK, we have sent a packet, so increment the count
312
    inc     dword [ip_tx_count]
315
    inc     dword [ip_tx_count]
313
 
316
 
314
    ; And finally, return the buffer to the free queue
317
    ; And finally, return the buffer to the free queue
315
  .freebuf:
318
  .freebuf:
316
    pop     eax
319
    pop     eax
317
    call    freeBuff
320
    call    freeBuff
318
 
321
 
319
  .exit:
322
  .exit:
320
    ret
323
    ret
321
endp
324
endp
322
 
325
 
323
;***************************************************************************
326
;***************************************************************************
324
;   Function
327
;   Function
325
;      ether_IP_handler
328
;      ether_IP_handler
326
;
329
;
327
;   Description
330
;   Description
328
;      Called when an IP ethernet packet is received on the ethernet
331
;      Called when an IP ethernet packet is received on the ethernet
329
;      Header + Data is in Ether_buffer[]
332
;      Header + Data is in Ether_buffer[]
330
;      We just need to get a buffer from the 'free' queue, and
333
;      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
334
;      store the packet in it, then insert the packet number into the
332
;      IPRX queue.
335
;      IPRX queue.
333
;      If no queue entry is available, the packet is silently discarded
336
;      If no queue entry is available, the packet is silently discarded
334
;      All registers may be destroyed
337
;      All registers may be destroyed
335
;
338
;
336
;***************************************************************************
339
;***************************************************************************
337
ether_IP_handler:
340
ether_IP_handler:
338
    mov     eax, EMPTY_QUEUE
341
    mov     eax, EMPTY_QUEUE
339
    call    dequeue
342
    call    dequeue
340
    cmp     ax, NO_BUFFER
343
    cmp     ax, NO_BUFFER
341
    je	    eiph00x
344
    je	    eiph00x
342
 
345
 
343
    ; convert buffer pointer eax to the absolute address
346
    ; convert buffer pointer eax to the absolute address
344
    push    eax
347
    push    eax
345
    mov     ecx, IPBUFFSIZE
348
    mov     ecx, IPBUFFSIZE
346
    mul     ecx
349
    mul     ecx
347
    add     eax, IPbuffs
350
    add     eax, IPbuffs
348
 
351
 
349
    mov     edi, eax
352
    mov     edi, eax
350
 
353
 
351
    ; get a pointer to the start of the DATA
354
    ; get a pointer to the start of the DATA
352
    mov     esi, ETH_FRAME.Data
355
    mov     esi, ETH_FRAME.Data
353
 
356
 
354
    ; Now store it all away
357
    ; Now store it all away
355
    mov     ecx, IPBUFFSIZE / 4     ; Copy all of the available
358
    mov     ecx, IPBUFFSIZE / 4     ; Copy all of the available
356
			      ; data across - worse case
359
			      ; data across - worse case
357
    cld
360
    cld
358
    rep     movsd
361
    rep     movsd
359
 
362
 
360
    ; And finally, place the buffer in the IPRX queue
363
    ; And finally, place the buffer in the IPRX queue
361
    pop     ebx
364
    pop     ebx
362
    mov     eax, IPIN_QUEUE
365
    mov     eax, IPIN_QUEUE
363
    call    queue
366
    call    queue
364
 
367
 
365
eiph00x:
368
eiph00x:
366
    ret
369
    ret
367
 
370
 
368
;***************************************************************************
371
;***************************************************************************
369
;   Function
372
;   Function
370
;      eth_probe
373
;      eth_probe
371
;   Description
374
;   Description
372
;      Searches for an ethernet card. If found, the card is enabled and
375
;      Searches for an ethernet card. If found, the card is enabled and
373
;      the ethernet -> IP link established
376
;      the ethernet -> IP link established
374
;
377
;
375
;      This function scans the PCI bus looking for a supported device.
378
;      This function scans the PCI bus looking for a supported device.
376
;      ISA bus is currently not supported.
379
;      ISA bus is currently not supported.
377
;
380
;
378
;        eax is 0 if no hardware found
381
;        eax is 0 if no hardware found
379
;***************************************************************************
382
;***************************************************************************
380
eth_probe:
383
eth_probe:
381
    ; Find a card on the PCI bus, and get it's address
384
    ; Find a card on the PCI bus, and get it's address
382
    call    scan_bus			; Find the ethernet cards PIC address
385
    call    scan_bus			; Find the ethernet cards PIC address
383
    xor     eax, eax
386
    xor     eax, eax
384
    cmp     [io_addr], eax
387
    cmp     [io_addr], eax
385
    je	    ep_00x			; Return 0 in eax if no cards found
388
    je	    ep_00x			; Return 0 in eax if no cards found
386
 
389
 
387
    call    dword [drvr_probe]		; Call the drivers probe function
390
    call    dword [drvr_probe]		; Call the drivers probe function
388
 
391
 
389
    mov     eax, [io_addr]		; return a non zero value
392
    mov     eax, [io_addr]		; return a non zero value
390
 
393
 
391
ep_00x:
394
ep_00x:
392
    ret
395
    ret
393
 
396
 
394
;***************************************************************************
397
;***************************************************************************
395
;   Function
398
;   Function
396
;      ethernet_driver
399
;      ethernet_driver
397
;
400
;
398
;   Description
401
;   Description
399
;       The ethernet RX and TX handler
402
;       The ethernet RX and TX handler
400
;       This is a kernel function, called by stack_handler
403
;       This is a kernel function, called by stack_handler
401
;
404
;
402
;***************************************************************************
405
;***************************************************************************
403
ethernet_driver:
406
ethernet_driver:
404
    ; Do nothing if the driver is inactive
407
    ; Do nothing if the driver is inactive
405
    cmp     [ethernet_active], byte 0
408
    cmp     [ethernet_active], byte 0
406
    je	    eth_exit
409
    je	    eth_exit
407
 
410
 
408
    call    eth_rx
411
    call    eth_rx
409
    call    eth_tx
412
    call    eth_tx
410
 
413
 
411
eth_exit:
414
eth_exit:
412
    ret
415
    ret
413
 
416
 
414
;***************************************************************************
417
;***************************************************************************
415
;   Function
418
;   Function
416
;      eth_rx
419
;      eth_rx
417
;
420
;
418
;   Description
421
;   Description
419
;      Polls the ethernet card for received data. Extracts if present
422
;      Polls the ethernet card for received data. Extracts if present
420
;       Depending on the Protocol within the packet:
423
;       Depending on the Protocol within the packet:
421
;         ARP : Pass to ARP_handler. This may result in an ARP reply
424
;         ARP : Pass to ARP_handler. This may result in an ARP reply
422
;               being tx'ed
425
;               being tx'ed
423
;         IP  : Store in an IP buffer
426
;         IP  : Store in an IP buffer
424
;
427
;
425
;***************************************************************************
428
;***************************************************************************
426
eth_rx:
429
eth_rx:
427
    xor     ax, ax
430
    xor     ax, ax
428
    mov     [eth_rx_data_len], ax
431
    mov     [eth_rx_data_len], ax
429
    call    dword [drvr_poll]	    ; Call the drivers poll function
432
    call    dword [drvr_poll]	    ; Call the drivers poll function
430
 
433
 
431
    mov     ax, [eth_rx_data_len]
434
    mov     ax, [eth_rx_data_len]
432
    cmp     ax, 0
435
    cmp     ax, 0
433
    je	    .exit
436
    je	    .exit
434
 
437
 
435
 
438
 
436
    ; Check the protocol. Call appropriate handler
439
    ; Check the protocol. Call appropriate handler
437
 
440
 
438
    mov     ax, [ETH_FRAME.Type]    ; The address of the protocol word
441
    mov     ax, [ETH_FRAME.Type]    ; The address of the protocol word
439
 
442
 
440
    cmp     ax, ETHER_IP
443
    cmp     ax, ETHER_IP
441
    je	    .is_ip		     ; It's IP
444
    je	    .is_ip		     ; It's IP
442
 
445
 
443
    cmp     ax, ETHER_ARP
446
    cmp     ax, ETHER_ARP
444
    je	    .is_arp		     ; It is ARP
447
    je	    .is_arp		     ; It is ARP
445
 
448
 
446
    jmp     .exit		; If not IP or ARP, ignore
449
    jmp     .exit		; If not IP or ARP, ignore
447
 
450
 
448
  .is_ip:
451
  .is_ip:
449
    DEBUGF  1,"K : eth_rx - IP packet\n"
452
    DEBUGF  1,"K : eth_rx - IP packet\n"
450
    inc     dword [ip_rx_count]
453
    inc     dword [ip_rx_count]
451
    call    ether_IP_handler
454
    call    ether_IP_handler
452
    jmp     .exit
455
    jmp     .exit
453
 
456
 
454
  .is_arp:
457
  .is_arp:
455
    DEBUGF  1,"K : eth_rx - ARP packet\n"
458
    DEBUGF  1,"K : eth_rx - ARP packet\n"
456
    ; At this point, the packet is still in the Ether_buffer
459
    ; At this point, the packet is still in the Ether_buffer
457
    call    arp_handler
460
    call    arp_handler
458
 
461
 
459
  .exit:
462
  .exit:
460
    ret
463
    ret