static u8 * prism2_read_pda(struct net_device *dev) { u8 *buf; int res, i, found = 0; #define NUM_PDA_ADDRS 4 unsigned int pda_addr[NUM_PDA_ADDRS] = { 0x7f0000 /* others than HFA3841 */, 0x3f0000 /* HFA3841 */, 0x390000 /* apparently used in older cards */, 0x7f0002 /* Intel PRO/Wireless 2011B (PCI) */, }; buf = kmalloc(PRISM2_PDA_SIZE, GFP_KERNEL); if (buf == NULL) return NULL; /* Note: wlan card should be in initial state (just after init cmd) * and no other operations should be performed concurrently. */ prism2_enable_aux_port(dev, 1); for (i = 0; i < NUM_PDA_ADDRS; i++) { PDEBUG(DEBUG_EXTRA2, "%s: trying to read PDA from 0x%08x", dev->name, pda_addr[i]); res = hfa384x_from_aux(dev, pda_addr[i], PRISM2_PDA_SIZE, buf); if (res) continue; if (res == 0 && prism2_pda_ok(buf)) { PDEBUG2(DEBUG_EXTRA2, ": OK\n"); found = 1; break; } else { PDEBUG2(DEBUG_EXTRA2, ": failed\n"); } } prism2_enable_aux_port(dev, 0); if (!found) { printk(KERN_DEBUG "%s: valid PDA not found\n", dev->name); kfree(buf); buf = NULL; } return buf; }
/* Called only as a tasklet (software IRQ) */ void hostap_info_process(local_info_t *local, struct sk_buff *skb) { struct hfa384x_info_frame *info; unsigned char *buf; int left; #ifndef PRISM2_NO_DEBUG int i; #endif /* PRISM2_NO_DEBUG */ info = (struct hfa384x_info_frame *) skb->data; buf = skb->data + sizeof(*info); left = skb->len - sizeof(*info); switch (le16_to_cpu(info->type)) { case HFA384X_INFO_COMMTALLIES: prism2_info_commtallies(local, buf, left); break; #ifndef PRISM2_NO_STATION_MODES case HFA384X_INFO_LINKSTATUS: prism2_info_linkstatus(local, buf, left); break; case HFA384X_INFO_SCANRESULTS: prism2_info_scanresults(local, buf, left); break; case HFA384X_INFO_HOSTSCANRESULTS: prism2_info_hostscanresults(local, buf, left); break; #endif /* PRISM2_NO_STATION_MODES */ #ifndef PRISM2_NO_DEBUG default: PDEBUG(DEBUG_EXTRA, "%s: INFO - len=%d type=0x%04x\n", local->dev->name, le16_to_cpu(info->len), le16_to_cpu(info->type)); PDEBUG(DEBUG_EXTRA, "Unknown info frame:"); for (i = 0; i < (left < 100 ? left : 100); i++) PDEBUG2(DEBUG_EXTRA, " %02x", buf[i]); PDEBUG2(DEBUG_EXTRA, "\n"); break; #endif /* PRISM2_NO_DEBUG */ } }