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
This commit is contained in:
Warner Losh 2002-04-04 21:40:37 +00:00
parent 80f5c8bf42
commit dfdbc0533d
3 changed files with 125 additions and 102 deletions

View file

@ -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)
printf("Unknown PRISM2 chip");
else
printf("Unknown Lucent chip");
printf(" 0x%x", le16toh(ver.wi_ver[0]));
break;
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");
sc->sc_firmware_type = WI_INTERSIL;
} else {
printf("Unknown Lucent chip");
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:

View file

@ -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).
*/

View file

@ -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)