1 /*******************************************************************************
3 Copyright(c) 2004 Intel Corporation. All rights reserved.
5 Portions of this file are based on the WEP enablement code provided by the
6 Host AP project hostap-drivers v0.1.3
7 Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
9 Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
11 This program is free software; you can redistribute it and/or modify it
12 under the terms of version 2 of the GNU General Public License as
13 published by the Free Software Foundation.
15 This program is distributed in the hope that it will be useful, but WITHOUT
16 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
20 You should have received a copy of the GNU General Public License along with
21 this program; if not, write to the Free Software Foundation, Inc., 59
22 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 The full GNU General Public License is included in this distribution in the
28 James P. Ketrenos <ipw2100-admin@linux.intel.com>
29 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
31 *******************************************************************************/
33 #include <linux/compiler.h>
34 #include <linux/errno.h>
35 #include <linux/if_arp.h>
36 #include <linux/in6.h>
39 #include <linux/kernel.h>
40 #include <linux/module.h>
41 #include <linux/netdevice.h>
42 #include <linux/pci.h>
43 #include <linux/proc_fs.h>
44 #include <linux/skbuff.h>
45 #include <linux/slab.h>
46 #include <linux/tcp.h>
47 #include <linux/types.h>
48 #include <linux/version.h>
49 #include <linux/wireless.h>
50 #include <linux/etherdevice.h>
51 #include <asm/uaccess.h>
57 #define DRV_NAME "rtllib_92e"
59 #ifdef CONFIG_CFG_80211
60 #ifdef CONFIG_RTL_RFKILL
61 static inline void rtllib_rfkill_poll(struct wiphy *wiphy)
63 struct rtllib_device *rtllib = NULL;
65 rtllib = (struct rtllib_device *)wiphy_priv(wiphy);
67 rtllib = (struct rtllib_device *)netdev_priv_rsl(rtllib->dev);
69 if (rtllib->rtllib_rfkill_poll)
70 rtllib->rtllib_rfkill_poll(rtllib->dev);
73 static inline void rtllib_rfkill_poll(struct wiphy *wiphy) {}
75 struct cfg80211_ops rtllib_config_ops = {.rfkill_poll = rtllib_rfkill_poll };
76 void *rtllib_wiphy_privid = &rtllib_wiphy_privid;
79 void _setup_timer( struct timer_list* ptimer, void* fun, unsigned long data )
81 ptimer->function = fun;
86 static inline int rtllib_networks_allocate(struct rtllib_device *ieee)
91 #ifndef RTK_DMP_PLATFORM
92 ieee->networks = kmalloc(
93 MAX_NETWORK_COUNT * sizeof(struct rtllib_network),
96 ieee->networks = dvr_malloc(MAX_NETWORK_COUNT * sizeof(struct rtllib_network));
98 if (!ieee->networks) {
99 printk(KERN_WARNING "%s: Out of memory allocating beacons\n",
104 memset(ieee->networks, 0,
105 MAX_NETWORK_COUNT * sizeof(struct rtllib_network));
110 static inline void rtllib_networks_free(struct rtllib_device *ieee)
114 #ifndef RTK_DMP_PLATFORM
115 kfree(ieee->networks);
117 dvr_free(ieee->networks);
119 ieee->networks = NULL;
122 static inline void rtllib_networks_initialize(struct rtllib_device *ieee)
126 INIT_LIST_HEAD(&ieee->network_free_list);
127 INIT_LIST_HEAD(&ieee->network_list);
128 for (i = 0; i < MAX_NETWORK_COUNT; i++)
129 list_add_tail(&ieee->networks[i].list, &ieee->network_free_list);
132 #if defined CONFIG_CFG_80211
133 static bool rtllib_wdev_alloc(struct rtllib_device *ieee, int sizeof_priv)
136 struct rtllib_device *rtllib = NULL;
138 priv_size = ALIGN(sizeof(struct rtllib_device),NETDEV_ALIGN) + sizeof_priv;
140 ieee->wdev.wiphy = wiphy_new(&rtllib_config_ops, priv_size);
141 if (!ieee->wdev.wiphy) {
142 RTLLIB_ERROR("Unable to allocate wiphy.\n");
146 rtllib = (struct rtllib_device *)wiphy_priv(ieee->wdev.wiphy);
147 rtllib->dev = ieee->dev;
149 ieee->dev->ieee80211_ptr = &ieee->wdev;
150 ieee->wdev.iftype = NL80211_IFTYPE_STATION;
152 /* Fill-out wiphy structure bits we know... Not enough info
153 * here to call set_wiphy_dev or set MAC address or channel info
154 * -- have to do that in ->ndo_init... */
155 ieee->wdev.wiphy->privid = rtllib_wiphy_privid;
157 ieee->wdev.wiphy->max_scan_ssids = 1;
158 ieee->wdev.wiphy->max_scan_ie_len = 0;
159 ieee->wdev.wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC);
164 wiphy_free(ieee->wdev.wiphy);
169 struct net_device *alloc_rtllib(int sizeof_priv)
171 struct rtllib_device *ieee = NULL;
172 struct net_device *dev;
175 RTLLIB_DEBUG_INFO("Initializing...\n");
177 dev = alloc_etherdev(sizeof(struct rtllib_device) + sizeof_priv);
179 RTLLIB_ERROR("Unable to network device.\n");
182 ieee = (struct rtllib_device *)netdev_priv_rsl(dev);
183 memset(ieee, 0, sizeof(struct rtllib_device)+sizeof_priv);
186 #ifdef CONFIG_CFG_80211
187 if (!rtllib_wdev_alloc(ieee, sizeof_priv))
190 err = rtllib_networks_allocate(ieee);
192 RTLLIB_ERROR("Unable to allocate beacon storage: %d\n",
196 rtllib_networks_initialize(ieee);
199 /* Default fragmentation threshold is maximum payload size */
200 ieee->fts = DEFAULT_FTS;
201 ieee->scan_age = DEFAULT_MAX_SCAN_AGE;
204 /* Default to enabling full open WEP with host based encrypt/decrypt */
205 ieee->host_encrypt = 1;
206 ieee->host_decrypt = 1;
207 ieee->ieee802_1x = 1; /* Default to supporting 802.1x */
209 INIT_LIST_HEAD(&ieee->crypt_deinit_list);
210 _setup_timer(&ieee->crypt_deinit_timer,
211 rtllib_crypt_deinit_handler,
212 (unsigned long) ieee);
213 ieee->rtllib_ap_sec_type = rtllib_ap_sec_type;
215 spin_lock_init(&ieee->lock);
216 spin_lock_init(&ieee->wpax_suitlist_lock);
217 spin_lock_init(&ieee->bw_spinlock);
218 spin_lock_init(&ieee->reorder_spinlock);
219 atomic_set(&(ieee->atm_chnlop), 0);
220 atomic_set(&(ieee->atm_swbw), 0);
222 ieee->bHalfNMode = false;
223 ieee->wpa_enabled = 0;
224 ieee->tkip_countermeasures = 0;
225 ieee->drop_unencrypted = 0;
226 ieee->privacy_invoked = 0;
227 ieee->ieee802_1x = 1;
229 ieee->hwsec_active = 0;
231 memset(ieee->swcamtable,0,sizeof(SW_CAM_TABLE)*32);
232 rtllib_softmac_init(ieee);
234 ieee->pHTInfo = (RT_HIGH_THROUGHPUT*)kzalloc(sizeof(RT_HIGH_THROUGHPUT), GFP_KERNEL);
235 if (ieee->pHTInfo == NULL)
237 RTLLIB_DEBUG(RTLLIB_DL_ERR, "can't alloc memory for HTInfo\n");
240 HTUpdateDefaultSetting(ieee);
241 HTInitializeHTInfo(ieee);
243 for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++)
244 INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]);
246 for (i = 0; i < 17; i++) {
247 ieee->last_rxseq_num[i] = -1;
248 ieee->last_rxfrag_num[i] = -1;
249 ieee->last_packet_time[i] = 0;
265 void free_rtllib(struct net_device *dev)
267 struct rtllib_device *ieee = (struct rtllib_device *)netdev_priv_rsl(dev);
269 if (ieee->pHTInfo != NULL) {
270 kfree(ieee->pHTInfo);
271 ieee->pHTInfo = NULL;
273 rtllib_softmac_free(ieee);
274 del_timer_sync(&ieee->crypt_deinit_timer);
275 rtllib_crypt_deinit_entries(ieee, 1);
277 for (i = 0; i < WEP_KEYS; i++) {
278 struct rtllib_crypt_data *crypt = ieee->crypt[i];
281 crypt->ops->deinit(crypt->priv);
283 ieee->crypt[i] = NULL;
287 rtllib_networks_free(ieee);
288 #ifdef CONFIG_CFG_80211
289 wiphy_unregister(ieee->wdev.wiphy);
290 wiphy_free(ieee->wdev.wiphy);
295 #ifdef CONFIG_RTLLIB_DEBUG
297 u32 rtllib_debug_level = 0;
301 struct proc_dir_entry *rtllib_proc = NULL;
303 static int show_debug_level(char *page, char **start, off_t offset,
304 int count, int *eof, void *data)
306 return snprintf(page, count, "0x%08X\n", rtllib_debug_level);
309 static int store_debug_level(struct file *file, const char *buffer,
310 unsigned long count, void *data)
312 char buf[] = "0x00000000";
313 unsigned long len = min((unsigned long)sizeof(buf) - 1, count);
314 char *p = (char *)buf;
317 if (copy_from_user(buf, buffer, len))
320 if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') {
322 if (p[0] == 'x' || p[0] == 'X')
324 val = simple_strtoul(p, &p, 16);
326 val = simple_strtoul(p, &p, 10);
328 printk(KERN_INFO DRV_NAME
329 ": %s is not in hex or decimal form.\n", buf);
331 rtllib_debug_level = val;
333 return strnlen(buf, count);
336 int __init rtllib_init(void)
338 #ifdef CONFIG_RTLLIB_DEBUG
339 struct proc_dir_entry *e;
341 rtllib_debug_level = debug;
342 rtllib_proc = create_proc_entry(DRV_NAME, S_IFDIR, init_net.proc_net);
343 if (rtllib_proc == NULL) {
344 RTLLIB_ERROR("Unable to create " DRV_NAME
345 " proc directory\n");
348 e = create_proc_entry("debug_level", S_IFREG | S_IRUGO | S_IWUSR,
351 remove_proc_entry(DRV_NAME, init_net.proc_net);
355 e->read_proc = show_debug_level;
356 e->write_proc = store_debug_level;
363 void __exit rtllib_exit(void)
365 #ifdef CONFIG_RTLLIB_DEBUG
367 remove_proc_entry("debug_level", rtllib_proc);
368 remove_proc_entry(DRV_NAME, init_net.proc_net);