if_sn_pccard.c revision 69955
1/*
2 * Copyright (c) 1999 M. Warner Losh <imp@village.org>
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, 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.
13 *
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.
24 *
25 * $FreeBSD: head/sys/dev/sn/if_sn_pccard.c 69955 2000-12-13 01:47:19Z imp $
26 */
27
28/*
29 * Modifications for Megahertz X-Jack Ethernet Card (XJ-10BT)
30 *
31 * Copyright (c) 1996 by Tatsumi Hosokawa <hosokawa@jp.FreeBSD.org>
32 *                       BSD-nomads, Tokyo, Japan.
33 */
34
35#include <sys/param.h>
36#include <sys/systm.h>
37#include <sys/kernel.h>
38#include <sys/socket.h>
39
40#include <sys/module.h>
41#include <sys/bus.h>
42
43#include <machine/bus.h>
44#include <machine/resource.h>
45
46#include <net/ethernet.h>
47#include <net/if.h>
48#include <net/if_arp.h>
49
50
51#include <dev/sn/if_snvar.h>
52#include <dev/pccard/pccardvar.h>
53
54#include <dev/pccard/pccarddevs.h>
55
56#include "card_if.h"
57
58static const struct pccard_product sn_pccard_products[] = {
59	{ PCCARD_STR_MEGAHERTZ2_XJACK,		PCCARD_VENDOR_MEGAHERTZ2,
60	  PCCARD_PRODUCT_MEGAHERTZ2_XJACK,	 0, NULL, NULL },
61	{ PCCARD_STR_NEWMEDIA_BASICS,		PCCARD_VENDOR_NEWMEDIA,
62	  PCCARD_PRODUCT_NEWMEDIA_BASICS,	0, NULL, NULL },
63#if 0
64	{ PCCARD_STR_SMC_8020BT,		PCCARD_VENDOR_SMC,
65	  PCCARD_PRODUCT_SMC_8020BT,		0, NULL, NULL},
66#endif
67	{ NULL }
68};
69static int
70sn_pccard_match(device_t dev)
71{
72	const struct pccard_product *pp;
73
74	if ((pp = pccard_product_lookup(dev, sn_pccard_products,
75	    sizeof(sn_pccard_products[0]), NULL)) != NULL) {
76		device_set_desc(dev, pp->pp_name);
77		return 0;
78	}
79	return EIO;
80}
81
82static int
83sn_pccard_probe(device_t dev)
84{
85	int err;
86
87	err = sn_probe(dev, 1);
88	return (err);
89}
90
91static int
92sn_pccard_attach(device_t dev)
93{
94	struct sn_softc *sc = device_get_softc(dev);
95	int i;
96	u_char sum;
97	u_char ether_addr[ETHER_ADDR_LEN];
98
99	sc->pccard_enaddr = 0;
100	pccard_get_ether(dev, ether_addr);
101	for (i = 0, sum = 0; i < ETHER_ADDR_LEN; i++)
102		sum |= ether_addr[i];
103	if (sum) {
104		sc->pccard_enaddr = 1;
105		bcopy(ether_addr, sc->arpcom.ac_enaddr, ETHER_ADDR_LEN);
106	}
107	return (sn_attach(dev));
108}
109
110static device_method_t sn_pccard_methods[] = {
111	/* Device interface */
112	DEVMETHOD(device_probe,		pccard_compat_probe),
113	DEVMETHOD(device_attach,	pccard_compat_attach),
114	DEVMETHOD(device_detach,	sn_detach),
115
116	/* Card interface */
117	DEVMETHOD(card_compat_match,	sn_pccard_match),
118	DEVMETHOD(card_compat_probe,	sn_pccard_probe),
119	DEVMETHOD(card_compat_attach,	sn_pccard_attach),
120
121	{ 0, 0 }
122};
123
124static driver_t sn_pccard_driver = {
125	"sn",
126	sn_pccard_methods,
127	sizeof(struct sn_softc),
128};
129
130extern devclass_t sn_devclass;
131
132DRIVER_MODULE(if_sn, pccard, sn_pccard_driver, sn_devclass, 0, 0);
133MODULE_DEPEND(if_sn, pccard, 1, 1, 1);
134MODULE_DEPEND(if_sn, pcic, 1, 1, 1);	/* XXX */
135