diff options
Diffstat (limited to 'drivers/staging/wlan-ng/prism2sta.c')
| -rw-r--r-- | drivers/staging/wlan-ng/prism2sta.c | 396 |
1 files changed, 197 insertions, 199 deletions
diff --git a/drivers/staging/wlan-ng/prism2sta.c b/drivers/staging/wlan-ng/prism2sta.c index 31ac8da39c8..278b6a1ef31 100644 --- a/drivers/staging/wlan-ng/prism2sta.c +++ b/drivers/staging/wlan-ng/prism2sta.c @@ -50,13 +50,11 @@ * -------------------------------------------------------------------- */ -#include <linux/version.h> #include <linux/module.h> #include <linux/moduleparam.h> #include <linux/kernel.h> #include <linux/sched.h> #include <linux/types.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/wireless.h> #include <linux/netdevice.h> @@ -83,8 +81,6 @@ #include "hfa384x.h" #include "prism2mgmt.h" -#define wlan_hexchar(x) (((x) < 0x0a) ? ('0' + (x)) : ('a' + ((x) - 0x0a))) - /* Create a string of printable chars from something that might not be */ /* It's recommended that the str be 4*len + 1 bytes long */ #define wlan_mkprintstr(buf, buflen, str, strlen) \ @@ -99,8 +95,8 @@ } else { \ (str)[j] = '\\'; \ (str)[j+1] = 'x'; \ - (str)[j+2] = wlan_hexchar(((buf)[i] & 0xf0) >> 4); \ - (str)[j+3] = wlan_hexchar(((buf)[i] & 0x0f)); \ + (str)[j+2] = hex_asc_hi((buf)[i]); \ + (str)[j+3] = hex_asc_lo((buf)[i]); \ j += 4; \ } \ } \ @@ -128,9 +124,9 @@ static int prism2sta_open(wlandevice_t *wlandev); static int prism2sta_close(wlandevice_t *wlandev); static void prism2sta_reset(wlandevice_t *wlandev); static int prism2sta_txframe(wlandevice_t *wlandev, struct sk_buff *skb, - p80211_hdr_t *p80211_hdr, - p80211_metawep_t *p80211_wep); -static int prism2sta_mlmerequest(wlandevice_t *wlandev, p80211msg_t *msg); + union p80211_hdr *p80211_hdr, + struct p80211_metawep *p80211_wep); +static int prism2sta_mlmerequest(wlandevice_t *wlandev, struct p80211msg *msg); static int prism2sta_getcardinfo(wlandevice_t *wlandev); static int prism2sta_globalsetup(wlandevice_t *wlandev); static int prism2sta_setmulticast(wlandevice_t *wlandev, netdevice_t *dev); @@ -241,7 +237,6 @@ static int prism2sta_close(wlandevice_t *wlandev) ----------------------------------------------------------------*/ static void prism2sta_reset(wlandevice_t *wlandev) { - return; } /*---------------------------------------------------------------- @@ -266,8 +261,8 @@ static void prism2sta_reset(wlandevice_t *wlandev) * process thread ----------------------------------------------------------------*/ static int prism2sta_txframe(wlandevice_t *wlandev, struct sk_buff *skb, - p80211_hdr_t *p80211_hdr, - p80211_metawep_t *p80211_wep) + union p80211_hdr *p80211_hdr, + struct p80211_metawep *p80211_wep) { hfa384x_t *hw = (hfa384x_t *) wlandev->priv; int result; @@ -307,7 +302,7 @@ static int prism2sta_txframe(wlandevice_t *wlandev, struct sk_buff *skb, * Call context: * process thread ----------------------------------------------------------------*/ -static int prism2sta_mlmerequest(wlandevice_t *wlandev, p80211msg_t *msg) +static int prism2sta_mlmerequest(wlandevice_t *wlandev, struct p80211msg *msg) { hfa384x_t *hw = (hfa384x_t *) wlandev->priv; @@ -364,9 +359,9 @@ static int prism2sta_mlmerequest(wlandevice_t *wlandev, p80211msg_t *msg) break; /* ignore me. */ case DIDmsg_lnxreq_ifstate: { - p80211msg_lnxreq_ifstate_t *ifstatemsg; + struct p80211msg_lnxreq_ifstate *ifstatemsg; pr_debug("Received mlme ifstate request\n"); - ifstatemsg = (p80211msg_lnxreq_ifstate_t *) msg; + ifstatemsg = (struct p80211msg_lnxreq_ifstate *) msg; result = prism2sta_ifstate(wlandev, ifstatemsg->ifstate.data); @@ -385,11 +380,11 @@ static int prism2sta_mlmerequest(wlandevice_t *wlandev, p80211msg_t *msg) result = prism2mgmt_autojoin(wlandev, msg); break; case DIDmsg_lnxreq_commsquality:{ - p80211msg_lnxreq_commsquality_t *qualmsg; + struct p80211msg_lnxreq_commsquality *qualmsg; pr_debug("Received commsquality request\n"); - qualmsg = (p80211msg_lnxreq_commsquality_t *) msg; + qualmsg = (struct p80211msg_lnxreq_commsquality *) msg; qualmsg->link.status = P80211ENUM_msgitem_status_data_ok; @@ -401,12 +396,14 @@ static int prism2sta_mlmerequest(wlandevice_t *wlandev, p80211msg_t *msg) qualmsg->link.data = le16_to_cpu(hw->qual.CQ_currBSS); qualmsg->level.data = le16_to_cpu(hw->qual.ASL_currBSS); qualmsg->noise.data = le16_to_cpu(hw->qual.ANL_currFC); + qualmsg->txrate.data = hw->txrate; break; } default: - printk(KERN_WARNING "Unknown mgmt request message 0x%08x", - msg->msgcode); + netdev_warn(wlandev->netdev, + "Unknown mgmt request message 0x%08x", + msg->msgcode); break; } @@ -426,7 +423,7 @@ static int prism2sta_mlmerequest(wlandevice_t *wlandev, p80211msg_t *msg) * msgp ptr to msg buffer * * Returns: -* A p80211 message resultcode value. +* A p80211 message resultcode value. * * Side effects: * @@ -454,11 +451,10 @@ u32 prism2sta_ifstate(wlandevice_t *wlandev, u32 ifstate) */ result = hfa384x_drvr_start(hw); if (result) { - printk(KERN_ERR - "hfa384x_drvr_start() failed," - "result=%d\n", (int)result); + netdev_err(wlandev->netdev, + "hfa384x_drvr_start() failed,result=%d\n", (int)result); result = - P80211ENUM_resultcode_implementation_failure; + P80211ENUM_resultcode_implementation_failure; wlandev->msdstate = WLAN_MSD_HWPRESENT; break; } @@ -470,7 +466,7 @@ u32 prism2sta_ifstate(wlandevice_t *wlandev, u32 ifstate) result = P80211ENUM_resultcode_success; break; case WLAN_MSD_RUNNING: - printk(KERN_WARNING + netdev_warn(wlandev->netdev, "Cannot enter fwload state from enable state," "you must disable first.\n"); result = P80211ENUM_resultcode_invalid_parameters; @@ -499,33 +495,30 @@ u32 prism2sta_ifstate(wlandevice_t *wlandev, u32 ifstate) */ result = hfa384x_drvr_start(hw); if (result) { - printk(KERN_ERR - "hfa384x_drvr_start() failed," - "result=%d\n", (int)result); + netdev_err(wlandev->netdev, + "hfa384x_drvr_start() failed,result=%d\n", (int)result); result = - P80211ENUM_resultcode_implementation_failure; + P80211ENUM_resultcode_implementation_failure; wlandev->msdstate = WLAN_MSD_HWPRESENT; break; } result = prism2sta_getcardinfo(wlandev); if (result) { - printk(KERN_ERR - "prism2sta_getcardinfo() failed," - "result=%d\n", (int)result); + netdev_err(wlandev->netdev, + "prism2sta_getcardinfo() failed,result=%d\n", (int)result); result = - P80211ENUM_resultcode_implementation_failure; + P80211ENUM_resultcode_implementation_failure; hfa384x_drvr_stop(hw); wlandev->msdstate = WLAN_MSD_HWPRESENT; break; } result = prism2sta_globalsetup(wlandev); if (result) { - printk(KERN_ERR - "prism2sta_globalsetup() failed," - "result=%d\n", (int)result); + netdev_err(wlandev->netdev, + "prism2sta_globalsetup() failed,result=%d\n", (int)result); result = - P80211ENUM_resultcode_implementation_failure; + P80211ENUM_resultcode_implementation_failure; hfa384x_drvr_stop(hw); wlandev->msdstate = WLAN_MSD_HWPRESENT; break; @@ -623,7 +616,7 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) &hw->ident_nic, sizeof(hfa384x_compident_t)); if (result) { - printk(KERN_ERR "Failed to retrieve NICIDENTITY\n"); + netdev_err(wlandev->netdev, "Failed to retrieve NICIDENTITY\n"); goto failed; } @@ -633,7 +626,7 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) hw->ident_nic.major = le16_to_cpu(hw->ident_nic.major); hw->ident_nic.minor = le16_to_cpu(hw->ident_nic.minor); - printk(KERN_INFO "ident: nic h/w: id=0x%02x %d.%d.%d\n", + netdev_info(wlandev->netdev, "ident: nic h/w: id=0x%02x %d.%d.%d\n", hw->ident_nic.id, hw->ident_nic.major, hw->ident_nic.minor, hw->ident_nic.variant); @@ -642,7 +635,7 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) &hw->ident_pri_fw, sizeof(hfa384x_compident_t)); if (result) { - printk(KERN_ERR "Failed to retrieve PRIIDENTITY\n"); + netdev_err(wlandev->netdev, "Failed to retrieve PRIIDENTITY\n"); goto failed; } @@ -652,7 +645,7 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) hw->ident_pri_fw.major = le16_to_cpu(hw->ident_pri_fw.major); hw->ident_pri_fw.minor = le16_to_cpu(hw->ident_pri_fw.minor); - printk(KERN_INFO "ident: pri f/w: id=0x%02x %d.%d.%d\n", + netdev_info(wlandev->netdev, "ident: pri f/w: id=0x%02x %d.%d.%d\n", hw->ident_pri_fw.id, hw->ident_pri_fw.major, hw->ident_pri_fw.minor, hw->ident_pri_fw.variant); @@ -661,12 +654,12 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) &hw->ident_sta_fw, sizeof(hfa384x_compident_t)); if (result) { - printk(KERN_ERR "Failed to retrieve STAIDENTITY\n"); + netdev_err(wlandev->netdev, "Failed to retrieve STAIDENTITY\n"); goto failed; } if (hw->ident_nic.id < 0x8000) { - printk(KERN_ERR + netdev_err(wlandev->netdev, "FATAL: Card is not an Intersil Prism2/2.5/3\n"); result = -1; goto failed; @@ -683,16 +676,16 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) hw->ident_sta_fw.variant &= ~((u16) (BIT(14) | BIT(15))); if (hw->ident_sta_fw.id == 0x1f) { - printk(KERN_INFO + netdev_info(wlandev->netdev, "ident: sta f/w: id=0x%02x %d.%d.%d\n", hw->ident_sta_fw.id, hw->ident_sta_fw.major, hw->ident_sta_fw.minor, hw->ident_sta_fw.variant); } else { - printk(KERN_INFO + netdev_info(wlandev->netdev, "ident: ap f/w: id=0x%02x %d.%d.%d\n", hw->ident_sta_fw.id, hw->ident_sta_fw.major, hw->ident_sta_fw.minor, hw->ident_sta_fw.variant); - printk(KERN_ERR "Unsupported Tertiary AP firmeare loaded!\n"); + netdev_err(wlandev->netdev, "Unsupported Tertiary AP firmeare loaded!\n"); goto failed; } @@ -701,7 +694,7 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) &hw->cap_sup_mfi, sizeof(hfa384x_caplevel_t)); if (result) { - printk(KERN_ERR "Failed to retrieve MFISUPRANGE\n"); + netdev_err(wlandev->netdev, "Failed to retrieve MFISUPRANGE\n"); goto failed; } @@ -713,7 +706,7 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) hw->cap_sup_mfi.bottom = le16_to_cpu(hw->cap_sup_mfi.bottom); hw->cap_sup_mfi.top = le16_to_cpu(hw->cap_sup_mfi.top); - printk(KERN_INFO + netdev_info(wlandev->netdev, "MFI:SUP:role=0x%02x:id=0x%02x:var=0x%02x:b/t=%d/%d\n", hw->cap_sup_mfi.role, hw->cap_sup_mfi.id, hw->cap_sup_mfi.variant, hw->cap_sup_mfi.bottom, @@ -724,7 +717,7 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) &hw->cap_sup_cfi, sizeof(hfa384x_caplevel_t)); if (result) { - printk(KERN_ERR "Failed to retrieve CFISUPRANGE\n"); + netdev_err(wlandev->netdev, "Failed to retrieve CFISUPRANGE\n"); goto failed; } @@ -736,7 +729,7 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) hw->cap_sup_cfi.bottom = le16_to_cpu(hw->cap_sup_cfi.bottom); hw->cap_sup_cfi.top = le16_to_cpu(hw->cap_sup_cfi.top); - printk(KERN_INFO + netdev_info(wlandev->netdev, "CFI:SUP:role=0x%02x:id=0x%02x:var=0x%02x:b/t=%d/%d\n", hw->cap_sup_cfi.role, hw->cap_sup_cfi.id, hw->cap_sup_cfi.variant, hw->cap_sup_cfi.bottom, @@ -747,7 +740,7 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) &hw->cap_sup_pri, sizeof(hfa384x_caplevel_t)); if (result) { - printk(KERN_ERR "Failed to retrieve PRISUPRANGE\n"); + netdev_err(wlandev->netdev, "Failed to retrieve PRISUPRANGE\n"); goto failed; } @@ -759,7 +752,7 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) hw->cap_sup_pri.bottom = le16_to_cpu(hw->cap_sup_pri.bottom); hw->cap_sup_pri.top = le16_to_cpu(hw->cap_sup_pri.top); - printk(KERN_INFO + netdev_info(wlandev->netdev, "PRI:SUP:role=0x%02x:id=0x%02x:var=0x%02x:b/t=%d/%d\n", hw->cap_sup_pri.role, hw->cap_sup_pri.id, hw->cap_sup_pri.variant, hw->cap_sup_pri.bottom, @@ -770,7 +763,7 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) &hw->cap_sup_sta, sizeof(hfa384x_caplevel_t)); if (result) { - printk(KERN_ERR "Failed to retrieve STASUPRANGE\n"); + netdev_err(wlandev->netdev, "Failed to retrieve STASUPRANGE\n"); goto failed; } @@ -783,13 +776,13 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) hw->cap_sup_sta.top = le16_to_cpu(hw->cap_sup_sta.top); if (hw->cap_sup_sta.id == 0x04) { - printk(KERN_INFO + netdev_info(wlandev->netdev, "STA:SUP:role=0x%02x:id=0x%02x:var=0x%02x:b/t=%d/%d\n", hw->cap_sup_sta.role, hw->cap_sup_sta.id, hw->cap_sup_sta.variant, hw->cap_sup_sta.bottom, hw->cap_sup_sta.top); } else { - printk(KERN_INFO + netdev_info(wlandev->netdev, "AP:SUP:role=0x%02x:id=0x%02x:var=0x%02x:b/t=%d/%d\n", hw->cap_sup_sta.role, hw->cap_sup_sta.id, hw->cap_sup_sta.variant, hw->cap_sup_sta.bottom, @@ -801,7 +794,7 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) &hw->cap_act_pri_cfi, sizeof(hfa384x_caplevel_t)); if (result) { - printk(KERN_ERR "Failed to retrieve PRI_CFIACTRANGES\n"); + netdev_err(wlandev->netdev, "Failed to retrieve PRI_CFIACTRANGES\n"); goto failed; } @@ -813,7 +806,7 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) hw->cap_act_pri_cfi.bottom = le16_to_cpu(hw->cap_act_pri_cfi.bottom); hw->cap_act_pri_cfi.top = le16_to_cpu(hw->cap_act_pri_cfi.top); - printk(KERN_INFO + netdev_info(wlandev->netdev, "PRI-CFI:ACT:role=0x%02x:id=0x%02x:var=0x%02x:b/t=%d/%d\n", hw->cap_act_pri_cfi.role, hw->cap_act_pri_cfi.id, hw->cap_act_pri_cfi.variant, hw->cap_act_pri_cfi.bottom, @@ -824,7 +817,7 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) &hw->cap_act_sta_cfi, sizeof(hfa384x_caplevel_t)); if (result) { - printk(KERN_ERR "Failed to retrieve STA_CFIACTRANGES\n"); + netdev_err(wlandev->netdev, "Failed to retrieve STA_CFIACTRANGES\n"); goto failed; } @@ -836,7 +829,7 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) hw->cap_act_sta_cfi.bottom = le16_to_cpu(hw->cap_act_sta_cfi.bottom); hw->cap_act_sta_cfi.top = le16_to_cpu(hw->cap_act_sta_cfi.top); - printk(KERN_INFO + netdev_info(wlandev->netdev, "STA-CFI:ACT:role=0x%02x:id=0x%02x:var=0x%02x:b/t=%d/%d\n", hw->cap_act_sta_cfi.role, hw->cap_act_sta_cfi.id, hw->cap_act_sta_cfi.variant, hw->cap_act_sta_cfi.bottom, @@ -847,7 +840,7 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) &hw->cap_act_sta_mfi, sizeof(hfa384x_caplevel_t)); if (result) { - printk(KERN_ERR "Failed to retrieve STA_MFIACTRANGES\n"); + netdev_err(wlandev->netdev, "Failed to retrieve STA_MFIACTRANGES\n"); goto failed; } @@ -859,7 +852,7 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) hw->cap_act_sta_mfi.bottom = le16_to_cpu(hw->cap_act_sta_mfi.bottom); hw->cap_act_sta_mfi.top = le16_to_cpu(hw->cap_act_sta_mfi.top); - printk(KERN_INFO + netdev_info(wlandev->netdev, "STA-MFI:ACT:role=0x%02x:id=0x%02x:var=0x%02x:b/t=%d/%d\n", hw->cap_act_sta_mfi.role, hw->cap_act_sta_mfi.id, hw->cap_act_sta_mfi.variant, hw->cap_act_sta_mfi.bottom, @@ -871,9 +864,9 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) if (!result) { wlan_mkprintstr(snum, HFA384x_RID_NICSERIALNUMBER_LEN, pstr, sizeof(pstr)); - printk(KERN_INFO "Prism2 card SN: %s\n", pstr); + netdev_info(wlandev->netdev, "Prism2 card SN: %s\n", pstr); } else { - printk(KERN_ERR "Failed to retrieve Prism2 Card SN\n"); + netdev_err(wlandev->netdev, "Failed to retrieve Prism2 Card SN\n"); goto failed; } @@ -881,7 +874,7 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) result = hfa384x_drvr_getconfig(hw, HFA384x_RID_CNFOWNMACADDR, wlandev->netdev->dev_addr, ETH_ALEN); if (result != 0) { - printk(KERN_ERR "Failed to retrieve mac address\n"); + netdev_err(wlandev->netdev, "Failed to retrieve mac address\n"); goto failed; } @@ -909,7 +902,7 @@ static int prism2sta_getcardinfo(wlandevice_t *wlandev) goto done; failed: - printk(KERN_ERR "Failed, result=%d\n", result); + netdev_err(wlandev->netdev, "Failed, result=%d\n", result); done: return result; } @@ -986,7 +979,6 @@ static void prism2sta_inf_handover(wlandevice_t *wlandev, hfa384x_InfFrame_t *inf) { pr_debug("received infoframe:HANDOVER (unhandled)\n"); - return; } /*---------------------------------------------------------------- @@ -1033,8 +1025,6 @@ static void prism2sta_inf_tallies(wlandevice_t *wlandev, for (i = 0; i < cnt; i++, dst++, src16++) *dst += le16_to_cpu(*src16); } - - return; } /*---------------------------------------------------------------- @@ -1088,11 +1078,9 @@ static void prism2sta_inf_scanresults(wlandevice_t *wlandev, HFA384x_RID_JOINREQUEST, &joinreq, HFA384x_RID_JOINREQUEST_LEN); if (result) { - printk(KERN_ERR "setconfig(joinreq) failed, result=%d\n", + netdev_err(wlandev->netdev, "setconfig(joinreq) failed, result=%d\n", result); } - - return; } /*---------------------------------------------------------------- @@ -1126,8 +1114,7 @@ static void prism2sta_inf_hostscanresults(wlandevice_t *wlandev, kfree(hw->scanresults); - hw->scanresults = kmalloc(sizeof(hfa384x_InfFrame_t), GFP_ATOMIC); - memcpy(hw->scanresults, inf, sizeof(hfa384x_InfFrame_t)); + hw->scanresults = kmemdup(inf, sizeof(hfa384x_InfFrame_t), GFP_ATOMIC); if (nbss == 0) nbss = -1; @@ -1164,35 +1151,37 @@ static void prism2sta_inf_chinforesults(wlandevice_t *wlandev, le16_to_cpu(inf->info.chinforesult.scanchannels); for (i = 0, n = 0; i < HFA384x_CHINFORESULT_MAX; i++) { - if (hw->channel_info.results.scanchannels & (1 << i)) { - int channel = - le16_to_cpu(inf->info.chinforesult.result[n].chid) - - 1; - hfa384x_ChInfoResultSub_t *chinforesult = - &hw->channel_info.results.result[channel]; - chinforesult->chid = channel; - chinforesult->anl = - le16_to_cpu(inf->info.chinforesult.result[n].anl); - chinforesult->pnl = - le16_to_cpu(inf->info.chinforesult.result[n].pnl); - chinforesult->active = - le16_to_cpu(inf->info.chinforesult.result[n]. - active); - pr_debug - ("chinfo: channel %d, %s level (avg/peak)=%d/%d dB, pcf %d\n", - channel + 1, - chinforesult-> - active & HFA384x_CHINFORESULT_BSSACTIVE ? "signal" - : "noise", chinforesult->anl, chinforesult->pnl, - chinforesult-> - active & HFA384x_CHINFORESULT_PCFACTIVE ? 1 : 0); - n++; - } + hfa384x_ChInfoResultSub_t *result; + hfa384x_ChInfoResultSub_t *chinforesult; + int chan; + + if (!(hw->channel_info.results.scanchannels & (1 << i))) + continue; + + result = &inf->info.chinforesult.result[n]; + chan = le16_to_cpu(result->chid) - 1; + + if (chan < 0 || chan >= HFA384x_CHINFORESULT_MAX) + continue; + + chinforesult = &hw->channel_info.results.result[chan]; + chinforesult->chid = chan; + chinforesult->anl = le16_to_cpu(result->anl); + chinforesult->pnl = le16_to_cpu(result->pnl); + chinforesult->active = le16_to_cpu(result->active); + + pr_debug("chinfo: channel %d, %s level (avg/peak)=%d/%d dB, pcf %d\n", + chan + 1, + (chinforesult->active & HFA384x_CHINFORESULT_BSSACTIVE) + ? "signal" : "noise", + chinforesult->anl, chinforesult->pnl, + (chinforesult->active & HFA384x_CHINFORESULT_PCFACTIVE) + ? 1 : 0); + n++; } atomic_set(&hw->channel_info.done, 2); hw->channel_info.count = n; - return; } void prism2sta_processing_defer(struct work_struct *data) @@ -1216,7 +1205,7 @@ void prism2sta_processing_defer(struct work_struct *data) /* Now let's handle the linkstatus stuff */ if (hw->link_status == hw->link_status_new) - goto failed; + return; hw->link_status = hw->link_status_new; @@ -1230,7 +1219,7 @@ void prism2sta_processing_defer(struct work_struct *data) */ netif_carrier_off(wlandev->netdev); - printk(KERN_INFO "linkstatus=NOTCONNECTED (unhandled)\n"); + netdev_info(wlandev->netdev, "linkstatus=NOTCONNECTED (unhandled)\n"); break; case HFA384x_LINK_CONNECTED: @@ -1246,7 +1235,9 @@ void prism2sta_processing_defer(struct work_struct *data) netif_carrier_on(wlandev->netdev); - /* If we are joining a specific AP, set our state and reset retries */ + /* If we are joining a specific AP, set our + * state and reset retries + */ if (hw->join_ap == 1) hw->join_ap = 2; hw->join_retries = 60; @@ -1255,20 +1246,20 @@ void prism2sta_processing_defer(struct work_struct *data) if (wlandev->netdev->type == ARPHRD_ETHER) { u16 portstatus; - printk(KERN_INFO "linkstatus=CONNECTED\n"); + netdev_info(wlandev->netdev, "linkstatus=CONNECTED\n"); /* For non-usb devices, we can use the sync versions */ /* Collect the BSSID, and set state to allow tx */ result = hfa384x_drvr_getconfig(hw, - HFA384x_RID_CURRENTBSSID, - wlandev->bssid, - WLAN_BSSID_LEN); + HFA384x_RID_CURRENTBSSID, + wlandev->bssid, + WLAN_BSSID_LEN); if (result) { pr_debug ("getconfig(0x%02x) failed, result = %d\n", HFA384x_RID_CURRENTBSSID, result); - goto failed; + return; } result = hfa384x_drvr_getconfig(hw, @@ -1278,26 +1269,29 @@ void prism2sta_processing_defer(struct work_struct *data) pr_debug ("getconfig(0x%02x) failed, result = %d\n", HFA384x_RID_CURRENTSSID, result); - goto failed; + return; } - prism2mgmt_bytestr2pstr((hfa384x_bytestr_t *) &ssid, + prism2mgmt_bytestr2pstr((struct hfa384x_bytestr *) &ssid, (p80211pstrd_t *) & wlandev->ssid); /* Collect the port status */ result = hfa384x_drvr_getconfig16(hw, - HFA384x_RID_PORTSTATUS, - &portstatus); + HFA384x_RID_PORTSTATUS, + &portstatus); if (result) { pr_debug ("getconfig(0x%02x) failed, result = %d\n", HFA384x_RID_PORTSTATUS, result); - goto failed; + return; } wlandev->macmode = (portstatus == HFA384x_PSTATUS_CONN_IBSS) ? WLAN_MACMODE_IBSS_STA : WLAN_MACMODE_ESS_STA; + /* signal back up to cfg80211 layer */ + prism2_connect_result(wlandev, P80211ENUM_truth_false); + /* Get the ball rolling on the comms quality stuff */ prism2sta_commsqual_defer(&hw->commsqual_bh); } @@ -1313,25 +1307,16 @@ void prism2sta_processing_defer(struct work_struct *data) * Indicate Deauthentication * Block Transmits, Ignore receives of data frames */ - if (hw->join_ap == 2) { - hfa384x_JoinRequest_data_t joinreq; - joinreq = hw->joinreq; - /* Send the join request */ - hfa384x_drvr_setconfig(hw, - HFA384x_RID_JOINREQUEST, - &joinreq, - HFA384x_RID_JOINREQUEST_LEN); - printk(KERN_INFO - "linkstatus=DISCONNECTED (re-submitting join)\n"); - } else { - if (wlandev->netdev->type == ARPHRD_ETHER) - printk(KERN_INFO - "linkstatus=DISCONNECTED (unhandled)\n"); - } + if (wlandev->netdev->type == ARPHRD_ETHER) + netdev_info(wlandev->netdev, + "linkstatus=DISCONNECTED (unhandled)\n"); wlandev->macmode = WLAN_MACMODE_NONE; netif_carrier_off(wlandev->netdev); + /* signal back up to cfg80211 layer */ + prism2_disconnected(wlandev); + break; case HFA384x_LINK_AP_CHANGE: @@ -1349,7 +1334,7 @@ void prism2sta_processing_defer(struct work_struct *data) * Indicate Reassociation * Enable Transmits, Receives and pass up data frames */ - printk(KERN_INFO "linkstatus=AP_CHANGE\n"); + netdev_info(wlandev->netdev, "linkstatus=AP_CHANGE\n"); result = hfa384x_drvr_getconfig(hw, HFA384x_RID_CURRENTBSSID, @@ -1357,7 +1342,7 @@ void prism2sta_processing_defer(struct work_struct *data) if (result) { pr_debug("getconfig(0x%02x) failed, result = %d\n", HFA384x_RID_CURRENTBSSID, result); - goto failed; + return; } result = hfa384x_drvr_getconfig(hw, @@ -1366,14 +1351,17 @@ void prism2sta_processing_defer(struct work_struct *data) if (result) { pr_debug("getconfig(0x%02x) failed, result = %d\n", HFA384x_RID_CURRENTSSID, result); - goto failed; + return; } - prism2mgmt_bytestr2pstr((hfa384x_bytestr_t *) &ssid, + prism2mgmt_bytestr2pstr((struct hfa384x_bytestr *) &ssid, (p80211pstrd_t *) &wlandev->ssid); hw->link_status = HFA384x_LINK_CONNECTED; netif_carrier_on(wlandev->netdev); + /* signal back up to cfg80211 layer */ + prism2_roamed(wlandev); + break; case HFA384x_LINK_AP_OUTOFRANGE: @@ -1388,7 +1376,7 @@ void prism2sta_processing_defer(struct work_struct *data) * Response: * Block Transmits, Ignore receives of data frames */ - printk(KERN_INFO "linkstatus=AP_OUTOFRANGE (unhandled)\n"); + netdev_info(wlandev->netdev, "linkstatus=AP_OUTOFRANGE (unhandled)\n"); netif_carrier_off(wlandev->netdev); @@ -1401,7 +1389,7 @@ void prism2sta_processing_defer(struct work_struct *data) * Response: * Enable Transmits, Receives and pass up data frames */ - printk(KERN_INFO "linkstatus=AP_INRANGE\n"); + netdev_info(wlandev->netdev, "linkstatus=AP_INRANGE\n"); hw->link_status = HFA384x_LINK_CONNECTED; netif_carrier_on(wlandev->netdev); @@ -1425,29 +1413,27 @@ void prism2sta_processing_defer(struct work_struct *data) HFA384x_RID_JOINREQUEST, &joinreq, HFA384x_RID_JOINREQUEST_LEN); - printk(KERN_INFO + netdev_info(wlandev->netdev, "linkstatus=ASSOCFAIL (re-submitting join)\n"); } else { - printk(KERN_INFO "linkstatus=ASSOCFAIL (unhandled)\n"); + netdev_info(wlandev->netdev, "linkstatus=ASSOCFAIL (unhandled)\n"); } netif_carrier_off(wlandev->netdev); + /* signal back up to cfg80211 layer */ + prism2_connect_result(wlandev, P80211ENUM_truth_true); + break; default: /* This is bad, IO port problems? */ - printk(KERN_WARNING + netdev_warn(wlandev->netdev, "unknown linkstatus=0x%02x\n", hw->link_status); - goto failed; - break; + return; } wlandev->linkstatus = (hw->link_status == HFA384x_LINK_CONNECTED); - p80211wext_event_associated(wlandev, wlandev->linkstatus); - -failed: - return; } /*---------------------------------------------------------------- @@ -1475,8 +1461,6 @@ static void prism2sta_inf_linkstatus(wlandevice_t *wlandev, hw->link_status_new = le16_to_cpu(inf->info.linkstatus.linkstatus); schedule_work(&hw->link_bh); - - return; } /*---------------------------------------------------------------- @@ -1509,14 +1493,15 @@ static void prism2sta_inf_assocstatus(wlandevice_t *wlandev, rec.reason = le16_to_cpu(rec.reason); /* - ** Find the address in the list of authenticated stations. If it wasn't - ** found, then this address has not been previously authenticated and - ** something weird has happened if this is anything other than an - ** "authentication failed" message. If the address was found, then - ** set the "associated" flag for that station, based on whether the - ** station is associating or losing its association. Something weird - ** has also happened if we find the address in the list of authenticated - ** stations but we are getting an "authentication failed" message. + ** Find the address in the list of authenticated stations. + ** If it wasn't found, then this address has not been previously + ** authenticated and something weird has happened if this is + ** anything other than an "authentication failed" message. + ** If the address was found, then set the "associated" flag for + ** that station, based on whether the station is associating or + ** losing its association. Something weird has also happened + ** if we find the address in the list of authenticated stations + ** but we are getting an "authentication failed" message. */ for (i = 0; i < hw->authlist.cnt; i++) @@ -1525,19 +1510,17 @@ static void prism2sta_inf_assocstatus(wlandevice_t *wlandev, if (i >= hw->authlist.cnt) { if (rec.assocstatus != HFA384x_ASSOCSTATUS_AUTHFAIL) - printk(KERN_WARNING - "assocstatus info frame received for non-authenticated station.\n"); + netdev_warn(wlandev->netdev, + "assocstatus info frame received for non-authenticated station.\n"); } else { hw->authlist.assoc[i] = (rec.assocstatus == HFA384x_ASSOCSTATUS_STAASSOC || rec.assocstatus == HFA384x_ASSOCSTATUS_REASSOC); if (rec.assocstatus == HFA384x_ASSOCSTATUS_AUTHFAIL) - printk(KERN_WARNING - "authfail assocstatus info frame received for authenticated station.\n"); + netdev_warn(wlandev->netdev, +"authfail assocstatus info frame received for authenticated station.\n"); } - - return; } /*---------------------------------------------------------------- @@ -1681,12 +1664,12 @@ static void prism2sta_inf_authreq_defer(wlandevice_t *wlandev, } /* - ** If the authentication is okay, then add the MAC address to the list - ** of authenticated stations. Don't add the address if it is already in - ** the list. (802.11b does not seem to disallow a station from issuing - ** an authentication request when the station is already authenticated. - ** Does this sort of thing ever happen? We might as well do the check - ** just in case.) + ** If the authentication is okay, then add the MAC address to the + ** list of authenticated stations. Don't add the address if it + ** is already in the list. (802.11b does not seem to disallow + ** a station from issuing an authentication request when the + ** station is already authenticated. Does this sort of thing + ** ever happen? We might as well do the check just in case.) */ added = 0; @@ -1723,11 +1706,10 @@ static void prism2sta_inf_authreq_defer(wlandevice_t *wlandev, if (result) { if (added) hw->authlist.cnt--; - printk(KERN_ERR + netdev_err(wlandev->netdev, "setconfig(authenticatestation) failed, result=%d\n", result); } - return; } /*---------------------------------------------------------------- @@ -1754,8 +1736,6 @@ static void prism2sta_inf_psusercnt(wlandevice_t *wlandev, hfa384x_t *hw = (hfa384x_t *) wlandev->priv; hw->psusercount = le16_to_cpu(inf->info.psusercnt.usercnt); - - return; } /*---------------------------------------------------------------- @@ -1808,20 +1788,19 @@ void prism2sta_ev_info(wlandevice_t *wlandev, hfa384x_InfFrame_t *inf) prism2sta_inf_psusercnt(wlandev, inf); break; case HFA384x_IT_KEYIDCHANGED: - printk(KERN_WARNING "Unhandled IT_KEYIDCHANGED\n"); + netdev_warn(wlandev->netdev, "Unhandled IT_KEYIDCHANGED\n"); break; case HFA384x_IT_ASSOCREQ: - printk(KERN_WARNING "Unhandled IT_ASSOCREQ\n"); + netdev_warn(wlandev->netdev, "Unhandled IT_ASSOCREQ\n"); break; case HFA384x_IT_MICFAILURE: - printk(KERN_WARNING "Unhandled IT_MICFAILURE\n"); + netdev_warn(wlandev->netdev, "Unhandled IT_MICFAILURE\n"); break; default: - printk(KERN_WARNING + netdev_warn(wlandev->netdev, "Unknown info type=0x%02x\n", inf->infotype); break; } - return; } /*---------------------------------------------------------------- @@ -1846,8 +1825,6 @@ void prism2sta_ev_info(wlandevice_t *wlandev, hfa384x_InfFrame_t *inf) void prism2sta_ev_txexc(wlandevice_t *wlandev, u16 status) { pr_debug("TxExc status=0x%x.\n", status); - - return; } /*---------------------------------------------------------------- @@ -1871,7 +1848,6 @@ void prism2sta_ev_tx(wlandevice_t *wlandev, u16 status) pr_debug("Tx Complete, status=0x%04x\n", status); /* update linux network stats */ wlandev->linux_stats.tx_packets++; - return; } /*---------------------------------------------------------------- @@ -1893,7 +1869,6 @@ void prism2sta_ev_tx(wlandevice_t *wlandev, u16 status) void prism2sta_ev_rx(wlandevice_t *wlandev, struct sk_buff *skb) { p80211netdev_rx(wlandev, skb); - return; } /*---------------------------------------------------------------- @@ -1915,7 +1890,6 @@ void prism2sta_ev_rx(wlandevice_t *wlandev, struct sk_buff *skb) void prism2sta_ev_alloc(wlandevice_t *wlandev) { netif_wake_queue(wlandev->netdev); - return; } /*---------------------------------------------------------------- @@ -1931,7 +1905,7 @@ void prism2sta_ev_alloc(wlandevice_t *wlandev) * the created wlandevice_t structure. * * Side effects: -* also allocates the priv/hw structures. +* also allocates the priv/hw structures. * * Call context: * process thread @@ -1943,20 +1917,16 @@ static wlandevice_t *create_wlan(void) hfa384x_t *hw = NULL; /* Alloc our structures */ - wlandev = kmalloc(sizeof(wlandevice_t), GFP_KERNEL); - hw = kmalloc(sizeof(hfa384x_t), GFP_KERNEL); + wlandev = kzalloc(sizeof(wlandevice_t), GFP_KERNEL); + hw = kzalloc(sizeof(hfa384x_t), GFP_KERNEL); if (!wlandev || !hw) { - printk(KERN_ERR "%s: Memory allocation failure.\n", dev_info); + pr_err("%s: Memory allocation failure.\n", dev_info); kfree(wlandev); kfree(hw); return NULL; } - /* Clear all the structs */ - memset(wlandev, 0, sizeof(wlandevice_t)); - memset(hw, 0, sizeof(hfa384x_t)); - /* Initialize the network device object. */ wlandev->nsdname = dev_info; wlandev->msdstate = WLAN_MSD_HWPRESENT_PENDING; @@ -1971,7 +1941,7 @@ static wlandevice_t *create_wlan(void) wlandev->nsdcaps = P80211_NSDCAP_HWFRAGMENT | P80211_NSDCAP_AUTOJOIN; - /* Initialize the device private data stucture. */ + /* Initialize the device private data structure. */ hw->dot11_desired_bss_type = 1; return wlandev; @@ -1982,26 +1952,29 @@ void prism2sta_commsqual_defer(struct work_struct *data) hfa384x_t *hw = container_of(data, struct hfa384x, commsqual_bh); wlandevice_t *wlandev = hw->wlandev; hfa384x_bytestr32_t ssid; + struct p80211msg_dot11req_mibget msg; + p80211item_uint32_t *mibitem = (p80211item_uint32_t *) + &msg.mibattribute.data; int result = 0; if (hw->wlandev->hwremoved) - goto done; + return; /* we don't care if we're in AP mode */ if ((wlandev->macmode == WLAN_MACMODE_NONE) || (wlandev->macmode == WLAN_MACMODE_ESS_AP)) { - goto done; + return; } /* It only makes sense to poll these in non-IBSS */ if (wlandev->macmode != WLAN_MACMODE_IBSS_STA) { - result = hfa384x_drvr_getconfig(hw, HFA384x_RID_DBMCOMMSQUALITY, - &hw->qual, - HFA384x_RID_DBMCOMMSQUALITY_LEN); + result = hfa384x_drvr_getconfig( + hw, HFA384x_RID_DBMCOMMSQUALITY, + &hw->qual, HFA384x_RID_DBMCOMMSQUALITY_LEN); if (result) { - printk(KERN_ERR "error fetching commsqual\n"); - goto done; + netdev_err(wlandev->netdev, "error fetching commsqual\n"); + return; } pr_debug("commsqual %d %d %d\n", @@ -2010,6 +1983,34 @@ void prism2sta_commsqual_defer(struct work_struct *data) le16_to_cpu(hw->qual.ANL_currFC)); } + /* Get the signal rate */ + msg.msgcode = DIDmsg_dot11req_mibget; + mibitem->did = DIDmib_p2_p2MAC_p2CurrentTxRate; + result = p80211req_dorequest(wlandev, (u8 *) &msg); + + if (result) { + pr_debug("get signal rate failed, result = %d\n", + result); + return; + } + + switch (mibitem->data) { + case HFA384x_RATEBIT_1: + hw->txrate = 10; + break; + case HFA384x_RATEBIT_2: + hw->txrate = 20; + break; + case HFA384x_RATEBIT_5dot5: + hw->txrate = 55; + break; + case HFA384x_RATEBIT_11: + hw->txrate = 110; + break; + default: + pr_debug("Bad ratebit (%d)\n", mibitem->data); + } + /* Lastly, we need to make sure the BSSID didn't change on us */ result = hfa384x_drvr_getconfig(hw, HFA384x_RID_CURRENTBSSID, @@ -2017,7 +2018,7 @@ void prism2sta_commsqual_defer(struct work_struct *data) if (result) { pr_debug("getconfig(0x%02x) failed, result = %d\n", HFA384x_RID_CURRENTBSSID, result); - goto done; + return; } result = hfa384x_drvr_getconfig(hw, @@ -2026,16 +2027,13 @@ void prism2sta_commsqual_defer(struct work_struct *data) if (result) { pr_debug("getconfig(0x%02x) failed, result = %d\n", HFA384x_RID_CURRENTSSID, result); - goto done; + return; } - prism2mgmt_bytestr2pstr((hfa384x_bytestr_t *) &ssid, + prism2mgmt_bytestr2pstr((struct hfa384x_bytestr *) &ssid, (p80211pstrd_t *) &wlandev->ssid); /* Reschedule timer */ mod_timer(&hw->commsqual_timer, jiffies + HZ); - -done: - ; } void prism2sta_commsqual_timer(unsigned long data) |
