| Index: chromeos/drivers/ath6kl/os/linux/wireless_ext.c
|
| diff --git a/chromeos/drivers/ath6kl/os/linux/wireless_ext.c b/chromeos/drivers/ath6kl/os/linux/wireless_ext.c
|
| index 3085460e5b8ec230f39c81cb2398683dec5e9c2c..bb6de0f404fe37999ee12f0ed426fd5b5e9ae53d 100644
|
| --- a/chromeos/drivers/ath6kl/os/linux/wireless_ext.c
|
| +++ b/chromeos/drivers/ath6kl/os/linux/wireless_ext.c
|
| @@ -1,24 +1,37 @@
|
| -/*
|
| - *
|
| - * Copyright (c) 2004-2010 Atheros Communications Inc.
|
| - * All rights reserved.
|
| - *
|
| - *
|
| -// This program is free software; you can redistribute it and/or modify
|
| -// it under the terms of the GNU General Public License version 2 as
|
| -// published by the Free Software Foundation;
|
| +//------------------------------------------------------------------------------
|
| +// Copyright (c) 2004-2010 Atheros Communications Inc.
|
| +// All rights reserved.
|
| //
|
| -// Software distributed under the License is distributed on an "AS
|
| -// IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
| -// implied. See the License for the specific language governing
|
| -// rights and limitations under the License.
|
| +//
|
| //
|
| +// Permission to use, copy, modify, and/or distribute this software for any
|
| +// purpose with or without fee is hereby granted, provided that the above
|
| +// copyright notice and this permission notice appear in all copies.
|
| //
|
| - *
|
| - */
|
| +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
| +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
| +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
| +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
| +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
| +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
| +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
| +//
|
| +//
|
| +//
|
| +// Author(s): ="Atheros"
|
| +//------------------------------------------------------------------------------
|
|
|
| #include "ar6000_drv.h"
|
|
|
| +#define IWE_STREAM_ADD_EVENT(p1, p2, p3, p4, p5) \
|
| + iwe_stream_add_event((p1), (p2), (p3), (p4), (p5))
|
| +
|
| +#define IWE_STREAM_ADD_POINT(p1, p2, p3, p4, p5) \
|
| + iwe_stream_add_point((p1), (p2), (p3), (p4), (p5))
|
| +
|
| +#define IWE_STREAM_ADD_VALUE(p1, p2, p3, p4, p5, p6) \
|
| + iwe_stream_add_value((p1), (p2), (p3), (p4), (p5), (p6))
|
| +
|
| static void ar6000_set_quality(struct iw_quality *iq, A_INT8 rssi);
|
| extern unsigned int wmitimeout;
|
| extern A_WAITQUEUE_HEAD arEvent;
|
| @@ -101,12 +114,8 @@ ar6000_scan_node(void *arg, bss_t *ni)
|
| iwe.cmd = SIOCGIWAP;
|
| iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
|
| A_MEMCPY(iwe.u.ap_addr.sa_data, ni->ni_macaddr, 6);
|
| - current_ev = iwe_stream_add_event(
|
| -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
|
| - param->info,
|
| -#endif
|
| - current_ev, end_buf, &iwe,
|
| - IW_EV_ADDR_LEN);
|
| + current_ev = IWE_STREAM_ADD_EVENT(param->info, current_ev, end_buf,
|
| + &iwe, IW_EV_ADDR_LEN);
|
| }
|
| param->bytes_needed += IW_EV_ADDR_LEN;
|
|
|
| @@ -117,12 +126,8 @@ ar6000_scan_node(void *arg, bss_t *ni)
|
| iwe.cmd = SIOCGIWESSID;
|
| iwe.u.data.flags = 1;
|
| iwe.u.data.length = cie->ie_ssid[1];
|
| - current_ev = iwe_stream_add_point(
|
| -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
|
| - param->info,
|
| -#endif
|
| - current_ev, end_buf, &iwe,
|
| - (char*)&cie->ie_ssid[2]);
|
| + current_ev = IWE_STREAM_ADD_POINT(param->info, current_ev, end_buf,
|
| + &iwe, (char*)&cie->ie_ssid[2]);
|
| }
|
| param->bytes_needed += data_len;
|
|
|
| @@ -133,12 +138,8 @@ ar6000_scan_node(void *arg, bss_t *ni)
|
| iwe.cmd = SIOCGIWMODE;
|
| iwe.u.mode = cie->ie_capInfo & IEEE80211_CAPINFO_ESS ?
|
| IW_MODE_MASTER : IW_MODE_ADHOC;
|
| - current_ev = iwe_stream_add_event(
|
| -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
|
| - param->info,
|
| -#endif
|
| - current_ev, end_buf, &iwe,
|
| - IW_EV_UINT_LEN);
|
| + current_ev = IWE_STREAM_ADD_EVENT(param->info, current_ev, end_buf,
|
| + &iwe, IW_EV_UINT_LEN);
|
| }
|
| param->bytes_needed += IW_EV_UINT_LEN;
|
| }
|
| @@ -149,12 +150,8 @@ ar6000_scan_node(void *arg, bss_t *ni)
|
| iwe.cmd = SIOCGIWFREQ;
|
| iwe.u.freq.m = cie->ie_chan * 100000;
|
| iwe.u.freq.e = 1;
|
| - current_ev = iwe_stream_add_event(
|
| -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
|
| - param->info,
|
| -#endif
|
| - current_ev, end_buf, &iwe,
|
| - IW_EV_FREQ_LEN);
|
| + current_ev = IWE_STREAM_ADD_EVENT(param->info, current_ev, end_buf,
|
| + &iwe, IW_EV_FREQ_LEN);
|
| }
|
| param->bytes_needed += IW_EV_FREQ_LEN;
|
|
|
| @@ -163,12 +160,8 @@ ar6000_scan_node(void *arg, bss_t *ni)
|
| A_MEMZERO(&iwe, sizeof(iwe));
|
| iwe.cmd = IWEVQUAL;
|
| ar6000_set_quality(&iwe.u.qual, ni->ni_snr);
|
| - current_ev = iwe_stream_add_event(
|
| -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
|
| - param->info,
|
| -#endif
|
| - current_ev, end_buf, &iwe,
|
| - IW_EV_QUAL_LEN);
|
| + current_ev = IWE_STREAM_ADD_EVENT(param->info, current_ev, end_buf,
|
| + &iwe, IW_EV_QUAL_LEN);
|
| }
|
| param->bytes_needed += IW_EV_QUAL_LEN;
|
|
|
| @@ -182,11 +175,8 @@ ar6000_scan_node(void *arg, bss_t *ni)
|
| iwe.u.data.flags = IW_ENCODE_DISABLED;
|
| }
|
| iwe.u.data.length = 0;
|
| - current_ev = iwe_stream_add_point(
|
| -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
|
| - param->info,
|
| -#endif
|
| - current_ev, end_buf, &iwe, "");
|
| + current_ev = IWE_STREAM_ADD_POINT(param->info, current_ev, end_buf,
|
| + &iwe, "");
|
| }
|
| param->bytes_needed += IW_EV_POINT_LEN;
|
|
|
| @@ -209,15 +199,9 @@ ar6000_scan_node(void *arg, bss_t *ni)
|
| val = cie->ie_rates[2 + j];
|
| iwe.u.bitrate.value =
|
| (val >= 0x80)? ((val - 0x80) * 500000): (val * 500000);
|
| - current_val = iwe_stream_add_value(
|
| -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
|
| - param->info,
|
| -#endif
|
| - current_ev,
|
| - current_val,
|
| - end_buf,
|
| - &iwe,
|
| - IW_EV_PARAM_LEN);
|
| + current_val = IWE_STREAM_ADD_VALUE(param->info, current_ev,
|
| + current_val, end_buf,
|
| + &iwe, IW_EV_PARAM_LEN);
|
| }
|
| }
|
| param->bytes_needed += data_len;
|
| @@ -233,15 +217,9 @@ ar6000_scan_node(void *arg, bss_t *ni)
|
| val = cie->ie_xrates[2 + j];
|
| iwe.u.bitrate.value =
|
| (val >= 0x80)? ((val - 0x80) * 500000): (val * 500000);
|
| - current_val = iwe_stream_add_value(
|
| -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
|
| - param->info,
|
| -#endif
|
| - current_ev,
|
| - current_val,
|
| - end_buf,
|
| - &iwe,
|
| - IW_EV_PARAM_LEN);
|
| + current_val = IWE_STREAM_ADD_VALUE(param->info, current_ev,
|
| + current_val, end_buf,
|
| + &iwe, IW_EV_PARAM_LEN);
|
| }
|
| }
|
| param->bytes_needed += data_len;
|
| @@ -259,11 +237,8 @@ ar6000_scan_node(void *arg, bss_t *ni)
|
| A_MEMZERO(&iwe, sizeof(iwe));
|
| iwe.cmd = IWEVGENIE;
|
| iwe.u.data.length = cie->ie_wpa[1] + 2;
|
| - current_ev = iwe_stream_add_point(
|
| -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
|
| - param->info,
|
| -#endif
|
| - current_ev, end_buf, &iwe, (char*)cie->ie_wpa);
|
| + current_ev = IWE_STREAM_ADD_POINT(param->info, current_ev, end_buf,
|
| + &iwe, (char*)cie->ie_wpa);
|
| }
|
| param->bytes_needed += data_len;
|
| }
|
| @@ -275,11 +250,8 @@ ar6000_scan_node(void *arg, bss_t *ni)
|
| A_MEMZERO(&iwe, sizeof(iwe));
|
| iwe.cmd = IWEVGENIE;
|
| iwe.u.data.length = cie->ie_rsn[1] + 2;
|
| - current_ev = iwe_stream_add_point(
|
| -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
|
| - param->info,
|
| -#endif
|
| - current_ev, end_buf, &iwe, (char*)cie->ie_rsn);
|
| + current_ev = IWE_STREAM_ADD_POINT(param->info, current_ev, end_buf,
|
| + &iwe, (char*)cie->ie_rsn);
|
| }
|
| param->bytes_needed += data_len;
|
| }
|
| @@ -308,11 +280,8 @@ ar6000_scan_node(void *arg, bss_t *ni)
|
| snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11b");
|
| break;
|
| }
|
| - current_ev = iwe_stream_add_event(
|
| -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
|
| - param->info,
|
| -#endif
|
| - current_ev, end_buf, &iwe, IW_EV_CHAR_LEN);
|
| + current_ev = IWE_STREAM_ADD_EVENT(param->info, current_ev, end_buf,
|
| + &iwe, IW_EV_CHAR_LEN);
|
| }
|
| param->bytes_needed += IW_EV_CHAR_LEN;
|
|
|
| @@ -323,11 +292,8 @@ ar6000_scan_node(void *arg, bss_t *ni)
|
| data_len = iwe.u.data.length + IW_EV_POINT_LEN;
|
| if ((end_buf - current_ev) > data_len)
|
| {
|
| - current_ev = iwe_stream_add_point(
|
| -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
|
| - param->info,
|
| -#endif
|
| - current_ev, end_buf, &iwe, buf);
|
| + current_ev = IWE_STREAM_ADD_POINT(param->info, current_ev, end_buf,
|
| + &iwe, buf);
|
| }
|
| param->bytes_needed += data_len;
|
|
|
| @@ -344,11 +310,8 @@ ar6000_scan_node(void *arg, bss_t *ni)
|
| wpa_leader, sizeof(wpa_leader)-1);
|
|
|
| if (iwe.u.data.length != 0) {
|
| - current_ev = iwe_stream_add_point(
|
| -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
|
| - param->info,
|
| -#endif
|
| - current_ev, end_buf, &iwe, buf);
|
| + current_ev = IWE_STREAM_ADD_POINT(param->info, current_ev,
|
| + end_buf, &iwe, buf);
|
| }
|
| }
|
| param->bytes_needed += data_len;
|
| @@ -366,11 +329,8 @@ ar6000_scan_node(void *arg, bss_t *ni)
|
| rsn_leader, sizeof(rsn_leader)-1);
|
|
|
| if (iwe.u.data.length != 0) {
|
| - current_ev = iwe_stream_add_point(
|
| -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
|
| - param->info,
|
| -#endif
|
| - current_ev, end_buf, &iwe, buf);
|
| + current_ev = IWE_STREAM_ADD_POINT(param->info, current_ev,
|
| + end_buf, &iwe, buf);
|
| }
|
| }
|
| param->bytes_needed += data_len;
|
| @@ -388,11 +348,8 @@ ar6000_scan_node(void *arg, bss_t *ni)
|
| cie->ie_wmm[1]+2,
|
| wmm_leader, sizeof(wmm_leader)-1);
|
| if (iwe.u.data.length != 0) {
|
| - current_ev = iwe_stream_add_point(
|
| -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
|
| - param->info,
|
| -#endif
|
| - current_ev, end_buf, &iwe, buf);
|
| + current_ev = IWE_STREAM_ADD_POINT(param->info, current_ev,
|
| + end_buf, &iwe, buf);
|
| }
|
| }
|
| param->bytes_needed += data_len;
|
| @@ -409,11 +366,8 @@ ar6000_scan_node(void *arg, bss_t *ni)
|
| cie->ie_ath[1]+2,
|
| ath_leader, sizeof(ath_leader)-1);
|
| if (iwe.u.data.length != 0) {
|
| - current_ev = iwe_stream_add_point(
|
| -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
|
| - param->info,
|
| -#endif
|
| - current_ev, end_buf, &iwe, buf);
|
| + current_ev = IWE_STREAM_ADD_POINT(param->info, current_ev,
|
| + end_buf, &iwe, buf);
|
| }
|
| }
|
| param->bytes_needed += data_len;
|
| @@ -430,11 +384,8 @@ ar6000_scan_node(void *arg, bss_t *ni)
|
| cie->ie_wapi[1] + 2,
|
| wapi_leader, sizeof(wapi_leader) - 1);
|
| if (iwe.u.data.length != 0) {
|
| - current_ev = iwe_stream_add_point(
|
| -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
|
| - param->info,
|
| -#endif
|
| - current_ev, end_buf, &iwe, buf);
|
| + current_ev = IWE_STREAM_ADD_POINT(param->info, current_ev,
|
| + end_buf, &iwe, buf);
|
| }
|
| }
|
| param->bytes_needed += data_len;
|
| @@ -451,11 +402,8 @@ ar6000_scan_node(void *arg, bss_t *ni)
|
| A_MEMZERO(&iwe, sizeof(iwe));
|
| iwe.cmd = IWEVGENIE;
|
| iwe.u.data.length = cie->ie_wsc[1] + 2;
|
| - current_ev = iwe_stream_add_point(
|
| -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
|
| - param->info,
|
| -#endif
|
| - current_ev, end_buf, &iwe, (char*)cie->ie_wsc);
|
| + current_ev = IWE_STREAM_ADD_POINT(param->info, current_ev, end_buf,
|
| + &iwe, (char*)cie->ie_wsc);
|
| }
|
| param->bytes_needed += data_len;
|
| }
|
| @@ -488,9 +436,7 @@ ar6000_ioctl_giwscan(struct net_device *dev,
|
| param.current_ev = extra;
|
| param.end_buf = extra + data->length;
|
| param.bytes_needed = 0;
|
| -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
|
| param.info = info;
|
| -#endif
|
|
|
| /* Translate data to WE format */
|
| wmi_iterate_nodes(ar->arWmi, ar6000_scan_node, ¶m);
|
| @@ -768,6 +714,7 @@ ar6000_ioctl_siwrate(struct net_device *dev,
|
| {
|
| AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
|
| A_UINT32 kbps;
|
| + A_INT8 rate_idx;
|
|
|
| if (is_iwioctl_allowed(ar->arNextMode, info->cmd) != A_OK) {
|
| A_PRINTF("wext_ioctl: cmd=0x%x not allowed in this mode\n", info->cmd);
|
| @@ -779,7 +726,7 @@ ar6000_ioctl_siwrate(struct net_device *dev,
|
| } else {
|
| kbps = -1; /* -1 indicates auto rate */
|
| }
|
| - if(kbps != -1 && wmi_validate_bitrate(ar->arWmi, kbps) == A_EINVAL)
|
| + if(kbps != -1 && wmi_validate_bitrate(ar->arWmi, kbps, &rate_idx) != A_OK)
|
| {
|
| AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("BitRate is not Valid %d\n", kbps));
|
| return -EINVAL;
|
| @@ -2412,7 +2359,7 @@ ar6000_ioctl_giwap(struct net_device *dev,
|
| return 0;
|
| }
|
|
|
| -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)
|
| +#if (WIRELESS_EXT >= 18)
|
| /*
|
| * SIOCSIWMLME
|
| */
|
| @@ -2489,7 +2436,7 @@ ar6000_ioctl_siwmlme(struct net_device *dev,
|
| up(&ar->arSem);
|
| return 0;
|
| }
|
| -#endif /* LINUX_VERSION_CODE */
|
| +#endif /* WIRELESS_EXT >= 18 */
|
|
|
| /*
|
| * SIOCGIWAPLIST
|
| @@ -2563,17 +2510,24 @@ ar6000_ioctl_siwscan(struct net_device *dev,
|
| return -EIO;
|
| if (wmi_probedSsid_cmd(ar->arWmi, 1, SPECIFIC_SSID_FLAG, req.essid_len, req.essid) != A_OK)
|
| return -EIO;
|
| + ar->scanSpecificSsid = 1;
|
| }
|
| else
|
| {
|
| - if (wmi_probedSsid_cmd(ar->arWmi, 1, DISABLE_SSID_FLAG, 0, NULL) != A_OK)
|
| - return -EIO;
|
| + if (ar->scanSpecificSsid) {
|
| + if (wmi_probedSsid_cmd(ar->arWmi, 1, DISABLE_SSID_FLAG, 0, NULL) != A_OK)
|
| + return -EIO;
|
| + ar->scanSpecificSsid = 0;
|
| + }
|
| }
|
| }
|
| else
|
| {
|
| - if (wmi_probedSsid_cmd(ar->arWmi, 1, DISABLE_SSID_FLAG, 0, NULL) != A_OK)
|
| - return -EIO;
|
| + if (ar->scanSpecificSsid) {
|
| + if (wmi_probedSsid_cmd(ar->arWmi, 1, DISABLE_SSID_FLAG, 0, NULL) != A_OK)
|
| + return -EIO;
|
| + ar->scanSpecificSsid = 0;
|
| + }
|
| }
|
| #endif
|
| #endif /* ANDROID_ENV */
|
| @@ -2720,11 +2674,11 @@ static const iw_handler ath_handlers[] = {
|
| (iw_handler) NULL, /* SIOCGIWTHRSPY */
|
| (iw_handler) ar6000_ioctl_siwap, /* SIOCSIWAP */
|
| (iw_handler) ar6000_ioctl_giwap, /* SIOCGIWAP */
|
| -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)
|
| +#if (WIRELESS_EXT >= 18)
|
| (iw_handler) ar6000_ioctl_siwmlme, /* SIOCSIWMLME */
|
| #else
|
| (iw_handler) NULL, /* -- hole -- */
|
| -#endif /* LINUX_VERSION_CODE */
|
| +#endif /* WIRELESS_EXT >= 18 */
|
| (iw_handler) ar6000_ioctl_iwaplist, /* SIOCGIWAPLIST */
|
| (iw_handler) ar6000_ioctl_siwscan, /* SIOCSIWSCAN */
|
| (iw_handler) ar6000_ioctl_giwscan, /* SIOCGIWSCAN */
|
|
|