]> err.no Git - linux-2.6/blobdiff - drivers/net/wireless/prism54/isl_ioctl.c
wext: Emit event stream entries correctly when compat.
[linux-2.6] / drivers / net / wireless / prism54 / isl_ioctl.c
index 1b595a6525f4e4346ba2b1f9100ba31e8c1ddfef..97fa14e0a47912c0c8513a23dd8053b3acb649bc 100644 (file)
@@ -165,7 +165,7 @@ prism54_update_stats(struct work_struct *work)
        struct obj_bss bss, *bss2;
        union oid_res_t r;
 
-       down(&priv->stats_sem);
+       mutex_lock(&priv->stats_lock);
 
 /* Noise floor.
  * I'm not sure if the unit is dBm.
@@ -207,7 +207,7 @@ prism54_update_stats(struct work_struct *work)
        mgt_get_request(priv, DOT11_OID_MPDUTXFAILED, 0, NULL, &r);
        priv->local_iwstatistics.discard.retries = r.u;
 
-       up(&priv->stats_sem);
+       mutex_unlock(&priv->stats_lock);
 
        return;
 }
@@ -218,12 +218,12 @@ prism54_get_wireless_stats(struct net_device *ndev)
        islpci_private *priv = netdev_priv(ndev);
 
        /* If the stats are being updated return old data */
