if_wi_pccard.c revision 292079
144743Smarkm/*-
244743Smarkm * Copyright (c) 1997, 1998, 1999
344743Smarkm *	Bill Paul <wpaul@ctr.columbia.edu>.  All rights reserved.
444743Smarkm *
544743Smarkm * Redistribution and use in source and binary forms, with or without
644743Smarkm * modification, are permitted provided that the following conditions
744743Smarkm * are met:
844743Smarkm * 1. Redistributions of source code must retain the above copyright
944743Smarkm *    notice, this list of conditions and the following disclaimer.
1044743Smarkm * 2. Redistributions in binary form must reproduce the above copyright
1144743Smarkm *    notice, this list of conditions and the following disclaimer in the
1244743Smarkm *    documentation and/or other materials provided with the distribution.
1344743Smarkm * 3. All advertising materials mentioning features or use of this software
1444743Smarkm *    must display the following acknowledgement:
1544743Smarkm *	This product includes software developed by Bill Paul.
1644743Smarkm * 4. Neither the name of the author nor the names of any co-contributors
1744743Smarkm *    may be used to endorse or promote products derived from this software
1844743Smarkm *    without specific prior written permission.
1944743Smarkm *
2044743Smarkm * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
2144743Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2244743Smarkm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2344743Smarkm * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
2444743Smarkm * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2544743Smarkm * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2644743Smarkm * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2744743Smarkm * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2844743Smarkm * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2944743Smarkm * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
3044743Smarkm * THE POSSIBILITY OF SUCH DAMAGE.
3144743Smarkm */
3244743Smarkm
3344743Smarkm/*
3444743Smarkm * Lucent WaveLAN/IEEE 802.11 PCMCIA driver for FreeBSD.
3544743Smarkm *
3644743Smarkm * Written by Bill Paul <wpaul@ctr.columbia.edu>
3744743Smarkm * Electrical Engineering Department
3844743Smarkm * Columbia University, New York City
3944743Smarkm */
4044743Smarkm
4144743Smarkm#include <sys/cdefs.h>
4244743Smarkm__FBSDID("$FreeBSD: head/sys/dev/wi/if_wi_pccard.c 292079 2015-12-11 05:27:56Z imp $");
4344743Smarkm
4444743Smarkm#include <sys/param.h>
4544743Smarkm#include <sys/kernel.h>
4644743Smarkm#include <sys/malloc.h>
4744743Smarkm#include <sys/socket.h>
4844743Smarkm#include <sys/systm.h>
4944743Smarkm#include <sys/mbuf.h>
5044743Smarkm#include <sys/module.h>
5144743Smarkm#include <sys/bus.h>
5244743Smarkm
5344743Smarkm#include <machine/bus.h>
5444743Smarkm#include <machine/resource.h>
5544743Smarkm#include <sys/rman.h>
5644743Smarkm
5744743Smarkm#include <net/if.h>
5844743Smarkm#include <net/if_arp.h>
5944743Smarkm#include <net/ethernet.h>
6044743Smarkm#include <net/if_dl.h>
6144743Smarkm#include <net/if_media.h>
6244743Smarkm#include <net/if_types.h>
6344743Smarkm
6444743Smarkm#include <net80211/ieee80211_var.h>
6544743Smarkm#include <net80211/ieee80211_radiotap.h>
6644743Smarkm
6744743Smarkm#include <dev/pccard/pccardvar.h>
6844743Smarkm#include <dev/pccard/pccard_cis.h>
6944743Smarkm
7044743Smarkm#include <dev/wi/if_wavelan_ieee.h>
7144743Smarkm#include <dev/wi/if_wireg.h>
7244743Smarkm#include <dev/wi/if_wivar.h>
7344743Smarkm
7444743Smarkm#include "card_if.h"
7544743Smarkm#include "pccarddevs.h"
7644743Smarkm
7744743Smarkmstatic int wi_pccard_probe(device_t);
7844743Smarkmstatic int wi_pccard_attach(device_t);
7944743Smarkm
8044743Smarkmstatic device_method_t wi_pccard_methods[] = {
8144743Smarkm	/* Device interface */
8244743Smarkm	DEVMETHOD(device_probe,		wi_pccard_probe),
8344743Smarkm	DEVMETHOD(device_attach,	wi_pccard_attach),
8444743Smarkm	DEVMETHOD(device_detach,	wi_detach),
8544743Smarkm	DEVMETHOD(device_shutdown,	wi_shutdown),
8644743Smarkm
8744743Smarkm	{ 0, 0 }
8844743Smarkm};
8944743Smarkm
9044743Smarkmstatic driver_t wi_pccard_driver = {
9144743Smarkm	"wi",
9251495Ssheldonh	wi_pccard_methods,
9356977Sshin	sizeof(struct wi_softc)
9456977Sshin};
9556977Sshin
9656977SshinDRIVER_MODULE(wi, pccard, wi_pccard_driver, wi_devclass, 0, 0);
9756977SshinMODULE_DEPEND(wi, wlan, 1, 1, 1);
9856977Sshin
9956977Sshinstatic const struct pccard_product wi_pccard_products[] = {
10051495Ssheldonh	PCMCIA_CARD(3COM, 3CRWE737A),
10151495Ssheldonh	PCMCIA_CARD(3COM, 3CRWE777A),
10251495Ssheldonh	PCMCIA_CARD(ACTIONTEC, PRISM),
10351495Ssheldonh	PCMCIA_CARD(ADAPTEC2, ANW8030),
10451495Ssheldonh	PCMCIA_CARD(ADDTRON, AWP100),
10551495Ssheldonh	PCMCIA_CARD(AIRVAST, WN_100B),
10644743Smarkm	PCMCIA_CARD(AIRVAST, WN_100),
10744743Smarkm	PCMCIA_CARD(ALLIEDTELESIS, WR211PCM),
10844743Smarkm	PCMCIA_CARD(ARTEM, ONAIR),
10944743Smarkm 	PCMCIA_CARD(ASUS, WL100),
11044743Smarkm	PCMCIA_CARD(BAY, EMOBILITY_11B),
11144743Smarkm	PCMCIA_CARD(BROMAX, IWN),
11244743Smarkm	PCMCIA_CARD(BROMAX, IWN3),
11344743Smarkm	PCMCIA_CARD(BROMAX, WCF11),
11444743Smarkm	PCMCIA_CARD(BUFFALO, WLI_CF_S11G),
11544743Smarkm	PCMCIA_CARD(BUFFALO, WLI_PCM_S11),
11644743Smarkm	PCMCIA_CARD(COMPAQ, NC5004),
11744743Smarkm	PCMCIA_CARD(CONTEC, FX_DS110_PCC),
11844743Smarkm	PCMCIA_CARD(COREGA, WIRELESS_LAN_PCC_11),
11944743Smarkm	PCMCIA_CARD(COREGA, WIRELESS_LAN_PCCA_11),
12044743Smarkm	PCMCIA_CARD(COREGA, WIRELESS_LAN_PCCB_11),
12144743Smarkm	PCMCIA_CARD(COREGA, WIRELESS_LAN_PCCL_11),
12244743Smarkm	PCMCIA_CARD(DLINK, DWL650H),
12344743Smarkm	PCMCIA_CARD(ELSA, XI300_IEEE),
12444743Smarkm	PCMCIA_CARD(ELSA, XI325_IEEE),
12544743Smarkm	PCMCIA_CARD(ELSA, APDL325_IEEE),
12644743Smarkm	PCMCIA_CARD(ELSA, XI330_IEEE),
12744743Smarkm	PCMCIA_CARD(ELSA, XI800_IEEE),
12844743Smarkm	PCMCIA_CARD(ELSA, WIFI_FLASH),
12944743Smarkm	PCMCIA_CARD(EMTAC, WLAN),
13044743Smarkm	PCMCIA_CARD(ERICSSON, WIRELESSLAN),
13144743Smarkm	PCMCIA_CARD(GEMTEK, WLAN),
13244743Smarkm	PCMCIA_CARD(HWN, AIRWAY80211),
13344743Smarkm	PCMCIA_CARD(INTEL, PRO_WLAN_2011),
13444743Smarkm	PCMCIA_CARD(INTERSIL, ISL37100P),
13544743Smarkm	PCMCIA_CARD(INTERSIL, ISL37110P),
13644743Smarkm	PCMCIA_CARD(INTERSIL, ISL37300P),
13744743Smarkm	PCMCIA_CARD(INTERSIL2, PRISM2),
13844743Smarkm	PCMCIA_CARD(IODATA2, WCF12),
13944743Smarkm	PCMCIA_CARD(IODATA2, WNB11PCM),
14044743Smarkm	PCMCIA_CARD(FUJITSU, WL110),
14144743Smarkm	PCMCIA_CARD(LUCENT, WAVELAN_IEEE),
14244743Smarkm	PCMCIA_CARD(MICROSOFT, MN_520),
14344743Smarkm	PCMCIA_CARD(NOKIA, C020_WLAN),
14444743Smarkm	PCMCIA_CARD(NOKIA, C110_WLAN),
14544743Smarkm	PCMCIA_CARD(PLANEX, GWNS11H),
14644743Smarkm	PCMCIA_CARD(PROXIM, HARMONY),
14744743Smarkm	PCMCIA_CARD(PROXIM, RANGELANDS_8430),
14844743Smarkm	PCMCIA_CARD(SAMSUNG, SWL_2000N),
14944743Smarkm	PCMCIA_CARD(SIEMENS, SS1021),
15044743Smarkm	PCMCIA_CARD(SIEMENS, SS1021A),
15144743Smarkm	PCMCIA_CARD(SIMPLETECH, SPECTRUM24_ALT),
15244743Smarkm	PCMCIA_CARD(SOCKET, LP_WLAN_CF),
15344743Smarkm	PCMCIA_CARD(TDK, LAK_CD011WL),
15444743Smarkm	{ NULL }
15544743Smarkm};
15644743SmarkmPCCARD_PNP_INFO(wi_pccard_products);
15744743Smarkm
15844743Smarkmstatic int
15944743Smarkmwi_pccard_probe(device_t dev)
16044743Smarkm{
16144743Smarkm	const struct pccard_product *pp;
16244743Smarkm	u_int32_t fcn = PCCARD_FUNCTION_UNSPEC;
16344743Smarkm	int error;
16444743Smarkm
16544743Smarkm	/* Make sure we're a network driver */
16644743Smarkm	error = pccard_get_function(dev, &fcn);
16744743Smarkm	if (error != 0)
16844743Smarkm		return error;
16944743Smarkm	if (fcn != PCCARD_FUNCTION_NETWORK)
17044743Smarkm		return ENXIO;
17144743Smarkm
17244743Smarkm	pp = pccard_product_lookup(dev, wi_pccard_products,
17344743Smarkm	    sizeof(wi_pccard_products[0]), NULL);
17444743Smarkm	if (pp != NULL) {
17544743Smarkm		if (pp->pp_name != NULL)
17644743Smarkm			device_set_desc(dev, pp->pp_name);
17744743Smarkm		return 0;
17844743Smarkm	}
17944743Smarkm	return ENXIO;
18044743Smarkm}
18144743Smarkm
18244743Smarkmstatic int
18344743Smarkmwi_pccard_attach(device_t dev)
18444743Smarkm{
18544743Smarkm	struct wi_softc	*sc;
18644743Smarkm	int error;
18744743Smarkm
18844743Smarkm	sc = device_get_softc(dev);
18944743Smarkm	sc->wi_gone = 0;
19044743Smarkm	sc->wi_bus_type = WI_BUS_PCCARD;
19144743Smarkm
19244743Smarkm	error = wi_alloc(dev, 0);
19344743Smarkm	if (error == 0) {
19444743Smarkm		/* Make sure interrupts are disabled. */
19544743Smarkm		CSR_WRITE_2(sc, WI_INT_EN, 0);
19644743Smarkm		CSR_WRITE_2(sc, WI_EVENT_ACK, 0xFFFF);
19744743Smarkm
19844743Smarkm		error = wi_attach(dev);
19944743Smarkm		if (error != 0)
20044743Smarkm			wi_free(dev);
20144743Smarkm	}
20244743Smarkm	return error;
20344743Smarkm}
20444743Smarkm