1ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman/* IEEE 802.11 SoftMAC layer 2559a4c318ca303880fc9f26d50711791c16ae2f3Andrea Merello * Copyright (c) 2005 Andrea Merello <andrea.merello@gmail.com> 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 17efe13d868f3475ae7c296fff02f10c84dd80d45cWei Yongjun#include <linux/etherdevice.h> 18efe13d868f3475ae7c296fff02f10c84dd80d45cWei Yongjun 1994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "rtllib.h" 20ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman#include "dot11d.h" 21ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman/* FIXME: add A freqs */ 22ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 2394a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerconst long rtllib_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}; 293b28499c5519e59fbe9c2dea49ece5a3665be787Sean MacLennanEXPORT_SYMBOL(rtllib_wlan_frequencies); 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; 36a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger struct iw_freq *fwrq = &wrqu->freq; 37ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 38ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 39ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 40a44be772cb2beb1dd93102ba4f6b5e652895f783Larry 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 61a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1) { 62ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -EOPNOTSUPP; 63ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 64ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 65a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger } else { /* Set the channel */ 66ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 6794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->active_channel_map[fwrq->m] != 1) { 68ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -EINVAL; 69ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 70ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 71ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->current_network.channel = fwrq->m; 7294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->set_chan(ieee->dev, ieee->current_network.channel); 73ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 74a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger if (ieee->iw_mode == IW_MODE_ADHOC || 75a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger ieee->iw_mode == IW_MODE_MASTER) 76a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger if (ieee->state == RTLLIB_LINKED) { 77a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger rtllib_stop_send_beacons(ieee); 78a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger rtllib_start_send_beacons(ieee); 79ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 80ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 81ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 82ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = 0; 83ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanout: 84ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 85ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return ret; 86ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 873b28499c5519e59fbe9c2dea49ece5a3665be787Sean MacLennanEXPORT_SYMBOL(rtllib_wx_set_freq); 88ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 89ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 9094a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_get_freq(struct rtllib_device *ieee, 91ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *a, 92ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *b) 93ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 94a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger struct iw_freq *fwrq = &wrqu->freq; 95ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 96ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->current_network.channel == 0) 97ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return -1; 98a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger fwrq->m = rtllib_wlan_frequencies[ieee->current_network.channel-1] * 99a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger 100000; 100ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman fwrq->e = 1; 101ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 102ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 1033b28499c5519e59fbe9c2dea49ece5a3665be787Sean MacLennanEXPORT_SYMBOL(rtllib_wx_get_freq); 104ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 10594a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_get_wap(struct rtllib_device *ieee, 106ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 107ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 108ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 109ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman unsigned long flags; 11094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 111ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->ap_addr.sa_family = ARPHRD_ETHER; 112ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 113ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->iw_mode == IW_MODE_MONITOR) 114ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return -1; 115ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 116ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* We want avoid to give to the user inconsistent infos*/ 117ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_lock_irqsave(&ieee->lock, flags); 118ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 11994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->state != RTLLIB_LINKED && 12094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->state != RTLLIB_LINKED_SCANNING && 121ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->wap_set == 0) 122ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 123ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); 124ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else 125ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman memcpy(wrqu->ap_addr.sa_data, 126ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->current_network.bssid, ETH_ALEN); 127ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 128ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_unlock_irqrestore(&ieee->lock, flags); 129ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 130ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 131ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 1323b28499c5519e59fbe9c2dea49ece5a3665be787Sean MacLennanEXPORT_SYMBOL(rtllib_wx_get_wap); 133ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 134ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 13594a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_set_wap(struct rtllib_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 unsigned long flags; 143ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 14494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger short ifup = ieee->proto_started; 145ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct sockaddr *temp = (struct sockaddr *)awrq; 146ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 14794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_stop_scan_syncro(ieee); 148ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 149ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 150ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* use ifconfig hw ether */ 151a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger if (ieee->iw_mode == IW_MODE_MASTER) { 152ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -1; 153ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 154ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 155ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 156a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger if (temp->sa_family != ARPHRD_ETHER) { 157ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -EINVAL; 158ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 159ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 160ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 161efe13d868f3475ae7c296fff02f10c84dd80d45cWei Yongjun if (is_zero_ether_addr(temp->sa_data)) { 162a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger spin_lock_irqsave(&ieee->lock, flags); 163a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); 164a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger ieee->wap_set = 0; 165a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger spin_unlock_irqrestore(&ieee->lock, flags); 166a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger ret = -1; 167a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger goto out; 168a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger } 16994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 17094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 171ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ifup) 172a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger rtllib_stop_protocol(ieee, true); 173ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 174ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* just to avoid to give inconsistent infos in the 175ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman * get wx method. not really needed otherwise 176ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman */ 177ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_lock_irqsave(&ieee->lock, flags); 178ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 17994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->cannot_notify = false; 180ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); 181efe13d868f3475ae7c296fff02f10c84dd80d45cWei Yongjun ieee->wap_set = !is_zero_ether_addr(temp->sa_data); 182ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 183ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_unlock_irqrestore(&ieee->lock, flags); 184ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 185ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ifup) 18694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_start_protocol(ieee); 187ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanout: 188ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 189ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return ret; 190ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 1913b28499c5519e59fbe9c2dea49ece5a3665be787Sean MacLennanEXPORT_SYMBOL(rtllib_wx_set_wap); 192ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 193a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Fingerint rtllib_wx_get_essid(struct rtllib_device *ieee, struct iw_request_info *a, 194a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger union iwreq_data *wrqu, char *b) 195ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 196a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger int len, ret = 0; 197ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman unsigned long flags; 198ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 199ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->iw_mode == IW_MODE_MONITOR) 200ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return -1; 201ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 202ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* We want avoid to give to the user inconsistent infos*/ 203ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_lock_irqsave(&ieee->lock, flags); 204ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 205ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->current_network.ssid[0] == '\0' || 206a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger ieee->current_network.ssid_len == 0) { 207ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -1; 208ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 209ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 210ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 21194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->state != RTLLIB_LINKED && 21294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->state != RTLLIB_LINKED_SCANNING && 213a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger ieee->ssid_set == 0) { 214ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -1; 215ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 216ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 217ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman len = ieee->current_network.ssid_len; 218ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->essid.length = len; 219a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger strncpy(b, ieee->current_network.ssid, len); 220ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->essid.flags = 1; 221ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 222ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanout: 223ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_unlock_irqrestore(&ieee->lock, flags); 224ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 225ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return ret; 226ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 227ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 2283b28499c5519e59fbe9c2dea49ece5a3665be787Sean MacLennanEXPORT_SYMBOL(rtllib_wx_get_essid); 229ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 23094a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_set_rate(struct rtllib_device *ieee, 231ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 232ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 233ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 234ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 235ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman u32 target_rate = wrqu->bitrate.value; 236ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 237ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->rate = target_rate/100000; 238ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 239ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 2403b28499c5519e59fbe9c2dea49ece5a3665be787Sean MacLennanEXPORT_SYMBOL(rtllib_wx_set_rate); 241ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 24294a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_get_rate(struct rtllib_device *ieee, 243ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 244ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 245ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 24694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 tmp_rate = 0; 2473a6b70c3f3558a2e47d2ca82752f0aed0f3c33c6Matthew Casey 248a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger tmp_rate = TxCountToDataRate(ieee, 249a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger ieee->softmac_stats.CurrentShowTxate); 250ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->bitrate.value = tmp_rate * 500000; 251ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 252ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 253ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 2543b28499c5519e59fbe9c2dea49ece5a3665be787Sean MacLennanEXPORT_SYMBOL(rtllib_wx_get_rate); 255ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 256ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 25794a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_set_rts(struct rtllib_device *ieee, 258ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 259ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 260ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 261ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (wrqu->rts.disabled || !wrqu->rts.fixed) 262ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->rts = DEFAULT_RTS_THRESHOLD; 263a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger else { 264ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (wrqu->rts.value < MIN_RTS_THRESHOLD || 265ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->rts.value > MAX_RTS_THRESHOLD) 266ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return -EINVAL; 267ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->rts = wrqu->rts.value; 268ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 269ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 270ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 2713b28499c5519e59fbe9c2dea49ece5a3665be787Sean MacLennanEXPORT_SYMBOL(rtllib_wx_set_rts); 272ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 27394a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_get_rts(struct rtllib_device *ieee, 274ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 275ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 276ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 277ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->rts.value = ieee->rts; 278ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->rts.fixed = 0; /* no auto select */ 279ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->rts.disabled = (wrqu->rts.value == DEFAULT_RTS_THRESHOLD); 280ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 281ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 2823b28499c5519e59fbe9c2dea49ece5a3665be787Sean MacLennanEXPORT_SYMBOL(rtllib_wx_get_rts); 28394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 28494a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_set_mode(struct rtllib_device *ieee, struct iw_request_info *a, 285ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *b) 286ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 28794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int set_mode_status = 0; 288ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 28994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_stop_scan_syncro(ieee); 290ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 29194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger switch (wrqu->mode) { 29294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case IW_MODE_MONITOR: 29394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case IW_MODE_ADHOC: 29494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case IW_MODE_INFRA: 29594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 29694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case IW_MODE_AUTO: 29794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wrqu->mode = IW_MODE_INFRA; 29894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 29994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger default: 30094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger set_mode_status = -EINVAL; 30194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger goto out; 30294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 303ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 304ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (wrqu->mode == ieee->iw_mode) 305ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 306ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 30794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (wrqu->mode == IW_MODE_MONITOR) { 308ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->dev->type = ARPHRD_IEEE80211; 309a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger rtllib_EnableNetMonitorMode(ieee->dev, false); 31094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } else { 311ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->dev->type = ARPHRD_ETHER; 31294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->iw_mode == IW_MODE_MONITOR) 313a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger rtllib_DisableNetMonitorMode(ieee->dev, false); 314ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 315ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 31694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (!ieee->proto_started) { 317ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->iw_mode = wrqu->mode; 31894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } else { 319a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger rtllib_stop_protocol(ieee, true); 320ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->iw_mode = wrqu->mode; 32194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_start_protocol(ieee); 322ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 323ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 324ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanout: 325ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 32694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return set_mode_status; 327ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 3283b28499c5519e59fbe9c2dea49ece5a3665be787Sean MacLennanEXPORT_SYMBOL(rtllib_wx_set_mode); 329ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 33094a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid rtllib_wx_sync_scan_wq(void *data) 331ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 332a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger struct rtllib_device *ieee = container_of_work_rsl(data, 333a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger struct rtllib_device, wx_sync_scan_wq); 334ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman short chan; 335a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger enum ht_extchnl_offset chan_offset = 0; 336a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger enum ht_channel_width bandwidth = 0; 337ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int b40M = 0; 33865a4378471510787e080188f933913315f1afa0cdavid woo 339a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger if (!(ieee->softmac_features & IEEE_SOFTMAC_SCAN)) { 34094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_start_scan_syncro(ieee, 0); 34194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger goto out; 34265a4378471510787e080188f933913315f1afa0cdavid woo } 34365a4378471510787e080188f933913315f1afa0cdavid woo 34494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger chan = ieee->current_network.channel; 34594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 34694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->LeisurePSLeave) 34794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->LeisurePSLeave(ieee->dev); 34865a4378471510787e080188f933913315f1afa0cdavid woo /* notify AP to be in PS mode */ 34994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_sta_ps_send_null_frame(ieee, 1); 35094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_sta_ps_send_null_frame(ieee, 1); 35194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 35294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_stop_all_queues(ieee); 35365a4378471510787e080188f933913315f1afa0cdavid woo 354ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->data_hard_stop) 35594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->data_hard_stop(ieee->dev); 35694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_stop_send_beacons(ieee); 35794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->state = RTLLIB_LINKED_SCANNING; 35894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->link_change(ieee->dev); 35994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger /* wait for ps packet to be kicked out successfully */ 36094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger msleep(50); 361ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 36294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->ScanOperationBackupHandler) 363a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger ieee->ScanOperationBackupHandler(ieee->dev, SCAN_OPT_BACKUP); 364ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 365a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger if (ieee->pHTInfo->bCurrentHTSupport && ieee->pHTInfo->bEnableHT && 366a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger ieee->pHTInfo->bCurBW40MHz) { 367ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman b40M = 1; 368ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman chan_offset = ieee->pHTInfo->CurSTAExtChnlOffset; 3696e579119b104967e91e506de2c7ac7ec1ac4d213Larry Finger bandwidth = (enum ht_channel_width)ieee->pHTInfo->bCurBW40MHz; 370a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger RT_TRACE(COMP_DBG, "Scan in 40M, force to 20M first:%d, %d\n", 371a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger chan_offset, bandwidth); 372a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger ieee->SetBWModeHandler(ieee->dev, HT_CHANNEL_WIDTH_20, 373a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger HT_EXTCHNL_OFFSET_NO_EXT); 374a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger } 37594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 37694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_start_scan_syncro(ieee, 0); 37794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 378ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (b40M) { 37994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger RT_TRACE(COMP_DBG, "Scan in 20M, back to 40M\n"); 380ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (chan_offset == HT_EXTCHNL_OFFSET_UPPER) 38194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->set_chan(ieee->dev, chan + 2); 382ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else if (chan_offset == HT_EXTCHNL_OFFSET_LOWER) 38394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->set_chan(ieee->dev, chan - 2); 384ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else 38594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->set_chan(ieee->dev, chan); 38694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->SetBWModeHandler(ieee->dev, bandwidth, chan_offset); 387ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } else { 38894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->set_chan(ieee->dev, chan); 389ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 390ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 39194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->ScanOperationBackupHandler) 392a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger ieee->ScanOperationBackupHandler(ieee->dev, SCAN_OPT_RESTORE); 39394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 39494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->state = RTLLIB_LINKED; 39594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->link_change(ieee->dev); 39665a4378471510787e080188f933913315f1afa0cdavid woo 39765a4378471510787e080188f933913315f1afa0cdavid woo /* Notify AP that I wake up again */ 39894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_sta_ps_send_null_frame(ieee, 0); 39965a4378471510787e080188f933913315f1afa0cdavid woo 40094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->LinkDetectInfo.NumRecvBcnInPeriod == 0 || 401a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger ieee->LinkDetectInfo.NumRecvDataInPeriod == 0) { 402ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->LinkDetectInfo.NumRecvBcnInPeriod = 1; 403a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger ieee->LinkDetectInfo.NumRecvDataInPeriod = 1; 404ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 40594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 406ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->data_hard_resume) 40794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->data_hard_resume(ieee->dev); 408ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 40994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) 41094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_start_send_beacons(ieee); 41194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 41294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_wake_all_queues(ieee); 413ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 41494a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerout: 415ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 416ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 417ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 418ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 41994a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_set_scan(struct rtllib_device *ieee, struct iw_request_info *a, 420ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *b) 421ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 422ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int ret = 0; 423ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 424ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 425ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 426a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)) { 427ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -1; 428ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 429ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 430ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 431a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger if (ieee->state == RTLLIB_LINKED) { 43294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger queue_work_rsl(ieee->wq, &ieee->wx_sync_scan_wq); 433ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* intentionally forget to up sem */ 434ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 435ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 436ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 437ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanout: 438ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 439ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return ret; 440ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 4413b28499c5519e59fbe9c2dea49ece5a3665be787Sean MacLennanEXPORT_SYMBOL(rtllib_wx_set_scan); 442ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 44394a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_set_essid(struct rtllib_device *ieee, 444a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger struct iw_request_info *a, 445a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger union iwreq_data *wrqu, char *extra) 446ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 447ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 448a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger int ret = 0, len, i; 449ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman short proto_started; 450ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman unsigned long flags; 451ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 45294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_stop_scan_syncro(ieee); 453ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 454ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 455ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman proto_started = ieee->proto_started; 456ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 457a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger len = (wrqu->essid.length < IW_ESSID_MAX_SIZE) ? wrqu->essid.length : 458a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger IW_ESSID_MAX_SIZE; 45994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 460a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger if (len > IW_ESSID_MAX_SIZE) { 461a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger ret = -E2BIG; 462ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 463ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 464ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 465a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger if (ieee->iw_mode == IW_MODE_MONITOR) { 466a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger ret = -1; 467ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto out; 468ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 469ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 470a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger for (i = 0; i < len; i++) { 471a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger if (extra[i] < 0) { 472a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger ret = -1; 47394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger goto out; 47494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 47565a4378471510787e080188f933913315f1afa0cdavid woo } 476ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 47794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (proto_started) 478a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger rtllib_stop_protocol(ieee, true); 47994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 480ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 481ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman /* this is just to be sure that the GET wx callback 482cd01712397ad428f443c05add5d7435e899c0ef1Justin P. Mattock * has consistent infos. not needed otherwise 483ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman */ 484ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_lock_irqsave(&ieee->lock, flags); 485ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 486ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (wrqu->essid.flags && wrqu->essid.length) { 48794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger strncpy(ieee->current_network.ssid, extra, len); 48894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->current_network.ssid_len = len; 48994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->cannot_notify = false; 490ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->ssid_set = 1; 491a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger } else { 492ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->ssid_set = 0; 493ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->current_network.ssid[0] = '\0'; 494ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->current_network.ssid_len = 0; 495ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 496ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman spin_unlock_irqrestore(&ieee->lock, flags); 497ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 498ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (proto_started) 49994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_start_protocol(ieee); 500ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanout: 501ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 502ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return ret; 503ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 5043b28499c5519e59fbe9c2dea49ece5a3665be787Sean MacLennanEXPORT_SYMBOL(rtllib_wx_set_essid); 505ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 506a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Fingerint rtllib_wx_get_mode(struct rtllib_device *ieee, struct iw_request_info *a, 507a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger union iwreq_data *wrqu, char *b) 508ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 509ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->mode = ieee->iw_mode; 510ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 511ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 5123b28499c5519e59fbe9c2dea49ece5a3665be787Sean MacLennanEXPORT_SYMBOL(rtllib_wx_get_mode); 513ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 514a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Fingerint rtllib_wx_set_rawtx(struct rtllib_device *ieee, 515a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger struct iw_request_info *info, 516a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger union iwreq_data *wrqu, char *extra) 517ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 518ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 519ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int *parms = (int *)extra; 520ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int enable = (parms[0] > 0); 521ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman short prev = ieee->raw_tx; 522ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 523ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 524ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 52594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (enable) 526ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->raw_tx = 1; 527ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else 528ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->raw_tx = 0; 529ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 530ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman printk(KERN_INFO"raw TX is %s\n", 531ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->raw_tx ? "enabled" : "disabled"); 532ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 533a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger if (ieee->iw_mode == IW_MODE_MONITOR) { 534a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger if (prev == 0 && ieee->raw_tx) { 535ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->data_hard_resume) 53694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->data_hard_resume(ieee->dev); 537ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 538ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman netif_carrier_on(ieee->dev); 539ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 540ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 54194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (prev && ieee->raw_tx == 1) 542ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman netif_carrier_off(ieee->dev); 543ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 544ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 545ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 546ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 547ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 548ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 5493b28499c5519e59fbe9c2dea49ece5a3665be787Sean MacLennanEXPORT_SYMBOL(rtllib_wx_set_rawtx); 550ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 55194a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_get_name(struct rtllib_device *ieee, 552ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 553ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 554ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 555ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman strcpy(wrqu->name, "802.11"); 55694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 55794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->modulation & RTLLIB_CCK_MODULATION) 558ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman strcat(wrqu->name, "b"); 55994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->modulation & RTLLIB_OFDM_MODULATION) 560ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman strcat(wrqu->name, "g"); 561ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (ieee->mode & (IEEE_N_24G | IEEE_N_5G)) 5623ef5a262ad0061d6147da7e3ee03aead7c160d91Greg Kroah-Hartman strcat(wrqu->name, "n"); 563ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return 0; 564ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 5653b28499c5519e59fbe9c2dea49ece5a3665be787Sean MacLennanEXPORT_SYMBOL(rtllib_wx_get_name); 566ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 567ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 568ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman/* this is mostly stolen from hostap */ 56994a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_set_power(struct rtllib_device *ieee, 570ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 571ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 572ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 573ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman int ret = 0; 5744f6807e8d2e972393009830d305ecec2d80c0449Mike McCormack 575a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger if ((!ieee->sta_wake_up) || 576a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger (!ieee->enter_sleep_state) || 577a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger (!ieee->ps_is_queue_empty)) { 578cd01712397ad428f443c05add5d7435e899c0ef1Justin P. Mattock RTLLIB_DEBUG(RTLLIB_DL_ERR, "%s(): PS mode is tried to be use " 579a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger "but driver missed a callback\n\n", __func__); 580ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return -1; 581ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 5824f6807e8d2e972393009830d305ecec2d80c0449Mike McCormack 583ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 584ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 585a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger if (wrqu->power.disabled) { 586a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger RT_TRACE(COMP_DBG, "===>%s(): power disable\n", __func__); 58794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->ps = RTLLIB_PS_DISABLED; 588ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto exit; 589ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 590ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman if (wrqu->power.flags & IW_POWER_TIMEOUT) { 591ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->ps_timeout = wrqu->power.value / 1000; 592a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger RT_TRACE(COMP_DBG, "===>%s():ps_timeout is %d\n", __func__, 593a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger ieee->ps_timeout); 594ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 595ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 596a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger if (wrqu->power.flags & IW_POWER_PERIOD) 597ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ieee->ps_period = wrqu->power.value / 1000; 59894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 599ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman switch (wrqu->power.flags & IW_POWER_MODE) { 600ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman case IW_POWER_UNICAST_R: 60194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->ps = RTLLIB_PS_UNICAST; 602ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman break; 603ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman case IW_POWER_MULTICAST_R: 60494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->ps = RTLLIB_PS_MBCAST; 605ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman break; 606ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman case IW_POWER_ALL_R: 60794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->ps = RTLLIB_PS_UNICAST | RTLLIB_PS_MBCAST; 608ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman break; 609ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 610ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman case IW_POWER_ON: 611ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman break; 612ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 613ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman default: 614ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman ret = -EINVAL; 615ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman goto exit; 616ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 617ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 618ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanexit: 619ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 620ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman return ret; 621ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 622ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 6233b28499c5519e59fbe9c2dea49ece5a3665be787Sean MacLennanEXPORT_SYMBOL(rtllib_wx_set_power); 624ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 625ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman/* this is stolen from hostap */ 62694a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerint rtllib_wx_get_power(struct rtllib_device *ieee, 627ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman struct iw_request_info *info, 628ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman union iwreq_data *wrqu, char *extra) 629ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman{ 630ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman down(&ieee->wx_sem); 631ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 63294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->ps == RTLLIB_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 wrqu->power.flags = IW_POWER_PERIOD; 644ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->power.value = ieee->ps_period * 1000; 645ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman } 646ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 647a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger if ((ieee->ps & (RTLLIB_PS_MBCAST | RTLLIB_PS_UNICAST)) == 648a44be772cb2beb1dd93102ba4f6b5e652895f783Larry Finger (RTLLIB_PS_MBCAST | RTLLIB_PS_UNICAST)) 64994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wrqu->power.flags |= IW_POWER_ALL_R; 65094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger else if (ieee->ps & RTLLIB_PS_MBCAST) 651ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->power.flags |= IW_POWER_MULTICAST_R; 652ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman else 653ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman wrqu->power.flags |= IW_POWER_UNICAST_R; 654ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 655ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartmanexit: 656ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman up(&ieee->wx_sem); 6574764ca981b040048766e4f39a45a4b9c5cecff9cPeter Senna Tschudin return 0; 658ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman 659ecdfa44610fa18678c3dd481af75368b9800c6c7Greg Kroah-Hartman} 6603b28499c5519e59fbe9c2dea49ece5a3665be787Sean MacLennanEXPORT_SYMBOL(rtllib_wx_get_power); 661