summaryrefslogtreecommitdiff
path: root/sys/dev/pcmcia/if_wi.c
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>2000-02-02 18:47:03 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>2000-02-02 18:47:03 +0000
commit81587f1638fe91f5167a0b7477ced521e05f19cd (patch)
treea67d0b4f56b46cbe3953b9d1bfd966641102a832 /sys/dev/pcmcia/if_wi.c
parent75910aee3cd3e17aa9d32950c8cad5b50b964b62 (diff)
make the activate routines do xxstop() and xxinit()
Diffstat (limited to 'sys/dev/pcmcia/if_wi.c')
-rw-r--r--sys/dev/pcmcia/if_wi.c356
1 files changed, 14 insertions, 342 deletions
diff --git a/sys/dev/pcmcia/if_wi.c b/sys/dev/pcmcia/if_wi.c
index bffaec2c243..a89b6302168 100644
--- a/sys/dev/pcmcia/if_wi.c
+++ b/sys/dev/pcmcia/if_wi.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_wi.c,v 1.6 1999/12/16 04:51:30 angelos Exp $ */
+/* $OpenBSD: if_wi.c,v 1.7 2000/02/02 18:47:02 deraadt Exp $ */
/*
* Copyright (c) 1997, 1998, 1999
@@ -70,10 +70,6 @@
#define WI_HERMES_STATS_WAR /* Work around stats counter bug. */
#include "bpfilter.h"
-#ifdef __FreeBSD__
-#include "card.h"
-#include "wi.h"
-#endif /* __FreeBSD__ */
#include <sys/param.h>
#include <sys/systm.h>
@@ -83,15 +79,9 @@
#include <sys/kernel.h>
#include <sys/proc.h>
#include <sys/socket.h>
-#ifndef __FreeBSD__
#include <sys/device.h>
-#endif /* !__FreeBSD__ */
#include <net/if.h>
-#ifdef __FreeBSD__
-#include <net/if_arp.h>
-#include <net/ethernet.h>
-#endif /* __FreeBSD__ */
#include <net/if_dl.h>
#include <net/if_media.h>
#include <net/if_types.h>
@@ -108,39 +98,10 @@
#include <net/bpf.h>
#endif
-#ifdef __FreeBSD__
-#include <machine/clock.h>
-#include <machine/md_var.h>
-#include <machine/bus_pio.h>
-#endif /* __FreeBSD__ */
#include <machine/bus.h>
#include <i386/isa/icu.h>
-#ifdef __FreeBSD__
-
-#include <i386/isa/isa_device.h>
-#include <i386/isa/if_wireg.h>
-#include <machine/if_wavelan_ieee.h>
-
-#if NCARD > 0
-#include <sys/select.h>
-#include <pccard/cardinfo.h>
-#include <pccard/slot.h>
-#endif /* NCARD > 0 */
-
-static struct wi_softc wi_softc[NWI];
-
-#define TIMEOUT(handle,func,arg,time) (handle) = timeout((func), (arg), (time))
-#define UNTIMEOUT(func,arg,handle) untimeout((func), (arg), (handle))
-#define BPF_MTAP(if,mbuf) bpf_mtap((if), (mbuf))
-#define BPFATTACH(if_bpf,if,dlt,sz) bpfattach((if), (dlt), (sz))
-#define STATIC static
-#define WI_PRT_FMT "wi%d"
-#define WI_PRT_ARG(sc) (sc)->wi_unit
-
-#else /* !__FreeBSD__ */
-
#include <dev/pcmcia/pcmciareg.h>
#include <dev/pcmcia/pcmciavar.h>
#include <dev/pcmcia/pcmciadevs.h>
@@ -155,8 +116,6 @@ static struct wi_softc wi_softc[NWI];
#define WI_PRT_FMT "%s"
#define WI_PRT_ARG(sc) (sc)->sc_dev.dv_xname
-#endif /* __FreeBSD__ */
-
#ifdef WIDEBUG
u_int32_t widebug = WIDEBUG;
@@ -176,11 +135,7 @@ u_int32_t widebug = WIDEBUG;
#if !defined(lint)
static const char rcsid[] =
-#ifdef __FreeBSD__
- "$Id: if_wi.c,v 1.6 1999/12/16 04:51:30 angelos Exp $";
-#else /* !__FreeBSD__ */
- "$OpenBSD: if_wi.c,v 1.6 1999/12/16 04:51:30 angelos Exp $";
-#endif /* __FreeBSD__ */
+ "$OpenBSD: if_wi.c,v 1.7 2000/02/02 18:47:02 deraadt Exp $";
#endif /* lint */
#ifdef foo
@@ -193,11 +148,7 @@ STATIC void wi_init __P((void *));
STATIC void wi_start __P((struct ifnet *));
STATIC void wi_stop __P((struct wi_softc *));
STATIC void wi_watchdog __P((struct ifnet *));
-#ifdef __FreeBSD__
-STATIC void wi_shutdown __P((int, void *));
-#else /* !__FreeBSD__ */
STATIC void wi_shutdown __P((void *));
-#endif /* __FreeBSD__ */
STATIC void wi_rxeof __P((struct wi_softc *));
STATIC void wi_txeof __P((struct wi_softc *, int));
STATIC void wi_update_stats __P((struct wi_softc *));
@@ -216,242 +167,11 @@ STATIC void wi_inquire __P((void *));
STATIC void wi_setdef __P((struct wi_softc *, struct wi_req *));
STATIC int wi_mgmt_xmit __P((struct wi_softc *, caddr_t, int));
-#ifdef __FreeBSD__
-
-STATIC int wi_probe __P((struct isa_device *));
-STATIC int wi_attach __P((struct isa_device *));
-#ifdef PCCARD_MODULE
-static ointhand2_t wi_intr;
-#else
-void wi_intr __P((int));
-#endif /* PCCARD_MODULE */
-
-struct isa_driver widriver = {
- wi_probe,
- wi_attach,
- "wi",
- 1
-};
-
-#if NCARD > 0
-STATIC int wi_pccard_init __P((struct pccard_devinfo *));
-STATIC void wi_pccard_unload __P((struct pccard_devinfo *));
-STATIC int wi_pccard_intr __P((struct pccard_devinfo *));
-
-#ifdef PCCARD_MODULE
-PCCARD_MODULE(wi, wi_pccard_init, wi_pccard_unload,
- wi_pccard_intr, 0, net_imask);
-#else
-static struct pccard_device wi_info = {
- "wi",
- wi_pccard_init,
- wi_pccard_unload,
- wi_pccard_intr,
- 0, /* Attributes - presently unused */
- &net_imask /* Interrupt mask for device */
- /* XXX - Should this also include net_imask? */
-};
-
-DATA_SET(pccarddrv_set, wi_info);
-#endif
-
-/* Initialize the PCCARD. */
-STATIC int wi_pccard_init(sc_p)
- struct pccard_devinfo *sc_p;
-{
- struct wi_softc *sc;
- int i;
- u_int32_t irq;
-
- if (sc_p->isahd.id_unit >= NWI)
- return(ENODEV);
-
- sc = &wi_softc[sc_p->isahd.id_unit];
- sc->wi_gone = 0;
- sc->wi_unit = sc_p->isahd.id_unit;
- sc->wi_bhandle = sc_p->isahd.id_iobase;
- sc->wi_btag = I386_BUS_SPACE_IO;
-
- /* Make sure interrupts are disabled. */
- CSR_WRITE_2(sc, WI_INT_EN, 0);
- CSR_WRITE_2(sc, WI_EVENT_ACK, 0xFFFF);
-
- /* Grr. IRQ is encoded as a bitmask. */
- irq = sc_p->isahd.id_irq;
- for (i = 0; i < 32; i++) {
- if (irq & 0x1)
- break;
- irq >>= 1;
- }
-
- /*
- * Print a nice probe message to let the operator
- * know something interesting is happening.
- */
- printf("wi%d: <WaveLAN/IEEE 802.11> at 0x%x-0x%x irq %d on isa\n",
- sc_p->isahd.id_unit, sc_p->isahd.id_iobase,
- sc_p->isahd.id_iobase + WI_IOSIZ - 1, i);
-
- if (wi_attach(&sc_p->isahd))
- return(ENXIO);
-
- return(0);
-}
-
-STATIC void wi_pccard_unload(sc_p)
- struct pccard_devinfo *sc_p;
-{
- struct wi_softc *sc;
- struct ifnet *ifp;
-
- sc = &wi_softc[sc_p->isahd.id_unit];
- ifp = &sc->arpcom.ac_if;
-
- if (sc->wi_gone) {
- printf("wi%d: already unloaded\n", sc_p->isahd.id_unit);
- return;
- }
-
- ifp->if_flags &= ~IFF_RUNNING;
- if_down(ifp);
- sc->wi_gone = 1;
- printf("wi%d: unloaded\n", sc_p->isahd.id_unit);
-
- return;
-}
-
-STATIC int wi_pccard_intr(sc_p)
- struct pccard_devinfo *sc_p;
-{
- wi_intr(sc_p->isahd.id_unit);
- return(1);
-}
-
-#endif
-
-STATIC int wi_probe(isa_dev)
- struct isa_device *isa_dev;
-{
- /*
- * The ISA WaveLAN/IEEE card is actually not an ISA card:
- * it's a PCMCIA card plugged into a PCMCIA bridge adapter
- * that fits into an ISA slot. Consequently, we will always
- * be using the pccard support to probe and attach these
- * devices, so we can never actually probe one from here.
- */
- return(0);
-}
-
-STATIC int wi_attach(isa_dev)
- struct isa_device *isa_dev;
-{
- struct wi_softc *sc;
- struct wi_ltv_macaddr mac;
- struct wi_ltv_gen gen;
- struct ifnet *ifp;
- char ifname[IFNAMSIZ];
-
-#ifdef PCCARD_MODULE
- isa_dev->id_ointr = wi_intr;
-#endif
- sc = &wi_softc[isa_dev->id_unit];
- ifp = &sc->arpcom.ac_if;
-
- /* Reset the NIC. */
- wi_reset(sc);
-
- /* Read the station address. */
- mac.wi_type = WI_RID_MAC_NODE;
- mac.wi_len = 4;
- wi_read_record(sc, (struct wi_ltv_gen *)&mac);
- bcopy((char *)&mac.wi_mac_addr,
- (char *)&sc->arpcom.ac_enaddr, ETHER_ADDR_LEN);
-
- printf("wi%d: Ethernet address: %6D\n", sc->wi_unit,
- sc->arpcom.ac_enaddr, ":");
-
- ifp->if_softc = sc;
- ifp->if_unit = sc->wi_unit;
- ifp->if_name = "wi";
- ifp->if_mtu = ETHERMTU;
- ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
- ifp->if_ioctl = wi_ioctl;
- ifp->if_output = ether_output;
- ifp->if_start = wi_start;
- ifp->if_watchdog = wi_watchdog;
- ifp->if_init = wi_init;
- ifp->if_baudrate = 10000000;
- ifp->if_snd.ifq_maxlen = IFQ_MAXLEN;
-
- bzero(sc->wi_node_name, sizeof(sc->wi_node_name));
- bcopy(WI_DEFAULT_NODENAME, sc->wi_node_name,
- sizeof(WI_DEFAULT_NODENAME) - 1);
-
- bzero(sc->wi_net_name, sizeof(sc->wi_net_name));
- bcopy(WI_DEFAULT_NETNAME, sc->wi_net_name,
- sizeof(WI_DEFAULT_NETNAME) - 1);
-
- bzero(sc->wi_ibss_name, sizeof(sc->wi_ibss_name));
- bcopy(WI_DEFAULT_IBSS, sc->wi_ibss_name,
- sizeof(WI_DEFAULT_IBSS) - 1);
-
- sc->wi_portnum = WI_DEFAULT_PORT;
- sc->wi_ptype = WI_PORTTYPE_ADHOC;
- sc->wi_ap_density = WI_DEFAULT_AP_DENSITY;
- sc->wi_rts_thresh = WI_DEFAULT_RTS_THRESH;
- sc->wi_tx_rate = WI_DEFAULT_TX_RATE;
- sc->wi_max_data_len = WI_DEFAULT_DATALEN;
- sc->wi_create_ibss = WI_DEFAULT_CREATE_IBSS;
- sc->wi_pm_enabled = WI_DEFAULT_PM_ENABLED;
- sc->wi_max_sleep = WI_DEFAULT_MAX_SLEEP;
-
- /*
- * Read the default channel from the NIC. This may vary
- * depending on the country where the NIC was purchased, so
- * we can't hard-code a default and expect it to work for
- * everyone.
- */
- gen.wi_type = WI_RID_OWN_CHNL;
- gen.wi_len = 2;
- wi_read_record(sc, &gen);
- sc->wi_channel = gen.wi_val;
-
- bzero((char *)&sc->wi_stats, sizeof(sc->wi_stats));
-
- wi_init(sc);
- wi_stop(sc);
-
- /*
- * If this logical interface has already been attached,
- * don't attach it again or chaos will ensue.
- */
- sprintf(ifname, "wi%d", sc->wi_unit);
-
- if (ifunit(ifname) == NULL) {
- callout_handle_init(&sc->wi_stat_ch);
- /*
- * Call MI attach routines.
- */
- if_attach(ifp);
- ether_ifattach(ifp);
-
-#if NBPFILTER > 0
- bpfattach(ifp, DLT_EN10MB, sizeof(struct ether_header));
-#endif
-
- at_shutdown(wi_shutdown, sc, SHUTDOWN_POST_SYNC);
- }
-
- return(0);
-}
-
-#else /* !__FreeBSD__ */
-
-int wi_pcmcia_match __P((struct device *, void *, void *));
-void wi_pcmcia_attach __P((struct device *, struct device *, void *));
-int wi_pcmcia_detach __P((struct device *, int));
-int wi_pcmcia_activate __P((struct device *, enum devact));
-int wi_intr __P((void *));
+int wi_pcmcia_match __P((struct device *, void *, void *));
+void wi_pcmcia_attach __P((struct device *, struct device *, void *));
+int wi_pcmcia_detach __P((struct device *, int));
+int wi_pcmcia_activate __P((struct device *, enum devact));
+int wi_intr __P((void *));
/* Autoconfig definition of driver back-end */
struct cfdriver wi_cd = {
@@ -608,14 +328,6 @@ wi_pcmcia_attach(parent, self, aux)
wi_init(sc);
wi_stop(sc);
-
-#ifdef notyet
- /*
- * XXX This should be done once the framework has enable/disable hooks.
- */
- pcmcia_function_disable(pf);
-#endif /* notyet */
-
return;
bad:
@@ -651,17 +363,24 @@ wi_pcmcia_activate(dev, act)
enum devact act;
{
struct wi_softc *sc = (struct wi_softc *)dev;
+ struct ifnet *ifp = &sc->arpcom.ac_if;
int s;
s = splnet();
switch (act) {
case DVACT_ACTIVATE:
pcmcia_function_enable(sc->sc_pf);
+ printf("%s:", WI_PRT_ARG(sc));
sc->sc_ih =
pcmcia_intr_establish(sc->sc_pf, IPL_NET, wi_intr, sc);
+ printf("\n");
+ wi_init(sc);
break;
case DVACT_DEACTIVATE:
+ ifp->if_timer = 0;
+ if (ifp->if_flags & IFF_RUNNING)
+ wi_stop(sc);
pcmcia_function_disable(sc->sc_pf);
pcmcia_intr_disestablish(sc->sc_pf, sc->sc_ih);
break;
@@ -669,19 +388,11 @@ wi_pcmcia_activate(dev, act)
splx(s);
return (0);
}
-#endif /* __FreeBSD__ */
-#ifdef __FreeBSD__
-void wi_intr(unit)
- int unit;
-{
- struct wi_softc *sc = &wi_softc[unit];
-#else /* !__FreeBSD__ */
int wi_intr(vsc)
void *vsc;
{
struct wi_softc *sc = vsc;
-#endif /* __FreeBSD__ */
struct ifnet *ifp;
u_int16_t status;
@@ -1188,12 +899,8 @@ STATIC void wi_setmulti(sc)
struct ifnet *ifp;
int i = 0;
struct wi_ltv_mcast mcast;
-#ifdef __FreeBSD__
- struct ifmultiaddr *ifma;
-#else
struct ether_multistep step;
struct ether_multi *enm;
-#endif
ifp = &sc->arpcom.ac_if;
@@ -1207,21 +914,6 @@ STATIC void wi_setmulti(sc)
return;
}
-#ifdef __FreeBSD__
- for (ifma = ifp->if_multiaddrs.lh_first; ifma != NULL;
- ifma = ifma->ifma_link.le_next) {
- if (ifma->ifma_addr->sa_family != AF_LINK)
- continue;
- if (i < 16) {
- bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr),
- (char *)&mcast.wi_mcast[i], ETHER_ADDR_LEN);
- i++;
- } else {
- bzero((char *)&mcast, sizeof(mcast));
- break;
- }
- }
-#else /* !__FreeBSD__ */
ETHER_FIRST_MULTI(step, &sc->arpcom, enm);
while (enm != NULL) {
if (i >= 16) {
@@ -1238,7 +930,6 @@ STATIC void wi_setmulti(sc)
i++;
ETHER_NEXT_MULTI(step, enm);
}
-#endif /* __FreeBSD__ */
mcast.wi_len = (i * 3) + 1;
wi_write_record(sc, (struct wi_ltv_gen *)&mcast);
@@ -1253,9 +944,7 @@ STATIC void wi_setdef(sc, wreq)
struct sockaddr_dl *sdl;
struct ifaddr *ifa;
struct ifnet *ifp;
-#ifndef __FreeBSD__
extern struct ifaddr **ifnet_addrs;
-#endif /* !__FreeBSD__ */
ifp = &sc->arpcom.ac_if;
@@ -1326,9 +1015,7 @@ STATIC int wi_ioctl(ifp, command, data)
struct wi_req wreq;
struct ifreq *ifr;
struct proc *p = curproc;
-#ifndef __FreeBSD__
struct ifaddr *ifa = (struct ifaddr *)data;
-#endif /* !__FreeBSD__ */
s = splimp();
@@ -1340,21 +1027,12 @@ STATIC int wi_ioctl(ifp, command, data)
DPRINTF (WID_IOCTL, ("wi_ioctl: command %lu data %p", command, data));
-#ifndef __FreeBSD__
if ((error = ether_ioctl(ifp, &sc->arpcom, command, data)) > 0) {
splx(s);
return error;
}
-#endif /* !__FreeBSD__ */
switch(command) {
-#ifdef __FreeBSD__
- case SIOCSIFADDR:
- case SIOCGIFADDR:
- case SIOCSIFMTU:
- error = ether_ioctl(ifp, command, data);
- break;
-#else /* !__FreeBSD__ */
case SIOCSIFADDR:
ifp->if_flags |= IFF_UP;
switch (ifa->ifa_addr->sa_family) {
@@ -1369,7 +1047,6 @@ STATIC int wi_ioctl(ifp, command, data)
break;
}
break;
-#endif /* __FreeBSD__ */
case SIOCSIFFLAGS:
if (ifp->if_flags & IFF_UP) {
@@ -1709,12 +1386,7 @@ STATIC void wi_watchdog(ifp)
return;
}
-#ifdef __FreeBSD__
-STATIC void wi_shutdown(howto, arg)
- int howto;
-#else /* !__FreeBSD__ */
STATIC void wi_shutdown(arg)
-#endif /* __FreeBSD__ */
void *arg;
{
struct wi_softc *sc;