From owner-freebsd-mobile Sat Mar 2 16: 8: 8 2002 Delivered-To: freebsd-mobile@freebsd.org Received: from rover.village.org (rover.bsdimp.com [204.144.255.66]) by hub.freebsd.org (Postfix) with ESMTP id 9C59F37B41E for ; Sat, 2 Mar 2002 16:07:36 -0800 (PST) Received: from harmony.village.org (harmony.village.org [10.0.0.6]) by rover.village.org (8.11.3/8.11.3) with ESMTP id g2307Zi63095; Sat, 2 Mar 2002 17:07:35 -0700 (MST) (envelope-from imp@village.org) Received: from localhost (warner@rover2.village.org [10.0.0.1]) by harmony.village.org (8.11.6/8.11.6) with ESMTP id g2307YL60372; Sat, 2 Mar 2002 17:07:34 -0700 (MST) (envelope-from imp@village.org) Date: Sat, 02 Mar 2002 17:07:00 -0700 (MST) Message-Id: <20020302.170700.133587807.imp@village.org> To: simond@irrelevant.org Cc: freebsd-mobile@FreeBSD.ORG Subject: Re: Ideas on getting a Symbol CF 802.11b card working From: "M. Warner Losh" In-Reply-To: <20020302102616.GD355@irrelevant.org> References: <20020302102616.GD355@irrelevant.org> X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Sender: owner-freebsd-mobile@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org In message: <20020302102616.GD355@irrelevant.org> Simon Dick writes: : Anyone got any idea how I can get this working using NEWCARD? I've : included the dmesg -v output below if it helps. : : pccard0: CIS version PC Card Standard 5.0 : pccard0: CIS info: Symbol, Spectrum24 LA4100 Series WLAN PC Card, 1.00 : pccard0: Manufacturer code 0x26c, product 0x1 : pccard0: function 0: network adapter, ccr addr 3e0 mask 7 : pccard0: function 0, config table entry 1: I/O card; irq mask ffff; iomask 7, iospace 0-47; mwait_required rdy : : (If it doesn't work, I'm not all that bothered, I'm only trying it in : my laptop to see if it worked or not) You might try my current set of diffs for the wi driver. Warner Index: if_wi.c =================================================================== RCS file: /cache/ncvs/src/sys/dev/wi/if_wi.c,v retrieving revision 1.76 diff -u -r1.76 if_wi.c --- if_wi.c 2 Mar 2002 00:06:23 -0000 1.76 +++ if_wi.c 3 Mar 2002 00:04:26 -0000 @@ -129,55 +129,53 @@ */ #define LE16TOH(a) ((a) = le16toh((a))) -static void wi_intr __P((void *)); -static void wi_reset __P((struct wi_softc *)); -static int wi_ioctl __P((struct ifnet *, u_long, caddr_t)); -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 *)); -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 *)); -static void wi_setmulti __P((struct wi_softc *)); - -static int wi_cmd __P((struct wi_softc *, int, int)); -static int wi_read_record __P((struct wi_softc *, struct wi_ltv_gen *)); -static int wi_write_record __P((struct wi_softc *, struct wi_ltv_gen *)); -static int wi_read_data __P((struct wi_softc *, int, - int, caddr_t, int)); -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 __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)); +static void wi_intr(void *); +static void wi_reset(struct wi_softc *); +static int wi_ioctl(struct ifnet *, u_long, caddr_t); +static void wi_init(void *); +static void wi_start(struct ifnet *); +static void wi_stop(struct wi_softc *); +static void wi_watchdog(struct ifnet *); +static void wi_rxeof(struct wi_softc *); +static void wi_txeof(struct wi_softc *, int); +static void wi_update_stats(struct wi_softc *); +static void wi_setmulti(struct wi_softc *); + +static int wi_cmd(struct wi_softc *, int, int); +static int wi_read_record(struct wi_softc *, struct wi_ltv_gen *); +static int wi_write_record(struct wi_softc *, struct wi_ltv_gen *); +static int wi_read_data(struct wi_softc *, int, int, caddr_t, int); +static int wi_write_data(struct wi_softc *, int, int, caddr_t, int); +static int wi_seek(struct wi_softc *, int, int, int); +static int wi_alloc_nicmem(struct wi_softc *, int, int *); +static void wi_inquire(void *); +static void wi_setdef(struct wi_softc *, struct wi_req *); +static int wi_mgmt_xmit(struct wi_softc *, caddr_t, int); #ifdef WICACHE static -void wi_cache_store __P((struct wi_softc *, struct ether_header *, - struct mbuf *, unsigned short)); +void wi_cache_store (struct wi_softc *, struct ether_header *, + struct mbuf *, unsigned short); #endif -static int wi_generic_attach __P((device_t)); -static int wi_pccard_match __P((device_t)); -static int wi_pccard_probe __P((device_t)); -static int wi_pccard_attach __P((device_t)); +static int wi_generic_attach(device_t); +static int wi_pccard_match(device_t); +static int wi_pccard_probe(device_t); +static int wi_pccard_attach(device_t); #if NPCI > 0 -static int wi_pci_probe __P((device_t)); -static int wi_pci_attach __P((device_t)); +static int wi_pci_probe(device_t); +static int wi_pci_attach(device_t); #endif -static int wi_pccard_detach __P((device_t)); -static void wi_shutdown __P((device_t)); +static int wi_pccard_detach(device_t); +static void wi_shutdown(device_t); -static int wi_alloc __P((device_t, int)); -static void wi_free __P((device_t)); +static int wi_alloc(device_t, int); +static void wi_free(device_t); -static int wi_get_cur_ssid __P((struct wi_softc *, char *, int *)); -static void wi_get_id __P((struct wi_softc *, device_t)); -static int wi_media_change __P((struct ifnet *)); -static void wi_media_status __P((struct ifnet *, struct ifmediareq *)); +static int wi_get_cur_ssid(struct wi_softc *, char *, int *); +static void wi_get_id(struct wi_softc *, device_t); +static int wi_media_change(struct ifnet *); +static void wi_media_status(struct ifnet *, struct ifmediareq *); static device_method_t wi_pccard_methods[] = { /* Device interface */ @@ -252,10 +250,12 @@ PCMCIA_CARD(ELSA, XI300_IEEE, 0), PCMCIA_CARD(ELSA, XI800_IEEE, 0), PCMCIA_CARD(EMTAC, WLAN, 0), + PCMCIA_CARD(ERICSSON, WIRELESSLAN, 0), PCMCIA_CARD(GEMTEK, WLAN, 0), PCMCIA_CARD(INTEL, PRO_WLAN_2011, 0), PCMCIA_CARD(INTERSIL, PRISM2, 0), PCMCIA_CARD(IODATA2, WNB11PCM, 0), + /* Now that we do PRISM detection, I don't think we need these - imp */ PCMCIA_CARD2(LUCENT, WAVELAN_IEEE, NANOSPEED_PRISM2, 0), PCMCIA_CARD2(LUCENT, WAVELAN_IEEE, NEC_CMZ_RT_WP, 0), PCMCIA_CARD2(LUCENT, WAVELAN_IEEE, NTT_ME_WLAN, 0), @@ -264,13 +264,14 @@ PCMCIA_CARD(LUCENT, WAVELAN_IEEE, 0), PCMCIA_CARD(LINKSYS2, IWN, 0), PCMCIA_CARD(SAMSUNG, SWL_2000N, 0), + PCMCIA_CARD(SIMPLETECH, SPECTRUM24_ALT, 0), + PCMCIA_CARD(SOCKET, LP_WLAN_CF, 0), PCMCIA_CARD(TDK, LAK_CD011WL, 0), { NULL } }; static int -wi_pccard_match(dev) - device_t dev; +wi_pccard_match(device_t dev) { const struct pccard_product *pp; @@ -283,8 +284,7 @@ } static int -wi_pccard_probe(dev) - device_t dev; +wi_pccard_probe(device_t dev) { struct wi_softc *sc; int error; @@ -308,8 +308,7 @@ #if NPCI > 0 static int -wi_pci_probe(dev) - device_t dev; +wi_pci_probe(device_t dev) { struct wi_softc *sc; int i; @@ -329,8 +328,7 @@ #endif static int -wi_pccard_detach(dev) - device_t dev; +wi_pccard_detach(device_t dev) { struct wi_softc *sc; struct ifnet *ifp; @@ -571,6 +569,8 @@ sc->wi_create_ibss = WI_DEFAULT_CREATE_IBSS; sc->wi_pm_enabled = WI_DEFAULT_PM_ENABLED; sc->wi_max_sleep = WI_DEFAULT_MAX_SLEEP; + sc->wi_roaming = WI_DEFAULT_ROAMING; + sc->wi_authtype = WI_DEFAULT_AUTHTYPE; /* * Read the default channel from the NIC. This may vary @@ -636,9 +636,7 @@ } static void -wi_get_id(sc, dev) - struct wi_softc *sc; - device_t dev; +wi_get_id(struct wi_softc *sc, device_t dev) { struct wi_ltv_ver ver; @@ -710,8 +708,7 @@ } static void -wi_rxeof(sc) - struct wi_softc *sc; +wi_rxeof(struct wi_softc *sc) { struct ifnet *ifp; struct ether_header *eh; @@ -822,9 +819,7 @@ } static void -wi_txeof(sc, status) - struct wi_softc *sc; - int status; +wi_txeof(struct wi_softc *sc, int status) { struct ifnet *ifp; @@ -842,8 +837,7 @@ } void -wi_inquire(xsc) - void *xsc; +wi_inquire(void *xsc) { struct wi_softc *sc; struct ifnet *ifp; @@ -863,8 +857,7 @@ } void -wi_update_stats(sc) - struct wi_softc *sc; +wi_update_stats(struct wi_softc *sc) { struct wi_ltv_gen gen; u_int16_t id; @@ -903,8 +896,7 @@ } static void -wi_intr(xsc) - void *xsc; +wi_intr(void *xsc) { struct wi_softc *sc = xsc; struct ifnet *ifp; @@ -973,10 +965,7 @@ } static int -wi_cmd(sc, cmd, val) - struct wi_softc *sc; - int cmd; - int val; +wi_cmd(struct wi_softc *sc, int cmd, int val) { int i, s = 0; @@ -1028,8 +1017,7 @@ } static void -wi_reset(sc) - struct wi_softc *sc; +wi_reset(struct wi_softc *sc) { #define WI_INIT_TRIES 5 int i; @@ -1055,9 +1043,7 @@ * Read an LTV record from the NIC. */ static int -wi_read_record(sc, ltv) - struct wi_softc *sc; - struct wi_ltv_gen *ltv; +wi_read_record(struct wi_softc *sc, struct wi_ltv_gen *ltv) { u_int16_t *ptr; int i, len, code; @@ -1133,6 +1119,13 @@ oltv->wi_len = 2; oltv->wi_val = ltv->wi_val; break; + case WI_RID_AUTH_CNTL: + oltv->wi_len = 2; + if (le16toh(ltv->wi_val) & 0x01) + oltv->wi_val = htole16(1); + else if (le16toh(ltv->wi_val) & 0x02) + oltv->wi_val = htole16(2); + break; } } @@ -1143,9 +1136,7 @@ * Same as read, except we inject data instead of reading it. */ static int -wi_write_record(sc, ltv) - struct wi_softc *sc; - struct wi_ltv_gen *ltv; +wi_write_record(struct wi_softc *sc, struct wi_ltv_gen *ltv) { u_int16_t *ptr; int i; @@ -1206,6 +1197,15 @@ } return 0; } + case WI_RID_AUTH_CNTL: + p2ltv.wi_type = WI_RID_AUTH_CNTL; + p2ltv.wi_len = 2; + if (le16toh(ltv->wi_val) == 1) + p2ltv.wi_val = htole16(0x01); + else if (le16toh(ltv->wi_val) == 2) + p2ltv.wi_val = htole16(0x02); + ltv = &p2ltv; + break; } } @@ -1226,9 +1226,7 @@ } static int -wi_seek(sc, id, off, chan) - struct wi_softc *sc; - int id, off, chan; +wi_seek(struct wi_softc *sc, int id, int off, int chan) { int i; int selreg, offreg; @@ -1268,11 +1266,7 @@ } static int -wi_read_data(sc, id, off, buf, len) - struct wi_softc *sc; - int id, off; - caddr_t buf; - int len; +wi_read_data(struct wi_softc *sc, int id, int off, caddr_t buf, int len) { int i; u_int16_t *ptr; @@ -1300,11 +1294,7 @@ * we expect them, we preform the transfer over again. */ static int -wi_write_data(sc, id, off, buf, len) - struct wi_softc *sc; - int id, off; - caddr_t buf; - int len; +wi_write_data(struct wi_softc *sc, int id, int off, caddr_t buf, int len) { int i; u_int16_t *ptr; @@ -1346,10 +1336,7 @@ * it out. */ static int -wi_alloc_nicmem(sc, len, id) - struct wi_softc *sc; - int len; - int *id; +wi_alloc_nicmem(struct wi_softc *sc, int len, int *id) { int i; @@ -1385,8 +1372,7 @@ } static void -wi_setmulti(sc) - struct wi_softc *sc; +wi_setmulti(struct wi_softc *sc) { struct ifnet *ifp; int i = 0; @@ -1425,9 +1411,7 @@ } static void -wi_setdef(sc, wreq) - struct wi_softc *sc; - struct wi_req *wreq; +wi_setdef(struct wi_softc *sc, struct wi_req *wreq) { struct sockaddr_dl *sdl; struct ifaddr *ifa; @@ -1444,25 +1428,25 @@ bcopy((char *)&wreq->wi_val, LLADDR(sdl), ETHER_ADDR_LEN); break; case WI_RID_PORTTYPE: - sc->wi_ptype = wreq->wi_val[0]; + sc->wi_ptype = le16toh(wreq->wi_val[0]); break; case WI_RID_TX_RATE: - sc->wi_tx_rate = wreq->wi_val[0]; + sc->wi_tx_rate = le16toh(wreq->wi_val[0]); break; case WI_RID_MAX_DATALEN: - sc->wi_max_data_len = wreq->wi_val[0]; + sc->wi_max_data_len = le16toh(wreq->wi_val[0]); break; case WI_RID_RTS_THRESH: - sc->wi_rts_thresh = wreq->wi_val[0]; + sc->wi_rts_thresh = le16toh(wreq->wi_val[0]); break; case WI_RID_SYSTEM_SCALE: - sc->wi_ap_density = wreq->wi_val[0]; + sc->wi_ap_density = le16toh(wreq->wi_val[0]); break; case WI_RID_CREATE_IBSS: - sc->wi_create_ibss = wreq->wi_val[0]; + sc->wi_create_ibss = le16toh(wreq->wi_val[0]); break; case WI_RID_OWN_CHNL: - sc->wi_channel = wreq->wi_val[0]; + sc->wi_channel = le16toh(wreq->wi_val[0]); break; case WI_RID_NODENAME: bzero(sc->wi_node_name, sizeof(sc->wi_node_name)); @@ -1477,16 +1461,25 @@ bcopy((char *)&wreq->wi_val[1], sc->wi_ibss_name, 30); break; case WI_RID_PM_ENABLED: - sc->wi_pm_enabled = wreq->wi_val[0]; + sc->wi_pm_enabled = le16toh(wreq->wi_val[0]); + break; + case WI_RID_MICROWAVE_OVEN: + sc->wi_mor_enabled = le16toh(wreq->wi_val[0]); break; case WI_RID_MAX_SLEEP: - sc->wi_max_sleep = wreq->wi_val[0]; + sc->wi_max_sleep = le16toh(wreq->wi_val[0]); + break; + case WI_RID_AUTH_CNTL: + sc->wi_authtype = le16toh(wreq->wi_val[0]); + break; + case WI_RID_ROAMING_MODE: + sc->wi_roaming = le16toh(wreq->wi_val[0]); break; case WI_RID_ENCRYPTION: - sc->wi_use_wep = wreq->wi_val[0]; + sc->wi_use_wep = le16toh(wreq->wi_val[0]); break; case WI_RID_TX_CRYPT_KEY: - sc->wi_tx_key = wreq->wi_val[0]; + sc->wi_tx_key = le16toh(wreq->wi_val[0]); break; case WI_RID_DEFLT_CRYPT_KEYS: bcopy((char *)wreq, (char *)&sc->wi_keys, @@ -1503,10 +1496,7 @@ } static int -wi_ioctl(ifp, command, data) - struct ifnet *ifp; - u_long command; - caddr_t data; +wi_ioctl(struct ifnet *ifp, u_long command, caddr_t data) { int error = 0; int len; @@ -1827,8 +1817,7 @@ } static void -wi_init(xsc) - void *xsc; +wi_init(void *xsc) { struct wi_softc *sc = xsc; struct ifnet *ifp = &sc->arpcom.ac_if; @@ -1871,6 +1860,9 @@ /* Power Managment Max Sleep */ WI_SETVAL(WI_RID_MAX_SLEEP, sc->wi_max_sleep); + /* Roaming type */ + WI_SETVAL(WI_RID_ROAMING_MODE, sc->wi_roaming); + /* Specify the IBSS name */ WI_SETSTR(WI_RID_OWN_SSID, sc->wi_ibss_name); @@ -1897,6 +1889,22 @@ sc->wi_keys.wi_len = (sizeof(struct wi_ltv_keys) / 2) + 1; sc->wi_keys.wi_type = WI_RID_DEFLT_CRYPT_KEYS; wi_write_record(sc, (struct wi_ltv_gen *)&sc->wi_keys); + if (sc->wi_prism2 && sc->wi_use_wep) { + /* + * ONLY HWB3163 EVAL-CARD Firmware version + * less than 0.8 variant3 + * + * If promiscuous mode disable, Prism2 chip + * does not work with WEP . + * It is under investigation for details. + * (ichiro@netbsd.org) + */ + if (sc->wi_prism2_ver < 83 ) { + /* firm ver < 0.8 variant 3 */ + WI_SETVAL(WI_RID_PROMISC, 1); + } + WI_SETVAL(WI_RID_AUTH_CNTL, sc->wi_authtype); + } } /* Initialize promisc mode. */ @@ -1910,7 +1918,7 @@ wi_setmulti(sc); /* Enable desired port */ - wi_cmd(sc, WI_CMD_ENABLE|sc->wi_portnum, 0); + wi_cmd(sc, WI_CMD_ENABLE | sc->wi_portnum, 0); if (wi_alloc_nicmem(sc, ETHER_MAX_LEN + sizeof(struct wi_frame) + 8, &id)) device_printf(sc->dev, "tx buffer allocation failed\n"); @@ -1933,8 +1941,7 @@ } static void -wi_start(ifp) - struct ifnet *ifp; +wi_start(struct ifnet *ifp) { struct wi_softc *sc; struct mbuf *m0; @@ -2030,10 +2037,7 @@ } static int -wi_mgmt_xmit(sc, data, len) - struct wi_softc *sc; - caddr_t data; - int len; +wi_mgmt_xmit(struct wi_softc *sc, caddr_t data, int len) { struct wi_frame tx_frame; int id; @@ -2068,8 +2072,7 @@ } static void -wi_stop(sc) - struct wi_softc *sc; +wi_stop(struct wi_softc *sc) { struct ifnet *ifp; @@ -2101,8 +2104,7 @@ } static void -wi_watchdog(ifp) - struct ifnet *ifp; +wi_watchdog(struct ifnet *ifp) { struct wi_softc *sc; @@ -2118,9 +2120,7 @@ } static int -wi_alloc(dev, rid) - device_t dev; - int rid; +wi_alloc(device_t dev, int rid) { struct wi_softc *sc = device_get_softc(dev); @@ -2192,8 +2192,7 @@ } static void -wi_shutdown(dev) - device_t dev; +wi_shutdown(device_t dev) { struct wi_softc *sc; @@ -2411,10 +2410,7 @@ #endif static int -wi_get_cur_ssid(sc, ssid, len) - struct wi_softc *sc; - char *ssid; - int *len; +wi_get_cur_ssid(struct wi_softc *sc, char *ssid, int *len) { int error = 0; struct wi_req wreq; @@ -2464,8 +2460,7 @@ } static int -wi_media_change(ifp) - struct ifnet *ifp; +wi_media_change(struct ifnet *ifp) { struct wi_softc *sc = ifp->if_softc; int otype = sc->wi_ptype; @@ -2502,9 +2497,7 @@ } static void -wi_media_status(ifp, imr) - struct ifnet *ifp; - struct ifmediareq *imr; +wi_media_status(struct ifnet *ifp, struct ifmediareq *imr) { struct wi_req wreq; struct wi_softc *sc = ifp->if_softc; Index: if_wireg.h =================================================================== RCS file: /cache/ncvs/src/sys/dev/wi/if_wireg.h,v retrieving revision 1.18 diff -u -r1.18 if_wireg.h --- if_wireg.h 12 Feb 2002 17:52:11 -0000 1.18 +++ if_wireg.h 13 Feb 2002 18:10:27 -0000 @@ -69,9 +69,11 @@ #define WI_RID_P2_TX_CRYPT_KEY 0xFC23 #define WI_RID_P2_CRYPT_KEY0 0xFC24 #define WI_RID_P2_CRYPT_KEY1 0xFC25 +#define WI_RID_MICROWAVE_OVEN 0xFC25 #define WI_RID_P2_CRYPT_KEY2 0xFC26 #define WI_RID_P2_CRYPT_KEY3 0xFC27 #define WI_RID_P2_ENCRYPTION 0xFC28 +#define WI_RID_ROAMING_MODE 0xFC2D #define WI_RID_CUR_TX_RATE 0xFD44 /* current TX rate */ struct wi_key { u_int16_t wi_keylen; @@ -118,7 +120,11 @@ u_int16_t wi_create_ibss; u_int16_t wi_channel; u_int16_t wi_pm_enabled; + u_int16_t wi_mor_enabled; u_int16_t wi_max_sleep; + u_int16_t wi_authtype; + u_int16_t wi_roaming; + char wi_node_name[32]; char wi_net_name[32]; char wi_ibss_name[32]; @@ -185,9 +191,23 @@ #define WI_DEFAULT_MAX_SLEEP 100 -#define WI_DEFAULT_NODENAME "FreeBSD WaveLAN/IEEE node" +#define WI_DEFAULT_ROAMING 1 + +#define WI_DEFAULT_AUTHTYPE 1 + +#ifdef __NetBSD__ +#define OS_STRING_NAME "NetBSD" +#endif +#ifdef __FreeBSD__ +#define OS_STRING_NAME "FreeBSD" +#endif +#ifdef __OpenBSD__ +#define OS_STRING_NAME "OpenBSD" +#endif + +#define WI_DEFAULT_NODENAME OS_STRING_NAME " WaveLAN/IEEE node" -#define WI_DEFAULT_IBSS "FreeBSD IBSS" +#define WI_DEFAULT_IBSS OS_STRING_NAME " IBSS" #define WI_DEFAULT_CHAN 3 @@ -601,6 +621,8 @@ u_int16_t wi_type; u_int16_t wi_nodename[17]; }; + +#define WI_RID_AUTH_CNTL 0xFC2A /* * Multicast addresses to be put in filter. We're To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-mobile" in the body of the message