-       if (down_trylock(&priv->stats_sem) == 0) {
+       if (mutex_trylock(&priv->stats_lock)) {
                memcpy(&priv->iwstatistics, &priv->local_iwstatistics,
                       sizeof (struct iw_statistics));
                /* They won't be marked updated for the next time */
                priv->local_iwstatistics.qual.updated = 0;
-               up(&priv->stats_sem);
+               mutex_unlock(&priv->stats_lock);
        } else
                priv->iwstatistics.qual.updated = 0;
 
@@ -571,8 +571,9 @@ prism54_set_scan(struct net_device *dev, struct iw_request_info *info,
  */
 
 static char *
-prism54_translate_bss(struct net_device *ndev, char *current_ev,
-                     char *end_buf, struct obj_bss *bss, char noise)
+prism54_translate_bss(struct net_device *ndev, struct iw_request_info *info,
+                     char *current_ev, char *end_buf, struct obj_bss *bss,
+                     char noise)
 {
        struct iw_event iwe;    /* Temporary buffer */
        short cap;
@@ -584,8 +585,8 @@ prism54_translate_bss(struct net_device *ndev, char *current_ev,
        memcpy(iwe.u.ap_addr.sa_data, bss->address, 6);
        iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
        iwe.cmd = SIOCGIWAP;
-       current_ev =
-           iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_ADDR_LEN);
+       current_ev = iwe_stream_add_event(info, current_ev, end_buf,
+                                         &iwe, IW_EV_ADDR_LEN);
 
        /* The following entries will be displayed in the same order we give them */
 
@@ -593,7 +594,7 @@ prism54_translate_bss(struct net_device *ndev, char *current_ev,
        iwe.u.data.length = bss->ssid.length;
        iwe.u.data.flags = 1;
        iwe.cmd = SIOCGIWESSID;
-       current_ev = iwe_stream_add_point(current_ev, end_buf,
+       current_ev = iwe_stream_add_point(info, current_ev, end_buf,
                                          &iwe, bss->ssid.octets);
 
        /* Capabilities */
@@ -610,9 +611,8 @@ prism54_translate_bss(struct net_device *ndev, char *current_ev,
                iwe.u.mode = IW_MODE_ADHOC;
        iwe.cmd = SIOCGIWMODE;
        if (iwe.u.mode)
-               current_ev =
-                   iwe_stream_add_event(current_ev, end_buf, &iwe,
-                                        IW_EV_UINT_LEN);
+               current_ev = iwe_stream_add_event(info, current_ev, end_buf,
+                                                 &iwe, IW_EV_UINT_LEN);
 
        /* Encryption capability */
        if (cap & CAP_CRYPT)
@@ -621,14 +621,15 @@ prism54_translate_bss(struct net_device *ndev, char *current_ev,
                iwe.u.data.flags = IW_ENCODE_DISABLED;
        iwe.u.data.length = 0;
        iwe.cmd = SIOCGIWENCODE;
-       current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, NULL);
+       current_ev = iwe_stream_add_point(info, current_ev, end_buf,
+                                         &iwe, NULL);
 
        /* Add frequency. (short) bss->channel is the frequency in MHz */
        iwe.u.freq.m = bss->channel;
        iwe.u.freq.e = 6;
        iwe.cmd = SIOCGIWFREQ;
-       current_ev =
-           iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_FREQ_LEN);
+       current_ev = iwe_stream_add_event(info, current_ev, end_buf,
+                                         &iwe, IW_EV_FREQ_LEN);
 
        /* Add quality statistics */
        iwe.u.qual.level = bss->rssi;
@@ -636,20 +637,20 @@ prism54_translate_bss(struct net_device *ndev, char *current_ev,
        /* do a simple SNR for quality */
        iwe.u.qual.qual = bss->rssi - noise;
        iwe.cmd = IWEVQUAL;
-       current_ev =
-           iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_QUAL_LEN);
+       current_ev = iwe_stream_add_event(info, current_ev, end_buf,
+                                         &iwe, IW_EV_QUAL_LEN);
 
        /* Add WPA/RSN Information Element, if any */
        wpa_ie_len = prism54_wpa_bss_ie_get(priv, bss->address, wpa_ie);
        if (wpa_ie_len > 0) {
                iwe.cmd = IWEVGENIE;
                iwe.u.data.length = min(wpa_ie_len, (size_t)MAX_WPA_IE_LEN);
-               current_ev = iwe_stream_add_point(current_ev, end_buf,
-                               &iwe, wpa_ie);
+               current_ev = iwe_stream_add_point(info, current_ev, end_buf,
+                                                 &iwe, wpa_ie);
        }
        /* Do the bitrates */
        {
-               char *  current_val = current_ev + IW_EV_LCP_LEN;
+               char *current_val = current_ev + iwe_stream_lcp_len(info);
                int i;
                int mask;
 
@@ -662,14 +663,14 @@ prism54_translate_bss(struct net_device *ndev, char *current_ev,
                for(i = 0; i < sizeof(scan_rate_list); i++) {
                        if(bss->rates & mask) {
                                iwe.u.bitrate.value = (scan_rate_list[i] * 500000);
-                               current_val = iwe_stream_add_value(current_ev, current_val,
-                                                                  end_buf, &iwe,
-                                                                  IW_EV_PARAM_LEN);
+                               current_val = iwe_stream_add_value(
+                                       info, current_ev, current_val,
+                                       end_buf, &iwe, IW_EV_PARAM_LEN);
                        }
                        mask <<= 1;
                }
                /* Check if we added any event */
-               if ((current_val - current_ev) > IW_EV_LCP_LEN)
+               if ((current_val - current_ev) > iwe_stream_lcp_len(info))
                        current_ev = current_val;
        }
 
@@ -710,7 +711,7 @@ prism54_get_scan(struct net_device *ndev, struct iw_request_info *info,
 
        /* ok now, scan the list and translate its info */
        for (i = 0; i < (int) bsslist->nr; i++) {
-               current_ev = prism54_translate_bss(ndev, current_ev,
+               current_ev = prism54_translate_bss(ndev, info, current_ev,
                                                   extra + dwrq->length,
                                                   &(bsslist->bsslist[i]),
                                                   noise);
@@ -1186,7 +1187,7 @@ prism54_get_encode(struct net_device *ndev, struct iw_request_info *info,
        rvalue |= mgt_get_request(priv, DOT11_OID_DEFKEYID, 0, NULL, &r);
        devindex = r.u;
        /* Now get the key, return it */
-       if ((index < 0) || (index > 3))
+       if (index == -1 || index > 3)
                /* no index provided, use the current one */
                index = devindex;
        rvalue |= mgt_get_request(priv, DOT11_OID_DEFKEYX, index, NULL, &r);
@@ -1780,7 +1781,7 @@ prism54_set_raw(struct net_device *ndev, struct iw_request_info *info,
 void
 prism54_acl_init(struct islpci_acl *acl)
 {
-       sema_init(&acl->sem, 1);
+       mutex_init(&acl->lock);
        INIT_LIST_HEAD(&acl->mac_list);
        acl->size = 0;
        acl->policy = MAC_POLICY_OPEN;
@@ -1792,10 +1793,10 @@ prism54_clear_mac(struct islpci_acl *acl)
        struct list_head *ptr, *next;
        struct mac_entry *entry;
 
-       down(&acl->sem);
+       mutex_lock(&acl->lock);
 
        if (acl->size == 0) {
-               up(&acl->sem);
+               mutex_unlock(&acl->lock);
                return;
        }
 
@@ -1806,7 +1807,7 @@ prism54_clear_mac(struct islpci_acl *acl)
                kfree(entry);
        }
        acl->size = 0;
-       up(&acl->sem);
+       mutex_unlock(&acl->lock);
 }
 
 void
@@ -1833,13 +1834,13 @@ prism54_add_mac(struct net_device *ndev, struct iw_request_info *info,
 
        memcpy(entry->addr, addr->sa_data, ETH_ALEN);
 
-       if (down_interruptible(&acl->sem)) {
+       if (mutex_lock_interruptible(&acl->lock)) {
                kfree(entry);
                return -ERESTARTSYS;
        }
        list_add_tail(&entry->_list, &acl->mac_list);
        acl->size++;
-       up(&acl->sem);
+       mutex_unlock(&acl->lock);
 
        return 0;
 }
@@ -1856,18 +1857,18 @@ prism54_del_mac(struct net_device *ndev, struct iw_request_info *info,
        if (addr->sa_family != ARPHRD_ETHER)
                return -EOPNOTSUPP;
 
-       if (down_interruptible(&acl->sem))
+       if (mutex_lock_interruptible(&acl->lock))
                return -ERESTARTSYS;
        list_for_each_entry(entry, &acl->mac_list, _list) {
                if (memcmp(entry->addr, addr->sa_data, ETH_ALEN) == 0) {
                        list_del(&entry->_list);
                        acl->size--;
                        kfree(entry);
-                       up(&acl->sem);
+                       mutex_unlock(&acl->lock);
                        return 0;
                }
        }
-       up(&acl->sem);
+       mutex_unlock(&acl->lock);
        return -EINVAL;
 }
 
@@ -1882,7 +1883,7 @@ prism54_get_mac(struct net_device *ndev, struct iw_request_info *info,
 
        dwrq->length = 0;
 
-       if (down_interruptible(&acl->sem))
+       if (mutex_lock_interruptible(&acl->lock))
                return -ERESTARTSYS;
 
        list_for_each_entry(entry, &acl->mac_list, _list) {
@@ -1891,7 +1892,7 @@ prism54_get_mac(struct net_device *ndev, struct iw_request_info *info,
                dwrq->length++;
                dst++;
        }
-       up(&acl->sem);
+       mutex_unlock(&acl->lock);
        return 0;
 }
 
@@ -1955,11 +1956,11 @@ prism54_mac_accept(struct islpci_acl *acl, char *mac)
        struct mac_entry *entry;
        int res = 0;
 
-       if (down_interruptible(&acl->sem))
+       if (mutex_lock_interruptible(&acl->lock))
                return -ERESTARTSYS;
 
        if (acl->policy == MAC_POLICY_OPEN) {
-               up(&acl->sem);
+               mutex_unlock(&acl->lock);
                return 1;
        }
 
@@ -1970,7 +1971,7 @@ prism54_mac_accept(struct islpci_acl *acl, char *mac)
                }
        }
        res = (acl->policy == MAC_POLICY_ACCEPT) ? !res : res;
-       up(&acl->sem);
+       mutex_unlock(&acl->lock);
 
        return res;
 }
@@ -2081,6 +2082,7 @@ link_changed(struct net_device *ndev, u32 bitrate)
        islpci_private *priv = netdev_priv(ndev);
 
        if (bitrate) {
+               netif_carrier_on(ndev);
                if (priv->iw_mode == IW_MODE_INFRA) {
                        union iwreq_data uwrq;
                        prism54_get_wap(ndev, NULL, (struct sockaddr *) &uwrq,
@@ -2089,8 +2091,10 @@ link_changed(struct net_device *ndev, u32 bitrate)
                } else
                        send_simple_event(netdev_priv(ndev),
                                          "Link established");
-       } else
+       } else {
+               netif_carrier_off(ndev);
                send_simple_event(netdev_priv(ndev), "Link lost");
+       }
 }
 
 /* Beacon/ProbeResp payload header */
@@ -2114,7 +2118,7 @@ prism54_wpa_bss_ie_add(islpci_private *priv, u8 *bssid,
        if (wpa_ie_len > MAX_WPA_IE_LEN)
                wpa_ie_len = MAX_WPA_IE_LEN;
 
-       down(&priv->wpa_sem);
+       mutex_lock(&priv->wpa_lock);
 
        /* try to use existing entry */
        list_for_each(ptr, &priv->bss_wpa_list) {
@@ -2165,7 +2169,7 @@ prism54_wpa_bss_ie_add(islpci_private *priv, u8 *bssid,
                kfree(bss);
        }
 
-       up(&priv->wpa_sem);
+       mutex_unlock(&priv->wpa_lock);
 }
 
 static size_t
@@ -2175,7 +2179,7 @@ prism54_wpa_bss_ie_get(islpci_private *priv, u8 *bssid, u8 *wpa_ie)
        struct islpci_bss_wpa_ie *bss = NULL;
        size_t len = 0;
 
-       down(&priv->wpa_sem);
+       mutex_lock(&priv->wpa_lock);
 
        list_for_each(ptr, &priv->bss_wpa_list) {
                bss = list_entry(ptr, struct islpci_bss_wpa_ie, list);
@@ -2187,7 +2191,7 @@ prism54_wpa_bss_ie_get(islpci_private *priv, u8 *bssid, u8 *wpa_ie)
                len = bss->wpa_ie_len;
                memcpy(wpa_ie, bss->wpa_ie, len);
        }
-       up(&priv->wpa_sem);
+       mutex_unlock(&priv->wpa_lock);
 
        return len;
 }
@@ -2196,7 +2200,7 @@ void
 prism54_wpa_bss_ie_init(islpci_private *priv)
 {
        INIT_LIST_HEAD(&priv->bss_wpa_list);
-       sema_init(&priv->wpa_sem, 1);
+       mutex_init(&priv->wpa_lock);
 }
 
 void
@@ -2701,6 +2705,7 @@ prism2_ioctl_scan_req(struct net_device *ndev,
                      struct prism2_hostapd_param *param)
 {
        islpci_private *priv = netdev_priv(ndev);
+       struct iw_request_info info;
        int i, rvalue;
        struct obj_bsslist *bsslist;
        u32 noise = 0;
@@ -2724,9 +2729,12 @@ prism2_ioctl_scan_req(struct net_device *ndev,
        rvalue |= mgt_get_request(priv, DOT11_OID_BSSLIST, 0, NULL, &r);
        bsslist = r.ptr;
 
+       info.cmd = PRISM54_HOSTAPD;
+       info.flags = 0;
+
        /* ok now, scan the list and translate its info */
        for (i = 0; i < min(IW_MAX_AP, (int) bsslist->nr); i++)
-               current_ev = prism54_translate_bss(ndev, current_ev,
+               current_ev = prism54_translate_bss(ndev, &info, current_ev,
                                                   extra + IW_SCAN_MAX_DATA,
                                                   &(bsslist->bsslist[i]),
                                                   noise);