1 /*-
2 * All Rights Reserved, Copyright (C) Fujitsu Limited 1995
3 *
4 * This software may be used, modified, copied, distributed, and sold, in
5 * both source and binary form provided that the above copyright, these
6 * terms and the following disclaimer are retained. The name of the author
7 * and/or the contributor may not be used to endorse or promote products
8 * derived from this software without specific prior written permission.
9 *
10 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND THE CONTRIBUTOR ``AS IS'' AND
11 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
12 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
13 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR THE CONTRIBUTOR BE LIABLE
14 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
15 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
16 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION.
17 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
19 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
20 * SUCH DAMAGE.
21 *
22 */
23
24 #include <sys/cdefs.h>
25 __FBSDID("$FreeBSD: releng/9.0/sys/dev/fe/if_fe_cbus.c 179959 2008-06-23 18:16:25Z jhb $");
26
27 #include <sys/param.h>
28 #include <sys/systm.h>
29 #include <sys/kernel.h>
30 #include <sys/socket.h>
31 #include <sys/module.h>
32
33 #include <sys/bus.h>
34 #include <machine/bus.h>
35 #include <sys/rman.h>
36
37 #include <net/ethernet.h>
38 #include <net/if.h>
39 #include <net/if_mib.h>
40 #include <net/if_media.h>
41
42 #include <netinet/in.h>
43 #include <netinet/if_ether.h>
44
45 #include <dev/fe/mb86960.h>
46 #include <dev/fe/if_fereg.h>
47 #include <dev/fe/if_fevar.h>
48
49 #include <isa/isavar.h>
50
51 /*
52 * Cbus specific code.
53 */
54 static int fe_isa_probe(device_t);
55 static int fe_isa_attach(device_t);
56
57 static struct isa_pnp_id fe_ids[] = {
58 { 0x101ee0d, NULL }, /* CON0101 - Contec C-NET(98)P2-T */
59 { 0, NULL }
60 };
61
62 static device_method_t fe_isa_methods[] = {
63 /* Device interface */
64 DEVMETHOD(device_probe, fe_isa_probe),
65 DEVMETHOD(device_attach, fe_isa_attach),
66
67 { 0, 0 }
68 };
69
70 static driver_t fe_isa_driver = {
71 "fe",
72 fe_isa_methods,
73 sizeof (struct fe_softc)
74 };
75
76 DRIVER_MODULE(fe, isa, fe_isa_driver, fe_devclass, 0, 0);
77
78
79 static int fe98_alloc_port(device_t, int);
80
81 static int fe_probe_re1000(device_t);
82 static int fe_probe_cnet9ne(device_t);
83 static int fe_probe_rex(device_t);
84 static int fe_probe_ssi(device_t);
85 static int fe_probe_jli(device_t);
86 static int fe_probe_lnx(device_t);
87 static int fe_probe_gwy(device_t);
88 static int fe_probe_ubn(device_t);
89
90 /*
91 * Determine if the device is present at a specified I/O address. The
92 * main entry to the driver.
93 */
94 static int
95 fe_isa_probe(device_t dev)
96 {
97 struct fe_softc *sc;
98 int error;
99
100 /* Prepare for the softc struct. */
101 sc = device_get_softc(dev);
102 sc->sc_unit = device_get_unit(dev);
103
104 /* Check isapnp ids */
105 error = ISA_PNP_PROBE(device_get_parent(dev), dev, fe_ids);
106
107 /* If the card had a PnP ID that didn't match any we know about */
108 if (error == ENXIO)
109 goto end;
110
111 /* If we had some other problem. */
112 if (!(error == 0 || error == ENOENT))
113 goto end;
114
115 /* Probe for supported boards. */
116 if ((error = fe_probe_re1000(dev)) == 0)
117 goto end;
118 fe_release_resource(dev);
119
120 if ((error = fe_probe_cnet9ne(dev)) == 0)
121 goto end;
122 fe_release_resource(dev);
123
124 if ((error = fe_probe_rex(dev)) == 0)
125 goto end;
126 fe_release_resource(dev);
127
128 if ((error = fe_probe_ssi(dev)) == 0)
129 goto end;
130 fe_release_resource(dev);
131
132 if ((error = fe_probe_jli(dev)) == 0)
133 goto end;
134 fe_release_resource(dev);
135
136 if ((error = fe_probe_lnx(dev)) == 0)
137 goto end;
138 fe_release_resource(dev);
139
140 if ((error = fe_probe_ubn(dev)) == 0)
141 goto end;
142 fe_release_resource(dev);
143
144 if ((error = fe_probe_gwy(dev)) == 0)
145 goto end;
146 fe_release_resource(dev);
147
148 end:
149 if (error == 0)
150 error = fe_alloc_irq(dev, 0);
151
152 fe_release_resource(dev);
153 return (error);
154 }
155
156 static int
157 fe_isa_attach(device_t dev)
158 {
159 struct fe_softc *sc = device_get_softc(dev);
160
161 if (sc->port_used)
162 fe98_alloc_port(dev, sc->type);
163 fe_alloc_irq(dev, 0);
164
165 return fe_attach(dev);
166 }
167
168
169 /* Generic I/O address table */
170 static bus_addr_t ioaddr_generic[MAXREGISTERS] = {
171 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007,
172 0x008, 0x009, 0x00a, 0x00b, 0x00c, 0x00d, 0x00e, 0x00f,
173 0x010, 0x011, 0x012, 0x013, 0x014, 0x015, 0x016, 0x017,
174 0x018, 0x019, 0x01a, 0x01b, 0x01c, 0x01d, 0x01e, 0x01f,
175 };
176
177 /* I/O address table for RE1000/1000Plus */
178 static bus_addr_t ioaddr_re1000[MAXREGISTERS] = {
179 0x0000, 0x0001, 0x0200, 0x0201, 0x0400, 0x0401, 0x0600, 0x0601,
180 0x0800, 0x0801, 0x0a00, 0x0a01, 0x0c00, 0x0c01, 0x0e00, 0x0e01,
181 0x1000, 0x1200, 0x1400, 0x1600, 0x1800, 0x1a00, 0x1c00, 0x1e00,
182 0x1001, 0x1201, 0x1401, 0x1601, 0x1801, 0x1a01, 0x1c01, 0x1e01,
183 };
184
185 /* I/O address table for CNET9NE */
186 static bus_addr_t ioaddr_cnet9ne[MAXREGISTERS] = {
187 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007,
188 0x008, 0x009, 0x00a, 0x00b, 0x00c, 0x00d, 0x00e, 0x00f,
189 0x400, 0x402, 0x404, 0x406, 0x408, 0x40a, 0x40c, 0x40e,
190 0x401, 0x403, 0x405, 0x407, 0x409, 0x40b, 0x40d, 0x40f,
191 };
192
193 /* I/O address table for LAC-98 */
194 static bus_addr_t ioaddr_lnx[MAXREGISTERS] = {
195 0x000, 0x002, 0x004, 0x006, 0x008, 0x00a, 0x00c, 0x00e,
196 0x100, 0x102, 0x104, 0x106, 0x108, 0x10a, 0x10c, 0x10e,
197 0x200, 0x202, 0x204, 0x206, 0x208, 0x20a, 0x20c, 0x20e,
198 0x300, 0x302, 0x304, 0x306, 0x308, 0x30a, 0x30c, 0x30e,
199 };
200
201 /* I/O address table for Access/PC N98C+ */
202 static bus_addr_t ioaddr_ubn[MAXREGISTERS] = {
203 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007,
204 0x008, 0x009, 0x00a, 0x00b, 0x00c, 0x00d, 0x00e, 0x00f,
205 0x200, 0x201, 0x202, 0x203, 0x204, 0x205, 0x206, 0x207,
206 0x208, 0x209, 0x20a, 0x20b, 0x20c, 0x20d, 0x20e, 0x20f,
207 };
208
209 /* I/O address table for REX-9880 */
210 static bus_addr_t ioaddr_rex[MAXREGISTERS] = {
211 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007,
212 0x008, 0x009, 0x00a, 0x00b, 0x00c, 0x00d, 0x00e, 0x00f,
213 0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107,
214 0x108, 0x109, 0x10a, 0x10b, 0x10c, 0x10d, 0x10e, 0x10f,
215 };
216
217 static int
218 fe98_alloc_port(device_t dev, int type)
219 {
220 struct fe_softc *sc = device_get_softc(dev);
221 struct resource *res;
222 bus_addr_t *iat;
223 int size, rid;
224
225 switch (type) {
226 case FE_TYPE_RE1000:
227 iat = ioaddr_re1000;
228 size = MAXREGISTERS;
229 break;
230 case FE_TYPE_CNET9NE:
231 iat = ioaddr_cnet9ne;
232 size = MAXREGISTERS;
233 break;
234 case FE_TYPE_SSI:
235 iat = ioaddr_generic;
236 size = MAXREGISTERS;
237 break;
238 case FE_TYPE_LNX:
239 iat = ioaddr_lnx;
240 size = MAXREGISTERS;
241 break;
242 case FE_TYPE_GWY:
243 iat = ioaddr_generic;
244 size = MAXREGISTERS;
245 break;
246 case FE_TYPE_UBN:
247 iat = ioaddr_ubn;
248 size = MAXREGISTERS;
249 break;
250 case FE_TYPE_REX:
251 iat = ioaddr_rex;
252 size = MAXREGISTERS;
253 break;
254 default:
255 iat = ioaddr_generic;
256 size = MAXREGISTERS;
257 break;
258 }
259
260 rid = 0;
261 res = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid,
262 iat, size, RF_ACTIVE);
263 if (res == NULL)
264 return ENOENT;
265
266 isa_load_resourcev(res, iat, size);
267
268 sc->type = type;
269 sc->port_used = size;
270 sc->port_res = res;
271 return (0);
272 }
273
274
275 /*
276 * Probe and initialization for Allied-Telesis RE1000 series.
277 */
278 static void
279 fe_init_re1000(struct fe_softc *sc)
280 {
281 /* Setup IRQ control register on the ASIC. */
282 fe_outb(sc, FE_RE1000_IRQCONF, sc->priv_info);
283 }
284
285 static int
286 fe_probe_re1000(device_t dev)
287 {
288 struct fe_softc *sc = device_get_softc(dev);
289 int i, n;
290 u_long iobase, irq;
291 u_char sum;
292
293 static struct fe_simple_probe_struct probe_table [] = {
294 { FE_DLCR2, 0x58, 0x00 },
295 { FE_DLCR4, 0x08, 0x00 },
296 { 0 }
297 };
298
299 /* See if the specified I/O address is possible for RE1000. */
300 /* [01]D[02468ACE] are allowed. */
301 if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0)
302 return ENXIO;
303 if ((iobase & ~0x10E) != 0xD0)
304 return ENXIO;
305
306 if (fe98_alloc_port(dev, FE_TYPE_RE1000))
307 return ENXIO;
308
309 /* Fill the softc struct with default values. */
310 fe_softc_defaults(sc);
311
312 /* See if the card is on its address. */
313 if (!fe_simple_probe(sc, probe_table))
314 return ENXIO;
315
316 /* Get our station address from EEPROM. */
317 fe_inblk(sc, 0x18, sc->enaddr, ETHER_ADDR_LEN);
318
319 /* Make sure it is Allied-Telesis's. */
320 if (!fe_valid_Ether_p(sc->enaddr, 0x0000F4))
321 return ENXIO;
322 #if 1
323 /* Calculate checksum. */
324 sum = fe_inb(sc, 0x1e);
325 for (i = 0; i < ETHER_ADDR_LEN; i++)
326 sum ^= sc->enaddr[i];
327 if (sum != 0)
328 return ENXIO;
329 #endif
330 /* Setup the board type. */
331 sc->typestr = "RE1000";
332
333 /* This looks like an RE1000 board. It requires an
334 explicit IRQ setting in config. Make sure we have one,
335 determining an appropriate value for the IRQ control
336 register. */
337 irq = 0;
338 bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL);
339 switch (irq) {
340 case 3: n = 0x10; break;
341 case 5: n = 0x20; break;
342 case 6: n = 0x40; break;
343 case 12: n = 0x80; break;
344 default:
345 fe_irq_failure(sc->typestr, sc->sc_unit, irq, "3/5/6/12");
346 return ENXIO;
347 }
348 sc->priv_info = (fe_inb(sc, FE_RE1000_IRQCONF) & 0x0f) | n;
349
350 /* Setup hooks. We need a special initialization procedure. */
351 sc->init = fe_init_re1000;
352
353 return 0;
354 }
355
356 /* JLI sub-probe for Allied-Telesis RE1000Plus/ME1500 series. */
357 static u_short const *
358 fe_probe_jli_re1000p(struct fe_softc * sc, u_char const * eeprom)
359 {
360 int i;
361 static u_short const irqmaps_re1000p [4] = { 3, 5, 6, 12 };
362
363 /* Make sure the EEPROM contains Allied-Telesis bit pattern. */
364 if (eeprom[1] != 0xFF) return NULL;
365 for (i = 2; i < 8; i++) if (eeprom[i] != 0xFF) return NULL;
366 for (i = 14; i < 24; i++) if (eeprom[i] != 0xFF) return NULL;
367
368 /* Get our station address from EEPROM, and make sure the
369 EEPROM contains Allied-Telesis's address. */
370 bcopy(eeprom + 8, sc->enaddr, ETHER_ADDR_LEN);
371 if (!fe_valid_Ether_p(sc->enaddr, 0x0000F4))
372 return NULL;
373
374 /* I don't know any sub-model identification. */
375 sc->typestr = "RE1000Plus/ME1500";
376
377 /* Returns the IRQ table for the RE1000Plus. */
378 return irqmaps_re1000p;
379 }
380
381
382 /*
383 * Probe for Allied-Telesis RE1000Plus/ME1500 series.
384 */
385 static int
386 fe_probe_jli(device_t dev)
387 {
388 struct fe_softc *sc = device_get_softc(dev);
389 int i, n, xirq, error;
390 u_long iobase, irq;
391 u_char eeprom [JLI_EEPROM_SIZE];
392 u_short const * irqmap;
393
394 static u_short const baseaddr [8] =
395 { 0x1D6, 0x1D8, 0x1DA, 0x1D4, 0x0D4, 0x0D2, 0x0D8, 0x0D0 };
396 static struct fe_simple_probe_struct const probe_table [] = {
397 /* { FE_DLCR1, 0x20, 0x00 }, Doesn't work. */
398 { FE_DLCR2, 0x50, 0x00 },
399 { FE_DLCR4, 0x08, 0x00 },
400 /* { FE_DLCR5, 0x80, 0x00 }, Doesn't work. */
401 #if 0
402 { FE_BMPR16, 0x1B, 0x00 },
403 { FE_BMPR17, 0x7F, 0x00 },
404 #endif
405 { 0 }
406 };
407
408 /*
409 * See if the specified address is possible for MB86965A JLI mode.
410 */
411 if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0)
412 return ENXIO;
413 for (i = 0; i < 8; i++) {
414 if (baseaddr[i] == iobase)
415 break;
416 }
417 if (i == 8)
418 return ENXIO;
419
420 if (fe98_alloc_port(dev, FE_TYPE_RE1000))
421 return ENXIO;
422
423 /* Fill the softc struct with default values. */
424 fe_softc_defaults(sc);
425
426 /*
427 * We should test if MB86965A is on the base address now.
428 * Unfortunately, it is very hard to probe it reliably, since
429 * we have no way to reset the chip under software control.
430 * On cold boot, we could check the "signature" bit patterns
431 * described in the Fujitsu document. On warm boot, however,
432 * we can predict almost nothing about register values.
433 */
434 if (!fe_simple_probe(sc, probe_table))
435 return ENXIO;
436
437 /* Check if our I/O address matches config info on 86965. */
438 n = (fe_inb(sc, FE_BMPR19) & FE_B19_ADDR) >> FE_B19_ADDR_SHIFT;
439 if (baseaddr[n] != iobase)
440 return ENXIO;
441
442 /*
443 * We are now almost sure we have an MB86965 at the given
444 * address. So, read EEPROM through it. We have to write
445 * into LSI registers to read from EEPROM. I want to avoid it
446 * at this stage, but I cannot test the presence of the chip
447 * any further without reading EEPROM. FIXME.
448 */
449 fe_read_eeprom_jli(sc, eeprom);
450
451 /* Make sure that config info in EEPROM and 86965 agree. */
452 if (eeprom[FE_EEPROM_CONF] != fe_inb(sc, FE_BMPR19))
453 return ENXIO;
454
455 /* Use 86965 media selection scheme, unless othewise
456 specified. It is "AUTO always" and "select with BMPR13".
457 This behaviour covers most of the 86965 based board (as
458 minimum requirements.) It is backward compatible with
459 previous versions, also. */
460 sc->mbitmap = MB_HA;
461 sc->defmedia = MB_HA;
462 sc->msel = fe_msel_965;
463
464 /* Perform board-specific probe. */
465 if ((irqmap = fe_probe_jli_re1000p(sc, eeprom)) == NULL)
466 return ENXIO;
467
468 /* Find the IRQ read from EEPROM. */
469 n = (fe_inb(sc, FE_BMPR19) & FE_B19_IRQ) >> FE_B19_IRQ_SHIFT;
470 xirq = irqmap[n];
471
472 /* Try to determine IRQ setting. */
473 error = bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL);
474 if (error && xirq == NO_IRQ) {
475 /* The device must be configured with an explicit IRQ. */
476 device_printf(dev, "IRQ auto-detection does not work\n");
477 return ENXIO;
478 } else if (error && xirq != NO_IRQ) {
479 /* Just use the probed IRQ value. */
480 bus_set_resource(dev, SYS_RES_IRQ, 0, xirq, 1);
481 } else if (!error && xirq == NO_IRQ) {
482 /* No problem. Go ahead. */
483 } else if (irq == xirq) {
484 /* Good. Go ahead. */
485 } else {
486 /* User must be warned in this case. */
487 sc->stability |= UNSTABLE_IRQ;
488 }
489
490 /* Setup a hook, which resets te 86965 when the driver is being
491 initialized. This may solve a nasty bug. FIXME. */
492 sc->init = fe_init_jli;
493
494 return 0;
495 }
496
497
498 /*
499 * Probe and initialization for Contec C-NET(9N)E series.
500 */
501
502 /* TODO: Should be in "if_fereg.h" */
503 #define FE_CNET9NE_INTR 0x10 /* Interrupt Mask? */
504
505 static void
506 fe_init_cnet9ne(struct fe_softc *sc)
507 {
508 /* Enable interrupt? FIXME. */
509 fe_outb(sc, FE_CNET9NE_INTR, 0x10);
510 }
511
512 static int
513 fe_probe_cnet9ne (device_t dev)
514 {
515 struct fe_softc *sc = device_get_softc(dev);
516 u_long iobase, irq;
517
518 static struct fe_simple_probe_struct probe_table [] = {
519 { FE_DLCR2, 0x58, 0x00 },
520 { FE_DLCR4, 0x08, 0x00 },
521 { 0 }
522 };
523
524 /* See if the specified I/O address is possible for C-NET(9N)E. */
525 if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0)
526 return ENXIO;
527 if (iobase != 0x73D0)
528 return ENXIO;
529
530 if (fe98_alloc_port(dev, FE_TYPE_CNET9NE))
531 return ENXIO;
532
533 /* Fill the softc struct with default values. */
534 fe_softc_defaults(sc);
535
536 /* See if the card is on its address. */
537 if (!fe_simple_probe(sc, probe_table))
538 return ENXIO;
539
540 /* Get our station address from EEPROM. */
541 fe_inblk(sc, 0x18, sc->enaddr, ETHER_ADDR_LEN);
542
543 /* Make sure it is Contec's. */
544 if (!fe_valid_Ether_p(sc->enaddr, 0x00804C))
545 return ENXIO;
546
547 /* Determine the card type. */
548 if (sc->enaddr[3] == 0x06) {
549 sc->typestr = "C-NET(9N)C";
550
551 /* We seems to need our own IDENT bits... FIXME. */
552 sc->proto_dlcr7 = FE_D7_BYTSWP_LH | FE_D7_IDENT_NICE;
553
554 /* C-NET(9N)C requires an explicit IRQ to work. */
555 if (bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL) != 0) {
556 fe_irq_failure(sc->typestr, sc->sc_unit, NO_IRQ, NULL);
557 return ENXIO;
558 }
559 } else {
560 sc->typestr = "C-NET(9N)E";
561
562 /* C-NET(9N)E works only IRQ5. */
563 if (bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL) != 0)
564 return ENXIO;
565 if (irq != 5) {
566 fe_irq_failure(sc->typestr, sc->sc_unit, irq, "5");
567 return ENXIO;
568 }
569
570 /* We need an init hook to initialize ASIC before we start. */
571 sc->init = fe_init_cnet9ne;
572 }
573
574 /* C-NET(9N)E has 64KB SRAM. */
575 sc->proto_dlcr6 = FE_D6_BUFSIZ_64KB | FE_D6_TXBSIZ_2x4KB
576 | FE_D6_BBW_WORD | FE_D6_SBW_WORD | FE_D6_SRAM;
577
578 return 0;
579 }
580
581
582 /*
583 * Probe for Contec C-NET(98)P2 series.
584 * (Logitec LAN-98TP/LAN-98T25P - parhaps)
585 */
586 static int
587 fe_probe_ssi(device_t dev)
588 {
589 struct fe_softc *sc = device_get_softc(dev);
590 u_long iobase, irq;
591
592 u_char eeprom [SSI_EEPROM_SIZE];
593 static struct fe_simple_probe_struct probe_table [] = {
594 { FE_DLCR2, 0x08, 0x00 },
595 { FE_DLCR4, 0x08, 0x00 },
596 { 0 }
597 };
598 static u_short const irqmap[] = {
599 /* INT0 INT1 INT2 */
600 NO_IRQ, NO_IRQ, NO_IRQ, 3, NO_IRQ, 5, 6, NO_IRQ,
601 NO_IRQ, 9, 10, NO_IRQ, 12, 13, NO_IRQ, NO_IRQ,
602 /* INT3 INT41 INT5 INT6 */
603 };
604
605 /* See if the specified I/O address is possible for 78Q8377A. */
606 /* [0-D]3D0 are allowed. */
607 if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0)
608 return ENXIO;
609 if ((iobase & 0xFFF) != 0x3D0)
610 return ENXIO;
611
612 if (fe98_alloc_port(dev, FE_TYPE_SSI))
613 return ENXIO;
614
615 /* Fill the softc struct with default values. */
616 fe_softc_defaults(sc);
617
618 /* See if the card is on its address. */
619 if (!fe_simple_probe(sc, probe_table))
620 return ENXIO;
621
622 /* We now have to read the config EEPROM. We should be very
623 careful, since doing so destroys a register. (Remember, we
624 are not yet sure we have a C-NET(98)P2 board here.) Don't
625 remember to select BMPRs bofore reading EEPROM, since other
626 register bank may be selected before the probe() is called. */
627 fe_read_eeprom_ssi(sc, eeprom);
628
629 /* Make sure the Ethernet (MAC) station address is of Contec's. */
630 if (!fe_valid_Ether_p(eeprom + FE_SSI_EEP_ADDR, 0x00804C))
631 return ENXIO;
632 bcopy(eeprom + FE_SSI_EEP_ADDR, sc->enaddr, ETHER_ADDR_LEN);
633
634 /* Setup the board type. */
635 sc->typestr = "C-NET(98)P2";
636
637 /* Non-PnP mode, set static resource from eeprom. */
638 if (!isa_get_vendorid(dev)) {
639 /* Get IRQ configuration from EEPROM. */
640 irq = irqmap[eeprom[FE_SSI_EEP_IRQ]];
641 if (irq == NO_IRQ) {
642 fe_irq_failure(sc->typestr, sc->sc_unit, irq,
643 "3/5/6/9/10/12/13");
644 return ENXIO;
645 }
646 bus_set_resource(dev, SYS_RES_IRQ, 0, irq, 1);
647 }
648
649 /* Get Duplex-mode configuration from EEPROM. */
650 sc->proto_dlcr4 |= (eeprom[FE_SSI_EEP_DUPLEX] & FE_D4_DSC);
651
652 /* Fill softc struct accordingly. */
653 sc->mbitmap = MB_HT;
654 sc->defmedia = MB_HT;
655
656 return 0;
657 }
658
659
660 /*
661 * Probe for TDK LAC-98012/013/025/9N011 - parhaps.
662 */
663 static int
664 fe_probe_lnx(device_t dev)
665 {
666 struct fe_softc *sc = device_get_softc(dev);
667
668 u_long iobase, irq;
669 u_char eeprom [LNX_EEPROM_SIZE];
670
671 static struct fe_simple_probe_struct probe_table [] = {
672 { FE_DLCR2, 0x58, 0x00 },
673 { FE_DLCR4, 0x08, 0x00 },
674 { 0 }
675 };
676
677 /* See if the specified I/O address is possible for TDK/LANX boards. */
678 /* 0D0, 4D0, 8D0, and CD0 are allowed. */
679 if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0)
680 return ENXIO;
681 if ((iobase & ~0xC00) != 0xD0)
682 return ENXIO;
683
684 if (fe98_alloc_port(dev, FE_TYPE_LNX))
685 return ENXIO;
686
687 /* Fill the softc struct with default values. */
688 fe_softc_defaults(sc);
689
690 /* See if the card is on its address. */
691 if (!fe_simple_probe(sc, probe_table))
692 return ENXIO;
693
694 /* We now have to read the config EEPROM. We should be very
695 careful, since doing so destroys a register. (Remember, we
696 are not yet sure we have a LAC-98012/98013 board here.) */
697 fe_read_eeprom_lnx(sc, eeprom);
698
699 /* Make sure the Ethernet (MAC) station address is of TDK/LANX's. */
700 if (!fe_valid_Ether_p(eeprom, 0x008098))
701 return ENXIO;
702 bcopy(eeprom, sc->enaddr, ETHER_ADDR_LEN);
703
704 /* Setup the board type. */
705 sc->typestr = "LAC-98012/98013";
706
707 /* This looks like a TDK/LANX board. It requires an
708 explicit IRQ setting in config. Make sure we have one,
709 determining an appropriate value for the IRQ control
710 register. */
711 irq = 0;
712 if (bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL) != 0)
713 return ENXIO;
714 switch (irq) {
715 case 3 : sc->priv_info = 0x10 | LNX_CLK_LO | LNX_SDA_HI; break;
716 case 5 : sc->priv_info = 0x20 | LNX_CLK_LO | LNX_SDA_HI; break;
717 case 6 : sc->priv_info = 0x40 | LNX_CLK_LO | LNX_SDA_HI; break;
718 case 12: sc->priv_info = 0x80 | LNX_CLK_LO | LNX_SDA_HI; break;
719 default:
720 fe_irq_failure(sc->typestr, sc->sc_unit, irq, "3/5/6/12");
721 return ENXIO;
722 }
723
724 /* LAC-98's system bus width is 8-bit. */
725 sc->proto_dlcr6 = FE_D6_BUFSIZ_32KB | FE_D6_TXBSIZ_2x2KB
726 | FE_D6_BBW_BYTE | FE_D6_SBW_BYTE | FE_D6_SRAM_150ns;
727
728 /* Setup hooks. We need a special initialization procedure. */
729 sc->init = fe_init_lnx;
730
731 return 0;
732 }
733
734
735 /*
736 * Probe for Gateway Communications' old cards.
737 * (both as Generic MB86960 probe routine)
738 */
739 static int
740 fe_probe_gwy(device_t dev)
741 {
742 struct fe_softc *sc = device_get_softc(dev);
743
744 static struct fe_simple_probe_struct probe_table [] = {
745 /* { FE_DLCR2, 0x70, 0x00 }, */
746 { FE_DLCR2, 0x58, 0x00 },
747 { FE_DLCR4, 0x08, 0x00 },
748 { 0 }
749 };
750
751 /*
752 * XXX
753 * I'm not sure which address is possible, so accepts any.
754 */
755
756 if (fe98_alloc_port(dev, FE_TYPE_GWY))
757 return ENXIO;
758
759 /* Fill the softc struct with default values. */
760 fe_softc_defaults(sc);
761
762 /* See if the card is on its address. */
763 if (!fe_simple_probe(sc, probe_table))
764 return ENXIO;
765
766 /* Get our station address from EEPROM. */
767 fe_inblk(sc, 0x18, sc->enaddr, ETHER_ADDR_LEN);
768 if (!fe_valid_Ether_p(sc->enaddr, 0x000000))
769 return ENXIO;
770
771 /* Determine the card type. */
772 sc->typestr = "Generic MB86960 Ethernet";
773 if (fe_valid_Ether_p(sc->enaddr, 0x000061))
774 sc->typestr = "Gateway Ethernet (Fujitsu chipset)";
775
776 /* Gateway's board requires an explicit IRQ to work, since it
777 is not possible to probe the setting of jumpers. */
778 if (bus_get_resource(dev, SYS_RES_IRQ, 0, NULL, NULL) != 0) {
779 fe_irq_failure(sc->typestr, sc->sc_unit, NO_IRQ, NULL);
780 return ENXIO;
781 }
782
783 return 0;
784 }
785
786
787 /*
788 * Probe for Ungermann-Bass Access/PC N98C+(Model 85152).
789 */
790 static int
791 fe_probe_ubn(device_t dev)
792 {
793 struct fe_softc *sc = device_get_softc(dev);
794
795 u_char sum, save7;
796 u_long iobase, irq;
797 int i;
798 static struct fe_simple_probe_struct const probe_table [] = {
799 { FE_DLCR2, 0x58, 0x00 },
800 { FE_DLCR4, 0x08, 0x00 },
801 { 0 }
802 };
803
804 /* See if the specified I/O address is possible for Access/PC. */
805 /* [01][048C]D0 are allowed. */
806 if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0)
807 return ENXIO;
808 if ((iobase & ~0x1C00) != 0xD0)
809 return ENXIO;
810
811 if (fe98_alloc_port(dev, FE_TYPE_UBN))
812 return ENXIO;
813
814 /* Fill the softc struct with default values. */
815 fe_softc_defaults(sc);
816
817 /* Simple probe. */
818 if (!fe_simple_probe(sc, probe_table))
819 return ENXIO;
820
821 /* NOTE: Access/NOTE N98 sometimes freeze when reading station
822 address. In case of using it togather with C-NET(9N)C,
823 this problem usually happens.
824 Writing DLCR7 prevents freezing, but I don't know why. FIXME. */
825
826 /* Save the current value for the DLCR7 register we are about
827 to destroy. */
828 save7 = fe_inb(sc, FE_DLCR7);
829 fe_outb(sc, FE_DLCR7,
830 sc->proto_dlcr7 | FE_D7_RBS_BMPR | FE_D7_POWER_UP);
831
832 /* Get our station address form ID ROM and make sure it is UBN's. */
833 fe_inblk(sc, 0x18, sc->enaddr, ETHER_ADDR_LEN);
834 if (!fe_valid_Ether_p(sc->enaddr, 0x00DD01))
835 goto fail_ubn;
836 #if 1
837 /* Calculate checksum. */
838 sum = fe_inb(sc, 0x1e);
839 for (i = 0; i < ETHER_ADDR_LEN; i++)
840 sum ^= sc->enaddr[i];
841 if (sum != 0)
842 goto fail_ubn;
843 #endif
844
845 /* Setup the board type. */
846 sc->typestr = "Access/PC";
847
848 /* This looks like an AccessPC/N98C+ board. It requires an
849 explicit IRQ setting in config. Make sure we have one,
850 determining an appropriate value for the IRQ control
851 register. */
852 irq = 0;
853 bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL);
854 switch (irq) {
855 case 3: sc->priv_info = 0x01; break;
856 case 5: sc->priv_info = 0x02; break;
857 case 6: sc->priv_info = 0x04; break;
858 case 12: sc->priv_info = 0x08; break;
859 default:
860 fe_irq_failure(sc->typestr, sc->sc_unit, irq, "3/5/6/12");
861 goto fail_ubn;
862 }
863
864 /* Setup hooks. We need a special initialization procedure. */
865 sc->init = fe_init_ubn;
866
867 return 0;
868
869 fail_ubn:
870 fe_outb(sc, FE_DLCR7, save7);
871 return ENXIO;
872 }
873
874
875 /*
876 * REX boards(non-JLI type) support routine.
877 */
878
879 #define REX_EEPROM_SIZE 32
880 #define REX_DAT 0x01
881
882 static void
883 fe_read_eeprom_rex(struct fe_softc *sc, u_char *data)
884 {
885 int i;
886 u_char bit, val;
887 u_char save16;
888
889 save16 = fe_inb(sc, 0x10);
890
891 /* Issue a start condition. */
892 val = fe_inb(sc, 0x10) & 0xf0;
893 fe_outb(sc, 0x10, val);
894
895 (void) fe_inb(sc, 0x10);
896 (void) fe_inb(sc, 0x10);
897 (void) fe_inb(sc, 0x10);
898 (void) fe_inb(sc, 0x10);
899
900 /* Read bytes from EEPROM. */
901 for (i = 0; i < REX_EEPROM_SIZE; i++) {
902 /* Read a byte and store it into the buffer. */
903 val = 0x00;
904 for (bit = 0x01; bit != 0x00; bit <<= 1)
905 if (fe_inb(sc, 0x10) & REX_DAT)
906 val |= bit;
907 *data++ = val;
908 }
909
910 fe_outb(sc, 0x10, save16);
911
912 #if 1
913 /* Report what we got. */
914 if (bootverbose) {
915 data -= REX_EEPROM_SIZE;
916 for (i = 0; i < REX_EEPROM_SIZE; i += 16) {
917 printf("fe%d: EEPROM(REX):%3x: %16D\n",
918 sc->sc_unit, i, data + i, " ");
919 }
920 }
921 #endif
922 }
923
924
925 static void
926 fe_init_rex(struct fe_softc *sc)
927 {
928 /* Setup IRQ control register on the ASIC. */
929 fe_outb(sc, 0x10, sc->priv_info);
930 }
931
932 /*
933 * Probe for RATOC REX-9880/81/82/83 series.
934 */
935 static int
936 fe_probe_rex(device_t dev)
937 {
938 struct fe_softc *sc = device_get_softc(dev);
939
940 int i;
941 u_long iobase, irq;
942 u_char eeprom [REX_EEPROM_SIZE];
943
944 static struct fe_simple_probe_struct probe_table [] = {
945 { FE_DLCR2, 0x58, 0x00 },
946 { FE_DLCR4, 0x08, 0x00 },
947 { 0 }
948 };
949
950 /* See if the specified I/O address is possible for REX-9880. */
951 /* 6[46CE]D0 are allowed. */
952 if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0)
953 return ENXIO;
954 if ((iobase & ~0xA00) != 0x64D0)
955 return ENXIO;
956
957 if (fe98_alloc_port(dev, FE_TYPE_REX))
958 return ENXIO;
959
960 /* Fill the softc struct with default values. */
961 fe_softc_defaults(sc);
962
963 /* See if the card is on its address. */
964 if (!fe_simple_probe(sc, probe_table))
965 return ENXIO;
966
967 /* We now have to read the config EEPROM. We should be very
968 careful, since doing so destroys a register. (Remember, we
969 are not yet sure we have a REX-9880 board here.) */
970 fe_read_eeprom_rex(sc, eeprom);
971 for (i = 0; i < ETHER_ADDR_LEN; i++)
972 sc->enaddr[i] = eeprom[7 - i];
973
974 /* Make sure it is RATOC's. */
975 if (!fe_valid_Ether_p(sc->enaddr, 0x00C0D0) &&
976 !fe_valid_Ether_p(sc->enaddr, 0x00803D))
977 return 0;
978
979 /* Setup the board type. */
980 sc->typestr = "REX-9880/9883";
981
982 /* This looks like a REX-9880 board. It requires an
983 explicit IRQ setting in config. Make sure we have one,
984 determining an appropriate value for the IRQ control
985 register. */
986 irq = 0;
987 bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL);
988 switch (irq) {
989 case 3: sc->priv_info = 0x10; break;
990 case 5: sc->priv_info = 0x20; break;
991 case 6: sc->priv_info = 0x40; break;
992 case 12: sc->priv_info = 0x80; break;
993 default:
994 fe_irq_failure(sc->typestr, sc->sc_unit, irq, "3/5/6/12");
995 return ENXIO;
996 }
997
998 /* Setup hooks. We need a special initialization procedure. */
999 sc->init = fe_init_rex;
1000
1001 /* REX-9880 has 64KB SRAM. */
1002 sc->proto_dlcr6 = FE_D6_BUFSIZ_64KB | FE_D6_TXBSIZ_2x4KB
1003 | FE_D6_BBW_WORD | FE_D6_SBW_WORD | FE_D6_SRAM;
1004 #if 1
1005 sc->proto_dlcr7 |= FE_D7_EOPPOL; /* XXX */
1006 #endif
1007
1008 return 0;
1009 }
Cache object: 35262f6bab187437502e27319f55d3e3
|