Subversion Repositories Kolibri OS

Rev

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

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