]> git.ipfire.org Git - ipfire-2.x.git/blob - src/hwinfo/src/hd/sbus.c
Kleiner netter neuer Versuch.
[ipfire-2.x.git] / src / hwinfo / src / hd / sbus.c
1 #include <fcntl.h>
2 #include <stdio.h>
3 #include <unistd.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <sys/ioctl.h>
7
8 #include "hd.h"
9 #include "hd_int.h"
10 #include "sbus.h"
11
12 #ifdef __sparc__
13
14 #ifdef DIET
15 typedef unsigned int u_int;
16 #endif
17
18 #include <asm/openpromio.h>
19
20 #define MAX_VAL (4096-128-4)
21
22 static int prom_fd;
23
24 static int
25 prom_nextnode (int node)
26 {
27 char buf[OPROMMAXPARAM];
28 struct openpromio *op = (struct openpromio *)buf;
29
30 op->oprom_size = sizeof (int);
31 if (node == -1)
32 return 0;
33
34 *(int *)op->oprom_array = node;
35 if (ioctl (prom_fd, OPROMNEXT, op) < 0)
36 return 0;
37
38 return *(int *)op->oprom_array;
39 }
40
41 static int
42 prom_getchild (int node)
43 {
44 char buf[OPROMMAXPARAM];
45 struct openpromio *op = (struct openpromio *)buf;
46
47 op->oprom_size = sizeof (int);
48
49 if (!node || node == -1)
50 return 0;
51
52 *(int *)op->oprom_array = node;
53 if (ioctl (prom_fd, OPROMCHILD, op) < 0)
54 return 0;
55
56 return *(int *)op->oprom_array;
57 }
58
59 static char
60 *prom_getproperty (char *prop, int *lenp, char *buf)
61 {
62 struct openpromio *op = (struct openpromio *)buf;
63
64 op->oprom_size = MAX_VAL;
65
66 strcpy (op->oprom_array, prop);
67
68 if (ioctl (prom_fd, OPROMGETPROP, op) < 0)
69 return 0;
70
71 if (lenp)
72 *lenp = op->oprom_size;
73
74 if (strncmp ("SUNW,", op->oprom_array, 5) == 0)
75 return op->oprom_array + 5;
76 else
77 return op->oprom_array;
78 }
79
80 static int
81 prom_getbool (char *prop)
82 {
83 char buf[OPROMMAXPARAM];
84 struct openpromio *op = (struct openpromio *)buf;
85
86 op->oprom_size = 0;
87
88 *(int *)op->oprom_array = 0;
89 for (;;) {
90 op->oprom_size = 128; /* MAX_PROP */
91 if (ioctl (prom_fd, OPROMNXTPROP, op) < 0)
92 return 0;
93 if (!op->oprom_size)
94 return 0;
95 if (!strcmp (op->oprom_array, prop))
96 return 1;
97 }
98 }
99
100 static void
101 prom_parse (int node, int sbus, int ebus, hd_data_t *hd_data)
102 {
103 hd_t *hd;
104 char buf1[OPROMMAXPARAM], buf2[OPROMMAXPARAM];
105 int nextnode;
106 int len, nsbus = sbus, nebus = ebus;
107 char *prop1 = prom_getproperty ("device_type", &len, buf1);
108
109 if (strcmp (prop1, "network") == 0)
110 {
111 char *prop2 = prom_getproperty ("name", &len, buf2);
112 if (prop2 && len >= 0)
113 {
114 if (strcmp (prop2, "hme") == 0)
115 {
116 ADD2LOG ("NETWORK: type=Sun Happy Meal Ethernet, module=sunhme\n");
117 hd = add_hd_entry (hd_data, __LINE__, 0);
118 hd->base_class.id = bc_network;
119 hd->sub_class.id = 0x00;
120 hd->bus.id = bus_sbus;
121
122 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
123 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x3001);
124 }
125 else if (strcmp (prop2, "le") == 0)
126 {
127 ADD2LOG ("NETWORK: type=Sun Lance Ethernet, module=ignore\n");
128 hd = add_hd_entry (hd_data, __LINE__, 0);
129 hd->base_class.id = bc_network;
130 hd->sub_class.id = 0x00;
131 hd->bus.id = bus_sbus;
132
133 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
134 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x3002);
135 }
136 else if (strcmp (prop2, "qe") == 0)
137 {
138 prop2 = prom_getproperty("channel#", &len, buf2);
139 if (prop2 && len == 4 && *(int *)prop2 == 0)
140 {
141 ADD2LOG ("NETWORK: type=Sun Quad Ethernet, module=sunqe\n");
142 hd = add_hd_entry (hd_data, __LINE__, 0);
143 hd->base_class.id = bc_network;
144 hd->sub_class.id = 0x00;
145 hd->bus.id = bus_sbus;
146
147 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
148 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x3003);
149 }
150 }
151 else if (strcmp (prop2, "qfe") == 0)
152 {
153 ADD2LOG ("NETWORK: type=Sun Quad Ethernet (qfe), module=sunhme\n");
154 hd = add_hd_entry (hd_data, __LINE__, 0);
155 hd->base_class.id = bc_network;
156 hd->sub_class.id = 0x00;
157 hd->bus.id = bus_sbus;
158
159 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
160 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x3001);
161 }
162 else if (strcmp (prop2, "mlanai") == 0 || strcmp (prop2, "myri") == 0)
163 {
164 ADD2LOG ("NETWORK: type=MyriCOM MyriNET Gigabit Ethernet, module=myri_sbus\n");
165 hd = add_hd_entry (hd_data, __LINE__, 0);
166 hd->base_class.id = bc_network;
167 hd->sub_class.id = 0x00;
168 hd->bus.id = bus_sbus;
169
170 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
171 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x3004);
172 }
173 else
174 ADD2LOG ("NETWORK: Unknown device \"%s\"\n", prop2);
175 }
176 }
177 else if (strcmp (prop1, "scsi") == 0)
178 {
179 char *prop2 = prom_getproperty ("name", &len, buf2);
180 if (prop2 && len >= 0)
181 {
182 if (sbus)
183 {
184 if (strcmp (prop2, "esp") == 0)
185 {
186 ADD2LOG ("SCSI: type=Sun Enhanced SCSI Processor (ESP), module=ignore\n");
187 hd = add_hd_entry (hd_data, __LINE__, 0);
188 hd->base_class.id = bc_storage;
189 hd->sub_class.id = sc_sto_scsi;
190 hd->bus.id = bus_sbus;
191
192 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
193 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x1001);
194 }
195 else if (strcmp (prop2, "soc") == 0)
196 {
197 ADD2LOG ("SCSI: type=Sun SPARCStorage Array, module=fc4:soc:pluto\n");
198 hd = add_hd_entry (hd_data, __LINE__, 0);
199 hd->base_class.id = bc_storage;
200 hd->sub_class.id = sc_sto_scsi;
201 hd->bus.id = bus_sbus;
202
203 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
204 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x1101);
205 }
206 else if (strcmp (prop2, "socal") == 0)
207 {
208 ADD2LOG ("SCSI: type=Sun Enterprise Network Array, module=fc4:socal:fcal\n");
209 hd = add_hd_entry (hd_data, __LINE__, 0);
210 hd->base_class.id = bc_storage;
211 hd->sub_class.id = sc_sto_scsi;
212 hd->bus.id = bus_sbus;
213
214 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
215 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x1102);
216 }
217 else if (strcmp (prop2, "fas") == 0)
218 {
219 ADD2LOG ("SCSI: type=Sun Swift (ESP), module=ignore\n");
220 hd = add_hd_entry (hd_data, __LINE__, 0);
221 hd->base_class.id = bc_storage;
222 hd->sub_class.id = sc_sto_scsi;
223 hd->bus.id = bus_sbus;
224
225 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
226 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x1002);
227 }
228 else if (strcmp (prop2, "ptisp") == 0)
229 {
230 ADD2LOG ("SCSI: type=Performance Technologies ISP, module=qlogicpti\n");
231 hd = add_hd_entry (hd_data, __LINE__, 0);
232 hd->base_class.id = bc_storage;
233 hd->sub_class.id = sc_sto_scsi;
234 hd->bus.id = bus_sbus;
235
236 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
237 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x1003);
238 }
239 else if (strcmp (prop2, "isp") == 0)
240 {
241 ADD2LOG ("SCSI: type=QLogic ISP, module=qlogicpti\n");
242 hd = add_hd_entry (hd_data, __LINE__, 0);
243 hd->base_class.id = bc_storage;
244 hd->sub_class.id = sc_sto_scsi;
245 hd->bus.id = bus_sbus;
246
247 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
248 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x1004);
249 }
250 else
251 ADD2LOG ("SCSI: Unknown SBUS device \"%s\"\n", prop2);
252 }
253 else
254 ADD2LOG ("SCSI: Unknown device \"%s\"\n", prop2);
255 }
256 }
257 else if (strcmp (prop1, "display") == 0)
258 {
259 char *prop2 = prom_getproperty ("name", &len, buf2);
260 if (prop2 && len >= 0)
261 if (sbus || strcmp (prop2, "ffb") == 0 ||
262 strcmp (prop2, "afb") == 0 || strcmp (prop2, "cgfourteen") == 0)
263 {
264 if (strcmp (prop2, "bwtwo") == 0)
265 {
266 ADD2LOG ("DISPLAY: Sun|Monochrome (bwtwo), depth=1\n");
267 hd = add_hd_entry (hd_data, __LINE__, 0);
268 hd->base_class.id = bc_display;
269 hd->sub_class.id = sc_dis_vga;
270 hd->bus.id = bus_sbus;
271
272 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
273 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0001);
274 }
275 else if (strcmp (prop2, "cgthree") == 0)
276 {
277 ADD2LOG ("DISPLAY: Sun|Color3 (cgthree), depth=8\n");
278 hd = add_hd_entry (hd_data, __LINE__, 0);
279 hd->base_class.id = bc_display;
280 hd->sub_class.id = sc_dis_vga;
281 hd->bus.id = bus_sbus;
282
283 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
284 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0002);
285 }
286 else if (strcmp (prop2, "cgeight") == 0)
287 {
288 ADD2LOG ("DISPLAY: Sun|CG8/RasterOps, depth=8\n");
289 hd = add_hd_entry (hd_data, __LINE__, 0);
290 hd->base_class.id = bc_display;
291 hd->sub_class.id = sc_dis_vga;
292 hd->bus.id = bus_sbus;
293
294 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
295 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0003);
296 }
297 else if (strcmp (prop2, "cgtwelve") == 0)
298 {
299 ADD2LOG ("DISPLAY: Sun|GS (cgtwelve), depth=24\n");
300 hd = add_hd_entry (hd_data, __LINE__, 0);
301 hd->base_class.id = bc_display;
302 hd->sub_class.id = sc_dis_vga;
303 hd->bus.id = bus_sbus;
304
305 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
306 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0004);
307 }
308 else if (strcmp (prop2, "gt") == 0)
309 {
310 ADD2LOG ("DISPLAY: Sun|Graphics Tower (gt), depth=24\n");
311 hd = add_hd_entry (hd_data, __LINE__, 0);
312 hd->base_class.id = bc_display;
313 hd->sub_class.id = sc_dis_vga;
314 hd->bus.id = bus_sbus;
315
316 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
317 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0005);
318 }
319 else if (strcmp (prop2, "mgx") == 0)
320 {
321 hd = add_hd_entry (hd_data, __LINE__, 0);
322 hd->base_class.id = bc_display;
323 hd->sub_class.id = sc_dis_vga;
324 hd->bus.id = bus_sbus;
325 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
326 prop2 = prom_getproperty ("fb_size", &len, buf2);
327 if (prop2 && len == 4 && *(int *)prop2 == 0x400000)
328 {
329 ADD2LOG ("DISPLAY: Quantum 3D MGXplus with 4M VRAM (mgx), depth=24\n");
330 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0006);
331 }
332 else
333 {
334 ADD2LOG ("DISPLAY: Quantum 3D MGXplus (mgx), depth=24\n");
335 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0007);
336 }
337 }
338 else if (strcmp (prop2, "cgsix") == 0)
339 {
340 int chiprev = 0;
341 int vmsize = 0;
342
343 hd = add_hd_entry (hd_data, __LINE__, 0);
344 hd->base_class.id = bc_display;
345 hd->sub_class.id = sc_dis_vga;
346 hd->bus.id = bus_sbus;
347 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
348
349 prop2 = prom_getproperty("chiprev", &len, buf2);
350 if (prop2 && len == 4)
351 chiprev = *(int *)prop2;
352 prop2 = prom_getproperty("vmsize", &len, buf2);
353 if (prop2 && len == 4)
354 vmsize = *(int *)prop2;
355 switch (chiprev)
356 {
357 case 1 ... 4:
358 ADD2LOG ("DISPLAY: Sun|Double width GX (cgsix), depth=8\n");
359 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0008);
360 break;
361 case 5 ... 9:
362 ADD2LOG ("DISPLAY: Sun|Single width GX (cgsix), depth=8\n");
363 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0009);
364 break;
365 case 11:
366 switch (vmsize)
367 {
368 case 2:
369 ADD2LOG ("DISPLAY: Sun|Turbo GX with 1M VSIMM (cgsix), depth=8\n");
370 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x000a);
371 break;
372 case 4:
373 ADD2LOG ("DISPLAY: Sun|Turbo GX Plus (cgsix), depth=8\n");
374 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x000b);
375 break;
376 default:
377 ADD2LOG ("DISPLAY: Sun|Turbo GX (cgsix), depth=8\n");
378 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x000c);
379 break;
380 }
381 break;
382 default:
383 ADD2LOG ("DISPLAY: Sun|Unknown GX (cgsix), depth=8\n");
384 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x000d);
385 break;
386 }
387 }
388 else if (strcmp (prop2, "cgfourteen") == 0)
389 {
390 int size = 0;
391
392 hd = add_hd_entry (hd_data, __LINE__, 0);
393 hd->base_class.id = bc_display;
394 hd->sub_class.id = sc_dis_vga;
395 hd->bus.id = bus_sbus;
396 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
397
398 prop2 = prom_getproperty ("reg", &len, buf2);
399 if (prop2 && !(len % 12) && len > 0)
400 size = *(int *)(prop2 + len - 4);
401 switch (size)
402 {
403 case 0x400000:
404 ADD2LOG ("DISPLAY: Sun|SX with 4M VSIMM (cgfourteen), depth=24\n");
405 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x000e);
406 break;
407 case 0x800000:
408 ADD2LOG ("DISPLAY: Sun|SX with 8M VSIMM (cgfourteen), depth=24\n");
409 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x000f);
410 break;
411 default:
412 ADD2LOG ("DISPLAY: Sun|SX (cgfourteen), depth=24\n");
413 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0010);
414 break;
415 }
416 }
417 else if (strcmp (prop2, "leo") == 0)
418 {
419 hd = add_hd_entry (hd_data, __LINE__, 0);
420 hd->base_class.id = bc_display;
421 hd->sub_class.id = sc_dis_vga;
422 hd->bus.id = bus_sbus;
423 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
424
425 prop2 = prom_getproperty("model", &len, buf2);
426 if (prop2 && len > 0 && !strstr(prop2, "501-2503"))
427 {
428 ADD2LOG ("DISPLAY: Sun|Turbo ZX (leo), depth=24\n");
429 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0012);
430 }
431 else
432 {
433 ADD2LOG ("DISPLAY: Sun|ZX or Turbo ZX (leo), depth=24\n");
434 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0011);
435 }
436 }
437 else if (strcmp (prop2, "tcx") == 0)
438 {
439 hd = add_hd_entry (hd_data, __LINE__, 0);
440 hd->base_class.id = bc_display;
441 hd->sub_class.id = sc_dis_vga;
442 hd->bus.id = bus_sbus;
443 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
444
445 if (prom_getbool ("tcx-8-bit"))
446 {
447 ADD2LOG ("DISPLAY: Sun|TCX (8bit), depth=8\n");
448 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0013);
449 }
450 else
451 {
452 ADD2LOG ("DISPLAY: Sun|TCX (S24), depth=24\n");
453 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0014);
454 }
455 }
456 else if (strcmp (prop2, "afb") == 0)
457 {
458 int btype = 0;
459
460 prop2 = prom_getproperty("board_type", &len, buf2);
461 if (prop2 && len == 4)
462 btype = *(int *)prop2;
463
464 hd = add_hd_entry (hd_data, __LINE__, 0);
465 hd->base_class.id = bc_display;
466 hd->sub_class.id = sc_dis_vga;
467 hd->bus.id = bus_sbus;
468 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
469
470 if (btype == 3)
471 {
472 ADD2LOG ("DISPLAY: Sun|Elite3D-M6 Horizontal (afb), depth=24\n");
473 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0015);
474 }
475 else
476 {
477 ADD2LOG ("DISPLAY: Sun|Elite3D (afb), depth=24\n");
478 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0016);
479 }
480 }
481 else if (strcmp (prop2, "ffb") == 0)
482 {
483 int btype = 0;
484
485 prop2 = prom_getproperty("board_type", &len, buf2);
486 if (prop2 && len == 4)
487 btype = *(int *)prop2;
488
489 hd = add_hd_entry (hd_data, __LINE__, 0);
490 hd->base_class.id = bc_display;
491 hd->sub_class.id = sc_dis_vga;
492 hd->bus.id = bus_sbus;
493 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
494
495 switch (btype)
496 {
497 case 0x08:
498 ADD2LOG ("DISPLAY: Sun|FFB 67MHz Creator (ffb), depth=24\n");
499 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0017);
500 break;
501 case 0x0b:
502 ADD2LOG ("DISPLAY: Sun|FFB 67MHz Creator 3D (ffb), depth=24\n");
503 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0018);
504 break;
505 case 0x1b:
506 ADD2LOG ("DISPLAY: Sun|FFB 75MHz Creator 3D (ffb), depth=24\n");
507 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0019);
508 break;
509 case 0x20:
510 case 0x28:
511 ADD2LOG ("DISPLAY: Sun|FFB2 Vertical Creator (ffb), depth=24\n");
512 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x001a);
513 break;
514 case 0x23:
515 case 0x2b:
516 ADD2LOG ("DISPLAY: Sun|FFB2 Vertical Creator 3D (ffb), depth=24\n");
517 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x001b);
518 break;
519 case 0x30:
520 ADD2LOG ("DISPLAY: Sun|FFB2+ Vertical Creator (ffb), depth=24\n");
521 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x001c);
522 break;
523 case 0x33:
524 ADD2LOG ("DISPLAY: Sun|FFB2+ Vertical Creator 3D (ffb), depth=24\n");
525 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x001d);
526 break;
527 case 0x40:
528 case 0x48:
529 ADD2LOG ("DISPLAY: Sun|FFB2 Horizontal Creator (ffb), depth=24\n");
530 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x001e);
531 break;
532 case 0x43:
533 case 0x4b:
534 ADD2LOG ("DISPLAY: Sun|FFB2 Horizontal Creator 3D (ffb), depth=24\n");
535 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x001f);
536 break;
537 default:
538 ADD2LOG ("DISPLAY: Sun|FFB (ffb), type=%xi, depth=24\n",
539 btype);
540 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0020);
541 break;
542 }
543 }
544 else
545 ADD2LOG ("DISPLAY: Unknown SBUS device \"%s\"\n", prop2);
546 }
547 else
548 ADD2LOG ("DISPLAY: Unknown device \"%s\"\n", prop2);
549 }
550 else if (strcmp (prop1, "cpu") == 0)
551 {
552 char *prop2 = prom_getproperty ("name", &len, buf2);
553
554 if (prop2 && len >= 0)
555 ADD2LOG ("CPU: %s\n", prop2);
556 }
557 else
558 {
559 char *prop2 = prom_getproperty ("name", &len, buf2);
560
561 if (prop2 && len >= 0)
562 {
563 if (strcmp (prop2, "audio") == 0)
564 {
565 ADD2LOG ("AUDIO: type=AMD7930, module=amd7930\n");
566 hd = add_hd_entry (hd_data, __LINE__, 0);
567 hd->base_class.id = bc_multimedia;
568 hd->sub_class.id = sc_multi_audio;
569 hd->bus.id = bus_sbus;
570 hd->unix_dev_name = new_str ("/dev/audio");
571
572 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
573 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x2001);
574 }
575 else if (strcmp (prop2, "CS4231") == 0)
576 {
577 hd = add_hd_entry (hd_data, __LINE__, 0);
578 hd->base_class.id = bc_multimedia;
579 hd->sub_class.id = sc_multi_audio;
580 hd->bus.id = bus_sbus;
581 hd->unix_dev_name = new_str ("/dev/audio");
582
583 if (ebus)
584 {
585 ADD2LOG ("AUDIO: type=CS4231 EB2 DMA (PCI), module=cs4231\n");
586 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x2002);
587 }
588 else
589 {
590 ADD2LOG ("AUDIO: type=CS4231 APC DMA (SBUS), module=cs4231\n");
591 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x2003);
592 }
593 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
594 }
595 else if (strcmp (prop2, "DBRIe") == 0)
596 {
597 ADD2LOG ("AUDIO: type=SS10/SS20 DBRI, module=dbri\n");
598 hd = add_hd_entry (hd_data, __LINE__, 0);
599 hd->base_class.id = bc_multimedia;
600 hd->sub_class.id = sc_multi_audio;
601 hd->bus.id = bus_sbus;
602 hd->unix_dev_name = new_str ("/dev/audio");
603
604 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
605 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x2004);
606 }
607 else if (strcmp (prop2, "bpp") == 0)
608 {
609 ADD2LOG ("PARPORT: type=bpp, module=unknown\n");
610 }
611 else if (strcmp (prop2, "soc") == 0)
612 {
613 ADD2LOG ("SCSI: type=Sun SPARCStorage Array, module=fc4:soc:pluto\n");
614 hd = add_hd_entry (hd_data, __LINE__, 0);
615 hd->base_class.id = bc_storage;
616 hd->sub_class.id = sc_sto_scsi;
617 hd->bus.id = bus_sbus;
618
619 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
620 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x1101);
621 }
622 else if (strcmp (prop2, "socal") == 0)
623 {
624 ADD2LOG ("SCSI: type=Sun Enterprise Network Array, module=fc4:socal:fcal\n");
625 hd = add_hd_entry (hd_data, __LINE__, 0);
626 hd->base_class.id = bc_storage;
627 hd->sub_class.id = sc_sto_scsi;
628 hd->bus.id = bus_sbus;
629
630 hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
631 hd->device.id = MAKE_ID(TAG_SPECIAL, 0x1102);
632 }
633 else if (strcmp(prop2, "sbus") == 0 || strcmp(prop2, "sbi") == 0)
634 nsbus = 1;
635 else if (!strcmp(prop2, "ebus"))
636 nebus = 1;
637 else
638 ADD2LOG ("%s: unknown device \"%s\"\n", prop1, prop2);
639 }
640 }
641
642
643 nextnode = prom_getchild (node);
644 if (nextnode)
645 prom_parse (nextnode, nsbus, nebus, hd_data);
646 nextnode = prom_nextnode (node);
647 if (nextnode)
648 prom_parse (nextnode, sbus, ebus, hd_data);
649
650 return;
651 }
652
653 void
654 hd_scan_sbus (hd_data_t *hd_data)
655 {
656 int prom_root_node;
657
658 if(!hd_probe_feature(hd_data, pr_sbus))
659 return;
660
661 hd_data->module = mod_sbus;
662
663 /* some clean-up */
664 remove_hd_entries(hd_data);
665
666 PROGRESS(1, 0, "sun sbus");
667
668 if((prom_fd = open(DEV_OPENPROM, O_RDWR | O_NONBLOCK | O_NOCTTY)) < 0)
669 return;
670
671 prom_root_node = prom_nextnode(0);
672 if (!prom_root_node)
673 goto failed;
674
675 prom_parse (prom_root_node, 0, 0, hd_data);
676
677 failed:
678 close (prom_fd);
679
680 return;
681 }
682
683 #else
684
685 void
686 hd_scan_sbus (hd_data_t *hd_data)
687 {
688 return;
689 }
690
691 #endif