summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2002-04-04 21:40:37 +0000
committerimp <imp@FreeBSD.org>2002-04-04 21:40:37 +0000
commitf2332be5f1aea18fe855332c7d362b667236b59a (patch)
tree37a83e29860b4663ad1e3e36f61179e2b07eab02 /sys
parenta74c71d7cd207a74d1a201cb8b58253e42e412bf (diff)
downloadFreeBSD-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
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/wi/if_wi.c125
-rw-r--r--sys/dev/wi/if_wireg.h85
-rw-r--r--sys/dev/wi/if_wivar.h13
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)
OpenPOWER on IntegriCloud