Hi Samuel, This patch should be related to below BOO #
Bug 10219 Bug 10011 Best regatds, Samuel Chang Engineer Qualcomm Atheros, Inc. -----Original Message----- From: Samuel Ortiz [mailto:sa...@linux.intel.com] Sent: Thursday, July 07, 2011 2:17 AM To: Chang, Samuel Cc: meego-kernel@lists.meego.com; kristen.c.acca...@intel.com; Wu, Ricky; Huang, Maggie; Yang, Jack Subject: Re: [Meego-kernel] [PATCH] ar6003 : fix cfg80211 bss signal format Hi Samuel On Wed, Jul 06, 2011 at 07:49:57AM +0000, Chang, Samuel wrote: > Subject: Correct the cfg80211 bss signal strenth format > > BOO # 10279 - Strength in list-service is always 100, which is wrong > > ar6003_cfg80211_rssi_signal_fix.patch is based on an accepted patch - > kernel-adaptation-mrst-2.6.37.6-92.2 and ar6003_cfg_syncup_v2.patch. > > Signed-off-by: Samuel Chang <samu...@qca.qualcomm.com> Acked-by: Samuel Ortiz <sa...@linux.intel.com> Kristen, would you mind pushing that one (i.e. ar6003_cfg80211_rssi_signal_fix.patch) forward ? Cheers, Samuel. > diff -ruN > kernel-2.6.37.6-24.3_cfg80211_fix_patch_1/drivers/staging/ar6003/os/linux/cfg80211.c > > kernel-2.6.37.6-24.3_cfg80211_rssi_patch_1.1/drivers/staging/ar6003/os/linux/cfg80211.c > --- > kernel-2.6.37.6-24.3_cfg80211_fix_patch_1/drivers/staging/ar6003/os/linux/cfg80211.c > 2011-06-29 11:09:42.519414000 +0800 > +++ > kernel-2.6.37.6-24.3_cfg80211_rssi_patch_1.1/drivers/staging/ar6003/os/linux/cfg80211.c > 2011-07-06 14:58:11.257184423 +0800 > @@ -804,7 +804,7 @@ > > freq = cie->ie_chan; > channel = ieee80211_get_channel(wiphy, freq); > - signal = ni->ni_snr * 100; > + signal = ni->ni_snr * 100 - 9500; > > AR_DEBUG_PRINTF(ATH_DEBUG_INFO, > ("%s: bssid %02x:%02x:%02x:%02x:%02x:%02x channel > %d freq %d size %d\n", > diff -ruN kernel-2.6.37.6-92.2/drivers/staging/ar6003/include/common/wmi.h > kernel-2.6.37.6-92.2_cfg80211_fix_patch/drivers/staging/ar6003/include/common/wmi.h > --- kernel-2.6.37.6-92.2/drivers/staging/ar6003/include/common/wmi.h > 2011-06-15 02:06:12.863498128 +0800 > +++ > kernel-2.6.37.6-92.2_cfg80211_fix_patch/drivers/staging/ar6003/include/common/wmi.h > 2011-06-29 08:31:52.440455388 +0800 > @@ -552,6 +552,11 @@ > LEAP_AUTH = 0x04, /* different from IEEE_AUTH_MODE > definitions */ > } DOT11_AUTH_MODE; > > +enum { > + AUTH_IDLE, > + AUTH_OPEN_IN_PROGRESS, > +}; > + > typedef enum { > NONE_AUTH = 0x01, > WPA_AUTH = 0x02, > diff -ruN kernel-2.6.37.6-92.2/drivers/staging/ar6003/os/linux/ar6000_drv.c > kernel-2.6.37.6-92.2_cfg80211_fix_patch/drivers/staging/ar6003/os/linux/ar6000_drv.c > --- kernel-2.6.37.6-92.2/drivers/staging/ar6003/os/linux/ar6000_drv.c > 2011-06-15 02:06:12.859498118 +0800 > +++ > kernel-2.6.37.6-92.2_cfg80211_fix_patch/drivers/staging/ar6003/os/linux/ar6000_drv.c > 2011-06-29 09:34:20.847042734 +0800 > @@ -1946,6 +1946,8 @@ > SET_NETDEV_DEV(dev, wiphy_dev(wdev->wiphy)); > wdev->netdev = dev; > arPriv->arNetworkType = INFRA_NETWORK; > + ar->smeState = SME_DISCONNECTED; > + arPriv->arAutoAuthStage = AUTH_IDLE; > #endif /* ATH6K_CONFIG_CFG80211 */ > > #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) diff -ruN > kernel-2.6.37.6-92.2/drivers/staging/ar6003/os/linux/cfg80211.c > kernel-2.6.37.6-92.2_cfg80211_fix_patch/drivers/staging/ar6003/os/linux/cfg80211.c > --- kernel-2.6.37.6-92.2/drivers/staging/ar6003/os/linux/cfg80211.c > 2011-06-28 20:57:34.000000000 +0800 > +++ > kernel-2.6.37.6-92.2_cfg80211_fix_patch/drivers/staging/ar6003/os/linux/cfg80211.c > 2011-06-29 11:09:42.519414972 +0800 > @@ -169,6 +169,10 @@ > case NL80211_AUTHTYPE_NETWORK_EAP: > arPriv->arDot11AuthMode = LEAP_AUTH; > break; > + case NL80211_AUTHTYPE_AUTOMATIC: > + arPriv->arDot11AuthMode = OPEN_AUTH; > + arPriv->arAutoAuthStage = AUTH_OPEN_IN_PROGRESS; > + break; > default: > arPriv->arDot11AuthMode = OPEN_AUTH; > AR_DEBUG_PRINTF(ATH_DEBUG_INFO, @@ -249,6 +253,7 @@ > unsigned char *ie = sme->ie; > > AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: \n", __func__)); > + ar->smeState = SME_CONNECTING; > > if(ar->arWmiReady == FALSE) { > AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wmi not ready yet\n", > __func__)); @@ -302,12 +307,6 @@ > return -EINTR; > } > } > - up(&arPriv->arPrivSem); > - > - if(down_interruptible(&arPriv->arPrivSem)) { > - AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: busy, couldn't get access\n", > __func__)); > - return -ERESTARTSYS; > - } > > if(arPriv->arConnected == TRUE && > arPriv->arSsidLen == sme->ssid_len && @@ -316,7 +315,9 @@ > status = wmi_reconnect_cmd(arPriv->arWmi, > arSta->arReqBssid, > arPriv->arChannelHint); > - > + > + up(&arPriv->arPrivSem); > + > if (status != A_OK) { > AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: wmi_reconnect_cmd > failed\n", __func__)); > return -EIO; > @@ -461,6 +462,7 @@ > unsigned char *ptr_ie_buf = ie_buf; > unsigned char *ieeemgmtbuf = NULL; > A_UINT8 source_mac[ATH_MAC_LEN]; > + AR_SOFTC_T *ar = arPriv->arSoftc; > > A_UINT8 assocReqIeOffset = sizeof(A_UINT16) + /* capinfo*/ > sizeof(A_UINT16); /* listen interval */ > @@ -474,6 +476,7 @@ > > assocReqLen -= assocReqIeOffset; > assocRespLen -= assocRespIeOffset; > + arPriv->arAutoAuthStage = AUTH_IDLE; > > if((ADHOC_NETWORK & networkType)) { > if(NL80211_IFTYPE_ADHOC != arPriv->wdev->iftype) { @@ -502,7 > +505,15 @@ > ((ADHOC_NETWORK & networkType) ? > WLAN_CAPABILITY_IBSS : WLAN_CAPABILITY_ESS), > ((ADHOC_NETWORK & networkType) ? > WLAN_CAPABILITY_IBSS : WLAN_CAPABILITY_ESS)); > > - if(!bss) { > + /* > + * Earlier we were updating the cfg about bss by making a beacon frame > + * only if the entry for bss is not there. This can have some issue if > + * ROAM event is generated and a heavy traffic is ongoing. The ROAM > + * event is handled through a work queue and by the time it really gets > + * handled, BSS would have been aged out. So it is better to update the > + * cfg about BSS irrespective of its entry being present right now or > + * not. > + */ > if (ADHOC_NETWORK & networkType) { > /* construct 802.11 mgmt beacon */ > if(ptr_ie_buf) { > @@ -543,6 +554,7 @@ > if(!ieeemgmtbuf) { > AR_DEBUG_PRINTF(ATH_DEBUG_ERR, > ("%s: ieeeMgmtbuf alloc error\n", > __func__)); > + cfg80211_put_bss(bss); > return; > } > > @@ -572,7 +584,6 @@ > signal, GFP_ATOMIC); > A_FREE(ieeemgmtbuf); > cfg80211_put_bss(bss); > - } > > if((ADHOC_NETWORK & networkType)) { > cfg80211_ibss_joined(arPriv->arNetDev, bssid, GFP_ATOMIC); @@ > -581,6 +592,7 @@ > > if (FALSE == arPriv->arConnected) { > /* inform connect result to cfg80211 */ > + ar->smeState = SME_DISCONNECTED; > cfg80211_connect_result(arPriv->arNetDev, bssid, > assocReqIe, assocReqLen, > assocRespIe, assocRespLen, @@ -642,6 > +654,14 @@ > A_UINT8 *bssid, A_UINT8 assocRespLen, > A_UINT8 *assocInfo, A_UINT16 > protocolReasonStatus) { > + A_UINT16 status; > + AR_SOFTC_STA_T *arSta = &arPriv->arSta; > + AR_SOFTC_T *ar = (AR_SOFTC_T *)arPriv->arSoftc; > + > + if (arPriv->scan_request) { > + cfg80211_scan_done(arPriv->scan_request, true); > + arPriv->scan_request = NULL; > + } > > AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: reason=%u\n", __func__, > reason)); > > @@ -664,18 +684,74 @@ > } > } > > - if(FALSE == arPriv->arConnected) { > + if(true == arSta->arConnectPending) { > if(NO_NETWORK_AVAIL == reason) { > /* connect cmd failed */ > - cfg80211_connect_result(arPriv->arNetDev, bssid, > - NULL, 0, > - NULL, 0, > - WLAN_STATUS_UNSPECIFIED_FAILURE, > - GFP_ATOMIC); > - } > + wmi_disconnect_cmd(arPriv->arWmi); > + } else if (reason == DISCONNECT_CMD) { > + if (arPriv->arAutoAuthStage) { > + /* > + * If the current auth algorithm is open try shared > + * and make autoAuthStage idle. We do not make it > + * leap for now being. > + */ > + if (arPriv->arDot11AuthMode == OPEN_AUTH) { > + struct ar_key *key = NULL; > + key = &arPriv->keys[arPriv->arDefTxKeyIndex]; > + if (down_interruptible(&ar->arSem)) { > + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: > busy, couldn't get access\n", __func__)); > + return; > + } > + > + arPriv->arDot11AuthMode = SHARED_AUTH; > + arPriv->arAutoAuthStage = AUTH_IDLE; > + > + wmi_addKey_cmd(arPriv->arWmi, > arPriv->arDefTxKeyIndex, > + arPriv->arPairwiseCrypto, > + GROUP_USAGE | TX_USAGE, > + key->key_len, > + NULL, > + key->key, KEY_OP_INIT_VAL, NULL, > + NO_SYNC_WMIFLAG); > + > + status = wmi_connect_cmd(arPriv->arWmi, > + arPriv->arNetworkType, > + > arPriv->arDot11AuthMode, > + arPriv->arAuthMode, > + > arPriv->arPairwiseCrypto, > + > arPriv->arPairwiseCryptoLen, > + arPriv->arGroupCrypto, > + > arPriv->arGroupCryptoLen, > + arPriv->arSsidLen, > + arPriv->arSsid, > + arSta->arReqBssid, > + arPriv->arChannelHint, > + > arSta->arConnectCtrlFlags); > + up(&ar->arSem); > + > + } else if (arPriv->arDot11AuthMode == SHARED_AUTH) { > + /* should not reach here */ > + } > + } else { > + arSta->arConnectPending = false; > + if (ar->smeState == SME_CONNECTING) { > + cfg80211_connect_result(arPriv->arNetDev, bssid, > + NULL, 0, > + NULL, 0, > + > WLAN_STATUS_UNSPECIFIED_FAILURE, > + GFP_ATOMIC); > + } else { > + cfg80211_disconnected(arPriv->arNetDev, > + reason, > + NULL, 0, > + GFP_ATOMIC); > + } > + ar->smeState = SME_DISCONNECTED; > + } > + } > } else { > - /* connection loss due to disconnect cmd or low rssi */ > - cfg80211_disconnected(arPriv->arNetDev, reason, NULL, 0, GFP_ATOMIC); > + if (reason != DISCONNECT_CMD) > + wmi_disconnect_cmd(arPriv->arWmi); > } > } > > @@ -812,10 +888,11 @@ > if(arPriv->scan_request) > { > /* Translate data to cfg80211 mgmt format */ > + if (arPriv->arWmi) > wmi_iterate_nodes(arPriv->arWmi, ar6k_cfg80211_scan_node, > arPriv->wdev->wiphy); > > - cfg80211_scan_done(arPriv->scan_request, > - (status & A_ECANCELED) ? true : false); > + cfg80211_scan_done(arPriv->scan_request, > + ((status & A_ECANCELED) || (status & A_EBUSY)) ? true : > +false); > > if(arPriv->scan_request->n_ssids && > arPriv->scan_request->ssids[0].ssid_len) { @@ -1026,6 > +1103,7 @@ > AR_SOFTC_T *ar = arPriv->arSoftc; > struct ar_key *key = NULL; > A_STATUS status = A_OK; > + u8 key_usage; > > AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: index %d\n", __func__, > key_index)); > > @@ -1052,17 +1130,20 @@ > return -EINVAL; > } > > - if (arPriv->arAuthMode < WPA_AUTH) { > - arPriv->arDefTxKeyIndex = key_index; > - key = &arPriv->keys[arPriv->arDefTxKeyIndex]; > - status = wmi_addKey_cmd(arPriv->arWmi, arPriv->arDefTxKeyIndex, > - arPriv->arPairwiseCrypto, GROUP_USAGE | TX_USAGE, > + key_usage = GROUP_USAGE; > + if (WEP_CRYPT == arPriv->arPairwiseCrypto) { > + key_usage |= TX_USAGE; > + } > + > + arPriv->arDefTxKeyIndex = key_index; > + key = &arPriv->keys[arPriv->arDefTxKeyIndex]; > + status = wmi_addKey_cmd(arPriv->arWmi, arPriv->arDefTxKeyIndex, > + arPriv->arPairwiseCrypto, key_usage, > key->key_len, key->seq, key->key, > KEY_OP_INIT_VAL, > NULL, SYNC_BOTH_WMIFLAG); > - if (status != A_OK) { > - return -EIO; > - } > - } > + if (status != A_OK) { > + return -EIO; > + } > return 0; > } > > @@ -1469,6 +1550,152 @@ > WLAN_CIPHER_SUITE_CCMP, > }; > > +bool is_rate_legacy(s32 rate) > +{ > + static const s32 legacy[] = { 1000, 2000, 5500, 11000, > + 6000, 9000, 12000, 18000, 24000, > + 36000, 48000, 54000 }; > + u8 i; > + > + for (i = 0; i < ARRAY_SIZE(legacy); i++) { > + if (rate == legacy[i]) > + return true; > + } > + > + return false; > +} > + > +bool is_rate_ht20(s32 rate, u8 *mcs, bool *sgi) { > + static const s32 ht20[] = { 6500, 13000, 19500, 26000, 39000, > + 52000, 58500, 65000, 72200 }; > + u8 i; > + > + for (i = 0; i < ARRAY_SIZE(ht20); i++) { > + if (rate == ht20[i]) { > + if (i == ARRAY_SIZE(ht20) - 1) > + /* last rate uses sgi */ > + *sgi = true; > + else > + *sgi = false; > + > + *mcs = i; > + return true; > + } > + } > + return false; > +} > + > +bool is_rate_ht40(s32 rate, u8 *mcs, bool *sgi) { > + static const s32 ht40[] = { 13500, 27000, 40500, 54000, > + 81000, 108000, 121500, 135000, > + 150000 }; > + u8 i; > + > + for (i = 0; i < ARRAY_SIZE(ht40); i++) { > + if (rate == ht40[i]) { > + if (i == ARRAY_SIZE(ht40) - 1) > + /* last rate uses sgi */ > + *sgi = true; > + else > + *sgi = false; > + > + *mcs = i; > + return true; > + } > + } > + > + return false; > +} > + > +static int ar6k_get_station(struct wiphy *wiphy, struct net_device *dev, > + u8 *mac, struct station_info *sinfo) { > + AR_SOFTC_DEV_T *arPriv = (AR_SOFTC_DEV_T *)ar6k_priv(dev); > + AR_SOFTC_T *ar = arPriv->arSoftc; > + long left; > + bool sgi; > + s32 rate; > + int ret; > + u8 mcs; > + > + if (memcmp(mac, arPriv->arBssid, ETH_ALEN) != 0) > + return -ENOENT; > + > + if (down_interruptible(&ar->arSem)) > + return -EBUSY; > + > + arPriv->statsUpdatePending = true; > + > + ret = wmi_get_stats_cmd(arPriv->arWmi); > + > + if (ret != 0) { > + up(&ar->arSem); > + return -EIO; > + } > + > + left = wait_event_interruptible_timeout(arPriv->arEvent, > + arPriv->statsUpdatePending == > false, > + wmitimeout * HZ); > + > + up(&ar->arSem); > + > + if (left == 0) > + return -ETIMEDOUT; > + else if (left < 0) > + return left; > + > + if (arPriv->arTargetStats.rx_bytes) { > + sinfo->rx_bytes = arPriv->arTargetStats.rx_bytes; > + sinfo->filled |= STATION_INFO_RX_BYTES; > + sinfo->rx_packets = arPriv->arTargetStats.rx_packets; > + sinfo->filled |= STATION_INFO_RX_PACKETS; > + } > + > + if (arPriv->arTargetStats.tx_bytes) { > + sinfo->tx_bytes = arPriv->arTargetStats.tx_bytes; > + sinfo->filled |= STATION_INFO_TX_BYTES; > + sinfo->tx_packets = arPriv->arTargetStats.tx_packets; > + sinfo->filled |= STATION_INFO_TX_PACKETS; > + } > + > + sinfo->signal = arPriv->arTargetStats.cs_rssi; > + sinfo->filled |= STATION_INFO_SIGNAL; > + > + rate = arPriv->arTargetStats.tx_unicast_rate; > + > + if (is_rate_legacy(rate)) { > + sinfo->txrate.legacy = rate / 100; > + } else if (is_rate_ht20(rate, &mcs, &sgi)) { > + if (sgi) { > + sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI; > + sinfo->txrate.mcs = mcs - 1; > + } else { > + sinfo->txrate.mcs = mcs; > + } > + > + sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS; > + } else if (is_rate_ht40(rate, &mcs, &sgi)) { > + if (sgi) { > + sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI; > + sinfo->txrate.mcs = mcs - 1; > + } else { > + sinfo->txrate.mcs = mcs; > + } > + > + sinfo->txrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH; > + sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS; > + } else { > + WARN(1, "invalid rate: %d", rate); > + return 0; > + } > + > + sinfo->filled |= STATION_INFO_TX_BITRATE; > + > + return 0; > +} > + > static struct > cfg80211_ops ar6k_cfg80211_ops = { > .change_virtual_intf = ar6k_cfg80211_change_iface, @@ -1489,6 > +1716,7 @@ > .set_power_mgmt = ar6k_cfg80211_set_power_mgmt, > .join_ibss = ar6k_cfg80211_join_ibss, > .leave_ibss = ar6k_cfg80211_leave_ibss, > + .get_station = ar6k_get_station, > }; > > struct wireless_dev * > diff -ruN > kernel-2.6.37.6-92.2/drivers/staging/ar6003/os/linux/include/ar6000_drv.h > kernel-2.6.37.6-92.2_cfg80211_fix_patch/drivers/staging/ar6003/os/linux/include/ar6000_drv.h > --- kernel-2.6.37.6-92.2/drivers/staging/ar6003/os/linux/include/ar6000_drv.h > 2011-06-15 02:06:12.863498128 +0800 > +++ > kernel-2.6.37.6-92.2_cfg80211_fix_patch/drivers/staging/ar6003/os/linux/include/ar6000_drv.h > 2011-06-29 08:32:44.112711621 +0800 > @@ -427,6 +427,13 @@ > A_UINT8 seq_len; > A_UINT32 cipher; > }; > + > +enum { > + SME_DISCONNECTED, > + SME_CONNECTING, > + SME_CONNECTED > +}; > + > #endif /* ATH6K_CONFIG_CFG80211 */ > > > @@ -574,6 +581,7 @@ > A_UINT8 rxMetaVersion; > A_INT32 (*exitCallback)(void *config); /* generic > callback at AR6K exit */ > HIF_DEVICE_OS_DEVICE_INFO osDevInfo; > + A_UINT32 smeState; > A_UINT16 arWlanPowerState; > A_BOOL arPlatPowerOff; > USER_RSSI_CPENSATION rssi_compensation_param; > @@ -729,6 +737,7 @@ > AR_SOFTC_T *arSoftc; > A_UINT8 arHoldConnection; > A_UINT8 num_sta; > + A_UINT8 arAutoAuthStage; > }AR_SOFTC_DEV_T; > > #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) > > Subject: Correct the cfg80211 bss signal strenth format > > Signed-off-by: Samuel Chang <samu...@qca.qualcomm.com> > > diff -ruN > kernel-2.6.37.6-24.3_cfg80211_fix_patch_1/drivers/staging/ar6003/os/linux/cfg80211.c > > kernel-2.6.37.6-24.3_cfg80211_rssi_patch_1.1/drivers/staging/ar6003/os/linux/cfg80211.c > --- > kernel-2.6.37.6-24.3_cfg80211_fix_patch_1/drivers/staging/ar6003/os/linux/cfg80211.c > 2011-06-29 11:09:42.519414000 +0800 > +++ > kernel-2.6.37.6-24.3_cfg80211_rssi_patch_1.1/drivers/staging/ar6003/os/linux/cfg80211.c > 2011-07-06 14:58:11.257184423 +0800 > @@ -804,7 +804,7 @@ > > freq = cie->ie_chan; > channel = ieee80211_get_channel(wiphy, freq); > - signal = ni->ni_snr * 100; > + signal = ni->ni_snr * 100 - 9500; > > AR_DEBUG_PRINTF(ATH_DEBUG_INFO, > ("%s: bssid %02x:%02x:%02x:%02x:%02x:%02x channel > %d freq %d size %d\n", -- Intel Open Source Technology Centre http://oss.intel.com/ _______________________________________________ MeeGo-kernel mailing list MeeGo-kernel@lists.meego.com http://lists.meego.com/listinfo/meego-kernel