]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - drivers/staging/rtl8192e/rtllib_module.c
Merge tag 'mmc-v4.8' of git://git.linaro.org/people/ulf.hansson/mmc
[mirror_ubuntu-bionic-kernel.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 == NULL)
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");