Merge branch 'omap-serial' of git://git.linaro.org/people/rmk/linux-arm
[firefly-linux-kernel-4.4.55.git] / drivers / staging / rtl8187se / ieee80211 / ieee80211_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   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.
23
24   The full GNU General Public License is included in this distribution in the
25   file called LICENSE.
26
27   Contact Information:
28   James P. Ketrenos <ipw2100-admin@linux.intel.com>
29   Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
30
31 *******************************************************************************/
32
33 #include <linux/compiler.h>
34 //#include <linux/config.h>
35 #include <linux/errno.h>
36 #include <linux/if_arp.h>
37 #include <linux/in6.h>
38 #include <linux/in.h>
39 #include <linux/ip.h>
40 #include <linux/kernel.h>
41 #include <linux/module.h>
42 #include <linux/netdevice.h>
43 #include <linux/pci.h>
44 #include <linux/proc_fs.h>
45 #include <linux/skbuff.h>
46 #include <linux/slab.h>
47 #include <linux/tcp.h>
48 #include <linux/types.h>
49 #include <linux/wireless.h>
50 #include <linux/etherdevice.h>
51 #include <linux/uaccess.h>
52 #include <net/arp.h>
53 #include <net/net_namespace.h>
54
55 #include "ieee80211.h"
56
57 MODULE_DESCRIPTION("802.11 data/management/control stack");
58 MODULE_AUTHOR("Copyright (C) 2004 Intel Corporation <jketreno@linux.intel.com>");
59 MODULE_LICENSE("GPL");
60
61 #define DRV_NAME "ieee80211"
62
63 static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee)
64 {
65         if (ieee->networks)
66                 return 0;
67
68         ieee->networks = kcalloc(
69                 MAX_NETWORK_COUNT, sizeof(struct ieee80211_network),
70                 GFP_KERNEL);
71         if (!ieee->networks) {
72                 netdev_warn(ieee->dev,  "Out of memory allocating beacons\n");
73                 return -ENOMEM;
74         }
75
76         return 0;
77 }
78
79 static inline void ieee80211_networks_free(struct ieee80211_device *ieee)
80 {
81         if (!ieee->networks)
82                 return;
83         kfree(ieee->networks);
84         ieee->networks = NULL;
85 }
86
87 static inline void ieee80211_networks_initialize(struct ieee80211_device *ieee)
88 {
89         int i;
90
91         INIT_LIST_HEAD(&ieee->network_free_list);
92         INIT_LIST_HEAD(&ieee->network_list);
93         for (i = 0; i < MAX_NETWORK_COUNT; i++)
94                 list_add_tail(&ieee->networks[i].list, &ieee->network_free_list);
95 }
96
97
98 struct net_device *alloc_ieee80211(int sizeof_priv)
99 {
100         struct ieee80211_device *ieee;
101         struct net_device *dev;
102         int i, err;
103
104         IEEE80211_DEBUG_INFO("Initializing...\n");
105
106         dev = alloc_etherdev(sizeof(struct ieee80211_device) + sizeof_priv);
107         if (!dev) {
108                 IEEE80211_ERROR("Unable to network device.\n");
109                 goto failed;
110         }
111         ieee = netdev_priv(dev);
112
113         ieee->dev = dev;
114
115         err = ieee80211_networks_allocate(ieee);
116         if (err) {
117                 IEEE80211_ERROR("Unable to allocate beacon storage: %d\n",
118                                 err);
119                 goto failed;
120         }
121         ieee80211_networks_initialize(ieee);
122
123         /* Default fragmentation threshold is maximum payload size */
124         ieee->fts = DEFAULT_FTS;
125         ieee->scan_age = DEFAULT_MAX_SCAN_AGE;
126         ieee->open_wep = 1;
127
128         /* Default to enabling full open WEP with host based encrypt/decrypt */
129         ieee->host_encrypt = 1;
130         ieee->host_decrypt = 1;
131         ieee->ieee802_1x = 1; /* Default to supporting 802.1x */
132
133         INIT_LIST_HEAD(&ieee->crypt_deinit_list);
134         init_timer(&ieee->crypt_deinit_timer);
135         ieee->crypt_deinit_timer.data = (unsigned long)ieee;
136         ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler;
137
138         spin_lock_init(&ieee->lock);
139         spin_lock_init(&ieee->wpax_suitlist_lock);
140
141         ieee->wpax_type_set = 0;
142         ieee->wpa_enabled = 0;
143         ieee->tkip_countermeasures = 0;
144         ieee->drop_unencrypted = 0;
145         ieee->privacy_invoked = 0;
146         ieee->ieee802_1x = 1;
147         ieee->raw_tx = 0;
148
149         ieee80211_softmac_init(ieee);
150
151         for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++)
152                 INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]);
153
154         for (i = 0; i < 17; i++) {
155                 ieee->last_rxseq_num[i] = -1;
156                 ieee->last_rxfrag_num[i] = -1;
157                 ieee->last_packet_time[i] = 0;
158         }
159 //These function were added to load crypte module autoly
160         ieee80211_tkip_null();
161         ieee80211_wep_null();
162         ieee80211_ccmp_null();
163         return dev;
164
165  failed:
166         if (dev)
167                 free_netdev(dev);
168         return NULL;
169 }
170
171
172 void free_ieee80211(struct net_device *dev)
173 {
174         struct ieee80211_device *ieee = netdev_priv(dev);
175
176         int i;
177         struct list_head *p, *q;
178
179
180         ieee80211_softmac_free(ieee);
181         del_timer_sync(&ieee->crypt_deinit_timer);
182         ieee80211_crypt_deinit_entries(ieee, 1);
183
184         for (i = 0; i < WEP_KEYS; i++) {
185                 struct ieee80211_crypt_data *crypt = ieee->crypt[i];
186                 if (crypt) {
187                         if (crypt->ops)
188                                 crypt->ops->deinit(crypt->priv);
189                         kfree(crypt);
190                         ieee->crypt[i] = NULL;
191                 }
192         }
193
194         ieee80211_networks_free(ieee);
195
196         for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) {
197                 list_for_each_safe(p, q, &ieee->ibss_mac_hash[i]) {
198                         kfree(list_entry(p, struct ieee_ibss_seq, list));
199                         list_del(p);
200                 }
201         }
202
203
204         free_netdev(dev);
205 }