ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/SheepShaver/src/BeOS/CreatePCIDrivers/Ethernet.cpp
Revision: 1.5
Committed: 2008-01-01T09:47:38Z (16 years, 9 months ago) by gbeauche
Branch: MAIN
CVS Tags: HEAD
Changes since 1.4: +1 -1 lines
Log Message:
Happy New Year!

File Contents

# Content
1 /*
2 * Ethernet.cpp - SheepShaver ethernet PCI driver stub
3 *
4 * SheepShaver (C) 1997-2008 Christian Bauer and Marc Hellwig
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21 #include "sysdeps.h"
22 #include <stddef.h>
23 #include "xlowmem.h"
24 #include "ether_defs.h"
25
26
27 /*
28 * Driver Description structure
29 */
30
31 struct DriverDescription {
32 uint32 driverDescSignature;
33 uint32 driverDescVersion;
34 char nameInfoStr[32];
35 uint32 version;
36 uint32 driverRuntime;
37 char driverName[32];
38 uint32 driverDescReserved[8];
39 uint32 nServices;
40 uint32 serviceCategory;
41 uint32 serviceType;
42 uint32 serviceVersion;
43 };
44
45 #pragma export on
46 DriverDescription TheDriverDescription = {
47 'mtej',
48 0,
49 "\pSheepShaver Ethernet",
50 0x01008000, // V1.0.0final
51 4, // kDriverIsUnderExpertControl
52 "\penet",
53 0, 0, 0, 0, 0, 0, 0, 0,
54 1,
55 'otan',
56 0x000a0b01, // Ethernet, Framing: Ethernet/EthernetIPX/802.2, IsDLPI
57 0x01000000, // V1.0.0
58 };
59 #pragma export off
60
61
62 /*
63 * install_info and related structures
64 */
65
66 static int ether_open(queue_t *rdq, void *dev, int flag, int sflag, void *creds);
67 static int ether_close(queue_t *rdq, int flag, void *creds);
68 static int ether_wput(queue_t *q, msgb *mp);
69 static int ether_wsrv(queue_t *q);
70 static int ether_rput(queue_t *q, msgb *mp);
71 static int ether_rsrv(queue_t *q);
72
73 struct ot_module_info {
74 uint16 mi_idnum;
75 char *mi_idname;
76 int32 mi_minpsz; // Minimum packet size
77 int32 mi_maxpsz; // Maximum packet size
78 uint32 mi_hiwat; // Queue hi-water mark
79 uint32 mi_lowat; // Queue lo-water mark
80 };
81
82 static ot_module_info module_information = {
83 kEnetModuleID,
84 "SheepShaver Ethernet",
85 0,
86 kEnetTSDU,
87 6000,
88 5000
89 };
90
91 typedef int (*putp_t)(queue_t *, msgb *);
92 typedef int (*srvp_t)(queue_t *);
93 typedef int (*openp_t)(queue_t *, void *, int, int, void *);
94 typedef int (*closep_t)(queue_t *, int, void *);
95
96 struct qinit {
97 putp_t qi_putp;
98 srvp_t qi_srvp;
99 openp_t qi_qopen;
100 closep_t qi_qclose;
101 void *qi_qadmin;
102 struct ot_module_info *qi_minfo;
103 void *qi_mstat;
104 };
105
106 static qinit read_side = {
107 NULL,
108 ether_rsrv,
109 ether_open,
110 ether_close,
111 NULL,
112 &module_information,
113 NULL
114 };
115
116 static qinit write_side = {
117 ether_wput,
118 NULL,
119 ether_open,
120 ether_close,
121 NULL,
122 &module_information,
123 NULL
124 };
125
126 struct streamtab {
127 struct qinit *st_rdinit;
128 struct qinit *st_wrinit;
129 struct qinit *st_muxrinit;
130 struct qinit *st_muxwinit;
131 };
132
133 static streamtab the_streamtab = {
134 &read_side,
135 &write_side,
136 NULL,
137 NULL
138 };
139
140 struct install_info {
141 struct streamtab *install_str;
142 uint32 install_flags;
143 uint32 install_sqlvl;
144 char *install_buddy;
145 void *ref_load;
146 uint32 ref_count;
147 };
148
149 enum {
150 kOTModIsDriver = 0x00000001,
151 kOTModUpperIsDLPI = 0x00002000,
152 SQLVL_MODULE = 3,
153 };
154
155 static install_info the_install_info = {
156 &the_streamtab,
157 kOTModIsDriver /*| kOTModUpperIsDLPI */,
158 SQLVL_MODULE,
159 NULL,
160 NULL,
161 0
162 };
163
164
165 // Prototypes for exported functions
166 extern "C" {
167 #pragma export on
168 extern uint32 ValidateHardware(void *theID);
169 extern install_info* GetOTInstallInfo();
170 extern uint8 InitStreamModule(void *theID);
171 extern void TerminateStreamModule(void);
172 #pragma export off
173 }
174
175
176 /*
177 * Validate that our hardware is available (always available)
178 */
179
180 uint32 ValidateHardware(void *theID)
181 {
182 return 0;
183 }
184
185
186 /*
187 * Return pointer to install_info structure
188 */
189
190 install_info *GetOTInstallInfo(void)
191 {
192 return &the_install_info;
193 }
194
195
196 /*
197 * Init module
198 */
199
200 asm uint8 InitStreamModule(register void *theID)
201 {
202 lwz r2,XLM_TOC
203 lwz r0,XLM_ETHER_INIT
204 mtctr r0
205 bctr
206 }
207
208
209 /*
210 * Terminate module
211 */
212
213 asm void TerminateStreamModule(void)
214 {
215 lwz r2,XLM_TOC
216 lwz r0,XLM_ETHER_TERM
217 mtctr r0
218 bctr
219 }
220
221
222 /*
223 * DLPI functions
224 */
225
226 static asm int ether_open(register queue_t *rdq, register void *dev, register int flag, register int sflag, register void *creds)
227 {
228 lwz r2,XLM_TOC
229 lwz r0,XLM_ETHER_OPEN
230 mtctr r0
231 bctr
232 }
233
234 static asm int ether_close(register queue_t *rdq, register int flag, register void *creds)
235 {
236 lwz r2,XLM_TOC
237 lwz r0,XLM_ETHER_CLOSE
238 mtctr r0
239 bctr
240 }
241
242 static asm int ether_wput(register queue_t *q, register msgb *mp)
243 {
244 lwz r2,XLM_TOC
245 lwz r0,XLM_ETHER_WPUT
246 mtctr r0
247 bctr
248 }
249
250 static asm int ether_rsrv(register queue_t *q)
251 {
252 lwz r2,XLM_TOC
253 lwz r0,XLM_ETHER_RSRV
254 mtctr r0
255 bctr
256 }