xref: /netbsd/sys/arch/amiga/dev/if_ne_xsurf.c (revision 174eab5f)
1*174eab5fSrkujawa /*	$NetBSD: if_ne_xsurf.c,v 1.1 2012/05/15 17:35:44 rkujawa Exp $ */
2*174eab5fSrkujawa 
3*174eab5fSrkujawa /*-
4*174eab5fSrkujawa  * Copyright (c) 1998 The NetBSD Foundation, Inc.
5*174eab5fSrkujawa  * All rights reserved.
6*174eab5fSrkujawa  *
7*174eab5fSrkujawa  * This code is derived from software contributed to The NetBSD Foundation
8*174eab5fSrkujawa  * by Bernd Ernesti.
9*174eab5fSrkujawa  *
10*174eab5fSrkujawa  * Redistribution and use in source and binary forms, with or without
11*174eab5fSrkujawa  * modification, are permitted provided that the following conditions
12*174eab5fSrkujawa  * are met:
13*174eab5fSrkujawa  * 1. Redistributions of source code must retain the above copyright
14*174eab5fSrkujawa  *    notice, this list of conditions and the following disclaimer.
15*174eab5fSrkujawa  * 2. Redistributions in binary form must reproduce the above copyright
16*174eab5fSrkujawa  *    notice, this list of conditions and the following disclaimer in the
17*174eab5fSrkujawa  *    documentation and/or other materials provided with the distribution.
18*174eab5fSrkujawa  *
19*174eab5fSrkujawa  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20*174eab5fSrkujawa  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21*174eab5fSrkujawa  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22*174eab5fSrkujawa  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23*174eab5fSrkujawa  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*174eab5fSrkujawa  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*174eab5fSrkujawa  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*174eab5fSrkujawa  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*174eab5fSrkujawa  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*174eab5fSrkujawa  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*174eab5fSrkujawa  * POSSIBILITY OF SUCH DAMAGE.
30*174eab5fSrkujawa  */
31*174eab5fSrkujawa 
32*174eab5fSrkujawa #include <sys/cdefs.h>
33*174eab5fSrkujawa 
34*174eab5fSrkujawa /*
35*174eab5fSrkujawa  * X-Surf driver, ne(4) attachment.
36*174eab5fSrkujawa  */
37*174eab5fSrkujawa 
38*174eab5fSrkujawa #include <sys/param.h>
39*174eab5fSrkujawa #include <sys/device.h>
40*174eab5fSrkujawa #include <sys/malloc.h>
41*174eab5fSrkujawa #include <sys/mbuf.h>
42*174eab5fSrkujawa #include <sys/socket.h>
43*174eab5fSrkujawa #include <sys/syslog.h>
44*174eab5fSrkujawa #include <sys/systm.h>
45*174eab5fSrkujawa #include <sys/bus.h>
46*174eab5fSrkujawa 
47*174eab5fSrkujawa #include <net/if.h>
48*174eab5fSrkujawa #include <net/if_media.h>
49*174eab5fSrkujawa #include <net/if_ether.h>
50*174eab5fSrkujawa 
51*174eab5fSrkujawa #include <dev/ic/dp8390reg.h>
52*174eab5fSrkujawa #include <dev/ic/dp8390var.h>
53*174eab5fSrkujawa 
54*174eab5fSrkujawa #include <dev/ic/ne2000reg.h>
55*174eab5fSrkujawa #include <dev/ic/ne2000var.h>
56*174eab5fSrkujawa 
57*174eab5fSrkujawa #include <dev/ic/rtl80x9reg.h>
58*174eab5fSrkujawa #include <dev/ic/rtl80x9var.h>
59*174eab5fSrkujawa 
60*174eab5fSrkujawa #include <amiga/amiga/device.h>
61*174eab5fSrkujawa #include <amiga/amiga/isr.h>
62*174eab5fSrkujawa 
63*174eab5fSrkujawa #include <amiga/dev/xsurfvar.h>
64*174eab5fSrkujawa #include <amiga/dev/zbusvar.h>
65*174eab5fSrkujawa 
66*174eab5fSrkujawa int	ne_xsurf_match(device_t, cfdata_t , void *);
67*174eab5fSrkujawa void	ne_xsurf_attach(device_t, device_t, void *);
68*174eab5fSrkujawa 
69*174eab5fSrkujawa struct ne_xsurf_softc {
70*174eab5fSrkujawa 	struct ne2000_softc	sc_ne2000;
71*174eab5fSrkujawa 	struct bus_space_tag	sc_bst;
72*174eab5fSrkujawa 	struct isr		sc_isr;
73*174eab5fSrkujawa };
74*174eab5fSrkujawa 
75*174eab5fSrkujawa CFATTACH_DECL_NEW(ne_xsurf, sizeof(struct ne_xsurf_softc),
76*174eab5fSrkujawa     ne_xsurf_match, ne_xsurf_attach, NULL, NULL);
77*174eab5fSrkujawa 
78*174eab5fSrkujawa /*
79*174eab5fSrkujawa  * The Amiga address are shifted by one bit to the ISA-Bus, but
80*174eab5fSrkujawa  * this is handled by the bus_space functions.
81*174eab5fSrkujawa  */
82*174eab5fSrkujawa #define	NE_XSURF_NPORTS		0x20
83*174eab5fSrkujawa #define	NE_XSURF_NICBASE	0x0300	/* 0x0600 */
84*174eab5fSrkujawa #define	NE_XSURF_NICSIZE	0x10
85*174eab5fSrkujawa #define	NE_XSURF_ASICBASE	0x0310	/* 0x0620 */
86*174eab5fSrkujawa #define	NE_XSURF_ASICSIZE	0x10
87*174eab5fSrkujawa 
88*174eab5fSrkujawa #define XSURF_NE_OFFSET		0x8000
89*174eab5fSrkujawa 
90*174eab5fSrkujawa /*
91*174eab5fSrkujawa  * Clockport offsets.
92*174eab5fSrkujawa  */
93*174eab5fSrkujawa #define XSURF_CP1_BASE		0xA001
94*174eab5fSrkujawa #define XSURF_CP2_BASE		0xC000
95*174eab5fSrkujawa 
96*174eab5fSrkujawa /*
97*174eab5fSrkujawa  * E3B Deneb firmware v11 creates fake X-Surf autoconfig entry.
98*174eab5fSrkujawa  * Do not attach ne driver to this fake card, otherwise kernel panic
99*174eab5fSrkujawa  * may occur.
100*174eab5fSrkujawa  */
101*174eab5fSrkujawa #define DENEB_XSURF_SERNO	0xC0FFEE01	/* Serial of the fake card */
102*174eab5fSrkujawa 
103*174eab5fSrkujawa int
ne_xsurf_match(device_t parent,cfdata_t cf,void * aux)104*174eab5fSrkujawa ne_xsurf_match(device_t parent, cfdata_t cf, void *aux)
105*174eab5fSrkujawa {
106*174eab5fSrkujawa 	struct xsurfbus_attach_args *xap = aux;
107*174eab5fSrkujawa 
108*174eab5fSrkujawa 	if (strcmp(xap->xaa_name, "ne_xsurf") != 0)
109*174eab5fSrkujawa 		return 0;
110*174eab5fSrkujawa 
111*174eab5fSrkujawa 	return 1;
112*174eab5fSrkujawa }
113*174eab5fSrkujawa 
114*174eab5fSrkujawa /*
115*174eab5fSrkujawa  * Install interface into kernel networking data structures.
116*174eab5fSrkujawa  */
117*174eab5fSrkujawa void
ne_xsurf_attach(device_t parent,device_t self,void * aux)118*174eab5fSrkujawa ne_xsurf_attach(device_t parent, device_t self, void *aux)
119*174eab5fSrkujawa {
120*174eab5fSrkujawa 	struct ne_xsurf_softc *zsc = device_private(self);
121*174eab5fSrkujawa 	struct ne2000_softc *nsc = &zsc->sc_ne2000;
122*174eab5fSrkujawa 	struct dp8390_softc *dsc = &nsc->sc_dp8390;
123*174eab5fSrkujawa 
124*174eab5fSrkujawa 	struct xsurfbus_attach_args *xap = aux;
125*174eab5fSrkujawa 
126*174eab5fSrkujawa 	bus_space_tag_t nict = &zsc->sc_bst;
127*174eab5fSrkujawa 	bus_space_handle_t nich;
128*174eab5fSrkujawa 	bus_space_tag_t asict = nict;
129*174eab5fSrkujawa 	bus_space_handle_t asich;
130*174eab5fSrkujawa 
131*174eab5fSrkujawa 	dsc->sc_dev = self;
132*174eab5fSrkujawa 	dsc->sc_mediachange = rtl80x9_mediachange;
133*174eab5fSrkujawa 	dsc->sc_mediastatus = rtl80x9_mediastatus;
134*174eab5fSrkujawa 	dsc->init_card = rtl80x9_init_card;
135*174eab5fSrkujawa 	dsc->sc_media_init = rtl80x9_media_init;
136*174eab5fSrkujawa 
137*174eab5fSrkujawa 	zsc->sc_bst.base = xap->xaa_base;
138*174eab5fSrkujawa 
139*174eab5fSrkujawa 	zsc->sc_bst.absm = &amiga_bus_stride_2;
140*174eab5fSrkujawa 
141*174eab5fSrkujawa 	aprint_normal("\n");
142*174eab5fSrkujawa 
143*174eab5fSrkujawa 	/* Map i/o space. */
144*174eab5fSrkujawa 	if (bus_space_map(nict, NE_XSURF_NICBASE,
145*174eab5fSrkujawa 	    NE_XSURF_NPORTS, 0, &nich)) {
146*174eab5fSrkujawa 		aprint_error_dev(self, "can't map nic i/o space\n");
147*174eab5fSrkujawa 		return;
148*174eab5fSrkujawa 	}
149*174eab5fSrkujawa 
150*174eab5fSrkujawa 	if (bus_space_subregion(nict, nich, NE2000_ASIC_OFFSET,
151*174eab5fSrkujawa 	    NE_XSURF_ASICSIZE, &asich)) {
152*174eab5fSrkujawa 		aprint_error_dev(self, "can't map asic i/o space\n");
153*174eab5fSrkujawa 		return;
154*174eab5fSrkujawa 	}
155*174eab5fSrkujawa 
156*174eab5fSrkujawa 	dsc->sc_regt = nict;
157*174eab5fSrkujawa 	dsc->sc_regh = nich;
158*174eab5fSrkujawa 
159*174eab5fSrkujawa 	nsc->sc_asict = asict;
160*174eab5fSrkujawa 	nsc->sc_asich = asich;
161*174eab5fSrkujawa 
162*174eab5fSrkujawa 	/* This interface is always enabled. */
163*174eab5fSrkujawa 	dsc->sc_enabled = 1;
164*174eab5fSrkujawa 
165*174eab5fSrkujawa 	/*
166*174eab5fSrkujawa 	 * Do generic NE2000 attach.  This will read the station address
167*174eab5fSrkujawa 	 * from the EEPROM.
168*174eab5fSrkujawa 	 */
169*174eab5fSrkujawa 	ne2000_attach(nsc, NULL);
170*174eab5fSrkujawa 
171*174eab5fSrkujawa 	zsc->sc_isr.isr_intr = dp8390_intr;
172*174eab5fSrkujawa 	zsc->sc_isr.isr_arg = dsc;
173*174eab5fSrkujawa 	zsc->sc_isr.isr_ipl = 2;
174*174eab5fSrkujawa 	add_isr(&zsc->sc_isr);
175*174eab5fSrkujawa }
176