Subversion Repositories Kolibri OS

Rev

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

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