PERFORCE change 29083 for review
John Baldwin
jhb at FreeBSD.org
Wed Apr 16 13:11:16 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=29083
Change 29083 by jhb at jhb_laptop on 2003/04/16 13:10:20
IFC @29082 so alpha LINT builds.
Affected files ...
.. //depot/projects/smpng/sys/alpha/linux/linux.h#7 integrate
.. //depot/projects/smpng/sys/alpha/linux/linux_machdep.c#12 integrate
.. //depot/projects/smpng/sys/compat/linprocfs/linprocfs.c#25 integrate
.. //depot/projects/smpng/sys/compat/linux/linux_misc.c#35 integrate
.. //depot/projects/smpng/sys/dev/wl/if_wl.c#12 integrate
.. //depot/projects/smpng/sys/dev/wl/if_wl.h#3 integrate
Differences ...
==== //depot/projects/smpng/sys/alpha/linux/linux.h#7 (text+ko) ====
@@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/sys/alpha/linux/linux.h,v 1.57 2003/02/03 17:43:20 ume Exp $
+ * $FreeBSD: src/sys/alpha/linux/linux.h,v 1.58 2003/04/16 20:04:47 jhb Exp $
*/
#ifndef _ALPHA_LINUX_LINUX_H_
@@ -38,8 +38,8 @@
*/
extern u_char linux_debug_map[];
#define ldebug(name) isclr(linux_debug_map, LINUX_SYS_linux_ ## name)
-#define ARGS(nm, fmt) "linux(%ld): "#nm"("fmt")\n", (long)p->p_pid
-#define LMSG(fmt) "linux(%ld): "fmt"\n", (long)p->p_pid
+#define ARGS(nm, fmt) "linux(%ld): "#nm"("fmt")\n", (long)td->td_proc->p_pid
+#define LMSG(fmt) "linux(%ld): "fmt"\n", (long)td->td_proc->p_pid
#ifdef MALLOC_DECLARE
MALLOC_DECLARE(M_LINUX);
==== //depot/projects/smpng/sys/alpha/linux/linux_machdep.c#12 (text+ko) ====
@@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/sys/alpha/linux/linux_machdep.c,v 1.26 2003/03/03 09:17:12 des Exp $
+ * $FreeBSD: src/sys/alpha/linux/linux_machdep.c,v 1.28 2003/04/16 20:05:42 jhb Exp $
*/
#include <sys/param.h>
@@ -133,8 +133,8 @@
#ifdef DEBUG
if (ldebug(clone)) {
- printf(ARGS(clone, "flags %x, stack %x"),
- (unsigned int)args->flags, (unsigned int)args->stack);
+ printf(ARGS(clone, "flags %x, stack %p"),
+ (unsigned int)args->flags, args->stack);
if (args->flags & CLONE_PID)
printf(LMSG("CLONE_PID not yet supported"));
}
@@ -208,7 +208,7 @@
#ifdef DEBUG
if (ldebug(mmap))
- printf(ARGS(mmap, "%p, 0x%lx, 0x%x, 0x%x, 0x%x, 0x%lx"),
+ printf(ARGS(mmap, "%p, 0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx"),
(void *)linux_args->addr, linux_args->len,
linux_args->prot, linux_args->flags, linux_args->fd,
linux_args->pos);
@@ -281,7 +281,7 @@
bsd_args.pad = 0;
#ifdef DEBUG
if (ldebug(mmap))
- printf(ARGS(mmap, "%p, 0x%lx, 0x%x, 0x%x, 0x%x, 0x%lx)",
+ printf(ARGS(mmap, "%p, 0x%lx, 0x%x, 0x%x, 0x%x, 0x%lx"),
(void *)bsd_args.addr,
bsd_args.len,
bsd_args.prot,
@@ -294,7 +294,7 @@
error = mmap(td, &bsd_args);
#ifdef DEBUG
if (ldebug(mmap))
- printf(LMSG("mmap returns %d, 0x%lx", error, td->td_retval[0]);
+ printf(LMSG("mmap returns %d, 0x%lx"), error, td->td_retval[0]);
#endif
return (error);
}
@@ -314,7 +314,7 @@
#ifdef DEBUG
if (ldebug(rt_sigsuspend))
- printf(ARGS(rt_sigsuspend, "%p, %d"),
+ printf(ARGS(rt_sigsuspend, "%p, %zd"),
(void *)uap->newset, uap->sigsetsize);
#endif
if (uap->sigsetsize != sizeof(l_sigset_t))
@@ -338,7 +338,7 @@
#ifdef DEBUG
if (ldebug(mprotect))
- printf(ARGS(mprotect, "%p, 0x%lx, 0x%x)",
+ printf(ARGS(mprotect, "%p, 0x%zx, 0x%lx"),
(void *)uap->addr, uap->len, uap->prot);
#endif
return (mprotect(td, (void *)uap));
@@ -352,7 +352,7 @@
#ifdef DEBUG
if (ldebug(munmap))
- printf(ARGS(munmap, "%p, 0x%lx",
+ printf(ARGS(munmap, "%p, 0x%lx"),
(void *)uap->addr, uap->len);
#endif
return (munmap(td, (void *)uap));
==== //depot/projects/smpng/sys/compat/linprocfs/linprocfs.c#25 (text+ko) ====
@@ -38,7 +38,7 @@
*
* @(#)procfs_status.c 8.4 (Berkeley) 6/15/94
*
- * $FreeBSD: src/sys/compat/linprocfs/linprocfs.c,v 1.62 2003/03/13 22:45:43 jhb Exp $
+ * $FreeBSD: src/sys/compat/linprocfs/linprocfs.c,v 1.63 2003/04/16 19:46:26 jhb Exp $
*/
#include <sys/param.h>
@@ -116,9 +116,9 @@
unsigned long memfree; /* free memory in bytes */
unsigned long memshared; /* shared memory ??? */
unsigned long buffers, cached; /* buffer / cache memory ??? */
- u_quad_t swaptotal; /* total swap space in bytes */
- u_quad_t swapused; /* used swap space in bytes */
- u_quad_t swapfree; /* free swap space in bytes */
+ unsigned long long swaptotal; /* total swap space in bytes */
+ unsigned long long swapused; /* used swap space in bytes */
+ unsigned long long swapfree; /* free swap space in bytes */
vm_object_t object;
memtotal = physmem * PAGE_SIZE;
@@ -209,20 +209,20 @@
"cpu\t\t\t: Alpha\n"
"cpu model\t\t: %s\n"
"cpu variation\t\t: %ld\n"
- "cpu revision\t\t: %ld\n"
+ "cpu revision\t\t: %d\n"
"cpu serial number\t: %s\n"
"system type\t\t: %s\n"
"system variation\t: %s\n"
- "system revision\t\t: %ld\n"
+ "system revision\t\t: %d\n"
"system serial number\t: %s\n"
"cycle frequency [Hz]\t: %lu\n"
- "timer frequency [Hz]\t: %lu\n"
+ "timer frequency [Hz]\t: %u\n"
"page size [bytes]\t: %ld\n"
"phys. address bits\t: %ld\n"
"max. addr. space #\t: %ld\n"
- "BogoMIPS\t\t: %lu.%02lu\n"
- "kernel unaligned acc\t: %ld (pc=%lx,va=%lx)\n"
- "user unaligned acc\t: %ld (pc=%lx,va=%lx)\n"
+ "BogoMIPS\t\t: %u.%02u\n"
+ "kernel unaligned acc\t: %d (pc=%x,va=%x)\n"
+ "user unaligned acc\t: %d (pc=%x,va=%x)\n"
"platform string\t\t: %s\n"
"cpus detected\t\t: %d\n"
,
@@ -421,7 +421,7 @@
cnt.v_swappgsout,
cnt.v_intr,
cnt.v_swtch,
- (quad_t)boottime.tv_sec);
+ (long long)boottime.tv_sec);
return (0);
}
@@ -435,7 +435,7 @@
getmicrouptime(&tv);
sbuf_printf(sb, "%lld.%02ld %ld.%02ld\n",
- (quad_t)tv.tv_sec, tv.tv_usec / 10000,
+ (long long)tv.tv_sec, tv.tv_usec / 10000,
T2S(cp_time[CP_IDLE]), T2J(cp_time[CP_IDLE]) % 100);
return (0);
}
@@ -514,8 +514,8 @@
PS_ADD("timeout", "%u", 0); /* XXX */
PS_ADD("itrealvalue", "%u", 0); /* XXX */
PS_ADD("starttime", "%d", 0); /* XXX */
- PS_ADD("vsize", "%u", kp.ki_size);
- PS_ADD("rss", "%u", P2K(kp.ki_rssize));
+ PS_ADD("vsize", "%ju", (uintmax_t)kp.ki_size);
+ PS_ADD("rss", "%ju", P2K((uintmax_t)kp.ki_rssize));
PS_ADD("rlim", "%u", 0); /* XXX */
PS_ADD("startcode", "%u", (unsigned)0);
PS_ADD("endcode", "%u", 0); /* XXX */
@@ -625,15 +625,15 @@
* could also compute VmLck, but I don't really care enough to
* implement it. Submissions are welcome.
*/
- sbuf_printf(sb, "VmSize:\t%8u kB\n", B2K(kp.ki_size));
+ sbuf_printf(sb, "VmSize:\t%8ju kB\n", B2K((uintmax_t)kp.ki_size));
sbuf_printf(sb, "VmLck:\t%8u kB\n", P2K(0)); /* XXX */
- sbuf_printf(sb, "VmRss:\t%8u kB\n", P2K(kp.ki_rssize));
- sbuf_printf(sb, "VmData:\t%8u kB\n", P2K(kp.ki_dsize));
- sbuf_printf(sb, "VmStk:\t%8u kB\n", P2K(kp.ki_ssize));
- sbuf_printf(sb, "VmExe:\t%8u kB\n", P2K(kp.ki_tsize));
+ sbuf_printf(sb, "VmRss:\t%8ju kB\n", P2K((uintmax_t)kp.ki_rssize));
+ sbuf_printf(sb, "VmData:\t%8ju kB\n", P2K((uintmax_t)kp.ki_dsize));
+ sbuf_printf(sb, "VmStk:\t%8ju kB\n", P2K((uintmax_t)kp.ki_ssize));
+ sbuf_printf(sb, "VmExe:\t%8ju kB\n", P2K((uintmax_t)kp.ki_tsize));
lsize = B2P(kp.ki_size) - kp.ki_dsize -
kp.ki_ssize - kp.ki_tsize - 1;
- sbuf_printf(sb, "VmLib:\t%8u kB\n", P2K(lsize));
+ sbuf_printf(sb, "VmLib:\t%8ju kB\n", P2K((uintmax_t)lsize));
/*
* Signal masks
==== //depot/projects/smpng/sys/compat/linux/linux_misc.c#35 (text+ko) ====
@@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/sys/compat/linux/linux_misc.c,v 1.139 2003/03/13 22:45:43 jhb Exp $
+ * $FreeBSD: src/sys/compat/linux/linux_misc.c,v 1.140 2003/04/16 20:07:48 jhb Exp $
*/
#include "opt_mac.h"
@@ -878,7 +878,7 @@
{
#ifdef DEBUG
if (ldebug(personality))
- printf(ARGS(personality, "%d"), args->per);
+ printf(ARGS(personality, "%ld"), args->per);
#endif
#ifndef __alpha__
if (args->per != 0)
==== //depot/projects/smpng/sys/dev/wl/if_wl.c#12 (text+ko) ====
@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/dev/wl/if_wl.c,v 1.48 2003/04/16 15:52:20 jhay Exp $ */
+/* $FreeBSD: src/sys/dev/wl/if_wl.c,v 1.50 2003/04/16 17:42:38 jhay Exp $ */
/*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -188,7 +188,6 @@
* transmit buffer available in sram space.
*/
-#define NWL 4
#include "opt_wavelan.h"
#include "opt_inet.h"
@@ -199,12 +198,16 @@
#include <sys/mbuf.h>
#include <sys/socket.h>
#include <sys/syslog.h>
+#include <machine/bus.h>
+#include <machine/resource.h>
#include <sys/bus.h>
+#include <sys/rman.h>
#include <sys/sysctl.h>
#include <net/ethernet.h>
#include <net/if.h>
+#include <net/if_arp.h>
#include <net/if_dl.h>
#ifdef INET
@@ -215,7 +218,7 @@
#endif
#include <net/bpf.h>
-#include <i386/isa/isa_device.h>
+#include <isa/isavar.h>
#include <i386/isa/ic/if_wl_i82586.h> /* Definitions for the Intel chip */
/* was 1000 in original, fed to DELAY(x) */
@@ -223,10 +226,6 @@
#include <dev/wl/if_wl.h>
#include <machine/if_wl_wavelan.h>
-#ifndef COMPAT_OLDISA
-#error "The wl device requires the old isa compatibility shims"
-#endif
-
static char t_packet[ETHERMTU + sizeof(struct ether_header) + sizeof(long)];
struct wl_softc{
@@ -246,7 +245,15 @@
short mode;
u_char chan24; /* 2.4 Gz: channel number/EEPROM Area # */
u_short freq24; /* 2.4 Gz: resulting frequency */
- struct callout_handle watchdog_ch;
+ int rid_ioport;
+ int rid_irq;
+ struct resource *res_ioport;
+ struct resource *res_irq;
+ void *intr_cookie;
+ bus_space_tag_t bt;
+ bus_space_handle_t bh;
+ struct mtx wl_mtx;
+ struct callout_handle watchdog_ch;
#ifdef WLCACHE
int w_sigitems; /* number of cached entries */
/* array of cache entries */
@@ -255,21 +262,35 @@
int w_wrapindex; /* next "free" cache entry */
#endif
};
-static struct wl_softc wl_softc[NWL];
+
+#define WL_LOCK(_sc) mtx_lock(&(_sc)->wl_mtx)
+#define WL_UNLOCK(_sc) mtx_unlock(&(_sc)->wl_mtx)
-#define WLSOFTC(unit) ((struct wl_softc *)(&wl_softc[unit]))
+static int wlprobe(device_t);
+static int wlattach(device_t);
+static int wldetach(device_t);
-static int wlprobe(struct isa_device *);
-static int wlattach(struct isa_device *);
+static device_method_t wl_methods[] = {
+ DEVMETHOD(device_probe, wlprobe),
+ DEVMETHOD(device_attach, wlattach),
+ DEVMETHOD(device_detach, wldetach),
+ { 0, 0}
+};
-struct isa_driver wldriver = {
- INTR_TYPE_NET,
- wlprobe,
- wlattach,
+static driver_t wl_driver = {
"wl",
- 0
+ wl_methods,
+ sizeof (struct wl_softc)
+};
+
+devclass_t wl_devclass;
+DRIVER_MODULE(wl, isa, wl_driver, wl_devclass, 0, 0);
+MODULE_DEPEND(wl, isa, 1, 1, 1);
+MODULE_DEPEND(wl, ether, 1, 1, 1);
+
+static struct isa_pnp_id wl_ids[] = {
+ {0, NULL}
};
-COMPAT_ISA_DRIVER(wl, wldriver);
/*
* XXX The Wavelan appears to be prone to dropping stuff if you talk to
@@ -301,39 +322,41 @@
static int gathersnr = 0;
SYSCTL_INT(_machdep, OID_AUTO, wl_gather_snr, CTLFLAG_RW, &gathersnr, 0, "");
+static int wl_allocate_resources(device_t device);
+static int wl_deallocate_resources(device_t device);
static void wlstart(struct ifnet *ifp);
static void wlinit(void *xsc);
static int wlioctl(struct ifnet *ifp, u_long cmd, caddr_t data);
static timeout_t wlwatchdog;
-static ointhand2_t wlintr;
-static void wlxmt(int unt, struct mbuf *m);
-static int wldiag(int unt);
-static int wlconfig(int unit);
-static int wlcmd(int unit, char *str);
-static void wlmmcstat(int unit);
-static u_short wlbldru(int unit);
+static void wlintr(void *arg);
+static void wlxmt(struct wl_softc *sc, struct mbuf *m);
+static int wldiag(struct wl_softc *sc);
+static int wlconfig(struct wl_softc *sc);
+static int wlcmd(struct wl_softc *sc, char *str);
+static void wlmmcstat(struct wl_softc *sc);
+static u_short wlbldru(struct wl_softc *sc);
static u_short wlmmcread(u_int base, u_short reg);
-static void wlinitmmc(int unit);
-static int wlhwrst(int unit);
-static void wlrustrt(int unit);
-static void wlbldcu(int unit);
-static int wlack(int unit);
-static int wlread(int unit, u_short fd_p);
-static void getsnr(int unit);
-static void wlrcv(int unit);
-static int wlrequeue(int unit, u_short fd_p);
-static void wlsftwsleaze(u_short *countp, u_char **mb_pp, struct mbuf **tm_pp, int unit);
-static void wlhdwsleaze(u_short *countp, u_char **mb_pp, struct mbuf **tm_pp, int unit);
+static void wlinitmmc(struct wl_softc *sc);
+static int wlhwrst(struct wl_softc *sc);
+static void wlrustrt(struct wl_softc *sc);
+static void wlbldcu(struct wl_softc *sc);
+static int wlack(struct wl_softc *sc);
+static int wlread(struct wl_softc *sc, u_short fd_p);
+static void getsnr(struct wl_softc *sc);
+static void wlrcv(struct wl_softc *sc);
+static int wlrequeue(struct wl_softc *sc, u_short fd_p);
+static void wlsftwsleaze(u_short *countp, u_char **mb_pp, struct mbuf **tm_pp, struct wl_softc *sc);
+static void wlhdwsleaze(u_short *countp, u_char **mb_pp, struct mbuf **tm_pp, struct wl_softc *sc);
#ifdef WLDEBUG
-static void wltbd(int unit);
+static void wltbd(struct wl_softc *sc);
#endif
static void wlgetpsa(int base, u_char *buf);
-static void wlsetpsa(int unit);
+static void wlsetpsa(struct wl_softc *sc);
static u_short wlpsacrc(u_char *buf);
-static void wldump(int unit);
+static void wldump(struct wl_softc *sc);
#ifdef WLCACHE
-static void wl_cache_store(int, int, struct ether_header *, struct mbuf *);
-static void wl_cache_zero(int unit);
+static void wl_cache_store(struct wl_softc *, int, struct ether_header *, struct mbuf *);
+static void wl_cache_zero(struct wl_softc *sc);
#endif
/* array for maping irq numbers to values for the irq parameter register */
@@ -360,26 +383,35 @@
*
*/
static int
-wlprobe(struct isa_device *id)
+wlprobe(device_t device)
{
- struct wl_softc *sc = &wl_softc[id->id_unit];
- short base = id->id_iobase;
+ struct wl_softc *sc;
+ short base;
char *str = "wl%d: board out of range [0..%d]\n";
u_char inbuf[100];
- unsigned long oldpri;
- int irq;
+ unsigned long junk, sirq;
+ int error, irq;
+
+ error = ISA_PNP_PROBE(device_get_parent(device), device, wl_ids);
+ if (error == ENXIO || error == 0)
+ return (error);
+
+ sc = device_get_softc(device);
+ error = wl_allocate_resources(device);
+ if (error)
+ goto errexit;
+
+ base = rman_get_start(sc->res_ioport);
/* TBD. not true.
* regular CMD() will not work, since no softc yet
*/
#define PCMD(base, hacr) outw((base), (hacr))
- oldpri = splimp();
PCMD(base, HACR_RESET); /* reset the board */
DELAY(DELAYCONST); /* >> 4 clocks at 6MHz */
PCMD(base, HACR_RESET); /* reset the board */
DELAY(DELAYCONST); /* >> 4 clocks at 6MHz */
- splx(oldpri);
/* clear reset command and set PIO#1 in autoincrement mode */
PCMD(base, HACR_DEFAULT);
@@ -390,8 +422,10 @@
outw(PIOR1(base), 0); /* rewind */
insw(PIOP1(base), inbuf, strlen(str)/2+1); /* read result */
- if (bcmp(str, inbuf, strlen(str)))
- return(0);
+ if (bcmp(str, inbuf, strlen(str))) {
+ error = ENXIO;
+ goto errexit;
+ }
sc->chan24 = 0; /* 2.4 Gz: config channel */
sc->freq24 = 0; /* 2.4 Gz: frequency */
@@ -404,17 +438,26 @@
if (irqvals[irq] == inbuf[WLPSA_IRQNO])
break;
if ((irq == 0) || (irqvals[irq] == 0)){
- printf("wl%d: PSA corrupt (invalid IRQ value)\n", id->id_unit);
- id->id_irq = 0; /* no interrupt */
+ printf("wl%d: PSA corrupt (invalid IRQ value)\n",
+ device_get_unit(device));
} else {
/*
* If the IRQ requested by the PSA is already claimed by another
* device, the board won't work, but the user can still access the
* driver to change the IRQ.
*/
- id->id_irq = (1<<irq); /* use IRQ from PSA */
+ if (bus_get_resource(device, SYS_RES_IRQ, 0, &sirq, &junk))
+ goto errexit;
+ if (irq != (int)sirq)
+ printf("wl%d: board is configured for interrupt %d\n",
+ device_get_unit(device), irq);
}
- return(16);
+ wl_deallocate_resources(device);
+ return (0);
+
+errexit:
+ wl_deallocate_resources(device);
+ return (error);
}
@@ -431,30 +474,45 @@
*
*/
static int
-wlattach(struct isa_device *id)
+wlattach(device_t device)
{
- struct wl_softc *sc = (struct wl_softc *) &wl_softc[id->id_unit];
- short base = id->id_iobase;
- int i,j;
- u_char unit = id->id_unit;
- struct ifnet *ifp = &sc->wl_if;
+ struct wl_softc *sc;
+ short base;
+ int error, i, j;
+ int unit;
+ struct ifnet *ifp;
+
+ sc = device_get_softc(device);
+ ifp = &sc->wl_if;
+
+ mtx_init(&sc->wl_mtx, device_get_nameunit(device), MTX_NETWORK_LOCK,
+ MTX_DEF | MTX_RECURSE);
+
+ error = wl_allocate_resources(device);
+ if (error) {
+ wl_deallocate_resources(device);
+ return (ENXIO);
+ }
+
+ base = rman_get_start(sc->res_ioport);
+ unit = device_get_unit(device);
#ifdef WLDEBUG
printf("wlattach: base %x, unit %d\n", base, unit);
#endif
- id->id_ointr = wlintr;
+
sc->base = base;
sc->unit = unit;
sc->flags = 0;
sc->mode = 0;
sc->hacr = HACR_RESET;
callout_handle_init(&sc->watchdog_ch);
- CMD(unit); /* reset the board */
+ CMD(sc); /* reset the board */
DELAY(DELAYCONST); /* >> 4 clocks at 6MHz */
/* clear reset command and set PIO#2 in parameter access mode */
sc->hacr = (HACR_DEFAULT & ~HACR_16BITS);
- CMD(unit);
+ CMD(sc);
/* Read the PSA from the board for our later reference */
wlgetpsa(base, sc->psa);
@@ -473,9 +531,9 @@
/* enter normal 16 bit mode operation */
sc->hacr = HACR_DEFAULT;
- CMD(unit);
+ CMD(sc);
- wlinitmmc(unit);
+ wlinitmmc(sc);
outw(PIOR1(base), OFFSET_SCB + 8); /* address of scb_crcerrs */
outw(PIOP1(base), 0); /* clear scb_crcerrs */
outw(PIOP1(base), 0); /* clear scb_alnerrs */
@@ -484,7 +542,6 @@
bzero(ifp, sizeof(ifp));
ifp->if_softc = sc;
- ifp->if_unit = id->id_unit;
ifp->if_mtu = WAVELAN_MTU;
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX;
#ifdef WLDEBUG
@@ -500,6 +557,7 @@
ifp->if_start = wlstart;
ifp->if_ioctl = wlioctl;
ifp->if_timer = 0; /* paranoia */
+ ifp->if_snd.ifq_maxlen = IFQ_MAXLEN;
/* no entries
ifp->if_watchdog
ifp->if_done
@@ -514,20 +572,94 @@
printf(", Freq %d MHz",sc->freq24); /* 2.4 Gz */
printf("\n"); /* 2.4 Gz */
+ bus_setup_intr(device, sc->res_irq, INTR_TYPE_NET, wlintr, sc, &sc->intr_cookie);
if (bootverbose)
- wldump(unit);
- return(1);
+ wldump(sc);
+ return (0);
+}
+
+static int
+wldetach(device_t device)
+{
+ struct wl_softc *sc = device_get_softc(device);
+ device_t parent = device_get_parent(device);
+ struct ifnet *ifp;
+
+ ifp = &sc->wl_if;
+ ether_ifdetach(ifp);
+
+ WL_LOCK(sc);
+
+ /* reset the board */
+ sc->hacr = HACR_RESET;
+ CMD(sc);
+ sc->hacr = HACR_DEFAULT;
+ CMD(sc);
+
+ if (sc->intr_cookie != NULL) {
+ BUS_TEARDOWN_INTR(parent, device, sc->res_irq, sc->intr_cookie);
+ sc->intr_cookie = NULL;
+ }
+
+ bus_generic_detach(device);
+ wl_deallocate_resources(device);
+ WL_UNLOCK(sc);
+ mtx_destroy(&sc->wl_mtx);
+ return (0);
+}
+
+static int
+wl_allocate_resources(device_t device)
+{
+ struct wl_softc *sc = device_get_softc(device);
+ int ports = 16; /* Number of ports */
+
+ sc->res_ioport = bus_alloc_resource(device, SYS_RES_IOPORT,
+ &sc->rid_ioport, 0ul, ~0ul, ports, RF_ACTIVE);
+ if (sc->res_ioport == NULL)
+ goto errexit;
+
+ sc->res_irq = bus_alloc_resource(device, SYS_RES_IRQ,
+ &sc->rid_irq, 0ul, ~0ul, 1, RF_SHAREABLE|RF_ACTIVE);
+ if (sc->res_irq == NULL)
+ goto errexit;
+ return (0);
+
+errexit:
+ wl_deallocate_resources(device);
+ return (ENXIO);
+}
+
+static int
+wl_deallocate_resources(device_t device)
+{
+ struct wl_softc *sc = device_get_softc(device);
+
+ if (sc->res_irq != 0) {
+ bus_deactivate_resource(device, SYS_RES_IRQ,
+ sc->rid_irq, sc->res_irq);
+ bus_release_resource(device, SYS_RES_IRQ,
+ sc->rid_irq, sc->res_irq);
+ sc->res_irq = 0;
+ }
+ if (sc->res_ioport != 0) {
+ bus_deactivate_resource(device, SYS_RES_IOPORT,
+ sc->rid_ioport, sc->res_ioport);
+ bus_release_resource(device, SYS_RES_IOPORT,
+ sc->rid_ioport, sc->res_ioport);
+ sc->res_ioport = 0;
+ }
+ return (0);
}
/*
* Print out interesting information about the 82596.
*/
static void
-wldump(int unit)
+wldump(struct wl_softc *sc)
{
- struct wl_softc *sp = WLSOFTC(unit);
- int base = sp->base;
+ int base = sc->base;
int i;
printf("hasr %04x\n", inw(HASR(base)));
@@ -553,19 +685,18 @@
/* Initialize the Modem Management Controller */
static void
-wlinitmmc(int unit)
+wlinitmmc(struct wl_softc *sc)
{
- struct wl_softc *sp = WLSOFTC(unit);
- int base = sp->base;
+ int base = sc->base;
int configured;
- int mode = sp->mode;
+ int mode = sc->mode;
int i; /* 2.4 Gz */
/* enter 8 bit operation */
- sp->hacr = (HACR_DEFAULT & ~HACR_16BITS);
- CMD(unit);
+ sc->hacr = (HACR_DEFAULT & ~HACR_16BITS);
+ CMD(sc);
- configured = sp->psa[WLPSA_CONFIGURED] & 1;
+ configured = sc->psa[WLPSA_CONFIGURED] & 1;
/*
* Set default modem control parameters. Taken from NCR document
@@ -580,7 +711,7 @@
MMC_WRITE(MMC_DECAY_UPDAT_PRM, 0x00);
if (!configured) {
MMC_WRITE(MMC_LOOPT_SEL, 0x00);
- if (sp->psa[WLPSA_COMPATNO] & 1) {
+ if (sc->psa[WLPSA_COMPATNO] & 1) {
MMC_WRITE(MMC_THR_PRE_SET, 0x01); /* 0x04 for AT and 0x01 for MCA */
} else {
MMC_WRITE(MMC_THR_PRE_SET, 0x04); /* 0x04 for AT and 0x01 for MCA */
@@ -588,7 +719,7 @@
MMC_WRITE(MMC_QUALITY_THR, 0x03);
} else {
/* use configuration defaults from parameter storage area */
- if (sp->psa[WLPSA_NWIDENABLE] & 1) {
+ if (sc->psa[WLPSA_NWIDENABLE] & 1) {
if ((mode & (MOD_PROM | MOD_ENAL)) && wl_ignore_nwid) {
MMC_WRITE(MMC_LOOPT_SEL, 0x40);
} else {
@@ -597,23 +728,23 @@
} else {
MMC_WRITE(MMC_LOOPT_SEL, 0x40); /* disable network id check */
}
- MMC_WRITE(MMC_THR_PRE_SET, sp->psa[WLPSA_THRESH]);
- MMC_WRITE(MMC_QUALITY_THR, sp->psa[WLPSA_QUALTHRESH]);
+ MMC_WRITE(MMC_THR_PRE_SET, sc->psa[WLPSA_THRESH]);
+ MMC_WRITE(MMC_QUALITY_THR, sc->psa[WLPSA_QUALTHRESH]);
}
MMC_WRITE(MMC_FREEZE, 0x00);
MMC_WRITE(MMC_ENCR_ENABLE, 0x00);
- MMC_WRITE(MMC_NETW_ID_L,sp->nwid[1]); /* set NWID */
- MMC_WRITE(MMC_NETW_ID_H,sp->nwid[0]);
+ MMC_WRITE(MMC_NETW_ID_L,sc->nwid[1]); /* set NWID */
+ MMC_WRITE(MMC_NETW_ID_H,sc->nwid[0]);
/* enter normal 16 bit mode operation */
- sp->hacr = HACR_DEFAULT;
- CMD(unit);
- CMD(unit); /* virtualpc1 needs this! */
+ sc->hacr = HACR_DEFAULT;
+ CMD(sc);
+ CMD(sc); /* virtualpc1 needs this! */
- if (sp->psa[WLPSA_COMPATNO]== /* 2.4 Gz: half-card ver */
+ if (sc->psa[WLPSA_COMPATNO]== /* 2.4 Gz: half-card ver */
WLPSA_COMPATNO_WL24B) { /* 2.4 Gz */
- i=sp->chan24<<4; /* 2.4 Gz: position ch # */
+ i=sc->chan24<<4; /* 2.4 Gz: position ch # */
MMC_WRITE(MMC_EEADDR,i+0x0f); /* 2.4 Gz: named ch, wc=16 */
MMC_WRITE(MMC_EECTRL,MMC_EECTRL_DWLD+ /* 2.4 Gz: Download Synths */
MMC_EECTRL_EEOP_READ); /* 2.4 Gz: Read EEPROM */
@@ -639,14 +770,14 @@
MMC_WRITE(MMC_ANALCTRL, /* 2.4 Gz: EXT ant+polarity */
MMC_ANALCTRL_ANTPOL + /* 2.4 Gz: */
MMC_ANALCTRL_EXTANT); /* 2.4 Gz: */
- i=sp->chan24<<4; /* 2.4 Gz: position ch # */
+ i=sc->chan24<<4; /* 2.4 Gz: position ch # */
MMC_WRITE(MMC_EEADDR,i); /* 2.4 Gz: get frequency */
MMC_WRITE(MMC_EECTRL, /* 2.4 Gz: EEPROM read */
MMC_EECTRL_EEOP_READ); /* 2.4 Gz: */
DELAY(40); /* 2.4 Gz */
i = wlmmcread(base,MMC_EEDATALrv) /* 2.4 Gz: freq val */
+ (wlmmcread(base,MMC_EEDATAHrv)<<8); /* 2.4 Gz */
- sp->freq24 = (i>>6)+2400; /* 2.4 Gz: save real freq */
+ sc->freq24 = (i>>6)+2400; /* 2.4 Gz: save real freq */
}
}
@@ -667,7 +798,6 @@
struct wl_softc *sc = xsc;
struct ifnet *ifp = &sc->wl_if;
int stat;
- u_long oldpri;
#ifdef WLDEBUG
if (sc->wl_if.if_flags & IFF_DEBUG)
@@ -675,8 +805,7 @@
#endif
if (TAILQ_FIRST(&ifp->if_addrhead) == (struct ifaddr *)0)
return;
- oldpri = splimp();
- if ((stat = wlhwrst(sc->unit)) == TRUE) {
+ if ((stat = wlhwrst(sc)) == TRUE) {
sc->wl_if.if_flags |= IFF_RUNNING; /* same as DSF_RUNNING */
/*
* OACTIVE is used by upper-level routines
@@ -692,7 +821,6 @@
} else {
printf("wl%d init(): trouble resetting board.\n", sc->unit);
}
- splx(oldpri);
}
/*
@@ -706,40 +834,39 @@
*
*/
static int
-wlhwrst(int unit)
+wlhwrst(struct wl_softc *sc)
{
- struct wl_softc *sc = WLSOFTC(unit);
#ifdef WLDEBUG
if (sc->wl_if.if_flags & IFF_DEBUG)
- printf("wl%d: entered wlhwrst()\n",unit);
+ printf("wl%d: entered wlhwrst()\n", sc->unit);
#endif
sc->hacr = HACR_RESET;
- CMD(unit); /* reset the board */
+ CMD(sc); /* reset the board */
/* clear reset command and set PIO#1 in autoincrement mode */
sc->hacr = HACR_DEFAULT;
- CMD(unit);
+ CMD(sc);
#ifdef WLDEBUG
if (sc->wl_if.if_flags & IFF_DEBUG)
- wlmmcstat(unit); /* Display MMC registers */
+ wlmmcstat(sc); /* Display MMC registers */
#endif /* WLDEBUG */
- wlbldcu(unit); /* set up command unit structures */
+ wlbldcu(sc); /* set up command unit structures */
- if (wldiag(unit) == 0)
+ if (wldiag(sc) == 0)
return(0);
- if (wlconfig(unit) == 0)
+ if (wlconfig(sc) == 0)
return(0);
/*
* insert code for loopback test here
*/
- wlrustrt(unit); /* start receive unit */
+ wlrustrt(sc); /* start receive unit */
/* enable interrupts */
sc->hacr = (HACR_DEFAULT | HACR_INTRON);
- CMD(unit);
+ CMD(sc);
return(1);
}
@@ -752,16 +879,15 @@
*
*/
static void
-wlbldcu(int unit)
+wlbldcu(struct wl_softc *sc)
{
- struct wl_softc *sc = WLSOFTC(unit);
short base = sc->base;
scp_t scp;
iscp_t iscp;
scb_t scb;
ac_t cb;
tbd_t tbd;
- int i;
+ int i;
bzero(&scp, sizeof(scp));
scp.scp_sysbus = 0;
@@ -789,21 +915,21 @@
outw(PIOR1(base), OFFSET_SCB);
outsw(PIOP1(base), &scb, sizeof(scb_t)/2);
- SET_CHAN_ATTN(unit);
+ SET_CHAN_ATTN(sc);
outw(PIOR0(base), OFFSET_ISCP + 0); /* address of iscp_busy */
for (i = 1000000; inw(PIOP0(base)) && (i-- > 0); )
continue;
if (i <= 0)
- printf("wl%d bldcu(): iscp_busy timeout.\n", unit);
+ printf("wl%d bldcu(): iscp_busy timeout.\n", sc->unit);
outw(PIOR0(base), OFFSET_SCB + 0); /* address of scb_status */
for (i = STATUS_TRIES; i-- > 0; ) {
if (inw(PIOP0(base)) == (SCB_SW_CX|SCB_SW_CNA))
break;
}
if (i <= 0)
- printf("wl%d bldcu(): not ready after reset.\n", unit);
- wlack(unit);
+ printf("wl%d bldcu(): not ready after reset.\n", sc->unit);
+ wlack(sc);
cb.ac_status = 0;
cb.ac_command = AC_CW_EL; /* NOP */
@@ -833,10 +959,11 @@
{
int unit = ifp->if_unit;
struct mbuf *m;
- struct wl_softc *sc = WLSOFTC(unit);
+ struct wl_softc *sc = ifp->if_softc;
short base = sc->base;
int scb_status, cu_status, scb_command;
+ WL_LOCK(sc);
#ifdef WLDEBUG
if (sc->wl_if.if_flags & IFF_DEBUG)
printf("wl%d: entered wlstart()\n",unit);
@@ -869,6 +996,7 @@
#endif
if (xmt_watch) printf("!!");
} else {
+ WL_UNLOCK(sc);
return; /* genuinely still busy */
}
} else if ((scb_status & 0x0700) == SCB_CUS_ACTV ||
@@ -878,6 +1006,7 @@
unit, scb_status, cu_status);
#endif
if (xmt_watch) printf("wl%d: busy?!",unit);
+ WL_UNLOCK(sc);
return; /* hey, why are we busy? */
}
@@ -895,10 +1024,11 @@
sc->watchdog_ch = timeout(wlwatchdog, sc, 10);
sc->wl_ac.ac_if.if_flags |= IFF_OACTIVE;
sc->wl_if.if_opackets++;
- wlxmt(unit, m);
+ wlxmt(sc, m);
} else {
sc->wl_ac.ac_if.if_flags &= ~IFF_OACTIVE;
}
+ WL_UNLOCK(sc);
return;
}
@@ -921,9 +1051,8 @@
*
*/
static int
-wlread(int unit, u_short fd_p)
+wlread(struct wl_softc *sc, u_short fd_p)
{
- struct wl_softc *sc = WLSOFTC(unit);
struct ifnet *ifp = &sc->wl_if;
short base = sc->base;
fd_t fd;
@@ -937,12 +1066,12 @@
#ifdef WLDEBUG
if (sc->wl_if.if_flags & IFF_DEBUG)
- printf("wl%d: entered wlread()\n", unit);
+ printf("wl%d: entered wlread()\n", sc->unit);
#endif
if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) != (IFF_UP|IFF_RUNNING)) {
- printf("wl%d read(): board is not running.\n", unit);
+ printf("wl%d read(): board is not running.\n", sc->unit);
sc->hacr &= ~HACR_INTRON;
- CMD(unit); /* turn off interrupts */
+ CMD(sc); /* turn off interrupts */
}
/*
@@ -951,10 +1080,10 @@
outw(PIOR1(base), fd_p);
insw(PIOP1(base), &fd, sizeof(fd_t)/2);
if (fd.rbd_offset == I82586NULL) {
- if (wlhwrst(unit) != TRUE) {
+ if (wlhwrst(sc) != TRUE) {
sc->hacr &= ~HACR_INTRON;
- CMD(unit); /* turn off interrupts */
- printf("wl%d read(): hwrst trouble.\n", unit);
+ CMD(sc); /* turn off interrupts */
+ printf("wl%d read(): hwrst trouble.\n", sc->unit);
}
return 0;
}
@@ -968,10 +1097,10 @@
*/
m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
if (m == NULL) {
- if (wlhwrst(unit) != TRUE) {
+ if (wlhwrst(sc) != TRUE) {
sc->hacr &= ~HACR_INTRON;
- CMD(unit); /* turn off interrupts */
- printf("wl%d read(): hwrst trouble.\n", unit);
+ CMD(sc); /* turn off interrupts */
+ printf("wl%d read(): hwrst trouble.\n", sc->unit);
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list