if_ed_cbus.c revision 155874
1/*-
2 * Copyright (c) 1995, David Greenman
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice unmodified, this list of conditions, and the following
10 *    disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 * $FreeBSD: head/sys/dev/ed/if_ed_cbus.c 155874 2006-02-21 12:01:39Z nyan $
28 */
29
30#include <sys/param.h>
31#include <sys/systm.h>
32#include <sys/socket.h>
33#include <sys/kernel.h>
34
35#include <sys/module.h>
36#include <sys/bus.h>
37#include <machine/bus.h>
38#include <sys/rman.h>
39#include <machine/resource.h>
40#include <machine/clock.h>
41
42#include <net/ethernet.h>
43#include <net/if.h>
44#include <net/if_arp.h>
45#include <net/if_media.h>
46#include <net/if_mib.h>
47
48#include <isa/isavar.h>
49
50#include <dev/ed/if_edvar.h>
51#include <dev/ed/if_edreg.h>
52#include <dev/ed/if_ed98.h>
53
54static int ed98_alloc_port(device_t, int);
55static int ed98_alloc_memory(device_t, int);
56static int ed_pio_testmem(struct ed_softc *, int, int, int);
57static int ed_probe_CNET98(device_t, int, int);
58static int ed_probe_CNET98EL(device_t, int, int);
59static int ed_probe_EZ98(device_t, int, int);
60static int ed_probe_NEC77(device_t, int, int);
61static int ed_probe_NW98X(device_t, int, int);
62static int ed_probe_SB98(device_t, int, int);
63static int ed_probe_SIC98(device_t, int, int);
64static int ed98_probe_Novell(device_t, int, int);
65static int ed98_probe_generic8390(struct ed_softc *);
66static void ed_reset_CNET98(struct ed_softc *, int);
67static void ed_winsel_CNET98(struct ed_softc *, u_short);
68static void ed_get_SB98(struct ed_softc *);
69
70static int ed_cbus_probe(device_t);
71static int ed_cbus_attach(device_t);
72
73static struct isa_pnp_id ed_ids[] = {
74/* TODO - list up PnP boards for PC-98 */
75	{ 0,		NULL }
76};
77
78static int
79ed_cbus_probe(device_t dev)
80{
81	struct ed_softc *sc = device_get_softc(dev);
82	int flags = device_get_flags(dev);
83	int error = 0;
84
85	sc->type = ED_TYPE98(flags);
86#ifdef ED_DEBUG
87	device_printf(dev, "ed_cbus_probe: sc->type=%x\n", sc->type);
88#endif
89
90	/* Check isapnp ids */
91	error = ISA_PNP_PROBE(device_get_parent(dev), dev, ed_ids);
92#ifdef ED_DEBUG
93	device_printf(dev, "ed_cbus_probe: ISA_PNP_PROBE returns %d\n", error);
94#endif
95
96	/* If the card had a PnP ID that didn't match any we know about */
97	if (error == ENXIO)
98		goto end;
99
100	/* If we had some other problem. */
101	if (!(error == 0 || error == ENOENT))
102		goto end;
103
104	/* Heuristic probes */
105#ifdef ED_DEBUG
106	device_printf(dev, "ed_cbus_probe: Heuristic probes start\n");
107#endif
108	switch (sc->type) {
109	case ED_TYPE98_GENERIC:
110		/*
111		 * CAUTION!
112		 * sc->type of these boards are overwritten by PC/AT's value.
113		 */
114
115		/*
116		 * SMC EtherEZ98
117		 */
118		error = ed_probe_EZ98(dev, 0, flags);
119		if (error == 0)
120			goto end;
121
122		ed_release_resources(dev);
123
124		/*
125		 * Allied Telesis CenterCom LA-98-T
126		 */
127		error = ed_probe_Novell(dev, 0, flags);
128		if (error == 0) {
129			ed_Novell_read_mac(sc);
130			goto end;
131		}
132		break;
133
134	/*
135	 * NE2000-like boards probe routine
136	 */
137	case ED_TYPE98_BDN:
138		/*
139		 * ELECOM LANEED LD-BDN
140		 * PLANET SMART COM 98 EN-2298
141		 */
142	case ED_TYPE98_LGY:
143		/*
144		 * MELCO LGY-98, IND-SP, IND-SS
145		 * MACNICA NE2098
146		 */
147	case ED_TYPE98_ICM:
148		/*
149		 * ICM DT-ET-25, DT-ET-T5, IF-2766ET, IF-2771ET
150		 * D-Link DE-298P, DE-298
151		 */
152	case ED_TYPE98_EGY:
153		/*
154		 * MELCO EGY-98
155		 * Contec C-NET(98)E-A, C-NET(98)L-A
156		 */
157	case ED_TYPE98_108:
158		/*
159		 * NEC PC-9801-107,108
160		 */
161	case ED_TYPE98_NC5098:
162		/*
163		 * NextCom NC5098
164		 */
165		error = ed98_probe_Novell(dev, 0, flags);
166		break;
167
168	/*
169	 * other boards with special probe routine
170	 */
171	case ED_TYPE98_SIC:
172		/*
173		 * Allied Telesis SIC-98
174		 */
175		error = ed_probe_SIC98(dev, 0, flags);
176		break;
177
178	case ED_TYPE98_CNET98EL:
179		/*
180		 * Contec C-NET(98)E/L
181		 */
182		error = ed_probe_CNET98EL(dev, 0, flags);
183		break;
184
185	case ED_TYPE98_CNET98:
186		/*
187		 * Contec C-NET(98)
188		 */
189		error = ed_probe_CNET98(dev, 0, flags);
190		break;
191
192	case ED_TYPE98_LA98:
193		/*
194		 * IO-DATA LA/T-98
195		 * NEC PC-9801-77,78
196		 */
197		error = ed_probe_NEC77(dev, 0, flags);
198		break;
199
200	case ED_TYPE98_NW98X:
201		/*
202		 * Networld EC/EP-98X
203		 */
204		error = ed_probe_NW98X(dev, 0, flags);
205		break;
206
207	case ED_TYPE98_SB98:
208		/*
209		 * Soliton SB-9801
210		 * Fujikura FN-9801
211		 */
212		error = ed_probe_SB98(dev, 0, flags);
213		break;
214	}
215
216end:
217#ifdef ED_DEBUG
218	device_printf(dev, "ed_cbus_probe: end, error=%d\n", error);
219#endif
220	if (error == 0)
221		error = ed_alloc_irq(dev, 0, 0);
222
223	ed_release_resources(dev);
224	return (error);
225}
226
227static int
228ed_cbus_attach(dev)
229	device_t dev;
230{
231	struct ed_softc *sc = device_get_softc(dev);
232	int flags = device_get_flags(dev);
233	int error;
234
235	if (sc->port_used > 0) {
236		if (ED_TYPE98(flags) == ED_TYPE98_GENERIC)
237			ed_alloc_port(dev, sc->port_rid, sc->port_used);
238		else
239			ed98_alloc_port(dev, sc->port_rid);
240	}
241	if (sc->mem_used)
242		ed_alloc_memory(dev, sc->mem_rid, sc->mem_used);
243
244	ed_alloc_irq(dev, sc->irq_rid, 0);
245
246	error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET | INTR_MPSAFE,
247	    edintr, sc, &sc->irq_handle);
248	if (error) {
249		ed_release_resources(dev);
250		return (error);
251	}
252
253	return ed_attach(dev);
254}
255
256/*
257 * Interrupt conversion table for EtherEZ98
258 */
259static uint16_t ed_EZ98_intr_val[] = {
260	0,
261	3,
262	5,
263	6,
264	0,
265	9,
266	12,
267	13
268};
269
270static int
271ed_probe_EZ98(device_t dev, int port_rid, int flags)
272{
273	struct ed_softc *sc = device_get_softc(dev);
274	int error;
275	static unsigned short *intr_vals[] = {NULL, ed_EZ98_intr_val};
276
277	error = ed_alloc_port(dev, port_rid, ED_EZ98_IO_PORTS);
278	if (error) {
279		return (error);
280	}
281
282	sc->asic_offset = ED_EZ98_ASIC_OFFSET;
283	sc->nic_offset  = ED_EZ98_NIC_OFFSET;
284
285	return ed_probe_WD80x3_generic(dev, flags, intr_vals);
286}
287
288/*
289 * I/O conversion tables
290 */
291
292/* LGY-98, ICM, C-NET(98)E/L */
293static	bus_addr_t ed98_ioaddr_generic[] = {
294	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
295};
296
297/*
298 *		Definitions for Contec C-NET(98)E/L
299 */
300#define	ED_CNET98EL_ICR         2	/* Interrupt Configuration Register */
301
302#define	ED_CNET98EL_ICR_IRQ3	0x01
303#define	ED_CNET98EL_ICR_IRQ5	0x02
304#define	ED_CNET98EL_ICR_IRQ6	0x04
305#define	ED_CNET98EL_ICR_IRQ12	0x20
306
307#define	ED_CNET98EL_IMR         4	/* Interrupt Mask Register	*/
308#define	ED_CNET98EL_ISR         5	/* Interrupt Status Register	*/
309
310/* EGY-98 */
311static	bus_addr_t ed98_ioaddr_egy98[] = {
312	0,     0x02,  0x04,  0x06,  0x08,  0x0a,  0x0c,  0x0e,
313	0x100, 0x102, 0x104, 0x106, 0x108, 0x10a, 0x10c, 0x10e
314};
315
316/* SIC-98 */
317static	bus_addr_t ed98_ioaddr_sic98[] = {
318	0x0000, 0x0200, 0x0400, 0x0600, 0x0800, 0x0a00, 0x0c00, 0x0e00,
319	0x1000, 0x1200, 0x1400, 0x1600, 0x1800, 0x1a00, 0x1c00, 0x1e00
320};
321
322/* LA/T-98, LD-BDN, PC-9801-77, SB-9801 */
323static	bus_addr_t ed98_ioaddr_la98[] = {
324	0x0000, 0x1000, 0x2000, 0x3000, 0x4000, 0x5000, 0x6000, 0x7000,
325	0x8000, 0x9000, 0xa000, 0xb000, 0xc000, 0xd000, 0xe000, 0xf000,
326	0x0100	/* for NEC 77(see below) */
327};
328
329/*
330 *		Definitions for NEC PC-9801-77
331 */
332#define	ED_NEC77_IRQ		16	/* Interrupt Configuration Register */
333
334#define	ED_NEC77_IRQ3		0x04
335#define	ED_NEC77_IRQ5		0x06
336#define	ED_NEC77_IRQ6		0x08
337#define	ED_NEC77_IRQ12		0x0a
338#define	ED_NEC77_IRQ13		0x02
339
340/*
341 *		Definitions for Soliton SB-9801
342 */
343#define	ED_SB98_CFG		1	/* Board configuration		*/
344
345#define	ED_SB98_CFG_IRQ3	0x00
346#define	ED_SB98_CFG_IRQ5	0x04
347#define	ED_SB98_CFG_IRQ6	0x08
348#define	ED_SB98_CFG_IRQ12	0x0c
349#define	ED_SB98_CFG_ALTPORT	0x40		/* use EXTERNAL media	*/
350#define	ED_SB98_CFG_ENABLE	0xa0		/* enable configuration	*/
351
352#define	ED_SB98_EEPENA		2	/* EEPROM access enable		*/
353
354#define	ED_SB98_EEPENA_DISABLE	0x00
355#define	ED_SB98_EEPENA_ENABLE	0x01
356
357#define	ED_SB98_EEP		3	/* EEPROM access		*/
358
359#define	ED_SB98_EEP_SDA		0x01		/* Serial Data	*/
360#define	ED_SB98_EEP_SCL		0x02		/* Serial Clock	*/
361#define	ED_SB98_EEP_READ	0x01		/* Read Command	*/
362
363#define	ED_SB98_EEP_DELAY	300
364
365#define	ED_SB98_ADDRESS		0x01		/* Station Address(1-6)	*/
366
367#define	ED_SB98_POLARITY	4	/* Polarity			*/
368
369/* PC-9801-108 */
370static	bus_addr_t ed98_ioaddr_nec108[] = {
371	0x0000, 0x0002, 0x0004, 0x0006, 0x0008, 0x000a, 0x000c, 0x000e,
372	0x1000, 0x1002, 0x1004, 0x1006, 0x1008, 0x100a, 0x100c, 0x100e
373};
374
375/* C-NET(98) */
376static	bus_addr_t ed98_ioaddr_cnet98[] = {
377	0x0000, 0x0002, 0x0004, 0x0006, 0x0008, 0x000a, 0x000c, 0x000e,
378	0x0400, 0x0402, 0x0404, 0x0406, 0x0408, 0x040a, 0x040c, 0x040e
379};
380
381/*
382 *		Definitions for Contec C-NET(98)
383 */
384#define	ED_CNET98_MAP_REG0L	0	/* MAPPING register0 Low	*/
385#define	ED_CNET98_MAP_REG1L	1	/* MAPPING register1 Low	*/
386#define	ED_CNET98_MAP_REG2L	2	/* MAPPING register2 Low	*/
387#define	ED_CNET98_MAP_REG3L	3	/* MAPPING register3 Low	*/
388#define	ED_CNET98_MAP_REG0H	4	/* MAPPING register0 Hi		*/
389#define	ED_CNET98_MAP_REG1H	5	/* MAPPING register1 Hi		*/
390#define	ED_CNET98_MAP_REG2H	6	/* MAPPING register2 Hi		*/
391#define	ED_CNET98_MAP_REG3H	7	/* MAPPING register3 Hi		*/
392#define	ED_CNET98_WIN_REG	8	/* Window register		*/
393#define	ED_CNET98_INT_LEV	9	/* Init level register		*/
394
395#define	ED_CNET98_INT_IRQ3	0x01		/* INT 0 */
396#define	ED_CNET98_INT_IRQ5	0x02		/* INT 1 */
397#define	ED_CNET98_INT_IRQ6	0x04		/* INT 2 */
398#define	ED_CNET98_INT_IRQ9	0x08		/* INT 3 */
399#define	ED_CNET98_INT_IRQ12	0x20		/* INT 5 */
400#define	ED_CNET98_INT_IRQ13	0x40		/* INT 6 */
401
402#define	ED_CNET98_INT_REQ	10	/* Init request register	*/
403#define	ED_CNET98_INT_MASK	11	/* Init mask register		*/
404#define	ED_CNET98_INT_STAT	12	/* Init status register		*/
405#define	ED_CNET98_INT_CLR	12	/* Init clear register		*/
406#define	ED_CNET98_RESERVE1	13
407#define	ED_CNET98_RESERVE2	14
408#define	ED_CNET98_RESERVE3	15
409
410/* EC/EP-98X, NC5098 */
411static	bus_addr_t ed98_ioaddr_nw98x[] = {
412	0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600, 0x0700,
413	0x0800, 0x0900, 0x0a00, 0x0b00, 0x0c00, 0x0d00, 0x0e00, 0x0f00,
414	0x1000	/* for EC/EP-98X(see below) */
415};
416
417/*
418 *		Definitions for Networld EC/EP-98X
419 */
420#define	ED_NW98X_IRQ            16	/* Interrupt Configuration Register */
421
422#define	ED_NW98X_IRQ3           0x04
423#define	ED_NW98X_IRQ5           0x06
424#define	ED_NW98X_IRQ6           0x08
425#define	ED_NW98X_IRQ12          0x0a
426#define	ED_NW98X_IRQ13          0x02
427
428/* NC5098 ASIC */
429static bus_addr_t ed98_asic_nc5098[] = {
430/*	DATA    ENADDR						RESET	*/
431	0x0000, 0x2000, 0x2100, 0x2200, 0x2300, 0x2400, 0x2500, 0x4000,
432	     0,      0,      0,      0,      0,      0,      0,      0
433};
434
435/*
436 *		Definitions for NextCom NC5098
437 */
438#define	ED_NC5098_ENADDR	1	/* Station Address(1-6)		*/
439
440/*
441 * Allocate a port resource with the given resource id.
442 */
443static int
444ed98_alloc_port(device_t dev, int rid)
445{
446	struct ed_softc *sc = device_get_softc(dev);
447	struct resource *res;
448	int error;
449	bus_addr_t *io_nic, *io_asic, adj;
450	static bus_addr_t io_res[ED_NOVELL_IO_PORTS + 1];
451	int i, n;
452	int offset, reset, data;
453
454	/* Set i/o table for resource manager */
455	io_nic = io_asic = ed98_ioaddr_generic;
456	offset = ED_NOVELL_ASIC_OFFSET;
457	reset = ED_NOVELL_RESET;
458	data  = ED_NOVELL_DATA;
459	n = ED_NOVELL_IO_PORTS;
460
461	switch (sc->type) {
462	case ED_TYPE98_LGY:
463		io_asic = ed98_ioaddr_egy98; /* XXX - Yes, we use egy98 */
464		offset = 0x0200;
465		reset = 8;
466		break;
467
468	case ED_TYPE98_EGY:
469		io_nic = io_asic = ed98_ioaddr_egy98;
470		offset = 0x0200;
471		reset = 8;
472		break;
473
474	case ED_TYPE98_ICM:
475		offset = 0x0100;
476		break;
477
478	case ED_TYPE98_BDN:
479		io_nic = io_asic = ed98_ioaddr_la98;
480		offset = 0x0100;
481		reset = 0x0c;
482		break;
483
484	case ED_TYPE98_SIC:
485		io_nic = io_asic = ed98_ioaddr_sic98;
486		offset = 0x2000;
487		n = 16+1;
488		break;
489
490	case ED_TYPE98_108:
491		io_nic = io_asic = ed98_ioaddr_nec108;
492		offset = 0x0888;	/* XXX - overwritten after */
493		reset = 1;
494		n = 16;	/* XXX - does not set ASIC i/o here */
495		break;
496
497	case ED_TYPE98_LA98:
498		io_nic = io_asic = ed98_ioaddr_la98;
499		offset = 0x0100;
500		break;
501
502	case ED_TYPE98_CNET98EL:
503		offset = 0x0400;
504		data = 0x0e;
505		break;
506
507	case ED_TYPE98_CNET98:
508		/* XXX - Yes, we use generic i/o here */
509		offset = 0x0400;
510		break;
511
512	case ED_TYPE98_NW98X:
513		io_nic = io_asic = ed98_ioaddr_nw98x;
514		offset = 0x1000;
515		break;
516
517	case ED_TYPE98_SB98:
518		io_nic = io_asic = ed98_ioaddr_la98;
519		offset = 0x0400;
520		reset = 7;
521		break;
522
523	case ED_TYPE98_NC5098:
524		io_nic  = ed98_ioaddr_nw98x;
525		io_asic = ed98_asic_nc5098;
526		offset = 0x2000;
527		reset = 7;
528		n = 16+8;	/* XXX */
529		break;
530	}
531
532	bcopy(io_nic, io_res, sizeof(io_nic[0]) * ED_NOVELL_ASIC_OFFSET);
533	for (i = ED_NOVELL_ASIC_OFFSET; i < ED_NOVELL_IO_PORTS; i++)
534		io_res[i] = io_asic[i - ED_NOVELL_ASIC_OFFSET] + offset;
535
536	res = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, io_res, n,
537	    RF_ACTIVE);
538	if (!res)
539		return (ENOENT);
540
541	sc->port_rid = rid;
542	sc->port_res = res;
543	sc->port_used = n;
544	sc->port_bst = rman_get_bustag(res);
545	sc->port_bsh = rman_get_bushandle(res);
546
547	/* Re-map i/o table if needed */
548	switch (sc->type) {
549	case ED_TYPE98_LA98:
550	case ED_TYPE98_NW98X:
551		io_res[n] = io_asic[n - ED_NOVELL_ASIC_OFFSET] + offset;
552		n++;
553		break;
554
555	case ED_TYPE98_108:
556		adj = (rman_get_start(res) & 0xf000) / 2;
557		offset = (offset | adj) - rman_get_start(res);
558
559		for (n = ED_NOVELL_ASIC_OFFSET; n < ED_NOVELL_IO_PORTS; n++)
560			io_res[n] = io_asic[n - ED_NOVELL_ASIC_OFFSET] + offset;
561		break;
562
563	case ED_TYPE98_CNET98:
564		io_nic = io_asic = ed98_ioaddr_cnet98;
565		offset = 1;
566
567		bcopy(io_nic, io_res, sizeof(io_nic[0]) * ED_NOVELL_ASIC_OFFSET);
568		for (n = ED_NOVELL_ASIC_OFFSET; n < ED_NOVELL_IO_PORTS; n++)
569			io_res[n] = io_asic[n - ED_NOVELL_ASIC_OFFSET] + offset;
570		break;
571
572	case ED_TYPE98_NC5098:
573		n = ED_NOVELL_IO_PORTS;
574		break;
575	}
576
577	if (reset != ED_NOVELL_RESET)
578		io_res[ED_NOVELL_ASIC_OFFSET + ED_NOVELL_RESET] =
579			io_res[ED_NOVELL_ASIC_OFFSET + reset];
580	if (data  != ED_NOVELL_DATA) {
581		io_res[ED_NOVELL_ASIC_OFFSET + ED_NOVELL_DATA] =
582			io_res[ED_NOVELL_ASIC_OFFSET + data];
583#if 0
584		io_res[ED_NOVELL_ASIC_OFFSET + ED_NOVELL_DATA + 1] =
585			io_res[ED_NOVELL_ASIC_OFFSET + data + 1];
586#endif
587	}
588
589	error = isa_load_resourcev(res, io_res, n);
590	if (error != 0)
591		return (ENOENT);
592#ifdef ED_DEBUG
593	device_printf(dev, "ed98_alloc_port: i/o ports = %d\n", n);
594	for (i = 0; i < n; i++)
595		printf("%x,", io_res[i]);
596	printf("\n");
597#endif
598	return (0);
599}
600
601static int
602ed98_alloc_memory(dev, rid)
603	device_t dev;
604	int rid;
605{
606	struct ed_softc *sc = device_get_softc(dev);
607	int error;
608	u_long conf_maddr, conf_msize;
609
610	error = bus_get_resource(dev, SYS_RES_MEMORY, 0, &conf_maddr,
611	    &conf_msize);
612	if (error)
613		return (error);
614
615	if ((conf_maddr == 0) || (conf_msize == 0))
616		return (ENXIO);
617
618	error = ed_alloc_memory(dev, rid, (int) conf_msize);
619	if (error)
620		return (error);
621
622	sc->mem_start = 0;
623	sc->mem_size  = conf_msize;
624
625	return (0);
626}
627
628/*
629 * Generic probe routine for testing for the existance of a DS8390.
630 *	Must be called after the NIC has just been reset. This routine
631 *	works by looking at certain register values that are guaranteed
632 *	to be initialized a certain way after power-up or reset. Seems
633 *	not to currently work on the 83C690.
634 *
635 * Specifically:
636 *
637 *	Register			reset bits	set bits
638 *	Command Register (CR)		TXP, STA	RD2, STP
639 *	Interrupt Status (ISR)				RST
640 *	Interrupt Mask (IMR)		All bits
641 *	Data Control (DCR)				LAS
642 *	Transmit Config. (TCR)		LB1, LB0
643 *
644 * XXX - We only check the CR register.
645 *
646 * Return 1 if 8390 was found, 0 if not.
647 */
648
649static int
650ed98_probe_generic8390(struct ed_softc *sc)
651{
652	u_char tmp = ed_nic_inb(sc, ED_P0_CR);
653#ifdef DIAGNOSTIC
654	printf("ed?: inb(ED_P0_CR)=%x\n", tmp);
655#endif
656	if ((tmp & (ED_CR_RD2 | ED_CR_TXP | ED_CR_STA | ED_CR_STP)) !=
657	    (ED_CR_RD2 | ED_CR_STP))
658		return (0);
659
660	(void) ed_nic_inb(sc, ED_P0_ISR);
661
662	return (1);
663}
664
665static int
666ed98_probe_Novell(device_t dev, int port_rid, int flags)
667{
668	struct ed_softc *sc = device_get_softc(dev);
669	int error;
670	int n;
671	u_char romdata[ETHER_ADDR_LEN * 2], tmp;
672
673#ifdef ED_DEBUG
674	device_printf(dev, "ed98_probe_Novell: start\n");
675#endif
676	error = ed98_alloc_port(dev, port_rid);
677	if (error)
678		return (error);
679
680	sc->asic_offset = ED_NOVELL_ASIC_OFFSET;
681	sc->nic_offset  = ED_NOVELL_NIC_OFFSET;
682
683	/* Reset the board */
684#ifdef ED_DEBUG
685	device_printf(dev, "ed98_probe_Novell: reset\n");
686#endif
687	switch (sc->type) {
688#if 1	/* XXX - I'm not sure this is really necessary... */
689	case ED_TYPE98_BDN:
690		tmp = ed_asic_inb(sc, ED_NOVELL_RESET);
691		ed_asic_outb(sc, ED_NOVELL_RESET, (tmp & 0xf0) | 0x08);
692		ed_nic_outb(sc, 0x04, tmp);
693		(void) ed_asic_inb(sc, 0x08);
694		ed_asic_outb(sc, 0x08, tmp);
695		ed_asic_outb(sc, 0x08, tmp & 0x7f);
696		break;
697#endif
698	case ED_TYPE98_NC5098:
699		ed_asic_outb(sc, ED_NOVELL_RESET, 0x00);
700		DELAY(5000);
701		ed_asic_outb(sc, ED_NOVELL_RESET, 0x01);
702		break;
703
704	default:
705		tmp = ed_asic_inb(sc, ED_NOVELL_RESET);
706
707	/*
708	 * I don't know if this is necessary; probably cruft leftover from
709	 * Clarkson packet driver code. Doesn't do a thing on the boards I've
710	 * tested. -DG [note that an outb(0x84, 0) seems to work here, and is
711	 * non-invasive...but some boards don't seem to reset and I don't have
712	 * complete documentation on what the 'right' thing to do is...so we
713	 * do the invasive thing for now. Yuck.]
714	 */
715		ed_asic_outb(sc, ED_NOVELL_RESET, tmp);
716		break;
717	}
718	DELAY(5000);
719
720	/*
721	 * This is needed because some NE clones apparently don't reset the
722	 * NIC properly (or the NIC chip doesn't reset fully on power-up) XXX
723	 * - this makes the probe invasive! ...Done against my better
724	 * judgement. -DLG
725	 */
726	ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP);
727	DELAY(5000);
728
729	/* Make sure that we really have an 8390 based board */
730	if (!ed98_probe_generic8390(sc))
731		return (ENXIO);
732
733	/* Test memory via PIO */
734#ifdef ED_DEBUG
735	device_printf(dev, "ed98_probe_Novell: test memory\n");
736#endif
737	sc->cr_proto = ED_CR_RD2;
738	if (!ed_pio_testmem(sc,  8192, 0, flags) &&
739	    !ed_pio_testmem(sc, 16384, 1, flags))
740		return (ENXIO);
741
742	/* Setup the board type */
743#ifdef ED_DEBUG
744	device_printf(dev, "ed98_probe_Novell: board type\n");
745#endif
746	switch (sc->type) {
747	case ED_TYPE98_BDN:
748		sc->type_str = "LD-BDN";
749		break;
750	case ED_TYPE98_EGY:
751		sc->type_str = "EGY-98";
752		break;
753	case ED_TYPE98_LGY:
754		sc->type_str = "LGY-98";
755		break;
756	case ED_TYPE98_ICM:
757		sc->type_str = "ICM";
758		break;
759	case ED_TYPE98_108:
760		sc->type_str = "PC-9801-108";
761		break;
762	case ED_TYPE98_LA98:
763		sc->type_str = "LA-98";
764		break;
765	case ED_TYPE98_NW98X:
766		sc->type_str = "NW98X";
767		break;
768	case ED_TYPE98_NC5098:
769		sc->type_str = "NC5098";
770		break;
771	default:
772		sc->type_str = NULL;
773		break;
774	}
775
776	/* Get station address */
777	switch (sc->type) {
778	case ED_TYPE98_NC5098:
779		for (n = 0; n < ETHER_ADDR_LEN; n++)
780			sc->enaddr[n] = ed_asic_inb(sc, ED_NC5098_ENADDR + n);
781		break;
782
783	default:
784		ed_pio_readmem(sc, 0, romdata, sizeof(romdata));
785		for (n = 0; n < ETHER_ADDR_LEN; n++)
786			sc->enaddr[n] = romdata[n * (sc->isa16bit + 1)];
787		break;
788	}
789
790	/* clear any pending interrupts that might have occurred above */
791	ed_nic_outb(sc, ED_P0_ISR, 0xff);
792
793	sc->sc_write_mbufs = ed_pio_write_mbufs;
794	return (0);
795}
796
797/*
798 * Probe and vendor-specific initialization routine for SIC-98 boards
799 */
800static int
801ed_probe_SIC98(device_t dev, int port_rid, int flags)
802{
803	struct ed_softc *sc = device_get_softc(dev);
804	int error;
805	int i;
806	u_char sum;
807
808	/*
809	 * Setup card RAM and I/O address
810	 * Kernel Virtual to segment C0000-DFFFF????
811	 */
812	error = ed98_alloc_port(dev, port_rid);
813	if (error)
814		return (error);
815
816	sc->asic_offset = ED_SIC_ASIC_OFFSET;
817	sc->nic_offset  = ED_SIC_NIC_OFFSET;
818
819	error = ed98_alloc_memory(dev, 0);
820	if (error)
821		return (error);
822
823	/* Reset card to force it into a known state. */
824	ed_asic_outb(sc, 0, 0x00);
825	DELAY(100);
826	if (ED_TYPE98SUB(flags) == 0) {
827		/* SIC-98/SIU-98 */
828		ed_asic_outb(sc, 0, 0x94);
829		DELAY(100);
830		ed_asic_outb(sc, 0, 0x94);
831	} else {
832		/* SIU-98-D */
833		ed_asic_outb(sc, 0, 0x80);
834		DELAY(100);
835		ed_asic_outb(sc, 0, 0x94);
836		DELAY(100);
837		ed_asic_outb(sc, 0, 0x9e);
838	}
839	DELAY(100);
840
841	/*
842	 * Here we check the card ROM, if the checksum passes, and the
843	 * type code and ethernet address check out, then we know we have
844	 * an SIC card.
845	 */
846	sum = bus_space_read_1(sc->mem_bst, sc->mem_bsh, 6 * 2);
847	for (i = 0; i < ETHER_ADDR_LEN; i++)
848		sum ^= (sc->enaddr[i] =
849		    bus_space_read_1(sc->mem_bst, sc->mem_bsh, i * 2));
850#ifdef ED_DEBUG
851	device_printf(dev, "ed_probe_sic98: got address %6D\n",
852		      sc->enaddr, ":");
853#endif
854	if (sum != 0)
855		return (ENXIO);
856	if ((sc->enaddr[0] | sc->enaddr[1] | sc->enaddr[2]) == 0)
857		return (ENXIO);
858
859	sc->vendor   = ED_VENDOR_SIC;
860	sc->type_str = "SIC98";
861	sc->isa16bit = 1;
862	sc->cr_proto = 0;
863
864	/*
865	 * SIC RAM page 0x0000-0x3fff(or 0x7fff)
866	 */
867	if (ED_TYPE98SUB(flags) == 0)
868		ed_asic_outb(sc, 0, 0x90);
869	else
870		ed_asic_outb(sc, 0, 0x8e);
871	DELAY(100);
872
873	error = ed_clear_memory(dev);
874	if (error)
875		return (error);
876
877	sc->mem_shared = 1;
878	sc->mem_end = sc->mem_start + sc->mem_size;
879
880	/*
881	 * allocate one xmit buffer if < 16k, two buffers otherwise
882	 */
883	if ((sc->mem_size < 16384) || (flags & ED_FLAGS_NO_MULTI_BUFFERING))
884		sc->txb_cnt = 1;
885	else
886		sc->txb_cnt = 2;
887	sc->tx_page_start = 0;
888
889	sc->rec_page_start = sc->tx_page_start + ED_TXBUF_SIZE * sc->txb_cnt;
890	sc->rec_page_stop = sc->tx_page_start + sc->mem_size / ED_PAGE_SIZE;
891
892	sc->mem_ring = sc->mem_start + sc->txb_cnt * ED_PAGE_SIZE * ED_TXBUF_SIZE;
893
894	sc->sc_write_mbufs = ed_shmem_write_mbufs;
895	return (0);
896}
897
898/*
899 * Contec C-NET(98) series support routines
900 */
901static void
902ed_reset_CNET98(struct ed_softc *sc, int flags)
903{
904	u_int init_addr = ED_CNET98_INIT;
905	u_char tmp;
906
907	/* Choose initial register address */
908	if (ED_TYPE98SUB(flags) != 0) {
909		init_addr = ED_CNET98_INIT2;
910	}
911#ifdef ED_DEBUG
912	printf("ed?: initial register=%x\n", init_addr);
913#endif
914	/*
915	 * Reset the board to force it into a known state.
916	 */
917	outb(init_addr, 0x00);	/* request */
918	DELAY(5000);
919	outb(init_addr, 0x01);	/* cancel */
920	DELAY(5000);
921
922	/*
923	 * Set I/O address(A15-12) and cpu type
924	 *
925	 *   AAAAIXXC(8bit)
926	 *   AAAA: A15-A12,  I: I/O enable, XX: reserved, C: CPU type
927	 *
928	 * CPU type is 1:80286 or higher, 0:not.
929	 * But FreeBSD runs under i386 or higher, thus it must be 1.
930	 */
931	tmp = (rman_get_start(sc->port_res) & 0xf000) >> 8;
932	tmp |= (0x08 | 0x01);
933#ifdef ED_DEBUG
934	printf("ed?: outb(%x, %x)\n", init_addr + 2, tmp);
935#endif
936	outb(init_addr + 2, tmp);
937	DELAY(5000);
938
939	/*
940	 * This is needed because some NE clones apparently don't reset the
941	 * NIC properly (or the NIC chip doesn't reset fully on power-up) XXX
942	 * - this makes the probe invasive! ...Done against my better
943	 * judgement. -DLG
944	 */
945	ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP);
946	DELAY(5000);
947}
948
949static void
950ed_winsel_CNET98(struct ed_softc *sc, u_short bank)
951{
952	u_char mem = (rman_get_start(sc->mem_res) >> 12) & 0xff;
953
954	/*
955	 * Disable window memory
956	 *    bit7 is 0:disable
957	 */
958	ed_asic_outb(sc, ED_CNET98_WIN_REG, mem & 0x7f);
959	DELAY(10);
960
961	/*
962	 * Select window address
963	 *    FreeBSD address 0xf00xxxxx
964	 */
965	ed_asic_outb(sc, ED_CNET98_MAP_REG0L, bank & 0xff);
966	DELAY(10);
967	ed_asic_outb(sc, ED_CNET98_MAP_REG0H, (bank >> 8) & 0xff);
968	DELAY(10);
969	ed_asic_outb(sc, ED_CNET98_MAP_REG1L, 0x00);
970	DELAY(10);
971	ed_asic_outb(sc, ED_CNET98_MAP_REG1H, 0x41);
972	DELAY(10);
973	ed_asic_outb(sc, ED_CNET98_MAP_REG2L, 0x00);
974	DELAY(10);
975	ed_asic_outb(sc, ED_CNET98_MAP_REG2H, 0x42);
976	DELAY(10);
977	ed_asic_outb(sc, ED_CNET98_MAP_REG3L, 0x00);
978	DELAY(10);
979	ed_asic_outb(sc, ED_CNET98_MAP_REG3H, 0x43);
980	DELAY(10);
981
982	/*
983	 * Enable window memory(16Kbyte)
984	 *    bit7 is 1:enable
985	 */
986#ifdef ED_DEBUG
987	printf("ed?: window start address=%x\n", mem);
988#endif
989	ed_asic_outb(sc, ED_CNET98_WIN_REG, mem);
990	DELAY(10);
991}
992
993/*
994 * Probe and vendor-specific initialization routine for C-NET(98) boards
995 */
996static int
997ed_probe_CNET98(device_t dev, int port_rid, int flags)
998{
999	struct ed_softc *sc = device_get_softc(dev);
1000	int error;
1001	u_char tmp;
1002	u_long conf_irq, junk;
1003#ifdef DIAGNOSTIC
1004	u_char tmp_s;
1005#endif
1006
1007	error = ed98_alloc_port(dev, port_rid);
1008	if (error)
1009		return (error);
1010
1011	sc->asic_offset = ED_NOVELL_ASIC_OFFSET;
1012	sc->nic_offset  = ED_NOVELL_NIC_OFFSET;
1013
1014	error = ed98_alloc_memory(dev, 0);
1015	if (error)
1016		return (error);
1017
1018	/* Check I/O address. 0x[a-f]3d0 are allowed. */
1019	if (((rman_get_start(sc->port_res) & 0x0fff) != 0x03d0)
1020	||  ((rman_get_start(sc->port_res) & 0xf000) < (u_short) 0xa000)) {
1021#ifdef DIAGNOSTIC
1022		device_printf(dev, "Invalid i/o port configuration (0x%lx) "
1023			"must be %s for %s\n", rman_get_start(sc->port_res),
1024			"0x[a-f]3d0", "CNET98");
1025#endif
1026		return (ENXIO);
1027	}
1028
1029#ifdef DIAGNOSTIC
1030	/* Check window area address */
1031	tmp_s = rman_get_start(sc->mem_res) >> 12;
1032	if (tmp_s < 0x80) {
1033		device_printf(dev, "Please change window address(0x%lx)\n",
1034		    rman_get_start(sc->mem_res));
1035		return (ENXIO);
1036	}
1037
1038	tmp_s &= 0x0f;
1039	tmp    = rman_get_start(sc->port_res) >> 12;
1040	if ((tmp_s <= tmp) && (tmp < (tmp_s + 4))) {
1041		device_printf(dev, "Please change iobase address(0x%lx) "
1042		    "or window address(0x%lx)\n",
1043		    rman_get_start(sc->port_res),
1044		    rman_get_start(sc->mem_res));
1045		return (ENXIO);
1046	}
1047#endif
1048	/* Reset the board */
1049	ed_reset_CNET98(sc, flags);
1050
1051	/*
1052	 * This is needed because some NE clones apparently don't reset the
1053	 * NIC properly (or the NIC chip doesn't reset fully on power-up) XXX
1054	 * - this makes the probe invasive! ...Done against my better
1055	 * judgement. -DLG
1056	 */
1057	ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP);
1058	DELAY(5000);
1059
1060	/* Make sure that we really have an 8390 based board */
1061	if (!ed98_probe_generic8390(sc))
1062		return (ENXIO);
1063
1064	/*
1065	 *  Set window ethernet address area
1066	 *    board memory base 0x480000  data 256byte
1067	 */
1068	ed_winsel_CNET98(sc, 0x4800);
1069
1070	/*
1071	 * Get station address from on-board ROM
1072	 */
1073	bus_space_read_region_1(sc->mem_bst, sc->mem_bsh, sc->mem_start,
1074	    sc->enaddr, ETHER_ADDR_LEN);
1075
1076	sc->vendor    = ED_VENDOR_MISC;
1077	sc->type_str  = "CNET98";
1078	sc->isa16bit  = 0;
1079	sc->cr_proto  = ED_CR_RD2;
1080
1081	/*
1082	 * Set window buffer memory area
1083	 *    board memory base 0x400000  data 16kbyte
1084	 */
1085	ed_winsel_CNET98(sc, 0x4000);
1086
1087	error = ed_clear_memory(dev);
1088	if (error)
1089		return (error);
1090
1091	sc->mem_shared = 1;
1092	sc->mem_end = sc->mem_start + sc->mem_size;
1093
1094	sc->txb_cnt = 1;	/* XXX */
1095	sc->tx_page_start = 0;
1096
1097	sc->rec_page_start = sc->tx_page_start + ED_TXBUF_SIZE;
1098	sc->rec_page_stop = sc->tx_page_start + sc->mem_size / ED_PAGE_SIZE;
1099
1100	sc->mem_ring = sc->mem_start + ED_PAGE_SIZE * ED_TXBUF_SIZE;
1101
1102	/*
1103	 *   Set interrupt level
1104	 */
1105	error = bus_get_resource(dev, SYS_RES_IRQ, 0, &conf_irq, &junk);
1106	if (error)
1107		return (error);
1108
1109	switch (conf_irq) {
1110	case 3:
1111		tmp = ED_CNET98_INT_IRQ3;
1112		break;
1113	case 5:
1114		tmp = ED_CNET98_INT_IRQ5;
1115		break;
1116	case 6:
1117		tmp = ED_CNET98_INT_IRQ6;
1118		break;
1119	case 9:
1120		tmp = ED_CNET98_INT_IRQ9;
1121		break;
1122	case 12:
1123		tmp = ED_CNET98_INT_IRQ12;
1124		break;
1125	case 13:
1126		tmp = ED_CNET98_INT_IRQ13;
1127		break;
1128	default:
1129		device_printf(dev, "Invalid irq configuration (%ld) must be "
1130			"%s for %s\n", conf_irq, "3,5,6,9,12,13", "CNET98");
1131		return (ENXIO);
1132	}
1133	ed_asic_outb(sc, ED_CNET98_INT_LEV, tmp);
1134	DELAY(1000);
1135	/*
1136	 *   Set interrupt mask.
1137	 *     bit7:1 all interrupt mask
1138	 *     bit1:1 timer interrupt mask
1139	 *     bit0:0 NS controler interrupt enable
1140	 */
1141	ed_asic_outb(sc, ED_CNET98_INT_MASK, 0x7e);
1142	DELAY(1000);
1143
1144	sc->sc_write_mbufs = ed_shmem_write_mbufs;
1145	return (0);
1146}
1147
1148/*
1149 * Probe and vendor-specific initialization routine for C-NET(98)E/L boards
1150 */
1151static int
1152ed_probe_CNET98EL(device_t dev, int port_rid, int flags)
1153{
1154	struct ed_softc *sc = device_get_softc(dev);
1155	int error;
1156	int i;
1157	u_char romdata[ETHER_ADDR_LEN * 2], tmp;
1158	u_long conf_irq, junk;
1159
1160	error = ed98_alloc_port(dev, port_rid);
1161	if (error)
1162		return (error);
1163
1164	sc->asic_offset = ED_NOVELL_ASIC_OFFSET;
1165	sc->nic_offset  = ED_NOVELL_NIC_OFFSET;
1166
1167	/* Check I/O address. 0x[0-f]3d0 are allowed. */
1168	if ((rman_get_start(sc->port_res) & 0x0fff) != 0x03d0) {
1169#ifdef DIAGNOSTIC
1170		device_printf(dev, "Invalid i/o port configuration (0x%lx) "
1171			"must be %s for %s\n", rman_get_start(sc->port_res),
1172			"0x?3d0", "CNET98E/L");
1173#endif
1174		return (ENXIO);
1175	}
1176
1177	/* Reset the board */
1178	ed_reset_CNET98(sc, flags);
1179
1180	/*
1181	 * This is needed because some NE clones apparently don't reset the
1182	 * NIC properly (or the NIC chip doesn't reset fully on power-up) XXX
1183	 * - this makes the probe invasive! ...Done against my better
1184	 * judgement. -DLG
1185	 */
1186	ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP);
1187	DELAY(5000);
1188
1189	/* Make sure that we really have an 8390 based board */
1190	if (!ed98_probe_generic8390(sc))
1191		return (ENXIO);
1192
1193	/* Test memory via PIO */
1194	sc->cr_proto = ED_CR_RD2;
1195	if (!ed_pio_testmem(sc, ED_CNET98EL_PAGE_OFFSET, 1, flags))
1196		return (ENXIO);
1197
1198	/* This looks like a C-NET(98)E/L board. */
1199	sc->type_str = "CNET98E/L";
1200
1201	/*
1202	 * Set IRQ. C-NET(98)E/L only allows a choice of irq 3,5,6.
1203	 */
1204	error = bus_get_resource(dev, SYS_RES_IRQ, 0, &conf_irq, &junk);
1205	if (error)
1206		return (error);
1207
1208	switch (conf_irq) {
1209	case 3:
1210		tmp = ED_CNET98EL_ICR_IRQ3;
1211		break;
1212	case 5:
1213		tmp = ED_CNET98EL_ICR_IRQ5;
1214		break;
1215	case 6:
1216		tmp = ED_CNET98EL_ICR_IRQ6;
1217		break;
1218#if 0
1219	case 12:
1220		tmp = ED_CNET98EL_ICR_IRQ12;
1221		break;
1222#endif
1223	default:
1224		device_printf(dev, "Invalid irq configuration (%ld) must be "
1225			"%s for %s\n", conf_irq, "3,5,6", "CNET98E/L");
1226		return (ENXIO);
1227	}
1228	ed_asic_outb(sc, ED_CNET98EL_ICR, tmp);
1229	ed_asic_outb(sc, ED_CNET98EL_IMR, 0x7e);
1230
1231	/* Get station address from on-board ROM */
1232	ed_pio_readmem(sc, 16384, romdata, sizeof(romdata));
1233	for (i = 0; i < ETHER_ADDR_LEN; i++)
1234		sc->enaddr[i] = romdata[i * 2];
1235
1236	/* clear any pending interrupts that might have occurred above */
1237	ed_nic_outb(sc, ED_P0_ISR, 0xff);
1238
1239	sc->sc_write_mbufs = ed_pio_write_mbufs;
1240	return (0);
1241}
1242
1243/*
1244 * Probe and vendor-specific initialization routine for PC-9801-77 boards
1245 */
1246static int
1247ed_probe_NEC77(device_t dev, int port_rid, int flags)
1248{
1249	struct ed_softc *sc = device_get_softc(dev);
1250	int error;
1251	u_char tmp;
1252	u_long conf_irq, junk;
1253
1254	error = ed98_probe_Novell(dev, port_rid, flags);
1255	if (error)
1256		return (error);
1257
1258	/* LA/T-98 does not need IRQ setting. */
1259	if (ED_TYPE98SUB(flags) == 0)
1260		return (0);
1261
1262	/*
1263	 * Set IRQ. PC-9801-77 only allows a choice of irq 3,5,6,12,13.
1264	 */
1265	error = bus_get_resource(dev, SYS_RES_IRQ, 0, &conf_irq, &junk);
1266	if (error)
1267		return (error);
1268
1269	switch (conf_irq) {
1270	case 3:
1271		tmp = ED_NEC77_IRQ3;
1272		break;
1273	case 5:
1274		tmp = ED_NEC77_IRQ5;
1275		break;
1276	case 6:
1277		tmp = ED_NEC77_IRQ6;
1278		break;
1279	case 12:
1280		tmp = ED_NEC77_IRQ12;
1281		break;
1282	case 13:
1283		tmp = ED_NEC77_IRQ13;
1284		break;
1285	default:
1286		device_printf(dev, "Invalid irq configuration (%ld) must be "
1287			"%s for %s\n", conf_irq, "3,5,6,12,13", "PC-9801-77");
1288		return (ENXIO);
1289	}
1290	ed_asic_outb(sc, ED_NEC77_IRQ, tmp);
1291
1292	return (0);
1293}
1294
1295/*
1296 * Probe and vendor-specific initialization routine for EC/EP-98X boards
1297 */
1298static int
1299ed_probe_NW98X(device_t dev, int port_rid, int flags)
1300{
1301	struct ed_softc *sc = device_get_softc(dev);
1302	int error;
1303	u_char tmp;
1304	u_long conf_irq, junk;
1305
1306	error = ed98_probe_Novell(dev, port_rid, flags);
1307	if (error)
1308		return (error);
1309
1310	/* Networld 98X3 does not need IRQ setting. */
1311	if (ED_TYPE98SUB(flags) == 0)
1312		return (0);
1313
1314	/*
1315	 * Set IRQ. EC/EP-98X only allows a choice of irq 3,5,6,12,13.
1316	 */
1317	error = bus_get_resource(dev, SYS_RES_IRQ, 0, &conf_irq, &junk);
1318	if (error)
1319		return (error);
1320
1321	switch (conf_irq) {
1322	case 3:
1323		tmp = ED_NW98X_IRQ3;
1324		break;
1325	case 5:
1326		tmp = ED_NW98X_IRQ5;
1327		break;
1328	case 6:
1329		tmp = ED_NW98X_IRQ6;
1330		break;
1331	case 12:
1332		tmp = ED_NW98X_IRQ12;
1333		break;
1334	case 13:
1335		tmp = ED_NW98X_IRQ13;
1336		break;
1337	default:
1338		device_printf(dev, "Invalid irq configuration (%ld) must be "
1339			"%s for %s\n", conf_irq, "3,5,6,12,13", "EC/EP-98X");
1340		return (ENXIO);
1341	}
1342	ed_asic_outb(sc, ED_NW98X_IRQ, tmp);
1343
1344	return (0);
1345}
1346
1347/*
1348 * Read SB-9801 station address from Serial Two-Wire EEPROM
1349 */
1350static void
1351ed_get_SB98(struct ed_softc *sc)
1352{
1353	int i, j;
1354	u_char mask, val;
1355
1356        /* enable EEPROM acceess */
1357        ed_asic_outb(sc, ED_SB98_EEPENA, ED_SB98_EEPENA_ENABLE);
1358
1359	/* output start command */
1360	ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA | ED_SB98_EEP_SCL);
1361	DELAY(ED_SB98_EEP_DELAY);
1362	ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SCL);
1363	DELAY(ED_SB98_EEP_DELAY);
1364
1365       	/* output address (7bit) */
1366	for (mask = 0x40; mask != 0; mask >>= 1) {
1367		val = 0;
1368		if (ED_SB98_ADDRESS & mask)
1369			val = ED_SB98_EEP_SDA;
1370		ed_asic_outb(sc, ED_SB98_EEP, val);
1371		DELAY(ED_SB98_EEP_DELAY);
1372		ed_asic_outb(sc, ED_SB98_EEP, val | ED_SB98_EEP_SCL);
1373		DELAY(ED_SB98_EEP_DELAY);
1374	}
1375
1376	/* output READ command */
1377	ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_READ);
1378	DELAY(ED_SB98_EEP_DELAY);
1379	ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_READ | ED_SB98_EEP_SCL);
1380	DELAY(ED_SB98_EEP_DELAY);
1381
1382	/* read station address */
1383	for (i = 0; i < ETHER_ADDR_LEN; i++) {
1384		/* output ACK */
1385		ed_asic_outb(sc, ED_SB98_EEP, 0);
1386		DELAY(ED_SB98_EEP_DELAY);
1387		ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SCL);
1388		DELAY(ED_SB98_EEP_DELAY);
1389
1390		val = 0;
1391		for (j = 0; j < 8; j++) {
1392			ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA);
1393			DELAY(ED_SB98_EEP_DELAY);
1394			ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA | ED_SB98_EEP_SCL);
1395			DELAY(ED_SB98_EEP_DELAY);
1396			val <<= 1;
1397			val |= (ed_asic_inb(sc, ED_SB98_EEP) & ED_SB98_EEP_SDA);
1398			DELAY(ED_SB98_EEP_DELAY);
1399	  	}
1400		sc->enaddr[i] = val;
1401	}
1402
1403	/* output Last ACK */
1404        ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA);
1405        DELAY(ED_SB98_EEP_DELAY);
1406        ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA | ED_SB98_EEP_SCL);
1407        DELAY(ED_SB98_EEP_DELAY);
1408
1409	/* output stop command */
1410	ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SCL);
1411	DELAY(ED_SB98_EEP_DELAY);
1412	ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA | ED_SB98_EEP_SCL);
1413	DELAY(ED_SB98_EEP_DELAY);
1414
1415	/* disable EEPROM access */
1416	ed_asic_outb(sc, ED_SB98_EEPENA, ED_SB98_EEPENA_DISABLE);
1417}
1418
1419/*
1420 * Probe and vendor-specific initialization routine for SB-9801 boards
1421 */
1422static int
1423ed_probe_SB98(device_t dev, int port_rid, int flags)
1424{
1425	struct ed_softc *sc = device_get_softc(dev);
1426	int error;
1427	u_char tmp;
1428	u_long conf_irq, junk;
1429
1430	error = ed98_alloc_port(dev, port_rid);
1431	if (error)
1432		return (error);
1433
1434	sc->asic_offset = ED_NOVELL_ASIC_OFFSET;
1435	sc->nic_offset  = ED_NOVELL_NIC_OFFSET;
1436
1437	/* Check I/O address. 00d[02468ace] are allowed. */
1438	if ((rman_get_start(sc->port_res) & ~0x000e) != 0x00d0) {
1439#ifdef DIAGNOSTIC
1440		device_printf(dev, "Invalid i/o port configuration (0x%lx) "
1441		    "must be %s for %s\n", rman_get_start(sc->port_res),
1442		    "0xd?", "SB9801");
1443#endif
1444		return (ENXIO);
1445	}
1446
1447	/* Write I/O port address and read 4 times */
1448	outb(ED_SB98_IO_INHIBIT, rman_get_start(sc->port_res) & 0xff);
1449	(void) inb(ED_SB98_IO_INHIBIT); DELAY(300);
1450	(void) inb(ED_SB98_IO_INHIBIT); DELAY(300);
1451	(void) inb(ED_SB98_IO_INHIBIT); DELAY(300);
1452	(void) inb(ED_SB98_IO_INHIBIT); DELAY(300);
1453
1454	/*
1455	 * Check IRQ. Soliton SB-9801 only allows a choice of
1456	 * irq 3,5,6,12
1457	 */
1458	error = bus_get_resource(dev, SYS_RES_IRQ, 0, &conf_irq, &junk);
1459	if (error)
1460		return (error);
1461
1462	switch (conf_irq) {
1463	case 3:
1464		tmp = ED_SB98_CFG_IRQ3;
1465		break;
1466	case 5:
1467		tmp = ED_SB98_CFG_IRQ5;
1468		break;
1469	case 6:
1470		tmp = ED_SB98_CFG_IRQ6;
1471		break;
1472	case 12:
1473		tmp = ED_SB98_CFG_IRQ12;
1474		break;
1475	default:
1476		device_printf(dev, "Invalid irq configuration (%ld) must be "
1477			"%s for %s\n", conf_irq, "3,5,6,12", "SB9801");
1478		return (ENXIO);
1479	}
1480
1481	if (flags & ED_FLAGS_DISABLE_TRANCEIVER)
1482		tmp |= ED_SB98_CFG_ALTPORT;
1483	ed_asic_outb(sc, ED_SB98_CFG, ED_SB98_CFG_ENABLE | tmp);
1484	ed_asic_outb(sc, ED_SB98_POLARITY, 0x01);
1485
1486	/* Reset the board. */
1487	ed_asic_outb(sc, ED_NOVELL_RESET, 0x7a);
1488	DELAY(300);
1489	ed_asic_outb(sc, ED_NOVELL_RESET, 0x79);
1490	DELAY(300);
1491
1492	/*
1493	 * This is needed because some NE clones apparently don't reset the
1494	 * NIC properly (or the NIC chip doesn't reset fully on power-up) XXX
1495	 * - this makes the probe invasive! ...Done against my better
1496	 * judgement. -DLG
1497	 */
1498	ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP);
1499	DELAY(5000);
1500
1501	/* Make sure that we really have an 8390 based board */
1502	if (!ed98_probe_generic8390(sc))
1503		return (ENXIO);
1504
1505	/* Test memory via PIO */
1506	sc->cr_proto = ED_CR_RD2;
1507	if (!ed_pio_testmem(sc, 16384, 1, flags))
1508		return (ENXIO);
1509
1510	/* This looks like an SB9801 board. */
1511	sc->type_str = "SB9801";
1512
1513	/* Get station address */
1514	ed_get_SB98(sc);
1515
1516	/* clear any pending interrupts that might have occurred above */
1517	ed_nic_outb(sc, ED_P0_ISR, 0xff);
1518
1519	sc->sc_write_mbufs = ed_pio_write_mbufs;
1520	return (0);
1521}
1522
1523/*
1524 * Test the ability to read and write to the NIC memory.
1525 */
1526static int
1527ed_pio_testmem(struct ed_softc *sc, int page_offset, int isa16bit, int flags)
1528{
1529	u_long memsize;
1530	static char test_pattern[32] = "THIS is A memory TEST pattern";
1531	char test_buffer[32];
1532#ifdef DIAGNOSTIC
1533	int page_end;
1534#endif
1535
1536	sc->vendor = ED_VENDOR_NOVELL;
1537	sc->mem_shared = 0;
1538	sc->isa16bit = isa16bit;
1539
1540	/* 8k of memory plus an additional 8k if 16bit */
1541	memsize = (isa16bit ? 16384 : 8192);
1542
1543	/*
1544	 * This prevents packets from being stored in the NIC memory when the
1545	 * readmem routine turns on the start bit in the CR.
1546	 */
1547	ed_nic_outb(sc, ED_P0_RCR, ED_RCR_MON);
1548
1549	/* Initialize DCR for byte/word operations */
1550	if (isa16bit)
1551		ed_nic_outb(sc, ED_P0_DCR, ED_DCR_WTS | ED_DCR_FT1 | ED_DCR_LS);
1552	else
1553		ed_nic_outb(sc, ED_P0_DCR, ED_DCR_FT1 | ED_DCR_LS);
1554	ed_nic_outb(sc, ED_P0_PSTART, page_offset / ED_PAGE_SIZE);
1555	ed_nic_outb(sc, ED_P0_PSTOP, (page_offset + memsize) / ED_PAGE_SIZE);
1556#ifdef ED_DEBUG
1557	printf("ed?: ed_pio_testmem: page start=%x, end=%lx",
1558	    page_offset, page_offset + memsize);
1559#endif
1560
1561	/*
1562	 * Write a test pattern. If this fails, then we don't know
1563	 * what this board is.
1564	 */
1565	ed_pio_writemem(sc, test_pattern, page_offset, sizeof(test_pattern));
1566	ed_pio_readmem(sc, page_offset, test_buffer, sizeof(test_pattern));
1567
1568	if (bcmp(test_pattern, test_buffer, sizeof(test_pattern))) {
1569#ifdef ED_DEBUG
1570		printf("ed?: ed_pio_testmem: bcmp(page %x) NG", page_offset);
1571#endif
1572		return (0);
1573	}
1574
1575#ifdef DIAGNOSTIC
1576	/* Check the bottom. */
1577	page_end = page_offset + memsize - ED_PAGE_SIZE;
1578	ed_pio_writemem(sc, test_pattern, page_end, sizeof(test_pattern));
1579	ed_pio_readmem(sc, page_end, test_buffer, sizeof(test_pattern));
1580
1581	if (bcmp(test_pattern, test_buffer, sizeof(test_pattern))) {
1582#ifdef ED_DEBUG
1583		printf("ed?: ed_pio_testmem: bcmp(page %x) NG", page_end);
1584#endif
1585		return (0);
1586	}
1587#endif
1588	sc->mem_size = memsize;
1589	sc->mem_start = page_offset;
1590	sc->mem_end   = sc->mem_start + memsize;
1591	sc->tx_page_start = page_offset / ED_PAGE_SIZE;
1592
1593	/*
1594	 * Use one xmit buffer if < 16k, two buffers otherwise (if not told
1595	 * otherwise).
1596	 */
1597	if ((memsize < 16384) || (flags & ED_FLAGS_NO_MULTI_BUFFERING))
1598		sc->txb_cnt = 1;
1599	else
1600		sc->txb_cnt = 2;
1601
1602	sc->rec_page_start = sc->tx_page_start + sc->txb_cnt * ED_TXBUF_SIZE;
1603	sc->rec_page_stop  = sc->tx_page_start + memsize / ED_PAGE_SIZE;
1604
1605	sc->mem_ring = sc->mem_start + sc->txb_cnt * ED_PAGE_SIZE * ED_TXBUF_SIZE;
1606
1607	return (1);
1608}
1609
1610static device_method_t ed_cbus_methods[] = {
1611	/* Device interface */
1612	DEVMETHOD(device_probe,		ed_cbus_probe),
1613	DEVMETHOD(device_attach,	ed_cbus_attach),
1614	DEVMETHOD(device_detach,	ed_detach),
1615
1616	{ 0, 0 }
1617};
1618
1619static driver_t ed_cbus_driver = {
1620	"ed",
1621	ed_cbus_methods,
1622	sizeof(struct ed_softc)
1623};
1624
1625DRIVER_MODULE(ed, isa, ed_cbus_driver, ed_devclass, 0, 0);
1626MODULE_DEPEND(ed, isa, 1, 1, 1);
1627MODULE_DEPEND(ed, ether, 1, 1, 1);
1628