2 * Copyright (c) 2000 Atsushi Onoe <onoe@sm.sony.co.jp>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 * $FreeBSD: src/sys/dev/awi/if_awi_pccard.c,v 1.5.2.1 2000/12/07 04:09:39 imp Exp $
26 * $DragonFly: src/sys/dev/netif/awi/Attic/if_awi_pccard.c,v 1.17 2006/10/25 20:55:56 dillon Exp $
29 #include <sys/param.h>
30 #include <sys/systm.h>
31 #include <sys/kernel.h>
32 #include <sys/socket.h>
33 #include <sys/module.h>
38 #include <net/if_arp.h>
39 #include <net/if_media.h>
40 #include <net/ethernet.h>
41 #include <netproto/802_11/ieee80211.h>
42 #include <netproto/802_11/ieee80211_ioctl.h>
44 #include <machine/clock.h>
46 #include "am79c930reg.h"
47 #include "am79c930var.h"
51 #include <bus/pccard/pccardvar.h>
52 #include <bus/pccard/pccarddevs.h>
55 struct awi_pccard_softc
{
56 struct awi_softc sc_awi
;
58 u_int8_t sc_version
[AWI_BANNER_LEN
];
61 struct resource
*sc_irq_res
;
63 struct resource
*sc_port_res
;
65 struct resource
*sc_mem_res
;
69 static const struct pccard_product awi_pccard_products
[] = {
70 PCMCIA_CARD(AMD
, AM79C930
, 0),
71 PCMCIA_CARD(BAY
, STACK_650
, 0),
72 PCMCIA_CARD(BAY
, STACK_660
, 0),
73 PCMCIA_CARD(BAY
, SURFER_PRO
, 0),
74 PCMCIA_CARD(ICOM
, SL200
, 0),
75 PCMCIA_CARD(NOKIA
, C020_WLAN
, 0),
76 PCMCIA_CARD(FARALLON
, SKYLINE
, 0),
77 PCMCIA_CARD(ZOOM
, AIR_4000
, 0),
81 static int awi_pccard_match(device_t
);
82 static int awi_pccard_probe(device_t
);
83 static int awi_pccard_attach(device_t
);
84 static int awi_pccard_detach(device_t
);
87 awi_pccard_match(device_t dev
)
89 const struct pccard_product
*pp
;
91 if ((pp
= pccard_product_lookup(dev
, awi_pccard_products
,
92 sizeof(awi_pccard_products
[0]), NULL
)) != NULL
) {
93 if (pp
->pp_name
!= NULL
)
94 device_set_desc(dev
, pp
->pp_name
);
101 * Initialize the device - called from Slot manager.
104 awi_pccard_probe(device_t dev
)
106 struct awi_pccard_softc
*psc
= device_get_softc(dev
);
107 struct awi_softc
*sc
= &psc
->sc_awi
;
110 psc
->sc_port_rid
= 0;
111 psc
->sc_port_res
= bus_alloc_resource(dev
, SYS_RES_IOPORT
,
112 &psc
->sc_port_rid
, 0, ~0, 16, RF_ACTIVE
);
113 if (!psc
->sc_port_res
)
116 sc
->sc_chip
.sc_iot
= rman_get_bustag(psc
->sc_port_res
);
117 sc
->sc_chip
.sc_ioh
= rman_get_bushandle(psc
->sc_port_res
);
118 am79c930_chip_init(&sc
->sc_chip
, 0);
121 awi_read_bytes(sc
, AWI_BANNER
, psc
->sc_version
, AWI_BANNER_LEN
);
122 if (memcmp(psc
->sc_version
, "PCnetMobile:", 12) != 0) {
123 device_printf(dev
, "awi_pccard_probe: bad banner: %12D\n",
124 psc
->sc_version
, " ");
127 device_set_desc(dev
, psc
->sc_version
);
128 bus_release_resource(dev
, SYS_RES_IOPORT
, psc
->sc_port_rid
,
135 awi_pccard_attach(device_t dev
)
137 struct awi_pccard_softc
*psc
= device_get_softc(dev
);
138 struct awi_softc
*sc
= &psc
->sc_awi
;
139 struct ifnet
*ifp
= &sc
->sc_ec
.ac_if
;
142 psc
->sc_port_res
= 0;
145 psc
->sc_intrhand
= 0;
147 if_initname(ifp
, device_get_name(dev
), device_get_unit(dev
));
149 psc
->sc_port_rid
= 0;
150 psc
->sc_port_res
= bus_alloc_resource(dev
, SYS_RES_IOPORT
,
151 &psc
->sc_port_rid
, 0, ~0, 16, RF_ACTIVE
);
152 if (!psc
->sc_port_res
) {
153 device_printf(dev
, "awi_pccard_attach: port alloc failed\n");
156 sc
->sc_chip
.sc_iot
= rman_get_bustag(psc
->sc_port_res
);
157 sc
->sc_chip
.sc_ioh
= rman_get_bushandle(psc
->sc_port_res
);
160 psc
->sc_irq_res
= bus_alloc_resource_any(dev
, SYS_RES_IRQ
,
161 &psc
->sc_irq_rid
, RF_ACTIVE
);
162 if (!psc
->sc_irq_res
) {
163 device_printf(dev
, "awi_pccard_attach: irq alloc failed\n");
170 * XXX: awi needs to access memory with 8bit,
171 * but pccardd apparently maps memory with MDF_16BITS flag.
172 * So memory mapped access is disabled and use IO port instead.
176 psc
->sc_mem_res
= bus_alloc_resource(dev
, SYS_RES_MEMORY
,
177 &psc
->sc_mem_rid
, 0, ~0, 0x8000, RF_ACTIVE
);
179 if (psc
->sc_mem_res
) {
180 sc
->sc_chip
.sc_memt
= rman_get_bustag(psc
->sc_mem_res
);
181 sc
->sc_chip
.sc_memh
= rman_get_bushandle(psc
->sc_mem_res
);
182 am79c930_chip_init(&sc
->sc_chip
, 1);
184 am79c930_chip_init(&sc
->sc_chip
, 0);
187 sc
->sc_ifp
= &sc
->sc_ec
.ac_if
;
189 error
= awi_attach(sc
);
190 sc
->sc_enabled
= 0; /*XXX*/
193 device_printf(dev
, "awi_pccard_attach: awi_attach failed\n");
197 error
= bus_setup_intr(dev
, psc
->sc_irq_res
, INTR_NETSAFE
,
198 (void (*)(void *))awi_intr
, sc
,
199 &psc
->sc_intrhand
, sc
->sc_ifp
->if_serializer
);
201 device_printf(dev
, "awi_pccard_attach: intr setup failed\n");
207 if (psc
->sc_intrhand
) {
208 bus_teardown_intr(dev
, psc
->sc_irq_res
, psc
->sc_intrhand
);
209 psc
->sc_intrhand
= 0;
211 if (psc
->sc_port_res
) {
212 bus_release_resource(dev
, SYS_RES_IOPORT
, psc
->sc_port_rid
,
214 psc
->sc_port_res
= 0;
216 if (psc
->sc_irq_res
) {
217 bus_release_resource(dev
, SYS_RES_IRQ
, psc
->sc_irq_rid
,
221 if (psc
->sc_mem_res
) {
222 bus_release_resource(dev
, SYS_RES_MEMORY
, psc
->sc_mem_rid
,
232 awi_pccard_detach(device_t dev
)
234 struct awi_pccard_softc
*psc
= device_get_softc(dev
);
235 struct awi_softc
*sc
= &psc
->sc_awi
;
236 struct ifnet
*ifp
= &sc
->sc_ec
.ac_if
;
238 lwkt_serialize_enter(ifp
->if_serializer
);
239 ifp
->if_flags
&= ~IFF_RUNNING
;
240 if (psc
->sc_intrhand
) {
241 bus_teardown_intr(dev
, psc
->sc_irq_res
, psc
->sc_intrhand
);
242 psc
->sc_intrhand
= 0;
244 lwkt_serialize_exit(ifp
->if_serializer
);
248 if (psc
->sc_port_res
) {
249 bus_release_resource(dev
, SYS_RES_IOPORT
, psc
->sc_port_rid
,
251 psc
->sc_port_res
= 0;
253 if (psc
->sc_irq_res
) {
254 bus_release_resource(dev
, SYS_RES_IRQ
, psc
->sc_irq_rid
,
258 if (psc
->sc_mem_res
) {
259 bus_release_resource(dev
, SYS_RES_MEMORY
, psc
->sc_mem_rid
,
266 static device_method_t awi_pccard_methods
[] = {
267 /* Device interface */
268 DEVMETHOD(device_probe
, pccard_compat_probe
),
269 DEVMETHOD(device_attach
, pccard_compat_attach
),
270 DEVMETHOD(device_detach
, awi_pccard_detach
),
273 DEVMETHOD(card_compat_match
, awi_pccard_match
),
274 DEVMETHOD(card_compat_probe
, awi_pccard_probe
),
275 DEVMETHOD(card_compat_attach
, awi_pccard_attach
),
280 static driver_t awi_pccard_driver
= {
283 sizeof(struct awi_pccard_softc
),
286 extern devclass_t awi_devclass
;
288 DRIVER_MODULE(if_awi
, pccard
, awi_pccard_driver
, awi_devclass
, 0, 0);