diff options
author | imp <imp@FreeBSD.org> | 2002-04-04 21:40:37 +0000 |
---|---|---|
committer | imp <imp@FreeBSD.org> | 2002-04-04 21:40:37 +0000 |
commit | f2332be5f1aea18fe855332c7d362b667236b59a (patch) | |
tree | 37a83e29860b4663ad1e3e36f61179e2b07eab02 | |
parent | a74c71d7cd207a74d1a201cb8b58253e42e412bf (diff) | |
download | FreeBSD-src-f2332be5f1aea18fe855332c7d362b667236b59a.zip FreeBSD-src-f2332be5f1aea18fe855332c7d362b667236b59a.tar.gz |
MFNetBSD:
wi.c 1.64: Table driven IDs (ichiro)
1.59: Don't use magic numbers (ichiro)
Also, added Sony, Lucent Embedded Ids and fix minor bugs for lucent
cards (and submit those changes back to ichiro-san)
Obtained from: NetBSD
-rw-r--r-- | sys/dev/wi/if_wi.c | 125 | ||||
-rw-r--r-- | sys/dev/wi/if_wireg.h | 85 | ||||
-rw-r--r-- | sys/dev/wi/if_wivar.h | 13 |
3 files changed, 123 insertions, 100 deletions
diff --git a/sys/dev/wi/if_wi.c b/sys/dev/wi/if_wi.c index 7038335..7192b37 100644 --- a/sys/dev/wi/if_wi.c +++ b/sys/dev/wi/if_wi.c @@ -133,7 +133,7 @@ void wi_cache_store(struct wi_softc *, struct ether_header *, #endif static int wi_get_cur_ssid(struct wi_softc *, char *, int *); -static void wi_get_id(struct wi_softc *, device_t); +static void wi_get_id(struct wi_softc *); static int wi_media_change(struct ifnet *); static void wi_media_status(struct ifnet *, struct ifmediareq *); @@ -142,6 +142,36 @@ static int wi_set_debug(struct wi_softc *, struct wi_req *); devclass_t wi_devclass; +struct wi_card_ident wi_card_ident[] = { + /* CARD_ID CARD_NAME FIRM_TYPE */ + { WI_NIC_LUCENT_ID, WI_NIC_LUCENT_STR, WI_LUCENT }, + { WI_NIC_SONY_ID, WI_NIC_SONY_STR, WI_LUCENT }, + { WI_NIC_LUCENT_EMB_ID, WI_NIC_LUCENT_EMB_STR, WI_LUCENT }, + { WI_NIC_EVB2_ID, WI_NIC_EVB2_STR, WI_INTERSIL }, + { WI_NIC_HWB3763_ID, WI_NIC_HWB3763_STR, WI_INTERSIL }, + { WI_NIC_HWB3163_ID, WI_NIC_HWB3163_STR, WI_INTERSIL }, + { WI_NIC_HWB3163B_ID, WI_NIC_HWB3163B_STR, WI_INTERSIL }, + { WI_NIC_EVB3_ID, WI_NIC_EVB3_STR, WI_INTERSIL }, + { WI_NIC_HWB1153_ID, WI_NIC_HWB1153_STR, WI_INTERSIL }, + { WI_NIC_P2_SST_ID, WI_NIC_P2_SST_STR, WI_INTERSIL }, + { WI_NIC_EVB2_SST_ID, WI_NIC_EVB2_SST_STR, WI_INTERSIL }, + { WI_NIC_3842_EVA_ID, WI_NIC_3842_EVA_STR, WI_INTERSIL }, + { WI_NIC_3842_PCMCIA_AMD_ID, WI_NIC_3842_PCMCIA_STR, WI_INTERSIL }, + { WI_NIC_3842_PCMCIA_SST_ID, WI_NIC_3842_PCMCIA_STR, WI_INTERSIL }, + { WI_NIC_3842_PCMCIA_ATM_ID, WI_NIC_3842_PCMCIA_STR, WI_INTERSIL }, + { WI_NIC_3842_MINI_AMD_ID, WI_NIC_3842_MINI_STR, WI_INTERSIL }, + { WI_NIC_3842_MINI_SST_ID, WI_NIC_3842_MINI_STR, WI_INTERSIL }, + { WI_NIC_3842_MINI_ATM_ID, WI_NIC_3842_MINI_STR, WI_INTERSIL }, + { WI_NIC_3842_PCI_AMD_ID, WI_NIC_3842_PCI_STR, WI_INTERSIL }, + { WI_NIC_3842_PCI_SST_ID, WI_NIC_3842_PCI_STR, WI_INTERSIL }, + { WI_NIC_3842_PCI_ATM_ID, WI_NIC_3842_PCI_STR, WI_INTERSIL }, + { WI_NIC_P3_PCMCIA_AMD_ID, WI_NIC_P3_PCMCIA_STR, WI_INTERSIL }, + { WI_NIC_P3_PCMCIA_SST_ID, WI_NIC_P3_PCMCIA_STR, WI_INTERSIL }, + { WI_NIC_P3_MINI_AMD_ID, WI_NIC_P3_MINI_STR, WI_INTERSIL }, + { WI_NIC_P3_MINI_SST_ID, WI_NIC_P3_MINI_STR, WI_INTERSIL }, + { 0, NULL, 0 }, +}; + int wi_generic_detach(dev) device_t dev; @@ -222,7 +252,7 @@ wi_generic_attach(device_t dev) device_printf(dev, "802.11 address: %6D\n", sc->arpcom.ac_enaddr, ":"); - wi_get_id(sc, dev); + wi_get_id(sc); ifp->if_softc = sc; ifp->if_unit = sc->wi_unit; @@ -325,11 +355,11 @@ wi_generic_attach(device_t dev) } static void -wi_get_id(sc, dev) +wi_get_id(sc) struct wi_softc *sc; - device_t dev; { struct wi_ltv_ver ver; + struct wi_card_ident *id; /* getting chip identity */ memset(&ver, 0, sizeof(ver)); @@ -337,74 +367,23 @@ wi_get_id(sc, dev) ver.wi_len = 5; wi_read_record(sc, (struct wi_ltv_gen *)&ver); device_printf(sc->dev, "using "); - switch (le16toh(ver.wi_ver[0])) { - case WI_NIC_EVB2: - printf("RF:PRISM2 MAC:HFA3841"); - break; - case WI_NIC_HWB3763: - printf("RF:PRISM2 MAC:HFA3841 CARD:HWB3763 rev.B"); - break; - case WI_NIC_HWB3163: - printf("RF:PRISM2 MAC:HFA3841 CARD:HWB3163 rev.A"); - break; - case WI_NIC_HWB3163B: - printf("RF:PRISM2 MAC:HFA3841 CARD:HWB3163 rev.B"); - break; - case WI_NIC_EVB3: - case WI_NIC_3842_EVA: - printf("RF:PRISM2 MAC:HFA3842 CARD:HFA3842 EVAL"); - break; - case WI_NIC_HWB1153: - printf("RF:PRISM1 MAC:HFA3841 CARD:HWB1153"); - break; - case WI_NIC_P2_SST: - case WI_NIC_EVB2_SST: - printf("RF:PRISM2 MAC:HFA3841 CARD:HWB3163-SST-flash"); - break; - case WI_NIC_3842_PCMCIA_AMD: - case WI_NIC_3842_PCMCIA_SST: - case WI_NIC_3842_PCMCIA_ATM: - printf("RF:PRISM2.5 MAC:ISL3873"); - break; - case WI_NIC_3842_MINI_AMD: - case WI_NIC_3842_MINI_SST: - case WI_NIC_3842_MINI_ATM: - printf("RF:PRISM2.5 MAC:ISL3874A(Mini-PCI)"); - break; - case WI_NIC_3842_PCI_AMD: - case WI_NIC_3842_PCI_SST: - case WI_NIC_3842_PCI_ATM: - printf("RF:PRISM2.5 MAC:ISL3874A(PCI-bridge)"); - break; - case WI_NIC_P3_PCMCIA_AMD: - case WI_NIC_P3_PCMCIA_SST: - printf("RF:PRISM3(PCMCIA)"); - break; - case WI_NIC_P3_MINI_AMD: - case WI_NIC_P3_MINI_SST: - printf("RF:PRISM3(Mini-PCI)"); - break; - case WI_NIC_LUCENT: - printf("Lucent WaveLAN"); - break; - case WI_NIC_SONY: - printf("Sony"); - break; - case WI_NIC_LUCENT_EMBEDDED: - printf("Lucent WaveLAN (embedded)"); - break; - default: - if (le16toh(ver.wi_ver[0]) & 0x8000) + sc->sc_firmware_type = WI_NOTYPE; + for (id = wi_card_ident; id->card_name != NULL; id++) { + if (le16toh(ver.wi_ver[0]) == id->card_id) { + printf("%s", id->card_name); + sc->sc_firmware_type = id->firm_type; + break; + } + } + if (sc->sc_firmware_type == WI_NOTYPE) { + if (le16toh(ver.wi_ver[0]) & 0x8000) { printf("Unknown PRISM2 chip"); - else + sc->sc_firmware_type = WI_INTERSIL; + } else { printf("Unknown Lucent chip"); - printf(" 0x%x", le16toh(ver.wi_ver[0])); - break; + sc->sc_firmware_type = WI_LUCENT; + } } - if (le16toh(ver.wi_ver[0]) & 0x8000) - sc->sc_firmware_type = WI_INTERSIL; - else - sc->sc_firmware_type = WI_LUCENT; if (sc->sc_firmware_type != WI_LUCENT) { /* get primary firmware version */ @@ -1066,10 +1045,12 @@ wi_write_record(sc, ltv) case WI_RID_ENCRYPTION: p2ltv.wi_type = WI_RID_P2_ENCRYPTION; p2ltv.wi_len = 2; - if (ltv->wi_val) - p2ltv.wi_val = 0x03; + if (le16toh(ltv->wi_val)) + p2ltv.wi_val =htole16(PRIVACY_INVOKED | + EXCLUDE_UNENCRYPTED); else - p2ltv.wi_val = 0x90; + p2ltv.wi_val = + htole16(HOST_ENCRYPT | HOST_DECRYPT); ltv = &p2ltv; break; case WI_RID_TX_CRYPT_KEY: diff --git a/sys/dev/wi/if_wireg.h b/sys/dev/wi/if_wireg.h index 8b9cfba..4db607d 100644 --- a/sys/dev/wi/if_wireg.h +++ b/sys/dev/wi/if_wireg.h @@ -370,33 +370,68 @@ struct wi_ltv_ver { u_int16_t wi_len; u_int16_t wi_type; u_int16_t wi_ver[4]; -#define WI_NIC_LUCENT 0x0001 -#define WI_NIC_SONY 0x0002 -#define WI_NIC_LUCENT_EMBEDDED 0x0005 -#define WI_NIC_EVB2 0x8000 -#define WI_NIC_HWB3763 0x8001 -#define WI_NIC_HWB3163 0x8002 -#define WI_NIC_HWB3163B 0x8003 -#define WI_NIC_EVB3 0x8004 -#define WI_NIC_HWB1153 0x8007 -#define WI_NIC_P2_SST 0x8008 /* Prism2 with SST flush */ -#define WI_NIC_EVB2_SST 0x8009 -#define WI_NIC_3842_EVA 0x800A /* 3842 Evaluation Board */ -#define WI_NIC_3842_PCMCIA_AMD 0x800B /* Prism2.5 PCMCIA */ -#define WI_NIC_3842_PCMCIA_SST 0x800C -#define WI_NIC_3842_PCMCIA_ATM 0x800D -#define WI_NIC_3842_MINI_AMD 0x8012 /* Prism2.5 Mini-PCI */ -#define WI_NIC_3842_MINI_SST 0x8013 -#define WI_NIC_3842_MINI_ATM 0x8014 -#define WI_NIC_3842_PCI_AMD 0x8016 /* Prism2.5 PCI-bridge */ -#define WI_NIC_3842_PCI_SST 0x8017 -#define WI_NIC_3842_PCI_ATM 0x8018 -#define WI_NIC_P3_PCMCIA_AMD 0x801A /* Prism3 PCMCIA */ -#define WI_NIC_P3_PCMCIA_SST 0x801B -#define WI_NIC_P3_MINI_AMD 0x8021 /* Prism3 Mini-PCI */ -#define WI_NIC_P3_MINI_SST 0x8022 }; +/* define card ident */ +#define WI_NIC_LUCENT_ID 0x0001 +#define WI_NIC_LUCENT_STR "Lucent Technologies, WaveLAN/IEEE" + +#define WI_NIC_SONY_ID 0x0001 +#define WI_NIC_SONY_STR "Sony WaveLAN/IEEE" + +#define WI_NIC_LUCENT_EMB_ID 0x0005 +#define WI_NIC_LUCENT_EMB_STR "Lucent Embedded WaveLAN/IEEE" + +#define WI_NIC_EVB2_ID 0x8000 +#define WI_NIC_EVB2_STR "RF:PRISM2 MAC:HFA3841" + +#define WI_NIC_HWB3763_ID 0x8001 +#define WI_NIC_HWB3763_STR "RF:PRISM2 MAC:HFA3841 CARD:HWB3763 rev.B" + +#define WI_NIC_HWB3163_ID 0x8002 +#define WI_NIC_HWB3163_STR "RF:PRISM2 MAC:HFA3841 CARD:HWB3163 rev.A" + +#define WI_NIC_HWB3163B_ID 0x8003 +#define WI_NIC_HWB3163B_STR "RF:PRISM2 MAC:HFA3841 CARD:HWB3163 rev.B" + +#define WI_NIC_EVB3_ID 0x8004 +#define WI_NIC_EVB3_STR "RF:PRISM2 MAC:HFA3842 CARD:HFA3842 EVAL" + +#define WI_NIC_HWB1153_ID 0x8007 +#define WI_NIC_HWB1153_STR "RF:PRISM1 MAC:HFA3841 CARD:HWB1153" + +#define WI_NIC_P2_SST_ID 0x8008 /* Prism2 with SST flush */ +#define WI_NIC_P2_SST_STR "RF:PRISM2 MAC:HFA3841 CARD:HWB3163-SST-flash" + +#define WI_NIC_EVB2_SST_ID 0x8009 +#define WI_NIC_EVB2_SST_STR "RF:PRISM2 MAC:HFA3841 CARD:HWB3163-SST-flash" + +#define WI_NIC_3842_EVA_ID 0x800A /* 3842 Evaluation Board */ +#define WI_NIC_3842_EVA_STR "RF:PRISM2 MAC:HFA3842 CARD:HFA3842 EVAL" + +#define WI_NIC_3842_PCMCIA_AMD_ID 0x800B /* Prism2.5 PCMCIA */ +#define WI_NIC_3842_PCMCIA_SST_ID 0x800C +#define WI_NIC_3842_PCMCIA_ATM_ID 0x800D +#define WI_NIC_3842_PCMCIA_STR "RF:PRISM2.5 MAC:ISL3873" + +#define WI_NIC_3842_MINI_AMD_ID 0x8012 /* Prism2.5 Mini-PCI */ +#define WI_NIC_3842_MINI_SST_ID 0x8013 +#define WI_NIC_3842_MINI_ATM_ID 0x8014 +#define WI_NIC_3842_MINI_STR "RF:PRISM2.5 MAC:ISL3874A(Mini-PCI)" + +#define WI_NIC_3842_PCI_AMD_ID 0x8016 /* Prism2.5 PCI-bridge */ +#define WI_NIC_3842_PCI_SST_ID 0x8017 +#define WI_NIC_3842_PCI_ATM_ID 0x8018 +#define WI_NIC_3842_PCI_STR "RF:PRISM2.5 MAC:ISL3874A(PCI-bridge)" + +#define WI_NIC_P3_PCMCIA_AMD_ID 0x801A /* Prism3 PCMCIA */ +#define WI_NIC_P3_PCMCIA_SST_ID 0x801B +#define WI_NIC_P3_PCMCIA_STR "RF:PRISM3(PCMCIA)" + +#define WI_NIC_P3_MINI_AMD_ID 0x8021 /* Prism3 Mini-PCI */ +#define WI_NIC_P3_MINI_SST_ID 0x8022 +#define WI_NIC_P3_MINI_STR "RF:PRISM3(Mini-PCI)" + /* * List of intended regulatory domains (0xFD11). */ diff --git a/sys/dev/wi/if_wivar.h b/sys/dev/wi/if_wivar.h index 876c613..d86f0b7 100644 --- a/sys/dev/wi/if_wivar.h +++ b/sys/dev/wi/if_wivar.h @@ -112,9 +112,10 @@ struct wi_softc { bus_space_tag_t wi_bmemtag; void * wi_intrhand; int sc_firmware_type; -#define WI_LUCENT 0 -#define WI_INTERSIL 1 -#define WI_SYMBOL 2 +#define WI_NOTYPE 0 +#define WI_LUCENT 1 +#define WI_INTERSIL 2 +#define WI_SYMBOL 3 int sc_pri_firmware_ver; /* Primary firmware */ int sc_sta_firmware_ver; /* Station firmware */ int sc_enabled; @@ -177,6 +178,12 @@ struct wi_softc { }; +struct wi_card_ident { + u_int16_t card_id; + char *card_name; + u_int8_t firm_type; +}; + #define WI_LOCK(_sc) #define WI_UNLOCK(_sc) |