GNU Linux-libre 4.9.309-gnu1
[releases.git] / drivers / staging / rtl8192e / rtllib_module.c
1 /*******************************************************************************
2
3   Copyright(c) 2004 Intel Corporation. All rights reserved.
4
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
8   <jkmaline@cc.hut.fi>
9   Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
10
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.
14
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
18   more details.
19
20   The full GNU General Public License is included in this distribution in the
21   file called LICENSE.
22
23   Contact Information:
24   James P. Ketrenos <ipw2100-admin@linux.intel.com>
25   Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
26
27 *******************************************************************************/
28
29 #include <linux/compiler.h>
30 #include <linux/errno.h>
31 #include <linux/if_arp.h>
32 #include <linux/in6.h>
33 #include <linux/in.h>
34 #include <linux/ip.h>
35 #include <linux/kernel.h>
36 #include <linux/module.h>
37 #include <linux/netdevice.h>
38 #include <linux/pci.h>
39 #include <linux/proc_fs.h>
40 #include <linux/skbuff.h>
41 #include <linux/slab.h>
42 #include <linux/tcp.h>
43 #include <linux/types.h>
44 #include <linux/wireless.h>
45 #include <linux/etherdevice.h>
46 #include <linux/uaccess.h>
47 #include <net/arp.h>
48 #include "rtllib.h"
49
50 u32 rt_global_debug_component = COMP_ERR;
51 EXPORT_SYMBOL(rt_global_debug_component);
52
53 static inline int rtllib_networks_allocate(struct rtllib_device *ieee)
54 {
55         if (ieee->networks)
56                 return 0;
57
58         ieee->networks = kcalloc(MAX_NETWORK_COUNT,
59                                  sizeof(struct rtllib_network), GFP_KERNEL);
60         if (!ieee->networks)
61                 return -ENOMEM;
62
63         return 0;
64 }
65
66 static inline void rtllib_networks_free(struct rtllib_device *ieee)
67 {
68         if (!ieee->networks)
69                 return;
70         kfree(ieee->networks);
71         ieee->networks = NULL;
72 }
73
74 static inline void rtllib_networks_initialize(struct rtllib_device *ieee)
75 {
76         int i;
77
78         INIT_LIST_HEAD(&ieee->network_free_list);
79         INIT_LIST_HEAD(&ieee->network_list);
80         for (i = 0; i < MAX_NETWORK_COUNT; i++)
81                 list_add_tail(&ieee->networks[i].list,
82                               &ieee->network_free_list);
83 }
84
85 struct net_device *alloc_rtllib(int sizeof_priv)
86 {
87         struct rtllib_device *ieee = NULL;
88         struct net_device *dev;
89         int i, err;
90
91         pr_debug("rtllib: Initializing...\n");
92
93         dev = alloc_etherdev(sizeof(struct rtllib_device) + sizeof_priv);
94         if (!dev) {
95                 pr_err("Unable to allocate net_device.\n");
96                 return NULL;
97         }
98         ieee = (struct rtllib_device *)netdev_priv_rsl(dev);
99         memset(ieee, 0, sizeof(struct rtllib_device)+sizeof_priv);
100         ieee->dev = dev;
101
102         err = rtllib_networks_allocate(ieee);
103         if (err) {
104                 pr_err("Unable to allocate beacon storage: %d\n", err);
105                 goto failed;
106         }
107         rtllib_networks_initialize(ieee);
108
109         /* Default fragmentation threshold is maximum payload size */
110         ieee->fts = DEFAULT_FTS;
111         ieee->scan_age = DEFAULT_MAX_SCAN_AGE;
112         ieee->open_wep = 1;
113
114         /* Default to enabling full open WEP with host based encrypt/decrypt */
115         ieee->host_encrypt = 1;
116         ieee->host_decrypt = 1;
117         ieee->ieee802_1x = 1; /* Default to supporting 802.1x */
118
119         ieee->rtllib_ap_sec_type = rtllib_ap_sec_type;
120
121         spin_lock_init(&ieee->lock);
122         spin_lock_init(&ieee->wpax_suitlist_lock);
123         spin_lock_init(&ieee->reorder_spinlock);
124         atomic_set(&(ieee->atm_swbw), 0);
125
126         /* SAM FIXME */
127         lib80211_crypt_info_init(&ieee->crypt_info, "RTLLIB", &ieee->lock);
128
129         ieee->wpa_enabled = 0;
130         ieee->tkip_countermeasures = 0;
131         ieee->drop_unencrypted = 0;
132         ieee->privacy_invoked = 0;
133         ieee->ieee802_1x = 1;
134         ieee->raw_tx = 0;
135         ieee->hwsec_active = 0;
136
137         memset(ieee->swcamtable, 0, sizeof(struct sw_cam_table) * 32);
138         rtllib_softmac_init(ieee);
139
140         ieee->pHTInfo = kzalloc(sizeof(struct rt_hi_throughput), GFP_KERNEL);
141         if (!ieee->pHTInfo)
142                 return NULL;
143
144         HTUpdateDefaultSetting(ieee);
145         HTInitializeHTInfo(ieee);
146         TSInitialize(ieee);
147         for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++)
148                 INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]);
149
150         for (i = 0; i < 17; i++) {
151                 ieee->last_rxseq_num[i] = -1;
152                 ieee->last_rxfrag_num[i] = -1;
153                 ieee->last_packet_time[i] = 0;
154         }
155
156         return dev;
157
158  failed:
159         free_netdev(dev);
160         return NULL;
161 }
162 EXPORT_SYMBOL(alloc_rtllib);
163
164 void free_rtllib(struct net_device *dev)
165 {
166         struct rtllib_device *ieee = (struct rtllib_device *)
167                                       netdev_priv_rsl(dev);
168
169         kfree(ieee->pHTInfo);
170         ieee->pHTInfo = NULL;
171         rtllib_softmac_free(ieee);
172
173         lib80211_crypt_info_free(&ieee->crypt_info);
174
175         rtllib_networks_free(ieee);
176         free_netdev(dev);
177 }
178 EXPORT_SYMBOL(free_rtllib);
179
180 static int __init rtllib_init(void)
181 {
182         return 0;
183 }
184
185 static void __exit rtllib_exit(void)
186 {
187 }
188
189 module_init(rtllib_init);
190 module_exit(rtllib_exit);
191
192 MODULE_LICENSE("GPL");