From a40b01901fe4fb77c11599f629210074dbcdb9bb Mon Sep 17 00:00:00 2001 From: explorer Date: Sat, 5 Jan 2002 20:10:53 +0000 Subject: [PATCH] revert changes I made a long time ago. This should undo the changes which are causing problems on some non-x86 platforms. I'll probsably redo some of these changes, but after the next release branch. --- sys/dev/ic/wi.c | 273 +++++++------------------------------------ sys/dev/ic/wi_ieee.h | 15 +-- sys/dev/ic/wireg.h | 28 +---- sys/dev/ic/wivar.h | 6 +- 4 files changed, 50 insertions(+), 272 deletions(-) diff --git a/sys/dev/ic/wi.c b/sys/dev/ic/wi.c index 9387de8783e5..2cd94f1a9c66 100644 --- a/sys/dev/ic/wi.c +++ b/sys/dev/ic/wi.c @@ -1,4 +1,4 @@ -/* $NetBSD: wi.c,v 1.29 2001/11/13 13:14:46 lukem Exp $ */ +/* $NetBSD: wi.c,v 1.30 2002/01/05 20:10:53 explorer Exp $ */ /* * Copyright (c) 1997, 1998, 1999 @@ -70,7 +70,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: wi.c,v 1.29 2001/11/13 13:14:46 lukem Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wi.c,v 1.30 2002/01/05 20:10:53 explorer Exp $"); #define WI_HERMES_AUTOINC_WAR /* Work around data write autoinc bug. */ #define WI_HERMES_STATS_WAR /* Work around stats counter bug. */ @@ -104,8 +104,6 @@ __KERNEL_RCSID(0, "$NetBSD: wi.c,v 1.29 2001/11/13 13:14:46 lukem Exp $"); #include #include -#define STATS_FREQUENCY (60 * hz) /* collect stats every 60 seconds */ - static void wi_reset __P((struct wi_softc *)); static int wi_ioctl __P((struct ifnet *, u_long, caddr_t)); static void wi_start __P((struct ifnet *)); @@ -126,8 +124,7 @@ static int wi_write_data __P((struct wi_softc *, int, int, caddr_t, int)); static int wi_seek __P((struct wi_softc *, int, int, int)); static int wi_alloc_nicmem __P((struct wi_softc *, int, int *)); -static void wi_inquire_stats __P((void *)); -static void wi_inquire_scan __P((void *)); +static void wi_inquire __P((void *)); static int wi_setdef __P((struct wi_softc *, struct wi_req *)); static int wi_getdef __P((struct wi_softc *, struct wi_req *)); static int wi_mgmt_xmit __P((struct wi_softc *, caddr_t, int)); @@ -162,8 +159,7 @@ wi_attach(sc) s = splnet(); - callout_init(&sc->wi_stats_ch); - callout_init(&sc->wi_scan_ch); + callout_init(&sc->wi_inquire_ch); /* Make sure interrupts are disabled. */ CSR_WRITE_2(sc, WI_INT_EN, 0); @@ -228,8 +224,6 @@ wi_attach(sc) sc->wi_roaming = WI_DEFAULT_ROAMING; sc->wi_authtype = WI_DEFAULT_AUTHTYPE; - memset(&sc->wi_results, 0, sizeof (sc->wi_results)); - /* * Read the default channel from the NIC. This may vary * depending on the country where the NIC was purchased, so @@ -293,10 +287,6 @@ static void wi_rxeof(sc) struct wi_frame rx_frame; struct mbuf *m; int id; - u_int16_t msg_type; - u_int16_t status; - u_int16_t frame_ctl; - u_int16_t port; ifp = sc->sc_ifp; @@ -308,62 +298,10 @@ static void wi_rxeof(sc) return; } - status = le16toh(rx_frame.wi_status); - frame_ctl = le16toh(rx_frame.wi_frame_ctl); - port = (status >> 8) & 0x07; - msg_type = status & WI_RXSTAT_MSG_TYPE; - - /* - * Drop packets with CRC errors here. We may want the others, - * since we may be doing interesting things with undecryptable - * packets, like analyzing them in userland. - */ - if (status & WI_STAT_BADCRC) { - ifp->if_ierrors++; - return; - } - - if (port == 7) { - if ((le16toh(rx_frame.wi_dat_len) + 60) > MCLBYTES) - return; - - MGETHDR(m, M_DONTWAIT, MT_DATA); - if (m == NULL) { - ifp->if_ierrors++; - return; - } - MCLGET(m, M_DONTWAIT); - if (!(m->m_flags & M_EXT)) { - m_freem(m); - ifp->if_ierrors++; - return; - } - - memcpy(mtod(m, caddr_t), &rx_frame, 60); - m->m_pkthdr.rcvif = ifp; - - m->m_pkthdr.len = m->m_len = - le16toh(rx_frame.wi_dat_len) + 60; - - if (wi_read_data(sc, id, 60, mtod(m, caddr_t) + 60, - m->m_len - 60)) { - m_freem(m); - ifp->if_ierrors++; - return; - } - -#if NBPFILTER > 0 - if (ifp->if_bpf) - bpf_mtap(ifp->if_bpf, m); -#endif - m_freem(m); - return; - } - /* * Drop undecryptable or packets with receive errors here */ - if (status & WI_STAT_ERRSTAT) { + if (le16toh(rx_frame.wi_status) & WI_STAT_ERRSTAT) { ifp->if_ierrors++; return; } @@ -446,14 +384,6 @@ static void wi_rxeof(sc) bpf_mtap(ifp->if_bpf, m); #endif - /* - * Discard packets which are not data packets - */ - if (WLAN_FC_GET_TYPE(frame_ctl) != WLAN_FC_TYPE_DATA) { - m_freem(m); - return; - } - /* Receive packet. */ (*ifp->if_input)(ifp, m); } @@ -475,7 +405,7 @@ static void wi_txeof(sc, status) return; } -void wi_inquire_stats(xsc) +void wi_inquire(xsc) void *xsc; { struct wi_softc *sc; @@ -487,7 +417,7 @@ void wi_inquire_stats(xsc) if ((sc->sc_dev.dv_flags & DVF_ACTIVE) == 0) return; - callout_reset(&sc->wi_stats_ch, STATS_FREQUENCY, wi_inquire_stats, sc); + callout_reset(&sc->wi_inquire_ch, hz * 60, wi_inquire, sc); /* Don't do this while we're transmitting */ if (ifp->if_flags & IFF_OACTIVE) @@ -496,31 +426,6 @@ void wi_inquire_stats(xsc) wi_cmd(sc, WI_CMD_INQUIRE, WI_INFO_COUNTERS); } -void wi_inquire_scan(xsc) - void *xsc; -{ - struct wi_softc *sc; - struct ifnet *ifp; - - sc = xsc; - ifp = &sc->sc_ethercom.ec_if; - - if ((sc->sc_dev.dv_flags & DVF_ACTIVE) == 0) - return; - - if (sc->wi_results.scanning > 0) - callout_reset(&sc->wi_scan_ch, sc->wi_results.scanning, - wi_inquire_scan, sc); - else - callout_stop(&sc->wi_scan_ch); - - /* Don't do this while we're transmitting */ - if (ifp->if_flags & IFF_OACTIVE) - return; - - wi_cmd(sc, WI_CMD_INQUIRE, WI_INFO_SCAN_RESULTS); -} - void wi_update_stats(sc) struct wi_softc *sc; { @@ -537,55 +442,28 @@ void wi_update_stats(sc) wi_read_data(sc, id, 0, (char *)&gen, 4); - switch (gen.wi_type) { - case WI_INFO_COUNTERS: - /* some card versions have a larger stats structure */ - len = (gen.wi_len - 1 < sizeof(sc->wi_stats) / 4) ? - gen.wi_len - 1 : sizeof(sc->wi_stats) / 4; - ptr = (u_int32_t *)&sc->wi_stats; + if (gen.wi_type != WI_INFO_COUNTERS) + return; - for (i = 0; i < len; i++) { - t = CSR_READ_2(sc, WI_DATA1); + /* some card versions have a larger stats structure */ + len = (gen.wi_len - 1 < sizeof(sc->wi_stats) / 4) ? + gen.wi_len - 1 : sizeof(sc->wi_stats) / 4; + ptr = (u_int32_t *)&sc->wi_stats; + + for (i = 0; i < len; i++) { + t = CSR_READ_2(sc, WI_DATA1); #ifdef WI_HERMES_STATS_WAR - if (t > 0xF000) - t = ~t & 0xFFFF; + if (t > 0xF000) + t = ~t & 0xFFFF; #endif - ptr[i] += t; - } - - ifp->if_collisions = sc->wi_stats.wi_tx_single_retries + - sc->wi_stats.wi_tx_multi_retries + - sc->wi_stats.wi_tx_retry_limit; - break; - - case WI_INFO_SCAN_RESULTS: - microtime(&sc->wi_results.lastscan); - for (i = 0 ; i < gen.wi_len - 1 ; i++) { - t = CSR_READ_2(sc, WI_DATA1); - if (i < WI_SCAN_RESULTS_MAXLEN) - sc->wi_results.scan_results[i] = t; - } - if (gen.wi_len - 1 <= WI_SCAN_RESULTS_MAXLEN) { - sc->wi_results.len = gen.wi_len - 1; - sc->wi_results.truncated = 0; - } else { - sc->wi_results.len = WI_SCAN_RESULTS_MAXLEN; - sc->wi_results.truncated = 1; - } - break; - - default: -#if 0 - printf("Got info type: %04x\n", gen.wi_type); -#endif - for (i = 0; i < gen.wi_len; i++) { - t = CSR_READ_2(sc, WI_DATA1); -#if 0 - printf("[0x%02x] = 0x%04x\n", i, t); -#endif - } - break; + ptr[i] += t; } + + ifp->if_collisions = sc->wi_stats.wi_tx_single_retries + + sc->wi_stats.wi_tx_multi_retries + + sc->wi_stats.wi_tx_retry_limit; + + return; } int wi_intr(arg) @@ -1282,11 +1160,10 @@ wi_ioctl(ifp, command, data) u_long command; caddr_t data; { - int i, s, error = 0; + int s, error = 0; struct wi_softc *sc = ifp->if_softc; struct wi_req wreq; struct ifreq *ifr; - struct ifdrv *ifd; struct proc *p = curproc; struct ieee80211_nwid nwid; @@ -1355,34 +1232,28 @@ wi_ioctl(ifp, command, data) error = copyin(ifr->ifr_data, &wreq, sizeof(wreq)); if (error) break; - switch (wreq.wi_type) { - case WI_RID_IFACE_STATS: + if (wreq.wi_type == WI_RID_IFACE_STATS) { /* XXX native byte order */ memcpy((char *)&wreq.wi_val, (char *)&sc->wi_stats, - sizeof(sc->wi_stats)); + sizeof(sc->wi_stats)); wreq.wi_len = (sizeof(sc->wi_stats) / 2) + 1; - break; - case WI_RID_DEFLT_CRYPT_KEYS: + } else if (wreq.wi_type == WI_RID_DEFLT_CRYPT_KEYS) { /* For non-root user, return all-zeroes keys */ if (suser(p->p_ucred, &p->p_acflag)) memset((char *)&wreq, 0, - sizeof(struct wi_ltv_keys)); + sizeof(struct wi_ltv_keys)); else memcpy((char *)&wreq, (char *)&sc->wi_keys, - sizeof(struct wi_ltv_keys)); - break; - default: + sizeof(struct wi_ltv_keys)); + } else { if (sc->sc_enabled == 0) error = wi_getdef(sc, &wreq); - else if (wi_read_record(sc, - (struct wi_ltv_gen *)&wreq)) + else if (wi_read_record(sc, (struct wi_ltv_gen *)&wreq)) error = EINVAL; - break; } if (error == 0) error = copyout(&wreq, ifr->ifr_data, sizeof(wreq)); break; - case SIOCSWAVELAN: error = suser(p->p_ucred, &p->p_acflag); if (error) @@ -1390,16 +1261,13 @@ wi_ioctl(ifp, command, data) error = copyin(ifr->ifr_data, &wreq, sizeof(wreq)); if (error) break; - switch (wreq.wi_type) { - case WI_RID_IFACE_STATS: + if (wreq.wi_type == WI_RID_IFACE_STATS) { error = EINVAL; break; - case WI_RID_MGMT_XMIT: + } else if (wreq.wi_type == WI_RID_MGMT_XMIT) { error = wi_mgmt_xmit(sc, (caddr_t)&wreq.wi_val, - wreq.wi_len); - break; - - default: + wreq.wi_len); + } else { if (sc->sc_enabled != 0) error = wi_write_record(sc, (struct wi_ltv_gen *)&wreq); @@ -1408,67 +1276,8 @@ wi_ioctl(ifp, command, data) if (error == 0 && sc->sc_enabled != 0) /* Reinitialize WaveLAN. */ wi_init(ifp); - break; } break; - - case SIOCSDRVSPEC: - error = suser(p->p_ucred, &p->p_acflag); - if (error) - break; - ifd = (struct ifdrv *)data; - switch (ifd->ifd_cmd) { - case WI_IOCTL_SET_SCAN: - error = copyin(ifd->ifd_data, &i, sizeof (i)); - if (error) - break; - - sc->wi_results.scanning = i; - if (sc->wi_results.scanning > 0) - callout_reset(&sc->wi_scan_ch, - sc->wi_results.scanning, - wi_inquire_scan, sc); - else - callout_stop(&sc->wi_scan_ch); - break; - - /* - * Experimental XXXMLG - */ - case WI_IOCTL_SET_TESTMODE: - error = copyin(ifd->ifd_data, &i, sizeof (i)); - if (error) - break; - if (i) { - wi_cmd(sc, WI_CMD_TEST | WI_TEST_MONITOR << 8, - 0); - printf("wi test mode enabled\n"); - } else { - wi_cmd(sc, WI_CMD_TEST | WI_TEST_STOP << 8, 0); - printf("wi test mode disabled\n"); - } - break; - - default: - error = EINVAL; - break; - } - break; - - case SIOCGDRVSPEC: - ifd = (struct ifdrv *)data; - switch (ifd->ifd_cmd) { - case WI_IOCTL_GET_SCAN_RESULTS: - error = copyout(&sc->wi_results, ifd->ifd_data, - sizeof(struct wi_scan_results)); - break; - - default: - error = EINVAL; - break; - } - break; - case SIOCG80211NWID: if (sc->sc_enabled == 0) { /* Return the desired ID */ @@ -1649,7 +1458,7 @@ wi_init(ifp) ifp->if_flags |= IFF_RUNNING; ifp->if_flags &= ~IFF_OACTIVE; - callout_reset(&sc->wi_stats_ch, STATS_FREQUENCY, wi_inquire_stats, sc); + callout_reset(&sc->wi_inquire_ch, hz * 60, wi_inquire, sc); out: if (error) { @@ -1794,8 +1603,7 @@ wi_stop(ifp, disable) CSR_WRITE_2(sc, WI_INT_EN, 0); wi_cmd(sc, WI_CMD_DISABLE|sc->wi_portnum, 0); - callout_stop(&sc->wi_stats_ch); - callout_stop(&sc->wi_scan_ch); + callout_stop(&sc->wi_inquire_ch); if (disable) { if (sc->sc_enabled) { @@ -1947,8 +1755,7 @@ wi_detach(sc) return (0); s = splnet(); - callout_stop(&sc->wi_stats_ch); - callout_stop(&sc->wi_scan_ch); + callout_stop(&sc->wi_inquire_ch); /* Delete all remaining media. */ ifmedia_delete_instance(&sc->sc_media, IFM_INST_ANY); diff --git a/sys/dev/ic/wi_ieee.h b/sys/dev/ic/wi_ieee.h index 383d9e8cc152..d62ccce0b8f6 100644 --- a/sys/dev/ic/wi_ieee.h +++ b/sys/dev/ic/wi_ieee.h @@ -1,4 +1,4 @@ -/* $NetBSD: wi_ieee.h,v 1.6 2001/11/11 00:34:52 christos Exp $ */ +/* $NetBSD: wi_ieee.h,v 1.7 2002/01/05 20:10:53 explorer Exp $ */ /* * Copyright (c) 1997, 1998, 1999 @@ -66,7 +66,7 @@ * Technically I don't think there's a limit to a record * length. The largest record is the one that contains the CIS * data, which is 240 words long, so 256 should be a safe - * value. But 512 is more safe? + * value. */ #define WI_MAX_DATALEN 512 @@ -76,13 +76,6 @@ struct wi_req { u_int16_t wi_val[WI_MAX_DATALEN]; }; -#define WI_IOCTL_SET_SCAN 1 -#define WI_IOCTL_GET_SCAN 2 -#define WI_IOCTL_GET_SCAN_RESULTS 3 -#define WI_IOCTL_SET_TESTMODE 4 -#define WI_IOCTL_MGMT_XMIT 5 -#define WI_IOCTL_IFACE_STATS 6 - /* * Private LTV records (interpreted only by the driver). This is * a minor kludge to allow reading the interface statistics from @@ -188,7 +181,9 @@ struct wi_counters { }; /* - * results of last ap scan + * These are all the LTV record types that we can read or write + * from the WaveLAN. Not all of them are temendously useful, but I + * list as many as I know about here for completeness. */ #define WI_SCAN_RESULTS_MAXLEN 512 struct wi_scan_results { diff --git a/sys/dev/ic/wireg.h b/sys/dev/ic/wireg.h index 2dd64ebb80e3..92363328888c 100644 --- a/sys/dev/ic/wireg.h +++ b/sys/dev/ic/wireg.h @@ -1,4 +1,4 @@ -/* $NetBSD: wireg.h,v 1.13 2001/11/11 00:16:07 christos Exp $ */ +/* $NetBSD: wireg.h,v 1.14 2002/01/05 20:10:53 explorer Exp $ */ /* * Copyright (c) 1997, 1998, 1999 @@ -206,18 +206,9 @@ #define WI_CMD_INQUIRE 0x0011 #define WI_CMD_ACCESS 0x0021 #define WI_CMD_PROGRAM 0x0022 -#define WI_CMD_READMIF 0x0030 /* prism2 only? */ -#define WI_CMD_WRITEMIF 0x0031 /* prism2 only? */ -#define WI_CMD_TEST 0x0038 /* prism2 only? */ #define WI_CMD_CODE_MASK 0x003F -/* - * prism2 test mode commands - */ -#define WI_TEST_MONITOR 0x000b -#define WI_TEST_STOP 0x000f - /* * Reclaim qualifier bit, applicable to the * TX and INQUIRE commands. @@ -281,7 +272,7 @@ #define WI_EV_RES 0x4000 /* controller h/w error (time out) */ #define WI_EV_INFO_DROP 0x2000 /* no RAM to build unsolicited frame */ #define WI_EV_NO_CARD 0x0800 /* card removed (hunh?) */ -#define WI_EV_AWAKE 0x0100 +#define WI_EV_DUIF_RX 0x0400 /* wavelan management packet received */ #define WI_EV_INFO 0x0080 /* async info frame */ #define WI_EV_CMD 0x0010 /* command completed */ #define WI_EV_ALLOC 0x0008 /* async alloc/reclaim completed */ @@ -534,7 +525,6 @@ struct wi_frame { u_int16_t wi_rsvd2; /* 0x08 */ u_int16_t wi_rsvd3; /* 0x0A */ u_int16_t wi_tx_ctl; /* 0x0C */ - /* 802.11 */ u_int16_t wi_frame_ctl; /* 0x0E */ u_int16_t wi_id; /* 0x10 */ u_int8_t wi_addr1[6]; /* 0x12 */ @@ -543,12 +533,10 @@ struct wi_frame { u_int16_t wi_seq_ctl; /* 0x24 */ u_int8_t wi_addr4[6]; /* 0x26 */ u_int16_t wi_dat_len; /* 0x2C */ - /* 802.3 */ u_int8_t wi_dst_addr[6]; /* 0x2E */ u_int8_t wi_src_addr[6]; /* 0x34 */ u_int16_t wi_len; /* 0x3A */ - /* SNAP header */ - u_int16_t wi_dat[3]; /* 0x3C */ + u_int16_t wi_dat[3]; /* 0x3C */ /* SNAP header */ u_int16_t wi_type; /* 0x42 */ }; @@ -565,16 +553,6 @@ struct wi_frame { #define WI_STAT_WMP_MSG 0x6000 /* WaveLAN-II management protocol */ #define WI_RXSTAT_MSG_TYPE 0xE000 -#define BIT(x) (1 << (x)) - -#define WLAN_FC_GET_TYPE(fc) (((fc) & (BIT(3) | BIT(2))) >> 2) -#define WLAN_FC_GET_STYPE(fc) \ - (((fc) & (BIT(7) | BIT(6) | BIT(5) | BIT(4))) >> 4) - -#define WLAN_FC_TYPE_MGMT 0 -#define WLAN_FC_TYPE_CTRL 1 -#define WLAN_FC_TYPE_DATA 2 - #define WI_ENC_TX_802_3 0x00 #define WI_ENC_TX_802_11 0x11 #define WI_ENC_TX_E_II 0x0E diff --git a/sys/dev/ic/wivar.h b/sys/dev/ic/wivar.h index c8e3f7c1e578..f769aabdbf1f 100644 --- a/sys/dev/ic/wivar.h +++ b/sys/dev/ic/wivar.h @@ -1,4 +1,4 @@ -/* $NetBSD: wivar.h,v 1.6 2001/10/13 15:00:24 ichiro Exp $ */ +/* $NetBSD: wivar.h,v 1.7 2002/01/05 20:10:53 explorer Exp $ */ /* * Copyright (c) 1997, 1998, 1999 @@ -55,8 +55,7 @@ struct wi_softc { bus_space_tag_t sc_iot; /* bus cookie */ bus_space_handle_t sc_ioh; /* bus i/o handle */ - struct callout wi_stats_ch; - struct callout wi_scan_ch; + struct callout wi_inquire_ch; u_int8_t sc_macaddr[ETHER_ADDR_LEN]; @@ -88,7 +87,6 @@ struct wi_softc { int wi_tx_key; struct wi_ltv_keys wi_keys; struct wi_counters wi_stats; - struct wi_scan_results wi_results; }; int wi_attach __P((struct wi_softc *));