rtllib_softmac_wx.c revision 94a799425eee8225a1e3fbe5f473d2ef04002577
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 1794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "rtllib.h" 1894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "rtl_core.h" 19ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#ifdef ENABLE_DOT11D 20ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#include "dot11d.h" 21ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#endif 22ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman/* FIXME: add A freqs */ 23ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 2494a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerconst long rtllib_wlan_frequencies[] = { 25ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 2412, 2417, 2422, 2427, 26ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 2432, 2437, 2442, 2447, 27ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 2452, 2457, 2462, 2467, 28ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 2472, 2484 29ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman}; 30ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 31ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 3294a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_set_freq(struct rtllib_device *ieee, struct iw_request_info *a, 33ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *b) 34ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 35ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int ret; 36ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_freq *fwrq = & wrqu->freq; 37ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 38ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 39ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 4094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->iw_mode == IW_MODE_INFRA){ 4194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ret = 0; 42ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 43ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 44ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 45ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* if setting by freq convert to channel */ 46ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (fwrq->e == 1) { 47ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if ((fwrq->m >= (int) 2.412e8 && 48ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman fwrq->m <= (int) 2.487e8)) { 49ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int f = fwrq->m / 100000; 50ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int c = 0; 51ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 5294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger while ((c < 14) && (f != rtllib_wlan_frequencies[c])) 53ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman c++; 54ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 55ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* hack to fall through */ 56ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman fwrq->e = 0; 57ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman fwrq->m = c + 1; 58ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 59ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 60ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 61ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ 62ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -EOPNOTSUPP; 63ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 64ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 65ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman }else { /* Set the channel */ 66ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 67ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#ifdef ENABLE_DOT11D 6894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->active_channel_map[fwrq->m] != 1) { 69ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -EINVAL; 70ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 71ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 72ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#endif 73ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->current_network.channel = fwrq->m; 7494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->set_chan(ieee->dev, ieee->current_network.channel); 75ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 7694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) 7794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->state == RTLLIB_LINKED){ 78ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 7994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_stop_send_beacons(ieee); 8094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_start_send_beacons(ieee); 81ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 82ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 83ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 84ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = 0; 85ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanout: 86ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 87ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return ret; 88ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 89ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 90ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 9194a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_get_freq(struct rtllib_device *ieee, 92ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *a, 93ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *b) 94ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 95ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_freq *fwrq = & wrqu->freq; 96ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 97ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->current_network.channel == 0) 98ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return -1; 9994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger fwrq->m = rtllib_wlan_frequencies[ieee->current_network.channel-1] * 100000; 100ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman fwrq->e = 1; 101ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 102ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 103ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 10494a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_get_wap(struct rtllib_device *ieee, 105ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 106ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 107ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 108ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman unsigned long flags; 10994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 110ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->ap_addr.sa_family = ARPHRD_ETHER; 111ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 112ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->iw_mode == IW_MODE_MONITOR) 113ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return -1; 114ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 115ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* We want avoid to give to the user inconsistent infos*/ 116ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_lock_irqsave(&ieee->lock, flags); 117ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 11894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->state != RTLLIB_LINKED && 11994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->state != RTLLIB_LINKED_SCANNING && 120ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->wap_set == 0) 121ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 122ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); 123ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else 124ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman memcpy(wrqu->ap_addr.sa_data, 125ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->current_network.bssid, ETH_ALEN); 126ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 127ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_unlock_irqrestore(&ieee->lock, flags); 128ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 129ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 130ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 131ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 132ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 13394a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_set_wap(struct rtllib_device *ieee, 134ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 135ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *awrq, 136ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman char *extra) 137ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 138ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 139ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int ret = 0; 140ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman u8 zero[] = {0,0,0,0,0,0}; 141ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman unsigned long flags; 142ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 14394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger short ifup = ieee->proto_started; 144ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct sockaddr *temp = (struct sockaddr *)awrq; 145ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 14694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_stop_scan_syncro(ieee); 147ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 148ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 149ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* use ifconfig hw ether */ 150ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->iw_mode == IW_MODE_MASTER){ 151ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -1; 152ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 153ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 154ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 155ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (temp->sa_family != ARPHRD_ETHER){ 156ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -EINVAL; 157ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 158ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 159ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 16094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (memcmp(temp->sa_data, zero,ETH_ALEN) == 0){ 16194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger spin_lock_irqsave(&ieee->lock, flags); 16294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); 16394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->wap_set = 0; 16494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger spin_unlock_irqrestore(&ieee->lock, flags); 16594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ret = -1; 16694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger goto out; 16794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 16894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 16994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 170ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ifup) 17194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_stop_protocol(ieee,true); 172ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 173ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* just to avoid to give inconsistent infos in the 174ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman * get wx method. not really needed otherwise 175ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman */ 176ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_lock_irqsave(&ieee->lock, flags); 177ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 17894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->cannot_notify = false; 179ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); 18094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->wap_set = (memcmp(temp->sa_data, zero,ETH_ALEN)!=0); 181ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 182ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_unlock_irqrestore(&ieee->lock, flags); 183ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 184ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ifup) 18594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_start_protocol(ieee); 186ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanout: 187ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 188ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return ret; 189ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 190ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 19194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int rtllib_wx_get_essid(struct rtllib_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) 192ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 193ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int len,ret = 0; 194ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman unsigned long flags; 195ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 196ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->iw_mode == IW_MODE_MONITOR) 197ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return -1; 198ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 199ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* We want avoid to give to the user inconsistent infos*/ 200ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_lock_irqsave(&ieee->lock, flags); 201ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 202ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->current_network.ssid[0] == '\0' || 203ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->current_network.ssid_len == 0){ 204ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -1; 205ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 206ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 207ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 20894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->state != RTLLIB_LINKED && 20994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->state != RTLLIB_LINKED_SCANNING && 210ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->ssid_set == 0){ 211ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -1; 212ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 213ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 214ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman len = ieee->current_network.ssid_len; 215ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->essid.length = len; 216ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman strncpy(b,ieee->current_network.ssid,len); 217ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->essid.flags = 1; 218ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 219ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanout: 220ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_unlock_irqrestore(&ieee->lock, flags); 221ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 222ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return ret; 223ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 224ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 225ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 22694a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_set_rate(struct rtllib_device *ieee, 227ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 228ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 229ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 230ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 231ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman u32 target_rate = wrqu->bitrate.value; 232ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 233ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->rate = target_rate/100000; 234ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 235ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 236ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 23794a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_get_rate(struct rtllib_device *ieee, 238ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 239ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 240ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 24194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 tmp_rate = 0; 24294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#if defined RTL8192SU 24394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->mode & (IEEE_A | IEEE_B | IEEE_G)) 24494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger tmp_rate = ieee->rate; 24594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger else if (ieee->mode & IEEE_N_5G) 24694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger tmp_rate = 580; 24794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger else if (ieee->mode & IEEE_N_24G) { 24894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->GetHalfNmodeSupportByAPsHandler(ieee->dev)) 24994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger tmp_rate = HTHalfMcsToDataRate(ieee, 15); 25094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger else 25194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger tmp_rate = HTMcsToDataRate(ieee, 15); 25294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 25394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#elif defined RTL8192SE || defined RTL8192CE 25494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger tmp_rate = ieee->rtl_11n_user_show_rates(ieee->dev); 25594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#else 25694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger tmp_rate = TxCountToDataRate(ieee, ieee->softmac_stats.CurrentShowTxate); 25794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif 258ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->bitrate.value = tmp_rate * 500000; 259ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 260ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 261ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 262ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 263ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 26494a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_set_rts(struct rtllib_device *ieee, 265ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 266ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 267ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 268ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (wrqu->rts.disabled || !wrqu->rts.fixed) 269ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->rts = DEFAULT_RTS_THRESHOLD; 270ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else 271ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman { 272ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (wrqu->rts.value < MIN_RTS_THRESHOLD || 273ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->rts.value > MAX_RTS_THRESHOLD) 274ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return -EINVAL; 275ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->rts = wrqu->rts.value; 276ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 277ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 278ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 279ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 28094a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_get_rts(struct rtllib_device *ieee, 281ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 282ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 283ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 284ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->rts.value = ieee->rts; 285ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->rts.fixed = 0; /* no auto select */ 286ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->rts.disabled = (wrqu->rts.value == DEFAULT_RTS_THRESHOLD); 287ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 288ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 28994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 29094a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_set_mode(struct rtllib_device *ieee, struct iw_request_info *a, 291ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *b) 292ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 29394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int set_mode_status = 0; 294ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 29594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_stop_scan_syncro(ieee); 296ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 29794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger switch (wrqu->mode) { 29894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case IW_MODE_MONITOR: 29994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case IW_MODE_ADHOC: 30094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case IW_MODE_INFRA: 30194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 30294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case IW_MODE_AUTO: 30394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wrqu->mode = IW_MODE_INFRA; 30494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 30594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger default: 30694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger set_mode_status = -EINVAL; 30794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger goto out; 30894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 309ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 310ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (wrqu->mode == ieee->iw_mode) 311ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 312ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 31394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (wrqu->mode == IW_MODE_MONITOR) { 31494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#if defined(RTLLIB_RADIOTAP) && (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10)) 31594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->dev->type = ARPHRD_IEEE80211_RADIOTAP; 31694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#else 317ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->dev->type = ARPHRD_IEEE80211; 31894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif 31994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_EnableNetMonitorMode(ieee->dev,false); 32094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 32194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } else { 322ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->dev->type = ARPHRD_ETHER; 32394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->iw_mode == IW_MODE_MONITOR) 32494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_DisableNetMonitorMode(ieee->dev,false); 325ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 326ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 32794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (!ieee->proto_started) { 328ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->iw_mode = wrqu->mode; 32994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } else { 33094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_stop_protocol(ieee,true); 331ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->iw_mode = wrqu->mode; 33294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_start_protocol(ieee); 333ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 334ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 335ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanout: 336ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 33794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return set_mode_status; 338ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 339ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 34094a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid rtllib_wx_sync_scan_wq(void *data) 341ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 34294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct rtllib_device *ieee = container_of_work_rsl(data, struct rtllib_device, wx_sync_scan_wq); 343ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman short chan; 344ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman HT_EXTCHNL_OFFSET chan_offset=0; 345ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman HT_CHANNEL_WIDTH bandwidth=0; 346ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int b40M = 0; 347ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman static int count = 0; 34865a4378471510787e080188f933913315f1afa0cdavid woo 34994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (!(ieee->softmac_features & IEEE_SOFTMAC_SCAN)){ 35094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_start_scan_syncro(ieee, 0); 35194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger goto out; 35265a4378471510787e080188f933913315f1afa0cdavid woo } 35365a4378471510787e080188f933913315f1afa0cdavid woo 35494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger chan = ieee->current_network.channel; 35594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 35694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->LeisurePSLeave) 35794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->LeisurePSLeave(ieee->dev); 35865a4378471510787e080188f933913315f1afa0cdavid woo /* notify AP to be in PS mode */ 35994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_sta_ps_send_null_frame(ieee, 1); 36094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_sta_ps_send_null_frame(ieee, 1); 36194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 36294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_stop_all_queues(ieee); 36365a4378471510787e080188f933913315f1afa0cdavid woo 364ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->data_hard_stop) 36594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->data_hard_stop(ieee->dev); 36694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_stop_send_beacons(ieee); 36794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->state = RTLLIB_LINKED_SCANNING; 36894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->link_change(ieee->dev); 36994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger /* wait for ps packet to be kicked out successfully */ 37094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger msleep(50); 371ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 37294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->ScanOperationBackupHandler) 37394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->ScanOperationBackupHandler(ieee->dev,SCAN_OPT_BACKUP); 374ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 375ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->pHTInfo->bCurrentHTSupport && ieee->pHTInfo->bEnableHT && ieee->pHTInfo->bCurBW40MHz) { 376ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman b40M = 1; 377ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman chan_offset = ieee->pHTInfo->CurSTAExtChnlOffset; 378ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman bandwidth = (HT_CHANNEL_WIDTH)ieee->pHTInfo->bCurBW40MHz; 37994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger RT_TRACE(COMP_DBG, "Scan in 40M, force to 20M first:%d, %d\n", chan_offset, bandwidth); 38094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->SetBWModeHandler(ieee->dev, HT_CHANNEL_WIDTH_20, HT_EXTCHNL_OFFSET_NO_EXT); 381ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 38294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 38394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_start_scan_syncro(ieee, 0); 38494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 385ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (b40M) { 38694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger RT_TRACE(COMP_DBG, "Scan in 20M, back to 40M\n"); 387ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (chan_offset == HT_EXTCHNL_OFFSET_UPPER) 38894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->set_chan(ieee->dev, chan + 2); 389ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else if (chan_offset == HT_EXTCHNL_OFFSET_LOWER) 39094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->set_chan(ieee->dev, chan - 2); 391ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else 39294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->set_chan(ieee->dev, chan); 39394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->SetBWModeHandler(ieee->dev, bandwidth, chan_offset); 394ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } else { 39594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->set_chan(ieee->dev, chan); 396ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 397ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 39894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->ScanOperationBackupHandler) 39994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->ScanOperationBackupHandler(ieee->dev,SCAN_OPT_RESTORE); 40094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 40194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->state = RTLLIB_LINKED; 40294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->link_change(ieee->dev); 40365a4378471510787e080188f933913315f1afa0cdavid woo 40465a4378471510787e080188f933913315f1afa0cdavid woo /* Notify AP that I wake up again */ 40594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_sta_ps_send_null_frame(ieee, 0); 40665a4378471510787e080188f933913315f1afa0cdavid woo 40794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->LinkDetectInfo.NumRecvBcnInPeriod == 0 || 40894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->LinkDetectInfo.NumRecvDataInPeriod == 0 ) { 409ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->LinkDetectInfo.NumRecvBcnInPeriod = 1; 410ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->LinkDetectInfo.NumRecvDataInPeriod= 1; 411ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 41294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 413ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->data_hard_resume) 41494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->data_hard_resume(ieee->dev); 415ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 41694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) 41794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_start_send_beacons(ieee); 41894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 41994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_wake_all_queues(ieee); 420ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 421ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman count = 0; 42294a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerout: 423ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 424ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 425ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 426ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 42794a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_set_scan(struct rtllib_device *ieee, struct iw_request_info *a, 428ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *b) 429ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 430ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int ret = 0; 431ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 432ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 433ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 434ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ 435ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -1; 436ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 437ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 438ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 43994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if ( ieee->state == RTLLIB_LINKED){ 44094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger queue_work_rsl(ieee->wq, &ieee->wx_sync_scan_wq); 441ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* intentionally forget to up sem */ 442ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 443ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 444ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 445ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanout: 446ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 447ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return ret; 448ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 449ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 45094a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_set_essid(struct rtllib_device *ieee, 451ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *a, 452ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 453ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 454ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 45594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int ret=0,len,i; 456ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman short proto_started; 457ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman unsigned long flags; 458ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 45994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_stop_scan_syncro(ieee); 460ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 461ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 462ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman proto_started = ieee->proto_started; 463ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 46494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)) 46594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger len = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE; 46694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#else 46794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger len = (wrqu->essid.length < IW_ESSID_MAX_SIZE) ? wrqu->essid.length : IW_ESSID_MAX_SIZE; 46894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif 46994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 47094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (len > IW_ESSID_MAX_SIZE){ 471ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret= -E2BIG; 472ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 473ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 474ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 475ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->iw_mode == IW_MODE_MONITOR){ 476ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret= -1; 477ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 478ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 479ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 48094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger for (i=0; i<len; i++){ 48194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (extra[i] < 0){ 48294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ret= -1; 48394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger goto out; 48494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 48565a4378471510787e080188f933913315f1afa0cdavid woo } 486ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 48794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (proto_started) 48894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_stop_protocol(ieee,true); 48994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 490ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 491ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* this is just to be sure that the GET wx callback 492ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman * has consisten infos. not needed otherwise 493ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman */ 494ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_lock_irqsave(&ieee->lock, flags); 495ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 496ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (wrqu->essid.flags && wrqu->essid.length) { 49794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger strncpy(ieee->current_network.ssid, extra, len); 49894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->current_network.ssid_len = len; 49994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->cannot_notify = false; 500ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->ssid_set = 1; 501ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 502ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else{ 503ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->ssid_set = 0; 504ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->current_network.ssid[0] = '\0'; 505ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->current_network.ssid_len = 0; 506ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 507ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_unlock_irqrestore(&ieee->lock, flags); 508ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 509ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (proto_started) 51094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_start_protocol(ieee); 511ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanout: 512ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 513ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return ret; 514ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 515ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 51694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int rtllib_wx_get_mode(struct rtllib_device *ieee, struct iw_request_info *a, 517ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *b) 518ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 519ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->mode = ieee->iw_mode; 520ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 521ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 522ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 52394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int rtllib_wx_set_rawtx(struct rtllib_device *ieee, 524ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 525ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 526ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 527ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 528ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int *parms = (int *)extra; 529ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int enable = (parms[0] > 0); 530ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman short prev = ieee->raw_tx; 531ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 532ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 533ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 53494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (enable) 535ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->raw_tx = 1; 536ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else 537ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->raw_tx = 0; 538ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 539ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman printk(KERN_INFO"raw TX is %s\n", 540ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->raw_tx ? "enabled" : "disabled"); 541ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 54294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->iw_mode == IW_MODE_MONITOR) 543ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman { 54494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (prev == 0 && ieee->raw_tx){ 545ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->data_hard_resume) 54694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->data_hard_resume(ieee->dev); 547ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 548ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman netif_carrier_on(ieee->dev); 549ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 550ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 55194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (prev && ieee->raw_tx == 1) 552ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman netif_carrier_off(ieee->dev); 553ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 554ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 555ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 556ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 557ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 558ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 559ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 56094a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_get_name(struct rtllib_device *ieee, 561ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 562ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 563ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 564ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman strcpy(wrqu->name, "802.11"); 56594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 56694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->modulation & RTLLIB_CCK_MODULATION) 567ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman strcat(wrqu->name, "b"); 56894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->modulation & RTLLIB_OFDM_MODULATION) 569ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman strcat(wrqu->name, "g"); 570ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->mode & (IEEE_N_24G | IEEE_N_5G)) 5713ef5a262ad0061d6147da7e3ee03aead7c160d91Greg Kroah-Hartman strcat(wrqu->name, "n"); 572ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 573ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 574ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 575ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 576ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman/* this is mostly stolen from hostap */ 57794a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_set_power(struct rtllib_device *ieee, 578ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 579ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 580ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 581ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int ret = 0; 58294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#if 1 58394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if ( 584ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman (!ieee->sta_wake_up) || 585ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman (!ieee->enter_sleep_state) || 586ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman (!ieee->ps_is_queue_empty)){ 587ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 58894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger RTLLIB_DEBUG(RTLLIB_DL_ERR,"%s(): PS mode is tryied to be use but driver missed a callback\n\n",__func__); 58994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 590ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return -1; 591ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 59294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif 593ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 594ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 595ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (wrqu->power.disabled){ 59694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger RT_TRACE(COMP_DBG, "===>%s(): power disable\n",__func__); 59794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->ps = RTLLIB_PS_DISABLED; 598ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto exit; 599ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 600ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (wrqu->power.flags & IW_POWER_TIMEOUT) { 601ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->ps_timeout = wrqu->power.value / 1000; 60294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger RT_TRACE(COMP_DBG, "===>%s():ps_timeout is %d\n",__func__,ieee->ps_timeout); 603ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 604ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 605ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (wrqu->power.flags & IW_POWER_PERIOD) { 60694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 607ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->ps_period = wrqu->power.value / 1000; 60894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 609ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 610ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman switch (wrqu->power.flags & IW_POWER_MODE) { 611ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman case IW_POWER_UNICAST_R: 61294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->ps = RTLLIB_PS_UNICAST; 613ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman break; 614ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman case IW_POWER_MULTICAST_R: 61594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->ps = RTLLIB_PS_MBCAST; 616ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman break; 617ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman case IW_POWER_ALL_R: 61894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->ps = RTLLIB_PS_UNICAST | RTLLIB_PS_MBCAST; 619ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman break; 620ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 621ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman case IW_POWER_ON: 622ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman break; 623ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 624ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman default: 625ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -EINVAL; 626ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto exit; 627ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 628ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 629ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanexit: 630ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 631ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return ret; 632ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 633ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 634ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 635ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman/* this is stolen from hostap */ 63694a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_get_power(struct rtllib_device *ieee, 637ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 638ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 639ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 640ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int ret =0; 641ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 642ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 643ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 64494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->ps == RTLLIB_PS_DISABLED) { 645ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->power.disabled = 1; 646ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto exit; 647ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 648ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 649ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->power.disabled = 0; 650ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 651ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if ((wrqu->power.flags & IW_POWER_TYPE) == IW_POWER_TIMEOUT) { 652ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->power.flags = IW_POWER_TIMEOUT; 653ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->power.value = ieee->ps_timeout * 1000; 654ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } else { 655ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->power.flags = IW_POWER_PERIOD; 656ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->power.value = ieee->ps_period * 1000; 657ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 658ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 65994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if ((ieee->ps & (RTLLIB_PS_MBCAST | RTLLIB_PS_UNICAST)) == (RTLLIB_PS_MBCAST | RTLLIB_PS_UNICAST)) 66094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wrqu->power.flags |= IW_POWER_ALL_R; 66194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger else if (ieee->ps & RTLLIB_PS_MBCAST) 662ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->power.flags |= IW_POWER_MULTICAST_R; 663ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else 664ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->power.flags |= IW_POWER_UNICAST_R; 665ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 666ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanexit: 667ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 668ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return ret; 669ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 670ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 671