rtllib_softmac_wx.c revision 65a4378471510787e080188f933913315f1afa0c
1ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman/* IEEE 802.11 SoftMAC layer 2ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman * Copyright (c) 2005 Andrea Merello <andreamrl@tiscali.it> 3ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman * 4ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman * Mostly extracted from the rtl8180-sa2400 driver for the 5ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman * in-kernel generic ieee802.11 stack. 6ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman * 7ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman * Some pieces of code might be stolen from ipw2100 driver 8ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman * copyright of who own it's copyright ;-) 9ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman * 10ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman * PS wx handler mostly stolen from hostap, copyright who 11ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman * own it's copyright ;-) 12ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman * 13ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman * released under the GPL 14ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman */ 15ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 16ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 17ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#include "ieee80211.h" 18ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#ifdef ENABLE_DOT11D 19ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#include "dot11d.h" 20ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#endif 21ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman/* FIXME: add A freqs */ 22ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 23ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanconst long ieee80211_wlan_frequencies[] = { 24ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 2412, 2417, 2422, 2427, 25ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 2432, 2437, 2442, 2447, 26ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 2452, 2457, 2462, 2467, 27ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 2472, 2484 28ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman}; 29ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 30ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 31ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanint ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, 32ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *b) 33ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 34ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int ret; 35ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_freq *fwrq = & wrqu->freq; 36ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 37ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 38ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 39ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if(ieee->iw_mode == IW_MODE_INFRA){ 40ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -EOPNOTSUPP; 41ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 42ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 43ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 44ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* if setting by freq convert to channel */ 45ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (fwrq->e == 1) { 46ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if ((fwrq->m >= (int) 2.412e8 && 47ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman fwrq->m <= (int) 2.487e8)) { 48ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int f = fwrq->m / 100000; 49ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int c = 0; 50ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 51ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman while ((c < 14) && (f != ieee80211_wlan_frequencies[c])) 52ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman c++; 53ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 54ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* hack to fall through */ 55ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman fwrq->e = 0; 56ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman fwrq->m = c + 1; 57ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 58ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 59ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 60ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ 61ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -EOPNOTSUPP; 62ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 63ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 64ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman }else { /* Set the channel */ 65ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 66ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#ifdef ENABLE_DOT11D 67ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (!(GET_DOT11D_INFO(ieee)->channel_map)[fwrq->m]) { 68ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -EINVAL; 69ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 70ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 71ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#endif 72ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->current_network.channel = fwrq->m; 73ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->set_chan(ieee->dev, ieee->current_network.channel); 74ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 75ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) 76ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if(ieee->state == IEEE80211_LINKED){ 77ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 78ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee80211_stop_send_beacons(ieee); 79ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee80211_start_send_beacons(ieee); 80ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 81ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 82ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 83ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = 0; 84ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanout: 85ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 86ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return ret; 87ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 88ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 89ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 90ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanint ieee80211_wx_get_freq(struct ieee80211_device *ieee, 91ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *a, 92ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *b) 93ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 94ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_freq *fwrq = & wrqu->freq; 95ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 96ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->current_network.channel == 0) 97ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return -1; 98ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman //NM 0.7.0 will not accept channel any more. 99ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman fwrq->m = ieee80211_wlan_frequencies[ieee->current_network.channel-1] * 100000; 100ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman fwrq->e = 1; 101ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman// fwrq->m = ieee->current_network.channel; 102ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman// fwrq->e = 0; 103ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 104ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 105ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 106ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 107ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanint ieee80211_wx_get_wap(struct ieee80211_device *ieee, 108ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 109ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 110ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 111ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman unsigned long flags; 112ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->ap_addr.sa_family = ARPHRD_ETHER; 113ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 114ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->iw_mode == IW_MODE_MONITOR) 115ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return -1; 116ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 117ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* We want avoid to give to the user inconsistent infos*/ 118ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_lock_irqsave(&ieee->lock, flags); 119ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 120ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->state != IEEE80211_LINKED && 121ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->state != IEEE80211_LINKED_SCANNING && 122ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->wap_set == 0) 123ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 124ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); 125ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else 126ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman memcpy(wrqu->ap_addr.sa_data, 127ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->current_network.bssid, ETH_ALEN); 128ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 129ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_unlock_irqrestore(&ieee->lock, flags); 130ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 131ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 132ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 133ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 134ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 135ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanint ieee80211_wx_set_wap(struct ieee80211_device *ieee, 136ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 137ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *awrq, 138ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman char *extra) 139ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 140ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 141ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int ret = 0; 142ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman u8 zero[] = {0,0,0,0,0,0}; 143ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman unsigned long flags; 144ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 145ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman short ifup = ieee->proto_started;//dev->flags & IFF_UP; 146ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct sockaddr *temp = (struct sockaddr *)awrq; 147ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 148ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->sync_scan_hurryup = 1; 149ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 150ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 151ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* use ifconfig hw ether */ 152ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->iw_mode == IW_MODE_MASTER){ 153ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -1; 154ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 155ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 156ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 157ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (temp->sa_family != ARPHRD_ETHER){ 158ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -EINVAL; 159ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 160ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 161ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 162ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ifup) 16365a4378471510787e080188f933913315f1afa0cdavid woo ieee80211_stop_protocol(ieee,true); 164ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 165ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* just to avoid to give inconsistent infos in the 166ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman * get wx method. not really needed otherwise 167ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman */ 168ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_lock_irqsave(&ieee->lock, flags); 169ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 170ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); 171ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->wap_set = memcmp(temp->sa_data, zero,ETH_ALEN)!=0; 172ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 173ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_unlock_irqrestore(&ieee->lock, flags); 174ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 175ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ifup) 176ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee80211_start_protocol(ieee); 177ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanout: 178ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 179ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return ret; 180ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 181ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 182ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) 183ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 184ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int len,ret = 0; 185ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman unsigned long flags; 186ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 187ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->iw_mode == IW_MODE_MONITOR) 188ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return -1; 189ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 190ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* We want avoid to give to the user inconsistent infos*/ 191ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_lock_irqsave(&ieee->lock, flags); 192ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 193ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->current_network.ssid[0] == '\0' || 194ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->current_network.ssid_len == 0){ 195ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -1; 196ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 197ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 198ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 199ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->state != IEEE80211_LINKED && 200ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->state != IEEE80211_LINKED_SCANNING && 201ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->ssid_set == 0){ 202ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -1; 203ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 204ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 205ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman len = ieee->current_network.ssid_len; 206ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->essid.length = len; 207ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman strncpy(b,ieee->current_network.ssid,len); 208ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->essid.flags = 1; 209ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 210ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanout: 211ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_unlock_irqrestore(&ieee->lock, flags); 212ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 213ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return ret; 214ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 215ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 216ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 217ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanint ieee80211_wx_set_rate(struct ieee80211_device *ieee, 218ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 219ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 220ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 221ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 222ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman u32 target_rate = wrqu->bitrate.value; 223ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 224ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->rate = target_rate/100000; 225ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman //FIXME: we might want to limit rate also in management protocols. 226ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 227ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 228ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 229ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 230ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 231ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanint ieee80211_wx_get_rate(struct ieee80211_device *ieee, 232ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 233ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 234ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 235ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman u32 tmp_rate; 236ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#if 0 237ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman printk("===>mode:%d, halfNmode:%d\n", ieee->mode, ieee->bHalfWirelessN24GMode); 238ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->mode & (IEEE_A | IEEE_B | IEEE_G)) 239ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman tmp_rate = ieee->rate; 240ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else if (ieee->mode & IEEE_N_5G) 241ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman tmp_rate = 580; 242ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else if (ieee->mode & IEEE_N_24G) 243ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman { 244ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->GetHalfNmodeSupportByAPsHandler(ieee->dev)) 245ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman tmp_rate = HTHalfMcsToDataRate(ieee, 15); 246ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else 247ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman tmp_rate = HTMcsToDataRate(ieee, 15); 248ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 249ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#else 250ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman tmp_rate = TxCountToDataRate(ieee, ieee->softmac_stats.CurrentShowTxate); 251ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 252ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#endif 253ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->bitrate.value = tmp_rate * 500000; 254ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 255ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 256ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 257ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 258ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 259ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanint ieee80211_wx_set_rts(struct ieee80211_device *ieee, 260ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 261ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 262ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 263ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (wrqu->rts.disabled || !wrqu->rts.fixed) 264ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->rts = DEFAULT_RTS_THRESHOLD; 265ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else 266ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman { 267ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (wrqu->rts.value < MIN_RTS_THRESHOLD || 268ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->rts.value > MAX_RTS_THRESHOLD) 269ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return -EINVAL; 270ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->rts = wrqu->rts.value; 271ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 272ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 273ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 274ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 275ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanint ieee80211_wx_get_rts(struct ieee80211_device *ieee, 276ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 277ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 278ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 279ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->rts.value = ieee->rts; 280ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->rts.fixed = 0; /* no auto select */ 281ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->rts.disabled = (wrqu->rts.value == DEFAULT_RTS_THRESHOLD); 282ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 283ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 284ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanint ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, 285ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *b) 286ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 287ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 288ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->sync_scan_hurryup = 1; 289ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 290ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 291ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 292ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (wrqu->mode == ieee->iw_mode) 293ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 294ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 295ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (wrqu->mode == IW_MODE_MONITOR){ 296ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 297ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->dev->type = ARPHRD_IEEE80211; 298ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman }else{ 299ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->dev->type = ARPHRD_ETHER; 300ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 301ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 302ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (!ieee->proto_started){ 303ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->iw_mode = wrqu->mode; 304ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman }else{ 30565a4378471510787e080188f933913315f1afa0cdavid woo ieee80211_stop_protocol(ieee,true); 306ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->iw_mode = wrqu->mode; 307ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee80211_start_protocol(ieee); 308ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 309ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 310ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanout: 311ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 312ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 313ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 314ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 315ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20) 316ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanvoid ieee80211_wx_sync_scan_wq(struct work_struct *work) 317ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 318ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wx_sync_scan_wq); 319ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#else 320ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanvoid ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee) 321ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 322ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#endif 323ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman short chan; 324ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman HT_EXTCHNL_OFFSET chan_offset=0; 325ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman HT_CHANNEL_WIDTH bandwidth=0; 326ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int b40M = 0; 327ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman static int count = 0; 328ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman chan = ieee->current_network.channel; 32965a4378471510787e080188f933913315f1afa0cdavid woo 33065a4378471510787e080188f933913315f1afa0cdavid woo#ifdef ENABLE_LPS 33165a4378471510787e080188f933913315f1afa0cdavid woo if (ieee->LeisurePSLeave) { 33265a4378471510787e080188f933913315f1afa0cdavid woo ieee->LeisurePSLeave(ieee->dev); 33365a4378471510787e080188f933913315f1afa0cdavid woo } 33465a4378471510787e080188f933913315f1afa0cdavid woo 33565a4378471510787e080188f933913315f1afa0cdavid woo /* notify AP to be in PS mode */ 33665a4378471510787e080188f933913315f1afa0cdavid woo ieee80211_sta_ps_send_null_frame(ieee, 1); 33765a4378471510787e080188f933913315f1afa0cdavid woo ieee80211_sta_ps_send_null_frame(ieee, 1); 33865a4378471510787e080188f933913315f1afa0cdavid woo#endif 33965a4378471510787e080188f933913315f1afa0cdavid woo 340ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman netif_carrier_off(ieee->dev); 341ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 342ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->data_hard_stop) 343ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->data_hard_stop(ieee->dev); 344ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 345ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee80211_stop_send_beacons(ieee); 346ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 347ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->state = IEEE80211_LINKED_SCANNING; 348ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->link_change(ieee->dev); 349ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->InitialGainHandler(ieee->dev,IG_Backup); 350ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->pHTInfo->bCurrentHTSupport && ieee->pHTInfo->bEnableHT && ieee->pHTInfo->bCurBW40MHz) { 351ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman b40M = 1; 352ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman chan_offset = ieee->pHTInfo->CurSTAExtChnlOffset; 353ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman bandwidth = (HT_CHANNEL_WIDTH)ieee->pHTInfo->bCurBW40MHz; 354ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman printk("Scan in 40M, force to 20M first:%d, %d\n", chan_offset, bandwidth); 355ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->SetBWModeHandler(ieee->dev, HT_CHANNEL_WIDTH_20, HT_EXTCHNL_OFFSET_NO_EXT); 356ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 357ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee80211_start_scan_syncro(ieee); 358ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (b40M) { 359ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman printk("Scan in 20M, back to 40M\n"); 360ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (chan_offset == HT_EXTCHNL_OFFSET_UPPER) 361ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->set_chan(ieee->dev, chan + 2); 362ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else if (chan_offset == HT_EXTCHNL_OFFSET_LOWER) 363ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->set_chan(ieee->dev, chan - 2); 364ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else 365ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->set_chan(ieee->dev, chan); 366ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->SetBWModeHandler(ieee->dev, bandwidth, chan_offset); 367ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } else { 368ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->set_chan(ieee->dev, chan); 369ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 370ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 371ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->InitialGainHandler(ieee->dev,IG_Restore); 372ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->state = IEEE80211_LINKED; 373ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->link_change(ieee->dev); 37465a4378471510787e080188f933913315f1afa0cdavid woo 37565a4378471510787e080188f933913315f1afa0cdavid woo#ifdef ENABLE_LPS 37665a4378471510787e080188f933913315f1afa0cdavid woo /* Notify AP that I wake up again */ 37765a4378471510787e080188f933913315f1afa0cdavid woo ieee80211_sta_ps_send_null_frame(ieee, 0); 37865a4378471510787e080188f933913315f1afa0cdavid woo#endif 37965a4378471510787e080188f933913315f1afa0cdavid woo 380ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman // To prevent the immediately calling watch_dog after scan. 381ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if(ieee->LinkDetectInfo.NumRecvBcnInPeriod==0||ieee->LinkDetectInfo.NumRecvDataInPeriod==0 ) 382ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman { 383ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->LinkDetectInfo.NumRecvBcnInPeriod = 1; 384ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->LinkDetectInfo.NumRecvDataInPeriod= 1; 385ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 386ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->data_hard_resume) 387ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->data_hard_resume(ieee->dev); 388ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 389ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) 390ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee80211_start_send_beacons(ieee); 391ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 392ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman netif_carrier_on(ieee->dev); 393ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman count = 0; 394ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 395ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 396ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 397ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 398ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanint ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, 399ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *b) 400ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 401ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int ret = 0; 402ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 403ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 404ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 405ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ 406ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -1; 407ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 408ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 409ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 410ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if ( ieee->state == IEEE80211_LINKED){ 411ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) 412ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman queue_work(ieee->wq, &ieee->wx_sync_scan_wq); 413ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#else 414ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman schedule_task(&ieee->wx_sync_scan_wq); 415ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#endif 416ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* intentionally forget to up sem */ 417ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 418ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 419ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 420ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanout: 421ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 422ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return ret; 423ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 424ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 425ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanint ieee80211_wx_set_essid(struct ieee80211_device *ieee, 426ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *a, 427ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 428ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 429ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 430ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int ret=0,len; 431ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman short proto_started; 432ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman unsigned long flags; 433ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 434ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->sync_scan_hurryup = 1; 435ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 436ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 437ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman proto_started = ieee->proto_started; 438ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 439ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (wrqu->essid.length > IW_ESSID_MAX_SIZE){ 440ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret= -E2BIG; 441ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 442ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 443ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 444ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->iw_mode == IW_MODE_MONITOR){ 445ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret= -1; 446ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 447ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 448ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 44965a4378471510787e080188f933913315f1afa0cdavid woo if(proto_started){ 45065a4378471510787e080188f933913315f1afa0cdavid woo ieee80211_stop_protocol(ieee,true); 45165a4378471510787e080188f933913315f1afa0cdavid woo } 452ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 453ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 454ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* this is just to be sure that the GET wx callback 455ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman * has consisten infos. not needed otherwise 456ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman */ 457ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_lock_irqsave(&ieee->lock, flags); 458ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 459ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (wrqu->essid.flags && wrqu->essid.length) { 460ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman //first flush current network.ssid 461ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman len = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE; 462ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) 463ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman strncpy(ieee->current_network.ssid, extra, len); 464ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->current_network.ssid_len = len; 465ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#if 0 466ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman { 467ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int i; 468ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman for (i=0; i<len; i++) 469ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman printk("%c ", extra[i]); 470ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman printk("\n"); 471ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 472ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#endif 473ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#else 474ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman strncpy(ieee->current_network.ssid, extra, len+1); 475ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->current_network.ssid_len = len+1; 476ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#if 0 477ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman { 478ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int i; 479ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman for (i=0; i<len + 1; i++) 480ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman printk("%c ", extra[i]); 481ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman printk("\n"); 482ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 483ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#endif 484ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#endif 485ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->ssid_set = 1; 486ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 487ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else{ 488ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->ssid_set = 0; 489ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->current_network.ssid[0] = '\0'; 490ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->current_network.ssid_len = 0; 491ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 492ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_unlock_irqrestore(&ieee->lock, flags); 493ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 494ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (proto_started) 495ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee80211_start_protocol(ieee); 496ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanout: 497ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 498ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return ret; 499ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 500ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 501ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, 502ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *b) 503ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 504ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 505ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->mode = ieee->iw_mode; 506ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 507ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 508ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 509ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, 510ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 511ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 512ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 513ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 514ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int *parms = (int *)extra; 515ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int enable = (parms[0] > 0); 516ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman short prev = ieee->raw_tx; 517ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 518ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 519ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 520ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if(enable) 521ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->raw_tx = 1; 522ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else 523ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->raw_tx = 0; 524ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 525ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman printk(KERN_INFO"raw TX is %s\n", 526ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->raw_tx ? "enabled" : "disabled"); 527ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 528ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if(ieee->iw_mode == IW_MODE_MONITOR) 529ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman { 530ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if(prev == 0 && ieee->raw_tx){ 531ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->data_hard_resume) 532ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->data_hard_resume(ieee->dev); 533ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 534ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman netif_carrier_on(ieee->dev); 535ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 536ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 537ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if(prev && ieee->raw_tx == 1) 538ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman netif_carrier_off(ieee->dev); 539ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 540ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 541ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 542ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 543ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 544ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 545ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 546ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanint ieee80211_wx_get_name(struct ieee80211_device *ieee, 547ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 548ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 549ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 550ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman strcpy(wrqu->name, "802.11"); 5513ef5a262ad0061d6147da7e3ee03aead7c160d91Greg Kroah-Hartman if(ieee->modulation & IEEE80211_CCK_MODULATION) 552ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman strcat(wrqu->name, "b"); 5533ef5a262ad0061d6147da7e3ee03aead7c160d91Greg Kroah-Hartman if(ieee->modulation & IEEE80211_OFDM_MODULATION) 554ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman strcat(wrqu->name, "g"); 555ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->mode & (IEEE_N_24G | IEEE_N_5G)) 5563ef5a262ad0061d6147da7e3ee03aead7c160d91Greg Kroah-Hartman strcat(wrqu->name, "n"); 557ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 558ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 559ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 560ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 561ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman/* this is mostly stolen from hostap */ 562ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanint ieee80211_wx_set_power(struct ieee80211_device *ieee, 563ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 564ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 565ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 566ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int ret = 0; 567ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#if 1 568ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if( 569ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman (!ieee->sta_wake_up) || 570ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman // (!ieee->ps_request_tx_ack) || 571ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman (!ieee->enter_sleep_state) || 572ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman (!ieee->ps_is_queue_empty)){ 573ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 574ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman // printk("ERROR. PS mode is tryied to be use but driver missed a callback\n\n"); 575ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 576ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return -1; 577ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 578ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#endif 579ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 580ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 581ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (wrqu->power.disabled){ 582ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->ps = IEEE80211_PS_DISABLED; 583ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto exit; 584ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 585ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (wrqu->power.flags & IW_POWER_TIMEOUT) { 586ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman //ieee->ps_period = wrqu->power.value / 1000; 587ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->ps_timeout = wrqu->power.value / 1000; 588ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 589ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 590ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (wrqu->power.flags & IW_POWER_PERIOD) { 591ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 592ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman //ieee->ps_timeout = wrqu->power.value / 1000; 593ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->ps_period = wrqu->power.value / 1000; 594ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman //wrq->value / 1024; 595ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 596ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 597ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman switch (wrqu->power.flags & IW_POWER_MODE) { 598ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman case IW_POWER_UNICAST_R: 599ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->ps = IEEE80211_PS_UNICAST; 600ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman break; 601ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman case IW_POWER_MULTICAST_R: 602ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->ps = IEEE80211_PS_MBCAST; 603ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman break; 604ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman case IW_POWER_ALL_R: 605ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; 606ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman break; 607ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 608ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman case IW_POWER_ON: 609ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman // ieee->ps = IEEE80211_PS_DISABLED; 610ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman break; 611ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 612ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman default: 613ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -EINVAL; 614ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto exit; 615ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 616ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 617ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanexit: 618ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 619ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return ret; 620ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 621ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 622ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 623ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman/* this is stolen from hostap */ 624ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanint ieee80211_wx_get_power(struct ieee80211_device *ieee, 625ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 626ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 627ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 628ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int ret =0; 629ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 630ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 631ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 632ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if(ieee->ps == IEEE80211_PS_DISABLED){ 633ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->power.disabled = 1; 634ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto exit; 635ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 636ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 637ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->power.disabled = 0; 638ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 639ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if ((wrqu->power.flags & IW_POWER_TYPE) == IW_POWER_TIMEOUT) { 640ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->power.flags = IW_POWER_TIMEOUT; 641ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->power.value = ieee->ps_timeout * 1000; 642ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } else { 643ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman// ret = -EOPNOTSUPP; 644ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman// goto exit; 645ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->power.flags = IW_POWER_PERIOD; 646ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->power.value = ieee->ps_period * 1000; 647ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman//ieee->current_network.dtim_period * ieee->current_network.beacon_interval * 1024; 648ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 649ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 650ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if ((ieee->ps & (IEEE80211_PS_MBCAST | IEEE80211_PS_UNICAST)) == (IEEE80211_PS_MBCAST | IEEE80211_PS_UNICAST)) 651ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->power.flags |= IW_POWER_ALL_R; 652ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else if (ieee->ps & IEEE80211_PS_MBCAST) 653ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->power.flags |= IW_POWER_MULTICAST_R; 654ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else 655ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->power.flags |= IW_POWER_UNICAST_R; 656ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 657ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanexit: 658ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 659ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return ret; 660ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 661ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 662ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) 663ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman//EXPORT_SYMBOL(ieee80211_wx_get_essid); 664ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman//EXPORT_SYMBOL(ieee80211_wx_set_essid); 665ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman//EXPORT_SYMBOL(ieee80211_wx_set_rate); 666ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman//EXPORT_SYMBOL(ieee80211_wx_get_rate); 667ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman//EXPORT_SYMBOL(ieee80211_wx_set_wap); 668ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman//EXPORT_SYMBOL(ieee80211_wx_get_wap); 669ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman//EXPORT_SYMBOL(ieee80211_wx_set_mode); 670ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman//EXPORT_SYMBOL(ieee80211_wx_get_mode); 671ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman//EXPORT_SYMBOL(ieee80211_wx_set_scan); 672ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman//EXPORT_SYMBOL(ieee80211_wx_get_freq); 673ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman//EXPORT_SYMBOL(ieee80211_wx_set_freq); 674ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman//EXPORT_SYMBOL(ieee80211_wx_set_rawtx); 675ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman//EXPORT_SYMBOL(ieee80211_wx_get_name); 676ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman//EXPORT_SYMBOL(ieee80211_wx_set_power); 677ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman//EXPORT_SYMBOL(ieee80211_wx_get_power); 678ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman//EXPORT_SYMBOL(ieee80211_wlan_frequencies); 679ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman//EXPORT_SYMBOL(ieee80211_wx_set_rts); 680ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman//EXPORT_SYMBOL(ieee80211_wx_get_rts); 681ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#else 682ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-HartmanEXPORT_SYMBOL_NOVERS(ieee80211_wx_get_essid); 683ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-HartmanEXPORT_SYMBOL_NOVERS(ieee80211_wx_set_essid); 684ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-HartmanEXPORT_SYMBOL_NOVERS(ieee80211_wx_set_rate); 685ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-HartmanEXPORT_SYMBOL_NOVERS(ieee80211_wx_get_rate); 686ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-HartmanEXPORT_SYMBOL_NOVERS(ieee80211_wx_set_wap); 687ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-HartmanEXPORT_SYMBOL_NOVERS(ieee80211_wx_get_wap); 688ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-HartmanEXPORT_SYMBOL_NOVERS(ieee80211_wx_set_mode); 689ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-HartmanEXPORT_SYMBOL_NOVERS(ieee80211_wx_get_mode); 690ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-HartmanEXPORT_SYMBOL_NOVERS(ieee80211_wx_set_scan); 691ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-HartmanEXPORT_SYMBOL_NOVERS(ieee80211_wx_get_freq); 692ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-HartmanEXPORT_SYMBOL_NOVERS(ieee80211_wx_set_freq); 693ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-HartmanEXPORT_SYMBOL_NOVERS(ieee80211_wx_set_rawtx); 694ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-HartmanEXPORT_SYMBOL_NOVERS(ieee80211_wx_get_name); 695ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-HartmanEXPORT_SYMBOL_NOVERS(ieee80211_wx_set_power); 696ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-HartmanEXPORT_SYMBOL_NOVERS(ieee80211_wx_get_power); 697ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-HartmanEXPORT_SYMBOL_NOVERS(ieee80211_wlan_frequencies); 698ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-HartmanEXPORT_SYMBOL_NOVERS(ieee80211_wx_set_rts); 699ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-HartmanEXPORT_SYMBOL_NOVERS(ieee80211_wx_get_rts); 700ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#endif 701