]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/wireless/hostap/hostap_ioctl.c
Merge branch 'for-linus' of master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband
[linux-2.6-omap-h63xx.git] / drivers / net / wireless / hostap / hostap_ioctl.c
index e545ac9c1b1023921d1c80fd13025a4726fa1c96..2617d70bcda945814a96fbdf7fde59f79930cdb1 100644 (file)
@@ -50,7 +50,8 @@ static struct iw_statistics *hostap_get_wireless_stats(struct net_device *dev)
 #endif /* in_atomic */
 
                if (update && prism2_update_comms_qual(dev) == 0)
-                       wstats->qual.updated = 7;
+                       wstats->qual.updated = IW_QUAL_ALL_UPDATED |
+                               IW_QUAL_DBM;
 
                wstats->qual.qual = local->comms_qual;
                wstats->qual.level = local->avg_signal;
@@ -59,7 +60,7 @@ static struct iw_statistics *hostap_get_wireless_stats(struct net_device *dev)
                wstats->qual.qual = 0;
                wstats->qual.level = 0;
                wstats->qual.noise = 0;
-               wstats->qual.updated = 0;
+               wstats->qual.updated = IW_QUAL_ALL_INVALID;
        }
 
        return wstats;
@@ -115,9 +116,9 @@ static int prism2_get_name(struct net_device *dev,
 
 
 static void prism2_crypt_delayed_deinit(local_info_t *local,
-                                       struct prism2_crypt_data **crypt)
+                                       struct ieee80211_crypt_data **crypt)
 {
-       struct prism2_crypt_data *tmp;
+       struct ieee80211_crypt_data *tmp;
        unsigned long flags;
 
        tmp = *crypt;
@@ -147,7 +148,7 @@ static int prism2_ioctl_siwencode(struct net_device *dev,
        struct hostap_interface *iface;
        local_info_t *local;
        int i;
-       struct prism2_crypt_data **crypt;
+       struct ieee80211_crypt_data **crypt;
 
        iface = netdev_priv(dev);
        local = iface->local;
@@ -175,18 +176,19 @@ static int prism2_ioctl_siwencode(struct net_device *dev,
        }
 
        if (*crypt == NULL) {
-               struct prism2_crypt_data *new_crypt;
+               struct ieee80211_crypt_data *new_crypt;
 
                /* take WEP into use */
-               new_crypt = (struct prism2_crypt_data *)
-                       kmalloc(sizeof(struct prism2_crypt_data), GFP_KERNEL);
+               new_crypt = (struct ieee80211_crypt_data *)
+                       kmalloc(sizeof(struct ieee80211_crypt_data),
+                               GFP_KERNEL);
                if (new_crypt == NULL)
                        return -ENOMEM;
-               memset(new_crypt, 0, sizeof(struct prism2_crypt_data));
-               new_crypt->ops = hostap_get_crypto_ops("WEP");
+               memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data));
+               new_crypt->ops = ieee80211_get_crypto_ops("WEP");
                if (!new_crypt->ops) {
-                       request_module("hostap_crypt_wep");
-                       new_crypt->ops = hostap_get_crypto_ops("WEP");
+                       request_module("ieee80211_crypt_wep");
+                       new_crypt->ops = ieee80211_get_crypto_ops("WEP");
                }
                if (new_crypt->ops)
                        new_crypt->priv = new_crypt->ops->init(i);
@@ -251,7 +253,7 @@ static int prism2_ioctl_giwencode(struct net_device *dev,
        local_info_t *local;
        int i, len;
        u16 val;
-       struct prism2_crypt_data *crypt;
+       struct ieee80211_crypt_data *crypt;
 
        iface = netdev_priv(dev);
        local = iface->local;
@@ -334,7 +336,7 @@ static int hostap_set_rate(struct net_device *dev)
               hostap_set_word(dev, HFA384X_RID_CNFSUPPORTEDRATES,
                               local->tx_rate_control) ||
               local->func->reset_port(dev));
-               
+
        if (ret) {
                printk(KERN_WARNING "%s: TXRateControl/cnfSupportedRates "
                       "setting to 0x%x failed\n",
@@ -550,7 +552,6 @@ static int prism2_ioctl_giwaplist(struct net_device *dev,
 
        kfree(addr);
        kfree(qual);
-
        return 0;
 }
 
@@ -663,7 +664,7 @@ static int hostap_join_ap(struct net_device *dev)
        struct hfa384x_join_request req;
        unsigned long flags;
        int i;
-       struct hfa384x_scan_result *entry;
+       struct hfa384x_hostscan_result *entry;
 
        iface = netdev_priv(dev);
        local = iface->local;
@@ -1182,7 +1183,8 @@ static int prism2_ioctl_siwmode(struct net_device *dev,
        if (local->iw_mode == IW_MODE_MONITOR)
                hostap_monitor_mode_disable(local);
 
-       if (local->iw_mode == IW_MODE_ADHOC && *mode == IW_MODE_MASTER) {
+       if ((local->iw_mode == IW_MODE_ADHOC ||
+            local->iw_mode == IW_MODE_MONITOR) && *mode == IW_MODE_MASTER) {
                /* There seems to be a firmware bug in at least STA f/w v1.5.6
                 * that leaves beacon frames to use IBSS type when moving from
                 * IBSS to Host AP mode. Doing double Port0 reset seems to be
@@ -1664,7 +1666,8 @@ static int prism2_request_hostscan(struct net_device *dev,
        local = iface->local;
 
        memset(&scan_req, 0, sizeof(scan_req));
-       scan_req.channel_list = __constant_cpu_to_le16(local->channel_mask);
+       scan_req.channel_list = cpu_to_le16(local->channel_mask &
+                                           local->scan_channel_mask);
        scan_req.txrate = __constant_cpu_to_le16(HFA384X_RATES_1MBPS);
        if (ssid) {
                if (ssid_len > 32)
@@ -1693,7 +1696,8 @@ static int prism2_request_scan(struct net_device *dev)
        local = iface->local;
 
        memset(&scan_req, 0, sizeof(scan_req));
-       scan_req.channel_list = __constant_cpu_to_le16(local->channel_mask);
+       scan_req.channel_list = cpu_to_le16(local->channel_mask &
+                                           local->scan_channel_mask);
        scan_req.txrate = __constant_cpu_to_le16(HFA384X_RATES_1MBPS);
 
        /* FIX:
@@ -1793,10 +1797,8 @@ static int prism2_ioctl_siwscan(struct net_device *dev,
 
 #ifndef PRISM2_NO_STATION_MODES
 static char * __prism2_translate_scan(local_info_t *local,
-                                     struct hfa384x_scan_result *scan,
-                                     struct hfa384x_hostscan_result *hscan,
-                                     int hostscan,
-                                     struct hostap_bss_info *bss, u8 *bssid,
+                                     struct hfa384x_hostscan_result *scan,
+                                     struct hostap_bss_info *bss,
                                      char *current_ev, char *end_buf)
 {
        int i, chan;
@@ -1804,17 +1806,18 @@ static char * __prism2_translate_scan(local_info_t *local,
        char *current_val;
        u16 capabilities;
        u8 *pos;
-       u8 *ssid;
+       u8 *ssid, *bssid;
        size_t ssid_len;
        char *buf;
 
        if (bss) {
                ssid = bss->ssid;
                ssid_len = bss->ssid_len;
+               bssid = bss->bssid;
        } else {
-               ssid = hostscan ? hscan->ssid : scan->ssid;
-               ssid_len = le16_to_cpu(hostscan ? hscan->ssid_len :
-                                      scan->ssid_len);
+               ssid = scan->ssid;
+               ssid_len = le16_to_cpu(scan->ssid_len);
+               bssid = scan->bssid;
        }
        if (ssid_len > 32)
                ssid_len = 32;
@@ -1824,13 +1827,6 @@ static char * __prism2_translate_scan(local_info_t *local,
        iwe.cmd = SIOCGIWAP;
        iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
        memcpy(iwe.u.ap_addr.sa_data, bssid, ETH_ALEN);
-       /* FIX:
-        * I do not know how this is possible, but iwe_stream_add_event
-        * seems to re-order memcpy execution so that len is set only
-        * after copying.. Pre-setting len here "fixes" this, but real
-        * problems should be solved (after which these iwe.len
-        * settings could be removed from this function). */
-       iwe.len = IW_EV_ADDR_LEN;
        current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
                                          IW_EV_ADDR_LEN);
 
@@ -1840,7 +1836,6 @@ static char * __prism2_translate_scan(local_info_t *local,
        iwe.cmd = SIOCGIWESSID;
        iwe.u.data.length = ssid_len;
        iwe.u.data.flags = 1;
-       iwe.len = IW_EV_POINT_LEN + iwe.u.data.length;
        current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, ssid);
 
        memset(&iwe, 0, sizeof(iwe));
@@ -1848,8 +1843,7 @@ static char * __prism2_translate_scan(local_info_t *local,
        if (bss) {
                capabilities = bss->capab_info;
        } else {
-               capabilities = le16_to_cpu(hostscan ? hscan->capability :
-                                          scan->capability);
+               capabilities = le16_to_cpu(scan->capability);
        }
        if (capabilities & (WLAN_CAPABILITY_ESS |
                            WLAN_CAPABILITY_IBSS)) {
@@ -1857,15 +1851,14 @@ static char * __prism2_translate_scan(local_info_t *local,
                        iwe.u.mode = IW_MODE_MASTER;
                else
                        iwe.u.mode = IW_MODE_ADHOC;
-               iwe.len = IW_EV_UINT_LEN;
                current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
                                                  IW_EV_UINT_LEN);
        }
 
        memset(&iwe, 0, sizeof(iwe));
        iwe.cmd = SIOCGIWFREQ;
-       if (hscan || scan) {
-               chan = hostscan ? hscan->chid : scan->chid;
+       if (scan) {
+               chan = scan->chid;
        } else if (bss) {
                chan = bss->chan;
        } else {
@@ -1875,24 +1868,26 @@ static char * __prism2_translate_scan(local_info_t *local,
        if (chan > 0) {
                iwe.u.freq.m = freq_list[le16_to_cpu(chan - 1)] * 100000;
                iwe.u.freq.e = 1;
-               iwe.len = IW_EV_FREQ_LEN;
                current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
                                                  IW_EV_FREQ_LEN);
        }
 
-       if (scan || hscan) {
+       if (scan) {
                memset(&iwe, 0, sizeof(iwe));
                iwe.cmd = IWEVQUAL;
-               if (hostscan) {
-                       iwe.u.qual.level = le16_to_cpu(hscan->sl);
-                       iwe.u.qual.noise = le16_to_cpu(hscan->anl);
+               if (local->last_scan_type == PRISM2_HOSTSCAN) {
+                       iwe.u.qual.level = le16_to_cpu(scan->sl);
+                       iwe.u.qual.noise = le16_to_cpu(scan->anl);
                } else {
                        iwe.u.qual.level =
                                HFA384X_LEVEL_TO_dBm(le16_to_cpu(scan->sl));
                        iwe.u.qual.noise =
                                HFA384X_LEVEL_TO_dBm(le16_to_cpu(scan->anl));
                }
-               iwe.len = IW_EV_QUAL_LEN;
+               iwe.u.qual.updated = IW_QUAL_LEVEL_UPDATED
+                       | IW_QUAL_NOISE_UPDATED
+                       | IW_QUAL_QUAL_INVALID
+                       | IW_QUAL_DBM;
                current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
                                                  IW_EV_QUAL_LEN);
        }
@@ -1904,15 +1899,14 @@ static char * __prism2_translate_scan(local_info_t *local,
        else
                iwe.u.data.flags = IW_ENCODE_DISABLED;
        iwe.u.data.length = 0;
-       iwe.len = IW_EV_POINT_LEN + iwe.u.data.length;
        current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, "");
 
        /* TODO: add SuppRates into BSS table */
-       if (scan || hscan) {
+       if (scan) {
                memset(&iwe, 0, sizeof(iwe));
                iwe.cmd = SIOCGIWRATE;
                current_val = current_ev + IW_EV_LCP_LEN;
-               pos = hostscan ? hscan->sup_rates : scan->sup_rates;
+               pos = scan->sup_rates;
                for (i = 0; i < sizeof(scan->sup_rates); i++) {
                        if (pos[i] == 0)
                                break;
@@ -1928,30 +1922,27 @@ static char * __prism2_translate_scan(local_info_t *local,
        }
 
        /* TODO: add BeaconInt,resp_rate,atim into BSS table */
-       buf = kmalloc(MAX_WPA_IE_LEN * 2 + 30, GFP_KERNEL);
-       if (buf && (scan || hscan)) {
+       buf = kmalloc(MAX_WPA_IE_LEN * 2 + 30, GFP_ATOMIC);
+       if (buf && scan) {
                memset(&iwe, 0, sizeof(iwe));
                iwe.cmd = IWEVCUSTOM;
-               sprintf(buf, "bcn_int=%d",
-                       le16_to_cpu(hostscan ? hscan->beacon_interval :
-                                   scan->beacon_interval));
+               sprintf(buf, "bcn_int=%d", le16_to_cpu(scan->beacon_interval));
                iwe.u.data.length = strlen(buf);
                current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe,
                                                  buf);
 
                memset(&iwe, 0, sizeof(iwe));
                iwe.cmd = IWEVCUSTOM;
-               sprintf(buf, "resp_rate=%d", le16_to_cpu(hostscan ?
-                                                        hscan->rate :
-                                                        scan->rate));
+               sprintf(buf, "resp_rate=%d", le16_to_cpu(scan->rate));
                iwe.u.data.length = strlen(buf);
                current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe,
                                                  buf);
 
-               if (hostscan && (capabilities & WLAN_CAPABILITY_IBSS)) {
+               if (local->last_scan_type == PRISM2_HOSTSCAN &&
+                   (capabilities & WLAN_CAPABILITY_IBSS)) {
                        memset(&iwe, 0, sizeof(iwe));
                        iwe.cmd = IWEVCUSTOM;
-                       sprintf(buf, "atim=%d", le16_to_cpu(hscan->atim));
+                       sprintf(buf, "atim=%d", le16_to_cpu(scan->atim));
                        iwe.u.data.length = strlen(buf);
                        current_ev = iwe_stream_add_point(current_ev, end_buf,
                                                          &iwe, buf);
@@ -1984,12 +1975,10 @@ static char * __prism2_translate_scan(local_info_t *local,
 static inline int prism2_translate_scan(local_info_t *local,
                                        char *buffer, int buflen)
 {
-       struct hfa384x_scan_result *scan;
-       struct hfa384x_hostscan_result *hscan;
-       int entries, entry, hostscan;
+       struct hfa384x_hostscan_result *scan;
+       int entry, hostscan;
        char *current_ev = buffer;
        char *end_buf = buffer + buflen;
-       u8 *bssid;
        struct list_head *ptr;
 
        spin_lock_bh(&local->lock);
@@ -2001,14 +1990,9 @@ static inline int prism2_translate_scan(local_info_t *local,
        }
 
        hostscan = local->last_scan_type == PRISM2_HOSTSCAN;
-       entries = hostscan ? local->last_hostscan_results_count :
-               local->last_scan_results_count;
-       for (entry = 0; entry < entries; entry++) {
+       for (entry = 0; entry < local->last_scan_results_count; entry++) {
                int found = 0;
                scan = &local->last_scan_results[entry];
-               hscan = &local->last_hostscan_results[entry];
-
-               bssid = hostscan ? hscan->bssid : scan->bssid;
 
                /* Report every SSID if the AP is using multiple SSIDs. If no
                 * BSS record is found (e.g., when WPA mode is disabled),
@@ -2016,18 +2000,16 @@ static inline int prism2_translate_scan(local_info_t *local,
                list_for_each(ptr, &local->bss_list) {
                        struct hostap_bss_info *bss;
                        bss = list_entry(ptr, struct hostap_bss_info, list);
-                       if (memcmp(bss->bssid, bssid, ETH_ALEN) == 0) {
+                       if (memcmp(bss->bssid, scan->bssid, ETH_ALEN) == 0) {
                                bss->included = 1;
                                current_ev = __prism2_translate_scan(
-                                       local, scan, hscan, hostscan, bss,
-                                       bssid, current_ev, end_buf);
+                                       local, scan, bss, current_ev, end_buf);
                                found++;
                        }
                }
                if (!found) {
                        current_ev = __prism2_translate_scan(
-                               local, scan, hscan, hostscan, NULL, bssid,
-                               current_ev, end_buf);
+                               local, scan, NULL, current_ev, end_buf);
                }
                /* Check if there is space for one more entry */
                if ((end_buf - current_ev) <= IW_EV_ADDR_LEN) {
@@ -2045,9 +2027,8 @@ static inline int prism2_translate_scan(local_info_t *local,
                bss = list_entry(ptr, struct hostap_bss_info, list);
                if (bss->included)
                        continue;
-               current_ev = __prism2_translate_scan(local, NULL, NULL, 0, bss,
-                                                    bss->bssid, current_ev,
-                                                    end_buf);
+               current_ev = __prism2_translate_scan(local, NULL, bss,
+                                                    current_ev, end_buf);
                /* Check if there is space for one more entry */
                if ((end_buf - current_ev) <= IW_EV_ADDR_LEN) {
                        /* Ask user space to try again with a bigger buffer */
@@ -2250,14 +2231,6 @@ static const struct iw_priv_args prism2_priv[] = {
          IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "host_decrypt" },
        { PRISM2_PARAM_HOST_DECRYPT,
          0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "gethost_decrypt" },
-       { PRISM2_PARAM_BUS_MASTER_THRESHOLD_RX,
-         IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "busmaster_rx" },
-       { PRISM2_PARAM_BUS_MASTER_THRESHOLD_RX,
-         0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getbusmaster_rx" },
-       { PRISM2_PARAM_BUS_MASTER_THRESHOLD_TX,
-         IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "busmaster_tx" },
-       { PRISM2_PARAM_BUS_MASTER_THRESHOLD_TX,
-         0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getbusmaster_tx" },
 #ifndef PRISM2_NO_STATION_MODES
        { PRISM2_PARAM_HOST_ROAMING,
          IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "host_roaming" },
@@ -2338,6 +2311,10 @@ static const struct iw_priv_args prism2_priv[] = {
          IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "drop_unencrypte" },
        { PRISM2_PARAM_DROP_UNENCRYPTED,
          0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getdrop_unencry" },
+       { PRISM2_PARAM_SCAN_CHANNEL_MASK,
+         IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "scan_channels" },
+       { PRISM2_PARAM_SCAN_CHANNEL_MASK,
+         0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getscan_channel" },
 };
 
 
@@ -2502,14 +2479,6 @@ static int prism2_ioctl_priv_prism2_param(struct net_device *dev,
                        ret = -EINVAL;
                break;
 
-       case PRISM2_PARAM_BUS_MASTER_THRESHOLD_RX:
-               local->bus_master_threshold_rx = value;
-               break;
-
-       case PRISM2_PARAM_BUS_MASTER_THRESHOLD_TX:
-               local->bus_master_threshold_tx = value;
-               break;
-
 #ifndef PRISM2_NO_STATION_MODES
        case PRISM2_PARAM_HOST_ROAMING:
                if (value < 0 || value > 2) {
@@ -2699,6 +2668,10 @@ static int prism2_ioctl_priv_prism2_param(struct net_device *dev,
                local->drop_unencrypted = value;
                break;
 
+       case PRISM2_PARAM_SCAN_CHANNEL_MASK:
+               local->scan_channel_mask = value;
+               break;
+
        default:
                printk(KERN_DEBUG "%s: prism2_param: unknown param %d\n",
                       dev->name, param);
@@ -2802,14 +2775,6 @@ static int prism2_ioctl_priv_get_prism2_param(struct net_device *dev,
                *param = local->host_decrypt;
                break;
 
-       case PRISM2_PARAM_BUS_MASTER_THRESHOLD_RX:
-               *param = local->bus_master_threshold_rx;
-               break;
-
-       case PRISM2_PARAM_BUS_MASTER_THRESHOLD_TX:
-               *param = local->bus_master_threshold_tx;
-               break;
-
        case PRISM2_PARAM_HOST_ROAMING:
                *param = local->host_roaming;
                break;
@@ -2890,6 +2855,10 @@ static int prism2_ioctl_priv_get_prism2_param(struct net_device *dev,
                *param = local->drop_unencrypted;
                break;
 
+       case PRISM2_PARAM_SCAN_CHANNEL_MASK:
+               *param = local->scan_channel_mask;
+               break;
+
        default:
                printk(KERN_DEBUG "%s: get_prism2_param: unknown param %d\n",
                       dev->name, *param);
@@ -3111,9 +3080,7 @@ static int prism2_ioctl_priv_download(local_info_t *local, struct iw_point *p)
        ret = local->func->download(local, param);
 
  out:
-       if (param != NULL)
-               kfree(param);
-
+       kfree(param);
        return ret;
 }
 #endif /* PRISM2_DOWNLOAD_SUPPORT */
@@ -3259,8 +3226,8 @@ static int prism2_ioctl_siwencodeext(struct net_device *dev,
        local_info_t *local = iface->local;
        struct iw_encode_ext *ext = (struct iw_encode_ext *) extra;
        int i, ret = 0;
-       struct hostap_crypto_ops *ops;
-       struct prism2_crypt_data **crypt;
+       struct ieee80211_crypto_ops *ops;
+       struct ieee80211_crypt_data **crypt;
        void *sta_ptr;
        u8 *addr;
        const char *alg, *module;
@@ -3308,15 +3275,15 @@ static int prism2_ioctl_siwencodeext(struct net_device *dev,
        switch (ext->alg) {
        case IW_ENCODE_ALG_WEP:
                alg = "WEP";
-               module = "hostap_crypt_wep";
+               module = "ieee80211_crypt_wep";
                break;
        case IW_ENCODE_ALG_TKIP:
                alg = "TKIP";
-               module = "hostap_crypt_tkip";
+               module = "ieee80211_crypt_tkip";
                break;
        case IW_ENCODE_ALG_CCMP:
                alg = "CCMP";
-               module = "hostap_crypt_ccmp";
+               module = "ieee80211_crypt_ccmp";
                break;
        default:
                printk(KERN_DEBUG "%s: unsupported algorithm %d\n",
@@ -3325,10 +3292,10 @@ static int prism2_ioctl_siwencodeext(struct net_device *dev,
                goto done;
        }
 
-       ops = hostap_get_crypto_ops(alg);
+       ops = ieee80211_get_crypto_ops(alg);
        if (ops == NULL) {
                request_module(module);
-               ops = hostap_get_crypto_ops(alg);
+               ops = ieee80211_get_crypto_ops(alg);
        }
        if (ops == NULL) {
                printk(KERN_DEBUG "%s: unknown crypto alg '%s'\n",
@@ -3347,17 +3314,18 @@ static int prism2_ioctl_siwencodeext(struct net_device *dev,
        }
 
        if (*crypt == NULL || (*crypt)->ops != ops) {
-               struct prism2_crypt_data *new_crypt;
+               struct ieee80211_crypt_data *new_crypt;
 
                prism2_crypt_delayed_deinit(local, crypt);
 
-               new_crypt = (struct prism2_crypt_data *)
-                       kmalloc(sizeof(struct prism2_crypt_data), GFP_KERNEL);
+               new_crypt = (struct ieee80211_crypt_data *)
+                       kmalloc(sizeof(struct ieee80211_crypt_data),
+                               GFP_KERNEL);
                if (new_crypt == NULL) {
                        ret = -ENOMEM;
                        goto done;
                }
-               memset(new_crypt, 0, sizeof(struct prism2_crypt_data));
+               memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data));
                new_crypt->ops = ops;
                new_crypt->priv = new_crypt->ops->init(i);
                if (new_crypt->priv == NULL) {
@@ -3436,7 +3404,7 @@ static int prism2_ioctl_giwencodeext(struct net_device *dev,
 {
        struct hostap_interface *iface = dev->priv;
        local_info_t *local = iface->local;
-       struct prism2_crypt_data **crypt;
+       struct ieee80211_crypt_data **crypt;
        void *sta_ptr;
        int max_key_len, i;
        struct iw_encode_ext *ext = (struct iw_encode_ext *) extra;
@@ -3505,8 +3473,8 @@ static int prism2_ioctl_set_encryption(local_info_t *local,
                                       int param_len)
 {
        int ret = 0;
-       struct hostap_crypto_ops *ops;
-       struct prism2_crypt_data **crypt;
+       struct ieee80211_crypto_ops *ops;
+       struct ieee80211_crypt_data **crypt;
        void *sta_ptr;
 
        param->u.crypt.err = 0;
@@ -3544,16 +3512,16 @@ static int prism2_ioctl_set_encryption(local_info_t *local,
                goto done;
        }
 
-       ops = hostap_get_crypto_ops(param->u.crypt.alg);
+       ops = ieee80211_get_crypto_ops(param->u.crypt.alg);
        if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) {
-               request_module("hostap_crypt_wep");
-               ops = hostap_get_crypto_ops(param->u.crypt.alg);
+               request_module("ieee80211_crypt_wep");
+               ops = ieee80211_get_crypto_ops(param->u.crypt.alg);
        } else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) {
-               request_module("hostap_crypt_tkip");
-               ops = hostap_get_crypto_ops(param->u.crypt.alg);
+               request_module("ieee80211_crypt_tkip");
+               ops = ieee80211_get_crypto_ops(param->u.crypt.alg);
        } else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) {
-               request_module("hostap_crypt_ccmp");
-               ops = hostap_get_crypto_ops(param->u.crypt.alg);
+               request_module("ieee80211_crypt_ccmp");
+               ops = ieee80211_get_crypto_ops(param->u.crypt.alg);
        }
        if (ops == NULL) {
                printk(KERN_DEBUG "%s: unknown crypto alg '%s'\n",
@@ -3568,17 +3536,18 @@ static int prism2_ioctl_set_encryption(local_info_t *local,
        local->host_decrypt = local->host_encrypt = 1;
 
        if (*crypt == NULL || (*crypt)->ops != ops) {
-               struct prism2_crypt_data *new_crypt;
+               struct ieee80211_crypt_data *new_crypt;
 
                prism2_crypt_delayed_deinit(local, crypt);
 
-               new_crypt = (struct prism2_crypt_data *)
-                       kmalloc(sizeof(struct prism2_crypt_data), GFP_KERNEL);
+               new_crypt = (struct ieee80211_crypt_data *)
+                       kmalloc(sizeof(struct ieee80211_crypt_data),
+                               GFP_KERNEL);
                if (new_crypt == NULL) {
                        ret = -ENOMEM;
                        goto done;
                }
-               memset(new_crypt, 0, sizeof(struct prism2_crypt_data));
+               memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data));
                new_crypt->ops = ops;
                new_crypt->priv = new_crypt->ops->init(param->u.crypt.idx);
                if (new_crypt->priv == NULL) {
@@ -3642,7 +3611,7 @@ static int prism2_ioctl_get_encryption(local_info_t *local,
                                       struct prism2_hostapd_param *param,
                                       int param_len)
 {
-       struct prism2_crypt_data **crypt;
+       struct ieee80211_crypt_data **crypt;
        void *sta_ptr;
        int max_key_len;
 
@@ -3805,11 +3774,11 @@ static int prism2_ioctl_siwmlme(struct net_device *dev,
        switch (mlme->cmd) {
        case IW_MLME_DEAUTH:
                return prism2_sta_send_mgmt(local, mlme->addr.sa_data,
-                                           WLAN_FC_STYPE_DEAUTH,
+                                           IEEE80211_STYPE_DEAUTH,
                                            (u8 *) &reason, 2);
        case IW_MLME_DISASSOC:
                return prism2_sta_send_mgmt(local, mlme->addr.sa_data,
-                                           WLAN_FC_STYPE_DISASSOC,
+                                           IEEE80211_STYPE_DISASSOC,
                                            (u8 *) &reason, 2);
        default:
                return -EOPNOTSUPP;
@@ -3826,11 +3795,11 @@ static int prism2_ioctl_mlme(local_info_t *local,
        switch (param->u.mlme.cmd) {
        case MLME_STA_DEAUTH:
                return prism2_sta_send_mgmt(local, param->sta_addr,
-                                           WLAN_FC_STYPE_DEAUTH,
+                                           IEEE80211_STYPE_DEAUTH,
                                            (u8 *) &reason, 2);
        case MLME_STA_DISASSOC:
                return prism2_sta_send_mgmt(local, param->sta_addr,
-                                           WLAN_FC_STYPE_DISASSOC,
+                                           IEEE80211_STYPE_DISASSOC,
                                            (u8 *) &reason, 2);
        default:
                return -EOPNOTSUPP;
@@ -3918,9 +3887,7 @@ static int prism2_ioctl_priv_hostapd(local_info_t *local, struct iw_point *p)
        }
 
  out:
-       if (param != NULL)
-               kfree(param);
-
+       kfree(param);
        return ret;
 }